.
This commit is contained in:
+43
@@ -1,15 +1,58 @@
|
||||
#ifndef _HOS_DEVICEREPOSITORY_SERVICE_H_
|
||||
#define _HOS_DEVICEREPOSITORY_SERVICE_H_
|
||||
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace hos {
|
||||
|
||||
class DeviceEvent;
|
||||
class DeviceEventListener;
|
||||
|
||||
class GenericDevice {
|
||||
public:
|
||||
virtual ~GenericDevice() {}
|
||||
|
||||
virtual std::string getDeviceID() = 0;
|
||||
|
||||
virtual bool registerDeviceStatusListener(DeviceEventListener& listener) = 0;
|
||||
virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener) = 0;
|
||||
};
|
||||
|
||||
|
||||
class DeviceEvent {
|
||||
public:
|
||||
enum class Type : int { ADDED = 1, REMOVED = 2, STATUS_UPDATE = 3, COMMAND = 4 };
|
||||
GenericDevice* device;
|
||||
Type type;
|
||||
};
|
||||
|
||||
|
||||
class DeviceEventListener {
|
||||
public:
|
||||
virtual ~DeviceEventListener() {}
|
||||
virtual void deviceEventReceived(const DeviceEvent& event) = 0;
|
||||
};
|
||||
|
||||
|
||||
class HOSDeviceRepositoryService {
|
||||
public:
|
||||
static constexpr const char* SERVICE_NAME = "hos_devicerepository_service";
|
||||
|
||||
virtual ~HOSDeviceRepositoryService() {}
|
||||
|
||||
virtual GenericDevice* getDevice(std::string device_id) = 0;
|
||||
virtual std::vector<GenericDevice*>& getDevices(std::vector<GenericDevice*>& devices) = 0;
|
||||
|
||||
virtual bool registerDeviceStatusListener(DeviceEventListener& listener) = 0;
|
||||
virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener) = 0;
|
||||
|
||||
virtual void getVersion(int& major, int& minor) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // namespace hos
|
||||
|
||||
#endif /* _HOS_DEVICEREPOSITORY_SERVICE_H_ */
|
||||
|
||||
@@ -6,16 +6,74 @@
|
||||
*/
|
||||
|
||||
#include "hos_devicerepository_service_impl.h"
|
||||
#include <hos_cosgi_launcher/hos_core_service.h>
|
||||
#include <ros/ros.h>
|
||||
|
||||
|
||||
namespace hos {
|
||||
|
||||
HOSDeviceRepositoryServiceImpl::HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService) : coreService(coreService) {
|
||||
|
||||
bool GenericDeviceImpl::registerDeviceStatusListener(DeviceEventListener& listener) {
|
||||
std::lock_guard<std::mutex> lock(listenerMutex);
|
||||
auto elem = deviceListeners.find(&listener);
|
||||
if (elem == deviceListeners.end()) {
|
||||
deviceListeners.insert(&listener);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool GenericDeviceImpl::unregisterDeviceStatusListener(DeviceEventListener& listener) {
|
||||
std::lock_guard<std::mutex> lock(listenerMutex);
|
||||
auto elem = deviceListeners.find(&listener);
|
||||
if (elem != deviceListeners.end()) {
|
||||
deviceListeners.erase(elem);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
HOSDeviceRepositoryServiceImpl::HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService) :
|
||||
coreService(coreService) {
|
||||
auto& privateNodeHandle = coreService.getPrivateNodeHandle();
|
||||
privateNodeHandle.getParam("~device_repository_prefix", deviceRepositoryPrefix);
|
||||
}
|
||||
|
||||
HOSDeviceRepositoryServiceImpl::~HOSDeviceRepositoryServiceImpl() {}
|
||||
|
||||
GenericDevice* HOSDeviceRepositoryServiceImpl::getDevice(std::string device_id) {
|
||||
return this->devices[device_id];
|
||||
}
|
||||
|
||||
std::vector<GenericDevice*>& HOSDeviceRepositoryServiceImpl::getDevices(std::vector<GenericDevice*>& devices) {
|
||||
for (auto item : this->devices) {
|
||||
devices.push_back(item.second);
|
||||
}
|
||||
return devices;
|
||||
}
|
||||
|
||||
bool HOSDeviceRepositoryServiceImpl::registerDeviceStatusListener(DeviceEventListener& listener) {
|
||||
std::lock_guard<std::mutex> lock(listenerMutex);
|
||||
auto elem = deviceListeners.find(&listener);
|
||||
if (elem == deviceListeners.end()) {
|
||||
deviceListeners.insert(&listener);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool HOSDeviceRepositoryServiceImpl::unregisterDeviceStatusListener(DeviceEventListener& listener) {
|
||||
std::lock_guard<std::mutex> lock(listenerMutex);
|
||||
auto elem = deviceListeners.find(&listener);
|
||||
if (elem != deviceListeners.end()) {
|
||||
deviceListeners.erase(elem);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void HOSDeviceRepositoryServiceImpl::getVersion(int& major, int& minor) {
|
||||
major = 1;
|
||||
|
||||
@@ -9,20 +9,50 @@
|
||||
#define SRC_HOS_DEVICEREPOSITORY_SERVICE_IMPL_H_
|
||||
|
||||
#include <hos_cosgi_devicerepository/hos_devicerepository_service.h>
|
||||
|
||||
#include <mutex>
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
||||
namespace hos {
|
||||
|
||||
class HOSCoreService;
|
||||
|
||||
|
||||
class GenericDeviceImpl : public GenericDevice {
|
||||
private:
|
||||
std::mutex listenerMutex;
|
||||
std::set<DeviceEventListener*> deviceListeners;
|
||||
std::string deviceID;
|
||||
public:
|
||||
virtual std::string getDeviceID() { return deviceID; }
|
||||
|
||||
virtual bool registerDeviceStatusListener(DeviceEventListener& listener);
|
||||
virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener);
|
||||
};
|
||||
|
||||
|
||||
class HOSDeviceRepositoryServiceImpl : public HOSDeviceRepositoryService {
|
||||
private:
|
||||
typedef std::map<std::string, GenericDevice*> devicesMap_t;
|
||||
|
||||
HOSCoreService& coreService;
|
||||
devicesMap_t devices;
|
||||
std::mutex listenerMutex;
|
||||
std::set<DeviceEventListener*> deviceListeners;
|
||||
std::set<std::string> subscripedTopics;
|
||||
|
||||
std::string deviceRepositoryPrefix = "/hos/devices/repository";
|
||||
|
||||
public:
|
||||
HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService);
|
||||
virtual ~HOSDeviceRepositoryServiceImpl();
|
||||
|
||||
virtual GenericDevice* getDevice(std::string device_id);
|
||||
virtual std::vector<GenericDevice*>& getDevices(std::vector<GenericDevice*>& devices);
|
||||
|
||||
virtual bool registerDeviceStatusListener(DeviceEventListener& listener);
|
||||
virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener);
|
||||
|
||||
virtual void getVersion(int& major, int& minor);
|
||||
virtual int getRefCount();
|
||||
};
|
||||
|
||||
@@ -24,11 +24,11 @@ if __name__ == '__main__':
|
||||
msg = DeviceCommand()
|
||||
msg.seq = 1
|
||||
msg.device_id = "huelight3"
|
||||
msg.device_type = "hos/huelight"
|
||||
msg.device_type = "hue/huelight"
|
||||
msg.stamp = stamp
|
||||
|
||||
msg_body = dict()
|
||||
msg_body["type"] = "hos/huelight/command"
|
||||
msg_body["type"] = "hue/huelight/command"
|
||||
|
||||
msg_body["switch"] = dict()
|
||||
msg_body["switch"]["type"] = "core/types/boolean/command"
|
||||
@@ -45,15 +45,15 @@ if __name__ == '__main__':
|
||||
msg_body["color"]["set"] = [1.0, 1.0]
|
||||
|
||||
msg_body["alert"] = dict()
|
||||
msg_body["alert"]["type"] = "hos/huelight/command/alert"
|
||||
msg_body["alert"]["type"] = "hue/huelight/command/alert"
|
||||
msg_body["alert"]["set"] = "none"
|
||||
|
||||
msg_body["effect"] = dict()
|
||||
msg_body["effect"]["type"] = "hos/huelight/command/effect"
|
||||
msg_body["effect"]["type"] = "hue/huelight/command/effect"
|
||||
msg_body["effect"]["set"] = "none"
|
||||
|
||||
msg_body["advproperties"] = dict()
|
||||
msg_body["advproperties"]["type"] = "hos/huelight/command/advproperties"
|
||||
msg_body["advproperties"]["type"] = "hue/huelight/command/advproperties"
|
||||
msg_body["advproperties"]["transitiontime"] = 100
|
||||
|
||||
msg_schema = schemaProvider.getTypeSchema("hue/huelight/command")
|
||||
|
||||
Reference in New Issue
Block a user