diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java index 37e17e1..cbcdc98 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/InputDeviceConnectionController.java @@ -13,7 +13,7 @@ import java.util.Set; */ public abstract class InputDeviceConnectionController< I extends InputDevice & OutputConnectable, - O extends OutputDevice & InputConnectable> { + O extends OutputDevice & InputConnectable> { private class IOPair { private final I input; diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java index 6544c8d..82d9507 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java @@ -2,11 +2,12 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.KnobDimmerDimRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.KnobDimmerSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.KnobDimmer; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.KnobDimmerRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.List; +import java.util.Set; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -15,39 +16,67 @@ import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @RequestMapping("/knobDimmer") -public class KnobDimmerController { +public class KnobDimmerController + extends InputDeviceConnectionController { - @Autowired private KnobDimmerRepository knobDimmerService; + @Autowired private KnobDimmerRepository knobDimmerRepository; + @Autowired private DimmableLightRepository dimmableLightRepository; + + @Autowired + protected KnobDimmerController( + KnobDimmerRepository inputRepository, DimmableLightRepository outputRepository) { + super(inputRepository, outputRepository); + this.knobDimmerRepository = inputRepository; + this.dimmableLightRepository = outputRepository; + } @GetMapping public List findAll() { - return toList(knobDimmerService.findAll()); + return toList(knobDimmerRepository.findAll()); } @GetMapping("/{id}") public KnobDimmer findById(@PathVariable("id") long id) throws NotFoundException { - return knobDimmerService.findById(id).orElseThrow(NotFoundException::new); + return knobDimmerRepository.findById(id).orElseThrow(NotFoundException::new); } @PostMapping public KnobDimmer create(@Valid @RequestBody KnobDimmerSaveRequest kd) { KnobDimmer newKD = new KnobDimmer(); - newKD.setLights(kd.getLights()); - newKD.setId(kd.getId()); newKD.setName(kd.getName()); newKD.setRoomId(kd.getRoomId()); - return knobDimmerService.save(newKD); + return knobDimmerRepository.save(newKD); } - @PutMapping - public KnobDimmer update(@Valid @RequestBody KnobDimmerSaveRequest kd) { - kd.setId(0); - return this.create(kd); + @PutMapping("/dimTo") + public Set dimTo(@Valid @RequestBody final KnobDimmerDimRequest bd) + throws NotFoundException { + final KnobDimmer dimmer = + knobDimmerRepository.findById(bd.getId()).orElseThrow(NotFoundException::new); + + dimmer.setLightIntensity(bd.getIntensity()); + dimmableLightRepository.saveAll(dimmer.getLights()); + + return dimmer.getOutputs(); + } + + @PostMapping("/{id}/lights") + public Set addLight( + @PathVariable("id") long inputId, @RequestParam("lightId") Long lightId) + throws NotFoundException { + return addOutput(inputId, lightId); + } + + @DeleteMapping("/{id}/lights") + public Set removeLight( + @PathVariable("id") long inputId, @RequestParam("lightId") Long lightId) + throws NotFoundException { + return removeOutput(inputId, lightId); } @DeleteMapping("/{id}") public void delete(@PathVariable("id") long id) { - knobDimmerService.deleteById(id); + knobDimmerRepository.deleteById(id); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerDimRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerDimRequest.java new file mode 100644 index 0000000..6df303a --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerDimRequest.java @@ -0,0 +1,33 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +public class KnobDimmerDimRequest { + + /** The device id */ + @NotNull private Long id; + + /** The absolute intensity value */ + @NotNull + @Min(0) + @Max(100) + private Integer intensity; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getIntensity() { + return intensity; + } + + public void setIntensity(Integer intensity) { + this.intensity = intensity; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java index 73d44d2..b1c0075 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java @@ -1,17 +1,8 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLight; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.Lob; import javax.validation.constraints.NotNull; public class KnobDimmerSaveRequest { - @Lob private Set lights = new HashSet(); - - /** Device identifier */ - private long id; - /** * The room this device belongs in, as a foreign key id. To use when updating and inserting from * a REST call. @@ -29,10 +20,6 @@ public class KnobDimmerSaveRequest { this.name = name; } - public long getId() { - return id; - } - public Long getRoomId() { return roomId; } @@ -40,16 +27,4 @@ public class KnobDimmerSaveRequest { public String getName() { return name; } - - public void setLights(Set lights) { - this.lights = lights; - } - - public Set getLights() { - return lights; - } - - public void setId(long id) { - this.id = id; - } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java index 2e96a73..17c09f5 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java @@ -24,7 +24,6 @@ public class ButtonDimmer extends Dimmer implements OutputConnectable { +public class DimmableLight extends Light implements InputConnectable { public DimmableLight() { super("light"); diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java index 0a90998..35d243c 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java @@ -9,7 +9,7 @@ import javax.persistence.OneToMany; * value, like a knob) */ @Entity -public class KnobDimmer extends Dimmer { +public class KnobDimmer extends Dimmer implements OutputConnectable { public KnobDimmer() { super("knob-dimmer"); } @@ -18,49 +18,17 @@ public class KnobDimmer extends Dimmer { private Set lights; /** - * Increases or decreases the current intensity level by 5, moving between absolute multiples of - * 5 between 0 and 100, of all dimmable lights mapped to this knob + * Sets absolutely the intensity level of all lights connected * - * @param inc The direction the knob is turned with + * @param intensity the intensity (must be from 0 to 100) */ - public void modifyIntensity(boolean inc) { + public void setLightIntensity(int intensity) { for (DimmableLight dl : lights) { - int remainder = dl.getIntensity() / 5; - - if (inc) { - dl.setIntensity(dl.getIntensity() - remainder); - dl.setIntensity((dl.getIntensity() + 5) % 105); - } else { - dl.setIntensity(dl.getIntensity() + (5 - remainder)); - dl.setIntensity((dl.getIntensity() - 5) % 105); - } + dl.setIntensity(intensity); } } - /** - * Adds a DimmableLight to this set of DimmableLights - * - * @param dl The DimmableLight to be added - */ - public void addLight(DimmableLight dl) { - lights.add(dl); - } - - /** - * Removes the given DimmableLight - * - * @param dl The DimmableLight to be removed - */ - public void removeLight(DimmableLight dl) { - lights.remove(dl); - } - - /** Clears this set */ - public void clearSet() { - lights.clear(); - } - public void setLights(Set lights) { this.lights = lights; } @@ -68,4 +36,9 @@ public class KnobDimmer extends Dimmer { public Set getLights() { return lights; } + + @Override + public Set getOutputs() { + return lights; + } }