.
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
+26
-17
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+15
-15
@@ -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 {
|
||||
|
||||
+1
-32
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user