This commit is contained in:
2015-04-18 02:29:36 +02:00
parent c3bbf7252d
commit 0a4b602229
4 changed files with 138 additions and 7 deletions
@@ -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();
};
+5 -5
View File
@@ -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")