diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index 5c03824f96b9de7db5a5ddeb0c4a330b516db4f9..d547307b9b0321040b2b30d1dd295861184f764d 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -296,6 +296,8 @@ aspect ItemHandling { try { // sendState() refined in MQTT and Influx aspect sendState(); + + } catch (Exception e) { logger.catching(e); } @@ -458,6 +460,11 @@ aspect ItemHandling { } + //--- onReceiveStateChange --- + protected void Item.onReceiveStateChange() { + //Instant lastChange = this. + } + diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag new file mode 100644 index 0000000000000000000000000000000000000000..eed976e4579d69ead07009adbbc517a71a05f690 --- /dev/null +++ b/eraser-base/src/main/jastadd/StateData.jrag @@ -0,0 +1,9 @@ +aspect StateData { + public void StateData.afterStateChangeApplied() { + + } + + public void StateData.checkStateTransitionTime() { + + } +} \ No newline at end of file diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex index 5f70414fa4005ad1baf1b0623459ce7c5f2f69f2..aa5d6f5c6c63141d0d6d808e0de8d05c48c71fd9 100644 --- a/eraser-base/src/main/jastadd/eraser.flex +++ b/eraser-base/src/main/jastadd/eraser.flex @@ -86,6 +86,9 @@ Comment = "//" [^\n\r]+ "incoming" { return sym(Terminals.INCOMING); } "items" { return sym(Terminals.ITEMS); } "itemType" { return sym(Terminals.ITEM_TYPE); } +"ItemPerformance" { return sym(Terminals.ITEM_PERFORMANCE); } +"performance" { return sym(Terminals.PERFORMANCE); } +"procFreq" { return sym(Terminals.PROCESS_FREQUENCY); } "label" { return sym(Terminals.LABEL); } "links" { return sym(Terminals.LINKS); } "metaData" { return sym(Terminals.META_DATA); } diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser index 68967a5655bf12cab2e2127db29e1f0ac5ebd808..9789e576fd4534971f68222eb4cd32a285d6e252 100644 --- a/eraser-base/src/main/jastadd/eraser.parser +++ b/eraser-base/src/main/jastadd/eraser.parser @@ -50,6 +50,7 @@ Root goal = | influx_root.ir {: return eph.createRoot(ir); :} | machine_learning_root.ml {: return eph.createRoot(ml); :} | rule.rule {: return eph.createRoot(rule); :} + | item_performance.ip {: return eph.createRoot(ip); :} ; %left RB_ROUND; @@ -132,6 +133,7 @@ Item item_body = | STATE EQUALS TEXT.n item_body.i {: i.setStateFromString(n); return i; :} | TOPIC EQUALS TEXT.n item_body.i {: return eph.setTopic(i, n); :} | CATEGORY EQUALS TEXT.n item_body.i {: return eph.setCategory(i, n); :} + | PERFORMANCE EQUALS TEXT.n item_body.i {: return eph.setPerformance(i, n); :} | META_DATA EQUALS string_map.md item_body.i {: return eph.setMetaData(i, md); :} | {: return eph.createItem(); :} @@ -328,3 +330,14 @@ IntegerKeyMap integer_map_body = return result; :} ; + +ItemPerformance item_performance = + ITEM_PERFORMANCE COLON item_performance_body.ipb SEMICOLON {: return ipb; :} + ; + +// ItemPerformance: id="" procFreq="" persFreq=""; +ItemPerformance item_performance_body = + ID EQUALS TEXT.n item_performance_body.ip {: return eph.setID(ip, n); :} + | PROCESS_FREQUENCY EQUALS TEXT.n item_performance_body.ip {: ip.setEventProcessingFrequency(Double.parseDouble(n)); return ip; :} + | {: return new ItemPerformance(); :} + ; \ No newline at end of file diff --git a/eraser-base/src/main/jastadd/shem.relast b/eraser-base/src/main/jastadd/shem.relast index 852f8b246af844e4357ebbad8805f1f94e029671..0350bdcb13d6a8b13653c71f7019cb07795b794d 100644 --- a/eraser-base/src/main/jastadd/shem.relast +++ b/eraser-base/src/main/jastadd/shem.relast @@ -25,9 +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] [StateData]; rel Item.Category? -> ItemCategory ; -rel Item.ItemPerformance -> ItemPerformance ; + abstract ItemWithBooleanState : Item ::= <_state:boolean> ; abstract ItemWithStringState : Item ::= <_state:String> ; @@ -50,6 +50,9 @@ ItemMetaData ::= <Key:String> <Value:String> ; ItemCategory ::= <Name:String> ; +StateData ::= <lastChangeDate:Instant> ; +rel StateData.ItemPerformance -> ItemPerformance ; + Group : LabelledModelElement ::= Group* Item* [AggregationFunction:GroupAggregationFunction] ; abstract GroupAggregationFunction ; SimpleGroupAggregationFunction : GroupAggregationFunction ::= <FunctionName:SimpleGroupAggregationFunctionName> ; 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 795d469bc786cfde73b12f8329956cbb79bb953a..1cc2133c56e8c08402fb4d90df91d42a414f0e7a 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 @@ -24,11 +24,13 @@ public class EraserParserHelper { private Map<String, Parameter> parameterMap = new HashMap<>(); private Map<String, Item> itemMap = new HashMap<>(); private Map<String, Group> groupMap = new HashMap<>(); + private Map<String, ItemPerformance> itemPerformanceMap = new HashMap<>(); private Map<Thing, String> missingThingTypeMap = new HashMap<>(); private Map<Channel, String> missingChannelTypeMap = new HashMap<>(); private Map<Item, String> missingTopicMap = new HashMap<>(); private Map<Item, String> missingItemCategoryMap = new HashMap<>(); + private Map<Designator, String> missingItemForDesignator = new HashMap<>(); private Map<Thing, Iterable<String>> missingChannelListMap = new HashMap<>(); @@ -36,6 +38,7 @@ public class EraserParserHelper { private Map<Item, Iterable<String>> missingControllingListMap = new HashMap<>(); private Map<Group, Iterable<String>> missingSubGroupListMap = new HashMap<>(); private Map<Group, Iterable<String>> missingItemListMap = new HashMap<>(); + private Map<Item, String> missingItemPerformanceMap = new HashMap<>(); private Map<ThingType, Iterable<String>> missingChannelTypeListMap = new HashMap<>(); private Map<ThingType, Iterable<String>> missingParameterListMap = new HashMap<>(); @@ -93,6 +96,7 @@ public class EraserParserHelper { resolveList(itemMap, missingItemLinkListMap, Channel::addLinkedItem); resolveList(groupMap, missingSubGroupListMap, Group::addGroup); resolveList(itemMap, missingItemListMap, this::addItemToGroup); + resolve(itemPerformanceMap, missingItemPerformanceMap, this::setPerformanceOnItem); resolveList(channelTypeMap, missingChannelTypeListMap, ThingType::addChannelType); resolveList(parameterMap, missingParameterListMap, ThingType::addParameter); resolveList(itemMap, missingControllingListMap, Item::addControlling); @@ -100,6 +104,7 @@ public class EraserParserHelper { createUnknownGroupIfNecessary(); createChannelCategories(); createItemCategories(); + if (checkUnusedElements) { checkUnusedElements(); } @@ -110,6 +115,12 @@ public class EraserParserHelper { group.addItem(item); } + private void setPerformanceOnItem(Item item, ItemPerformance itemPerformance) { + StateData stateData = item.getStateData(); + ItemObserver itemObserver = item.getItemObserver(); + item.getStateData().setItemPerformance(itemPerformance); + } + private void fillUnused() { unusedElements.addAll(thingTypeMap.values()); unusedElements.addAll(channelTypeMap.values()); @@ -222,6 +233,12 @@ public class EraserParserHelper { return thing; } + public ItemPerformance setID(ItemPerformance itemPerformance, String id) { + itemPerformance.setID(id); + itemPerformanceMap.put(id,itemPerformance); + return itemPerformance; + } + public ThingType setID(ThingType thingType, String id) { thingType.setID(id); thingTypeMap.put(id, thingType); @@ -255,6 +272,7 @@ public class EraserParserHelper { return c; } + public Channel setLinks(Channel c, StringList linkNames) { missingItemLinkListMap.put(c, linkNames); return c; @@ -285,6 +303,11 @@ public class EraserParserHelper { return item; } + public Item setPerformance(Item item, String performanceName) { + missingItemPerformanceMap.put(item, performanceName); + return item; + } + public Item setMetaData(Item item, StringKeyMap metaData) { for (AbstractMap.SimpleEntry<String, String> entry : metaData) { item.addMetaData(new ItemMetaData(entry.getKey(), entry.getValue())); @@ -471,6 +494,12 @@ public class EraserParserHelper { return result; } + public Root createRoot(ItemPerformance itemPerformance) { + Root result = createRoot(); + result.addItemPerformance(itemPerformance); + return result; + } + //+++ newStuff (to be categorized) +++ public Designator createDesignator(String itemName) { Designator result = new Designator();