summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins/invoker/heartbeat
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/plugins/invoker/heartbeat')
-rw-r--r--src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp95
-rw-r--r--src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.h54
2 files changed, 149 insertions, 0 deletions
diff --git a/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp
new file mode 100644
index 0000000..6bc06d9
--- /dev/null
+++ b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp
@@ -0,0 +1,95 @@
+#include "HeartbeatInvoker.h"
+#include <glog/logging.h>
+
+#ifdef BUILD_AS_PLUGINS
+#include <Pluma/Connector.hpp>
+#endif
+
+namespace uscxml {
+
+#ifdef BUILD_AS_PLUGINS
+PLUMA_CONNECTOR
+bool connect(pluma::Host& host) {
+ host.add( new HeartbeatInvokerProvider() );
+ return true;
+}
+#endif
+
+HeartbeatInvoker::HeartbeatInvoker() {
+}
+
+HeartbeatInvoker::~HeartbeatInvoker() {
+};
+
+Invoker* HeartbeatInvoker::create(Interpreter* interpreter) {
+ HeartbeatInvoker* invoker = new HeartbeatInvoker();
+ invoker->_interpreter = interpreter;
+ return invoker;
+}
+
+Data HeartbeatInvoker::getDataModelVariables() {
+ Data data;
+ return data;
+}
+
+void HeartbeatInvoker::send(SendRequest& req) {
+}
+
+void HeartbeatInvoker::cancel(const std::string sendId) {
+ HeartbeatDispatcher::getInstance()->cancelEvent(toStr(this));
+}
+
+void HeartbeatInvoker::sendToParent(SendRequest& req) {
+}
+
+void HeartbeatInvoker::invoke(InvokeRequest& req) {
+ _invokeId = req.invokeid;
+ _event.invokeid = _invokeId;
+ std::string intervalStr;
+ double interval = 0;
+ unsigned long intervalMs = 0;
+ InvokeRequest::params_t::iterator paramIter = req.params.begin();
+ while(paramIter != req.params.end()) {
+ if (boost::iequals(paramIter->first, "interval")) {
+ intervalStr = paramIter->second;
+ NumAttr intervalAttr(paramIter->second);
+ interval = strTo<double>(intervalAttr.value);
+ if (false) {
+ } else if (boost::iequals(intervalAttr.unit, "s")) {
+ intervalMs = interval * 1000;
+ } else if (boost::iequals(intervalAttr.unit, "ms")) {
+ intervalMs = interval;
+ } else {
+ intervalMs = interval;
+ }
+ }
+ if (boost::iequals(paramIter->first, "eventname")) {
+ _event.name = paramIter->second;
+ }
+ paramIter++;
+ }
+ if (_event.name.length() == 0)
+ _event.name = std::string("heartbeat." + intervalStr);
+
+ if (intervalMs > 0) {
+ HeartbeatDispatcher::getInstance()->addEvent(toStr(this), HeartbeatInvoker::dispatch, intervalMs, this, true);
+ }
+}
+
+void HeartbeatInvoker::dispatch(void* instance, std::string name) {
+ HeartbeatInvoker* invoker = (HeartbeatInvoker*)instance;
+ invoker->_interpreter->receive(invoker->_event);
+}
+
+HeartbeatDispatcher* HeartbeatDispatcher::_instance = NULL;
+HeartbeatDispatcher* HeartbeatDispatcher::getInstance() {
+ if (_instance == NULL) {
+ _instance = new HeartbeatDispatcher();
+ _instance->start();
+ }
+ return _instance;
+}
+
+HeartbeatDispatcher::HeartbeatDispatcher() {}
+
+} \ No newline at end of file
diff --git a/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.h b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.h
new file mode 100644
index 0000000..9a6cb47
--- /dev/null
+++ b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.h
@@ -0,0 +1,54 @@
+#ifndef HEARTBEATINVOKER_H_W09J90F0
+#define HEARTBEATINVOKER_H_W09J90F0
+
+#include <uscxml/Interpreter.h>
+
+#ifdef BUILD_AS_PLUGINS
+#include "uscxml/plugins/Plugins.h"
+#endif
+
+namespace uscxml {
+
+class HeartbeatInvoker : public Invoker {
+public:
+ HeartbeatInvoker();
+ virtual ~HeartbeatInvoker();
+ virtual Invoker* create(Interpreter* interpreter);
+
+ virtual std::set<std::string> getNames() {
+ std::set<std::string> names;
+ names.insert("heartbeat");
+ names.insert("http://uscxml.tk.informatik.tu-darmstadt.de/#heartbaet");
+ return names;
+ }
+
+ virtual Data getDataModelVariables();
+ virtual void send(SendRequest& req);
+ virtual void cancel(const std::string sendId);
+ virtual void invoke(InvokeRequest& req);
+ virtual void sendToParent(SendRequest& req);
+
+ static void dispatch(void* instance, std::string name);
+
+protected:
+ std::string _invokeId;
+ Event _event;
+
+};
+
+class HeartbeatDispatcher : public DelayedEventQueue {
+public:
+ static HeartbeatDispatcher* getInstance();
+protected:
+ static HeartbeatDispatcher* _instance;
+ HeartbeatDispatcher();
+};
+
+#ifdef BUILD_AS_PLUGINS
+PLUMA_INHERIT_PROVIDER(HeartbeatInvoker, Invoker);
+#endif
+
+}
+
+
+#endif /* end of include guard: HEARTBEATINVOKER_H_W09J90F0 */