From e0e9ab2b6fca5b2b3d7cb8b9ece34ad468dd9f3d Mon Sep 17 00:00:00 2001 From: Manuel Krombholz <s3866577@msx.tu-dresden.de> Date: Tue, 13 Apr 2021 05:23:57 +0200 Subject: [PATCH] Added event processing frequency functionality --- eraser-base/src/main/jastadd/Item.jrag | 7 ++++--- eraser-base/src/main/jastadd/StateData.jrag | 13 ++++++++++--- eraser-base/src/main/jastadd/shem.relast | 4 ++-- .../inf/st/eraser/parser/EraserParserHelper.java | 2 -- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index d547307b..3cda6928 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -21,6 +21,8 @@ aspect ItemHandling { eq ItemWithDoubleState.getStateAsString() = Double.toString(getState()); eq ItemWithStringState.getStateAsString() = getState(); + syn StateData Item.getStateData() = new StateData(); + //--- getStateAsDouble --- syn double Item.getStateAsDouble(); // TupleHSB and String work like default @@ -292,17 +294,16 @@ aspect ItemHandling { * @param shouldSendState whether to send the new state (currently affects MQTT and Influx) */ protected void Item.stateUpdated(boolean shouldSendState) { + this.getStateData().afterStateChangeApplied(); if (shouldSendState) { try { // sendState() refined in MQTT and Influx aspect sendState(); - - } catch (Exception e) { logger.catching(e); } } - if (hasItemObserver()) { + if (hasItemObserver() && this.getStateData().checkStateTransitionTime()) { getItemObserver().apply(); } } diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag index eed976e4..66b6d724 100644 --- a/eraser-base/src/main/jastadd/StateData.jrag +++ b/eraser-base/src/main/jastadd/StateData.jrag @@ -1,9 +1,16 @@ aspect StateData { public void StateData.afterStateChangeApplied() { - + this.setLastChangeDate(Instant.now()); } - public void StateData.checkStateTransitionTime() { - + public boolean StateData.checkStateTransitionTime() { + if (this.getItemPerformance()==null) { + return true; + } + double frequency = this.getItemPerformance().getEventProcessingFrequency(); + Instant lastStateChange = this.getLastChangeDate(); + + return lastStateChange.toEpochMilli() + (1/frequency)*1000 < Instant.now().toEpochMilli(); + } } \ 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 0350bdcb..14370271 100644 --- a/eraser-base/src/main/jastadd/shem.relast +++ b/eraser-base/src/main/jastadd/shem.relast @@ -25,7 +25,7 @@ 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] [StateData]; +abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* [ItemObserver] /StateData/; rel Item.Category? -> ItemCategory ; @@ -50,7 +50,7 @@ ItemMetaData ::= <Key:String> <Value:String> ; ItemCategory ::= <Name:String> ; -StateData ::= <lastChangeDate:Instant> ; +StateData ::= <LastChangeDate:Instant> ; rel StateData.ItemPerformance -> ItemPerformance ; Group : LabelledModelElement ::= Group* Item* [AggregationFunction:GroupAggregationFunction] ; 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 1cc2133c..375f20ff 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 @@ -116,8 +116,6 @@ public class EraserParserHelper { } private void setPerformanceOnItem(Item item, ItemPerformance itemPerformance) { - StateData stateData = item.getStateData(); - ItemObserver itemObserver = item.getItemObserver(); item.getStateData().setItemPerformance(itemPerformance); } -- GitLab