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