|
From: <tho...@us...> - 2012-03-04 18:48:39
|
Revision: 719
http://openautomation.svn.sourceforge.net/openautomation/?rev=719&view=rev
Author: thomas_s
Date: 2012-03-04 18:48:31 +0000 (Sun, 04 Mar 2012)
Log Message:
-----------
added DeterminatorManager class
moved Determinator-Items to subdirectories
refactored Determinator-Items (parsing and toString)
WIP
Modified Paths:
--------------
xPLHAL/branches/thomas_s_dev/src/CMakeLists.txt
xPLHAL/branches/thomas_s_dev/src/determinator.cpp
xPLHAL/branches/thomas_s_dev/src/determinator.h
xPLHAL/branches/thomas_s_dev/src/determinatoritems.cpp
xPLHAL/branches/thomas_s_dev/src/determinatoritems.h
xPLHAL/branches/thomas_s_dev/src/main.cpp
xPLHAL/branches/thomas_s_dev/src/xplmessage.h
xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.cpp
xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.h
xPLHAL/branches/thomas_s_dev/test/CMakeLists.txt
xPLHAL/branches/thomas_s_dev/test/determinator1.xml
xPLHAL/branches/thomas_s_dev/test/test_determinator.cpp
xPLHAL/branches/thomas_s_dev/test/test_devicemanager.cpp
Added Paths:
-----------
xPLHAL/branches/thomas_s_dev/src/actions/delayAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/delayAction.h
xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.h
xPLHAL/branches/thomas_s_dev/src/actions/executeAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/executeAction.h
xPLHAL/branches/thomas_s_dev/src/actions/globalAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/globalAction.h
xPLHAL/branches/thomas_s_dev/src/actions/logAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/logAction.h
xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.h
xPLHAL/branches/thomas_s_dev/src/actions/stopAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/stopAction.h
xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.h
xPLHAL/branches/thomas_s_dev/src/actions/xplAction.cpp
xPLHAL/branches/thomas_s_dev/src/actions/xplAction.h
xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h
xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.h
xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.h
xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h
xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.cpp
xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.h
xPLHAL/branches/thomas_s_dev/src/determinator_manager.cpp
xPLHAL/branches/thomas_s_dev/src/determinator_manager.h
xPLHAL/branches/thomas_s_dev/test/determinatorAll.xml
xPLHAL/branches/thomas_s_dev/test/test_determinator_manager.cpp
Modified: xPLHAL/branches/thomas_s_dev/src/CMakeLists.txt
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/CMakeLists.txt 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/CMakeLists.txt 2012-03-04 18:48:31 UTC (rev 719)
@@ -17,13 +17,19 @@
project(xPLHAL)
cmake_minimum_required(VERSION 2.6)
-set(CMAKE_CXX_FLAGS "-g -std=c++0x")
-#set(CMAKE_CXX_FLAGS "-g -Os -std=c++0x")
+file(GLOB_RECURSE Action_sources ./actions/*.cpp)
+file(GLOB_RECURSE Condition_sources ./conditions/*.cpp)
+
+#set(CMAKE_CXX_FLAGS "-g -std=c++0x")
+set(CMAKE_CXX_FLAGS "-g -Os -std=c++0x")
set(xPLHAL_SRCS xplmessagequeue.cpp devicemanager.cpp
xplhandler.cpp xplcache.cpp xhcpthread.cpp log.cpp
xhcp.cpp xplmessage.cpp recurring_timer.cpp main.cpp pugixml.cpp
- determinatoritems.cpp determinator.cpp)
+ determinatoritems.cpp determinator.cpp determinator_manager.cpp
+ ${Action_sources} ${Condition_sources})
+include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+
add_executable(xPLHAL ${xPLHAL_SRCS})
#message(STATUS "Boost_LIBRARIES=${Boost_LIBRARIES}")
#message(STATUS "LIBRARIES=${LIBS}")
Added: xPLHAL/branches/thomas_s_dev/src/actions/delayAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/delayAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/delayAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,17 @@
+#include "delayAction.h"
+
+using std::string;
+using std::vector;
+using std::map;
+
+delayAction::delayAction(const pugi::xml_node& basenode)
+{
+ attributes["delay_seconds"];
+ parseFromXml(basenode);
+}
+
+void delayAction::execute() const
+{
+ sleep(atoi(getAttribute("delaySeconds").c_str()));
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/delayAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/delayAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/delayAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,11 @@
+#pragma once
+#include "determinatoritems.h"
+
+class delayAction: public DeterminatorAction<delayAction>
+{
+ public:
+ delayAction() {}
+ delayAction(const pugi::xml_node& basenode);
+
+ void execute() const;
+};
Added: xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1 @@
+#include "execRuleAction.h"
Added: xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/execRuleAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,17 @@
+#pragma once
+#include "determinatoritems.h"
+
+class execRuleAction: public DeterminatorAction<execRuleAction>
+{
+ public:
+ execRuleAction() {}
+ execRuleAction(const pugi::xml_node& basenode) {
+ parseFromXml(basenode);
+ }
+ void execute() const;
+
+ void parseFromXml(const pugi::xml_node& basenode);
+ std::string toString() const;
+
+ std::string ruleName;
+};
Added: xPLHAL/branches/thomas_s_dev/src/actions/executeAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/executeAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/executeAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1 @@
+#include "executeAction.h"
Added: xPLHAL/branches/thomas_s_dev/src/actions/executeAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/executeAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/executeAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,19 @@
+#pragma once
+#include "determinatoritems.h"
+
+class executeAction: public DeterminatorAction<executeAction>
+{
+ public:
+ executeAction() {}
+ executeAction(const pugi::xml_node& basenode) {
+ parseFromXml(basenode);
+ }
+ void execute() const;
+
+ void parseFromXml(const pugi::xml_node& basenode);
+ std::string toString() const;
+
+ std::string program;
+ std::string parameters;
+ std::string wait;
+};
Added: xPLHAL/branches/thomas_s_dev/src/actions/globalAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/globalAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/globalAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,18 @@
+#include "globalAction.h"
+#include <iostream>
+
+using std::string;
+using std::cerr;
+
+globalAction::globalAction(const pugi::xml_node& basenode)
+{
+ attributes["name"];
+ attributes["value"];
+ parseFromXml(basenode);
+}
+
+void globalAction::execute() const
+{
+ std::cerr << "globalAction set " << getAttribute("name") << " to " << getAttribute("value") << "\n";
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/globalAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/globalAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/globalAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,12 @@
+#pragma once
+#include "determinatoritems.h"
+
+class globalAction: public DeterminatorAction<globalAction>
+{
+ public:
+ globalAction() {}
+ globalAction(const pugi::xml_node& basenode);
+
+ void execute() const;
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/logAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/logAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/logAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,17 @@
+#include "logAction.h"
+#include "log.h"
+
+using std::string;
+
+logAction::logAction(const pugi::xml_node& basenode)
+: DeterminatorAction(basenode)
+{
+ attributes["logText"];
+ parseFromXml(basenode);
+}
+
+void logAction::execute() const
+{
+ writeLog(getAttribute("logText"), logLevel::debug);
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/logAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/logAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/logAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,12 @@
+#pragma once
+#include "determinatoritems.h"
+
+class logAction: public DeterminatorAction<logAction>
+{
+ public:
+ logAction() {}
+ logAction(const pugi::xml_node& basenode);
+
+ void execute() const;
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,6 @@
+#include "runScriptAction.h"
+
+using std::string;
+using std::vector;
+using std::map;
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/runScriptAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,19 @@
+#pragma once
+#include "determinatoritems.h"
+
+class runScriptAction: public DeterminatorAction<runScriptAction>
+{
+ public:
+ runScriptAction() {}
+ runScriptAction(const pugi::xml_node& basenode) {
+ parseFromXml(basenode);
+ }
+ void execute() const;
+
+ void parseFromXml(const pugi::xml_node& basenode);
+ std::string toString() const;
+
+ std::string scriptName;
+ std::string parameter;
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/stopAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/stopAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/stopAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,15 @@
+#include "stopAction.h"
+
+using std::string;
+
+stopAction::stopAction(const pugi::xml_node& basenode)
+: DeterminatorAction(basenode)
+{
+ parseFromXml(basenode);
+}
+
+void stopAction::execute() const
+{
+ throw AbortDeterminatorExecutionException();
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/stopAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/stopAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/stopAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,11 @@
+#pragma once
+#include "determinatoritems.h"
+
+class stopAction: public DeterminatorAction<stopAction>
+{
+ public:
+ stopAction() {}
+ stopAction(const pugi::xml_node& basenode);
+ void execute() const;
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,4 @@
+#include "suspendAction.h"
+
+using std::string;
+
Added: xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/suspendAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,19 @@
+#pragma once
+#include "determinatoritems.h"
+
+class suspendAction: public DeterminatorAction<suspendAction>
+{
+ public:
+ suspendAction() {}
+ suspendAction(const pugi::xml_node& basenode) {
+ parseFromXml(basenode);
+ }
+ void execute() const;
+
+ void parseFromXml(const pugi::xml_node& basenode);
+ std::string toString() const;
+
+ std::string suspendMinutes;
+ std::string suspendTime;
+ std::string suspendRandomise;
+};
Added: xPLHAL/branches/thomas_s_dev/src/actions/xplAction.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/xplAction.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/xplAction.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,37 @@
+#include "xplAction.h"
+
+using std::string;
+using std::shared_ptr;
+using boost::regex;
+
+xplAction::xplAction(const pugi::xml_node& basenode)
+: DeterminatorAction(basenode)
+{
+ attributes["msg_type"] = {shared_ptr<regex>(new regex(R"(^(stat|trig|cmnd)$)"))};
+ attributes["msg_target"] = {shared_ptr<regex>(new regex(R"(^(\*|.*-.*\..*)$)"))};
+ attributes["msg_schema"] = {shared_ptr<regex>(new regex(R"(^(.*\..*)$)"))};
+ parseFromXml(basenode);
+}
+
+void xplAction::parseFromXml(const pugi::xml_node& basenode)
+{
+ DeterminatorAction::parseFromXml(basenode);
+ for(const auto node : basenode) {
+ if (node.name() == string("xplActionParam")) {
+ actionParams.push_back(node.attribute("expression").value());
+ }
+ }
+}
+
+std::string xplAction::toString() const
+{
+ string ret = BaseDeterminatorItem::toString();
+ for (auto ap : actionParams) {
+ ret += "\nxplActionParam: " + ap;
+ }
+ return ret;
+}
+
+void xplAction::execute() const
+{
+}
Added: xPLHAL/branches/thomas_s_dev/src/actions/xplAction.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/actions/xplAction.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/actions/xplAction.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,16 @@
+#pragma once
+#include "determinatoritems.h"
+
+class xplAction: public DeterminatorAction<xplAction>
+{
+ public:
+ xplAction() {}
+ xplAction(const pugi::xml_node& basenode);
+
+ void execute() const;
+ void parseFromXml(const pugi::xml_node& basenode);
+ std::string toString() const;
+
+ std::list<std::string> actionParams;
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,10 @@
+#include "dayCondition.h"
+
+using std::string;
+
+dayCondition::dayCondition(const pugi::xml_node& basenode)
+{
+ attributes["dow"];
+ parseFromXml(basenode);
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/dayCondition.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,10 @@
+#pragma once
+#include "determinatoritems.h"
+
+class dayCondition: public DeterminatorCondition<dayCondition>
+{
+ public:
+ dayCondition() {}
+ dayCondition(const pugi::xml_node& basenode);
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,10 @@
+#include "globalChanged.h"
+
+using std::string;
+
+globalChanged::globalChanged(const pugi::xml_node& basenode)
+{
+ attributes["name"];
+ parseFromXml(basenode);
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/globalChanged.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,11 @@
+#pragma once
+#include "determinatoritems.h"
+
+class globalChanged: public DeterminatorCondition<globalChanged>
+{
+ public:
+ /* connect to signal of changed global variable */
+ globalChanged() {}
+ globalChanged(const pugi::xml_node& basenode);
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,13 @@
+#include "globalCondition.h"
+
+using std::string;
+using std::shared_ptr;
+using boost::regex;
+
+globalCondition::globalCondition(const pugi::xml_node& basenode)
+{
+ attributes["name"];
+ attributes["operator"] = {shared_ptr<regex>(new regex(R"(^(=|!=|<|>|<=|>=)$)"))};
+ attributes["value"];
+ parseFromXml(basenode);
+}
Added: xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/globalCondition.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,10 @@
+#pragma once
+#include "determinatoritems.h"
+
+class globalCondition: public DeterminatorCondition<globalCondition>
+{
+ public:
+ globalCondition() {}
+ globalCondition(const pugi::xml_node& basenode);
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,22 @@
+#include "timeCondition.h"
+#include <boost/regex.hpp>
+#include <memory>
+#include <map>
+
+using std::string;
+using std::shared_ptr;
+using std::map;
+using boost::regex;
+using boost::regex_match;
+
+timeCondition::timeCondition(const pugi::xml_node& basenode)
+{
+ attributes["operator"] = {shared_ptr<regex>(new regex(R"(^(=|!=|<|>|<=|>=)$)"))};
+ attributes["value"] = {shared_ptr<regex>(new regex(R"(^\d{1,2}:\d{1,2}$)"))};
+
+ parseFromXml(basenode);
+}
+
+bool timeCondition::match() const
+{
+}
Added: xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/timeCondition.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,12 @@
+#pragma once
+#include "determinatoritems.h"
+
+class timeCondition: public DeterminatorCondition<timeCondition>
+{
+ public:
+ timeCondition() {}
+ timeCondition(const pugi::xml_node& basenode);
+
+ virtual bool match() const;
+};
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,43 @@
+#include "xplCondition.h"
+#include <iostream>
+
+using std::string;
+using std::cerr;
+
+xplCondition::xplCondition(const pugi::xml_node& basenode)
+{
+ attributes["msg_type"];
+ attributes["source_vendor"];
+ attributes["source_device"];
+ attributes["source_instance"];
+ attributes["target_vendor"];
+ attributes["target_device"];
+ attributes["target_instance"];
+ attributes["schema_class"];
+ attributes["schema_type"];
+ parseFromXml(basenode);
+}
+
+void xplCondition::parseFromXml(const pugi::xml_node& basenode)
+{
+ BaseDeterminatorItem::parseFromXml(basenode);
+ for(const auto node : basenode) {
+ if (node.name() == string("param")) {
+ struct parameter p;
+ p.name = node.attribute("name").value();
+ p.op = node.attribute("operator").value();
+ p.value = node.attribute("value").value();
+ parameter.push_back(p);
+ }
+ }
+}
+
+string xplCondition::toString() const
+{
+ string ret = BaseDeterminatorItem::toString();
+ for (auto p : parameter) {
+ ret +="\nparameter: " + p.name + p.op + p.value;
+ }
+ return ret;
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/conditions/xplCondition.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,22 @@
+#pragma once
+#include "determinatoritems.h"
+
+class xplCondition: public DeterminatorCondition<xplCondition>
+{
+ public:
+ xplCondition() {}
+ xplCondition(const pugi::xml_node& basenode);
+
+ void parseFromXml(const pugi::xml_node& basenode);
+ std::string toString() const;
+ /* connect to signal of new xpl-message */
+
+ struct parameter {
+ std::string name;
+ std::string op;
+ std::string value;
+ };
+
+ std::vector<struct parameter> parameter;
+};
+
Modified: xPLHAL/branches/thomas_s_dev/src/determinator.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinator.cpp 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/determinator.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -4,6 +4,19 @@
#include <typeinfo>
#include <memory>
#include <functional>
+#include <algorithm>
+#include <thread>
+#include <future>
+#include "conditions/xplCondition.h"
+#include "conditions/globalCondition.h"
+#include "conditions/globalChanged.h"
+#include "conditions/dayCondition.h"
+#include "conditions/timeCondition.h"
+#include "actions/logAction.h"
+#include "actions/xplAction.h"
+#include "actions/delayAction.h"
+#include "actions/globalAction.h"
+#include "actions/stopAction.h"
using std::string;
using std::vector;
@@ -35,17 +48,20 @@
DeterminatorXmlParser::DeterminatorXmlParser(const string& filename)
{
- registerCondition(BaseDeterminatorItemConstPtr(new XplCondition));
- registerCondition(BaseDeterminatorItemConstPtr(new GlobalCondition));
- registerCondition(BaseDeterminatorItemConstPtr(new GlobalChanged));
- registerCondition(BaseDeterminatorItemConstPtr(new DayCondition));
- registerCondition(BaseDeterminatorItemConstPtr(new TimeCondition));
+ registerCondition(BaseDeterminatorItemConstPtr(new xplCondition));
+ registerCondition(BaseDeterminatorItemConstPtr(new globalCondition));
+ registerCondition(BaseDeterminatorItemConstPtr(new globalChanged));
+ registerCondition(BaseDeterminatorItemConstPtr(new dayCondition));
+ registerCondition(BaseDeterminatorItemConstPtr(new timeCondition));
registerAction(BaseDeterminatorItemConstPtr(new logAction));
registerAction(BaseDeterminatorItemConstPtr(new xplAction));
+ registerAction(BaseDeterminatorItemConstPtr(new delayAction));
+ registerAction(BaseDeterminatorItemConstPtr(new globalAction));
+ registerAction(BaseDeterminatorItemConstPtr(new stopAction));
pugi::xml_parse_result result = m_doc.load_file(filename.c_str());
- cerr << "Load result: " << result.description() << "\n";
+// cerr << "Load result: " << result.description() << "\n";
}
void DeterminatorXmlParser::registerCondition(BaseDeterminatorItemConstPtr condition)
@@ -95,7 +111,7 @@
}
}
- d.printDeterminator();
+ //d.printDeterminator();
return d;
}
@@ -125,8 +141,8 @@
Determinator::~Determinator()
{
- if (mExecuteThread) {
- mExecuteThread->join();
+ if (!mExecFutures.empty()) {
+ mExecFutures[0].wait();
}
}
@@ -142,35 +158,42 @@
return (input_match_type == match_type::ALL);
}
-void Determinator::executeOutputs() const
+bool Determinator::executeOutputs() const
{
std::multimap<string, BaseDeterminatorItemPtr> orderd_outputs;
for (auto output : outputs) {
string execOrder;
auto execOrderIter = output.second->attributes.find("executeOrder");
if (execOrderIter != output.second->attributes.end()) {
- execOrder = execOrderIter->second;
+ execOrder = execOrderIter->second.value;
}
orderd_outputs.insert({execOrder, output.second});
}
- for (auto output : orderd_outputs) {
- cerr << "execute output:" << output.second->display_name << endl;
- output.second->execute();
+ try {
+ for (auto output : orderd_outputs) {
+ cerr << "execute output:" << output.second->getAttribute("display_name") << endl;
+ output.second->execute();
+ }
+ } catch (const AbortDeterminatorExecutionException &e) {
+ return false;
}
+ return true;
}
+
/**
* Check if input conditions are met, then start a thread to execute actions
*/
void Determinator::execute()
{
if (checkInputs()) {
- if (mExecuteThread) {
- mExecuteThread->join();
+ if (mExecFutures.empty() || mExecFutures[0].valid()) {
+ mExecFutures.erase(mExecFutures.begin(), mExecFutures.end());
+ cerr << "determinator start thread" << endl;
+ mExecFutures.push_back(std::async(std::launch::async, std::bind(&Determinator::executeOutputs, this)));
+ cerr << "determinator start thread" << endl;
}
- cerr << "determinator start thread" << endl;
- mExecuteThread.reset(new thread(bind(&Determinator::executeOutputs, this)));
}
}
Modified: xPLHAL/branches/thomas_s_dev/src/determinator.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinator.h 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/determinator.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -5,6 +5,7 @@
#include <vector>
#include <map>
#include <thread>
+#include <future>
class Determinator
{
@@ -29,11 +30,14 @@
private:
bool checkInputs() const;
- void executeOutputs() const;
-
- std::unique_ptr<std::thread> mExecuteThread;
+ bool executeOutputs() const;
+
+ std::vector<std::future<bool>> mExecFutures;
};
+typedef std::shared_ptr<Determinator> DeterminatorPtr;
+typedef std::shared_ptr<const Determinator> DeterminatorConstPtr;
+
class DeterminatorXmlParser
{
public:
Added: xPLHAL/branches/thomas_s_dev/src/determinator_manager.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinator_manager.cpp (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/determinator_manager.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,58 @@
+#include "determinator_manager.h"
+#include "determinator.h"
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <iostream>
+
+using std::cout;
+using boost::filesystem::path;
+using boost::filesystem::exists;
+using boost::filesystem::filesystem_error;
+using boost::filesystem::is_regular_file;
+using boost::filesystem::is_directory;
+using boost::filesystem::directory_iterator;
+using boost::filesystem::ifstream;
+
+DeterminatorManager::DeterminatorManager(const std::string& determinatorDirectory)
+:mDeterminatorDirectory(determinatorDirectory)
+{
+}
+
+void DeterminatorManager::loadDeterminators()
+{
+ path p(mDeterminatorDirectory);
+ try {
+ if (exists(p)) {
+ if (is_regular_file(p)) {
+ cout << p << " is regular file\n";
+ }
+ else if (is_directory(p)) {
+ cout << p << " directory containing:\n";
+
+ for (auto item = directory_iterator(p); item != directory_iterator(); ++item) {
+ ifstream determinatorFile(*item);
+ std::string filename = item->string();
+ //storeXmlDeterminator("guid", determinatorFile.read());
+ cout << "diritem: " << *item << "\n";
+ DeterminatorXmlParser parser(filename);
+ Determinator d = parser.parse();
+ }
+ }
+ else {
+ cout << p << " exists, but is neither a regular file nor a directory\n";
+ }
+ }
+ }
+ catch (const filesystem_error& ex) {
+
+ }
+}
+
+std::string DeterminatorManager::getXmlDeterminator(const std::string& guid) const
+{
+}
+
+void DeterminatorManager::storeXmlDeterminator(const std::string& guid, const std::string& xmlDeterminator)
+{
+}
+
Added: xPLHAL/branches/thomas_s_dev/src/determinator_manager.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinator_manager.h (rev 0)
+++ xPLHAL/branches/thomas_s_dev/src/determinator_manager.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,26 @@
+#pragma once
+#include "determinator.h"
+#include <string>
+#include <map>
+#include <boost/signals2/signal.hpp>
+#include "xplhandler.h"
+
+class DeterminatorManager
+{
+ public:
+ DeterminatorManager(const std::string& determinatorDirectory);
+
+ void loadDeterminators();
+
+// DeterminatorConstPtr getDeterminator(const std::string& guid) const;
+ std::string getXmlDeterminator(const std::string& guid) const;
+ void storeXmlDeterminator(const std::string& guid, const std::string& xmlDeterminator);
+
+ public:
+ xPLHandler::signal_t m_sigRceivedXplMessage;
+
+ private:
+ std::string mDeterminatorDirectory;
+ std::map<std::string, DeterminatorPtr> mDeterminators;
+
+};
Modified: xPLHAL/branches/thomas_s_dev/src/determinatoritems.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinatoritems.cpp 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/determinatoritems.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -8,6 +8,7 @@
using std::string;
using std::vector;
using std::map;
+using std::cerr;
DeterminatorParseException::DeterminatorParseException(const string& text)
:m_text(text)
@@ -19,286 +20,66 @@
return m_text.c_str();
}
-
-class ScopedXmlAttributeGetter
-{
- public:
- ScopedXmlAttributeGetter(const pugi::xml_node& basenode, map<string, string> &attributemap)
- :m_basenode(basenode),m_attributemap(attributemap) {}
- string get(const string& attribute_name) const {
- pugi::xml_attribute xml_attribute = m_basenode.attribute(attribute_name.c_str());
- if (!xml_attribute) {
- string error_text = string("In node '") + m_basenode.name() + "'";
- error_text += " attribute '" + attribute_name + "' was not found";
- throw DeterminatorParseException(error_text);
- }
- m_attributemap.insert({attribute_name, xml_attribute.value()});
- return xml_attribute.value();
- }
- private:
- const pugi::xml_node& m_basenode;
- map<string, string> &m_attributemap;
-};
-
BaseDeterminatorItem::BaseDeterminatorItem(const string& name)
:item_name(name)
{
+ attributes["display_name"] = {};
}
BaseDeterminatorItem::BaseDeterminatorItem(const pugi::xml_node& basenode, const string& name)
:item_name(name)
{
- ScopedXmlAttributeGetter a(basenode, attributes);
- display_name = a.get("display_name");
+ attributes["display_name"] = {};
}
-bool BaseDeterminatorItem::match() const
+void BaseDeterminatorItem::parseFromXml(const pugi::xml_node& basenode)
{
- return true;
-}
+ for (auto &ai: attributes) {
+ const string attribute_name = ai.first;
+ pugi::xml_attribute xml_attribute = basenode.attribute(attribute_name.c_str());
-void BaseDeterminatorItem::execute() const
-{
-}
+ if (!xml_attribute) {
+ string error_text = string("In node '") + basenode.name() + "'";
+ error_text += " attribute '" + attribute_name + "' was not found";
+ throw DeterminatorParseException(error_text);
+ }
-/*
- * Determinator Conditions
- */
-
-XplCondition::XplCondition()
-:BaseDeterminatorItem("xplCondition")
-{
-}
-
-XplCondition::XplCondition(const pugi::xml_node& basenode)
-:BaseDeterminatorItem(basenode, "xplCondition")
-{
- parseFromXml(basenode);
-}
+ ai.second.value = xml_attribute.value();
-BaseDeterminatorItemPtr XplCondition::createNew(const pugi::xml_node& basenode) const
-{
- return BaseDeterminatorItemPtr(new XplCondition(basenode));
-}
-
-void XplCondition::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- msg_type = helper.get("msg_type");
- source_vendor = helper.get("source_vendor");
- source_device = helper.get("source_device");
- source_instance = helper.get("source_instance");
- target_vendor = helper.get("target_vendor");
- target_device = helper.get("target_device");
- target_instance = helper.get("target_instance");
- schema_class = helper.get("schema_class");
- schema_type = helper.get("schema_type");
-
- for(const auto node : basenode) {
- if (node.name() == string("param")) {
- struct parameter p;
- ScopedXmlAttributeGetter pa(node, attributes);
- p.name = pa.get("name");
- p.op = pa.get("operator");
- p.value = pa.get("value");
- parameter.push_back(p);
+ if (ai.second.re.get() != nullptr) {
+ if (! regex_match(ai.second.value, *ai.second.re)) {
+ string error_text = string("In node '") + basenode.name() + "'";
+ error_text += " invalid value for attribute '" + ai.first + "' value: '" + ai.second.value + "'.";
+ throw DeterminatorParseException(error_text);
+ }
}
}
}
-string XplCondition::toString() const
+bool BaseDeterminatorItem::match() const
{
- string ret = "xplCondition:";
- ret += "\nmsg_type: " + msg_type;
- ret += "\nsource_vendor: " + source_vendor;
- ret += "\nsource_device: " + source_device;
- ret += "\nsource_instance: " + source_instance;
- ret += "\ntarget_vendor: " + target_vendor;
- ret += "\ntarget_device: " + target_device;
- ret += "\ntarget_instance: " + target_instance;
- ret += "\nschema_class: " + schema_class;
- ret += "\nschema_type: " + schema_type;
- for (auto p : parameter) {
- ret +="\nparameter: " + p.name + p.op + p.value;
- }
- return ret;
+ return true;
}
-
-GlobalCondition::GlobalCondition()
-:BaseDeterminatorItem("globalCondition")
-{
-}
-GlobalCondition::GlobalCondition(const pugi::xml_node& basenode)
-:BaseDeterminatorItem(basenode, "globalCondition")
+void BaseDeterminatorItem::execute() const
{
- parseFromXml(basenode);
}
-BaseDeterminatorItemPtr GlobalCondition::createNew(const pugi::xml_node& basenode) const
+std::string BaseDeterminatorItem::getAttribute(const std::string& attrname) const
{
- return BaseDeterminatorItemPtr(new GlobalCondition(basenode));
-}
-
-void GlobalCondition::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- name = helper.get("name");
- op = helper.get("operator");
- value = helper.get("value");
-}
-
-string GlobalCondition::toString() const
-{
- string ret = item_name + ":";
- ret += "\nname: " + name;
- ret += "\noperator: " + op;
- ret += "\nvalue: " + value;
- return ret;
-}
-
-GlobalChanged::GlobalChanged()
-:BaseDeterminatorItem("globalChanged")
-{
-}
-
-GlobalChanged::GlobalChanged(const pugi::xml_node& basenode)
-:BaseDeterminatorItem(basenode, "globalChanged")
-{
- parseFromXml(basenode);
-}
-
-BaseDeterminatorItemPtr GlobalChanged::createNew(const pugi::xml_node& basenode) const
-{
- return BaseDeterminatorItemPtr(new GlobalChanged(basenode));
-}
-
-void GlobalChanged::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- name = helper.get("name");
-}
-
-string GlobalChanged::toString() const
-{
- string ret = item_name + ":";
- ret += "\nname: " + name;
- return ret;
-}
-
-
-DayCondition::DayCondition()
-:BaseDeterminatorItem("dayCondition")
-{
-}
-
-DayCondition::DayCondition(const pugi::xml_node& basenode)
-:BaseDeterminatorItem(basenode, "dayCondition")
-{
- parseFromXml(basenode);
-}
-
-BaseDeterminatorItemPtr DayCondition::createNew(const pugi::xml_node& basenode) const
-{
- return BaseDeterminatorItemPtr(new DayCondition(basenode));
-}
-
-void DayCondition::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- dow = helper.get("dow");
-}
-
-string DayCondition::toString() const
-{
- string ret = item_name + ":";
- ret += "\ndow: " + dow;
- return ret;
-}
-
-TimeCondition::TimeCondition()
-:BaseDeterminatorItem("timeCondition")
-{
-}
-
-TimeCondition::TimeCondition(const pugi::xml_node& basenode)
- :BaseDeterminatorItem(basenode, "timeCondition")
-{
- parseFromXml(basenode);
-}
-
-BaseDeterminatorItemPtr TimeCondition::createNew(const pugi::xml_node& basenode) const
-{
- return BaseDeterminatorItemPtr(new TimeCondition(basenode));
-}
-
-void TimeCondition::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- op = helper.get("operator");
- value = helper.get("value");
-}
-
-string TimeCondition::toString() const
-{
- string ret = item_name + ":";
- ret += "\noperator: " + op;
- ret += "\nvalue...: " + value;
- return ret;
-}
-
-/*
- * Determinator Actions
- */
-
-void logAction::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- logText = helper.get("logText");
- executeOrder = helper.get("executeOrder");
-}
-
-std::string logAction::toString() const
-{
- string ret = item_name + ":";
- ret += "\nlogText.....: " + logText;
- ret += "\nexecuteOrder: " + executeOrder;
- return ret;
-}
-
-void logAction::execute() const
-{
- writeLog(logText, logLevel::debug);
-}
-
-//-----
-
-void xplAction::parseFromXml(const pugi::xml_node& basenode)
-{
- ScopedXmlAttributeGetter helper(basenode, attributes);
- executeOrder = helper.get("executeOrder");
- msgType = helper.get("msgType");
- msgTarget = helper.get("msgTarget");
- msgSchema = helper.get("msgSchema");
-
- for(const auto node : basenode) {
- if (node.name() == string("xplActionParam")) {
- string expression = node.attribute("expression").value();
- }
+ auto iter = attributes.find(attrname);
+ if (iter == attributes.end()) {
+ return "";
}
+ return iter->second.value;
}
-std::string xplAction::toString() const
+string BaseDeterminatorItem::toString() const
{
string ret = item_name + ":";
- ret += "\nexecuteOrder: " + executeOrder;
- ret += "\nmsgType.....: " + msgType;
- ret += "\nmsgTarget...: " + msgTarget;
- ret += "\nmsgSchema...: " + msgSchema;
+ for (auto iter : attributes) {
+ ret += "\n" + iter.first + ": " + iter.second.value;
+ }
return ret;
}
-void xplAction::execute() const
-{
-}
-
Modified: xPLHAL/branches/thomas_s_dev/src/determinatoritems.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/determinatoritems.h 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/determinatoritems.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -4,6 +4,8 @@
#include <vector>
#include <memory>
#include <map>
+#include <cxxabi.h>
+#include <boost/regex.hpp>
class DeterminatorParseException: public std::exception
{
@@ -14,6 +16,8 @@
private:
std::string m_text;
};
+
+class AbortDeterminatorExecutionException: public std::exception {};
class BaseDeterminatorItem;
typedef std::shared_ptr<BaseDeterminatorItem> BaseDeterminatorItemPtr;
@@ -24,18 +28,27 @@
public:
BaseDeterminatorItem(const std::string& name);
BaseDeterminatorItem(const pugi::xml_node& basenode, const std::string& name);
-
- virtual void parseFromXml(const pugi::xml_node& basenode) = 0;
+
virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const = 0;
- virtual std::string toString() const = 0;
+
+ virtual std::string toString() const;
+ virtual void parseFromXml(const pugi::xml_node& basenode);
virtual bool match() const;
virtual void execute() const;
+ struct di_attribute {
+ std::shared_ptr<boost::regex> re;
+ std::string value;
+ };
+
std::string item_name;
- std::string display_name;
- std::map<std::string, std::string> attributes;
+ std::string getAttribute(const std::string& attrname) const;
+ std::map<std::string, struct di_attribute> attributes;
+
+
+
//boost::signal2::signal<void ()> sigChanged;
};
@@ -43,237 +56,26 @@
class DeterminatorAction: public BaseDeterminatorItem
{
public:
- DeterminatorAction() :BaseDeterminatorItem(typeid(T).name()) { }
+ DeterminatorAction() :BaseDeterminatorItem(abi::__cxa_demangle(typeid(T).name(), 0, 0, 0)) { }
DeterminatorAction(const pugi::xml_node& basenode)
- :BaseDeterminatorItem(basenode, std::string(typeid(T).name())) {
- executeOrder = basenode.attribute("executeOrder").value();
- attributes["executeOrder"] = executeOrder;
+ :BaseDeterminatorItem(basenode, std::string(abi::__cxa_demangle(typeid(T).name(), 0, 0, 0))) {
+ attributes["executeOrder"];
}
BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const {
return BaseDeterminatorItemPtr(new T(basenode));
}
-
- std::string executeOrder;
};
-
-/*
- * Conditions
- */
-
-class XplCondition: public BaseDeterminatorItem
+template<typename T>
+class DeterminatorCondition: public BaseDeterminatorItem
{
public:
- XplCondition();
- XplCondition(const pugi::xml_node& basenode);
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
+ DeterminatorCondition() :BaseDeterminatorItem(abi::__cxa_demangle(typeid(T).name(), 0, 0, 0)) { }
+ DeterminatorCondition(const pugi::xml_node& basenode)
+ :BaseDeterminatorItem(basenode, std::string(abi::__cxa_demangle(typeid(T).name(), 0, 0, 0))) { }
- void parseFromXml(const pugi::xml_node& basenode);
-
- std::string toString() const;
-
- /* connect to signal of new xpl-message */
- std::string msg_type;
- std::string source_vendor;
- std::string source_device;
- std::string source_instance;
- std::string target_vendor;
- std::string target_device;
- std::string target_instance;
- std::string schema_class;
- std::string schema_type;
-
- struct parameter {
- std::string name;
- std::string op;
- std::string value;
- };
-
- std::vector<struct parameter> parameter;
-};
-
-class GlobalCondition: public BaseDeterminatorItem
-{
- public:
- GlobalCondition();
- GlobalCondition(const pugi::xml_node& basenode);
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
-
- void parseFromXml(const pugi::xml_node& basenode);
-
- std::string toString() const;
-
- std::string name;
- std::string op;
- std::string value;
-};
-
-class GlobalChanged: public BaseDeterminatorItem
-{
- public:
- /* connect to signal of changed global variable */
- GlobalChanged();
- GlobalChanged(const pugi::xml_node& basenode);
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string name;
-};
-
-class DayCondition: public BaseDeterminatorItem
-{
- public:
- DayCondition();
- DayCondition(const pugi::xml_node& basenode);
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string dow;
-};
-
-class TimeCondition: public BaseDeterminatorItem
-{
- public:
- TimeCondition();
- TimeCondition(const pugi::xml_node& basenode);
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string op;
- std::string value;
-};
-
-/*
- * Actions
- */
-
-class logAction: public DeterminatorAction<logAction>
-{
- public:
- logAction() {}
- logAction(const pugi::xml_node& basenode) : DeterminatorAction(basenode) {
- parseFromXml(basenode);
+ BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const {
+ return BaseDeterminatorItemPtr(new T(basenode));
}
-
- void execute() const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string logText;
- std::string executeOrder;
};
-
-class xplAction: public DeterminatorAction<xplAction>
-{
- public:
- xplAction() {}
- xplAction(const pugi::xml_node& basenode) : DeterminatorAction(basenode) {
- parseFromXml(basenode);
- }
-
- void execute() const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string msgType;
- std::string msgTarget;
- std::string msgSchema;
- std::multimap<std::string, std::string> actionParams;
-};
-
-class globalAction: public DeterminatorAction<globalAction>
-{
- public:
- globalAction();
- globalAction(const pugi::xml_node& basenode);
- void execute() const;
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string name;
- std::string value;
-};
-
-class delayAction: public DeterminatorAction<delayAction>
-{
- public:
- delayAction();
- delayAction(const pugi::xml_node& basenode);
- void execute() const;
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string delaySeconds;
-};
-
-class stopAction: public DeterminatorAction<stopAction>
-{
- public:
- stopAction();
- stopAction(const pugi::xml_node& basenode);
- void execute() const;
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
-};
-
-class suspendAction: public DeterminatorAction<suspendAction>
-{
- public:
- suspendAction();
- suspendAction(const pugi::xml_node& basenode);
- void execute() const;
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string suspendMinutes;
- std::string suspendTime;
- std::string suspendRandomise;
-};
-
-class execRuleAction: public DeterminatorAction<execRuleAction>
-{
- public:
- execRuleAction();
- execRuleAction(const pugi::xml_node& basenode);
- void execute() const;
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string ruleName;
-};
-
-class runScriptAction: public DeterminatorAction<runScriptAction>
-{
- public:
- runScriptAction();
- runScriptAction(const pugi::xml_node& basenode);
- void execute() const;
-
- virtual BaseDeterminatorItemPtr createNew(const pugi::xml_node& basenode) const;
- void parseFromXml(const pugi::xml_node& basenode);
- std::string toString() const;
-
- std::string scriptName;
- std::string parameter;
-};
-
Modified: xPLHAL/branches/thomas_s_dev/src/main.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/main.cpp 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/main.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -19,6 +19,7 @@
#include <boost/program_options.hpp>
#include "log.h"
#include "devicemanager.h"
+#include "determinator_manager.h"
#include "xhcp.h"
#include "recurring_timer.h"
#include "xplhandler.h"
@@ -55,11 +56,14 @@
,mDeviceManager(mXplCache)
,mXHCPServer(new XHCPServer(m_ioservice, &mDeviceManager))
,mXpl(new xPLHandler(m_ioservice, boost::asio::ip::host_name() ))
+ ,mDeterminatorManager("data")
,mTimerListAllObjects(m_ioservice, boost::posix_time::seconds(60), true)
,mTimerFlushExpiredEntries(m_ioservice, boost::posix_time::minutes(5), true)
+
{
mDeviceManager.m_sigSendXplMessage.connect(boost::bind(&xPLHandler::sendMessage, mXpl, _1));
mXpl->m_sigRceivedXplMessage.connect(boost::bind(&DeviceManager::processXplMessage, &mDeviceManager, _1));
+ mXpl->m_sigRceivedXplMessage.connect(mDeterminatorManager.m_sigRceivedXplMessage);
installTimer();
/* set global variables */
@@ -123,6 +127,7 @@
DeviceManager mDeviceManager;
XHCPServer *mXHCPServer;
xPLHandler *mXpl;
+ DeterminatorManager mDeterminatorManager;
RecurringTimer mTimerListAllObjects;
RecurringTimer mTimerFlushExpiredEntries;
Modified: xPLHAL/branches/thomas_s_dev/src/xplmessage.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/xplmessage.h 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/xplmessage.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -19,7 +19,7 @@
#include <vector>
#include <string>
-#include <boost/shared_ptr.hpp>
+#include <memory>
extern "C" {
#define COMMON_TYPES
@@ -102,6 +102,6 @@
operator std::string() const;
bool operator==(const xPLMessage& right) const;
};
-typedef boost::shared_ptr<xPLMessage> xPLMessagePtr;
+typedef std::shared_ptr<xPLMessage> xPLMessagePtr;
std::ostream& operator<<(std::ostream& os, const xPLMessage& msg);
Modified: xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.cpp
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.cpp 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.cpp 2012-03-04 18:48:31 UTC (rev 719)
@@ -25,7 +25,6 @@
using std::lock_guard;
XplMessageQueue::XplMessageQueue()
-:mPipeFD({0})
{
pipe(mPipeFD);
}
Modified: xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.h
===================================================================
--- xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.h 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/src/xplmessagequeue.h 2012-03-04 18:48:31 UTC (rev 719)
@@ -21,6 +21,8 @@
#include <queue>
#include <string>
#include <thread>
+#include <mutex>
+#include <memory>
#include "xplmessage.h"
@@ -48,6 +50,6 @@
/** \brief variable to ensure that the queue is thread save... */
mutable std::mutex queueLock;
std::queue<xPLMessagePtr> xPLMessages;
- int mPipeFD[2];
+ int mPipeFD[2];// = {0};
};
Modified: xPLHAL/branches/thomas_s_dev/test/CMakeLists.txt
===================================================================
--- xPLHAL/branches/thomas_s_dev/test/CMakeLists.txt 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/test/CMakeLists.txt 2012-03-04 18:48:31 UTC (rev 719)
@@ -21,10 +21,13 @@
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
file(GLOB_RECURSE UnitTests_sources *.cpp)
+file(GLOB_RECURSE Action_sources ../src/actions/*.cpp)
+file(GLOB_RECURSE Condition_sources ../src/conditions/*.cpp)
#set(UnitTest_tsrc ../src/devicemanager.cpp ../src/xplcache.cpp ../src/xplhandler.cpp ../src/xplmessagequeue.cpp)
set(UnitTest_tsrc ../src/devicemanager.cpp ../src/xplmessage.cpp ../src/determinator.cpp
- ../src/determinatoritems.cpp ../src/pugixml.cpp)
+ ../src/determinatoritems.cpp ../src/pugixml.cpp ../src/determinator_manager.cpp
+ ${Action_sources} ${Condition_sources})
add_executable(test_runner ${UnitTests_sources} ${UnitTest_tsrc})
@@ -32,7 +35,7 @@
enable_testing()
-set(CMAKE_CXX_FLAGS "-g -std=c++0x -fprofile-arcs -ftest-coverage")
+set(CMAKE_CXX_FLAGS "-g -Os -std=c++0x -fprofile-arcs -ftest-coverage")
#set(xPLHALTest_SRCS test_test.cpp test_xplcache.cpp)
#add_executable(test_runner ${xPLHALTest_SRCS})
#message(STATUS "Boost_LIBRARIES=${Boost_LIBRARIES}")
Modified: xPLHAL/branches/thomas_s_dev/test/determinator1.xml
===================================================================
--- xPLHAL/branches/thomas_s_dev/test/determinator1.xml 2012-03-03 21:11:49 UTC (rev 718)
+++ xPLHAL/branches/thomas_s_dev/test/determinator1.xml 2012-03-04 18:48:31 UTC (rev 719)
@@ -17,6 +17,7 @@
logText="text to log"
executeOrder="nnn"
/>
+ <stopAction display_name="stopAction" executeOrder="Z" />
</output>
</determinator>
</xplDeterminator>
Added: xPLHAL/branches/thomas_s_dev/test/determinatorAll.xml
===================================================================
--- xPLHAL/branches/thomas_s_dev/test/determinatorAll.xml (rev 0)
+++ xPLHAL/branches/thomas_s_dev/test/determinatorAll.xml 2012-03-04 18:48:31 UTC (rev 719)
@@ -0,0 +1,232 @@
+<!--
+***************************************
+* xPL Determinator Specification
+*
+* Revision 0.9
+*
+* Copyright (C) 2004-2006 John Bent
+*
+***************************************
+-->
+<xplDeterminator> <!-- All xPL Determinator files must have <xplDeterminator> as their top-level element -->
+<!-- The <determinator> element is the container element for a determinator rule.
+
+ The guid attribute specifies the GUID that uniquely identifies this determinator.
+ When a client creates a new determinator, it must omit the guid attribute (or specify it as an empty string), and the
+ server will fill it with an appropriate value when the determinator is submitted.
+
+ The name attribute specifies the name of the determinator (see notes below on groups of determinators).
+ The description attribute specifies a more verbose description, and may be empty.
+ The enabled attribute contains either Y or N, and is used to specify whether the
+ determinator should be executed when it's input conditions are true.
+
+ The groupName attribute specifies whether this determinator belongs to a group.
+ If it is an empty string, the determinator is placed at the top of the hierarchy.
+
+ The isGroup attribute specifies whether this is a determinator, or a determinator group.
+ For normal determinators, it should be set to N.
+ For groups, it should be set to Y.
+ When specifying a determinator group, no input or output sections are required.
+ The name attribute should be used to specify the name of the group.
+ Group names can be hierarchical, using a slash (/) as the hierarchy separator.
+
+-->
+<determinator
+ guid="rule-guid"
+ name="rule-name"
+ description="rule-description"
+ enabled="Y"
+ groupName=""
+ isGroup="N">
+
+ <input match="all">
+ <!-- The <input> section describes the conditions which must be true for the output section of this
+ determinator to be executed.
+ -->
+
+ <!-- The <xplCondition> element is used to allow the rule to match specific xPL messages -->
+ <xplCondition
+ display_name="condition-name"
+ msg_type="cmnd"
+ source_vendor="pnxs"
+ source_device="device"
+ source_instance="instance"
+ target_vendor="vendor"
+ target_device="device"
+ target_instance="instance"
+ schema_class="class"
+ schema_type="type">
+ <!-- One or more <param> elements may appear to allow matching on specific parameters within the body of a message -->
+ <param
+ name="parameter-name"
+ operator="<="
+ value="parameter-value"
+ />
+ </xplCondition>
+
+ <!-- The <globalCondition> element allows rules to be executed based on the value of a global -->
+ <globalCondition
+ display_name="condition-name"
+ name="global-name"
+ operator=">="
+ value="global-value"
+ />
+
+ <!-- The <globalChanged> condition causes a determinator to be executed
+ when the value of a global variable changes.
+ -->
+ <globalChanged
+ display_name="rule-name"
+ name="global-name"
+ />
+
+ <!-- The <dayCondition> restricts execution of a determinator to specific days of the week
+ The dow parameter contains a 7-character string, representing the 7 days
+ of the week, with the first character representing Sunday.
+
+ 0 = do not execute on that day, 1 = execute on that day
+ For example, to execute on Monday to Friday, specify dow="0111110"
+
+ -->
+ <dayCondition display_name="rule-name"
+ dow="0000000"
+ />
+
+ <!-- The <timeCondition> element is u...
[truncated message content] |