/* * InputDriverFactory.cpp * * Created on: Jun 14, 2018 * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert, Rafael Vinci, Dr. Franca Rupprecht */ #include "InputDriverFactory.h" #include "utilities/LoggerFactory.hpp" #include "EventNotifier.h" using namespace nlohmann; namespace Input { std::shared_ptr InputDriverFactory::get_InputDriver(std::istream& input_config_stream, std::istream& matrix_config_stream) { ConfigureLogger(); 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); return std::unique_ptr(new Detector(std::move(input_gpio_interface), input_events, event_notifier)); } std::map InputDriverFactory::create_input_events(json matrix_config) { std::map events; for(auto& json_event : matrix_config) { try { std::string name = json_event.at("name"); char address = json_event.at("address").get(); int priority = json_event.at("priority").get(); Event event(address, priority, name); events.emplace(address, event); } catch(json::exception& e) { CLOG(ERROR, INPUT_LOGGER) << "Matrix config-file corrupted: " << e.what(); exit(EXIT_FAILURE); } } return events; } void InputDriverFactory::ConfigureLogger() { LoggerFactory::CreateInputLogger(); } }