diff --git a/FlippR-Driver/include/IInputDriver.h b/FlippR-Driver/include/IInputDriver.h index 0739ee9..0b57627 100644 --- a/FlippR-Driver/include/IInputDriver.h +++ b/FlippR-Driver/include/IInputDriver.h @@ -19,6 +19,8 @@ public: virtual ~IInputDriver(){}; virtual void register_event_handler(IEventHandler* handler) = 0; virtual void unregister_event_handler(IEventHandler* handler) = 0; + + virtual std::shared_ptr get_event(std::string name) = 0; }; } diff --git a/FlippR-Driver/src/input/Detector.cpp b/FlippR-Driver/src/input/Detector.cpp index 746f1a9..bf8b66a 100644 --- a/FlippR-Driver/src/input/Detector.cpp +++ b/FlippR-Driver/src/input/Detector.cpp @@ -15,7 +15,7 @@ namespace Input { -Detector::Detector(std::unique_ptr input_gpio_interface, std::map events, std::shared_ptr event_notifier) : +Detector::Detector(std::unique_ptr input_gpio_interface, std::map> events, std::shared_ptr event_notifier) : input_gpio_interface(std::move(input_gpio_interface)), events(events), is_running(true), event_notifier(event_notifier) { this->detect_thread = std::thread(&Detector::detect, this); @@ -40,7 +40,7 @@ void Detector::detect() { try { - Event& event = events.at(address); + auto event = events.at(address); event_notifier->distribute_event(event); } catch(std::out_of_range& e) @@ -64,6 +64,4 @@ bool Detector::check_inputs(char& address) return false; } - - } diff --git a/FlippR-Driver/src/input/Detector.h b/FlippR-Driver/src/input/Detector.h index 57b1d91..79d9d9b 100644 --- a/FlippR-Driver/src/input/Detector.h +++ b/FlippR-Driver/src/input/Detector.h @@ -31,7 +31,7 @@ class Detector : public IDetector { public: - Detector(std::unique_ptr input_gpio_interface, std::map events, std::shared_ptr event_notifier); + Detector(std::unique_ptr input_gpio_interface, std::map> events, std::shared_ptr event_notifier); ~Detector(); private: @@ -41,7 +41,7 @@ private: private: std::unique_ptr input_gpio_interface; - std::map events; + std::map> events; std::shared_ptr event_notifier; diff --git a/FlippR-Driver/src/input/EventNotifier.cpp b/FlippR-Driver/src/input/EventNotifier.cpp index 1a24e32..85373da 100644 --- a/FlippR-Driver/src/input/EventNotifier.cpp +++ b/FlippR-Driver/src/input/EventNotifier.cpp @@ -47,9 +47,9 @@ void EventNotifier::unregister_event_handler(IEventHandler* handler) this->event_handlers.erase(handler); } -void EventNotifier::distribute_event(Event& event) +void EventNotifier::distribute_event(std::shared_ptr event) { - this->event_queue->push(event); + this->event_queue->push(*event); } void EventNotifier::notify() diff --git a/FlippR-Driver/src/input/EventNotifier.h b/FlippR-Driver/src/input/EventNotifier.h index 440a580..eb11532 100644 --- a/FlippR-Driver/src/input/EventNotifier.h +++ b/FlippR-Driver/src/input/EventNotifier.h @@ -34,7 +34,7 @@ public: void register_event_handler(IEventHandler* handler); void unregister_event_handler(IEventHandler* handler); - void distribute_event(Event& event); + void distribute_event(std::shared_ptr event); private: void notify(); diff --git a/FlippR-Driver/src/input/IEventNotifier.h b/FlippR-Driver/src/input/IEventNotifier.h index 265a047..5183513 100644 --- a/FlippR-Driver/src/input/IEventNotifier.h +++ b/FlippR-Driver/src/input/IEventNotifier.h @@ -22,7 +22,7 @@ public: virtual void register_event_handler(IEventHandler* handler) = 0; virtual void unregister_event_handler(IEventHandler* handler) = 0; - virtual void distribute_event(Event& event) = 0; + virtual void distribute_event(std::shared_ptr event) = 0; }; } diff --git a/FlippR-Driver/src/input/InputDriver.cpp b/FlippR-Driver/src/input/InputDriver.cpp index 9b67ac8..f6910eb 100644 --- a/FlippR-Driver/src/input/InputDriver.cpp +++ b/FlippR-Driver/src/input/InputDriver.cpp @@ -9,22 +9,37 @@ namespace Input { -InputDriver::InputDriver(std::shared_ptr event_notifier, std::unique_ptr detector) : - event_notifier(event_notifier), detector(std::move(detector)) +InputDriver::InputDriver(std::shared_ptr event_notifier, std::unique_ptr detector, std::map> events) : + event_notifier(event_notifier), + detector(std::move(detector)), + events(events) { CLOG(INFO, INPUT_LOGGER) << "Created InputDriver"; } void InputDriver::register_event_handler(IEventHandler* handler) { - event_notifier->register_event_handler(handler); + this->event_notifier->register_event_handler(handler); } void InputDriver::unregister_event_handler(IEventHandler* handler) { - event_notifier->unregister_event_handler(handler); + this->event_notifier->unregister_event_handler(handler); } +std::shared_ptr InputDriver::get_event(std::string name) +{ + std::shared_ptr event; + try + { + event = this->events.at(name); + } + catch(std::out_of_range& e) + { + CLOG_N_TIMES(1, WARNING, OUTPUT_LOGGER) << "Did not found event " << name << " please check config file!"; + } + + return event; +} } - diff --git a/FlippR-Driver/src/input/InputDriver.h b/FlippR-Driver/src/input/InputDriver.h index 0ec45ef..010e08d 100644 --- a/FlippR-Driver/src/input/InputDriver.h +++ b/FlippR-Driver/src/input/InputDriver.h @@ -20,13 +20,17 @@ class InputDriver : public IInputDriver public: - InputDriver(std::shared_ptr event_notifier, std::unique_ptr detector); + InputDriver(std::shared_ptr event_notifier, std::unique_ptr detector, std::map> events); virtual void register_event_handler(IEventHandler* handler) override; virtual void unregister_event_handler(IEventHandler* handler) override; + virtual std::shared_ptr get_event(std::string name); + private: std::shared_ptr event_notifier; std::unique_ptr detector; + + std::map> events; }; } diff --git a/FlippR-Driver/src/input/InputDriverFactory.cpp b/FlippR-Driver/src/input/InputDriverFactory.cpp index 8fd8d1b..e59d440 100644 --- a/FlippR-Driver/src/input/InputDriverFactory.cpp +++ b/FlippR-Driver/src/input/InputDriverFactory.cpp @@ -21,27 +21,24 @@ std::shared_ptr InputDriverFactory::get_InputDriver(std::istream& i LoggerFactory::CreateInputLogger(); IBlockingQueue* event_queue = new BlockingQueue; - std::shared_ptr event_notifier = std::make_shared(event_queue); - std::unique_ptr input_gpio_interface = std::make_unique(input_config_stream); - std::unique_ptr detector(std::move(get_detector(matrix_config_stream, std::move(input_gpio_interface), event_notifier))); - return std::shared_ptr(new InputDriver(event_notifier, std::move(detector))); -} - -std::unique_ptr InputDriverFactory::get_detector(std::istream& matrix_config_stream, std::unique_ptr input_gpio_interface, std::shared_ptr event_notifier) -{ json matrix_config; matrix_config_stream >> matrix_config; - std::map input_events = create_input_events(matrix_config); + std::map> address_event_map; + std::map> name_event_map; + create_input_events(matrix_config, address_event_map, name_event_map); - return std::unique_ptr(new Detector(std::move(input_gpio_interface), input_events, event_notifier)); + std::shared_ptr event_notifier = std::make_shared(event_queue); + std::unique_ptr input_gpio_interface = std::make_unique(input_config_stream); + std::unique_ptr detector(new Detector(std::move(input_gpio_interface), address_event_map, event_notifier)); + + return std::shared_ptr(new InputDriver(event_notifier, std::move(detector), name_event_map)); } -std::map InputDriverFactory::create_input_events(json matrix_config) -{ - std::map events; +void InputDriverFactory::create_input_events(json matrix_config, std::map> address_event_map, std::map> name_event_map) +{ for(auto& json_event : matrix_config) { @@ -52,8 +49,10 @@ std::map InputDriverFactory::create_input_events(json matrix_config int priority = json_event.at("priority").get(); Event event(address, priority, name); + std::shared_ptr event_ptr = std::make_shared(event); - events.emplace(address, event); + address_event_map.emplace(address, event_ptr); + name_event_map.emplace(name, event_ptr); } catch(json::exception& e) { @@ -61,8 +60,6 @@ std::map InputDriverFactory::create_input_events(json matrix_config exit(EXIT_FAILURE); } } - - return events; } diff --git a/FlippR-Driver/src/input/InputDriverFactory.h b/FlippR-Driver/src/input/InputDriverFactory.h index 8899a0d..d8f670d 100644 --- a/FlippR-Driver/src/input/InputDriverFactory.h +++ b/FlippR-Driver/src/input/InputDriverFactory.h @@ -31,9 +31,9 @@ class InputDriverFactory public: static std::shared_ptr get_InputDriver(std::istream& input_config_stream, std::istream& matrix_config_stream); + private: - static std::unique_ptr get_detector(std::istream& matrix_config_stream, std::unique_ptr input_gpio_interface, std::shared_ptr event_notifier); - static std::map create_input_events(nlohmann::json matrix_config); + static void create_input_events(nlohmann::json matrix_config, std::map> address_event_map, std::map> name_event_map); static void ConfigureLogger(); }; } diff --git a/FlippR-Driver/src/utilities/LoggerFactory.hpp b/FlippR-Driver/src/utilities/LoggerFactory.hpp index adaf1a5..b0f0a30 100644 --- a/FlippR-Driver/src/utilities/LoggerFactory.hpp +++ b/FlippR-Driver/src/utilities/LoggerFactory.hpp @@ -33,7 +33,7 @@ namespace LoggerFactory conf.setToDefault(); conf.set(el::Level::Global, el::ConfigurationType::ToFile, "true"); - conf.set(el::Level::Global, el::ConfigurationType::Filename, INPUT_LOGGER_FILE); + conf.set(el::Level::Global, el::ConfigurationType::Filename, LOGGER_FILE); conf.set(el::Level::Global, el::ConfigurationType::Format, "%datetime [%level] [%func] : %msg"); el::Loggers::reconfigureLogger(INPUT_LOGGER, conf); diff --git a/FlippR-Driver/src/utilities/config.h b/FlippR-Driver/src/utilities/config.h index b4c106e..9277ba9 100644 --- a/FlippR-Driver/src/utilities/config.h +++ b/FlippR-Driver/src/utilities/config.h @@ -8,7 +8,11 @@ #include "easylogging++.h" #define INPUT_LOGGER "driver_logger" -#define INPUT_LOGGER_FILE "input_driver.log" +#define OUTPUT_LOGGER "output_logger" + +#define LOGGER_FILE "input_driver.log" + + #define DRIVER_CONF_FILE "/var/log/flippr_driver.conf"