diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java index 0cbf2d7..c2c82eb 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java @@ -4,11 +4,8 @@ import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SceneSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Device; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Scene; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SceneRepository; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.StateRepository; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; + import java.security.Principal; import java.util.List; import javax.validation.Valid; @@ -31,7 +28,7 @@ public class SceneController { @Autowired SceneRepository sceneService; @Autowired UserRepository userService; - @Autowired StateRepository stateService; + @Autowired StateRepository> stateService; @GetMapping public List findAll() { @@ -85,8 +82,8 @@ public class SceneController { * id). */ @GetMapping(path = "/{sceneId}/devices") - public List getDevices(@PathVariable("sceneId") long sceneId) { - Iterable states = stateService.findBySceneId(sceneId); + public List> getDevices(@PathVariable("sceneId") long sceneId) { + Iterable> states = stateService.findBySceneId(sceneId); return toList(states); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java index e7e056b..65786e8 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java @@ -27,16 +27,16 @@ public class SwitchableStateController { @Autowired private SwitchableStateRepository switchableStateService; @GetMapping - public List findAll() { + public List> findAll() { return toList(switchableStateService.findAll()); } @GetMapping("/{id}") - public SwitchableState findById(@PathVariable("id") long id) throws NotFoundException { + public SwitchableState findById(@PathVariable("id") long id) throws NotFoundException { return switchableStateService.findById(id).orElseThrow(NotFoundException::new); } - private SwitchableState save(SwitchableState initial, SwitchableStateSaveRequest ss) { + private SwitchableState save(SwitchableState initial, SwitchableStateSaveRequest ss) { initial.setDeviceId(ss.getDeviceId()); initial.setSceneId(ss.getSceneId()); initial.setOn(ss.isOn()); @@ -45,12 +45,12 @@ public class SwitchableStateController { } @PostMapping - public SwitchableState create(@Valid @RequestBody SwitchableStateSaveRequest dl) { - return save(new SwitchableState(), dl); + public SwitchableState create(@Valid @RequestBody SwitchableStateSaveRequest dl) { + return save(new SwitchableState<>(), dl); } @PutMapping - public SwitchableState update(@Valid @RequestBody SwitchableStateSaveRequest ss) + public SwitchableState update(@Valid @RequestBody SwitchableStateSaveRequest ss) throws NotFoundException { return save( switchableStateService.findById(ss.getId()).orElseThrow(NotFoundException::new), diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatStateController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatStateController.java deleted file mode 100644 index 4f83c29..0000000 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ThermostatStateController.java +++ /dev/null @@ -1,64 +0,0 @@ -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.ThermostatStateSaveRequest; -import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatState; -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatStateRepository; -import java.util.List; -import javax.validation.Valid; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@EnableAutoConfiguration -@RequestMapping("/thermostatState") -public class ThermostatStateController { - - @Autowired private ThermostatStateRepository thermostatStateService; - - @GetMapping - public List findAll() { - return toList(thermostatStateService.findAll()); - } - - @GetMapping("/{id}") - public ThermostatState findById(@PathVariable("id") long id) throws NotFoundException { - return thermostatStateService.findById(id).orElseThrow(NotFoundException::new); - } - - private ThermostatState save(ThermostatState initial, ThermostatStateSaveRequest ts) { - initial.setDeviceId(ts.getDeviceId()); - initial.setSceneId(ts.getSceneId()); - initial.setMode(ts.getMode()); - - return thermostatStateService.save(initial); - } - - @PostMapping - public ThermostatState create(@Valid @RequestBody ThermostatStateSaveRequest dl) { - return save(new ThermostatState(), dl); - } - - @PutMapping - public ThermostatState update(@Valid @RequestBody ThermostatStateSaveRequest ts) - throws NotFoundException { - return save( - thermostatStateService.findById(ts.getId()).orElseThrow(NotFoundException::new), - ts); - } - - @DeleteMapping("/{id}") - public void delete(@PathVariable("id") long id) { - thermostatStateService.deleteById(id); - } -} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DimmableStateRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DimmableStateRepository.java new file mode 100644 index 0000000..00edb96 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DimmableStateRepository.java @@ -0,0 +1,3 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.models; + +public interface DimmableStateRepository extends StateRepository> {} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/StateRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/StateRepository.java index 4cf31f9..eda0824 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/StateRepository.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/StateRepository.java @@ -5,7 +5,7 @@ import javax.transaction.Transactional; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; -public interface StateRepository extends CrudRepository { +public interface StateRepository> extends CrudRepository { @Transactional void deleteAllBySceneId(long roomId); diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SwitchableStateRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SwitchableStateRepository.java index 5c9850b..933ac6c 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SwitchableStateRepository.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SwitchableStateRepository.java @@ -1,3 +1,3 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; -public interface SwitchableStateRepository extends StateRepository {} +public interface SwitchableStateRepository extends StateRepository> {} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Thermostat.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Thermostat.java index 61081f5..ee18054 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Thermostat.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Thermostat.java @@ -9,12 +9,44 @@ import javax.validation.constraints.NotNull; /** A thermostat capable of controlling cooling and heating. */ @Entity -public class Thermostat extends OutputDevice implements AlterableFromState> { +public class Thermostat extends Switchable implements AlterableFromSwitchableState { @Override - public void readStateAndSet(State state) { - final ThermostatState hack = (ThermostatState) state; - setMode(hack.getMode()); + public boolean isOn() { + return mode != Mode.OFF; + } + + @Override + public void setOn(boolean on) { + mode = on ? Mode.IDLE : Mode.OFF; + computeState(); + } + + /** + * Computes the new thermostat state, for when the thermostat is on; + * @return true if the state changed, false if not; + */ + public boolean computeState() { + if (mode == Thermostat.Mode.OFF) { + return false; + } + + BigDecimal measured = this.getMeasuredTemperature(); + BigDecimal target = this.getTargetTemperature(); + BigDecimal delta = target.subtract(measured); + + if (delta.abs().doubleValue() < 0.25) { + if (this.getMode() == Thermostat.Mode.IDLE) return false; + this.setMode(Thermostat.Mode.IDLE); + } else if (delta.signum() > 0) { + if (this.getMode() == Thermostat.Mode.HEATING) return false; + this.setMode(Thermostat.Mode.HEATING); + } else { + if (this.getMode() == Thermostat.Mode.COOLING) return false; + this.setMode(Thermostat.Mode.COOLING); + } + + return true; } public enum Mode { diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ThermostatState.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ThermostatState.java deleted file mode 100644 index f80c34d..0000000 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ThermostatState.java +++ /dev/null @@ -1,16 +0,0 @@ -package ch.usi.inf.sa4.sanmarinoes.smarthut.models; - -import javax.persistence.Entity; - -@Entity -public class ThermostatState extends State { - private Thermostat.Mode mode; - - public Thermostat.Mode getMode() { - return mode; - } - - public void setMode(Thermostat.Mode mode) { - this.mode = mode; - } -} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ThermostatStateRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ThermostatStateRepository.java deleted file mode 100644 index 2496a5d..0000000 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ThermostatStateRepository.java +++ /dev/null @@ -1,3 +0,0 @@ -package ch.usi.inf.sa4.sanmarinoes.smarthut.models; - -public interface ThermostatStateRepository extends StateRepository {} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/ThermostatService.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/ThermostatService.java index fcd5378..2352cf9 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/ThermostatService.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/service/ThermostatService.java @@ -43,27 +43,8 @@ public class ThermostatService { } public boolean computeState(Thermostat t) { - if (t.getMode() == Thermostat.Mode.OFF) { - return false; - } - populateMeasuredTemperature(t); - BigDecimal measured = t.getMeasuredTemperature(); - BigDecimal target = t.getTargetTemperature(); - BigDecimal delta = target.subtract(measured); - - if (delta.abs().doubleValue() < 0.25) { - if (t.getMode() == Thermostat.Mode.IDLE) return false; - t.setMode(Thermostat.Mode.IDLE); - } else if (delta.signum() > 0) { - if (t.getMode() == Thermostat.Mode.HEATING) return false; - t.setMode(Thermostat.Mode.HEATING); - } else { - if (t.getMode() == Thermostat.Mode.COOLING) return false; - t.setMode(Thermostat.Mode.COOLING); - } - - return true; + return t.computeState(); } private void updateState(Thermostat t) {