diff --git a/src/hos_cosgi_devicerepository/include/hos_cosgi_devicerepository/hos_devicerepository_service.h b/src/hos_cosgi_devicerepository/include/hos_cosgi_devicerepository/hos_devicerepository_service.h index 875a98d1..f3232447 100644 --- a/src/hos_cosgi_devicerepository/include/hos_cosgi_devicerepository/hos_devicerepository_service.h +++ b/src/hos_cosgi_devicerepository/include/hos_cosgi_devicerepository/hos_devicerepository_service.h @@ -1,15 +1,58 @@ #ifndef _HOS_DEVICEREPOSITORY_SERVICE_H_ #define _HOS_DEVICEREPOSITORY_SERVICE_H_ + +#include +#include + + 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& getDevices(std::vector& 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_ */ diff --git a/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.cpp b/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.cpp index 5dcf221f..22df7dc6 100644 --- a/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.cpp +++ b/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.cpp @@ -6,16 +6,74 @@ */ #include "hos_devicerepository_service_impl.h" +#include +#include namespace hos { -HOSDeviceRepositoryServiceImpl::HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService) : coreService(coreService) { +bool GenericDeviceImpl::registerDeviceStatusListener(DeviceEventListener& listener) { + std::lock_guard 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 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& HOSDeviceRepositoryServiceImpl::getDevices(std::vector& devices) { + for (auto item : this->devices) { + devices.push_back(item.second); + } + return devices; +} + +bool HOSDeviceRepositoryServiceImpl::registerDeviceStatusListener(DeviceEventListener& listener) { + std::lock_guard 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 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; diff --git a/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.h b/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.h index 37a21945..5e281143 100644 --- a/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.h +++ b/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.h @@ -9,20 +9,50 @@ #define SRC_HOS_DEVICEREPOSITORY_SERVICE_IMPL_H_ #include - +#include +#include +#include namespace hos { class HOSCoreService; + +class GenericDeviceImpl : public GenericDevice { +private: + std::mutex listenerMutex; + std::set 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 devicesMap_t; + HOSCoreService& coreService; + devicesMap_t devices; + std::mutex listenerMutex; + std::set deviceListeners; + std::set subscripedTopics; + + std::string deviceRepositoryPrefix = "/hos/devices/repository"; public: HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService); virtual ~HOSDeviceRepositoryServiceImpl(); + virtual GenericDevice* getDevice(std::string device_id); + virtual std::vector& getDevices(std::vector& devices); + + virtual bool registerDeviceStatusListener(DeviceEventListener& listener); + virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener); + virtual void getVersion(int& major, int& minor); virtual int getRefCount(); }; diff --git a/src/hos_philips_hue/nodes/test.py b/src/hos_philips_hue/nodes/test.py index 439a890d..4bd2b161 100755 --- a/src/hos_philips_hue/nodes/test.py +++ b/src/hos_philips_hue/nodes/test.py @@ -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")