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