/* * LampFactory.cpp * * Created on: December 28, 2019 * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert */ #include #include #include "LampFactory.h" #include "output/items/detail/Lamp.h" namespace flippR_driver { namespace output { LampFactory::LampFactory(nlohmann::json &object, std::shared_ptr pin_controller) : ItemFactory{object, pin_controller} { this->set_address_pins(); this->set_mux_pins(); auto controller = std::dynamic_pointer_cast(this->pin_controller); auto data_pin = this->get_address_pin(this->object.at(config_path::data_pin)); controller->set_data_pin(data_pin); auto run_pin = this->get_address_pin(this->object.at(config_path::run_pin)); controller->set_run_pin(run_pin); } std::map> LampFactory::getItemMap() { auto lamps = this->object.at(config_path::lamps_path); std::map> lamp_map; for (auto lamp : lamps) { auto name = lamp.at(config_path::item_name).get(); auto address = lamp.at(config_path::item_address).get(); auto extender = lamp.at(config_path::item_extender).get(); auto pin_base = this->get_extender_pin_base(extender); auto lamp_item = std::make_shared(std::static_pointer_cast(this->pin_controller), address + pin_base, name); lamp_map.emplace(name, lamp_item); } return lamp_map; } void LampFactory::set_address_pins() { auto address_pins = this->object.at(config_path::address_pins); std::array pins; pins.at(0) = this->get_address_pin(address_pins.at("A0")); pins.at(1) = this->get_address_pin(address_pins.at("A1")); pins.at(2) = this->get_address_pin(address_pins.at("A2")); std::dynamic_pointer_cast(this->pin_controller)->set_address_pins(pins); } uint8_t LampFactory::get_address_pin(nlohmann::json & pin_object) { auto address = pin_object.at(config_path::item_address).get(); auto extender = pin_object.at(config_path::item_extender).get(); auto pin_base = this->get_extender_pin_base(extender); return address + pin_base; } void LampFactory::set_mux_pins() { auto address_pins = this->object.at(config_path::enable_pins); std::array pins; for(int i = 1; i < 14; i++) { pins.at(i) = this->get_address_pin(address_pins.at("E" + std::string{i})); } std::dynamic_pointer_cast(this->pin_controller)->set_mux_pins(pins); } } }