diff --git a/src/prog/domod/builders/cmake/CMakeLists.txt b/src/prog/domod/builders/cmake/CMakeLists.txt index fdf77765..51f18d6c 100644 --- a/src/prog/domod/builders/cmake/CMakeLists.txt +++ b/src/prog/domod/builders/cmake/CMakeLists.txt @@ -26,7 +26,7 @@ file( # ubus models ${workspaceRoot}/src/prog/domod/src/ubus/capabilities-controller.cpp - ${workspaceRoot}/src/prog/domod/src/ubus/outlets-controller.cpp + ${workspaceRoot}/src/prog/domod/src/ubus/devices-controller.cpp ${workspaceRoot}/src/prog/domod/src/ubus/shutters-controller.cpp ${workspaceRoot}/src/prog/domod/src/ubus/sprinklers-controller.cpp ${workspaceRoot}/src/prog/domod/src/ubus/sequences-controller.cpp diff --git a/src/prog/domod/src/devices/devices-manager.cpp b/src/prog/domod/src/devices/devices-manager.cpp index 8421b71b..2a1d5f67 100644 --- a/src/prog/domod/src/devices/devices-manager.cpp +++ b/src/prog/domod/src/devices/devices-manager.cpp @@ -168,6 +168,14 @@ std::string DevicesManager::get(const std::string &a_capability, uint32_t an_id) { the_device = m_outlets[an_id]; } + else if (a_capability == kShutterEntry) + { + the_device = m_shutters[an_id]; + } + else if (a_capability == kSprinklerEntry) + { + the_device = m_sprinklers[an_id]; + } if (the_device != NULL) { @@ -246,8 +254,16 @@ int DevicesManager::create(const std::string &a_capability, struct json_object * { return create_outlet(a_node); } + else if (a_capability == kShutterEntry) + { + return create_shutter(a_node); + } + else if (a_capability == kSprinklerEntry) + { + return create_sprinkler(a_node); + } - return 0; + return -1; } /*! ---------------------------------------------------------------------------- @@ -274,8 +290,16 @@ int DevicesManager::update(const std::string &a_capability, struct json_object * { return m_outlets.update(the_id, a_node); } + else if (a_capability == kShutterEntry) + { + return m_shutters.update(the_id, a_node); + } + else if (a_capability == kSprinklerEntry) + { + return m_sprinklers.update(the_id, a_node); + } - return 0; + return -1; } /*! ---------------------------------------------------------------------------- @@ -302,6 +326,16 @@ int DevicesManager::del(const std::string &a_capability, struct json_object *a_n { return m_outlets.remove(the_id); } + else if (a_capability == kShutterEntry) + { + return m_shutters.remove(the_id); + } + else if (a_capability == kSprinklerEntry) + { + return m_sprinklers.remove(the_id); + } + + return 0; } @@ -386,6 +420,28 @@ int DevicesManager::load_shutters(struct json_object *a_node) return 0; } +/*! ---------------------------------------------------------------------------- + * @fn create_shutter + * + * @brief create a new Shutter Object From a Json Node. + */ +int DevicesManager::create_shutter(struct json_object *a_node) +{ + Shutter* the_shutter = new Shutter; + + if (the_shutter->from_json(a_node) != 0) + { + delete the_shutter; + return -1; + } + + the_shutter->set_id(m_shutters.get_new_id()); + + m_shutters.add(the_shutter); + + return 0; +} + /*! ---------------------------------------------------------------------------- * @fn load_sprinklers @@ -415,3 +471,25 @@ int DevicesManager::load_sprinklers(struct json_object *a_node) return 0; } + +/*! ---------------------------------------------------------------------------- + * @fn create_sprinkler + * + * @brief create a new Sprinklers Object From a Json Node. + */ +int DevicesManager::create_sprinkler(struct json_object *a_node) +{ + Sprinkler* the_sprinkler = new Sprinkler; + + if (the_sprinkler->from_json(a_node) != 0) + { + delete the_sprinkler; + return -1; + } + + the_sprinkler->set_id(m_sprinklers.get_new_id()); + + m_sprinklers.add(the_sprinkler); + + return 0; +} diff --git a/src/prog/domod/src/devices/devices-manager.h b/src/prog/domod/src/devices/devices-manager.h index c3d26d1f..364f6f6c 100644 --- a/src/prog/domod/src/devices/devices-manager.h +++ b/src/prog/domod/src/devices/devices-manager.h @@ -66,7 +66,10 @@ private: int create_outlet(struct json_object *a_node); int load_shutters(struct json_object *a_node); + int create_shutter(struct json_object *a_node); + int load_sprinklers(struct json_object *a_node); + int create_sprinkler(struct json_object *a_node); private: std::string m_file_path; diff --git a/src/prog/domod/src/main.cpp b/src/prog/domod/src/main.cpp index 5daede13..7fd87274 100644 --- a/src/prog/domod/src/main.cpp +++ b/src/prog/domod/src/main.cpp @@ -41,11 +41,12 @@ extern "C" { #include "devices/devices-manager.h" #include "ubus/capabilities-controller.h" -#include "ubus/outlets-controller.h" +#include "ubus/devices-controller.h" #include "ubus/shutters-controller.h" #include "ubus/sprinklers-controller.h" #include "ubus/sequences-controller.h" +#include "domo.h" /*-------------------------------- DEFINES ---------------------------------*/ @@ -151,9 +152,9 @@ int main(int argc, char *argv[]) /* Setup the UBus Models. */ CapabilitiesController the_capabilities(the_config_path + "./capabilities.json"); - OutletsController the_outlets(&the_devices_manager); - ShuttersController the_shutters(&the_devices_manager); - SprinklersController the_sprinklers(&the_devices_manager); + DevicesController the_outlets(&the_devices_manager, kOutletEntry, "domo.outlets"); + ShuttersController the_shutters(&the_devices_manager, kShutterEntry, "domo.shutters"); + SprinklersController the_sprinklers(&the_devices_manager, kSprinklerEntry, "domo.sprinklers"); SequencesController the_sequences(&the_sequences_manager); /* Setup the Ubus context. */ diff --git a/src/prog/domod/src/ubus/outlets-controller.cpp b/src/prog/domod/src/ubus/devices-controller.cpp similarity index 68% rename from src/prog/domod/src/ubus/outlets-controller.cpp rename to src/prog/domod/src/ubus/devices-controller.cpp index fe70604f..cb7cb20e 100644 --- a/src/prog/domod/src/ubus/outlets-controller.cpp +++ b/src/prog/domod/src/ubus/devices-controller.cpp @@ -35,41 +35,51 @@ extern "C" { #include "devices/devices-manager.h" -#include "domo.h" - -#include "outlets-controller.h" +#include "devices-controller.h" namespace { using namespace UBus; -static ObjectType gLightsControllerUbus_types( - "OutletsController", - Method("create", UBUS_CPP(OutletsController, create)), - Method("list", UBUS_CPP(OutletsController, list)), - Method("read", UBUS_CPP(OutletsController, read), Int32Arg("id")), - Method("update", UBUS_CPP(OutletsController, update), Int32Arg("id")), - Method("delete", UBUS_CPP(OutletsController, del), Int32Arg("id")) +static ObjectType gDeviceControllerUbus_types( + "DeviceController", + Method("create", UBUS_CPP(DevicesController, create)), + Method("list", UBUS_CPP(DevicesController, list)), + Method("read", UBUS_CPP(DevicesController, read), Int32Arg("id")), + Method("update", UBUS_CPP(DevicesController, update), Int32Arg("id")), + Method("delete", UBUS_CPP(DevicesController, remove), Int32Arg("id")) ); } /*! ---------------------------------------------------------------------------- - * @fn OutletsController + * @fn DevicesController * * @brief Constructor of the Outlets Controller. */ -OutletsController::OutletsController(DevicesManager *a_device_manager) : UBusObject(gLightsControllerUbus_types, "domo.outlets"), - m_devices_manager(a_device_manager) +DevicesController::DevicesController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name) : UBusObject(gDeviceControllerUbus_types, a_service_name.c_str()), + m_devices_manager(a_device_manager), + m_capability(a_cap) { } /*! ---------------------------------------------------------------------------- - * @fn ~OutletsController + * @fn DevicesController + * + * @brief Constructor of the Outlets Controller. + */ +DevicesController::DevicesController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name, ubus_object_type &anObjType) : UBusObject(anObjType, a_service_name.c_str()), + m_devices_manager(a_device_manager), + m_capability(a_cap) +{ +} + +/*! ---------------------------------------------------------------------------- + * @fn ~DevicesController * * @brief Destructor of the Outlets Controller. */ -OutletsController::~OutletsController(void) +DevicesController::~DevicesController(void) { } @@ -79,7 +89,7 @@ OutletsController::~OutletsController(void) * * @brief Create a new Outlet Object. */ -int OutletsController::create(struct ubus_context *, struct ubus_request_data *, struct blob_attr *a_msg) +int DevicesController::create(struct ubus_context *, struct ubus_request_data *, struct blob_attr *a_msg) { char *the_string; struct json_object *the_root_node; @@ -96,7 +106,7 @@ int OutletsController::create(struct ubus_context *, struct ubus_request_data *, return UBUS_STATUS_INVALID_ARGUMENT; } - if (m_devices_manager->create(kOutletEntry, the_root_node) < 0) + if (m_devices_manager->create(m_capability, the_root_node) < 0) { fprintf(stderr, "Failed to create a new light.\n"); return UBUS_STATUS_INVALID_ARGUMENT; @@ -110,7 +120,7 @@ int OutletsController::create(struct ubus_context *, struct ubus_request_data *, * * @brief List all the outlets */ -int OutletsController::list(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *) +int DevicesController::list(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *) { int the_result; struct blob_buf the_buf = {0}; @@ -118,7 +128,7 @@ int OutletsController::list(struct ubus_context *a_ctx, struct ubus_request_data blob_buf_init(&the_buf, 0); - blobmsg_add_json_from_string(&the_buf, m_devices_manager->get(kOutletEntry).c_str()); + blobmsg_add_json_from_string(&the_buf, m_devices_manager->get(m_capability).c_str()); the_result = ubus_send_reply(a_ctx, a_req, the_buf.head); @@ -132,7 +142,7 @@ int OutletsController::list(struct ubus_context *a_ctx, struct ubus_request_data * * @brief Read a specific outlet object. */ -int OutletsController::read(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) +int DevicesController::read(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { uint32_t the_id, the_result; struct blob_buf the_buf = {0}; @@ -146,7 +156,7 @@ int OutletsController::read(struct ubus_context *a_ctx, struct ubus_request_data // printf ("update id: %d\n", the_id); blob_buf_init(&the_buf, 0); - blobmsg_add_json_from_string(&the_buf, m_devices_manager->get(kOutletEntry, the_id).c_str()); + blobmsg_add_json_from_string(&the_buf, m_devices_manager->get(m_capability, the_id).c_str()); the_result = ubus_send_reply(a_ctx, a_req, the_buf.head); @@ -160,7 +170,7 @@ int OutletsController::read(struct ubus_context *a_ctx, struct ubus_request_data * * @brief Update a specific outlet. */ -int OutletsController::update(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) +int DevicesController::update(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { char *the_string; struct json_object *the_root_node; @@ -177,7 +187,7 @@ int OutletsController::update(struct ubus_context *a_ctx, struct ubus_request_da return UBUS_STATUS_INVALID_ARGUMENT; } - if (m_devices_manager->update(kOutletEntry, the_root_node) < 0) + if (m_devices_manager->update(m_capability, the_root_node) < 0) { fprintf(stderr, "Failed to update the state.\n"); return UBUS_STATUS_INVALID_ARGUMENT; @@ -193,7 +203,7 @@ int OutletsController::update(struct ubus_context *a_ctx, struct ubus_request_da * * @brief delete a specific outlet. */ -int OutletsController::del(struct ubus_context *, struct ubus_request_data *, struct blob_attr *a_msg) +int DevicesController::remove(struct ubus_context *, struct ubus_request_data *, struct blob_attr *a_msg) { char *the_string; struct json_object *the_root_node; @@ -210,7 +220,7 @@ int OutletsController::del(struct ubus_context *, struct ubus_request_data *, st return UBUS_STATUS_INVALID_ARGUMENT; } - if (m_devices_manager->del(kOutletEntry, the_root_node) < 0) + if (m_devices_manager->del(m_capability, the_root_node) < 0) { fprintf(stderr, "Failed to update the state.\n"); return UBUS_STATUS_INVALID_ARGUMENT; diff --git a/src/prog/domod/src/ubus/outlets-controller.h b/src/prog/domod/src/ubus/devices-controller.h similarity index 73% rename from src/prog/domod/src/ubus/outlets-controller.h rename to src/prog/domod/src/ubus/devices-controller.h index 944ac18a..e9c25d9c 100644 --- a/src/prog/domod/src/ubus/outlets-controller.h +++ b/src/prog/domod/src/ubus/devices-controller.h @@ -23,11 +23,12 @@ * */ -#ifndef _UBUS_OUTLETS_CONTROLLER_H -#define _UBUS_OUTLETS_CONTROLLER_H +#ifndef _UBUS_DEVICES_CONTROLLER_H +#define _UBUS_DEVICES_CONTROLLER_H /*------------------------------- INCLUDES ----------------------------------*/ +#include #include #include @@ -38,21 +39,22 @@ class DevicesManager; /*--------------------------------- CLASS ----------------------------------*/ -class OutletsController : public UBusObject +class DevicesController : public UBusObject { - public: - OutletsController(DevicesManager *a_device_manager); - ~OutletsController(void); + DevicesController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name); + DevicesController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name, ubus_object_type &anObjType); + ~DevicesController(void); int create(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int list(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int read(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int update(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); - int del(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); + int remove(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); - private: + protected: DevicesManager *m_devices_manager; + std::string m_capability; }; -#endif /* _UBUS_OUTLETS_CONTROLLER_H */ +#endif /* _UBUS_DEVICES_CONTROLLER_H */ diff --git a/src/prog/domod/src/ubus/shutters-controller.cpp b/src/prog/domod/src/ubus/shutters-controller.cpp index 925c9a96..50f14946 100644 --- a/src/prog/domod/src/ubus/shutters-controller.cpp +++ b/src/prog/domod/src/ubus/shutters-controller.cpp @@ -48,7 +48,7 @@ static ObjectType gShuttersControllerUbus_types( Method("list", UBUS_CPP(ShuttersController, list)), Method("read", UBUS_CPP(ShuttersController, read), Int32Arg("id")), Method("update", UBUS_CPP(ShuttersController, update), Int32Arg("id")), - Method("delete", UBUS_CPP(ShuttersController, del), Int32Arg("id")), + Method("delete", UBUS_CPP(ShuttersController, remove), Int32Arg("id")), Method("up", UBUS_CPP(ShuttersController, up)), Method("down", UBUS_CPP(ShuttersController, down)) @@ -60,8 +60,7 @@ static ObjectType gShuttersControllerUbus_types( * * @brief Constructor of the UBus Mixer Volume. */ -ShuttersController::ShuttersController(DevicesManager *a_device_manager) : UBusObject(gShuttersControllerUbus_types, "domo.shutters"), - m_devices_manager(a_device_manager) +ShuttersController::ShuttersController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name) : DevicesController(a_device_manager, a_cap, a_service_name, gShuttersControllerUbus_types) { } @@ -74,71 +73,29 @@ ShuttersController::~ShuttersController(void) { } - -/*! ---------------------------------------------------------------------------- - * @fn create - * - * @brief Create a new Sequence Object. - */ -int ShuttersController::create(struct ubus_context *, struct ubus_request_data *, struct blob_attr *) +int ShuttersController::create(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { - printf("%s\n", __PRETTY_FUNCTION__); - return 0; + return DevicesController::create(a_ctx, a_req, a_msg); } -/*! ---------------------------------------------------------------------------- - * @fn list - * - * @brief List all the sequences - */ -int ShuttersController::list(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *) +int ShuttersController::list(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { - int the_result; - struct blob_buf the_buf = {0}; - printf("%s\n", __PRETTY_FUNCTION__); - - blob_buf_init(&the_buf, 0); - - blobmsg_add_json_from_string(&the_buf, m_devices_manager->get(kShutterEntry).c_str()); - - the_result = ubus_send_reply(a_ctx, a_req, the_buf.head); - - blob_buf_free(&the_buf); - - return the_result; + return DevicesController::list(a_ctx, a_req, a_msg); } -/*! ---------------------------------------------------------------------------- - * @fn read - * - * @brief Read a specific sequence object. - */ -int ShuttersController::read(struct ubus_context *, struct ubus_request_data *, struct blob_attr *) +int ShuttersController::read(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { - printf("%s\n", __PRETTY_FUNCTION__); - return 0; + return DevicesController::read(a_ctx, a_req, a_msg); } -/*! ---------------------------------------------------------------------------- - * @fn update - * - * @brief Update a specific sequence. - */ -int ShuttersController::update(struct ubus_context *, struct ubus_request_data *, struct blob_attr *) +int ShuttersController::update(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { - printf("%s\n", __PRETTY_FUNCTION__); - return 0; + return DevicesController::update(a_ctx, a_req, a_msg); } -/*! ---------------------------------------------------------------------------- - * @fn del - * - * @brief delete a specific sequence. - */ -int ShuttersController::del(struct ubus_context *, struct ubus_request_data *, struct blob_attr *) +int ShuttersController::remove(struct ubus_context *a_ctx, struct ubus_request_data *a_req, struct blob_attr *a_msg) { - printf("%s\n", __PRETTY_FUNCTION__); - return 0; + return DevicesController::remove(a_ctx, a_req, a_msg); } /*! ---------------------------------------------------------------------------- diff --git a/src/prog/domod/src/ubus/shutters-controller.h b/src/prog/domod/src/ubus/shutters-controller.h index 91e002aa..6eb8956e 100644 --- a/src/prog/domod/src/ubus/shutters-controller.h +++ b/src/prog/domod/src/ubus/shutters-controller.h @@ -23,14 +23,14 @@ * */ -#ifndef _UBUS_SHUTTERS_MODEL_H -#define _UBUS_SHUTTERS_MODEL_H +#ifndef _UBUS_SHUTTERS_CONTROLLER_H +#define _UBUS_SHUTTERS_CONTROLLER_H /*------------------------------- INCLUDES ----------------------------------*/ #include -#include +#include "devices-controller.h" /*--------------------------------- Define ----------------------------------*/ @@ -38,23 +38,21 @@ class DevicesManager; /*--------------------------------- CLASS ----------------------------------*/ -class ShuttersController : public UBusObject +class ShuttersController : public DevicesController { public: - ShuttersController(DevicesManager *a_device_manager); + ShuttersController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name); ~ShuttersController(void); int create(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int list(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int read(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int update(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); - int del(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); - + int remove(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); + int up(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); int down(struct ubus_context *, struct ubus_request_data *, struct blob_attr *); - private: - DevicesManager *m_devices_manager; }; -#endif /* _UBUS_CAPABILITIES_SHUTTERS_MODEL_H */ +#endif /* _UBUS_SHUTTERS_CONTROLLER_H */ diff --git a/src/prog/domod/src/ubus/sprinklers-controller.cpp b/src/prog/domod/src/ubus/sprinklers-controller.cpp index 91e136a8..e48dafe6 100644 --- a/src/prog/domod/src/ubus/sprinklers-controller.cpp +++ b/src/prog/domod/src/ubus/sprinklers-controller.cpp @@ -51,6 +51,7 @@ static ObjectType gSprinklersControllerUbus_types( Method("read", UBUS_CPP(SprinklersController, read), Int32Arg("id")), Method("update", UBUS_CPP(SprinklersController, update), Int32Arg("id")), Method("delete", UBUS_CPP(SprinklersController, del), Int32Arg("id")), + Method("open", UBUS_CPP(SprinklersController, open), Int32Arg("id")), Method("close", UBUS_CPP(SprinklersController, close), Int32Arg("id")) ); @@ -61,7 +62,7 @@ static ObjectType gSprinklersControllerUbus_types( * * @brief Constructor of the UBus Sprinkler controller. */ -SprinklersController::SprinklersController(DevicesManager *a_device_manager) : UBusObject(gSprinklersControllerUbus_types, "domo.sprinklers"), +SprinklersController::SprinklersController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name) : UBusObject(gSprinklersControllerUbus_types, a_service_name.c_str()), m_devices_manager(a_device_manager) { } diff --git a/src/prog/domod/src/ubus/sprinklers-controller.h b/src/prog/domod/src/ubus/sprinklers-controller.h index ebea522c..b160be26 100644 --- a/src/prog/domod/src/ubus/sprinklers-controller.h +++ b/src/prog/domod/src/ubus/sprinklers-controller.h @@ -42,7 +42,7 @@ class SprinklersController : public UBusObject { public: - SprinklersController(DevicesManager *a_device_manager); + SprinklersController(DevicesManager *a_device_manager, const std::string &a_cap, const std::string &a_service_name); ~SprinklersController(void); int create(struct ubus_context *, struct ubus_request_data *, struct blob_attr *);