From 04b4e3a6f32da40d977e6055fb6ff31aeebaeca1 Mon Sep 17 00:00:00 2001 From: Frank Rohde <frank.rohde@tu-dresden.de> Date: Wed, 9 Feb 2022 17:49:10 +0100 Subject: [PATCH] IPos-FW can perform rawdata-filtering PositionMonitoring: read new field of MonitoringRequest "property" into EventFilterCondition function that handles UWBRawDataEvents now passes rawdata to suitable eventFilter-function EventFilterCondition: new Field "propertyCondition" eventFilter: new function to filter rawdata Triangulation: function "update" is able to decide whether a position can be calculated from the received rawdata, or not GenericSensorValueProcessor: Rawdata is published over this class added tooz-testdata and adapted init_Industrierobotik.txt for testing forwarding of rawdata (new monitoringRequest) --- emf_datamodel/model/iPos_Datamodel.aird | 16 ++++- emf_datamodel/model/iPos_Datamodel.ecore | 1 + emf_datamodel/model/iPos_Datamodel.genmodel | 1 + init_Industrierobotik.txt | 4 +- .../ipos/project/CustomLoggingFilter.java | 2 +- .../service/SimpleSceneTransformer.java | 4 +- .../iPos_Datamodel/EventFilterCondition.java | 23 ++++++++ .../iPos_Datamodel/IPos_DatamodelPackage.java | 30 +++++++++- .../impl/EventFilterConditionImpl.java | 57 ++++++++++++++++++ .../impl/IPos_DatamodelPackageImpl.java | 13 ++++ .../project/Functionality/Triangulation.java | 38 +++++++++++- .../eventfilter/BeaconFilteringResult.java | 29 +++++++++ .../eventfilter/eventFilter.java | 37 ++++++++++++ .../Functionality/eventfilter/readConfig.java | 33 ++++++++++- src/main/java/ipos/project/MainApp.java | 3 + .../GenericSensorValueProcessor.java | 36 ++++++++++- .../Service/GenericSensorTransformer.java | 22 +++++-- .../UseCaseController/PositionMonitoring.java | 59 +++++++++++++++---- src/main/resources/application.yml | 1 + testdata_raw_tooz.txt | 4 ++ 20 files changed, 383 insertions(+), 30 deletions(-) create mode 100644 src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java create mode 100644 testdata_raw_tooz.txt diff --git a/emf_datamodel/model/iPos_Datamodel.aird b/emf_datamodel/model/iPos_Datamodel.aird index a5275bf..8b8c995 100644 --- a/emf_datamodel/model/iPos_Datamodel.aird +++ b/emf_datamodel/model/iPos_Datamodel.aird @@ -5,7 +5,7 @@ <semanticResources>iPos_Datamodel.genmodel</semanticResources> <ownedViews xmi:type="viewpoint:DView" uid="_EpwecAQNEey-kNQ7esRa_g"> <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> - <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="3f9b6c14-7502-4721-83eb-e39042109149"> + <ownedRepresentationDescriptors xmi:type="viewpoint:DRepresentationDescriptor" uid="_Et4wgAQNEey-kNQ7esRa_g" name="iPos_Datamodel" repPath="#_Es-xkAQNEey-kNQ7esRa_g" changeId="0678978b-7913-4092-aa95-af020ffe817b"> <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> <target xmi:type="ecore:EPackage" href="iPos_Datamodel.ecore#/"/> </ownedRepresentationDescriptors> @@ -611,6 +611,10 @@ <styles xmi:type="notation:FontStyle" xmi:id="_iWqJIR_NEeyaJIyxidrtuQ" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/> <layoutConstraint xmi:type="notation:Location" xmi:id="_iWqJIh_NEeyaJIyxidrtuQ"/> </children> + <children xmi:type="notation:Node" xmi:id="_Fx5DEIThEeybc9Dj6t-c7Q" type="3010" element="_Fvq1gIThEeybc9Dj6t-c7Q"> + <styles xmi:type="notation:FontStyle" xmi:id="_Fx5DEYThEeybc9Dj6t-c7Q" fontColor="2697711" fontName="Segoe UI" fontHeight="8"/> + <layoutConstraint xmi:type="notation:Location" xmi:id="_Fx5DEoThEeybc9Dj6t-c7Q"/> + </children> <styles xmi:type="notation:SortingStyle" xmi:id="_D9ZrhQc-Eey-kNQ7esRa_g"/> <styles xmi:type="notation:FilteringStyle" xmi:id="_D9Zrhgc-Eey-kNQ7esRa_g"/> </children> @@ -2600,7 +2604,7 @@ <arrangeConstraints>KEEP_LOCATION</arrangeConstraints> <arrangeConstraints>KEEP_SIZE</arrangeConstraints> <arrangeConstraints>KEEP_RATIO</arrangeConstraints> - <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_TIvV4jASEeys5_IXgF_hBA" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> + <ownedStyle xmi:type="diagram:FlatContainerStyle" uid="_KjE6L4ThEeybc9Dj6t-c7Q" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216"> <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> </ownedStyle> <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> @@ -2684,6 +2688,14 @@ </ownedStyle> <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> </ownedElements> + <ownedElements xmi:type="diagram:DNodeListElement" uid="_Fvq1gIThEeybc9Dj6t-c7Q" name="propertyCondition : StringList" tooltipText=""> + <target xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/propertyCondition"/> + <semanticElements xmi:type="ecore:EAttribute" href="iPos_Datamodel.ecore#//EventFilterCondition/propertyCondition"/> + <ownedStyle xmi:type="diagram:BundledImage" uid="_KjLn1YThEeybc9Dj6t-c7Q" labelAlignment="LEFT"> + <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/> + </ownedStyle> + <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/> + </ownedElements> </ownedDiagramElements> <ownedDiagramElements xmi:type="diagram:DEdge" uid="_JkOxSgc-Eey-kNQ7esRa_g" name="[0..*] eventfiltercondition" sourceNode="_IOFwkAZtEey-kNQ7esRa_g" targetNode="_D9Ka8Ac-Eey-kNQ7esRa_g"> <target xmi:type="ecore:EReference" href="iPos_Datamodel.ecore#//EventFilterConfiguration/eventfiltercondition"/> diff --git a/emf_datamodel/model/iPos_Datamodel.ecore b/emf_datamodel/model/iPos_Datamodel.ecore index b5a51eb..9b325ff 100644 --- a/emf_datamodel/model/iPos_Datamodel.ecore +++ b/emf_datamodel/model/iPos_Datamodel.ecore @@ -225,6 +225,7 @@ </eStructuralFeatures> <eStructuralFeatures xsi:type="ecore:EAttribute" name="idCondition" eType="#//StringList"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="categoryCondition" eType="#//StringList"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="propertyCondition" eType="#//StringList"/> </eClassifiers> <eClassifiers xsi:type="ecore:EDataType" name="StringList" instanceClassName="java.util.List<java.lang.String>"/> <eClassifiers xsi:type="ecore:EDataType" name="StringArray" instanceClassName="java.util.ArrayList<java.lang.String[]>"/> diff --git a/emf_datamodel/model/iPos_Datamodel.genmodel b/emf_datamodel/model/iPos_Datamodel.genmodel index a63721d..a1f0d8b 100644 --- a/emf_datamodel/model/iPos_Datamodel.genmodel +++ b/emf_datamodel/model/iPos_Datamodel.genmodel @@ -164,6 +164,7 @@ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/positionConditionCells"/> <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/idCondition"/> <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/categoryCondition"/> + <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//EventFilterCondition/propertyCondition"/> </genClasses> <genClasses ecoreClass="iPos_Datamodel.ecore#//ZoneDescriptor"> <genFeatures createChild="false" ecoreFeature="ecore:EAttribute iPos_Datamodel.ecore#//ZoneDescriptor/zoneId"/> diff --git a/init_Industrierobotik.txt b/init_Industrierobotik.txt index ae7321c..42f77f3 100644 --- a/init_Industrierobotik.txt +++ b/init_Industrierobotik.txt @@ -1,5 +1,5 @@ {"frames": [{"id": "cobot1_door_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 0.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 6.0, "y": 4.0, "z":6.0}]}, {"id": "cobot1_window_zone", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 2.0,"y": 4.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 6.0, "y": 4.0, "z":6.0}]}, {"id": "robolab_east", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": 4.0,"y": 2.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 4.0, "y": 4.0, "z":4.0}]}, {"id": "robolab_west", "space": [{"position": {"refSystemId": "ROOT", "point": {"x": -4.0,"y": 2.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 8.0, "y": 10.0, "z":6.0}]}, {"id": "robolab_armarea", "space": [{"position": {"refSystemId": "CETI_ROBOTARM_CELL", "point": {"x": 0.0,"y": 0.0,"z": 0.0}, "accuracy": 0.0}, "orientation": {"x": 1.0,"y": 0.5,"z": 1.0, "w": 1.5}, "x": 8.0, "y": 10.0, "z":6.0}]} ]} {"refSystems": [{"id": "ROOT"}, {"id": "CETI_ROOT", "position": {"refSystemId": "ROOT", "point": {"x": 0.5,"y": 0.75,"z": 1.0}, "accuracy": 1.0}, "orientation": {"x": 0.7071067811865477,"y": 0.0,"z": 0.0, "w": 0.7071067811865477}}, {"id": "CETI_ROBOLAB", "position": {"refSystemId": "CETI_ROOT", "point": {"x": 0.2,"y": 0.2,"z": 0.2}, "accuracy": 1.0}, "orientation": {"x": 0.4082481001180531,"y": 0.4082481001180531,"z": 0.4082481001180531, "w": 0.7071067811865477}}, {"id": "CETI_OFFICE", "position": {"refSystemId": "CETI_ROOT", "point": {"x": 2.0,"y": 2.0,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0}}, {"id": "TL_TESTHALL", "position": {"refSystemId": "ROOT", "point": {"x": 40.0,"y": 60.0,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.21643961393810285, "w": 0.9762960071199334}}, {"id": "CETI_ROBOTARM_CELL", "position": {"refSystemId": "CETI_ROBOLAB", "point": {"x": 0.0,"y": 1.2,"z": 2.2}, "accuracy": 1.0}, "orientation": {"x": 0.2705992818596786,"y": 0.2705992818596786,"z": 0.0, "w": 0.9238795325112868}}]} -{"objectConfigs": [{"agentId": "Employee_1", "sensorId": "UWB_2", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "UWB_1", "agentType": "ROBOT", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}, {"agentId": "turtlebot", "sensorId": "handy1", "agentType": "ROBOT", "sensorType": "IMU"}]} +{"objectConfigs": [{"agentId": "Employee_1", "sensorId": "UWB_2", "agentType": "HUMAN", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "UWB_1", "agentType": "ROBOT", "sensorType": "UWB"}, {"agentId": "turtlebot", "sensorId": "98:CD:AC:26:2D:18", "agentType": "ROBOT", "sensorType": "RFID_SCANNER"}, {"agentId": "turtlebot", "sensorId": "handy1", "agentType": "ROBOT", "sensorType": "IMU"}, {"agentId": "tooz_employee", "sensorId": "tooz_employee_uwb", "agentType": "HUMAN", "sensorType": "UWB"}]} {"pois": [{"id": "UWB_BEACON_1", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 3.1,"y": 0.5,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "UWB_BEACON_2", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": -0.3,"y": 4.5,"z": 0.0}, "accuracy": 1.0}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0}}, {"id": "83221710", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.1,"y": 0.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "31762128", "description": "RFID_TAG", "data": {"type" : "NFC"}, "position": {"refSystemId": "ROOT", "point": {"x": 2.2,"y": 3.4,"z": 0.5}, "accuracy": 0.1}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "885", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 0,"y": 0,"z": 0.97}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "2934", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 4.24,"y": 1.33,"z": 1.0}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "3383", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 1.25,"y": 5.89,"z": 1.06}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }, {"id": "1107", "description": "Beacon_Position", "data": {"type" : "UWB"}, "position": {"refSystemId": "ROOT", "point": {"x": 4.24,"y": 5.83,"z": 1.05}, "accuracy": 0.01}, "orientation": {"x": 0.0,"y": 0.0,"z": 0.0, "w": 0.0} }]} -{"monitoringRequests": [{"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringCeti", "refSystemId": "CETI_ROBOTARM_CELL", "serializationType": "protobuf"}, {"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringFrontend", "refSystemId": "CETI_ROBOTARM_CELL", "serializationType": "json"}]} \ No newline at end of file +{"monitoringRequests": [{"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringCeti", "refSystemId": "CETI_ROBOTARM_CELL", "serializationType": "protobuf"}, {"frameIds": ["cobot1_door_zone", "cobot1_window_zone"], "monitoringTaskId": "RobolabMonitoringFrontend", "refSystemId": "ROOT", "serializationType": "json"}, {"id": ["tooz_employee_uwb"], "properties": ["distance"], "monitoringTaskId": "tooz_employee_distances", "refSystemId": "ROOT", "serializationType": "json"}]} \ No newline at end of file diff --git a/src/main/java/ipos/project/CustomLoggingFilter.java b/src/main/java/ipos/project/CustomLoggingFilter.java index e464195..d5e865d 100644 --- a/src/main/java/ipos/project/CustomLoggingFilter.java +++ b/src/main/java/ipos/project/CustomLoggingFilter.java @@ -29,7 +29,7 @@ public class CustomLoggingFilter extends Filter<ILoggingEvent> { }else if (event.getMessage().contains("SHELL:")){ return FilterReply.ACCEPT; } else { - return FilterReply.DENY; + return FilterReply.ACCEPT; } } diff --git a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java index ec72104..50e829f 100644 --- a/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java +++ b/src/main/java/ipos/project/DataModellntegration/SimpleSceneIntegration/service/SimpleSceneTransformer.java @@ -38,9 +38,9 @@ public class SimpleSceneTransformer { } private static List<String> toJavaStringList(ProtocolStringList protoList){ - List<String> javaList = new ArrayList<String>(); + List<String> javaList = new ArrayList<>(); for(int i = 0; i < protoList.size(); i++ ){ - javaList.set(i, protoList.get(i)); + javaList.add(protoList.get(i)); } return javaList; } diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java index 5c3ad50..1011992 100644 --- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java +++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/EventFilterCondition.java @@ -27,6 +27,7 @@ import org.eclipse.emf.ecore.EObject; * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPositionConditionCells <em>Position Condition Cells</em>}</li> * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getIdCondition <em>Id Condition</em>}</li> * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getCategoryCondition <em>Category Condition</em>}</li> + * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition <em>Property Condition</em>}</li> * </ul> * * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition() @@ -254,4 +255,26 @@ public interface EventFilterCondition extends EObject { */ void setCategoryCondition(List<String> value); + /** + * Returns the value of the '<em><b>Property Condition</b></em>' attribute. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @return the value of the '<em>Property Condition</em>' attribute. + * @see #setPropertyCondition(List) + * @see ipos.project.DataModellntegration.iPos_Datamodel.IPos_DatamodelPackage#getEventFilterCondition_PropertyCondition() + * @model dataType="ipos.project.DataModellntegration.iPos_Datamodel.StringList" + * @generated + */ + List<String> getPropertyCondition(); + + /** + * Sets the value of the '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition <em>Property Condition</em>}' attribute. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @param value the new value of the '<em>Property Condition</em>' attribute. + * @see #getPropertyCondition() + * @generated + */ + void setPropertyCondition(List<String> value); + } // EventFilterCondition diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java index d65d870..fd26e45 100644 --- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java +++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/IPos_DatamodelPackage.java @@ -2111,6 +2111,15 @@ public interface IPos_DatamodelPackage extends EPackage { */ int EVENT_FILTER_CONDITION__CATEGORY_CONDITION = 9; + /** + * The feature id for the '<em><b>Property Condition</b></em>' attribute. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + * @ordered + */ + int EVENT_FILTER_CONDITION__PROPERTY_CONDITION = 10; + /** * The number of structural features of the '<em>Event Filter Condition</em>' class. * <!-- begin-user-doc --> @@ -2118,7 +2127,7 @@ public interface IPos_DatamodelPackage extends EPackage { * @generated * @ordered */ - int EVENT_FILTER_CONDITION_FEATURE_COUNT = 10; + int EVENT_FILTER_CONDITION_FEATURE_COUNT = 11; /** * The number of operations of the '<em>Event Filter Condition</em>' class. @@ -3539,6 +3548,17 @@ public interface IPos_DatamodelPackage extends EPackage { */ EAttribute getEventFilterCondition_CategoryCondition(); + /** + * Returns the meta object for the attribute '{@link ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition <em>Property Condition</em>}'. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @return the meta object for the attribute '<em>Property Condition</em>'. + * @see ipos.project.DataModellntegration.iPos_Datamodel.EventFilterCondition#getPropertyCondition() + * @see #getEventFilterCondition() + * @generated + */ + EAttribute getEventFilterCondition_PropertyCondition(); + /** * Returns the meta object for class '{@link ipos.project.DataModellntegration.iPos_Datamodel.ZoneDescriptor <em>Zone Descriptor</em>}'. * <!-- begin-user-doc --> @@ -4707,6 +4727,14 @@ public interface IPos_DatamodelPackage extends EPackage { */ EAttribute EVENT_FILTER_CONDITION__CATEGORY_CONDITION = eINSTANCE.getEventFilterCondition_CategoryCondition(); + /** + * The meta object literal for the '<em><b>Property Condition</b></em>' attribute feature. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + EAttribute EVENT_FILTER_CONDITION__PROPERTY_CONDITION = eINSTANCE.getEventFilterCondition_PropertyCondition(); + /** * The meta object literal for the '{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.ZoneDescriptorImpl <em>Zone Descriptor</em>}' class. * <!-- begin-user-doc --> diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java index d88c0ec..efe5d18 100644 --- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java +++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/EventFilterConditionImpl.java @@ -34,6 +34,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl; * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPositionConditionCells <em>Position Condition Cells</em>}</li> * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getIdCondition <em>Id Condition</em>}</li> * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getCategoryCondition <em>Category Condition</em>}</li> + * <li>{@link ipos.project.DataModellntegration.iPos_Datamodel.impl.EventFilterConditionImpl#getPropertyCondition <em>Property Condition</em>}</li> * </ul> * * @generated @@ -229,6 +230,26 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple */ protected List<String> categoryCondition = CATEGORY_CONDITION_EDEFAULT; + /** + * The default value of the '{@link #getPropertyCondition() <em>Property Condition</em>}' attribute. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @see #getPropertyCondition() + * @generated + * @ordered + */ + protected static final List<String> PROPERTY_CONDITION_EDEFAULT = null; + + /** + * The cached value of the '{@link #getPropertyCondition() <em>Property Condition</em>}' attribute. + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @see #getPropertyCondition() + * @generated + * @ordered + */ + protected List<String> propertyCondition = PROPERTY_CONDITION_EDEFAULT; + /** * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -475,6 +496,29 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple categoryCondition)); } + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public List<String> getPropertyCondition() { + return propertyCondition; + } + + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public void setPropertyCondition(List<String> newPropertyCondition) { + List<String> oldPropertyCondition = propertyCondition; + propertyCondition = newPropertyCondition; + if (eNotificationRequired()) + eNotify(new ENotificationImpl(this, Notification.SET, + IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION, oldPropertyCondition, + propertyCondition)); + } + /** * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -503,6 +547,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple return getIdCondition(); case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION: return getCategoryCondition(); + case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION: + return getPropertyCondition(); } return super.eGet(featureID, resolve, coreType); } @@ -546,6 +592,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION: setCategoryCondition((List<String>) newValue); return; + case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION: + setPropertyCondition((List<String>) newValue); + return; } super.eSet(featureID, newValue); } @@ -588,6 +637,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION: setCategoryCondition(CATEGORY_CONDITION_EDEFAULT); return; + case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION: + setPropertyCondition(PROPERTY_CONDITION_EDEFAULT); + return; } super.eUnset(featureID); } @@ -625,6 +677,9 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__CATEGORY_CONDITION: return CATEGORY_CONDITION_EDEFAULT == null ? categoryCondition != null : !CATEGORY_CONDITION_EDEFAULT.equals(categoryCondition); + case IPos_DatamodelPackage.EVENT_FILTER_CONDITION__PROPERTY_CONDITION: + return PROPERTY_CONDITION_EDEFAULT == null ? propertyCondition != null + : !PROPERTY_CONDITION_EDEFAULT.equals(propertyCondition); } return super.eIsSet(featureID); } @@ -660,6 +715,8 @@ public class EventFilterConditionImpl extends MinimalEObjectImpl.Container imple result.append(idCondition); result.append(", categoryCondition: "); result.append(categoryCondition); + result.append(", propertyCondition: "); + result.append(propertyCondition); result.append(')'); return result.toString(); } diff --git a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java index 42c0605..5bbbef6 100644 --- a/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java +++ b/src/main/java/ipos/project/DataModellntegration/iPos_Datamodel/impl/IPos_DatamodelPackageImpl.java @@ -1530,6 +1530,15 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(9); } + /** + * <!-- begin-user-doc --> + * <!-- end-user-doc --> + * @generated + */ + public EAttribute getEventFilterCondition_PropertyCondition() { + return (EAttribute) eventFilterConditionEClass.getEStructuralFeatures().get(10); + } + /** * <!-- begin-user-doc --> * <!-- end-user-doc --> @@ -1813,6 +1822,7 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__POSITION_CONDITION_CELLS); createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__ID_CONDITION); createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__CATEGORY_CONDITION); + createEAttribute(eventFilterConditionEClass, EVENT_FILTER_CONDITION__PROPERTY_CONDITION); zoneDescriptorEClass = createEClass(ZONE_DESCRIPTOR); createEAttribute(zoneDescriptorEClass, ZONE_DESCRIPTOR__ZONE_ID); @@ -2249,6 +2259,9 @@ public class IPos_DatamodelPackageImpl extends EPackageImpl implements IPos_Data initEAttribute(getEventFilterCondition_CategoryCondition(), this.getStringList(), "categoryCondition", null, 0, 1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEAttribute(getEventFilterCondition_PropertyCondition(), this.getStringList(), "propertyCondition", null, 0, + 1, EventFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, + IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(zoneDescriptorEClass, ZoneDescriptor.class, "ZoneDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); diff --git a/src/main/java/ipos/project/Functionality/Triangulation.java b/src/main/java/ipos/project/Functionality/Triangulation.java index a157732..576a3fc 100644 --- a/src/main/java/ipos/project/Functionality/Triangulation.java +++ b/src/main/java/ipos/project/Functionality/Triangulation.java @@ -21,14 +21,20 @@ import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.MissingResourceException; +import java.util.Optional; public class Triangulation { + private static final int MIN_NUMBER_OF_BEACONS = 3; private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger(); private static IPos_DatamodelFactory modelFactory = IPos_DatamodelFactory.eINSTANCE; - public static PositionEvent update(UWB uwbRawDataEvent) throws ParseException { - + public static Optional<PositionEvent> update(UWB uwbRawDataEvent) throws ParseException { + + if(eventNotApplicable(uwbRawDataEvent)){ + return Optional.empty(); + } + double[][] positions = new double[][]{{0, 0}, {0, 0}, {0, 0}, {0, 0}}; double[] distances = new double[]{0,0,0,0}; HashMap uwbData = (HashMap) uwbRawDataEvent.getDistances(); @@ -66,9 +72,35 @@ public class Triangulation { tagPosition.setReferenceSystem(DataServices.getReferenceSystemByIdOrNull("ROOT")); tagPlacing.setPosition(tagPosition); tagPlacing.setOrientation(modelFactory.createQuaternion()); - return createPosEvent(uwbRawDataEvent.getSensorId(), uwbRawDataEvent.getTimeStamp(), tagPlacing); + return Optional.of(createPosEvent(uwbRawDataEvent.getSensorId(), uwbRawDataEvent.getTimeStamp(), tagPlacing)); } + + private static boolean eventNotApplicable(UWB uwbRawDataEvent) { + return notEnoughBeaconDistances(uwbRawDataEvent) || includesUnknownBeacon(uwbRawDataEvent); + } + + private static boolean includesUnknownBeacon(UWB uwbRawDataEvent) { + HashMap<String, Double> uwbData = (HashMap<String, Double>) uwbRawDataEvent.getDistances(); + for (String beaconId : uwbData.keySet()){ + if (null == DataServices.getPoiByIdOrNull(beaconId)){ + LOG.info("UWBRawDataEvent contains unknown beacon: " + beaconId); + return true; + } + } + return false; + } + + private static boolean notEnoughBeaconDistances(UWB uwbRawDataEvent) { + HashMap uwbData = (HashMap) uwbRawDataEvent.getDistances(); + if(uwbData.keySet().size() < Triangulation.MIN_NUMBER_OF_BEACONS){ + LOG.info("UWBRawDataEvent only contains " + uwbData.keySet().size() + " beacon-distances. Can not calculate a position"); + return true; + }else { + return false; + } + } + private static double[] getPositionFromBeaconId(String beaconId) { Point3D beaconPos = modelFactory.createPoint3D(); beaconPos = (Point3D) DataServices.getPoiByIdOrNull(beaconId).getPlacing().getPosition().getPoint(); diff --git a/src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java b/src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java new file mode 100644 index 0000000..f78c359 --- /dev/null +++ b/src/main/java/ipos/project/Functionality/eventfilter/BeaconFilteringResult.java @@ -0,0 +1,29 @@ +package ipos.project.Functionality.eventfilter; + +import ipos.project.DataModellntegration.iPos_Datamodel.Beacon; + +public class BeaconFilteringResult { + + private Beacon beaconRawdataEvent; + private String monitoringTaskId; + private boolean isBlocking; + + public BeaconFilteringResult(String monitoringTaskId, Beacon beaconRawdataEvent, Boolean isBlocking) { + this.beaconRawdataEvent = beaconRawdataEvent; + this.monitoringTaskId = monitoringTaskId; + this.isBlocking = isBlocking; + } + + public Beacon getBeaconRawdataEvent() { + return beaconRawdataEvent; + } + + public String getMonitoringTaskId() { + return monitoringTaskId; + } + + public boolean hasBlockedEvent(){ + return this.isBlocking; + } + +} diff --git a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java index e95840f..6b1af87 100644 --- a/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java +++ b/src/main/java/ipos/project/Functionality/eventfilter/eventFilter.java @@ -16,6 +16,9 @@ import java.util.*; public class eventFilter { private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger(); + public static final String MONREQ_DISTANCE_PROPERTY = "distance"; + public static final List<String> MONREQ_ALLOWED_PROPERTIES = Arrays.asList("position", "id", "type", MONREQ_DISTANCE_PROPERTY); + private boolean[] filterStructure; // private PositionEvent last_position_event; @@ -59,6 +62,7 @@ public class eventFilter { private float positionDelta; private Map<String, ArrayList<Float[][]>> positionConditionCells; // zoneId -> PositionConditionCell private EventFilterCondition filterConditionConfig; + private List<String> propertyCondition; public void init(EventFilterCondition conf) { filterStructure = conf.getFilterStructure(); @@ -71,6 +75,7 @@ public class eventFilter { timeMinInterval = conf.getTimeMinInterval(); positionDelta = conf.getPositionDelta(); positionConditionCells = conf.getPositionConditionCells(); + propertyCondition = conf.getPropertyCondition(); this.filterConditionConfig = conf; } @@ -106,6 +111,38 @@ public class eventFilter { } } + public BeaconFilteringResult processRawdata(Beacon beaconRawdataEvent){ + LocalizableObject lObject = DataServices.getLObjectByIdOrNull(beaconRawdataEvent.getSensorId()); + if (null == lObject){ + LOG.info("EventFilter: Warning: Received beaconRawdataEvent from sensor with unknown sensor-id: " + beaconRawdataEvent.getSensorId()); + return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, true); + } + + if (null == propertyCondition){ + // assumption: default value of property is 'position' and not 'distance' or any other rawdata. + // so we will not publish rawdata if property-field is unset + return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, true); + } + + boolean isBlocking = false; //false for pass, true for block + if (sensorIdCondition != null){ + String rawdataSensorId = beaconRawdataEvent.getSensorId(); + if (!sensorIdCondition.contains(rawdataSensorId)){ + isBlocking = true; // important: once true, isBlocking must not be switched to false again, i.e., once blocked dont unblock anymore + } + } + + // rawdata-filter should block, if something other than rawdata is requested. + // for case propertyCondition == null: see above + if (propertyCondition != null){ + // currently we only accept 'distance' as a keyword to indicate the request for publishing rawdata + if (! propertyCondition.contains(MONREQ_DISTANCE_PROPERTY)){ + return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, true); + } + } + return new BeaconFilteringResult(getMonitoringTaskId(), beaconRawdataEvent, isBlocking); + } + public FilteringResult process(PositionEvent event) throws ParseException { IPos_DatamodelFactory dataModelFactory = IPos_DatamodelFactory.eINSTANCE; LocalizableObject lObject = DataServices.getLObjectByIdOrNull(event.getLObjectId()); diff --git a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java index 5bac059..3fe1a07 100644 --- a/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java +++ b/src/main/java/ipos/project/Functionality/eventfilter/readConfig.java @@ -29,15 +29,46 @@ public class readConfig { for (String frameId : monReq.getFrameIds()){ Zone zone_monReq = DataServices.getZoneByIdOrNull(frameId); if (null == zone_monReq){ - LOG.warn("MonitoringRequest contained an invalid Zone-id"); + LOG.warn("MonitoringRequest contained an invalid Zone-id: " + frameId); return false; } ArrayList<Float[][]> positionConditionCell = transformZone2PositionConditionCell(zone_monReq); config.getPositionConditionCells().put(frameId, positionConditionCell); } + + try { + monReq.getId().forEach(sensorId -> addSensorIdToFilterConfig(sensorId, config)); + }catch (RuntimeException e){ + LOG.warn(e.getMessage()); + return false; + } + + try { + monReq.getProperties().forEach(property -> addPropertyToFilterConfig(property, config)); + }catch (RuntimeException e){ + LOG.warn(e.getMessage()); + return false; + } + return true; } + private static void addPropertyToFilterConfig(String property, EventFilterCondition config) { + if (eventFilter.MONREQ_ALLOWED_PROPERTIES.contains(property)){ + config.getPropertyCondition().add(property); + }else{ + throw new RuntimeException("MonitoringRequest contained an invalid: " + property); + } + } + + private static void addSensorIdToFilterConfig(String sensorId, EventFilterCondition config) { + LocalizableObject lObject = DataServices.getLObjectByIdOrNull(sensorId); + if (null == lObject){ + throw new RuntimeException("MonitoringRequest contained an invalid sensor-id: " + sensorId); + } + config.getSensorIdCondition().add(sensorId); + } + public static ArrayList<Float[][]> transformZone2PositionConditionCell(Zone zone) { // TODO: support Point-Types other than Point3D ArrayList<Float[][]> position_condition_cell = new ArrayList<>(); diff --git a/src/main/java/ipos/project/MainApp.java b/src/main/java/ipos/project/MainApp.java index 6018fea..e8a4f91 100644 --- a/src/main/java/ipos/project/MainApp.java +++ b/src/main/java/ipos/project/MainApp.java @@ -26,10 +26,12 @@ public class MainApp { public static final String TESTDATA_OP = "./testdata_raw_orderpicker.txt"; public static final String TESTDATA_OP_EVTS = "testdata_raw_orderpicker_posEvts.txt"; public static final String TESTDATA_SDF = "testdata_raw_sdf.txt"; + public static final String TESTDATA_TOOZ = "testdata_raw_tooz.txt"; public static final String COMMAND_INDFRO = "indfro testdata"; // Industrierobotik_Frontend public static final String COMMAND_OP = "oppl testdata"; public static final String COMMAND_OP_EVTS = "opevts testdata"; public static final String COMMAND_SDF = "sdf testdata"; + public static final String COMMAND_TOOZ = "tooz testdata"; public static final String COMMAND_EXIT = "exit"; public static final String COMMAND_HELP = "help"; public static final String COMMAND_QUERY = "query"; @@ -58,6 +60,7 @@ public class MainApp { case COMMAND_EXIT : proceed = false; break; case COMMAND_HELP: printCommands(); break; case COMMAND_INDFRO: GenericSensorValueProcessor.processTestData(TESTDATA_INDFRO); break; + case COMMAND_TOOZ: GenericSensorValueProcessor.processTestData(TESTDATA_TOOZ); break; case COMMAND_SDF: GenericSensorValueProcessor.processTestData(TESTDATA_SDF); break; case COMMAND_OP : OFBizOrderPicker.processPicklistTestData(TESTDATA_OP); break; case COMMAND_OP_EVTS: OFBizOrderPicker.processPosEvtTestData(TESTDATA_OP_EVTS); break; diff --git a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java index d67d5b1..43ad387 100644 --- a/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java +++ b/src/main/java/ipos/project/SensorValueIntegration/GenericSensorValueProcessor.java @@ -2,12 +2,18 @@ package ipos.project.SensorValueIntegration; import com.google.protobuf.InvalidProtocolBufferException; import ipos.models.GenericSensor; +import ipos.models.SimpleScene; import ipos.models.SimpleScene.IposPosition; +import ipos.project.DataModellntegration.SimpleSceneIntegration.service.SimpleSceneTransformer; +import ipos.project.DataModellntegration.iPos_Datamodel.UWB; +import ipos.project.SensorValueIntegration.Service.GenericSensorTransformer; +import ipos.project.UseCaseController.PositionMonitoring; import ipos.project.devkit.utility.ExternalPubServiceImpl; import ipos.project.SensorValueIntegration.api.MqttPositionHandler; import ipos.project.devkit.utility.OtherUtility; import ipos.project.devkit.utility.ProtoJsonMap; import org.apache.logging.log4j.LogManager; +import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @@ -19,7 +25,12 @@ public class GenericSensorValueProcessor { private static org.apache.logging.log4j.Logger LOG = LogManager.getLogger(); @Autowired - private ExternalPubServiceImpl mqttService; + public GenericSensorValueProcessor(ExternalPubServiceImpl mqttService_){ + mqttService = mqttService_; + } + + // @Autowired + private static ExternalPubServiceImpl mqttService; @JmsListener(destination = "/positions", containerFactory = "jmsListenFactory") public void receiveMessage(IposPosition pos) { @@ -44,4 +55,27 @@ public class GenericSensorValueProcessor { } } + public static void receiveMessage(UWB beaconRawdataEvent, String monitoringTaskId, String serializationType) { + GenericSensor.UWBRawDataEvent rawdataEvent_proto = GenericSensorTransformer.uwb_internal2GSensor(beaconRawdataEvent); + MqttMessage uwbRawDataEvent_mqttMessage = mqttService.createMqttMsg(rawdataEvent_proto, 0, false); + String uwbRawDataEvent_jsonString = ProtoJsonMap.toJson(rawdataEvent_proto); + LOG.info("OP: Publishing UWBRawDataEvent on topic " + monitoringTaskId + " with serialization type " + serializationType + ": " + uwbRawDataEvent_jsonString); + LOG.info("OP: "); + publishRespectingSerializationType(monitoringTaskId, serializationType, uwbRawDataEvent_jsonString, uwbRawDataEvent_mqttMessage); + } + + private static void publishRespectingSerializationType(String topic, String serializationType, String jsonString, MqttMessage mqttMessage) { + // publishes protobuf over MQTT + if (PositionMonitoring.PROTOBUF_SERIALIZATION_TYPE.equals(serializationType)){ + mqttService.publish(topic, mqttMessage); + LOG.info("publishing protobuf mqttMessage. JSON-representation:" + jsonString + " on topic: " + topic); + } + + // publishes JSON over MQTT + if (PositionMonitoring.JSON_SERIALIZATION_TYPE.equals(serializationType)){ + mqttService.publish(topic, jsonString, 0, false); + LOG.info("publishing JSON mqttMessage:" + jsonString + " on topic: " + topic); + } + } + } diff --git a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java index 2a55243..fde844d 100644 --- a/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java +++ b/src/main/java/ipos/project/SensorValueIntegration/Service/GenericSensorTransformer.java @@ -10,10 +10,7 @@ import org.apache.logging.log4j.LogManager; import org.eclipse.emf.ecore.EObject; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class GenericSensorTransformer { @@ -125,6 +122,23 @@ public class GenericSensorTransformer { return outputMap; } + + public static GenericSensor.UWBRawDataEvent uwb_internal2GSensor(UWB beaconRawdataEvent) { + GenericSensor.UWBRawDataEvent.Builder protoUWBRawDataEvent = GenericSensor.UWBRawDataEvent.newBuilder(); + protoUWBRawDataEvent.setTimestamp(beaconRawdataEvent.getTimeStamp()); + protoUWBRawDataEvent.setSensorId(beaconRawdataEvent.getSensorId()); + protoUWBRawDataEvent.putAllDistances(beaconDistances_internal2GSensor(beaconRawdataEvent.getDistances())); + protoUWBRawDataEvent.setType(beaconRawdataEvent.getType()); + return protoUWBRawDataEvent.build(); + } + + private static Map<String, String> beaconDistances_internal2GSensor(Map<String, Double> distances) { + HashMap<String, String> distancesGSensor = new HashMap<>(); + for (Map.Entry<String, Double> distanceEntry : distances.entrySet()){ + distancesGSensor.put(distanceEntry.getKey(), String.valueOf(distanceEntry.getValue().doubleValue())); + } + return distancesGSensor; + } } diff --git a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java index beef934..cc63b56 100644 --- a/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java +++ b/src/main/java/ipos/project/UseCaseController/PositionMonitoring.java @@ -6,9 +6,9 @@ import ipos.project.DataModellntegration.iPos_Datamodel.IPosDevKit.DataStorageQu import ipos.project.DataModellntegration.iPos_Datamodel.IPosDevKit.IPosDevKitFactory; import ipos.project.DataModellntegration.iPos_Datamodel.IPosDevKit.MonitoringRequest; import ipos.project.Functionality.*; -import ipos.project.Functionality.eventfilter.FilteringResult; -import ipos.project.Functionality.eventfilter.eventFilter; -import ipos.project.Functionality.eventfilter.readConfig; +import ipos.project.Functionality.eventfilter.*; +import ipos.project.Functionality.eventfilter.BeaconFilteringResult; +import ipos.project.SensorValueIntegration.GenericSensorValueProcessor; import org.apache.logging.log4j.LogManager; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @@ -62,24 +62,50 @@ public class PositionMonitoring { } public static void receiveMessage (UWB uwbRawDataEvent){ - PositionEvent positionEvent = null; + calculateAndProcessPosition(uwbRawDataEvent); + List<BeaconFilteringResult> beaconFilteringResults = filterRawdata((Beacon) uwbRawDataEvent); + processBeaconFilteringResults(beaconFilteringResults); + } + + private static void calculateAndProcessPosition(UWB uwbRawDataEvent) { + Optional<PositionEvent> optionalPositionEvent = Optional.empty(); try { - positionEvent = Triangulation.update(uwbRawDataEvent); + optionalPositionEvent = Triangulation.update(uwbRawDataEvent); + } catch (ParseException e) { + e.printStackTrace(); + } + if (optionalPositionEvent.isPresent()) { + PositionEvent positionEvent = optionalPositionEvent.get(); LOG.info("OP:"); LOG.info("OP:"); LOG.info("OP:"); LOG.info("OP:----PositionMonitoring--------------------------"); LOG.info("OP: position: " + logPosition(positionEvent.getPlacing())); - - } catch (ParseException e) { - e.printStackTrace(); - } - if (positionEvent != null) { updateLocalizableObject(positionEvent); receiveMessage(positionEvent); + }else { + LOG.info("OP: No position could be calculated from UWBRawDataEvent"); } } + private static void processBeaconFilteringResults(List<BeaconFilteringResult> beaconFilteringResults) { + for (BeaconFilteringResult beaconFilteringResult : beaconFilteringResults){ + if (beaconFilteringResult.hasBlockedEvent()){ // don't publish Beacon-rawdata on behalf of an eventFilter that has blocked the event + continue; + } + eventFilter eFilter = getEventFilterByIdOrNull(beaconFilteringResult.getMonitoringTaskId()); + GenericSensorValueProcessor.receiveMessage((UWB) beaconFilteringResult.getBeaconRawdataEvent(), beaconFilteringResult.getMonitoringTaskId(), eFilter.getSerializationType()); + } + } + + private static List<BeaconFilteringResult> filterRawdata(Beacon beaconRawDataEvent) { + List<BeaconFilteringResult> beaconFilteringResults = new LinkedList<BeaconFilteringResult>(); + for (eventFilter eFilter : eventFilters){ + beaconFilteringResults.add(eFilter.processRawdata(beaconRawDataEvent)); + } + return beaconFilteringResults; + } + static int imuCount = 0; // JMS-topic: imuRawdataEvent @@ -151,14 +177,13 @@ public class PositionMonitoring { public static void receiveMessage(MonitoringRequest monReq) { LOG.info("Received MonitoringRequest <" + monReq + ">"); eventFilter filter = new eventFilter(monReq); - EventFilterCondition config = modelFactory.createEventFilterCondition(); - config.setPositionConditionCells(new HashMap<>()); + EventFilterCondition config = createAndInitEventFilterCondition(); if (! readConfig.readFilterConfigFromMonitoringRequest(monReq, config)){ return; // monitoringRequest could not be read } filter.init(config); eventFilters.add(filter); - LOG.info("EventFilter was created: " + filter.toString() + "; monitoringTaskId: " + filter.getMonitoringTaskId() + "; zone-ids:" + filter.getFilterConditionConfig().getPositionConditionCells().keySet()); + LOG.info("EventFilter was created: " + filter.toString() + "; monitoringTaskId: " + filter.getMonitoringTaskId() + "; zone-ids:" + filter.getFilterConditionConfig().getPositionConditionCells().keySet() + "; property: " + new HashSet(filter.getFilterConditionConfig().getPropertyCondition())); /* * trackingTaskId equals MonitoringTaskId + '_tracking' (which equals the name @@ -171,6 +196,14 @@ public class PositionMonitoring { DataServices.initTrackingTask(trackingTaskId); } + private static EventFilterCondition createAndInitEventFilterCondition() { + EventFilterCondition config = modelFactory.createEventFilterCondition(); + config.setPositionConditionCells(new HashMap<>()); + config.setSensorIdCondition(new LinkedList<>()); + config.setPropertyCondition(new LinkedList<>()); + return config; + } + private static boolean isDoor = false; private static boolean isCentre = false; private static boolean isWindow = false; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2933f2c..f14f376 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -15,6 +15,7 @@ mqtt: # hostname: 192.168.0.111 # ceti-laptop robolab # hostname: broker.hivemq.com # online # hostname: 192.168.0.143 # Frank-laptop robolab + # hostname: localhost # locally-running mosquitto hostname: localhost port: 1883 diff --git a/testdata_raw_tooz.txt b/testdata_raw_tooz.txt new file mode 100644 index 0000000..96672a1 --- /dev/null +++ b/testdata_raw_tooz.txt @@ -0,0 +1,4 @@ +{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:03:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_1" : "2.5", "beacon_2" : "5.5", "beacon_3" : "8.5"}, "type": "UWB"}]} +{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:04:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_4" : "2.8"}, "type": "UWB"}]} +{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:05:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_5" : "5.8"}, "type": "UWB"}]} +{"uwbRawDataEvent" : [ {"timestamp" : "2022-02-02T16:06:20+00:00", "sensorId" : "tooz_employee_uwb", "distances": {"beacon_6" : "8.8"}, "type": "UWB"}]} \ No newline at end of file -- GitLab