Skip to content
Snippets Groups Projects

Partly resolves "Implement state copy in AST"

Merged Manuel Krombholz requested to merge 30-implement-state-copy-in-ast into dev
All threads resolved!
Files
15
aspect ItemHandling {
protected boolean Item.isFrozen = false;
public void Item.freeze() { isFrozen = true; }
public void Item.unfreeze() { isFrozen = false; }
public final boolean Item.isFrozen() { return isFrozen; }
protected boolean Item.sendState = true;
public void Item.disableSendState() { sendState = false; }
public void Item.enableSendState() { sendState = true; }
@@ -142,7 +137,9 @@ aspect ItemHandling {
//--- setStateFromBoolean ---
public abstract void Item.setStateFromBoolean(boolean value);
public void ColorItem.setStateFromBoolean(boolean value) {
setBrightness(value ? 100 : 0);
if (getState().getBrightness()==0) {
setBrightness(value ? 100 : 0);
}
}
public void DateTimeItem.setStateFromBoolean(boolean value) {
// there is no good way here
@@ -254,31 +251,31 @@ aspect ItemHandling {
//--- setState(value,shouldSendState) ---
public void ItemWithBooleanState.setState(boolean value, boolean shouldSendState) {
if (isFrozen || stateEquals(value)) { return; }
if (stateEquals(value)) { return; }
set_state(value);
stateUpdated(shouldSendState);
}
public void ItemWithStringState.setState(String value, boolean shouldSendState) {
if (isFrozen || stateEquals(value)) { return; }
if (stateEquals(value)) { return; }
set_state(value);
stateUpdated(shouldSendState);
}
public void ItemWithDoubleState.setState(double value, boolean shouldSendState) {
if (isFrozen || stateEquals(value)) { return; }
if (stateEquals(value)) { return; }
set_state(value);
stateUpdated(shouldSendState);
}
public void ColorItem.setState(TupleHSB value, boolean shouldSendState) {
if (isFrozen || stateEquals(value)) { return; }
if (stateEquals(value)) { return; }
set_state(value);
stateUpdated(shouldSendState);
}
public void DateTimeItem.setState(Instant value, boolean shouldSendState) {
if (isFrozen || stateEquals(value)) { return; }
if (stateEquals(value)) { return; }
set_state(value);
stateUpdated(shouldSendState);
}
@@ -290,7 +287,6 @@ aspect ItemHandling {
* <li>Send the new state via MQTT</li>
* <li>Send the new state to Influx DB</li>
* <li>Notify the attached {@link ItemObserver}, if any</li>
* <li>Update state of controlled items</li>
* </ul>
* @param shouldSendState whether to send the new state (currently affects MQTT and Influx)
*/
@@ -306,9 +302,6 @@ aspect ItemHandling {
if (hasItemObserver()) {
getItemObserver().apply();
}
for (Item controlled : getControllingList()) {
doUpdateFor(controlled);
}
}
//--- sendState ---
@@ -388,22 +381,56 @@ aspect ItemHandling {
syn DateTimeItem Item.asDateTimeItem() = (DateTimeItem) this;
syn DateTimeItem DateTimeItem.asDateTimeItem() = this;
//--- doUpdateFor ---
protected abstract void Item.doUpdateFor(Item controlling);
protected void ItemWithBooleanState.doUpdateFor(Item controlling) {
controlling.setStateFromBoolean(this.getState());
//--- State Copy ---
public void Item.addControlling(Item controlledItem) {
getRoot().addRule(createControllerRule(this,controlledItem));
}
protected void ItemWithStringState.doUpdateFor(Item controlling) {
controlling.setStateFromString(this.getState());
public void Item.addControlledBy(Item controllerItem) {
getRoot().addRule(createControllerRule(controllerItem,this));
}
protected void ItemWithDoubleState.doUpdateFor(Item controlling) {
controlling.setStateFromDouble(this.getState());
public void Item.synchronizeWith(Item item) {
addControlledBy(item);
addControlling(item);
}
protected void ColorItem.doUpdateFor(Item controlling) {
controlling.setStateFromColor(this.getState());
private Rule Item.createControllerRule(Item controllerItem, Item controlledItem) {
Rule rule = new Rule();
ItemStateChangeCondition condition = new ItemStateChangeCondition();
condition.setItem(controllerItem);
rule.addCondition(condition);
SetStateFromTriggeringItemAction action = new SetStateFromTriggeringItemAction();
action.setAffectedItem(controlledItem);
rule.addAction(action);
rule.activateFor(controllerItem);
return rule;
}
//--- copyStateTo ---
protected abstract void Item.copyStateTo(Item stateReceiver);
protected void ItemWithBooleanState.copyStateTo(Item stateReceiver) {
stateReceiver.setStateFromBoolean(this.getState());
}
protected void ItemWithStringState.copyStateTo(Item stateReceiver) {
stateReceiver.setStateFromString(this.getState());
}
protected void DateTimeItem.doUpdateFor(Item controlling) {
controlling.setStateFromInstant(this.getState());
protected void ItemWithDoubleState.copyStateTo(Item stateReceiver) {
stateReceiver.setStateFromDouble(this.getState());
}
protected void ColorItem.copyStateTo(Item stateReceiver) {
stateReceiver.setStateFromColor(this.getState());
}
protected void DateTimeItem.copyStateTo(Item stateReceiver) {
stateReceiver.setStateFromInstant(this.getState());
}
private void ColorItem.setBrightness(int value) {
@@ -414,20 +441,10 @@ aspect ItemHandling {
public abstract void ItemUpdate.apply();
public void ItemUpdateColor.apply() {
getItem().setStateFromColor(getNewHSB());
getItem().freeze();
for (Item controller : getItem().getControlledByList()) {
controller.setStateFromColor(getNewHSB());
}
getItem().unfreeze();
}
//--- ItemUpdate.apply ---
public void ItemUpdateDouble.apply() {
getItem().setStateFromDouble(getNewValue());
getItem().freeze();
for (Item controller : getItem().getControlledByList()) {
controller.setStateFromDouble(getNewValue());
}
getItem().unfreeze();
}
//--- ItemUpdate.describe ---
Loading