diff --git a/FlippR-Driver/include/Event.h b/FlippR-Driver/include/Event.h index 4d615c2..081f2e0 100644 --- a/FlippR-Driver/include/Event.h +++ b/FlippR-Driver/include/Event.h @@ -10,7 +10,7 @@ #include #include - +#include namespace FlippR_Driver { namespace Input { diff --git a/FlippR-Driver/src/input/Detector.cpp b/FlippR-Driver/src/input/Detector.cpp index 86d7b2b..cf401fc 100644 --- a/FlippR-Driver/src/input/Detector.cpp +++ b/FlippR-Driver/src/input/Detector.cpp @@ -17,7 +17,7 @@ namespace FlippR_Driver 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); @@ -44,7 +44,8 @@ void Detector::detect() { auto event = events.at(address); CLOG(DEBUG, INPUT_LOGGER) << "Found event " << event->name << "(" << std::to_string(event->address) << ")."; - event_notifier->distribute_event(event); + + event->distribute(); } catch(std::out_of_range& e) { diff --git a/FlippR-Driver/src/input/Detector.h b/FlippR-Driver/src/input/Detector.h index 03c6357..f2b77b8 100644 --- a/FlippR-Driver/src/input/Detector.h +++ b/FlippR-Driver/src/input/Detector.h @@ -21,7 +21,7 @@ #include "utilities/IInputGPIOInterface.h" #include "IDetector.h" -#include "Event.h" +#include "DistributingEvent.h" #include "IEventNotifier.h" namespace FlippR_Driver @@ -33,7 +33,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: @@ -43,7 +43,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/DistributingEvent.cpp b/FlippR-Driver/src/input/DistributingEvent.cpp new file mode 100644 index 0000000..84c9139 --- /dev/null +++ b/FlippR-Driver/src/input/DistributingEvent.cpp @@ -0,0 +1,19 @@ +// +// Created by rhetenor on 21.09.18. +// + +#include "DistributingEvent.h" + +void FlippR_Driver::Input::DistributingEvent::distribute() +{ + std::chrono::milliseconds elapsed_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - last_activation); + if(elapsed_time > deactivation_time) + { + event_notifier->distribute_event(std::shared_ptr(this)); // todo why new shared ptr? + } +} + +FlippR_Driver::Input::DistributingEvent::DistributingEvent(char address, int priority, std::string name, + std::chrono::milliseconds deactivation_time, std::shared_ptr event_notifier) + : Event(address, priority, name), deactivation_time(deactivation_time), event_notifier(event_notifier) +{} diff --git a/FlippR-Driver/src/input/DistributingEvent.h b/FlippR-Driver/src/input/DistributingEvent.h new file mode 100644 index 0000000..85e7b15 --- /dev/null +++ b/FlippR-Driver/src/input/DistributingEvent.h @@ -0,0 +1,35 @@ +// +// Created by rhetenor on 21.09.18. +// + +#ifndef FLIPPR_DRIVER_DISTRIBUTINGEVENT_H +#define FLIPPR_DRIVER_DISTRIBUTINGEVENT_H + +#include "Event.h" +#include "IEventNotifier.h" + +namespace FlippR_Driver +{ +namespace Input +{ +class DistributingEvent : public Event +{ +public: + DistributingEvent(char address, int priority, std::string name, + std::chrono::milliseconds deactivation_time, std::shared_ptr event_notifier); + + void distribute(); + +public: + std::chrono::milliseconds deactivation_time; + +private: + std::shared_ptr event_notifier; + std::chrono::time_point last_activation; + + +}; +} +} + +#endif //FLIPPR_DRIVER_DISTRIBUTINGEVENT_H diff --git a/FlippR-Driver/src/input/InputDriverFactory.cpp b/FlippR-Driver/src/input/InputDriverFactory.cpp index b761c31..b391954 100644 --- a/FlippR-Driver/src/input/InputDriverFactory.cpp +++ b/FlippR-Driver/src/input/InputDriverFactory.cpp @@ -45,7 +45,8 @@ std::shared_ptr InputDriverFactory::get_InputDriver(std::istream & void InputDriverFactory::create_input_events(json matrix_config, std::map>& address_event_map, - std::map>& name_event_map) + std::map>& name_event_map, + std::shared_ptr event_notifier) { auto& event_array = matrix_config.at("input_matrix"); for (auto &json_event : event_array) @@ -56,8 +57,10 @@ void InputDriverFactory::create_input_events(json matrix_config, std::map(); int priority = json_event.at("priority").get(); + int deactivation_time = json_event.at("deactivation_time_milli").get(); - std::shared_ptr event_ptr(new Event(address, priority, name)); + std::shared_ptr event_ptr(new DistributingEvent(address, priority, name, + std::chrono::milliseconds(deactivation_time), event_notifier)); address_event_map.emplace(address, event_ptr); name_event_map.emplace(name, event_ptr); diff --git a/FlippR-Driver/src/input/InputDriverFactory.h b/FlippR-Driver/src/input/InputDriverFactory.h index a309a9e..ea8a7ca 100644 --- a/FlippR-Driver/src/input/InputDriverFactory.h +++ b/FlippR-Driver/src/input/InputDriverFactory.h @@ -29,7 +29,10 @@ public: static std::shared_ptr get_InputDriver(std::istream& input_config_stream, std::istream& matrix_config_stream); private: - static void create_input_events(nlohmann::json matrix_config, std::map>& address_event_map, std::map>& name_event_map); + static void create_input_events(nlohmann::json matrix_config, + std::map>& address_event_map, + std::map>& name_event_map, + std::shared_ptr event_notifier); }; } }