From b37e0a784ff24c5c5176fc1bff62add81a7d0867 Mon Sep 17 00:00:00 2001
From: Simon Ottenhaus <simon.ottenhaus@kit.edu>
Date: Sun, 3 May 2015 12:20:44 +0200
Subject: [PATCH] added test statechart for Weiss Tactile Sensors

---
 data/RobotAPI/VariantInfo-RobotAPI.xml        |  17 +++
 .../WeissHapticSensorsUnitTest/CMakeLists.txt |  18 +--
 .../config/ConditionHandler.cfg               | 100 +++++++++++++++
 .../config/RobotControl.cfg                   | 117 +++++++++++++++++
 .../config/SystemObserver.cfg                 |  84 ++++++++++++
 .../config/WeissHapticUnitApp.cfg             |   2 +-
 ...XMLRemoteStateOfferer.WeissHapticGroup.cfg |  91 +++++++++++++
 .../WeissHapticSensorsUnitTest/startGui.sh    |   8 --
 .../components/units/HapticObserver.cpp       |   1 +
 .../components/units/HapticObserver.h         |   1 +
 source/RobotAPI/statecharts/CMakeLists.txt    |   2 +
 .../WeissHapticGroup/CMakeLists.txt           |  48 +++++++
 .../WeissHapticGroup/WeissHapticGroup.scgxml  |   9 ++
 .../WeissHapticGroupRemoteStateOfferer.cpp    |  66 ++++++++++
 .../WeissHapticGroupRemoteStateOfferer.h      |  54 ++++++++
 ...ssHapticGroupStatechartContext.generated.h |  59 +++++++++
 .../WeissHapticSensorTest.cpp                 | 112 ++++++++++++++++
 .../WeissHapticSensorTest.generated.h         | 120 ++++++++++++++++++
 .../WeissHapticGroup/WeissHapticSensorTest.h  |  55 ++++++++
 .../WeissHapticSensorTest.xml                 |  12 ++
 20 files changed, 958 insertions(+), 18 deletions(-)
 create mode 100644 scenarios/tests/WeissHapticSensorsUnitTest/config/ConditionHandler.cfg
 create mode 100644 scenarios/tests/WeissHapticSensorsUnitTest/config/RobotControl.cfg
 create mode 100644 scenarios/tests/WeissHapticSensorsUnitTest/config/SystemObserver.cfg
 create mode 100644 scenarios/tests/WeissHapticSensorsUnitTest/config/XMLRemoteStateOfferer.WeissHapticGroup.cfg
 delete mode 100755 scenarios/tests/WeissHapticSensorsUnitTest/startGui.sh
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/CMakeLists.txt
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroup.scgxml
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.cpp
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.h
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupStatechartContext.generated.h
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.cpp
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.generated.h
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.h
 create mode 100644 source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.xml

diff --git a/data/RobotAPI/VariantInfo-RobotAPI.xml b/data/RobotAPI/VariantInfo-RobotAPI.xml
index 4060a4ab5..d24635735 100644
--- a/data/RobotAPI/VariantInfo-RobotAPI.xml
+++ b/data/RobotAPI/VariantInfo-RobotAPI.xml
@@ -26,6 +26,23 @@
             propertyName="ForceTorqueUnitObserverName"
             propertyIsOptional="true"
             propertyDefaultValue="ForceTorqueUnitObserver" />
