From 782c00e296fcf031677632dd1b54514519067a82 Mon Sep 17 00:00:00 2001 From: matzman Date: Mon, 27 Apr 2015 00:54:16 +0200 Subject: [PATCH] . --- src/hos_celix/CMakeLists.txt | 2 +- src/hos_celix/cmake/FindCELIX.cmake | 19 +- .../include/hos_cosgi_core/cosgi_core.h | 7 + src/hos_cosgi_devicerepository/CMakeLists.txt | 8 +- .../hos_devicerepository_service.h | 70 +++-- src/hos_cosgi_devicerepository/package.xml | 2 + .../src/HosSchemaLoader.cpp | 40 +++ .../src/HosSchemaLoader.h | 32 ++ .../src/bundle_activator.cpp | 67 +++- .../src/hos_devicerepository_service_impl.cpp | 212 ++++++++++--- .../src/hos_devicerepository_service_impl.h | 67 +++- src/hos_cosgi_launcher/CMakeLists.txt | 10 +- .../hos_cosgi_launcher/hos_core_service.h | 4 + .../src/hos_core_service_impl.cpp | 3 + .../src/hos_core_service_impl.h | 2 + .../src/hos_cosgi_launcher.cpp | 11 +- src/hos_cosgi_rulesengine/CMakeLists.txt | 204 ++++++++++++ .../hos_rulesengine_service.h | 37 +++ .../launch/cosgi_rulesengine.launch | 5 + .../notes/rulesengine.ecore | 34 ++ .../notes/rulesengine.ecore_diagram | 294 ++++++++++++++++++ src/hos_cosgi_rulesengine/package.xml | 64 ++++ .../src/bundle_activator.cpp | 140 +++++++++ .../src/hos_rulesengine_service_impl.cpp | 49 +++ .../src/hos_rulesengine_service_impl.h | 60 ++++ src/hos_cpp_common/CMakeLists.txt | 156 ++++++++++ .../include/hos_cpp_common/observable.h | 43 +++ .../include/hos_cpp_common/observable_impl.h | 64 ++++ src/hos_cpp_common/package.xml | 50 +++ src/hos_libvariant/CMakeLists.txt | 8 +- .../hos_libvariant/{ => Variant}/ArgParse.h | 3 +- .../hos_libvariant/{ => Variant}/Blob.h | 3 +- .../hos_libvariant/{ => Variant}/Config.h | 0 .../hos_libvariant/{ => Variant}/Emitter.h | 7 +- .../{ => Variant}/EmitterOutput.h | 0 .../hos_libvariant/{ => Variant}/Exceptions.h | 3 +- .../hos_libvariant/{ => Variant}/Extensions.h | 2 +- .../{ => Variant}/GuessFormat.h | 5 +- .../hos_libvariant/{ => Variant}/Parser.h | 7 +- .../{ => Variant}/ParserInput.h | 0 .../hos_libvariant/{ => Variant}/Path.h | 3 +- .../hos_libvariant/{ => Variant}/Payload.h | 7 +- .../hos_libvariant/{ => Variant}/Schema.h | 3 +- .../{ => Variant}/SchemaLoader.h | 3 +- .../hos_libvariant/{ => Variant}/SharedPtr.h | 3 +- .../hos_libvariant/{ => Variant}/Variant.h | 9 +- .../{ => Variant}/VariantDefines.h | 0 .../{ => Variant}/VariantInternal.h | 9 +- src/hos_libvariant/src/examples/arg_parse.cc | 6 +- src/hos_libvariant/src/examples/convert.cc | 2 +- src/hos_libvariant/src/examples/example1.cc | 2 +- src/hos_libvariant/src/examples/example2.cc | 2 +- .../src/examples/list_example.cc | 3 +- .../src/examples/map_example.cc | 3 +- .../src/examples/pretty_print.cc | 2 +- src/hos_libvariant/src/include/Variant/Blob.h | 3 +- .../src/include/Variant/Emitter.h | 7 +- .../src/include/Variant/Exceptions.h | 3 +- .../src/include/Variant/Extensions.h | 2 +- .../src/include/Variant/GuessFormat.h | 5 +- .../src/include/Variant/Parser.h | 7 +- src/hos_libvariant/src/include/Variant/Path.h | 3 +- .../src/include/Variant/Schema.h | 3 +- .../src/include/Variant/SchemaLoader.h | 3 +- .../src/include/Variant/SharedPtr.h | 3 +- .../src/include/Variant/Variant.h | 9 +- src/hos_libvariant/src/lib/json/JSON_parser.c | 3 +- src/hos_libvariant/src/src/ArgParse.cc | 14 +- src/hos_libvariant/src/src/Blob.cc | 3 +- .../src/src/BundleHdrEmitter.cc | 3 +- src/hos_libvariant/src/src/BundleHdrEmitter.h | 5 +- src/hos_libvariant/src/src/BundleHdrParser.h | 5 +- src/hos_libvariant/src/src/Emitter.cc | 15 +- src/hos_libvariant/src/src/EmitterOutput.cc | 3 +- src/hos_libvariant/src/src/EventBuffer.cc | 3 +- src/hos_libvariant/src/src/EventBuffer.h | 5 +- src/hos_libvariant/src/src/Exceptions.cc | 6 +- src/hos_libvariant/src/src/Extensions.cc | 7 +- src/hos_libvariant/src/src/GuessFormat.cc | 3 +- src/hos_libvariant/src/src/GuessScalar.cc | 3 +- src/hos_libvariant/src/src/GuessScalar.h | 3 +- src/hos_libvariant/src/src/JSONEmitter.cc | 10 +- src/hos_libvariant/src/src/JSONEmitter.h | 3 +- src/hos_libvariant/src/src/JSONParser.cc | 5 +- src/hos_libvariant/src/src/MsgPackEmitter.cc | 5 +- src/hos_libvariant/src/src/MsgPackEmitter.h | 13 +- src/hos_libvariant/src/src/MsgPackParser.cc | 5 +- src/hos_libvariant/src/src/MsgPackParser.h | 5 +- src/hos_libvariant/src/src/ParseBool.cc | 3 +- src/hos_libvariant/src/src/Parser.cc | 18 +- src/hos_libvariant/src/src/ParserInput.cc | 3 +- src/hos_libvariant/src/src/Path.cc | 3 +- src/hos_libvariant/src/src/Payload.cc | 5 +- src/hos_libvariant/src/src/XMLPLISTEmitter.h | 3 +- src/hos_libvariant/src/src/XMLPLISTParser.h | 7 +- src/hos_libvariant/src/src/YAMLEmitter.h | 3 +- src/hos_libvariant/src/src/YAMLParser.h | 7 +- .../src/src/gen-argparse-schema | 0 src/hos_libvariant/src/src/gen-json-schema | 0 src/hos_libvariant/src/test/TestCommon.h | 9 +- .../tv4-tests/02-numeric/Makefile | 10 +- .../tv4-tests/03-strings/Makefile | 10 +- .../tv4-tests/04-arrays/Makefile | 10 +- .../tv4-tests/05-objects/Makefile | 10 +- .../tv4-tests/06-combinations/Makefile | 10 +- .../tv4-tests/07-ref/Makefile | 10 +- src/hos_philips_hue/nodes/test.py | 2 +- .../python/hos_huecontroller/huecontroller.py | 25 +- 108 files changed, 1826 insertions(+), 348 deletions(-) create mode 100644 src/hos_cosgi_devicerepository/src/HosSchemaLoader.cpp create mode 100644 src/hos_cosgi_devicerepository/src/HosSchemaLoader.h create mode 100644 src/hos_cosgi_rulesengine/CMakeLists.txt create mode 100644 src/hos_cosgi_rulesengine/include/hos_cosgi_rulesengine/hos_rulesengine_service.h create mode 100644 src/hos_cosgi_rulesengine/launch/cosgi_rulesengine.launch create mode 100644 src/hos_cosgi_rulesengine/notes/rulesengine.ecore create mode 100644 src/hos_cosgi_rulesengine/notes/rulesengine.ecore_diagram create mode 100644 src/hos_cosgi_rulesengine/package.xml create mode 100644 src/hos_cosgi_rulesengine/src/bundle_activator.cpp create mode 100644 src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.cpp create mode 100644 src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.h create mode 100644 src/hos_cpp_common/CMakeLists.txt create mode 100644 src/hos_cpp_common/include/hos_cpp_common/observable.h create mode 100644 src/hos_cpp_common/include/hos_cpp_common/observable_impl.h create mode 100644 src/hos_cpp_common/package.xml rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/ArgParse.h (99%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Blob.h (97%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Config.h (100%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Emitter.h (98%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/EmitterOutput.h (100%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Exceptions.h (98%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Extensions.h (98%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/GuessFormat.h (82%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Parser.h (97%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/ParserInput.h (100%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Path.h (98%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Payload.h (98%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Schema.h (99%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/SchemaLoader.h (97%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/SharedPtr.h (95%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/Variant.h (99%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/VariantDefines.h (100%) rename src/hos_libvariant/include/hos_libvariant/{ => Variant}/VariantInternal.h (93%) mode change 100644 => 100755 src/hos_libvariant/src/src/gen-argparse-schema mode change 100644 => 100755 src/hos_libvariant/src/src/gen-json-schema mode change 100644 => 120000 src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile mode change 100644 => 120000 src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile mode change 100644 => 120000 src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile mode change 100644 => 120000 src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile mode change 100644 => 120000 src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile mode change 100644 => 120000 src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile diff --git a/src/hos_celix/CMakeLists.txt b/src/hos_celix/CMakeLists.txt index 64f971b3..5f805e81 100644 --- a/src/hos_celix/CMakeLists.txt +++ b/src/hos_celix/CMakeLists.txt @@ -166,7 +166,7 @@ install(DIRECTORY ${CATKIN_DEVEL_PREFIX}/bin/ ) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/cmake - FILES_MATCHING PATTERN "*.cmake" +# FILES_MATCHING PATTERN "*.cmake" ) # all install targets should use catkin DESTINATION variables diff --git a/src/hos_celix/cmake/FindCELIX.cmake b/src/hos_celix/cmake/FindCELIX.cmake index 9f91e5a9..16e9935b 100644 --- a/src/hos_celix/cmake/FindCELIX.cmake +++ b/src/hos_celix/cmake/FindCELIX.cmake @@ -30,30 +30,29 @@ set(CELIX_DIR_FROM_FINDCELIX "${CMAKE_CURRENT_LIST_DIR}/../../../..") find_path(CELIX_INCLUDE_DIR celix_errno.h - PATHS ${CELIX_DIR_FROM_FINDCELIX} $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local - PATH_SUFFIXES include include/celix) + PATHS ${CELIX_DIR_FROM_FINDCELIX} ${CMAKE_CURRENT_LIST_DIR}/../../.. $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local + PATH_SUFFIXES include include/celix include/hos_celix include/hos_celix/celix) find_library(CELIX_FRAMEWORK_LIBRARY NAMES celix_framework - PATHS ${CELIX_DIR_FROM_FINDCELIX} $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local + PATHS ${CELIX_DIR_FROM_FINDCELIX} ${CMAKE_CURRENT_LIST_DIR}/../../.. $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local PATH_SUFFIXES lib lib64) find_library(CELIX_UTILS_LIBRARY NAMES celix_utils - PATHS ${CELIX_DIR_FROM_FINDCELIX} $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local + PATHS ${CELIX_DIR_FROM_FINDCELIX} ${CMAKE_CURRENT_LIST_DIR}/../../.. $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local PATH_SUFFIXES lib lib64) find_program(CELIX_LAUNCHER NAMES celix - PATHS ${CELIX_DIR_FROM_FINDCELIX} $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local - PATH_SUFFIXES bin) + PATHS ${CELIX_DIR_FROM_FINDCELIX} ${CMAKE_CURRENT_LIST_DIR}/../../.. $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local + PATH_SUFFIXES bin lib/hos_celix) find_file(CELIX_CMAKECELIX_FILE CMakeCelix.cmake - PATHS ${CELIX_DIR_FROM_FINDCELIX} $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local - PATH_SUFFIXES share/celix/cmake/modules) + PATHS ${CELIX_DIR_FROM_FINDCELIX} ${CMAKE_CURRENT_LIST_DIR}/../../.. $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local + PATH_SUFFIXES share/celix/cmake/modules share/hos_celix/cmake) #NOTE assuming shell.zip is always installed. find_path(CELIX_BUNDLES_DIR shell.zip - PATHS ${CELIX_DIR_FROM_FINDCELIX} $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local + PATHS ${CELIX_DIR_FROM_FINDCELIX} ${CMAKE_CURRENT_LIST_DIR}/../../.. $ENV{CELIX_DIR} ${CELIX_DIR} /usr /usr/local PATH_SUFFIXES share/celix/bundles) - include(FindPackageHandleStandardArgs) diff --git a/src/hos_cosgi_core/include/hos_cosgi_core/cosgi_core.h b/src/hos_cosgi_core/include/hos_cosgi_core/cosgi_core.h index cc2a94cb..5309e260 100644 --- a/src/hos_cosgi_core/include/hos_cosgi_core/cosgi_core.h +++ b/src/hos_cosgi_core/include/hos_cosgi_core/cosgi_core.h @@ -9,6 +9,10 @@ #define INCLUDE_HOS_COSGI_CORE_COSGI_CORE_H_ +namespace hos { +namespace cosgi{ + + class COSGI_Object_Interface { public: virtual ~COSGI_Object_Interface() {} @@ -22,4 +26,7 @@ public: }; +} // namespace cosgi +} // namespace hos + #endif /* INCLUDE_HOS_COSGI_CORE_COSGI_CORE_H_ */ diff --git a/src/hos_cosgi_devicerepository/CMakeLists.txt b/src/hos_cosgi_devicerepository/CMakeLists.txt index 85ce2844..6192ad19 100644 --- a/src/hos_cosgi_devicerepository/CMakeLists.txt +++ b/src/hos_cosgi_devicerepository/CMakeLists.txt @@ -10,6 +10,7 @@ find_package(catkin REQUIRED COMPONENTS hos_cosgi_launcher hos_cosgi_core hos_libvariant + hos_cpp_common roscpp ) @@ -90,7 +91,7 @@ find_package(Boost REQUIRED) catkin_package( INCLUDE_DIRS include # LIBRARIES hos_cosgi_devicerepository - CATKIN_DEPENDS hos_celix hos_core_msgs hos_cosgi_launcher roscpp hos_cosgi_core hos_libvariant + CATKIN_DEPENDS hos_celix hos_core_msgs hos_cosgi_launcher roscpp hos_cosgi_core hos_libvariant hos_cpp_common # DEPENDS system_lib ) @@ -110,10 +111,10 @@ include_directories( ${APR_INCLUDE_DIR} ${APR_INCLUDE_DIR}/apr-1.0 include + ${hos_libvariant_INCLUDE_DIRS}/hos_libvariant ) - -set(BUNDLE_SYMBOLICNAME "com.hos.hos_devicerepository") +set(BUNDLE_SYMBOLICNAME "hos.hos_devicerepository") set(BUNDLE_VERSION "1.0.0") set(BUNDLE_NAME "hos_devicerepository") @@ -121,6 +122,7 @@ bundle(hos_cosgi_devicerepository SOURCES ${PROJECT_SOURCE_DIR}/src/bundle_activator ${PROJECT_SOURCE_DIR}/src/hos_devicerepository_service_impl + ${PROJECT_SOURCE_DIR}/src/HosSchemaLoader ) target_link_libraries(hos_cosgi_devicerepository ${catkin_LIBRARIES} 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 8754d518..e64b7c77 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 @@ -3,39 +3,75 @@ #include +#include #include #include +namespace libvariant { +class Variant; +} + + namespace hos { +namespace cosgi { + class DeviceEvent; -class DeviceEventListener; - -class GenericDevice : public COSGI_Object_Interface { -public: - virtual std::string getDeviceID() = 0; - - virtual bool registerDeviceStatusListener(DeviceEventListener& listener) = 0; - virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener) = 0; -}; +class GenericDevice; class DeviceEvent { public: - enum class Type : int { ADDED = 1, REMOVED = 2, STATUS_UPDATE = 3, COMMAND = 4 }; + enum class EventType : int { DEVICE_ADDED = 1, DEVICE_REMOVED = 2, STATUS_UPDATED = 3, COMMAND_RECEIVED = 4 }; + DeviceEvent(GenericDevice* device, EventType type) : device(device), eventType(type) {} GenericDevice* device; - Type type; + EventType eventType; + template T* as() { return (T*)this; } + template const T* as() const { return (T*)this; } }; - -class DeviceEventListener : public COSGI_Object_Interface { +class DeviceAddedEvent : public DeviceEvent { public: - virtual void deviceEventReceived(const DeviceEvent& event) = 0; + DeviceAddedEvent(GenericDevice* device) + : DeviceEvent(device, DeviceEvent::EventType::DEVICE_ADDED) {} +}; + +class DeviceRemovedEvent : public DeviceEvent { +public: + DeviceRemovedEvent(GenericDevice* device) + : DeviceEvent(device, DeviceEvent::EventType::DEVICE_REMOVED) {} +}; + +class DeviceStatusEvent : public DeviceEvent { +public: + DeviceStatusEvent(GenericDevice* device, const libvariant::Variant& statusMsg) + : DeviceEvent(device, DeviceEvent::EventType::STATUS_UPDATED), statusMsg(statusMsg) {} + const libvariant::Variant& statusMsg; +}; + +class DeviceCmdEvent : public DeviceEvent { +public: + DeviceCmdEvent(GenericDevice* device, const libvariant::Variant& cmdMsg) + : DeviceEvent(device, DeviceEvent::EventType::COMMAND_RECEIVED), cmdMsg(cmdMsg) {} + const libvariant::Variant& cmdMsg; }; -class HOSDeviceRepositoryService : public COSGI_Service_Interface { + +class GenericDevice : public COSGI_Object_Interface, public common::IObservable { +public: + virtual const std::string& getDeviceID() = 0; + virtual const std::string& getDeviceType() = 0; + virtual const std::string& getCmdTopic() = 0; + virtual const std::string& getStatusTopic() = 0; + + virtual const libvariant::Variant& getCurrentState() = 0; + virtual const libvariant::Variant& getLastState() = 0; +}; + + +class HOSDeviceRepositoryService : public COSGI_Service_Interface, public common::IObservable { public: static constexpr const char* SERVICE_NAME = "hos_devicerepository_service"; static constexpr int SERVICE_VERSION_MAJOR = 1; @@ -43,12 +79,10 @@ public: 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; }; +} // namespace cosgi } // namespace hos #endif /* _HOS_DEVICEREPOSITORY_SERVICE_H_ */ diff --git a/src/hos_cosgi_devicerepository/package.xml b/src/hos_cosgi_devicerepository/package.xml index 0486b7ca..89eb22e8 100644 --- a/src/hos_cosgi_devicerepository/package.xml +++ b/src/hos_cosgi_devicerepository/package.xml @@ -46,12 +46,14 @@ roscpp hos_cosgi_core hos_libvariant + hos_cpp_common hos_celix hos_core_msgs hos_cosgi_launcher roscpp hos_cosgi_core hos_libvariant + hos_cpp_common diff --git a/src/hos_cosgi_devicerepository/src/HosSchemaLoader.cpp b/src/hos_cosgi_devicerepository/src/HosSchemaLoader.cpp new file mode 100644 index 00000000..40c70360 --- /dev/null +++ b/src/hos_cosgi_devicerepository/src/HosSchemaLoader.cpp @@ -0,0 +1,40 @@ +/* + * HosSchemaLoader.cpp + * + * Created on: 24.04.2015 + * Author: matzman + */ + +#include "HosSchemaLoader.h" + + +namespace hos { + +bool HosSchemaLoader::HandleMissing(const std::string &uri, LoaderError &error) { + if (uri.compare(0, prefix.size(), prefix) == 0) { + return loadTypeSchema(uri.substr(prefix.size())); + } else { + return SchemaLoader::HandleMissing(uri, error); + } +} + +bool HosSchemaLoader::loadTypeSchema(std::string schema) { + std::string pkey = std::string(ros_param_ns).append("/").append(schema); + std::string pvalue; + nodeHandle.getParam(pkey, pvalue); + if (!pvalue.empty()) { + libvariant::Variant v = libvariant::Deserialize(pvalue, libvariant::SERIALIZE_JSON); + if (v.IsMap()) { + std::string sk = std::string(prefix).append(schema); + AddSchema(sk, v); + return true; + } else { + return false; + } + } else { + return false; + } +} + +} + diff --git a/src/hos_cosgi_devicerepository/src/HosSchemaLoader.h b/src/hos_cosgi_devicerepository/src/HosSchemaLoader.h new file mode 100644 index 00000000..de888acb --- /dev/null +++ b/src/hos_cosgi_devicerepository/src/HosSchemaLoader.h @@ -0,0 +1,32 @@ +/* + * HosSchemaLoader.h + * + * Created on: 24.04.2015 + * Author: matzman + */ + +#ifndef SRC_HOSSCHEMALOADER_H_ +#define SRC_HOSSCHEMALOADER_H_ + +#include +#include +#include + +namespace hos { + +class HosSchemaLoader: public libvariant::SchemaLoader { +private: + std::string ros_param_ns; + std::string prefix; + ros::NodeHandle nodeHandle; + bool loadTypeSchema(std::string schema); +public: + HosSchemaLoader(std::string ns = "/hos/types/repository", + std::string prefix = "hos:schema://") + : ros_param_ns(ns), prefix(prefix), nodeHandle("~") {} + virtual bool HandleMissing(const std::string &uri, LoaderError &error); +}; + +} + +#endif /* SRC_HOSSCHEMALOADER_H_ */ diff --git a/src/hos_cosgi_devicerepository/src/bundle_activator.cpp b/src/hos_cosgi_devicerepository/src/bundle_activator.cpp index a6e92897..a4f67a00 100644 --- a/src/hos_cosgi_devicerepository/src/bundle_activator.cpp +++ b/src/hos_cosgi_devicerepository/src/bundle_activator.cpp @@ -14,9 +14,65 @@ extern "C" { #include #include "hos_devicerepository_service_impl.h" +using namespace hos::cosgi; + + +#include +#include + +class Test01 : public hos::common::IObserver { +public: + void notificationReceived(hos::common::IObservable& o, const DeviceEvent* e) { + switch (e->eventType) { + case DeviceEvent::EventType::DEVICE_ADDED: + { + std::cout << "DeviceEvent: Device added: " << e->device->getDeviceID() << std::endl; + } + break; + case DeviceEvent::EventType::DEVICE_REMOVED: + { + std::cout << "DeviceEvent: Device removed: " << e->device->getDeviceID() << std::endl; + } + break; + case DeviceEvent::EventType::STATUS_UPDATED: + { + auto event = e->as(); + std::cout << "DeviceEvent: Device Updated: " << e->device->getDeviceID() << std::endl; + std::cout << "message: "; + libvariant::SerializeJSON(stdout, event->statusMsg, true); + std::cout << std::endl; + std::cout << "current: "; + libvariant::SerializeJSON(stdout, event->device->getCurrentState(), true); + std::cout << std::endl; + std::cout << "last: "; + libvariant::SerializeJSON(stdout, event->device->getLastState(), true); + std::cout << std::endl; + } + break; + case DeviceEvent::EventType::COMMAND_RECEIVED: + { + auto event = e->as(); + std::cout << "DeviceEvent: Device Command: " << e->device->getDeviceID() << std::endl; + std::cout << "message: "; + libvariant::SerializeJSON(stdout, event->statusMsg, true); + std::cout << std::endl; + } + break; + default: + { + std::cout << "DeviceEvent: Unknown event." << std::endl; + } + break; + }; + } + +} test01; + + + struct UserData { apr_pool_t* memoryPool = nullptr; - hos::HOSDeviceRepositoryServiceImpl* serviceImpl = nullptr; + hos::cosgi::HOSDeviceRepositoryServiceImpl* serviceImpl = nullptr; service_registration_pt serviceReg = nullptr; }; @@ -49,8 +105,8 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) UserData* myUserData = (UserData*)userData; // Get HOS Core Service service_reference_pt ref = nullptr; - bundleContext_getServiceReference(context, (char*)hos::HOSCoreService::SERVICE_NAME, &ref); - hos::HOSCoreService* coreService = nullptr; + bundleContext_getServiceReference(context, (char*)HOSCoreService::SERVICE_NAME, &ref); + hos::cosgi::HOSCoreService* coreService = nullptr; bundleContext_getService(context, ref, (void**)&coreService); if (coreService == nullptr) { ROS_ERROR("DeviceRepositoryService: Could not retrieve HOSCoreService."); @@ -65,8 +121,9 @@ celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) if (myUserData->serviceImpl != nullptr) { delete myUserData->serviceImpl; } - myUserData->serviceImpl = new hos::HOSDeviceRepositoryServiceImpl(*coreService); - bundleContext_registerService(context, (char*)hos::HOSDeviceRepositoryService::SERVICE_NAME, &myUserData->serviceImpl, nullptr, &myUserData->serviceReg); + myUserData->serviceImpl = new hos::cosgi::HOSDeviceRepositoryServiceImpl(*coreService); + myUserData->serviceImpl->addObserver(test01); + bundleContext_registerService(context, (char*)hos::cosgi::HOSDeviceRepositoryService::SERVICE_NAME, myUserData->serviceImpl, nullptr, &myUserData->serviceReg); status = CELIX_SUCCESS; ROS_INFO("DeviceRepositoryService: Bundle successfully started"); } 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 84c0e2e2..8a3efc2d 100644 --- a/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.cpp +++ b/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.cpp @@ -7,40 +7,125 @@ #include "hos_devicerepository_service_impl.h" #include +#include "HosSchemaLoader.h" #include +#include +#include +#include namespace hos { +namespace cosgi { + +GenericDeviceImpl::GenericDeviceImpl(std::string deviceID, std::string type, std::string statusTopic, std::string cmdTopic) + : deviceID(deviceID), deviceType(type), statusTopic(statusTopic), cmdTopic(cmdTopic) { + std::cout << "GenericDeviceImpl(" << deviceID << ", " << type << ", " << statusTopic << ", " << cmdTopic << ")" << std::endl; +} + +void GenericDeviceImpl::handleStatusMsg(libvariant::Variant& msg) { + lastState = currentState.Copy(); + currentState.Merge(msg); + DeviceStatusEvent event(this, msg); + notifyObservers(&event); +} + +void GenericDeviceImpl::handleCommandMsg(libvariant::Variant& msg) { + DeviceCmdEvent event(this, msg); + notifyObservers(&event); +} -bool GenericDeviceImpl::registerDeviceStatusListener(DeviceEventListener& listener) { - std::lock_guard lock(listenerMutex); - auto elem = deviceListeners.find(&listener); - if (elem == deviceListeners.end()) { - deviceListeners.insert(&listener); - return true; +HOSDeviceRepositoryServiceImpl::HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService) + : coreService(coreService), nodehandle(coreService.getPrivateNodeHandle()) { + nodehandle.getParam("device_repository_prefix", deviceRepositoryPrefix); + nodehandle.getParam("hos_status_topic", hosStatusTopic); + XmlRpc::XmlRpcValue rawValue; + nodehandle.getParam(deviceRepositoryPrefix, rawValue); + if (rawValue.getType() == XmlRpc::XmlRpcValue::TypeStruct) { + for (auto iter = rawValue.begin(); iter != rawValue.end(); iter++) { + std::string devname = (*iter).first; + XmlRpc::XmlRpcValue devRaw = (*iter).second; + try { + addDevice(devname, devRaw); + ROS_INFO_STREAM("Created device " << devname << "."); + } catch (std::exception& e) { + ROS_ERROR_STREAM("Could not create device " << devname << ": " << e.what()); + } + } } - return false; + hosStatusSub = nodehandle.subscribe(hosStatusTopic, 1000, &HOSDeviceRepositoryServiceImpl::hosStatusMsgCallback, this); + schemaLoader = new HosSchemaLoader(); } +void HOSDeviceRepositoryServiceImpl::addDevice(std::string name) { + std::stringstream ss; + ss << deviceRepositoryPrefix << "/" << name; + XmlRpc::XmlRpcValue rawValue; + nodehandle.getParam(ss.str(), rawValue); + addDevice(name, rawValue); +} -bool GenericDeviceImpl::unregisterDeviceStatusListener(DeviceEventListener& listener) { - std::lock_guard lock(listenerMutex); - auto elem = deviceListeners.find(&listener); - if (elem != deviceListeners.end()) { - deviceListeners.erase(elem); - return true; +void HOSDeviceRepositoryServiceImpl::addDevice(std::string name, XmlRpc::XmlRpcValue& rawValue) { + GenericDevice* dev = _createDevice(name, rawValue); + if (dev != nullptr) { + devices.insert({name, dev}); + // cmd topic + auto& entry = subscripedTopics[dev->getCmdTopic()]; + std::cout << "subCount1: " << entry.first << "." << std::endl; + if (entry.first <= 0) { + entry.second = nodehandle.subscribe(dev->getCmdTopic(), 1000, &HOSDeviceRepositoryServiceImpl::cmdMsgCallback, this); + std::cout << "subscriped to " << dev->getCmdTopic() << "." << std::endl; + } + entry.first= entry.first + 1; + subscripedTopics[dev->getCmdTopic()] = entry; + // status topic + entry = subscripedTopics[dev->getStatusTopic()]; + std::cout << "subCount2: " << entry.first << "." << std::endl; + if (entry.first <= 0) { + entry.second = nodehandle.subscribe(dev->getStatusTopic(), 1000, &HOSDeviceRepositoryServiceImpl::statusMsgCallback, this); + std::cout << "subscriped to " << dev->getStatusTopic() << "." << std::endl; + } + entry.first= entry.first + 1; + subscripedTopics[dev->getStatusTopic()] = entry; + DeviceAddedEvent event(dev); + notifyObservers(&event); } - return false; } -HOSDeviceRepositoryServiceImpl::HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService) : - coreService(coreService) { - auto& privateNodeHandle = coreService.getPrivateNodeHandle(); - privateNodeHandle.getParam("~device_repository_prefix", deviceRepositoryPrefix); +GenericDevice* HOSDeviceRepositoryServiceImpl::_createDevice(std::string name, XmlRpc::XmlRpcValue& rawValue) { + std::string type, statusTopic, cmdTopic; + XmlRpc::XmlRpcValue& typeRaw = rawValue["type"]; + if (typeRaw.getType() != XmlRpc::XmlRpcValue::TypeString) { + throw std::runtime_error("type is not a string."); + } + type = static_cast(typeRaw); + XmlRpc::XmlRpcValue& statusTopicRaw = rawValue["status_topic"]; + if (statusTopicRaw.getType() != XmlRpc::XmlRpcValue::TypeString) { + throw std::runtime_error("statusTopic is not a string."); + } + statusTopic = static_cast(statusTopicRaw); + XmlRpc::XmlRpcValue& cmdTopicRaw = rawValue["cmd_topic"]; + if (cmdTopicRaw.getType() != XmlRpc::XmlRpcValue::TypeString) { + throw std::runtime_error("cmdTopic is not a string."); + } + cmdTopic = static_cast(cmdTopicRaw); + return new GenericDeviceImpl(name, type, statusTopic, cmdTopic); } + +void HOSDeviceRepositoryServiceImpl::removeDevice(std::string name) { + GenericDevice* dev = devices[name]; + if (dev != nullptr) { + DeviceRemovedEvent event(dev); + notifyObservers(&event); + dev->notifyObservers(&event); + devices.erase(name); + delete dev; + } +} + + GenericDevice* HOSDeviceRepositoryServiceImpl::getDevice(std::string device_id) { return this->devices[device_id]; } @@ -52,26 +137,6 @@ std::vector& HOSDeviceRepositoryServiceImpl::getDevices(std::vec 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::getServiceVersion(int& major, int& minor) { major = SERVICE_VERSION_MAJOR; @@ -82,6 +147,77 @@ int HOSDeviceRepositoryServiceImpl::getRefCount() { return 0; } + +void HOSDeviceRepositoryServiceImpl::statusMsgCallback(const hos_core_msgs::DeviceStatusUpdate::ConstPtr& msg) { + std::cout << "HOSDeviceRepositoryServiceImpl::statusMsgCallback" << std::endl; + libvariant::Variant s = schemaLoader->GetSchema(std::string("hos:schema://").append(msg->device_type).append("/status")); + libvariant::Variant m = libvariant::Deserialize(msg->msg_body, libvariant::SERIALIZE_JSON); + libvariant::SchemaResult sr = libvariant::SchemaValidate(s, m, schemaLoader); + if (!sr.Error()) { + GenericDevice* dev = devices[msg->device_id]; + if (dev != nullptr) { + ((GenericDeviceImpl*)dev)->handleStatusMsg(m); + DeviceStatusEvent event(dev, m); + notifyObservers(&event); + } + } else { + ROS_ERROR_STREAM("Could not validate status message: " << sr.PrettyPrintMessage()); + } +} + +void HOSDeviceRepositoryServiceImpl::cmdMsgCallback(const hos_core_msgs::DeviceCommand::ConstPtr& msg) { + std::cout << "HOSDeviceRepositoryServiceImpl::cmdMsgCallback" << std::endl; + libvariant::Variant s = schemaLoader->GetSchema(std::string("hos:schema://").append(msg->device_type).append("/command")); + libvariant::Variant m = libvariant::Deserialize(msg->msg_body, libvariant::SERIALIZE_JSON); + libvariant::SchemaResult sr = libvariant::SchemaValidate(s, m, schemaLoader); + if (!sr.Error()) { + GenericDevice* dev = devices[msg->device_id]; + if (dev != nullptr) { + ((GenericDeviceImpl*)dev)->handleCommandMsg(m); + DeviceCmdEvent event(dev, m); + notifyObservers(&event); + } + } else { + ROS_ERROR_STREAM("Could not validate command message: " << sr.PrettyPrintMessage()); + } +} + +void HOSDeviceRepositoryServiceImpl::hosStatusMsgCallback(const hos_core_msgs::HosStatusUpdate::ConstPtr& msg) { + std::cout << "HOSDeviceRepositoryServiceImpl::hosStatusMsgCallback" << std::endl; + libvariant::Variant s = schemaLoader->GetSchema(std::string("hos:schema://core/msgs/hosstatusupdate")); + libvariant::Variant m = libvariant::Deserialize(msg->msg_body, libvariant::SERIALIZE_JSON); + libvariant::SchemaResult sr = libvariant::SchemaValidate(s, m, schemaLoader); + if (!sr.Error()) { + if (m.Contains("devices")) { + auto d = m["devices"]; + if (d.Contains("added") && d["added"].IsList()) { + for (auto dev : d["added"].AsList()) { + if (dev.IsString()) { + std::string devname = dev.AsString(); + if (devices.find(devname) == devices.end()) { + addDevice(devname); + } + } + } + } + if (d.Contains("removed") && d["removed"].IsList()) { + for (auto dev : d["removed"].AsList()) { + if (dev.IsString()) { + std::string devname = dev.AsString(); + if (devices.find(devname) == devices.end()) { + removeDevice(devname); + } + } + } + } + } + } else { + ROS_ERROR_STREAM("Could not validate hos status message: " << sr.PrettyPrintMessage()); + } +} + + +} // namespace cosgi } // namespace hos 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 930f2671..c69940ce 100644 --- a/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.h +++ b/src/hos_cosgi_devicerepository/src/hos_devicerepository_service_impl.h @@ -8,40 +8,78 @@ #ifndef SRC_HOS_DEVICEREPOSITORY_SERVICE_IMPL_H_ #define SRC_HOS_DEVICEREPOSITORY_SERVICE_IMPL_H_ +#include #include #include #include #include +#include +#include +#include +#include + + +namespace XmlRpc { +class XmlRpcValue; +} + +#include namespace hos { +class HosSchemaLoader; + +namespace cosgi { + class HOSCoreService; - class GenericDeviceImpl : public GenericDevice { +OBSERVABLE_IMPL(DeviceEvent) private: - std::mutex listenerMutex; - std::set deviceListeners; std::string deviceID; -public: - virtual std::string getDeviceID() { return deviceID; } + std::string deviceType; + std::string statusTopic; + std::string cmdTopic; + libvariant::Variant currentState; + libvariant::Variant lastState; - virtual bool registerDeviceStatusListener(DeviceEventListener& listener); - virtual bool unregisterDeviceStatusListener(DeviceEventListener& listener); +public: + GenericDeviceImpl(std::string deviceID, std::string deviceType, std::string statusTopic, std::string cmdTopic); + + virtual const std::string& getDeviceID() { return deviceID; } + virtual const std::string& getDeviceType() { return deviceType; } + virtual const std::string& getCmdTopic() { return cmdTopic; } + virtual const std::string& getStatusTopic() { return statusTopic; } + + virtual const libvariant::Variant& getCurrentState() { return currentState; } + virtual const libvariant::Variant& getLastState() { return lastState; } + + void handleStatusMsg(libvariant::Variant& msg); + void handleCommandMsg(libvariant::Variant& msg); }; class HOSDeviceRepositoryServiceImpl : public HOSDeviceRepositoryService { +OBSERVABLE_IMPL(DeviceEvent) private: typedef std::map devicesMap_t; + ros::NodeHandle& nodehandle; HOSCoreService& coreService; devicesMap_t devices; - std::mutex listenerMutex; - std::set deviceListeners; - std::set subscripedTopics; + std::map> subscripedTopics; std::string deviceRepositoryPrefix = "/hos/devices/repository"; + std::string hosStatusTopic = "/hos/status/updates"; + + ros::Subscriber hosStatusSub; + + HosSchemaLoader* schemaLoader = nullptr; + + void addDevice(std::string name); + void addDevice(std::string name, XmlRpc::XmlRpcValue& rawValue); + GenericDevice* _createDevice(std::string name, XmlRpc::XmlRpcValue& rawValue); + void removeDevice(std::string name); public: HOSDeviceRepositoryServiceImpl(HOSCoreService& coreService); @@ -49,15 +87,18 @@ public: 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 const char* getServiceName() { return SERVICE_NAME; } virtual void getServiceVersion(int& major, int& minor); virtual int getRefCount(); + + void statusMsgCallback(const hos_core_msgs::DeviceStatusUpdate::ConstPtr& msg); + void cmdMsgCallback(const hos_core_msgs::DeviceCommand::ConstPtr& msg); + void hosStatusMsgCallback(const hos_core_msgs::HosStatusUpdate::ConstPtr& msg); }; + +} // namespace cosgi } // namespace hos diff --git a/src/hos_cosgi_launcher/CMakeLists.txt b/src/hos_cosgi_launcher/CMakeLists.txt index 92447fab..c0d1c304 100644 --- a/src/hos_cosgi_launcher/CMakeLists.txt +++ b/src/hos_cosgi_launcher/CMakeLists.txt @@ -155,11 +155,11 @@ install(TARGETS hos_cosgi_launcher ) ## Mark cpp header files for installation -# install(DIRECTORY include/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -# FILES_MATCHING PATTERN "*.h" -# PATTERN ".svn" EXCLUDE -# ) +install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE +) ## Mark other files for installation (e.g. launch and bag files, etc.) # install(FILES diff --git a/src/hos_cosgi_launcher/include/hos_cosgi_launcher/hos_core_service.h b/src/hos_cosgi_launcher/include/hos_cosgi_launcher/hos_core_service.h index 68af32ec..56718f6e 100644 --- a/src/hos_cosgi_launcher/include/hos_cosgi_launcher/hos_core_service.h +++ b/src/hos_cosgi_launcher/include/hos_cosgi_launcher/hos_core_service.h @@ -10,6 +10,8 @@ namespace ros { } namespace hos { +namespace cosgi{ + class HOSCoreService : public COSGI_Service_Interface { public: @@ -22,6 +24,8 @@ public: virtual void requestShutdown() = 0; }; + +} // namespace cosgi } // namespace hos diff --git a/src/hos_cosgi_launcher/src/hos_core_service_impl.cpp b/src/hos_cosgi_launcher/src/hos_core_service_impl.cpp index 22fcd3b5..63bbaf3f 100644 --- a/src/hos_cosgi_launcher/src/hos_core_service_impl.cpp +++ b/src/hos_cosgi_launcher/src/hos_core_service_impl.cpp @@ -9,6 +9,7 @@ #include namespace hos { +namespace cosgi{ HOSCoreServiceImpl::HOSCoreServiceImpl(ros::NodeHandle& publicNodeHandle, ros::NodeHandle& privateNodeHandle) @@ -34,5 +35,7 @@ void HOSCoreServiceImpl::getServiceVersion(int& major, int& minor) { minor = SERVICE_VERSION_MINOR; } + +} // namespace cosgi } // namespace hos diff --git a/src/hos_cosgi_launcher/src/hos_core_service_impl.h b/src/hos_cosgi_launcher/src/hos_core_service_impl.h index 85a66b13..60c0da68 100644 --- a/src/hos_cosgi_launcher/src/hos_core_service_impl.h +++ b/src/hos_cosgi_launcher/src/hos_core_service_impl.h @@ -12,6 +12,7 @@ namespace hos { +namespace cosgi{ class HOSCoreServiceImpl : public HOSCoreService { private: @@ -28,6 +29,7 @@ public: virtual void getServiceVersion(int& major, int& minor); }; +} // namespace cosgi } // namespace hos diff --git a/src/hos_cosgi_launcher/src/hos_cosgi_launcher.cpp b/src/hos_cosgi_launcher/src/hos_cosgi_launcher.cpp index 4f76801a..22153be6 100644 --- a/src/hos_cosgi_launcher/src/hos_cosgi_launcher.cpp +++ b/src/hos_cosgi_launcher/src/hos_cosgi_launcher.cpp @@ -18,6 +18,9 @@ extern "C" { // celix does not provide C++ ready headers #include +using namespace hos::cosgi; + + std::function signalHandler; int main(int argc, char **argv) { @@ -99,9 +102,9 @@ int main(int argc, char **argv) { bundle_context_pt context = nullptr; bundle_getContext(fwBundle, &context); // Create and register hos-core-service - hos::HOSCoreServiceImpl hosCoreService(rosPublicNodeHandle, rosPrivateNodeHandle); + HOSCoreServiceImpl hosCoreService(rosPublicNodeHandle, rosPrivateNodeHandle); service_registration_pt reg = nullptr; - bundleContext_registerService(context, (char*)hos::HOSCoreService::SERVICE_NAME, static_cast(&hosCoreService), nullptr, ®); + bundleContext_registerService(context, (char*)HOSCoreService::SERVICE_NAME, static_cast(&hosCoreService), nullptr, ®); ROS_INFO("HOS core service registered"); @@ -194,7 +197,7 @@ int main(int argc, char **argv) { std::cerr << ss.str(); } - // Deinitialize celix framework + // Deinitialize celix frameork if (fwBundle != nullptr) { bundle_stop(fwBundle); framework_waitForStop(framework); @@ -219,3 +222,5 @@ int main(int argc, char **argv) { ROS_INFO("Exiting ..."); return 0; } + + diff --git a/src/hos_cosgi_rulesengine/CMakeLists.txt b/src/hos_cosgi_rulesengine/CMakeLists.txt new file mode 100644 index 00000000..190d4029 --- /dev/null +++ b/src/hos_cosgi_rulesengine/CMakeLists.txt @@ -0,0 +1,204 @@ +cmake_minimum_required(VERSION 2.8.3) +project(hos_cosgi_rulesengine) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS + hos_celix + hos_cosgi_core + hos_cosgi_devicerepository + hos_cosgi_launcher + hos_cpp_common + hos_libvariant + roscpp +) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +find_package(APR REQUIRED) +find_package(CELIX REQUIRED) +find_package(Boost REQUIRED) + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependencies might have been +## pulled in transitively but can be declared for certainty nonetheless: +## * add a build_depend tag for "message_generation" +## * add a run_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( + INCLUDE_DIRS include +# LIBRARIES hos_cosgi_rulesengine + CATKIN_DEPENDS hos_celix hos_cosgi_core hos_cosgi_devicerepository hos_cosgi_launcher hos_cpp_common hos_libvariant roscpp +# DEPENDS system_lib +) + +########### +## Build ## +########### + +add_definitions( + -std=c++11 +) + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) +include_directories( + ${catkin_INCLUDE_DIRS} + ${APR_INCLUDE_DIR} + ${APR_INCLUDE_DIR}/apr-1.0 + include + ${hos_libvariant_INCLUDE_DIRS}/hos_libvariant +) + +set(BUNDLE_SYMBOLICNAME "hos.hos_rulesengine") +set(BUNDLE_VERSION "1.0.0") +set(BUNDLE_NAME "hos_rulesengine") + +bundle(hos_cosgi_rulesengine + SOURCES + ${PROJECT_SOURCE_DIR}/src/bundle_activator + ${PROJECT_SOURCE_DIR}/src/hos_rulesengine_service_impl +) +target_link_libraries(hos_cosgi_rulesengine + ${catkin_LIBRARIES} + ${APR_LIBRARIES} +) + +## Declare a cpp library +# add_library(hos_cosgi_rulesengine +# src/${PROJECT_NAME}/hos_cosgi_rulesengine.cpp +# ) + +## Declare a cpp executable +# add_executable(hos_cosgi_rulesengine_node src/hos_cosgi_rulesengine_node.cpp) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +# add_dependencies(hos_cosgi_rulesengine_node hos_cosgi_rulesengine_generate_messages_cpp) + +## Specify libraries to link a library or executable target against +# target_link_libraries(hos_cosgi_rulesengine_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +## Mark cpp header files for installation +install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" +) + +install(FILES + ${CMAKE_BINARY_DIR}/hos_cosgi_rulesengine.zip + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/bundles +) + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +# install(TARGETS hos_cosgi_rulesengine hos_cosgi_rulesengine_node +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_hos_cosgi_rulesengine.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/src/hos_cosgi_rulesengine/include/hos_cosgi_rulesengine/hos_rulesengine_service.h b/src/hos_cosgi_rulesengine/include/hos_cosgi_rulesengine/hos_rulesengine_service.h new file mode 100644 index 00000000..2b00cfba --- /dev/null +++ b/src/hos_cosgi_rulesengine/include/hos_cosgi_rulesengine/hos_rulesengine_service.h @@ -0,0 +1,37 @@ +/* + * hos_rulesengine_service.h + * + * Created on: 26.04.2015 + * Author: matzman + */ + +#ifndef INCLUDE_HOS_COSGI_RULESENGINE_HOS_RULESENGINE_SERVICE_H_ +#define INCLUDE_HOS_COSGI_RULESENGINE_HOS_RULESENGINE_SERVICE_H_ + + +#include +#include + + +namespace hos { +namespace cosgi { + + +class RulesEngineEvent; + + +class HOSRulesEngineService : public COSGI_Service_Interface, public common::IObservable { +public: + static constexpr const char* SERVICE_NAME = "hos_rulesengine_service"; + static constexpr int SERVICE_VERSION_MAJOR = 1; + static constexpr int SERVICE_VERSION_MINOR = 0; +}; + + +} // namespace cosgi +} // namespace hos + + + + +#endif /* INCLUDE_HOS_COSGI_RULESENGINE_HOS_RULESENGINE_SERVICE_H_ */ diff --git a/src/hos_cosgi_rulesengine/launch/cosgi_rulesengine.launch b/src/hos_cosgi_rulesengine/launch/cosgi_rulesengine.launch new file mode 100644 index 00000000..d1962053 --- /dev/null +++ b/src/hos_cosgi_rulesengine/launch/cosgi_rulesengine.launch @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/hos_cosgi_rulesengine/notes/rulesengine.ecore b/src/hos_cosgi_rulesengine/notes/rulesengine.ecore new file mode 100644 index 00000000..a4f5d749 --- /dev/null +++ b/src/hos_cosgi_rulesengine/notes/rulesengine.ecore @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/hos_cosgi_rulesengine/notes/rulesengine.ecore_diagram b/src/hos_cosgi_rulesengine/notes/rulesengine.ecore_diagram new file mode 100644 index 00000000..fca9eeae --- /dev/null +++ b/src/hos_cosgi_rulesengine/notes/rulesengine.ecore_diagram @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/hos_cosgi_rulesengine/package.xml b/src/hos_cosgi_rulesengine/package.xml new file mode 100644 index 00000000..2e3a4f2a --- /dev/null +++ b/src/hos_cosgi_rulesengine/package.xml @@ -0,0 +1,64 @@ + + + hos_cosgi_rulesengine + 0.0.0 + The hos_cosgi_rulesengine package + + + + + matzman + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + hos_celix + hos_cosgi_core + hos_cosgi_devicerepository + hos_cosgi_launcher + hos_cpp_common + hos_libvariant + roscpp + hos_celix + hos_cosgi_core + hos_cosgi_devicerepository + hos_cosgi_launcher + hos_cpp_common + hos_libvariant + roscpp + + + + + + + + \ No newline at end of file diff --git a/src/hos_cosgi_rulesengine/src/bundle_activator.cpp b/src/hos_cosgi_rulesengine/src/bundle_activator.cpp new file mode 100644 index 00000000..a8dec4c6 --- /dev/null +++ b/src/hos_cosgi_rulesengine/src/bundle_activator.cpp @@ -0,0 +1,140 @@ +/* + * bundle_activator.cpp + * + * Created on: 26.04.2015 + * Author: matzman + */ + +#include +#include + +#include + +#include "ros/ros.h" + +extern "C" { + #include "hos_celix/bundle_activator.h" + #include "hos_celix/bundle_context.h" +} + +#include +#include "hos_rulesengine_service_impl.h" + +using namespace hos::cosgi; + + + +struct UserData { + apr_pool_t* memoryPool = nullptr; + hos::cosgi::HOSRulesEngineServiceImpl* serviceImpl = nullptr; + service_registration_pt serviceReg = nullptr; +}; + +celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { + celix_status_t status = CELIX_START_ERROR; + apr_pool_t* memoryPool = nullptr; + // Create APR memory pool + apr_status_t astatus = apr_pool_create(&memoryPool, NULL); + if (astatus != APR_SUCCESS) { + ROS_ERROR("RulesEngineService: Could not create APR memory pool (%i).", astatus); + } else { + // Create user data + UserData* myUserData = (UserData*)apr_palloc(memoryPool, sizeof(UserData)); + if (myUserData != nullptr) { + myUserData->memoryPool = memoryPool; + *userData = (void*)myUserData; + status = CELIX_SUCCESS; + ROS_INFO("RulesEngineService: Bundle successfully created"); + } else { + ROS_ERROR("RulesEngineService: Could not create user data struct"); + apr_pool_destroy(memoryPool); + } + } + return status; +} + +celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_START_ERROR; + if (userData != nullptr) { + UserData* myUserData = (UserData*)userData; + // Get HOS Core Service + service_reference_pt ref = nullptr; + bundleContext_getServiceReference(context, (char*)HOSCoreService::SERVICE_NAME, &ref); + hos::cosgi::HOSCoreService* coreService = nullptr; + bundleContext_getService(context, ref, (void**)&coreService); + if (coreService == nullptr) { + ROS_ERROR("RulesEngineService: Could not retrieve HOSCoreService."); + } else { + int major = 0, minor = 0; + coreService->getServiceVersion(major, minor); + ROS_INFO_STREAM("RulesEngineService: Found HOSCoreService Version " << major << "." << minor); + // Get HOS DeviceRepository Service + service_reference_pt ref2 = nullptr; + bundleContext_getServiceReference(context, (char*)HOSDeviceRepositoryService::SERVICE_NAME, &ref2); + hos::cosgi::HOSDeviceRepositoryService* repoService = nullptr; + bundleContext_getService(context, ref2, (void**)&repoService); + if (repoService == nullptr) { + ROS_ERROR("RulesEngineService: Could not retrieve HOSDeviceRepositoryService."); + } else { + int major2 = 0, minor2 = 0; + repoService->getServiceVersion(major2, minor2); + ROS_INFO_STREAM("RulesEngineService: Found HOSDeviceRepositoryService Version " << major2 << "." << minor2); + // Create and register hos-devicerepository-service + if (myUserData->serviceReg != nullptr) { + serviceRegistration_unregister(myUserData->serviceReg); + } + if (myUserData->serviceImpl != nullptr) { + delete myUserData->serviceImpl; + } + myUserData->serviceImpl = new hos::cosgi::HOSRulesEngineServiceImpl(*coreService, *repoService); + bundleContext_registerService(context, (char*)hos::cosgi::HOSRulesEngineServiceImpl::SERVICE_NAME, &myUserData->serviceImpl, nullptr, &myUserData->serviceReg); + status = CELIX_SUCCESS; + ROS_INFO("RulesEngineService: Bundle successfully started"); + } + } + } else { + ROS_ERROR("RulesEngineService: Could not start bundle, user data struct is null"); + } + return status; +} + +celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_ILLEGAL_STATE; + if (userData != nullptr) { + UserData* myUserData = (UserData*)userData; + if (myUserData->serviceReg != nullptr) { + serviceRegistration_unregister(myUserData->serviceReg); + myUserData->serviceReg = nullptr; + } + if (myUserData->serviceImpl != nullptr) { + delete myUserData->serviceImpl; + myUserData->serviceImpl = nullptr; + } + ROS_INFO("RulesEngineService: Bundle successfully stopped"); + status = CELIX_SUCCESS; + } else { + ROS_ERROR("RulesEngineService: Could not stop bundle, user data struct is null"); + } + return status; +} + +celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) { + celix_status_t status = CELIX_ILLEGAL_STATE; + if (userData != nullptr) { + apr_pool_t* memoryPool = ((UserData*)userData)->memoryPool; + if (memoryPool != nullptr) { + apr_pool_destroy(memoryPool); + ROS_INFO("RulesEngineService: Bundle successfully destroyed"); + } else { + ROS_ERROR("RulesEngineService: Could not destroy bundle, there is no APR memory pool"); + } + status = CELIX_SUCCESS; + } else { + ROS_ERROR("RulesEngineService: Could not destroy bundle, user data struct is null"); + } + return status; +} + + + + diff --git a/src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.cpp b/src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.cpp new file mode 100644 index 00000000..b5457fdb --- /dev/null +++ b/src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.cpp @@ -0,0 +1,49 @@ +/* + * hos_rulesengine_service_impl.cpp + * + * Created on: 26.04.2015 + * Author: matzman + */ + +#include "hos_rulesengine_service_impl.h" +#include +#include +#include +#include +#include +#include + + +namespace hos { +namespace cosgi { + +HOSRulesEngineServiceImpl::HOSRulesEngineServiceImpl(HOSCoreService& coreService, HOSDeviceRepositoryService& repoService) + : coreService(coreService), repoService(repoService), nodehandle(coreService.getPrivateNodeHandle()) { + this->repoService.addObserver(*this); +} + +HOSRulesEngineServiceImpl::~HOSRulesEngineServiceImpl() { + repoService.deleteObserver(*this); +} + + +void HOSRulesEngineServiceImpl::getServiceVersion(int& major, int& minor) { + major = SERVICE_VERSION_MAJOR; + minor = SERVICE_VERSION_MINOR; +} + + +void HOSRulesEngineServiceImpl::notificationReceived(IObservable& o, const DeviceEvent* e) { + +} + + +} // namespace cosgi +} // namespace hos + + + + + + + diff --git a/src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.h b/src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.h new file mode 100644 index 00000000..830107e1 --- /dev/null +++ b/src/hos_cosgi_rulesengine/src/hos_rulesengine_service_impl.h @@ -0,0 +1,60 @@ +/* + * hos_rulesengine_service_impl.h + * + * Created on: 26.04.2015 + * Author: matzman + */ + +#ifndef INCLUDE_HOS_COSGI_RULESENGINE_HOS_RULESENGINE_SERVICE_IMPL_H_ +#define INCLUDE_HOS_COSGI_RULESENGINE_HOS_RULESENGINE_SERVICE_IMPL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace XmlRpc { +class XmlRpcValue; +} + +#include + +namespace hos { +namespace cosgi { + +class HOSCoreService; + + +class HOSRulesEngineServiceImpl : public HOSRulesEngineService, public common::IObserver { +OBSERVABLE_IMPL(RulesEngineEvent) +private: + HOSCoreService& coreService; + HOSDeviceRepositoryService& repoService; + ros::NodeHandle& nodehandle; + +public: + HOSRulesEngineServiceImpl(HOSCoreService& coreService, HOSDeviceRepositoryService& repoService); + ~HOSRulesEngineServiceImpl(); + + virtual void notificationReceived(IObservable& o, const DeviceEvent* e); + + virtual const char* getServiceName() { return SERVICE_NAME; } + virtual void getServiceVersion(int& major, int& minor); +}; + + +} // namespace cosgi +} // namespace hos + + + + + +#endif /* INCLUDE_HOS_COSGI_RULESENGINE_HOS_RULESENGINE_SERVICE_IMPL_H_ */ diff --git a/src/hos_cpp_common/CMakeLists.txt b/src/hos_cpp_common/CMakeLists.txt new file mode 100644 index 00000000..c0cd7860 --- /dev/null +++ b/src/hos_cpp_common/CMakeLists.txt @@ -0,0 +1,156 @@ +cmake_minimum_required(VERSION 2.8.3) +project(hos_cpp_common) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependencies might have been +## pulled in transitively but can be declared for certainty nonetheless: +## * add a build_depend tag for "message_generation" +## * add a run_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( + INCLUDE_DIRS include +# LIBRARIES hos_cpp_common +# CATKIN_DEPENDS other_catkin_pkg +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) + +## Declare a cpp library +# add_library(hos_cpp_common +# src/${PROJECT_NAME}/hos_cpp_common.cpp +# ) + +## Declare a cpp executable +# add_executable(hos_cpp_common_node src/hos_cpp_common_node.cpp) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +# add_dependencies(hos_cpp_common_node hos_cpp_common_generate_messages_cpp) + +## Specify libraries to link a library or executable target against +# target_link_libraries(hos_cpp_common_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +# install(TARGETS hos_cpp_common hos_cpp_common_node +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" + PATTERN ".svn" EXCLUDE +) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_hos_cpp_common.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/src/hos_cpp_common/include/hos_cpp_common/observable.h b/src/hos_cpp_common/include/hos_cpp_common/observable.h new file mode 100644 index 00000000..742e3290 --- /dev/null +++ b/src/hos_cpp_common/include/hos_cpp_common/observable.h @@ -0,0 +1,43 @@ +/* + * observable.h + * + * Created on: 25.04.2015 + * Author: matzman + */ + +#ifndef INCLUDE_HOS_CPP_COMMON_OBSERVABLE_H_ +#define INCLUDE_HOS_CPP_COMMON_OBSERVABLE_H_ + + +namespace hos { +namespace common { + + +template class IObservable; + + +template +class IObserver { +public: + virtual ~IObserver() {} + virtual void notificationReceived(IObservable& o, const Event* e) = 0; +}; + + +template +class IObservable { +public: + virtual ~IObservable() {} + virtual void addObserver(IObserver& o) = 0; + virtual void deleteObserver(IObserver& o) = 0; + virtual void deleteObservers() = 0; + virtual size_t countObservers() = 0; + virtual void notifyObservers(const Event* e = nullptr) = 0; +}; + + +} // namespace common +} // namespace hos + + +#endif /* INCLUDE_HOS_CPP_COMMON_OBSERVABLE_H_ */ diff --git a/src/hos_cpp_common/include/hos_cpp_common/observable_impl.h b/src/hos_cpp_common/include/hos_cpp_common/observable_impl.h new file mode 100644 index 00000000..3af60770 --- /dev/null +++ b/src/hos_cpp_common/include/hos_cpp_common/observable_impl.h @@ -0,0 +1,64 @@ +/* + * observable_impl.h + * + * Created on: 25.04.2015 + * Author: matzman + */ + +#ifndef INCLUDE_HOS_CPP_COMMON_OBSERVABLE_IMPL_H_ +#define INCLUDE_HOS_CPP_COMMON_OBSERVABLE_IMPL_H_ + +#include "observable.h" +#include +#include + + +namespace hos { +namespace common { + +#define OBSERVABLE_IMPL(Event) \ + protected: \ + std::mutex __listenersLock; \ + std::unordered_set*> __listeners; \ + public: \ + virtual void addObserver(hos::common::IObserver& o) { \ + std::lock_guard lock(__listenersLock); \ + auto elem = __listeners.find(&o); \ + if (elem == __listeners.end()) { \ + __listeners.insert(&o); \ + } \ + } \ + virtual void deleteObserver(hos::common::IObserver& o) { \ + std::lock_guard lock(__listenersLock); \ + auto elem = __listeners.find(&o); \ + if (elem != __listeners.end()) { \ + __listeners.erase(elem); \ + } \ + } \ + virtual void deleteObservers() { \ + std::lock_guard lock(__listenersLock); \ + __listeners.clear(); \ + } \ + virtual size_t countObservers() { \ + return __listeners.size(); \ + } \ + virtual void notifyObservers(const Event* e = nullptr) { \ + std::lock_guard lock(__listenersLock); \ + for (hos::common::IObserver* l : __listeners) { \ + l->notificationReceived(*this, e); \ + } \ + } + + +template +class Observable : public IObservable { +OBSERVABLE_IMPL(Event) +public: + virtual ~Observable() {} +}; + + +} // namespace common +} // namespace hos + +#endif /* INCLUDE_HOS_CPP_COMMON_OBSERVABLE_IMPL_H_ */ diff --git a/src/hos_cpp_common/package.xml b/src/hos_cpp_common/package.xml new file mode 100644 index 00000000..fea744f5 --- /dev/null +++ b/src/hos_cpp_common/package.xml @@ -0,0 +1,50 @@ + + + hos_cpp_common + 0.0.0 + The hos_cpp_common package + + + + + matzman + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + + + + + + + + \ No newline at end of file diff --git a/src/hos_libvariant/CMakeLists.txt b/src/hos_libvariant/CMakeLists.txt index b138e1c7..9ae7b315 100644 --- a/src/hos_libvariant/CMakeLists.txt +++ b/src/hos_libvariant/CMakeLists.txt @@ -76,7 +76,7 @@ find_package(catkin REQUIRED) ## CATKIN_DEPENDS: catkin_packages dependent projects also need ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package( - INCLUDE_DIRS include + INCLUDE_DIRS include/hos_libvariant LIBRARIES Variant # CATKIN_DEPENDS other_catkin_pkg # DEPENDS system_lib @@ -92,7 +92,7 @@ ExternalProject_Add( libvariant_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src CONFIGURE_COMMAND cmake ${CMAKE_CURRENT_SOURCE_DIR}/src -DCMAKE_INSTALL_PREFIX=${CATKIN_DEVEL_PREFIX} - -DBUILD_SHARED_LIBS=FALSE + -DBUILD_SHARED_LIBS=TRUE -DLIBVARIANT_BUILD_EXAMPLES=FALSE -DLIBVARIANT_BUILD_TESTS=FALSE -DLIBVARIANT_BUILD_WALL=TRUE @@ -104,8 +104,8 @@ ExternalProject_Add( libvariant_project INSTALL_COMMAND make install ) -add_library( Variant STATIC IMPORTED ) -set_property( TARGET Variant PROPERTY IMPORTED_LOCATION "${CATKIN_DEVEL_PREFIX}/lib/libVariant.a") +add_library( Variant SHARED IMPORTED ) +set_property( TARGET Variant PROPERTY IMPORTED_LOCATION "${CATKIN_DEVEL_PREFIX}/lib/libVariant.so") add_dependencies( Variant libvariant_project ) ## Specify additional locations of header files diff --git a/src/hos_libvariant/include/hos_libvariant/ArgParse.h b/src/hos_libvariant/include/hos_libvariant/Variant/ArgParse.h similarity index 99% rename from src/hos_libvariant/include/hos_libvariant/ArgParse.h rename to src/hos_libvariant/include/hos_libvariant/Variant/ArgParse.h index 74248bec..97e0a17b 100644 --- a/src/hos_libvariant/include/hos_libvariant/ArgParse.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/ArgParse.h @@ -4,9 +4,8 @@ */ #ifndef VARIANT_ARGPARSER_H #define VARIANT_ARGPARSER_H - #pragma once -#include "../hos_libvariant/Variant.h" +#include #include #include namespace libvariant { diff --git a/src/hos_libvariant/include/hos_libvariant/Blob.h b/src/hos_libvariant/include/hos_libvariant/Variant/Blob.h similarity index 97% rename from src/hos_libvariant/include/hos_libvariant/Blob.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Blob.h index b2706e4d..11d7bf65 100644 --- a/src/hos_libvariant/include/hos_libvariant/Blob.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Blob.h @@ -4,9 +4,8 @@ */ #ifndef VARIANT_BLOB_H #define VARIANT_BLOB_H - #pragma once -#include "../../../src/include/Variant/SharedPtr.h" +#include #include #include diff --git a/src/hos_libvariant/include/hos_libvariant/Config.h b/src/hos_libvariant/include/hos_libvariant/Variant/Config.h similarity index 100% rename from src/hos_libvariant/include/hos_libvariant/Config.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Config.h diff --git a/src/hos_libvariant/include/hos_libvariant/Emitter.h b/src/hos_libvariant/include/hos_libvariant/Variant/Emitter.h similarity index 98% rename from src/hos_libvariant/include/hos_libvariant/Emitter.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Emitter.h index 1b113470..adff3528 100644 --- a/src/hos_libvariant/include/hos_libvariant/Emitter.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Emitter.h @@ -20,15 +20,14 @@ */ #ifndef VARIANT_EMITTER_H #define VARIANT_EMITTER_H - #pragma once #include #include #include #include -#include "../../../src/include/Variant/Variant.h" -#include "../../../src/include/Variant/Blob.h" -#include "../../../src/include/Variant/EmitterOutput.h" +#include +#include +#include #include #include diff --git a/src/hos_libvariant/include/hos_libvariant/EmitterOutput.h b/src/hos_libvariant/include/hos_libvariant/Variant/EmitterOutput.h similarity index 100% rename from src/hos_libvariant/include/hos_libvariant/EmitterOutput.h rename to src/hos_libvariant/include/hos_libvariant/Variant/EmitterOutput.h diff --git a/src/hos_libvariant/include/hos_libvariant/Exceptions.h b/src/hos_libvariant/include/hos_libvariant/Variant/Exceptions.h similarity index 98% rename from src/hos_libvariant/include/hos_libvariant/Exceptions.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Exceptions.h index 20c33383..da59c286 100644 --- a/src/hos_libvariant/include/hos_libvariant/Exceptions.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Exceptions.h @@ -20,11 +20,10 @@ */ #ifndef VARIANT_EXCEPTIONS_H #define VARIANT_EXCEPTIONS_H +#include #include #include #include - -#include "../../../src/include/Variant/VariantDefines.h" namespace libvariant { /// \brief Exception thrown when a key does not exist. diff --git a/src/hos_libvariant/include/hos_libvariant/Extensions.h b/src/hos_libvariant/include/hos_libvariant/Variant/Extensions.h similarity index 98% rename from src/hos_libvariant/include/hos_libvariant/Extensions.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Extensions.h index a3f615bc..83e2a726 100644 --- a/src/hos_libvariant/include/hos_libvariant/Extensions.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Extensions.h @@ -22,7 +22,7 @@ #ifndef VARIANT_EXTENSIONS_H #define VARIANT_EXTENSIONS_H -#include "../../../src/include/Variant/Variant.h" +#include namespace libvariant { diff --git a/src/hos_libvariant/include/hos_libvariant/GuessFormat.h b/src/hos_libvariant/include/hos_libvariant/Variant/GuessFormat.h similarity index 82% rename from src/hos_libvariant/include/hos_libvariant/GuessFormat.h rename to src/hos_libvariant/include/hos_libvariant/Variant/GuessFormat.h index 9687d863..aba94ea9 100644 --- a/src/hos_libvariant/include/hos_libvariant/GuessFormat.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/GuessFormat.h @@ -4,10 +4,9 @@ */ #ifndef VARIANT_GUESSFORMAT_H #define VARIANT_GUESSFORMAT_H - #pragma once -#include "../../../src/include/Variant/Variant.h" -#include "../../../src/include/Variant/Parser.h" +#include +#include namespace libvariant { /// diff --git a/src/hos_libvariant/include/hos_libvariant/Parser.h b/src/hos_libvariant/include/hos_libvariant/Variant/Parser.h similarity index 97% rename from src/hos_libvariant/include/hos_libvariant/Parser.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Parser.h index b430d835..1c6478a3 100644 --- a/src/hos_libvariant/include/hos_libvariant/Parser.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Parser.h @@ -4,13 +4,12 @@ */ #ifndef VARIANT_PARSER_H #define VARIANT_PARSER_H - #pragma once #include #include -#include "../../../src/include/Variant/Blob.h" -#include "../../../src/include/Variant/ParserInput.h" -#include "../../../src/include/Variant/Variant.h" +#include +#include +#include #include namespace libvariant { diff --git a/src/hos_libvariant/include/hos_libvariant/ParserInput.h b/src/hos_libvariant/include/hos_libvariant/Variant/ParserInput.h similarity index 100% rename from src/hos_libvariant/include/hos_libvariant/ParserInput.h rename to src/hos_libvariant/include/hos_libvariant/Variant/ParserInput.h diff --git a/src/hos_libvariant/include/hos_libvariant/Path.h b/src/hos_libvariant/include/hos_libvariant/Variant/Path.h similarity index 98% rename from src/hos_libvariant/include/hos_libvariant/Path.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Path.h index 53426fd3..6c38c5c3 100644 --- a/src/hos_libvariant/include/hos_libvariant/Path.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Path.h @@ -20,11 +20,10 @@ */ #ifndef VARIANT_PATH_H #define VARIANT_PATH_H - #pragma once #include #include -#include "../../../src/include/Variant/Exceptions.h" +#include namespace libvariant { // A simple xpath like path functionality for Variant diff --git a/src/hos_libvariant/include/hos_libvariant/Payload.h b/src/hos_libvariant/include/hos_libvariant/Variant/Payload.h similarity index 98% rename from src/hos_libvariant/include/hos_libvariant/Payload.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Payload.h index 6b3a11cd..bcb213b5 100644 --- a/src/hos_libvariant/include/hos_libvariant/Payload.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Payload.h @@ -20,11 +20,10 @@ */ #ifndef VARIANT_PAYLOAD_H #define VARIANT_PAYLOAD_H - #pragma once -#include "../hos_libvariant/Variant.h" -#include "../hos_libvariant/Emitter.h" -#include "../hos_libvariant/Parser.h" +#include +#include +#include namespace libvariant { // Serialize and Deserialize a header, null byte, and a binary payload diff --git a/src/hos_libvariant/include/hos_libvariant/Schema.h b/src/hos_libvariant/include/hos_libvariant/Variant/Schema.h similarity index 99% rename from src/hos_libvariant/include/hos_libvariant/Schema.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Schema.h index 235627c2..fd0d3d39 100644 --- a/src/hos_libvariant/include/hos_libvariant/Schema.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Schema.h @@ -23,9 +23,8 @@ */ #ifndef VARIANT_SCHEMA_H #define VARIANT_SCHEMA_H - #pragma once -#include "../../../src/include/Variant/Variant.h" +#include #include #include #include diff --git a/src/hos_libvariant/include/hos_libvariant/SchemaLoader.h b/src/hos_libvariant/include/hos_libvariant/Variant/SchemaLoader.h similarity index 97% rename from src/hos_libvariant/include/hos_libvariant/SchemaLoader.h rename to src/hos_libvariant/include/hos_libvariant/Variant/SchemaLoader.h index e4edd00b..54dfe55a 100644 --- a/src/hos_libvariant/include/hos_libvariant/SchemaLoader.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/SchemaLoader.h @@ -20,10 +20,9 @@ */ #ifndef VARIANT_SCHEMALOADER_H #define VARIANT_SCHEMALOADER_H - #pragma once -#include "../../../src/include/Variant/Schema.h" +#include namespace libvariant { diff --git a/src/hos_libvariant/include/hos_libvariant/SharedPtr.h b/src/hos_libvariant/include/hos_libvariant/Variant/SharedPtr.h similarity index 95% rename from src/hos_libvariant/include/hos_libvariant/SharedPtr.h rename to src/hos_libvariant/include/hos_libvariant/Variant/SharedPtr.h index fd4cef91..9fe22a68 100644 --- a/src/hos_libvariant/include/hos_libvariant/SharedPtr.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/SharedPtr.h @@ -4,9 +4,8 @@ */ #ifndef VARIANT_SHAREDPTR_H #define VARIANT_SHAREDPTR_H - #pragma once -#include "../hos_libvariant/Config.h" +#include #if defined(__GXX_EXPERIMENTAL_CXX0X) || __cplusplus >= 201103L || defined(HAVE_CXX11_SHAREDPTR) // The C++11 implementation is available diff --git a/src/hos_libvariant/include/hos_libvariant/Variant.h b/src/hos_libvariant/include/hos_libvariant/Variant/Variant.h similarity index 99% rename from src/hos_libvariant/include/hos_libvariant/Variant.h rename to src/hos_libvariant/include/hos_libvariant/Variant/Variant.h index 3b0173e6..a01d2380 100644 --- a/src/hos_libvariant/include/hos_libvariant/Variant.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/Variant.h @@ -24,12 +24,11 @@ #ifndef VARIANT_VARIANT_H #define VARIANT_VARIANT_H - #pragma once -#include "../../../src/include/Variant/Blob.h" -#include "../../../src/include/Variant/SharedPtr.h" -#include "../../../src/include/Variant/Exceptions.h" -#include "../../../src/include/Variant/VariantInternal.h" +#include +#include +#include +#include #include #include #include diff --git a/src/hos_libvariant/include/hos_libvariant/VariantDefines.h b/src/hos_libvariant/include/hos_libvariant/Variant/VariantDefines.h similarity index 100% rename from src/hos_libvariant/include/hos_libvariant/VariantDefines.h rename to src/hos_libvariant/include/hos_libvariant/Variant/VariantDefines.h diff --git a/src/hos_libvariant/include/hos_libvariant/VariantInternal.h b/src/hos_libvariant/include/hos_libvariant/Variant/VariantInternal.h similarity index 93% rename from src/hos_libvariant/include/hos_libvariant/VariantInternal.h rename to src/hos_libvariant/include/hos_libvariant/Variant/VariantInternal.h index 8479795d..5d9ed0f3 100644 --- a/src/hos_libvariant/include/hos_libvariant/VariantInternal.h +++ b/src/hos_libvariant/include/hos_libvariant/Variant/VariantInternal.h @@ -20,15 +20,14 @@ */ #ifndef VARIANT_BASE_H #define VARIANT_BASE_H +#include +#include +#include +#include #include #include #include #include - -#include "../hos_libvariant/Blob.h" -#include "../hos_libvariant/Path.h" -#include "../hos_libvariant/SharedPtr.h" -#include "../hos_libvariant/VariantDefines.h" namespace libvariant { struct RefTag {}; diff --git a/src/hos_libvariant/src/examples/arg_parse.cc b/src/hos_libvariant/src/examples/arg_parse.cc index abe36849..7ffe278d 100644 --- a/src/hos_libvariant/src/examples/arg_parse.cc +++ b/src/hos_libvariant/src/examples/arg_parse.cc @@ -3,10 +3,10 @@ * \brief */ +#include +#include +#include #include -#include "../../src/include/Variant/ArgParse.h" -#include "../../src/include/Variant/Schema.h" -#include "../../src/include/Variant/Variant.h" using namespace libvariant; using namespace std; diff --git a/src/hos_libvariant/src/examples/convert.cc b/src/hos_libvariant/src/examples/convert.cc index 5dfd9180..189b0caa 100644 --- a/src/hos_libvariant/src/examples/convert.cc +++ b/src/hos_libvariant/src/examples/convert.cc @@ -4,10 +4,10 @@ * the json, yaml or xml formats and then write out * any of those formats. */ +#include #include #include #include -#include "../../src/include/Variant/Variant.h" using namespace libvariant; diff --git a/src/hos_libvariant/src/examples/example1.cc b/src/hos_libvariant/src/examples/example1.cc index d0c2dee2..625e2aa1 100644 --- a/src/hos_libvariant/src/examples/example1.cc +++ b/src/hos_libvariant/src/examples/example1.cc @@ -3,8 +3,8 @@ * \brief */ +#include #include -#include "../../src/include/Variant/Variant.h" // Import Variant from libvariant using libvariant::Variant; diff --git a/src/hos_libvariant/src/examples/example2.cc b/src/hos_libvariant/src/examples/example2.cc index 629349b9..8e733e91 100644 --- a/src/hos_libvariant/src/examples/example2.cc +++ b/src/hos_libvariant/src/examples/example2.cc @@ -3,8 +3,8 @@ * \brief */ +#include #include -#include "../../src/include/Variant/Variant.h" using libvariant::Variant; diff --git a/src/hos_libvariant/src/examples/list_example.cc b/src/hos_libvariant/src/examples/list_example.cc index 52831ddd..17dfd7a5 100644 --- a/src/hos_libvariant/src/examples/list_example.cc +++ b/src/hos_libvariant/src/examples/list_example.cc @@ -2,9 +2,8 @@ * \author John Bridgman * \brief */ +#include #include - -#include "../../src/include/Variant/Variant.h" using libvariant::Variant; int main(int argc, char **argv) { diff --git a/src/hos_libvariant/src/examples/map_example.cc b/src/hos_libvariant/src/examples/map_example.cc index dabe886a..b43eb86d 100644 --- a/src/hos_libvariant/src/examples/map_example.cc +++ b/src/hos_libvariant/src/examples/map_example.cc @@ -2,10 +2,9 @@ * \author John Bridgman * \brief */ +#include #include #include - -#include "../../src/include/Variant/Variant.h" using libvariant::Variant; int main(int argc, char **argv) { diff --git a/src/hos_libvariant/src/examples/pretty_print.cc b/src/hos_libvariant/src/examples/pretty_print.cc index 2bb04755..388e8436 100644 --- a/src/hos_libvariant/src/examples/pretty_print.cc +++ b/src/hos_libvariant/src/examples/pretty_print.cc @@ -3,8 +3,8 @@ * \brief */ #include +#include #include -#include "../../src/include/Variant/Variant.h" using namespace libvariant; diff --git a/src/hos_libvariant/src/include/Variant/Blob.h b/src/hos_libvariant/src/include/Variant/Blob.h index b2706e4d..11d7bf65 100644 --- a/src/hos_libvariant/src/include/Variant/Blob.h +++ b/src/hos_libvariant/src/include/Variant/Blob.h @@ -4,9 +4,8 @@ */ #ifndef VARIANT_BLOB_H #define VARIANT_BLOB_H - #pragma once -#include "../../../src/include/Variant/SharedPtr.h" +#include #include #include diff --git a/src/hos_libvariant/src/include/Variant/Emitter.h b/src/hos_libvariant/src/include/Variant/Emitter.h index 1b113470..adff3528 100644 --- a/src/hos_libvariant/src/include/Variant/Emitter.h +++ b/src/hos_libvariant/src/include/Variant/Emitter.h @@ -20,15 +20,14 @@ */ #ifndef VARIANT_EMITTER_H #define VARIANT_EMITTER_H - #pragma once #include #include #include #include -#include "../../../src/include/Variant/Variant.h" -#include "../../../src/include/Variant/Blob.h" -#include "../../../src/include/Variant/EmitterOutput.h" +#include +#include +#include #include #include diff --git a/src/hos_libvariant/src/include/Variant/Exceptions.h b/src/hos_libvariant/src/include/Variant/Exceptions.h index 20c33383..da59c286 100644 --- a/src/hos_libvariant/src/include/Variant/Exceptions.h +++ b/src/hos_libvariant/src/include/Variant/Exceptions.h @@ -20,11 +20,10 @@ */ #ifndef VARIANT_EXCEPTIONS_H #define VARIANT_EXCEPTIONS_H +#include #include #include #include - -#include "../../../src/include/Variant/VariantDefines.h" namespace libvariant { /// \brief Exception thrown when a key does not exist. diff --git a/src/hos_libvariant/src/include/Variant/Extensions.h b/src/hos_libvariant/src/include/Variant/Extensions.h index a3f615bc..83e2a726 100644 --- a/src/hos_libvariant/src/include/Variant/Extensions.h +++ b/src/hos_libvariant/src/include/Variant/Extensions.h @@ -22,7 +22,7 @@ #ifndef VARIANT_EXTENSIONS_H #define VARIANT_EXTENSIONS_H -#include "../../../src/include/Variant/Variant.h" +#include namespace libvariant { diff --git a/src/hos_libvariant/src/include/Variant/GuessFormat.h b/src/hos_libvariant/src/include/Variant/GuessFormat.h index 9687d863..aba94ea9 100644 --- a/src/hos_libvariant/src/include/Variant/GuessFormat.h +++ b/src/hos_libvariant/src/include/Variant/GuessFormat.h @@ -4,10 +4,9 @@ */ #ifndef VARIANT_GUESSFORMAT_H #define VARIANT_GUESSFORMAT_H - #pragma once -#include "../../../src/include/Variant/Variant.h" -#include "../../../src/include/Variant/Parser.h" +#include +#include namespace libvariant { /// diff --git a/src/hos_libvariant/src/include/Variant/Parser.h b/src/hos_libvariant/src/include/Variant/Parser.h index b430d835..1c6478a3 100644 --- a/src/hos_libvariant/src/include/Variant/Parser.h +++ b/src/hos_libvariant/src/include/Variant/Parser.h @@ -4,13 +4,12 @@ */ #ifndef VARIANT_PARSER_H #define VARIANT_PARSER_H - #pragma once #include #include -#include "../../../src/include/Variant/Blob.h" -#include "../../../src/include/Variant/ParserInput.h" -#include "../../../src/include/Variant/Variant.h" +#include +#include +#include #include namespace libvariant { diff --git a/src/hos_libvariant/src/include/Variant/Path.h b/src/hos_libvariant/src/include/Variant/Path.h index 53426fd3..6c38c5c3 100644 --- a/src/hos_libvariant/src/include/Variant/Path.h +++ b/src/hos_libvariant/src/include/Variant/Path.h @@ -20,11 +20,10 @@ */ #ifndef VARIANT_PATH_H #define VARIANT_PATH_H - #pragma once #include #include -#include "../../../src/include/Variant/Exceptions.h" +#include namespace libvariant { // A simple xpath like path functionality for Variant diff --git a/src/hos_libvariant/src/include/Variant/Schema.h b/src/hos_libvariant/src/include/Variant/Schema.h index 235627c2..fd0d3d39 100644 --- a/src/hos_libvariant/src/include/Variant/Schema.h +++ b/src/hos_libvariant/src/include/Variant/Schema.h @@ -23,9 +23,8 @@ */ #ifndef VARIANT_SCHEMA_H #define VARIANT_SCHEMA_H - #pragma once -#include "../../../src/include/Variant/Variant.h" +#include #include #include #include diff --git a/src/hos_libvariant/src/include/Variant/SchemaLoader.h b/src/hos_libvariant/src/include/Variant/SchemaLoader.h index e4edd00b..54dfe55a 100644 --- a/src/hos_libvariant/src/include/Variant/SchemaLoader.h +++ b/src/hos_libvariant/src/include/Variant/SchemaLoader.h @@ -20,10 +20,9 @@ */ #ifndef VARIANT_SCHEMALOADER_H #define VARIANT_SCHEMALOADER_H - #pragma once -#include "../../../src/include/Variant/Schema.h" +#include namespace libvariant { diff --git a/src/hos_libvariant/src/include/Variant/SharedPtr.h b/src/hos_libvariant/src/include/Variant/SharedPtr.h index ebefcef4..9fe22a68 100644 --- a/src/hos_libvariant/src/include/Variant/SharedPtr.h +++ b/src/hos_libvariant/src/include/Variant/SharedPtr.h @@ -4,9 +4,8 @@ */ #ifndef VARIANT_SHAREDPTR_H #define VARIANT_SHAREDPTR_H - #pragma once -#include "../../../include/hos_libvariant/Config.h" +#include #if defined(__GXX_EXPERIMENTAL_CXX0X) || __cplusplus >= 201103L || defined(HAVE_CXX11_SHAREDPTR) // The C++11 implementation is available diff --git a/src/hos_libvariant/src/include/Variant/Variant.h b/src/hos_libvariant/src/include/Variant/Variant.h index 3b0173e6..a01d2380 100644 --- a/src/hos_libvariant/src/include/Variant/Variant.h +++ b/src/hos_libvariant/src/include/Variant/Variant.h @@ -24,12 +24,11 @@ #ifndef VARIANT_VARIANT_H #define VARIANT_VARIANT_H - #pragma once -#include "../../../src/include/Variant/Blob.h" -#include "../../../src/include/Variant/SharedPtr.h" -#include "../../../src/include/Variant/Exceptions.h" -#include "../../../src/include/Variant/VariantInternal.h" +#include +#include +#include +#include #include #include #include diff --git a/src/hos_libvariant/src/lib/json/JSON_parser.c b/src/hos_libvariant/src/lib/json/JSON_parser.c index b70c9ae0..393b3fcd 100644 --- a/src/hos_libvariant/src/lib/json/JSON_parser.c +++ b/src/hos_libvariant/src/lib/json/JSON_parser.c @@ -56,8 +56,6 @@ SOFTWARE. -#include "../../../src/lib/json/JSON_parser.h" - #include #include #include @@ -67,6 +65,7 @@ SOFTWARE. #include #include +#include "JSON_parser.h" #ifdef _MSC_VER # if _MSC_VER >= 1400 /* Visual Studio 2005 and up */ diff --git a/src/hos_libvariant/src/src/ArgParse.cc b/src/hos_libvariant/src/src/ArgParse.cc index 0c48a15a..1b8235a4 100644 --- a/src/hos_libvariant/src/src/ArgParse.cc +++ b/src/hos_libvariant/src/src/ArgParse.cc @@ -3,8 +3,10 @@ * \brief */ -#include "../../src/include/Variant/ArgParse.h" - +#include +#include +#include +#include #include #include #include @@ -18,12 +20,8 @@ #include #include #include - -#include "../../src/include/Variant/Extensions.h" -#include "../../src/include/Variant/Path.h" -#include "../../src/include/Variant/Schema.h" -#include "../../src/src/GuessScalar.h" -#include "../../src/src/ParseBool.h" +#include "GuessScalar.h" +#include "ParseBool.h" #if 0 #define DBPRINT(x) std::cout << x diff --git a/src/hos_libvariant/src/src/Blob.cc b/src/hos_libvariant/src/src/Blob.cc index 59b9917a..3e12d552 100644 --- a/src/hos_libvariant/src/src/Blob.cc +++ b/src/hos_libvariant/src/src/Blob.cc @@ -2,8 +2,7 @@ * \author John Bridgman * \brief */ -#include "../../src/include/Variant/Blob.h" - +#include #include #include #include diff --git a/src/hos_libvariant/src/src/BundleHdrEmitter.cc b/src/hos_libvariant/src/src/BundleHdrEmitter.cc index ec791f81..d7db891f 100644 --- a/src/hos_libvariant/src/src/BundleHdrEmitter.cc +++ b/src/hos_libvariant/src/src/BundleHdrEmitter.cc @@ -2,8 +2,7 @@ * \author John Bridgman * \brief */ -#include "../../src/src/BundleHdrEmitter.h" - +#include "BundleHdrEmitter.h" #include #include #include diff --git a/src/hos_libvariant/src/src/BundleHdrEmitter.h b/src/hos_libvariant/src/src/BundleHdrEmitter.h index 277d17e1..04b1a2b2 100644 --- a/src/hos_libvariant/src/src/BundleHdrEmitter.h +++ b/src/hos_libvariant/src/src/BundleHdrEmitter.h @@ -4,10 +4,9 @@ */ #ifndef VARIANT_BUNDLEHDREMITTER_H #define VARIANT_BUNDLEHDREMITTER_H - #pragma once -#include "../../src/include/Variant/Emitter.h" -#include "../../src/include/Variant/EmitterOutput.h" +#include +#include #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/BundleHdrParser.h b/src/hos_libvariant/src/src/BundleHdrParser.h index bebc57cd..f6bf3310 100644 --- a/src/hos_libvariant/src/src/BundleHdrParser.h +++ b/src/hos_libvariant/src/src/BundleHdrParser.h @@ -4,10 +4,9 @@ */ #ifndef VARIANT_BUNDLEHDRPARSER_H #define VARIANT_BUNDLEHDRPARSER_H - #pragma once -#include "../../src/include/Variant/Parser.h" -#include "../../src/include/Variant/SharedPtr.h" +#include +#include #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/Emitter.cc b/src/hos_libvariant/src/src/Emitter.cc index e3f12963..691d0b3b 100644 --- a/src/hos_libvariant/src/src/Emitter.cc +++ b/src/hos_libvariant/src/src/Emitter.cc @@ -18,20 +18,19 @@ * \author John Bridgman * \brief */ -#include "../../src/include/Variant/Emitter.h" - -#include "../../src/src/JSONEmitter.h" +#include +#include "JSONEmitter.h" #ifdef ENABLE_YAML -#include "../../src/src/YAMLEmitter.h" +#include "YAMLEmitter.h" #endif #ifdef ENABLE_XML -#include "../../src/src/XMLPLISTEmitter.h" +#include "XMLPLISTEmitter.h" #endif #ifdef ENABLE_MSGPACK -#include "../../src/src/MsgPackEmitter.h" +#include "MsgPackEmitter.h" #endif -#include "../../src/src/BundleHdrEmitter.h" -#include "../../src/include/Variant/EmitterOutput.h" +#include "BundleHdrEmitter.h" +#include namespace libvariant { EmitterImpl::~EmitterImpl() {} diff --git a/src/hos_libvariant/src/src/EmitterOutput.cc b/src/hos_libvariant/src/src/EmitterOutput.cc index 609406c2..5645c9d1 100644 --- a/src/hos_libvariant/src/src/EmitterOutput.cc +++ b/src/hos_libvariant/src/src/EmitterOutput.cc @@ -19,8 +19,7 @@ * \brief */ -#include "../../src/include/Variant/EmitterOutput.h" - +#include #include #include #include diff --git a/src/hos_libvariant/src/src/EventBuffer.cc b/src/hos_libvariant/src/src/EventBuffer.cc index 43eb533c..49503c18 100644 --- a/src/hos_libvariant/src/src/EventBuffer.cc +++ b/src/hos_libvariant/src/src/EventBuffer.cc @@ -3,8 +3,7 @@ * \brief */ -#include "../../src/src/EventBuffer.h" - +#include "EventBuffer.h" #include #include #include diff --git a/src/hos_libvariant/src/src/EventBuffer.h b/src/hos_libvariant/src/src/EventBuffer.h index 1ef34bfb..b38a4477 100644 --- a/src/hos_libvariant/src/src/EventBuffer.h +++ b/src/hos_libvariant/src/src/EventBuffer.h @@ -4,10 +4,9 @@ */ #ifndef VARIANT_EVENTBUFFER_H #define VARIANT_EVENTBUFFER_H - #pragma once -#include "../../src/include/Variant/Emitter.h" -#include "../../src/include/Variant/Parser.h" +#include +#include #include #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/Exceptions.cc b/src/hos_libvariant/src/src/Exceptions.cc index 1669eb75..2ffe4c25 100644 --- a/src/hos_libvariant/src/src/Exceptions.cc +++ b/src/hos_libvariant/src/src/Exceptions.cc @@ -18,11 +18,9 @@ * \author John Bridgman * \brief */ -#include "../../src/include/Variant/Exceptions.h" - +#include #include - -#include "../../src/src/StackTrace.h" +#include "StackTrace.h" namespace libvariant { diff --git a/src/hos_libvariant/src/src/Extensions.cc b/src/hos_libvariant/src/src/Extensions.cc index 22203caa..35eb6a1d 100644 --- a/src/hos_libvariant/src/src/Extensions.cc +++ b/src/hos_libvariant/src/src/Extensions.cc @@ -19,15 +19,14 @@ * \brief Useful extension functions for Variants */ -#include "../../src/include/Variant/Extensions.h" - #include #include +#include +#include +#include #include #include #include -#include "../../src/include/Variant/Path.h" -#include "../../src/include/Variant/Variant.h" using namespace std; diff --git a/src/hos_libvariant/src/src/GuessFormat.cc b/src/hos_libvariant/src/src/GuessFormat.cc index 51543fc7..d37734ea 100644 --- a/src/hos_libvariant/src/src/GuessFormat.cc +++ b/src/hos_libvariant/src/src/GuessFormat.cc @@ -2,8 +2,7 @@ * \author John Bridgman * \brief */ -#include "../../src/include/Variant/GuessFormat.h" - +#include #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/GuessScalar.cc b/src/hos_libvariant/src/src/GuessScalar.cc index ccedb43d..5094271a 100644 --- a/src/hos_libvariant/src/src/GuessScalar.cc +++ b/src/hos_libvariant/src/src/GuessScalar.cc @@ -2,8 +2,7 @@ * \author John Bridgman * \brief */ -#include "../../src/src/GuessScalar.h" - +#include "GuessScalar.h" #include #include #include diff --git a/src/hos_libvariant/src/src/GuessScalar.h b/src/hos_libvariant/src/src/GuessScalar.h index 88e654c8..d610451e 100644 --- a/src/hos_libvariant/src/src/GuessScalar.h +++ b/src/hos_libvariant/src/src/GuessScalar.h @@ -4,9 +4,8 @@ */ #ifndef VARIANT_GUESSSCALAR_H #define VARIANT_GUESSSCALAR_H - #pragma once -#include "../../src/include/Variant/Parser.h" +#include namespace libvariant { void GuessScalar(const char *value, unsigned length, const char *anchor, const char *tag, ParserImpl *p, ParserActions *action); diff --git a/src/hos_libvariant/src/src/JSONEmitter.cc b/src/hos_libvariant/src/src/JSONEmitter.cc index 7b9a8ec0..9389e32b 100644 --- a/src/hos_libvariant/src/src/JSONEmitter.cc +++ b/src/hos_libvariant/src/src/JSONEmitter.cc @@ -15,8 +15,8 @@ // World Wide Web at http://www.fsf.org. //============================================================================= -#include "../../src/src/JSONEmitter.h" - +#include "JSONEmitter.h" +#include #include #include #include @@ -25,10 +25,8 @@ #include #include #include - -#include "../../src/include/Variant/EmitterOutput.h" -#include "../../src/src/Base64.h" -#include "../../src/src/BlobMagic.h" +#include "Base64.h" +#include "BlobMagic.h" using namespace std; diff --git a/src/hos_libvariant/src/src/JSONEmitter.h b/src/hos_libvariant/src/src/JSONEmitter.h index c6707089..f5a2fb14 100644 --- a/src/hos_libvariant/src/src/JSONEmitter.h +++ b/src/hos_libvariant/src/src/JSONEmitter.h @@ -20,13 +20,12 @@ */ #ifndef VARIANT_JSONEMITTER_H #define VARIANT_JSONEMITTER_H - #pragma once #include #include #include #include -#include "../../src/include/Variant/Emitter.h" +#include namespace libvariant { diff --git a/src/hos_libvariant/src/src/JSONParser.cc b/src/hos_libvariant/src/src/JSONParser.cc index 5ae0785b..9d385a83 100644 --- a/src/hos_libvariant/src/src/JSONParser.cc +++ b/src/hos_libvariant/src/src/JSONParser.cc @@ -17,9 +17,8 @@ /** \file * \author John Bridgman */ -#include "../../src/src/JSONParser.h" - -#include "../../src/src/BlobMagic.h" +#include "JSONParser.h" +#include "BlobMagic.h" namespace libvariant { diff --git a/src/hos_libvariant/src/src/MsgPackEmitter.cc b/src/hos_libvariant/src/src/MsgPackEmitter.cc index 6c679af1..447ee318 100644 --- a/src/hos_libvariant/src/src/MsgPackEmitter.cc +++ b/src/hos_libvariant/src/src/MsgPackEmitter.cc @@ -3,9 +3,8 @@ * \brief */ -#include "../../src/src/MsgPackEmitter.h" - -#include "../../src/src/BlobMagic.h" +#include "MsgPackEmitter.h" +#include "BlobMagic.h" static void msgpack_pack_string(msgpack_packer *packer, const char *str, unsigned len) { msgpack_pack_raw(packer, len); diff --git a/src/hos_libvariant/src/src/MsgPackEmitter.h b/src/hos_libvariant/src/src/MsgPackEmitter.h index 08a80877..f398e2af 100644 --- a/src/hos_libvariant/src/src/MsgPackEmitter.h +++ b/src/hos_libvariant/src/src/MsgPackEmitter.h @@ -4,14 +4,13 @@ */ #ifndef VARIANT_MSGPACK_H #define VARIANT_MSGPACK_H - #pragma once -#include "../../src/include/Variant/Variant.h" -#include "../../src/include/Variant/EmitterOutput.h" -#include "../../src/include/Variant/ParserInput.h" -#include "../../src/include/Variant/Parser.h" -#include "../../src/include/Variant/Emitter.h" -#include "../../src/src/EventBuffer.h" +#include +#include +#include +#include +#include +#include "EventBuffer.h" #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/MsgPackParser.cc b/src/hos_libvariant/src/src/MsgPackParser.cc index 636ceb00..595c9eea 100644 --- a/src/hos_libvariant/src/src/MsgPackParser.cc +++ b/src/hos_libvariant/src/src/MsgPackParser.cc @@ -3,11 +3,10 @@ * \brief */ -#include "../../src/src/MsgPackParser.h" - +#include "MsgPackParser.h" +#include "BlobMagic.h" #include #include -#include "../../src/src/BlobMagic.h" // vmpu = variant msg pack unpack diff --git a/src/hos_libvariant/src/src/MsgPackParser.h b/src/hos_libvariant/src/src/MsgPackParser.h index 6ac54e3c..be10f577 100644 --- a/src/hos_libvariant/src/src/MsgPackParser.h +++ b/src/hos_libvariant/src/src/MsgPackParser.h @@ -5,10 +5,9 @@ #ifndef VARIANT_MSGPACKPARSER_H #define VARIANT_MSGPACKPARSER_H - #pragma once -#include "../../src/include/Variant/ParserInput.h" -#include "../../src/include/Variant/Parser.h" +#include +#include #include struct vmpu_context; diff --git a/src/hos_libvariant/src/src/ParseBool.cc b/src/hos_libvariant/src/src/ParseBool.cc index c57fdfcb..c712ba4d 100644 --- a/src/hos_libvariant/src/src/ParseBool.cc +++ b/src/hos_libvariant/src/src/ParseBool.cc @@ -17,8 +17,7 @@ /** \file * \author John Bridgman */ -#include "../../src/src/ParseBool.h" - +#include "ParseBool.h" #include diff --git a/src/hos_libvariant/src/src/Parser.cc b/src/hos_libvariant/src/src/Parser.cc index a0cdb393..a554b054 100644 --- a/src/hos_libvariant/src/src/Parser.cc +++ b/src/hos_libvariant/src/src/Parser.cc @@ -19,23 +19,21 @@ * \brief */ -#include "../../src/include/Variant/Parser.h" - +#include +#include #include - -#include "../../src/include/Variant/ParserInput.h" -#include "../../src/src/JSONParser.h" +#include "JSONParser.h" #ifdef ENABLE_YAML -#include "../../src/src/YAMLParser.h" +#include "YAMLParser.h" #endif #ifdef ENABLE_XML -#include "../../src/src/XMLPLISTParser.h" +#include "XMLPLISTParser.h" #endif #ifdef ENABLE_MSGPACK -#include "../../src/src/MsgPackParser.h" +#include "MsgPackParser.h" #endif -#include "../../src/src/BundleHdrParser.h" -#include "../../src/include/Variant/GuessFormat.h" +#include "BundleHdrParser.h" +#include namespace libvariant { ParserActions::~ParserActions() {} diff --git a/src/hos_libvariant/src/src/ParserInput.cc b/src/hos_libvariant/src/src/ParserInput.cc index ff8329ca..aca5ec83 100644 --- a/src/hos_libvariant/src/src/ParserInput.cc +++ b/src/hos_libvariant/src/src/ParserInput.cc @@ -19,8 +19,7 @@ * \brief */ -#include "../../src/include/Variant/ParserInput.h" - +#include #include #include #include diff --git a/src/hos_libvariant/src/src/Path.cc b/src/hos_libvariant/src/src/Path.cc index 715fe8be..beceffe9 100644 --- a/src/hos_libvariant/src/src/Path.cc +++ b/src/hos_libvariant/src/src/Path.cc @@ -2,8 +2,7 @@ * \author John Bridgman * \brief */ -#include "../../src/include/Variant/Path.h" - +#include #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/Payload.cc b/src/hos_libvariant/src/src/Payload.cc index 8ed64df4..4787b82c 100644 --- a/src/hos_libvariant/src/src/Payload.cc +++ b/src/hos_libvariant/src/src/Payload.cc @@ -2,12 +2,11 @@ * \author John Bridgman * \brief */ -#include "../../src/include/Variant/Payload.h" - +#include +#include #include #include #include -#include "../../src/include/Variant/Path.h" #define PADDING_MOD 32 diff --git a/src/hos_libvariant/src/src/XMLPLISTEmitter.h b/src/hos_libvariant/src/src/XMLPLISTEmitter.h index 217d2711..8e27943a 100644 --- a/src/hos_libvariant/src/src/XMLPLISTEmitter.h +++ b/src/hos_libvariant/src/src/XMLPLISTEmitter.h @@ -21,9 +21,8 @@ */ #ifndef VARIANT_XMLPLISTEMITTER_H #define VARIANT_XMLPLISTEMITTER_H - #pragma once -#include "../../src/include/Variant/Emitter.h" +#include #include #include #include diff --git a/src/hos_libvariant/src/src/XMLPLISTParser.h b/src/hos_libvariant/src/src/XMLPLISTParser.h index ade5e376..6802ef0d 100644 --- a/src/hos_libvariant/src/src/XMLPLISTParser.h +++ b/src/hos_libvariant/src/src/XMLPLISTParser.h @@ -20,13 +20,12 @@ */ #ifndef VARIANT_XMLPLISTPARSER_H #define VARIANT_XMLPLISTPARSER_H - #pragma once #include #include -#include "../../src/include/Variant/Parser.h" -#include "../../src/include/Variant/ParserInput.h" -#include "../../src/include/Variant/SharedPtr.h" +#include +#include +#include namespace libvariant { diff --git a/src/hos_libvariant/src/src/YAMLEmitter.h b/src/hos_libvariant/src/src/YAMLEmitter.h index a83fc5b8..a01250d0 100644 --- a/src/hos_libvariant/src/src/YAMLEmitter.h +++ b/src/hos_libvariant/src/src/YAMLEmitter.h @@ -22,14 +22,13 @@ #ifndef YAMLEMITTER_INC #define YAMLEMITTER_INC - #pragma once #include #include #include #include #include -#include "../../src/include/Variant/Emitter.h" +#include #include #include diff --git a/src/hos_libvariant/src/src/YAMLParser.h b/src/hos_libvariant/src/src/YAMLParser.h index 351d0e87..a1d8f484 100644 --- a/src/hos_libvariant/src/src/YAMLParser.h +++ b/src/hos_libvariant/src/src/YAMLParser.h @@ -23,11 +23,10 @@ #ifndef YAMLPARSER_INC #define YAMLPARSER_INC - #pragma once -#include "../../src/include/Variant/Parser.h" -#include "../../src/include/Variant/ParserInput.h" -#include "../../src/include/Variant/SharedPtr.h" +#include +#include +#include #include namespace libvariant { diff --git a/src/hos_libvariant/src/src/gen-argparse-schema b/src/hos_libvariant/src/src/gen-argparse-schema old mode 100644 new mode 100755 diff --git a/src/hos_libvariant/src/src/gen-json-schema b/src/hos_libvariant/src/src/gen-json-schema old mode 100644 new mode 100755 diff --git a/src/hos_libvariant/src/test/TestCommon.h b/src/hos_libvariant/src/test/TestCommon.h index 110c5b2e..f710b510 100644 --- a/src/hos_libvariant/src/test/TestCommon.h +++ b/src/hos_libvariant/src/test/TestCommon.h @@ -4,12 +4,11 @@ */ #ifndef TESTCOMMON_H #define TESTCOMMON_H - #pragma once -#include "../../src/src/EventBuffer.h" -#include "../../src/include/Variant/Variant.h" -#include "../../src/include/Variant/Parser.h" -#include "../../src/include/Variant/Emitter.h" +#include "EventBuffer.h" +#include +#include +#include #include #include #include diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile deleted file mode 100644 index a4899796..00000000 --- a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -TARGETS := $(patsubst %.yaml,%.test,$(wildcard *.yaml)) - -tests: $(TARGETS) - - -%.test: %.yaml - python -c "import json; import yaml; import sys; json.dump(yaml.load(sys.stdin), sys.stdout);" < $< > $@ - diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile new file mode 120000 index 00000000..b261c621 --- /dev/null +++ b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/02-numeric/Makefile @@ -0,0 +1 @@ +../submakefile \ No newline at end of file diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile deleted file mode 100644 index a4899796..00000000 --- a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -TARGETS := $(patsubst %.yaml,%.test,$(wildcard *.yaml)) - -tests: $(TARGETS) - - -%.test: %.yaml - python -c "import json; import yaml; import sys; json.dump(yaml.load(sys.stdin), sys.stdout);" < $< > $@ - diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile new file mode 120000 index 00000000..b261c621 --- /dev/null +++ b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/03-strings/Makefile @@ -0,0 +1 @@ +../submakefile \ No newline at end of file diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile deleted file mode 100644 index a4899796..00000000 --- a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -TARGETS := $(patsubst %.yaml,%.test,$(wildcard *.yaml)) - -tests: $(TARGETS) - - -%.test: %.yaml - python -c "import json; import yaml; import sys; json.dump(yaml.load(sys.stdin), sys.stdout);" < $< > $@ - diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile new file mode 120000 index 00000000..b261c621 --- /dev/null +++ b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/04-arrays/Makefile @@ -0,0 +1 @@ +../submakefile \ No newline at end of file diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile deleted file mode 100644 index a4899796..00000000 --- a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -TARGETS := $(patsubst %.yaml,%.test,$(wildcard *.yaml)) - -tests: $(TARGETS) - - -%.test: %.yaml - python -c "import json; import yaml; import sys; json.dump(yaml.load(sys.stdin), sys.stdout);" < $< > $@ - diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile new file mode 120000 index 00000000..b261c621 --- /dev/null +++ b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/05-objects/Makefile @@ -0,0 +1 @@ +../submakefile \ No newline at end of file diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile deleted file mode 100644 index a4899796..00000000 --- a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -TARGETS := $(patsubst %.yaml,%.test,$(wildcard *.yaml)) - -tests: $(TARGETS) - - -%.test: %.yaml - python -c "import json; import yaml; import sys; json.dump(yaml.load(sys.stdin), sys.stdout);" < $< > $@ - diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile new file mode 120000 index 00000000..b261c621 --- /dev/null +++ b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/06-combinations/Makefile @@ -0,0 +1 @@ +../submakefile \ No newline at end of file diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile deleted file mode 100644 index a4899796..00000000 --- a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -TARGETS := $(patsubst %.yaml,%.test,$(wildcard *.yaml)) - -tests: $(TARGETS) - - -%.test: %.yaml - python -c "import json; import yaml; import sys; json.dump(yaml.load(sys.stdin), sys.stdout);" < $< > $@ - diff --git a/src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile new file mode 120000 index 00000000..b261c621 --- /dev/null +++ b/src/hos_libvariant/src/test/test_schema_data/tv4-tests/07-ref/Makefile @@ -0,0 +1 @@ +../submakefile \ No newline at end of file diff --git a/src/hos_philips_hue/nodes/test.py b/src/hos_philips_hue/nodes/test.py index 4bd2b161..173324ab 100755 --- a/src/hos_philips_hue/nodes/test.py +++ b/src/hos_philips_hue/nodes/test.py @@ -42,7 +42,7 @@ if __name__ == '__main__': msg_body["color"]["type"] = "core/types/color/command" msg_body["color"]["colormode"] = "hs" # msg_body["color"]["set"] = [300] - msg_body["color"]["set"] = [1.0, 1.0] + msg_body["color"]["set"] = [0.5, 1.0] msg_body["alert"] = dict() msg_body["alert"]["type"] = "hue/huelight/command/alert" diff --git a/src/hos_philips_hue/python/hos_huecontroller/huecontroller.py b/src/hos_philips_hue/python/hos_huecontroller/huecontroller.py index 0cdcc645..0a19aaa6 100644 --- a/src/hos_philips_hue/python/hos_huecontroller/huecontroller.py +++ b/src/hos_philips_hue/python/hos_huecontroller/huecontroller.py @@ -33,7 +33,7 @@ class HueController(object): self.cmd_topic = rospy.get_param('~cmd_topic', "/hos/devices/cmd") self.hos_update_topic = rospy.get_param('~hos_update_topic', "/hos/status/updates") self.loop_frequency = rospy.get_param('~loop_frequency', 100) - self.statusmsg_interval = rospy.get_param('~statusmsg_interval', 3000) + self.statusmsg_interval = rospy.get_param('~statusmsg_interval', 6000000) self.bridge_ip = rospy.get_param('~bridge_ip', "192.168.168.90") self.bridge_secret = rospy.get_param('~bridge_secret', "matzman666") self.device_name_base = rospy.get_param('~device_name_base', "huelight") @@ -204,6 +204,9 @@ class HueController(object): light.light.setStateAttr("transitiontime", value["transitiontime"]) light.light.commitStateAttrs() light.light.refreshAttrs() + stamp = rospy.get_rostime() + self.statusPublisher.publish(self.createStatusMsg(light.light, light.name, self.msg_sequence, stamp)) + self.msg_sequence += 1 def deviceStatusCallback(self): @@ -226,11 +229,31 @@ class HueController(object): status_timer += 1 rate.sleep() # Remove devices from device repository + del_devices = list() for key in self.lights: light = self.lights[key] + del_devices.append(light.name) key_base = "/hos/devices/repository/" + light.name print "Remove device " + light.name + " from repository" rospy.delete_param(key_base) + updMsg = HosStatusUpdate() + stamp = rospy.get_rostime() + updMsg.stamp = stamp + updMsg.tags.append("devices") + updBody = dict() + updBody["type"] = "core/msgs/hosstatusupdate" + updBody["devices"] = dict() + updBody["devices"]["type"] = "core/msgs/hosstatusupdate/devices"; + updBody["devices"]["removed"] = del_devices + + msg_schema = self.schemaProvider.getTypeSchema("core/msgs/hosstatusupdate") + validator = load(msg_schema, provider=self.schemaProvider) + validator.validate(updBody) + + updMsg.msg_body = json.dumps(updBody) + sleep(1) # Apparently we need to wait before we can send messages + self.hosUpdatePublisher.publish(updMsg) + sleep(2) \ No newline at end of file