Files
flippr-code/FlippR-Driver/src/input/InputDriverFactory.cpp
2018-11-23 13:46:09 +01:00

86 lines
2.7 KiB
C++

/*
* InputDriverFactory.cpp
*
* Created on: Jun 14, 2018
* Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert
*/
#include "InputDriverFactory.h"
#include "utility/config.h"
#include "utility/LoggerFactory.h"
#include "InputDriver.h"
#include "EventNotifier.h"
using namespace nlohmann;
using namespace flippR_driver::utility;
namespace flippR_driver
{
namespace input
{
std::shared_ptr<IInputDriver> InputDriverFactory::get_InputDriver(std::istream &input_config_stream, std::istream &matrix_config_stream)
{
LoggerFactory::CreateInputLogger();
IBlockingQueue<Event> *event_queue = new BlockingQueue<Event>;
json matrix_config;
matrix_config_stream >> matrix_config;
std::shared_ptr<IEventNotifier> event_notifier(new EventNotifier(event_queue));
std::vector<std::shared_ptr<DistributingEvent>> events;
std::map<std::string, std::shared_ptr<Event>> name_event_map;
create_input_events(matrix_config, events, name_event_map, event_notifier);
std::unique_ptr<IInputGPIOInterface> input_gpio_interface(new InputGPIOInterface(input_config_stream));
std::unique_ptr<IDetector> detector(
new Detector(std::move(input_gpio_interface), events));
return std::shared_ptr<InputDriver>(new InputDriver(event_notifier, std::move(detector), name_event_map));
}
void InputDriverFactory::create_input_events(json matrix_config, std::vector<std::shared_ptr<DistributingEvent>>& events,
std::map<std::string, std::shared_ptr<Event>>& name_event_map,
std::shared_ptr<IEventNotifier> event_notifier)
{
int global_bounce_time = matrix_config.at("global_bounce_time").get<json::number_integer_t>();
auto& event_array = matrix_config.at("input_matrix");
for (auto &json_event : event_array)
{
try
{
std::string name = json_event.at("name");
char address = json_event.at("address").get<json::number_integer_t>();
int priority = json_event.at("priority").get<json::number_integer_t>();
int bounce_time = global_bounce_time;
auto it_bounce_time = json_event.find("bounce_time");
if (it_bounce_time != json_event.end())
{
bounce_time = it_bounce_time->get<json::number_integer_t>();
}
std::shared_ptr<DistributingEvent> event_ptr(new DistributingEvent(address, priority, name,
std::chrono::milliseconds(bounce_time), event_notifier));
events.push_back(event_ptr);
name_event_map.emplace(name, event_ptr);
}
catch (json::exception &e)
{
CLOG(ERROR, INPUT_LOGGER) << "Matrix config-file corrupted: " << e.what();
exit(EXIT_FAILURE);
}
}
}
}
}