.
This commit is contained in:
+43
@@ -1,15 +1,58 @@
|
|||||||
#ifndef _HOS_DEVICEREPOSITORY_SERVICE_H_
|
#ifndef _HOS_DEVICEREPOSITORY_SERVICE_H_
|
||||||
#define _HOS_DEVICEREPOSITORY_SERVICE_H_
|
#define _HOS_DEVICEREPOSITORY_SERVICE_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
namespace hos {
|
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 {
|
class HOSDeviceRepositoryService {
|
||||||
public:
|
public:
|
||||||
static constexpr const char* SERVICE_NAME = "hos_devicerepository_service";
|
static constexpr const char* SERVICE_NAME = "hos_devicerepository_service";
|
||||||
|
|
||||||
virtual ~HOSDeviceRepositoryService() {}
|
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
|
} // namespace hos
|
||||||
|
|
||||||
#endif /* _HOS_DEVICEREPOSITORY_SERVICE_H_ */
|
#endif /* _HOS_DEVICEREPOSITORY_SERVICE_H_ */
|
||||||
|
|||||||
@@ -6,16 +6,74 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hos_devicerepository_service_impl.h"
|
#include "hos_devicerepository_service_impl.h"
|
||||||
|
#include <hos_cosgi_launcher/hos_core_service.h>
|
||||||
|
#include <ros/ros.h>
|
||||||
|
|
||||||
|
|
||||||
namespace hos {
|
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() {}
|
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) {
|
void HOSDeviceRepositoryServiceImpl::getVersion(int& major, int& minor) {
|
||||||
major = 1;
|
major = 1;
|
||||||
|
|||||||
@@ -9,20 +9,50 @@
|
|||||||
#define SRC_HOS_DEVICEREPOSITORY_SERVICE_IMPL_H_
|
#define SRC_HOS_DEVICEREPOSITORY_SERVICE_IMPL_H_
|
||||||
|
|
||||||
#include <hos_cosgi_devicerepository/hos_devicerepository_service.h>
|
#include <hos_cosgi_devicerepository/hos_devicerepository_service.h>
|
||||||
|
#include <mutex>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
namespace hos {
|
namespace hos {
|
||||||
|
|
||||||
class HOSCoreService;
|
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 {
|
class HOSDeviceRepositoryServiceImpl : public HOSDeviceRepositoryService {
|
||||||
private:
|
private:
|
||||||
|
typedef std::map<std::string, GenericDevice*> devicesMap_t;
|
||||||
|
|
||||||
HOSCoreService& coreService;
|
HOSCoreService& coreService;
|
||||||
|
devicesMap_t devices;
|
||||||
|
std::mutex listenerMutex;
|
||||||
|
std::set<DeviceEventListener*> deviceListeners;
|
||||||
|
std::set<std::string> subscripedTopics;
|
||||||
|
|
||||||
|
std::string deviceRepositoryPrefix = "/hos/devices/repository";
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService);
|
HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService);
|
||||||
virtual ~HOSDeviceRepositoryServiceImpl();
|
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 void getVersion(int& major, int& minor);
|
||||||
virtual int getRefCount();
|
virtual int getRefCount();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ if __name__ == '__main__':
|
|||||||
msg = DeviceCommand()
|
msg = DeviceCommand()
|
||||||
msg.seq = 1
|
msg.seq = 1
|
||||||
msg.device_id = "huelight3"
|
msg.device_id = "huelight3"
|
||||||
msg.device_type = "hos/huelight"
|
msg.device_type = "hue/huelight"
|
||||||
msg.stamp = stamp
|
msg.stamp = stamp
|
||||||
|
|
||||||
msg_body = dict()
|
msg_body = dict()
|
||||||
msg_body["type"] = "hos/huelight/command"
|
msg_body["type"] = "hue/huelight/command"
|
||||||
|
|
||||||
msg_body["switch"] = dict()
|
msg_body["switch"] = dict()
|
||||||
msg_body["switch"]["type"] = "core/types/boolean/command"
|
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["color"]["set"] = [1.0, 1.0]
|
||||||
|
|
||||||
msg_body["alert"] = dict()
|
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["alert"]["set"] = "none"
|
||||||
|
|
||||||
msg_body["effect"] = dict()
|
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["effect"]["set"] = "none"
|
||||||
|
|
||||||
msg_body["advproperties"] = dict()
|
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_body["advproperties"]["transitiontime"] = 100
|
||||||
|
|
||||||
msg_schema = schemaProvider.getTypeSchema("hue/huelight/command")
|
msg_schema = schemaProvider.getTypeSchema("hue/huelight/command")
|
||||||
|
|||||||
Reference in New Issue
Block a user