This commit is contained in:
Matthias Janetschek
2015-05-22 16:40:23 +02:00
parent feff4efc35
commit 3626b45dfc
23 changed files with 491 additions and 395 deletions
@@ -14,7 +14,7 @@
#include <ros/ros.h>
#include "RulePackage.h"
#include <hos/cosgi/service/ruleengine/ruleengine_service.h>
#include <hos/cosgi/service/devicerepository/devicerepository_service.h>
#include <hos/cosgi/service/devicerepository/DeviceRepositoryService.h>
#include <hos/utils/SchemaLoader.h>
#include "../ruleengine_serviceimpl.h"
@@ -7,7 +7,7 @@
#include "RuleConditionImpl.h"
#include <hos/cosgi/service/ruleengine/rule/Rule.h>
#include <hos/cosgi/service/devicerepository/devicerepository_service.h>
#include <hos/cosgi/service/devicerepository/DeviceRepositoryService.h>
#include <ros/ros.h>
namespace hos {
@@ -183,20 +183,22 @@ bool LogicalAndCondition::evaluate() {
void DeviceMsgCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) {
switch (e->eventType) {
void DeviceMsgCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept {
switch (key) {
case devicerepository::DeviceEvent::EventType::DEVICE_ADDED:
if (!device && this->deviceID.compare(e->device->getDeviceID()) == 0) {
ROS_INFO_STREAM("Rule " << parent->name << ": Device " << deviceID << " appeared.");
device = e->device;
device->addObserver(dynamic_cast<interface::Observer<devicerepository::DeviceEvent>*>(this));
parent->getDeviceRepository()->deleteObserver(devicerepository::DeviceEvent::EventType::DEVICE_ADDED, this);
_registerAsListener();
}
break;
case devicerepository::DeviceEvent::EventType::DEVICE_REMOVED:
if (device && device->getDeviceID().compare(e->device->getDeviceID()) == 0) {
ROS_ERROR_STREAM("Rule " << parent->name << ": Device " << deviceID << " disappeared.");
device->deleteObserver(dynamic_cast<interface::Observer<devicerepository::DeviceEvent>*>(this));
device->deleteObserver(this);
device = nullptr;
parent->getDeviceRepository()->addObserver(devicerepository::DeviceEvent::EventType::DEVICE_ADDED, this);
}
break;
default:
@@ -207,12 +209,12 @@ void DeviceMsgCondition::notificationReceived(interface::Observer<devicereposito
void DeviceMsgCondition::enable() {
auto repoService = parent->getDeviceRepository();
auto device = repoService->getDevice(deviceID);
if (device) {
this->device = device.get();
device->addObserver(dynamic_cast<interface::Observer<devicerepository::DeviceEvent>*>(this));
if (!device.expired()) {
this->device = device.lock().get();
_registerAsListener();
} else {
ROS_ERROR_STREAM("Rule " << parent->name << ": Could not find device " << deviceID);
repoService->addObserver(dynamic_cast<interface::Observer<devicerepository::DeviceEvent>*>(this));
parent->getDeviceRepository()->addObserver(devicerepository::DeviceEvent::EventType::DEVICE_ADDED, this);
}
}
@@ -224,6 +226,13 @@ void DeviceMsgCondition::disable() {
parent->getDeviceRepository()->deleteObserver(this);
}
void DeviceMsgCondition::_registerAsListener() {
if (device) {
for (auto k : _listenerKeys) {
device->addObserver(k, this);
}
}
}
@@ -252,9 +261,9 @@ std::shared_ptr<rule::RuleCondition> DeviceStatusMsgConditionFactory::createCond
return retval;
}
void DeviceStatusMsgCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) {
void DeviceStatusMsgCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept {
switch (e->eventType) {
case devicerepository::DeviceEvent::EventType::STATUS_UPDATED:
case devicerepository::DeviceEvent::EventType::STATUS_UPDATE_RECEIVED:
if (device && device == e->device) {
auto e2 = static_cast<const devicerepository::DeviceStatusMsgEvent*>(e);
bool notify = true;
@@ -281,7 +290,7 @@ void DeviceStatusMsgCondition::notificationReceived(interface::Observer<devicere
}
break;
default:
DeviceMsgCondition::notificationReceived(o, e);
DeviceMsgCondition::notificationReceived(o, key, e);
break;
}
}
@@ -311,7 +320,7 @@ std::shared_ptr<rule::RuleCondition> DeviceCommandMsgConditionFactory::createCon
return retval;
}
void DeviceCommandMsgCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) {
void DeviceCommandMsgCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept {
switch (e->eventType) {
case devicerepository::DeviceEvent::EventType::COMMAND_RECEIVED:
if (device && device == e->device) {
@@ -340,7 +349,7 @@ void DeviceCommandMsgCondition::notificationReceived(interface::Observer<devicer
}
break;
default:
DeviceMsgCondition::notificationReceived(o, e);
DeviceMsgCondition::notificationReceived(o, key, e);
break;
}
}
@@ -375,9 +384,9 @@ std::shared_ptr<rule::RuleCondition> DeviceStateChangeConditionFactory::createCo
}
void DeviceStateChangeCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) {
void DeviceStateChangeCondition::notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept {
switch (e->eventType) {
case devicerepository::DeviceEvent::EventType::STATUS_UPDATED:
case devicerepository::DeviceEvent::EventType::STATE_CHANGED:
if (device && device == e->device) {
auto e2 = static_cast<const devicerepository::DeviceStatusMsgEvent*>(e);
bool notify = true;
@@ -410,7 +419,7 @@ void DeviceStateChangeCondition::notificationReceived(interface::Observer<device
}
break;
default:
DeviceMsgCondition::notificationReceived(o, e);
DeviceMsgCondition::notificationReceived(o, key, e);
break;
}
}
@@ -10,17 +10,14 @@
#include <hos/cosgi/service/ruleengine/rule/RuleCondition.h>
#include <hos/cosgi/service/ruleengine/ruleengine_service.h>
#include <hos/cosgi/service/devicerepository/DeviceRepositoryService.h>
#include <set>
// Service Namespace
namespace hos {
namespace cosgi {
namespace service {
namespace devicerepository {
class Device;
class DeviceEvent;
class DeviceRepositoryService;
}
namespace ruleengine {
namespace rule {
@@ -69,18 +66,21 @@ public:
};
class DeviceMsgCondition : public RuleCondition, public virtual interface::Observer<devicerepository::DeviceEvent> {
class DeviceMsgCondition : public RuleCondition, public virtual interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent> {
protected:
const std::string deviceID;
devicerepository::Device* device = nullptr;
const std::string msgPointer;
const Variant msgValue;
std::set<devicerepository::DeviceEvent::EventType> _listenerKeys;
virtual void _registerAsListener();
public:
DeviceMsgCondition(Rule* parent, Category category, std::string type, const std::string deviceID, const std::string msgPointer, const Variant msgValue) :
RuleCondition(parent, category, type), deviceID(deviceID), msgPointer(msgPointer), msgValue(msgValue) {}
DeviceMsgCondition(Rule* parent, Category category, std::string type, const std::string deviceID, const std::string msgPointer, const Variant msgValue, std::set<devicerepository::DeviceEvent::EventType> _listenerKeys) :
RuleCondition(parent, category, type), deviceID(deviceID), msgPointer(msgPointer), msgValue(msgValue), _listenerKeys(_listenerKeys) {}
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) override;
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept override;
virtual void enable() override;
virtual void disable() override;
};
@@ -89,9 +89,9 @@ public:
class DeviceStatusMsgCondition : public DeviceMsgCondition {
public:
DeviceStatusMsgCondition(Rule* parent, const std::string deviceID, const std::string msgPointer, const Variant msgValue) :
DeviceMsgCondition(parent, Category::Event, "devicestatusmsg", deviceID, msgPointer, msgValue) {}
DeviceMsgCondition(parent, Category::Event, "devicestatusmsg", deviceID, msgPointer, msgValue, {devicerepository::DeviceEvent::EventType::STATUS_UPDATE_RECEIVED}) {}
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) override;
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept override;
};
class DeviceStatusMsgConditionFactory : public virtual RuleConditionFactory {
@@ -103,9 +103,9 @@ public:
class DeviceCommandMsgCondition : public DeviceMsgCondition {
public:
DeviceCommandMsgCondition(Rule* parent, const std::string deviceID, const std::string msgPointer, const Variant msgValue) :
DeviceMsgCondition(parent, Category::Event, "devicecommandmsg", deviceID, msgPointer, msgValue) {}
DeviceMsgCondition(parent, Category::Event, "devicecommandmsg", deviceID, msgPointer, msgValue, {devicerepository::DeviceEvent::EventType::COMMAND_RECEIVED}) {}
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) override;
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept override;
};
class DeviceCommandMsgConditionFactory : public virtual RuleConditionFactory {
@@ -119,9 +119,9 @@ protected:
const Variant fromValue;
public:
DeviceStateChangeCondition(Rule* parent, const std::string deviceID, const std::string statePointer, const Variant fromValue, const Variant toValue) :
DeviceMsgCondition(parent, Category::Event, "devicestatechange", deviceID, statePointer, toValue), fromValue(fromValue) {}
DeviceMsgCondition(parent, Category::Event, "devicestatechange", deviceID, statePointer, toValue, {devicerepository::DeviceEvent::EventType::STATE_CHANGED}), fromValue(fromValue) {}
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) override;
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent::EventType, devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent::EventType& key, const devicerepository::DeviceEvent* e) noexcept override;
};
class DeviceStateChangeConditionFactory : public virtual RuleConditionFactory {
@@ -13,7 +13,7 @@
#include <Variant/Variant.h>
#include <celix/bundle_context.h>
#include <hos/cosgi/service/core/CoreService.h>
#include <hos/cosgi/service/devicerepository/devicerepository_service.h>
#include <hos/cosgi/service/devicerepository/DeviceRepositoryService.h>
#include <Variant/Variant.h>
#include "rule/RulePackage.h"
@@ -79,41 +79,10 @@ void RuleEngineServiceImpl::init() {
}
}
}
repoService->addObserver(this);
initialized = true;
ROS_INFO_STREAM("RuleEngineService: Initialized and Ready.");
}
RuleEngineServiceImpl::~RuleEngineServiceImpl() {
repoService->deleteObserver(this);
}
void RuleEngineServiceImpl::notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) {
/*switch (e->eventType) {
case devicerepository::DeviceEvent::EventType::STATUS_UPDATED:
{
auto e2 = static_cast<const devicerepository::DeviceStatusMsgEvent*>(e);
rule::DeviceStatusMsgEvent event(e2->device, e2->statusMsg, std::chrono::system_clock::now());
this->notifyObservers(&event, (int)rule::RuleEvent::EventType::DeviceStatusMsgEvent);
if (e2->device->getCurrentState() != e2->device->getLastState()) {
rule::DeviceStateChangeEvent event2(e2->device, std::chrono::system_clock::now());
this->notifyObservers(&event2, (int)rule::RuleEvent::EventType::DeviceStateChangeEvent);
}
}
break;
case devicerepository::DeviceEvent::EventType::COMMAND_RECEIVED:
{
auto e2 = static_cast<const devicerepository::DeviceCmdMsgEvent*>(e);
rule::DeviceCommandMsgEvent event(e2->device, e2->cmdMsg, std::chrono::system_clock::now());
this->notifyObservers(&event, (int)rule::RuleEvent::EventType::DeviceCommandMsgEvent);
}
break;
default:
break;
}*/
}
void RuleEngineServiceImpl::addRulePkg(std::string name) {
std::stringstream ss;
ss << ruleEnginePrefix << "/" << name;
@@ -17,7 +17,7 @@
#include <hos/utils/SchemaLoader.h>
#include <hos/cosgi/service/ruleengine/ruleengine_service.h>
#include <hos/cosgi/service/scripting/scripting_service.h>
#include <hos/cosgi/service/devicerepository/devicerepository_service.h>
#include <hos/cosgi/service/devicerepository/DeviceRepositoryService.h>
#include <hos/cosgi/service/Implementation.h>
#include <ros/ros.h>
#include <memory>
@@ -54,8 +54,7 @@ class RulePackage;
class RuleEngineServiceImpl;
class RuleEngineServiceImpl :
public virtual RuleEngineService,
public virtual implementation::Service<RuleEngineServiceImpl>,
public virtual interface::Observer<devicerepository::DeviceEvent> {
public virtual implementation::Service<RuleEngineServiceImpl> {
private:
typedef std::map<std::string, std::shared_ptr<rule::RulePackage>> rulePkgMap_t;
typedef std::map<std::string, scripting::ScriptingService*> execServiceMap_t;
@@ -83,7 +82,6 @@ private:
void init();
public:
~RuleEngineServiceImpl();
/* Initialization */
void setCoreService(service::core::CoreService* coreService);
@@ -93,10 +91,6 @@ public:
virtual void registerRuleConditionFactory(std::string type, std::shared_ptr<RuleConditionFactory> factory) override;
/* Observer Callbacks */
virtual void notificationReceived(interface::Observer<devicerepository::DeviceEvent>::observable_type* o, const devicerepository::DeviceEvent* e) override;
/* Internal Stuff */
bool isInitialized() { return initialized; }