diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index 2473947b7cba1be7e26f5b265e41fc9e75fdec0c..ece1fd875c26b2d6f4bc94aa712f9bfe56a8884b 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -281,6 +281,8 @@ aspect ItemHandling { stateUpdated(shouldSendState); } + syn ItemObserver Item.getItemObserver() = new ItemObserver(); + //--- stateUpdated --- /** * Called, whenever the state of an item is updated. Does various things including: @@ -462,23 +464,27 @@ aspect ItemHandling { //--- copyStateTo --- - protected abstract void Item.copyStateTo(Item... stateReceivers); - protected void ItemWithBooleanState.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromBoolean(this.getState())); + protected abstract void Item.copyStateTo(Item stateReceiver); + + protected void ItemWithBooleanState.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromBoolean(this.getState()); } - protected void ItemWithStringState.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromString(this.getState())); + protected void ItemWithStringState.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromString(this.getState()); } - protected void ItemWithDoubleState.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromDouble(this.getState())); + protected void ItemWithDoubleState.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromDouble(this.getState()); } - protected void ColorItem.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromColor(this.getState())); + protected void ColorItem.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromColor(this.getState()); } - protected void DateTimeItem.copyStateTo(Item... stateReceivers) { - Arrays.asList(stateReceivers).forEach(s -> s.setStateFromInstant(this.getState())); + protected void DateTimeItem.copyStateTo(Item stateReceiver) { + stateReceiver.setStateFromInstant(this.getState()); } + + + private void ColorItem.setBrightness(int value) { setState(getState().withDifferentBrightness(value)); } diff --git a/eraser-base/src/main/jastadd/Rules.jrag b/eraser-base/src/main/jastadd/Rules.jrag index 7e550453b2e7a0140b8a019fc885d509e8f67cdb..743ccc5ba6213f63c9445413cf137ac4d3261e70 100644 --- a/eraser-base/src/main/jastadd/Rules.jrag +++ b/eraser-base/src/main/jastadd/Rules.jrag @@ -95,7 +95,11 @@ aspect Rules { getAffectedItem().setStateFromString(getNewStateProvider().get()); } public void SetStateFromTriggeringItemAction.applyFor(Item item) { - item.copyStateTo(getAffectedItem()); + Item target = getAffectedItem(); + if (target==item) { + return; + } + item.copyStateTo(target); } public void SetStateFromItemsAction.applyFor(Item item) { getAffectedItem().setStateFromString(getCombinator().apply(getSourceItems())); @@ -113,15 +117,13 @@ aspect StateSyncGroup { rewrite StateSyncGroup { to Rule { Item controllingItem = ((ItemObserver)getParent()).observedItem(); - - SetStateFromTriggeringItemAction action = new SetStateFromTriggeringItemAction(); + Rule rule = new Rule(); - /* - action.setAffectedItems(getItems()) - */ + for (Item item : getItems()) { + rule.addAction(new SetStateFromTriggeringItemAction(item)); + rule.addObserver(item.getItemObserver()); + } - Rule rule = new Rule(); - rule.addAction(action); return rule; } } diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex index e81c7f7f33cb847ead9d5caea9d273265869c084..21987f14a9762c3f7c9de8dadd405ad5431ad7b5 100644 --- a/eraser-base/src/main/jastadd/eraser.flex +++ b/eraser-base/src/main/jastadd/eraser.flex @@ -57,7 +57,7 @@ Comment = "//" [^\n\r]+ "Influx" { return sym(Terminals.INFLUX); } "ML" { return sym(Terminals.ML); } "Rule" { return sym(Terminals.RULE); } -//"SyncState" { return sym(Terminals.SYNCSTATE); } +"SyncState" { return sym(Terminals.SYNCSTATE); } // special items (group already has a token definition) "Activity" { return sym(Terminals.ACTIVITY); } "Color" { return sym(Terminals.COLOR); } diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser index 74abecdd89e1817f8ae4dfe0ad997d470d24c8a2..00ade60d27e4aceb5252d3ba5df7685588c0ecee 100644 --- a/eraser-base/src/main/jastadd/eraser.parser +++ b/eraser-base/src/main/jastadd/eraser.parser @@ -3,6 +3,7 @@ package de.tudresden.inf.st.eraser.jastadd.parser; import de.tudresden.inf.st.eraser.jastadd.model.*; import de.tudresden.inf.st.eraser.jastadd.model.Action; import de.tudresden.inf.st.eraser.parser.EraserParserHelper; +import de.tudresden.inf.st.eraser.jastadd.model.StateSyncGroup; import java.util.Map; import java.util.HashMap; :} ; @@ -31,6 +32,7 @@ Root goal = thing.t goal.r {: insertZero(r.getSmartHomeEntityModel().getThingList(), t); return r; :} | item.i goal.r {: return r; :} | group.g goal.r {: insertZero(r.getSmartHomeEntityModel().getGroupList(), g); return r; :} + | state_sync_group.ss goal.r {: r.addRule(ss); return r; :} | thing_type.tt goal.r {: insertZero(r.getSmartHomeEntityModel().getThingTypeList(), tt); return r; :} | parameter goal.r {: return r; :} | channel_type.ct goal.r {: insertZero(r.getSmartHomeEntityModel().getChannelTypeList(), ct); return r; :} @@ -156,14 +158,15 @@ Group group_body = -// SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: eph.addStateSyncGroup(ssb); :}; -// StateSyncGroup ssg = SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: return ssb; :}; -// -//// SyncState: items=["ITEM_ID", "ITEM_ID"]; -//StateSyncGroup syncstate_body = -// ITEMS EQUALS string_list.items syncstate_body.ss {: return eph.setItems(ss, items); :} -// | {: return new StateSyncGroup(); :} -// ; + + +StateSyncGroup state_sync_group = SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: return ssb; :}; + +// SyncState: items=["ITEM_ID", "ITEM_ID"]; +StateSyncGroup syncstate_body = + ITEMS EQUALS string_list.items syncstate_body.ss {: return eph.setItems(ss, items); :} + | {: return new StateSyncGroup(); :} + ; ThingType thing_type = THING_TYPE COLON thing_type_body.ttb SEMICOLON {: return ttb; :} diff --git a/eraser-base/src/main/jastadd/shem.relast b/eraser-base/src/main/jastadd/shem.relast index 9e7252ffc151f6b276b96dbe6ff3e0bad0479818..ef37792977857ea6595f56c5b69b328c2ab46112 100644 --- a/eraser-base/src/main/jastadd/shem.relast +++ b/eraser-base/src/main/jastadd/shem.relast @@ -25,7 +25,9 @@ rel Channel.LinkedItem* <-> Item.Channel? ; Parameter : DescribableModelElement ::= <Type:ParameterValueType> [DefaultValue:ParameterDefaultValue] <Context:String> <Required:boolean> ; ParameterDefaultValue ::= <Value:String> ; -abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* ItemObserver; +abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* /ItemObserver/ + + rel Item.Category? -> ItemCategory ; abstract ItemWithBooleanState : Item ::= <_state:boolean> ; diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java index 87cd2764f8955c472b37e6abc887fa5c04d0a9b8..e8843f8c43776aed777ac3ab51203a2e6f83b80a 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java @@ -500,10 +500,6 @@ public class EraserParserHelper { return ssg; } - public void addStateSyncGroup(StateSyncGroup ssg) { - System.out.println("Gotcha"); - } - public Rule createRule(Condition c, Action a) { Rule result = new Rule();