changed pointer stuff

This commit is contained in:
Neeflix
2018-08-08 11:16:19 +02:00
parent 0c08b940f3
commit 844847edca
12 changed files with 56 additions and 36 deletions

View File

@@ -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<Event> get_event(std::string name) = 0;
};
}

View File

@@ -15,7 +15,7 @@
namespace Input
{
Detector::Detector(std::unique_ptr<IInputGPIOInterface> input_gpio_interface, std::map<char, Event> events, std::shared_ptr<IEventNotifier> event_notifier) :
Detector::Detector(std::unique_ptr<IInputGPIOInterface> input_gpio_interface, std::map<char, std::shared_ptr<Event>> events, std::shared_ptr<IEventNotifier> 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;
}
}

View File

@@ -31,7 +31,7 @@ class Detector : public IDetector
{
public:
Detector(std::unique_ptr<IInputGPIOInterface> input_gpio_interface, std::map<char, Event> events, std::shared_ptr<IEventNotifier> event_notifier);
Detector(std::unique_ptr<IInputGPIOInterface> input_gpio_interface, std::map<char, std::shared_ptr<Event>> events, std::shared_ptr<IEventNotifier> event_notifier);
~Detector();
private:
@@ -41,7 +41,7 @@ private:
private:
std::unique_ptr<IInputGPIOInterface> input_gpio_interface;
std::map<char, Event> events;
std::map<char, std::shared_ptr<Event>> events;
std::shared_ptr<IEventNotifier> event_notifier;

View File

@@ -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> event)
{
this->event_queue->push(event);
this->event_queue->push(*event);
}
void EventNotifier::notify()

View File

@@ -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> event);
private:
void notify();

View File

@@ -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> event) = 0;
};
}

View File

@@ -9,22 +9,37 @@
namespace Input
{
InputDriver::InputDriver(std::shared_ptr<IEventNotifier> event_notifier, std::unique_ptr<IDetector> detector) :
event_notifier(event_notifier), detector(std::move(detector))
InputDriver::InputDriver(std::shared_ptr<IEventNotifier> event_notifier, std::unique_ptr<IDetector> detector, std::map<std::string, std::shared_ptr<Event>> 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<Event> InputDriver::get_event(std::string name)
{
std::shared_ptr<Event> 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;
}
}

View File

@@ -20,13 +20,17 @@ class InputDriver : public IInputDriver
public:
InputDriver(std::shared_ptr<IEventNotifier> event_notifier, std::unique_ptr<IDetector> detector);
InputDriver(std::shared_ptr<IEventNotifier> event_notifier, std::unique_ptr<IDetector> detector, std::map<std::string, std::shared_ptr<Event>> events);
virtual void register_event_handler(IEventHandler* handler) override;
virtual void unregister_event_handler(IEventHandler* handler) override;
virtual std::shared_ptr<Event> get_event(std::string name);
private:
std::shared_ptr<IEventNotifier> event_notifier;
std::unique_ptr<IDetector> detector;
std::map<std::string, std::shared_ptr<Event>> events;
};
}

View File

@@ -21,27 +21,24 @@ std::shared_ptr<InputDriver> InputDriverFactory::get_InputDriver(std::istream& i
LoggerFactory::CreateInputLogger();
IBlockingQueue<Event>* event_queue = new BlockingQueue<Event>;
std::shared_ptr<IEventNotifier> event_notifier = std::make_shared<EventNotifier>(event_queue);
std::unique_ptr<IInputGPIOInterface> input_gpio_interface = std::make_unique<InputGPIOInterface>(input_config_stream);
std::unique_ptr<IDetector> detector(std::move(get_detector(matrix_config_stream, std::move(input_gpio_interface), event_notifier)));
return std::shared_ptr<InputDriver>(new InputDriver(event_notifier, std::move(detector)));
}
std::unique_ptr<IDetector> InputDriverFactory::get_detector(std::istream& matrix_config_stream, std::unique_ptr<IInputGPIOInterface> input_gpio_interface, std::shared_ptr<IEventNotifier> event_notifier)
{
json matrix_config;
matrix_config_stream >> matrix_config;
std::map<char, Event> input_events = create_input_events(matrix_config);
std::map<char, std::shared_ptr<Event>> address_event_map;
std::map<std::string, std::shared_ptr<Event>> name_event_map;
create_input_events(matrix_config, address_event_map, name_event_map);
return std::unique_ptr<Detector>(new Detector(std::move(input_gpio_interface), input_events, event_notifier));
std::shared_ptr<IEventNotifier> event_notifier = std::make_shared<EventNotifier>(event_queue);
std::unique_ptr<IInputGPIOInterface> input_gpio_interface = std::make_unique<InputGPIOInterface>(input_config_stream);
std::unique_ptr<IDetector> detector(new Detector(std::move(input_gpio_interface), address_event_map, event_notifier));
return std::shared_ptr<InputDriver>(new InputDriver(event_notifier, std::move(detector), name_event_map));
}
std::map<char, Event> InputDriverFactory::create_input_events(json matrix_config)
{
std::map<char, Event> events;
void InputDriverFactory::create_input_events(json matrix_config, std::map<char, std::shared_ptr<Event>> address_event_map, std::map<std::string, std::shared_ptr<Event>> name_event_map)
{
for(auto& json_event : matrix_config)
{
@@ -52,8 +49,10 @@ std::map<char, Event> InputDriverFactory::create_input_events(json matrix_config
int priority = json_event.at("priority").get<json::number_integer_t>();
Event event(address, priority, name);
std::shared_ptr event_ptr = std::make_shared<Event>(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<char, Event> InputDriverFactory::create_input_events(json matrix_config
exit(EXIT_FAILURE);
}
}
return events;
}

View File

@@ -31,9 +31,9 @@ class InputDriverFactory
public:
static std::shared_ptr<InputDriver> get_InputDriver(std::istream& input_config_stream, std::istream& matrix_config_stream);
private:
static std::unique_ptr<IDetector> get_detector(std::istream& matrix_config_stream, std::unique_ptr<IInputGPIOInterface> input_gpio_interface, std::shared_ptr<IEventNotifier> event_notifier);
static std::map<char, Event> create_input_events(nlohmann::json matrix_config);
static void create_input_events(nlohmann::json matrix_config, std::map<char, std::shared_ptr<Event>> address_event_map, std::map<std::string, std::shared_ptr<Event>> name_event_map);
static void ConfigureLogger();
};
}

View File

@@ -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);

View File

@@ -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"