+        <Proxy include="RobotAPI/interface/units/HapticUnit.h"
+			humanName="Haptic Unit Observer"
+            typeName="HapticUnitObserverInterfacePrx"
+            memberName="hapticObserver"
+            getterName="getHapticObserver"
+            propertyName="HapticUnitObserverName"
+            propertyIsOptional="true"
+            propertyDefaultValue="HapticUnitObserver" />
+        <Proxy include="RobotAPI/interface/units/WeissHapticUnit.h"
+			humanName="Weiss Haptic Unit"
+            typeName="WeissHapticUnitInterfacePrx"
+            memberName="weissHapticUnit"
+            getterName="getWeissHapticUnit"
+            propertyName="WeissHapticUnitName"
+            propertyIsOptional="true"
+            propertyDefaultValue="WeissHapticUnit" />
+			
         <Proxy include="RobotAPI/interface/core/RobotState.h"
             humanName="Robot State Component"
             typeName="RobotStateComponentInterfacePrx"
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/CMakeLists.txt b/scenarios/tests/WeissHapticSensorsUnitTest/CMakeLists.txt
index 09aa30750..b94e56938 100644
--- a/scenarios/tests/WeissHapticSensorsUnitTest/CMakeLists.txt
+++ b/scenarios/tests/WeissHapticSensorsUnitTest/CMakeLists.txt
@@ -1,16 +1,16 @@
+set(SCENARIO_CONFIG_COMPONENTS
+    config/RobotControl.cfg
+    config/WeissHapticUnitApp.cfg
+    config/XMLRemoteStateOfferer.WeissHapticGroup.cfg
+	config/SystemObserver.cfg
+	config/ConditionHandler.cfg
 
-set(SCENARIO_COMPONENTS
-        WeissHapticUnitApp
+
+        #WeissHapticUnitApp
         #WeissHapticSensorApp
         #HapticObserverApp
 )
 
 
 # optional 3rd parameter: "path/to/global/config.cfg"
-armarx_scenario("WeissHapticSensorsUnitTest" "${SCENARIO_COMPONENTS}")
-
-#set(SCENARIO_CONFIGS
-#    config/ComponentName.optionalString.cfg
-#    )
-# optional 3rd parameter: "path/to/global/config.cfg"
-#armarx_scenario_from_configs("WeissHapticSensorsUnitTest" "${SCENARIO_CONFIGS}")
+armarx_scenario_from_configs("WeissHapticSensorsUnitTest" "${SCENARIO_CONFIG_COMPONENTS}")
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/config/ConditionHandler.cfg b/scenarios/tests/WeissHapticSensorsUnitTest/config/ConditionHandler.cfg
new file mode 100644
index 000000000..75f5b78f4
--- /dev/null
+++ b/scenarios/tests/WeissHapticSensorsUnitTest/config/ConditionHandler.cfg
@@ -0,0 +1,100 @@
+# ==================================================================
+# ArmarX properties
+# ==================================================================
+
+# ArmarX.CachePath:  Path for cache files
+#  Attributes:
+#  - Default:            ${HOME}/.armarx/mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = ${HOME}/.armarx/mongo/.cache
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Verbose
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
+# ArmarX.Verbosity = Verbose
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ==================================================================
+# ArmarX.ConditionHandler properties
+# ==================================================================
+
+# ArmarX.ConditionHandler.HistoryLength:  Length of condition history kept by the conditionhandler
+#  Attributes:
+#  - Default:            1000
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.HistoryLength = 1000
+
+
+# ArmarX.ConditionHandler.Observers:  Comma seperated observer list
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.Observers = ""
+
+
+# ArmarX.ConditionHandler.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Error, Fatal, Info, Undefined, Verbose, Warning}
+# ArmarX.ConditionHandler.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.ConditionHandler.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ConditionHandler.ObjectName = ""
+
+
+
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/config/RobotControl.cfg b/scenarios/tests/WeissHapticSensorsUnitTest/config/RobotControl.cfg
new file mode 100644
index 000000000..08183f785
--- /dev/null
+++ b/scenarios/tests/WeissHapticSensorsUnitTest/config/RobotControl.cfg
@@ -0,0 +1,117 @@
+# ==================================================================
+# ArmarX properties
+# ==================================================================
+
+# ArmarX.CachePath:  Path for cache files
+#  Attributes:
+#  - Default:            ${HOME}/.armarx/mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = ${HOME}/.armarx/mongo/.cache
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Verbose
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
+# ArmarX.Verbosity = Verbose
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.DatapathConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/datapath.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DatapathConfig = ./config/datapath.cfg
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ==================================================================
+# ArmarX.RobotControlStateOfferer properties
+# ==================================================================
+
+# ArmarX.RobotControlStateOfferer.stateName:  name of the state to load
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+ArmarX.RobotControlStateOfferer.stateName = "WeissHapticSensorTest"
+
+
+# ArmarX.RobotControlStateOfferer.proxyName:  name of the proxy to load
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+ArmarX.RobotControlStateOfferer.proxyName = "WeissHapticGroupRemoteStateOfferer"
+
+
+# ArmarX.RobotControlStateOfferer.logstates:  
+#  Attributes:
+#  - Default:            Comma seperated list with state names to log. If not set, all transitions will be logged
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RobotControlStateOfferer.logstates = Comma seperated list with state names to log. If not set, all transitions will be logged
+
+
+# ArmarX.RobotControlStateOfferer.enableStatechartLogger:  disable/enable statechart logger
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.RobotControlStateOfferer.enableStatechartLogger = 0
+
+
+# ArmarX.RobotControlStateOfferer.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Error, Fatal, Info, Undefined, Verbose, Warning}
+# ArmarX.RobotControlStateOfferer.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.RobotControlStateOfferer.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.RobotControlStateOfferer.ObjectName = ""
+
+
+
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/config/SystemObserver.cfg b/scenarios/tests/WeissHapticSensorsUnitTest/config/SystemObserver.cfg
new file mode 100644
index 000000000..f8cf074d1
--- /dev/null
+++ b/scenarios/tests/WeissHapticSensorsUnitTest/config/SystemObserver.cfg
@@ -0,0 +1,84 @@
+# ==================================================================
+# ArmarX properties
+# ==================================================================
+
+# ArmarX.CachePath:  Path for cache files
+#  Attributes:
+#  - Default:            ${HOME}/.armarx/mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = ${HOME}/.armarx/mongo/.cache
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Verbose
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
+# ArmarX.Verbosity = Verbose
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.ApplicationName = ""
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ==================================================================
+# ArmarX.SystemObserver properties
+# ==================================================================
+
+# ArmarX.SystemObserver.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Error, Fatal, Info, Undefined, Verbose, Warning}
+# ArmarX.SystemObserver.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.SystemObserver.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.SystemObserver.ObjectName = ""
+
+
+
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/config/WeissHapticUnitApp.cfg b/scenarios/tests/WeissHapticSensorsUnitTest/config/WeissHapticUnitApp.cfg
index 28eb648f1..b8777df3d 100644
--- a/scenarios/tests/WeissHapticSensorsUnitTest/config/WeissHapticUnitApp.cfg
+++ b/scenarios/tests/WeissHapticSensorsUnitTest/config/WeissHapticUnitApp.cfg
@@ -86,7 +86,7 @@
 #  - Default:            ""
 #  - Case sensitivity:   no
 #  - Required:           no
-# ArmarX.HapticUnit.ObjectName = ""
+ArmarX.HapticUnit.ObjectName = "WeissHapticUnit"
 
 
 # ==================================================================
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/config/XMLRemoteStateOfferer.WeissHapticGroup.cfg b/scenarios/tests/WeissHapticSensorsUnitTest/config/XMLRemoteStateOfferer.WeissHapticGroup.cfg
new file mode 100644
index 000000000..caedd0eae
--- /dev/null
+++ b/scenarios/tests/WeissHapticSensorsUnitTest/config/XMLRemoteStateOfferer.WeissHapticGroup.cfg
@@ -0,0 +1,91 @@
+# ==================================================================
+# ArmarX properties
+# ==================================================================
+
+# ArmarX.CachePath:  Path for cache files
+#  Attributes:
+#  - Default:            ${HOME}/.armarx/mongo/.cache
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.CachePath = ${HOME}/.armarx/mongo/.cache
+
+
+# ArmarX.DataPath:  Semicolon-separated search list for data files
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DataPath = ""
+
+
+# ArmarX.Verbosity:  Global logging level for whole application
+#  Attributes:
+#  - Default:            Verbose
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Debug, Error, Fatal, Important, Info, Undefined, Verbose, Warning}
+# ArmarX.Verbosity = Verbose
+
+
+# ArmarX.DisableLogging:  Turn logging off in whole application
+#  Attributes:
+#  - Default:            0
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.DisableLogging = 0
+
+
+# ArmarX.ApplicationName:  Application name
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+ArmarX.ApplicationName = "XMLStateComponentWeissHapticGroup"
+
+
+# ArmarX.DependenciesConfig:  Path to the (usually generated) config file containing all data paths of all dependent projects. This property usually does not need to be edited.
+#  Attributes:
+#  - Default:            ./config/dependencies.cfg
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.DependenciesConfig = ./config/dependencies.cfg
+
+
+# ArmarX.Config:  Comma-separated list of configuration files 
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+# ArmarX.Config = ""
+
+
+# ==================================================================
+# ArmarX.XMLStateComponent properties
+# ==================================================================
+
+# ArmarX.XMLStateComponent.XMLStatechartGroupDefinitionFile:  Path to statechart group definition file (*.scgxml) - relative to projects source dir
+#  Attributes:
+#  - Case sensitivity:   no
+#  - Required:           yes
+ArmarX.XMLStateComponent.XMLStatechartGroupDefinitionFile = RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroup.scgxml
+
+
+# ArmarX.XMLStateComponent.MinimumLoggingLevel:  Local logging level only for this component
+#  Attributes:
+#  - Default:            Undefined
+#  - Case sensitivity:   no
+#  - Required:           no
+#  - Possible values: {Error, Fatal, Info, Undefined, Verbose, Warning}
+# ArmarX.XMLStateComponent.MinimumLoggingLevel = Undefined
+
+
+# ArmarX.XMLStateComponent.ObjectName:  Name of IceGrid well-known object
+#  Attributes:
+#  - Default:            ""
+#  - Case sensitivity:   no
+#  - Required:           no
+ArmarX.XMLStateComponent.ObjectName = "XMLStateComponentWeissHapticGroup"
+
+
+
diff --git a/scenarios/tests/WeissHapticSensorsUnitTest/startGui.sh b/scenarios/tests/WeissHapticSensorsUnitTest/startGui.sh
deleted file mode 100755
index e2f4b07c6..000000000
--- a/scenarios/tests/WeissHapticSensorsUnitTest/startGui.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-export CORE_PATH=../../../Core
-export GUI_PATH=../../../Gui
-
-export SCRIPT_PATH=$CORE_PATH/build/bin
-export GUI_BIN_PATH=$GUI_PATH/build/bin
-
-# Gui
-$SCRIPT_PATH/startApplication.sh $GUI_BIN_PATH/ArmarXGuiRun &
diff --git a/source/RobotAPI/components/units/HapticObserver.cpp b/source/RobotAPI/components/units/HapticObserver.cpp
index 8f5d82933..9bb402e96 100644
--- a/source/RobotAPI/components/units/HapticObserver.cpp
+++ b/source/RobotAPI/components/units/HapticObserver.cpp
@@ -67,6 +67,7 @@ void HapticObserver::reportSensorValues(const std::string& device, const std::st
         offerDataFieldWithDefault(channelName, "mean", Variant(mean), "Mean value");
         offerDataFieldWithDefault(channelName, "timestamp", timestampPtr, "Timestamp");
         offerDataFieldWithDefault(channelName, "rate", Variant(0.0f), "Sample rate");
+        ARMARX_INFO << "Offering new channel: " << channelName;
     }
     else
     {
diff --git a/source/RobotAPI/components/units/HapticObserver.h b/source/RobotAPI/components/units/HapticObserver.h
index bec65d205..4e167780a 100644
--- a/source/RobotAPI/components/units/HapticObserver.h
+++ b/source/RobotAPI/components/units/HapticObserver.h
@@ -31,6 +31,7 @@
 #include <Core/util/variants/eigen3/Eigen3VariantObjectFactories.h>
 #include <Core/core/services/tasks/PeriodicTask.h>
 
+
 namespace armarx
 {
 
diff --git a/source/RobotAPI/statecharts/CMakeLists.txt b/source/RobotAPI/statecharts/CMakeLists.txt
index ef16919a0..17fa472e9 100644
--- a/source/RobotAPI/statecharts/CMakeLists.txt
+++ b/source/RobotAPI/statecharts/CMakeLists.txt
@@ -1,2 +1,4 @@
 
 add_subdirectory(operations)
+
+add_subdirectory(WeissHapticGroup)
\ No newline at end of file
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/CMakeLists.txt b/source/RobotAPI/statecharts/WeissHapticGroup/CMakeLists.txt
new file mode 100644
index 000000000..1bb8a3e82
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/CMakeLists.txt
@@ -0,0 +1,48 @@
+armarx_component_set_name("WeissHapticGroup")
+
+#find_package(MyLib QUIET)
+#armarx_build_if(MyLib_FOUND "MyLib not available")
+#
+# all include_directories must be guarded by if(Xyz_FOUND)
+# for multiple libraries write: if(X_FOUND AND Y_FOUND)....
+#if(MyLib_FOUND)
+#    include_directories(${MyLib_INCLUDE_DIRS})
+#endif()
+
+find_package(Eigen3 QUIET)
+find_package(Simox QUIET)
+
+
+armarx_build_if(Eigen3_FOUND "Eigen3 not available")
+armarx_build_if(Simox_FOUND "Simox-VirtualRobot not available")
+
+
+if (Eigen3_FOUND AND Simox_FOUND)
+    include_directories(
+        ${Eigen3_INCLUDE_DIR}
+        ${Simox_INCLUDE_DIRS}
+    )
+endif()
+
+set(COMPONENT_LIBS
+    RobotAPIInterfaces RobotAPICore RobotAPIUnits
+    ArmarXInterfaces ArmarXCore ArmarXCoreStatechart ArmarXCoreObservers)
+
+# Sources
+
+set(SOURCES
+WeissHapticGroupRemoteStateOfferer.cpp
+./WeissHapticSensorTest.cpp
+#@TEMPLATE_LINE@@COMPONENT_PATH@/@COMPONENT_NAME@.cpp
+)
+
+set(HEADERS
+WeissHapticGroupRemoteStateOfferer.h
+WeissHapticGroupStatechartContext.generated.h
+./WeissHapticSensorTest.h
+#@TEMPLATE_LINE@@COMPONENT_PATH@/@COMPONENT_NAME@.h
+./WeissHapticSensorTest.generated.h
+#@TEMPLATE_LINE@@COMPONENT_PATH@/@COMPONENT_NAME@.generated.h
+)
+
+armarx_add_component("${SOURCES}" "${HEADERS}")
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroup.scgxml b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroup.scgxml
new file mode 100644
index 000000000..d030a3d32
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroup.scgxml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<StatechartGroup name="WeissHapticGroup" package="RobotAPI" generateContext="true">
+	<Proxies>
+		<Proxy value="RobotAPICore.hapticObserver"/>
+		<Proxy value="RobotAPICore.weissHapticUnit"/>
+	</Proxies>
+	<State filename="WeissHapticSensorTest.xml" visibility="public"/>
+</StatechartGroup>
+
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.cpp b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.cpp
new file mode 100644
index 000000000..a8f0c6b0e
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.cpp
@@ -0,0 +1,66 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::WeissHapticGroup::WeissHapticGroupRemoteStateOfferer
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2015
+ * @copyright  http://www.gnu.org/licenses/gpl.txt
+ *             GNU General Public License
+ */
+
+#include "WeissHapticGroupRemoteStateOfferer.h"
+
+using namespace armarx;
+using namespace WeissHapticGroup;
+
+// DO NOT EDIT NEXT LINE
+WeissHapticGroupRemoteStateOfferer::SubClassRegistry WeissHapticGroupRemoteStateOfferer::Registry(WeissHapticGroupRemoteStateOfferer::GetName(), &WeissHapticGroupRemoteStateOfferer::CreateInstance);
+
+
+
+WeissHapticGroupRemoteStateOfferer::WeissHapticGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader) :
+    XMLRemoteStateOfferer < WeissHapticGroupStatechartContext > (reader)
+{
+}
+
+void WeissHapticGroupRemoteStateOfferer::onInitXMLRemoteStateOfferer()
+{
+
+}
+
+void WeissHapticGroupRemoteStateOfferer::onConnectXMLRemoteStateOfferer()
+{
+
+}
+
+void WeissHapticGroupRemoteStateOfferer::onExitXMLRemoteStateOfferer()
+{
+
+}
+
+// DO NOT EDIT NEXT FUNCTION
+std::string WeissHapticGroupRemoteStateOfferer::GetName()
+{
+    return "WeissHapticGroupRemoteStateOfferer";
+}
+
+// DO NOT EDIT NEXT FUNCTION
+XMLStateOffererFactoryBasePtr WeissHapticGroupRemoteStateOfferer::CreateInstance(StatechartGroupXmlReaderPtr reader)
+{
+    return XMLStateOffererFactoryBasePtr(new WeissHapticGroupRemoteStateOfferer(reader));
+}
+
+
+
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.h b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.h
new file mode 100644
index 000000000..232ed4f32
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupRemoteStateOfferer.h
@@ -0,0 +1,54 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::WeissHapticGroup
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2015
+ * @copyright  http://www.gnu.org/licenses/gpl.txt
+ *             GNU General Public License
+ */
+
+#ifndef _ARMARX_XMLUSERCODE_RobotAPI_WeissHapticGroup_REMOTESTATEOFFERER_H
+#define _ARMARX_XMLUSERCODE_RobotAPI_WeissHapticGroup_REMOTESTATEOFFERER_H
+
+#include <Core/statechart/xmlstates/XMLRemoteStateOfferer.h>
+#include "WeissHapticGroupStatechartContext.generated.h"
+
+namespace armarx
+{
+    namespace WeissHapticGroup
+    {
+        class WeissHapticGroupRemoteStateOfferer :
+            virtual public XMLRemoteStateOfferer < WeissHapticGroupStatechartContext > // Change this statechart context if you need another context (dont forget to change in the constructor as well)
+        {
+        public:
+            WeissHapticGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader);
+
+            // inherited from RemoteStateOfferer
+            void onInitXMLRemoteStateOfferer();
+            void onConnectXMLRemoteStateOfferer();
+            void onExitXMLRemoteStateOfferer();
+
+            // static functions for AbstractFactory Method
+            static std::string GetName();
+            static XMLStateOffererFactoryBasePtr CreateInstance(StatechartGroupXmlReaderPtr reader);
+            static SubClassRegistry Registry;
+
+
+        };
+    }
+}
+
+#endif
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupStatechartContext.generated.h b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupStatechartContext.generated.h
new file mode 100644
index 000000000..947ae7ed0
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticGroupStatechartContext.generated.h
@@ -0,0 +1,59 @@
+#ifndef ARMARX_COMPONENT_ARMARX_WEISSHAPTICGROUP_WEISSHAPTICGROUPSTATECHARTCONTEXT_H
+#define ARMARX_COMPONENT_ARMARX_WEISSHAPTICGROUP_WEISSHAPTICGROUPSTATECHARTCONTEXT_H
+
+#include <Core/core/Component.h>
+#include <Core/core/system/ImportExportComponent.h>
+#include <Core/statechart/StatechartContext.h>
+#include <RobotAPI/interface/units/HapticUnit.h>
+#include <RobotAPI/interface/units/WeissHapticUnit.h>
+
+namespace armarx
+{
+    namespace WeissHapticGroup
+    {
+        class WeissHapticGroupStatechartContext
+            : virtual public StatechartContext
+        {
+        protected:
+            class PropertyDefinitions
+                : public StatechartContextPropertyDefinitions
+            {
+            public:
+                PropertyDefinitions(std::string prefix)
+                    : StatechartContextPropertyDefinitions(prefix)
+                {
+                    defineOptionalProperty<std::string>("HapticUnitObserverName", "HapticUnitObserver", "Name of the haptic unit observer that should be used");
+                    defineOptionalProperty<std::string>("WeissHapticUnitName", "WeissHapticUnit", "Name of the weiss haptic unit that should be used");
+                }
+            }; // class PropertyDefinitions
+            
+        private:
+            HapticUnitObserverInterfacePrx hapticObserver;
+            WeissHapticUnitInterfacePrx weissHapticUnit;
+            
+        public:
+            std::string getDefaultName() const
+            {
+                return "WeissHapticGroupStatechartContext";
+            }
+            virtual void onInitStatechartContext()
+            {
+                usingProxy(getProperty<std::string>("HapticUnitObserverName").getValue());
+                usingProxy(getProperty<std::string>("WeissHapticUnitName").getValue());
+            }
+            virtual void onConnectStatechartContext()
+            {
+                hapticObserver = getProxy<HapticUnitObserverInterfacePrx>(getProperty<std::string>("HapticUnitObserverName").getValue());
+                weissHapticUnit = getProxy<WeissHapticUnitInterfacePrx>(getProperty<std::string>("WeissHapticUnitName").getValue());
+            }
+            HapticUnitObserverInterfacePrx getHapticObserver() const { return hapticObserver; }
+            WeissHapticUnitInterfacePrx getWeissHapticUnit() const { return weissHapticUnit; }
+            virtual PropertyDefinitionsPtr createPropertyDefinitions()
+            {
+                return PropertyDefinitionsPtr(new WeissHapticGroupStatechartContext::PropertyDefinitions(getConfigIdentifier()));
+            }
+        }; // class WeissHapticGroupStatechartContext
+    } // namespace WeissHapticGroup
+} // namespace armarx
+
+#endif // ARMARX_COMPONENT_ARMARX_WEISSHAPTICGROUP_WEISSHAPTICGROUPSTATECHARTCONTEXT_H
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.cpp b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.cpp
new file mode 100644
index 000000000..ac0edd945
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.cpp
@@ -0,0 +1,112 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::WeissHapticGroup
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2015
+ * @copyright  http://www.gnu.org/licenses/gpl.txt
+ *             GNU General Public License
+ */
+
+#include "WeissHapticSensorTest.h"
+
+#include <RobotAPI/libraries/core/observerfilters/MatrixFilters.h>
+#include <RobotAPI/libraries/core/observerfilters/OffsetFilter.h>
+
+using namespace armarx;
+using namespace WeissHapticGroup;
+
+// DO NOT EDIT NEXT LINE
+WeissHapticSensorTest::SubClassRegistry WeissHapticSensorTest::Registry(WeissHapticSensorTest::GetName(), &WeissHapticSensorTest::CreateInstance);
+
+
+
+WeissHapticSensorTest::WeissHapticSensorTest(const XMLStateConstructorParams& stateData) :
+    XMLStateTemplate<WeissHapticSensorTest>(stateData),  WeissHapticSensorTestGeneratedBase<WeissHapticSensorTest>(stateData)
+{
+}
+
+void WeissHapticSensorTest::onEnter()
+{
+    WeissHapticGroupStatechartContext* context = getContext<WeissHapticGroupStatechartContext>();
+    HapticUnitObserverInterfacePrx hapticObserver = context->getHapticObserver();
+    ChannelRegistry channels = hapticObserver->getAvailableChannels(false);
+    std::map<std::string, DatafieldRefPtr> tactileDatafields_MaximumValueMap;
+    if(channels.size() == 0)
+    {
+        ARMARX_WARNING << "No tactile pads found";
+    }
+    else
+    {
+        ARMARX_INFO << "Creating tactile channels";
+        for(std::pair<std::string, ChannelRegistryEntry> pair : channels)
+        {
+            std::string tactilePad = pair.first;
+            DatafieldRefBasePtr matrixDatafield = new DatafieldRef(hapticObserver, tactilePad, "matrix");
+            DatafieldRefBasePtr matrixNulled = hapticObserver->createFilteredDatafield(DatafieldFilterBasePtr(new filters::OffsetFilter()), matrixDatafield);
+            DatafieldRefBasePtr matrixMax = hapticObserver->createFilteredDatafield(DatafieldFilterBasePtr(new filters::MatrixMaxFilter()), matrixNulled);
+            tactileDatafields_MaximumValueMap.insert(std::make_pair(tactilePad, DatafieldRefPtr::dynamicCast(matrixMax)));
+        }
+    }
+    local.setTactileDatafields_MaximumValue(tactileDatafields_MaximumValueMap);
+
+
+}
+
+void WeissHapticSensorTest::run()
+{
+    std::map<std::string, DatafieldRefPtr> tactileDatafields_MaximumValueMap = local.getTactileDatafields_MaximumValue();
+
+    while (!isRunningTaskStopped()) // stop run function if returning true
+    {
+        std::stringstream ss;
+        std::stringstream ssNames;
+        int max = 0;
+        for(std::pair<std::string, DatafieldRefPtr> pair : tactileDatafields_MaximumValueMap)
+        {
+            std::string tactilePad = pair.first;
+            DatafieldRefPtr matrixMax = pair.second;
+            int padMax = (int)matrixMax->getDataField()->getFloat();
+            ss << padMax << "; ";
+            ssNames << tactilePad << "; ";
+            max = std::max(max, padMax);
+        }
+        ARMARX_IMPORTANT << "tactile max value: " << max << ";  \n\n" << ss.str() << "\n" << ssNames.str();
+
+        usleep(10000); // 100ms
+    }
+
+}
+
+void WeissHapticSensorTest::onBreak()
+{
+    // put your user code for the breaking point here
+    // execution time should be short (<100ms)
+}
+
+void WeissHapticSensorTest::onExit()
+{
+    // put your user code for the exit point here
+    // execution time should be short (<100ms)
+
+}
+
+
+// DO NOT EDIT NEXT FUNCTION
+XMLStateFactoryBasePtr WeissHapticSensorTest::CreateInstance(XMLStateConstructorParams stateData)
+{
+    return XMLStateFactoryBasePtr(new WeissHapticSensorTest(stateData));
+}
+
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.generated.h b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.generated.h
new file mode 100644
index 000000000..a4cd708d5
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.generated.h
@@ -0,0 +1,120 @@
+#ifndef _ARMARX_XMLUSERCODE_ARMARX_WEISSHAPTICGROUP_WEISSHAPTICSENSORTESTGENERATEDBASE_H
+#define _ARMARX_XMLUSERCODE_ARMARX_WEISSHAPTICGROUP_WEISSHAPTICSENSORTESTGENERATEDBASE_H
+
+#include <Core/statechart/xmlstates/XMLState.h>
+#include "WeissHapticGroupStatechartContext.generated.h"
+#include <Core/observers/ObserverObjectFactories.h>
+#include <RobotAPI/interface/units/HapticUnit.h>
+#include <RobotAPI/interface/units/WeissHapticUnit.h>
+
+namespace armarx
+{
+    namespace WeissHapticGroup
+    {
+        template<typename StateType>
+        class WeissHapticSensorTestGeneratedBase
+            : virtual public XMLStateTemplate < StateType >,
+              public XMLStateFactoryBase
+        {
+        protected:
+            class WeissHapticSensorTestIn
+            {
+            private:
+                WeissHapticSensorTestGeneratedBase<StateType> *parent;
+                
+            public:
+                WeissHapticSensorTestIn(WeissHapticSensorTestGeneratedBase<StateType> *parent)
+                    : parent(parent)
+                {
+                }
+            }; // class WeissHapticSensorTestIn
+            
+            class WeissHapticSensorTestLocal
+            {
+            private:
+                WeissHapticSensorTestGeneratedBase<StateType> *parent;
+                
+            public:
+                WeissHapticSensorTestLocal(WeissHapticSensorTestGeneratedBase<StateType> *parent)
+                    : parent(parent)
+                {
+                }
+                
+            public:
+                std::map<std::string, ::armarx::DatafieldRefPtr> getTactileDatafields_MaximumValue() const
+                {
+                    return parent->State::getLocal< ::armarx::StringValueMap>("TactileDatafields_MaximumValue")->::armarx::StringValueMap::toStdMap< ::armarx::DatafieldRefPtr>();
+                }
+                void setTactileDatafields_MaximumValue(const std::map<std::string, ::armarx::DatafieldRefPtr> & value) const
+                {
+                    ::armarx::StringValueMapPtr container = ::armarx::StringValueMap::FromStdMap< ::armarx::DatafieldRefPtr>(value);
+                    parent->State::setLocal("TactileDatafields_MaximumValue", *container);
+                }
+                bool isTactileDatafields_MaximumValueSet() const
+                {
+                    return parent->State::isLocalParameterSet("TactileDatafields_MaximumValue");
+                }
+            }; // class WeissHapticSensorTestLocal
+            
+            class WeissHapticSensorTestOut
+            {
+            private:
+                WeissHapticSensorTestGeneratedBase<StateType> *parent;
+                
+            public:
+                WeissHapticSensorTestOut(WeissHapticSensorTestGeneratedBase<StateType> *parent)
+                    : parent(parent)
+                {
+                }
+            }; // class WeissHapticSensorTestOut
+            
+        protected:
+            const WeissHapticSensorTestIn in;
+            const WeissHapticSensorTestLocal local;
+            const WeissHapticSensorTestOut out;
+            
+        public:
+            WeissHapticSensorTestGeneratedBase(const XMLStateConstructorParams& stateData)
+                : XMLStateTemplate < StateType > (stateData),
+                  in(WeissHapticSensorTestIn(this)),
+                  local(WeissHapticSensorTestLocal(this)),
+                  out(WeissHapticSensorTestOut(this))
+            {
+            }
+            WeissHapticSensorTestGeneratedBase(const WeissHapticSensorTestGeneratedBase &source)
+                : IceUtil::Shared(source),
+                  armarx::StateIceBase(source),
+                  armarx::StateBase(source),
+                  armarx::StateController(source),
+                  armarx::State(source),
+                  XMLStateTemplate < StateType > (source),
+                  in(WeissHapticSensorTestIn(this)),
+                  local(WeissHapticSensorTestLocal(this)),
+                  out(WeissHapticSensorTestOut(this))
+            {
+            }
+            
+        public:
+            HapticUnitObserverInterfacePrx getHapticObserver() const
+            {
+                return StateBase::getContext<WeissHapticGroupStatechartContext>()->getHapticObserver();
+            }
+            WeissHapticUnitInterfacePrx getWeissHapticUnit() const
+            {
+                return StateBase::getContext<WeissHapticGroupStatechartContext>()->getWeissHapticUnit();
+            }
+            static std::string GetName()
+            {
+                return "WeissHapticSensorTest";
+            }
+            void __forceLibLoading()
+            {
+                // Do not call this method.
+                // The sole purpose of this method is to force the compiler/linker to include all libraries.
+                ::armarx::DatafieldRef type1;
+            }
+        }; // class WeissHapticSensorTestGeneratedBase
+    } // namespace WeissHapticGroup
+} // namespace armarx
+
+#endif // _ARMARX_XMLUSERCODE_ARMARX_WEISSHAPTICGROUP_WEISSHAPTICSENSORTESTGENERATEDBASE_H
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.h b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.h
new file mode 100644
index 000000000..34b84f989
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.h
@@ -0,0 +1,55 @@
+/*
+ * This file is part of ArmarX.
+ *
+ * ArmarX is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * ArmarX is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @package    RobotAPI::WeissHapticGroup
+ * @author     Simon Ottenhaus ( simon dot ottenhaus at kit dot edu )
+ * @date       2015
+ * @copyright  http://www.gnu.org/licenses/gpl.txt
+ *             GNU General Public License
+ */
+
+#ifndef _ARMARX_XMLUSERCODE_RobotAPI_WeissHapticGroup_WeissHapticSensorTest_H
+#define _ARMARX_XMLUSERCODE_RobotAPI_WeissHapticGroup_WeissHapticSensorTest_H
+
+#include "WeissHapticSensorTest.generated.h"
+
+namespace armarx
+{
+    namespace WeissHapticGroup
+    {
+        class WeissHapticSensorTest :
+            public WeissHapticSensorTestGeneratedBase<WeissHapticSensorTest>
+        {
+        public:
+            WeissHapticSensorTest(const XMLStateConstructorParams& stateData);
+
+            // inherited from StateBase
+            void onEnter();
+            void run();
+            void onBreak();
+            void onExit();
+
+            // static functions for AbstractFactory Method
+            static XMLStateFactoryBasePtr CreateInstance(XMLStateConstructorParams stateData);
+            static SubClassRegistry Registry;
+
+            // DO NOT INSERT ANY CLASS MEMBERS,
+            // use stateparameters instead,
+            // if classmember are neccessary nonetheless, reset them in onEnter
+        };
+    }
+}
+
+#endif
diff --git a/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.xml b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.xml
new file mode 100644
index 000000000..d44dc26ac
--- /dev/null
+++ b/source/RobotAPI/statecharts/WeissHapticGroup/WeissHapticSensorTest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<State version="1.0" name="WeissHapticSensorTest" uuid="B8841E3D-97C6-468F-86D9-6370D5F89BB4" width="800" height="600">
+	<InputParameters/>
+	<OutputParameters/>
+	<LocalParameters>
+		<Parameter name="TactileDatafields_MaximumValue" type="::armarx::StringValueMapBase(::armarx::DatafieldRefBase)" optional="no"/>
+	</LocalParameters>
+	<Substates/>
+	<Events/>
+	<Transitions/>
+</State>
+
-- 
GitLab