diff --git a/FlippR-Driver/contrib/json_example/output/Lamp_Config.json b/FlippR-Driver/contrib/json_example/output/Lamp_Config.json index adb447b..62fe8a2 100644 --- a/FlippR-Driver/contrib/json_example/output/Lamp_Config.json +++ b/FlippR-Driver/contrib/json_example/output/Lamp_Config.json @@ -1,5 +1,5 @@ { - "port_extender" : + "port_extenders" : [ "name" : "extender_1", "i2c_address" : 33, diff --git a/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json b/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json index 2751157..8aa8039 100644 --- a/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json +++ b/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json @@ -45,22 +45,5 @@ "C" : 7 } - }, - "sound_board" : - { - "i2c_address" : 33, - "pin_base" : 81, - "fire" : 7, - "sound_address_select" : - { - "A" : 0, - "B" : 1, - "C" : 2, - "D" : 3, - "E" : 4, - "F" : 5, - "G" : 6 - } } - } diff --git a/FlippR-Driver/contrib/json_example/output/Sound_Config.json b/FlippR-Driver/contrib/json_example/output/Sound_Config.json index e3122ff..a722c89 100644 --- a/FlippR-Driver/contrib/json_example/output/Sound_Config.json +++ b/FlippR-Driver/contrib/json_example/output/Sound_Config.json @@ -1,146 +1,185 @@ { "deactivation_time_milliseconds" : 10, + "port_extenders" : + [ + "name" : "extender_0", + "i2c_address" : 33, + "pin_base" : 81 + ], + "fire_pin" : + { + "address" : 7, + "extender" : "extender_0" + }, "sounds" : [ { "id" : 0, "address" : "22", - "description" : "Sound 1" + "description" : "Sound 1", + "extender" : "extender_0" }, { "id" : 1, "address" : "23", - "description" : "Sound 2" + "description" : "Sound 2", + "extender" : "extender_0" }, { "id" : 2, "address" : "24", - "description" : "Sound 3" + "description" : "Sound 3", + "extender" : "extender_0" }, { "id" : 3, "address" : "25", - "description" : "Sound 4" + "description" : "Sound 4", + "extender" : "extender_0" }, { "id" : 4, "address" : "26", - "description" : "Sound 5" + "description" : "Sound 5", + "extender" : "extender_0" }, { "id" : 5, "address" : "27", - "description" : "Sound 6" + "description" : "Sound 6", + "extender" : "extender_0" }, { "id" : 6, "address" : "28", - "description" : "Sound 7" + "description" : "Sound 7", + "extender" : "extender_0" }, { "id" : 7, "address" : "29", - "description" : "Sound 8" + "description" : "Sound 8", + "extender" : "extender_0" }, { "id" : 8, "address" : "30", - "description" : "Sound 9" + "description" : "Sound 9", + "extender" : "extender_0" }, { "id" : 9, "address" : "31", - "description" : "Sound 10" + "description" : "Sound 10", + "extender" : "extender_0" }, { "id" : 10, "address" : "32", - "description" : "Sound 11" + "description" : "Sound 11", + "extender" : "extender_0" }, { "id" : 11, "address" : "33", - "description" : "Sound 12" + "description" : "Sound 12", + "extender" : "extender_0" }, { "id" : 12, "address" : "34", - "description" : "Sound 13" + "description" : "Sound 13", + "extender" : "extender_0" }, { "id" : 13, "address" : "35", - "description" : "Sound 14" + "description" : "Sound 14", + "extender" : "extender_0" }, { "id" : 14, "address" : "36", - "description" : "Sound 15" + "description" : "Sound 15", + "extender" : "extender_0" }, { "id" : 15, "address" : "37", - "description" : "Sound 16" + "description" : "Sound 16", + "extender" : "extender_0" }, { "id" : 16, "address" : "38", - "description" : "Sound 17" + "description" : "Sound 17", + "extender" : "extender_0" }, { "id" : 17, "address" : "39", - "description" : "Sound 18" + "description" : "Sound 18", + "extender" : "extender_0" }, { "id" : 18, "address" : "40", - "description" : "Sound 19" + "description" : "Sound 19", + "extender" : "extender_0" }, { "id" : 19, "address" : "41", - "description" : "Sound 20" + "description" : "Sound 20", + "extender" : "extender_0" }, { "id" : 20, "address" : "42", - "description" : "Sound 21" + "description" : "Sound 21", + "extender" : "extender_0" }, { "id" : 21, "address" : "43", - "description" : "Sound 22" + "description" : "Sound 22", + "extender" : "extender_0" }, { "id" : 22, "address" : "44", - "description" : "Sound 23" + "description" : "Sound 23", + "extender" : "extender_0" }, { "id" : 23, "address" : "45", - "description" : "Sound 24" + "description" : "Sound 24", + "extender" : "extender_0" }, { "id" : 24, "address" : "46", - "description" : "Sound 25" + "description" : "Sound 25", + "extender" : "extender_0" }, { "id" : 25, "address" : "47", - "description" : "Sound 26" + "description" : "Sound 26", + "extender" : "extender_0" }, { "id" : 26, "address" : "48", - "description" : "Sound 27" + "description" : "Sound 27", + "extender" : "extender_0" }, { "id" : 27, "address" : "49", - "description" : "Sound 28" + "description" : "Sound 28", + "extender" : "extender_0" }, { "id" : 28, @@ -149,4 +188,4 @@ } ] -} \ No newline at end of file +} diff --git a/FlippR-Driver/src/output/OutputDriverFactory.cpp b/FlippR-Driver/src/output/OutputDriverFactory.cpp index 97d9b19..7038331 100644 --- a/FlippR-Driver/src/output/OutputDriverFactory.cpp +++ b/FlippR-Driver/src/output/OutputDriverFactory.cpp @@ -2,19 +2,16 @@ // Created by rhetenor on 04.10.18. // + + #include "OutputDriverFactory.h" - -#include -#include - #include "utility/LoggerFactory.h" #include "output/detail/OutputDriver.h" #include "output/detail/DisplayController.h" #include "output/detail/DisplayBoardPinController.h" -#include "output/detail/DriverBoardPinController.h" #include "output/detail/SoundBoardPinController.h" #include "output/items/detail/EightDigitDisplay.h" @@ -29,14 +26,13 @@ namespace output namespace OutputDriverFactory { - using namespace nlohmann; std::shared_ptr get_OutputDriver(std::istream& output_pin_config, - std::istream& solenoid_config, - std::istream& lamp_config, - std::istream& sound_config, - std::istream& display_config) + std::istream& solenoid_config, + std::istream& lamp_config, + std::istream& sound_config, + std::istream& display_config) { utility::LoggerFactory::CreateOutputLogger(); @@ -45,379 +41,235 @@ std::shared_ptr get_OutputDriver(std::istream& output_pin_config, json output_config; output_pin_config >> output_config; - json driver_board_config = output_config.at("driver_board"); - std::shared_ptr driver_board_pin_controller(new detail::DriverBoardPinController(output_pin_mutex)); + + std::shared_ptr driver_board_pin_controller(new DriverBoardPinController(output_pin_mutex)); auto solenoids = create_solenoids(solenoid_config, driver_board_pin_controller); + //TODO create flippers auto lamps = create_lamps(lamp_config, driver_board_pin_controller); - json sound_board_config = output_config.at("sound_board"); - std::shared_ptr sound_board_pin_controller(new detail::SoundBoardPinController(parse_pins_sound_board(sound_board_config), output_pin_mutex)); + uint8_t sound_fire_address = get_sound_fire_address(sound_config); + std::shared_ptr sound_board_pin_controller(new detail::SoundBoardPinController(output_pin_mutex, sound_fire_address)); auto sounds = create_sounds(sound_config, sound_board_pin_controller); - json display_board_config = output_config.at("display_board"); - std::unique_ptr display_board_pin_controller(new detail::DisplayBoardPinController(parse_pins_display_board(display_board_config))); - auto displays = create_displays(display_config); - - std::unique_ptr display_controller(new detail::DisplayController(displays, std::move(display_board_pin_controller))); - - auto display_map = map_displays(displays); - - return std::make_shared(std::move(display_controller), solenoids, lamps, sounds, display_map); +// json display_board_config = output_config.at("display_board"); +// std::unique_ptr display_board_pin_controller(new detail::DisplayBoardPinController(parse_pins_display_board(display_board_config))); +// auto displays = create_displays(display_config); +// +// std::unique_ptr display_controller(new detail::DisplayController(displays, std::move(display_board_pin_controller))); +// +// auto display_map = map_displays(displays); +// +// return std::make_shared(std::move(display_controller), solenoids, lamps, sounds, display_map); +// return std::make_shared(NULL, NULL, NULL, NULL, NULL); } -std::map parse_pins_sound_board(json &sound_board_config) +std::map> create_solenoids(std::istream & solenoid_config, std::shared_ptr &pin_controller) { - std::map pins_sound; - try - { - pins_sound["i2c_address"] = sound_board_config.at("i2c_address").get(); - pins_sound["pin_base"] = sound_board_config.at("pin_base").get(); - pins_sound["fire"] = sound_board_config.at("fire").get(); - - json sound_address = sound_board_config.at("sound_address_select"); - pins_sound["A"] = sound_address.at("A").get(); - pins_sound["B"] = sound_address.at("B").get(); - pins_sound["C"] = sound_address.at("C").get(); - pins_sound["D"] = sound_address.at("D").get(); - pins_sound["E"] = sound_address.at("E").get(); - pins_sound["F"] = sound_address.at("F").get(); - pins_sound["G"] = sound_address.at("G").get(); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output pin config file at sound_board corrupted: " << e.what(); - exit(EXIT_FAILURE); - } - return pins_sound; -} - -std::map parse_pins_display_board(json &display_board_config) -{ - std::map pins_display; - try - { - pins_display["run"] = display_board_config.at("run"); - - json display_select = display_board_config.at("display_select"); - for(json::iterator it = display_select.begin(); it != display_select.end(); it++) - { - pins_display["display_select" + it.key()] = it.value().get(); - } - - json segment_select = display_board_config.at("segment_select"); - pins_display["segment_select_A"] = segment_select.at("A").get(); - pins_display["segment_select_B"] = segment_select.at("B").get(); - pins_display["segment_select_C"] = segment_select.at("C").get(); - - json digit_select = display_board_config.at("digit_select"); - pins_display["digit_select_A"] = digit_select.at("A").get(); - pins_display["digit_select_B"] = digit_select.at("B").get(); - pins_display["digit_select_C"] = digit_select.at("C").get(); - pins_display["digit_select_D"] = digit_select.at("D").get(); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output pin config file at display_board corrupted: " << e.what(); - exit(EXIT_FAILURE); - } - - return pins_display; -} - -std::map> create_solenoids(std::istream &solenoid_config, std::shared_ptr &output_gpio_interface) -{ - std::map> solenoids; - json solenoid_config_json; solenoid_config >> solenoid_config_json; - auto deactivation_time = get_deactivation_time(solenoid_config_json); + json port_extenders = get_element("port_extenders", solenoid_config_json, ""); - initialize_port_extenders(solenoid_config_json, output_gpio_interface); + initialize_port_extenders(port_extenders, pin_controller.get(), "solenoid_config.json"); - json solenoids_json; - - try - { - solenoids_json = solenoid_config_json.at("solenoids"); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output solenoids config file corrupted: Key \"solenoids\" of type array needed. \n" << e.what(); - exit(EXIT_FAILURE); - } + json solenoids_json = get_element("solenoids", solenoid_config_json, "solenoid_config.json"); + std::chrono::milliseconds deactivation_time{ get_value("deactivation_time_milliseconds", solenoid_config_json, "solenoid_config.json") }; + std::map> solenoids; for(auto &solenoid_json : solenoids_json) { - auto solenoid = create_solenoid(solenoid_json, output_gpio_interface, deactivation_time); + auto solenoid = create_solenoid(solenoid_json, port_extenders, pin_controller, deactivation_time); solenoids.emplace(solenoid->get_name(), solenoid); } - return solenoids; } -std::map> create_flippers(std::istream &flipper_config, std::shared_ptr &output_gpio_interface) +std::shared_ptr create_solenoid(nlohmann::json &solenoid_json, nlohmann::json &port_extenders, std::shared_ptr &pin_controller, std::chrono::milliseconds deactivation_time) { - std::map> flippers; + std::string config_file_name = "solenoid_config.json"; - json flipper_config_json; - flipper_config >> flipper_config_json; + uint8_t pin_base = get_pin_base(solenoid_json, port_extenders, config_file_name); - json flippers_json; - - try - { - flippers_json = flipper_config_json.at("flippers"); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output solenoids config file corrupted: Key \"flippers\" of type array needed. \n" << e.what(); - exit(EXIT_FAILURE); - } - - for(auto &flipper_json : flippers_json) - { - auto flipper = create_flipper(flipper_json, output_gpio_interface); - flippers.emplace(flipper->get_name(), flipper); - } - - return flippers; -} - -std::shared_ptr create_flipper(nlohmann::json &flipper_json, std::shared_ptr &pin_controller) -{ - try - { - std::string name = flipper_json.at("name"); - auto address = flipper_json.at("address").get(); - - return std::make_shared(pin_controller, address, name); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output solenoid config file corrupted: " << e.what(); - exit(EXIT_FAILURE); - } -} - - -std::map> create_lamps(std::istream &lamp_config, std::shared_ptr &output_gpio_interface) -{ - //TODO initialize portextender - std::map> lamps; - - json lamp_config_json; - lamp_config >> lamp_config_json; - - json lamps_json; - - try - { - lamps_json = lamp_config_json.at("lamps"); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output lamp config file corrupted: Key \"lamps\" of type array needed. \n" << e.what(); - exit(EXIT_FAILURE); - } - - for(auto &lamp_json : lamps_json) - { - auto lamp = create_lamp(lamp_json, output_gpio_interface); - lamps.emplace(lamp->get_name(), lamp); - } - - return lamps; -} - -std::map> create_sounds(std::istream &sound_config, std::shared_ptr &output_gpio_interface) -{ - std::map> sounds; - - json sounds_config_json; - sound_config >> sounds_config_json; - - auto deactivation_time = get_deactivation_time(sounds_config_json); - - json sounds_json; - - try - { - sounds_json = sounds_config_json.at("sounds"); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output sound config file corrupted: Key \"sounds\" of type array needed. \n" << e.what(); - exit(EXIT_FAILURE); - } - - for(auto &sound_json : sounds_json) - { - auto sound = create_sound(sound_json, output_gpio_interface, deactivation_time); - sounds.emplace(sound->Item::get_name(), sound); - } - - return sounds; -} - -void initialize_port_extenders(nlohmann::json &json_stream, std::shared_ptr &pin_controller) -{ - json port_extenders; - - try - { - port_extenders = json_stream.at("port_extenders"); - } - catch (json::exception & e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output solenoids config file corrupted: Key \"port_extenders\" of type array needed. \n" << e.what(); - exit(EXIT_FAILURE); - } - - for (auto & extender_json : port_extenders) - { - pin_controller->initialize_port_expander(extender_json.at("i2c_address").get(), extender_json.at("pin_base").get()); - } -} - -std::chrono::milliseconds get_deactivation_time(nlohmann::json &json) -{ - try - { - auto deactivation_time = json.at("deactivation_time_milliseconds").get(); - return std::chrono::milliseconds(deactivation_time); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output config file at deactivation_time_milliseconds corrupted: " << e.what(); - exit(EXIT_FAILURE); - } -} - -std::shared_ptr create_solenoid(nlohmann::json &solenoid_json, std::shared_ptr &pin_controller, std::chrono::milliseconds &deactivation_time) -{ - try - { - uint8_t address = 0; - if(solenoid_json.find("extender") != solenoid_json.end()) - { - address += solenoid_json.at("extender").get(); - } - - std::string name = solenoid_json.at("name"); - address += solenoid_json.at("address").get(); + auto name = get_value("name", solenoid_json, config_file_name); + auto address = get_value("address", solenoid_json, config_file_name); if(solenoid_json.find("deactivation_time_milliseconds") != solenoid_json.end()) { - deactivation_time = get_deactivation_time(solenoid_json); + deactivation_time = std::chrono::milliseconds(get_value("deactivation_time_milliseconds", solenoid_json, config_file_name)); } - - return std::make_shared(pin_controller, address, name, deactivation_time); - } - catch(json::exception &e) + + return std::make_shared(pin_controller, address, pin_base, name, deactivation_time); +} + +std::map> create_flippers(std::istream &solenoid_config, std::shared_ptr &pin_controller) +{ + json solenoid_config_json; + solenoid_config >> solenoid_config_json; + + json port_extenders = get_element("port_extenders", solenoid_config_json, "solenoid_config.json"); + + json flippers_json = get_element("flippers", solenoid_config_json, "solenoid_config.json"); + std::chrono::milliseconds deactivation_time{ get_value("deactivation_time_milliseconds", solenoid_config_json, "solenoid_config.json") }; + + std::map> flippers; + for(auto &flipper_json : flippers_json) { - CLOG(ERROR, OUTPUT_LOGGER) << "Output solenoid config file corrupted: " << e.what(); - exit(EXIT_FAILURE); + auto flipper = create_flipper(flipper_json, port_extenders, pin_controller); + flippers.emplace(flipper->get_name(), flipper); + } + return flippers; +} + +std::shared_ptr create_flipper(nlohmann::json &flipper_json, json &port_extenders, std::shared_ptr &pin_controller) +{ + std::string config_file_name = "solenoid_config.json"; + + uint8_t pin_base = get_pin_base(flipper_json, port_extenders, config_file_name); + auto address = get_value("address", flipper_json, config_file_name); + auto name = get_value("name", flipper_json, config_file_name); + + return std::make_shared(pin_controller, address, pin_base, name); +} + +std::map> create_lamps(std::istream &lamp_config, std::shared_ptr &pin_controller) +{ + json lamp_config_json; + lamp_config >> lamp_config_json; + + json port_extenders = get_element("port_extenders", lamp_config_json, "lamp_config.json"); + + initialize_port_extenders(port_extenders, pin_controller.get(), "lamp_config.json"); + + json solenoids_json = get_element("lamps", lamp_config_json, "lamp_config.json"); + + std::map> lamps; + for(auto &solenoid_json : solenoids_json) + { + auto solenoid = create_lamp(solenoid_json, port_extenders, pin_controller); + lamps.emplace(solenoid->get_name(), solenoid); + } + return lamps; +} + +std::shared_ptr create_lamp(json &lamp_json, json & port_extenders, std::shared_ptr &pin_controller) +{ + std::string config_file_name = "lamps_config.json"; + + uint8_t pin_base = get_pin_base(lamp_json, port_extenders, config_file_name); + auto address = get_value("address", lamp_json, config_file_name); + auto name = get_value("name", lamp_json, config_file_name); + + return std::make_shared(pin_controller, address, pin_base, name); +} + +std::map> create_sounds(std::istream &sound_config, std::shared_ptr &pin_controller) +{ + json sound_config_json; + sound_config >> sound_config_json; + + json port_extenders = get_element("port_extenders", sound_config_json, "sound_config.json"); + + initialize_port_extenders(port_extenders, pin_controller.get(), "sound_config.json"); + + std::chrono::milliseconds deactivation_time{ get_value("deactivation_time_milliseconds", sound_config_json, "solenoid_config.json") }; + + json solenoids_json = get_element("sounds", sound_config_json, "sound_config.json"); + + std::map> sounds; + for(auto &solenoid_json : solenoids_json) + { + auto solenoid = create_sound(solenoid_json, port_extenders, pin_controller, deactivation_time); + sounds.emplace(solenoid->get_name(), solenoid); + } + return sounds; +} + +std::shared_ptr create_sound(json &sound_json, json &port_extenders, std::shared_ptr &pin_controller, std::chrono::milliseconds &deactivation_time) +{ + std::string config_file_name = "sound_config.json"; + + uint8_t pin_base = get_pin_base(sound_json, port_extenders, config_file_name); + auto address = get_value("address", sound_json, config_file_name); + auto name = get_value("name", sound_json, config_file_name); + auto id = get_value("id", sound_json, config_file_name); + + return std::make_shared(pin_controller, address, pin_base, name, deactivation_time, id); +} + +uint8_t get_sound_fire_address(std::istream &sound_config) +{ + json sound_config_json; + sound_config >> sound_config_json; + + json port_extenders = get_element("port_extenders", sound_config_json, "sound_config.json"); + + json fire_pin = get_element("fire_pin", sound_config_json, "sound_config.json"); + auto pin_base = get_pin_base(fire_pin, port_extenders, "sound_config.json"); + auto address = get_value("address", fire_pin, "sound_config.json"); + + return pin_base + address; +} + +void initialize_port_extenders(nlohmann::json &port_extenders, PinController * pin_controller, const std::string & file_name) +{ + + for (auto & extender_json : port_extenders) + { + auto i2c_address = get_value("i2c_address", extender_json, file_name); + auto pin_base = get_value("pin_base", extender_json, file_name); + pin_controller->initialize_port_expander(i2c_address, pin_base); } } -std::shared_ptr create_lamp(nlohmann::json &lamp_json, std::shared_ptr &pin_controller) +uint8_t get_pin_base(json & object, json & port_extenders, const std::string & config_file_name) { - try + uint8_t pin_base{ 0 }; + + if(object.find("extender") != object.end()) { - std::string name = lamp_json.at("name"); - auto address = lamp_json.at("address").get(); - return std::make_shared(pin_controller, address, name); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output lamp config file corrupted: " << e.what(); - exit(EXIT_FAILURE); - } -} - -std::shared_ptr create_sound(nlohmann::json &sound_json, std::shared_ptr &pin_controller, std::chrono::milliseconds &deactivation_time) -{ - try - { - auto id = sound_json.at("id").get(); - std::string description = sound_json.at("description"); - auto address = sound_json.at("address").get(); - return std::make_shared(pin_controller, address, description, deactivation_time, id); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output sound config file corrupted: " << e.what(); - exit(EXIT_FAILURE); - } -} - -std::vector> create_displays(std::istream &display_config) -{ - std::vector> displays; - - json display_config_json; - display_config >> display_config_json; - - json displays_json; - - try - { - displays_json = display_config_json.at("displays"); - } - catch(json::exception &e) - { - CLOG(ERROR, OUTPUT_LOGGER) << "Output display config file corrupted: Key \"displays\" of type array needed. \n" << e.what(); - exit(EXIT_FAILURE); - } - - for(json &display_json : displays_json) - { - auto display = create_display(display_json); - displays.push_back(display); - } - - return displays; -} - -std::shared_ptr create_display(nlohmann::json &display_json) -{ - try - { - auto id = display_json.at("id").get(); - auto address = display_json.at("address").get(); - - auto digits = display_json.at("digits").get(); - if(digits == 8) + auto extender_name = get_value("extender", object, config_file_name); + for (auto & extender : port_extenders) { - return std::make_shared(address, id); - } - else if(digits == 7) - { - return std::make_shared(address, id); - } - else - { - throw new std::logic_error("Display digits can either be 7 or 8"); + auto actual_extender = get_value("name", extender, config_file_name); + if (actual_extender == extender_name) + { + pin_base = get_value("pin_base", extender, config_file_name); + } } } + return pin_base; +} + +json get_element(const std::string & name, json & object, const std::string & file_name) +{ + json sub_object; + + try + { + sub_object = object.at(name); + return sub_object; + } catch(json::exception &e) { - CLOG(ERROR, OUTPUT_LOGGER) << "Output display config file corrupted: " << e.what(); + CLOG(ERROR, OUTPUT_LOGGER) << "File " << file_name << " seems to be corrupted at " << name << ": " << e.what(); exit(EXIT_FAILURE); } + } -std::map> map_displays(const std::vector> &displays) +template +type get_value(const std::string & name, json & object, const std::string & file_name) { - std::map> display_map; - - for(auto &display : displays) + try { - display_map.emplace(display->get_address(), display); + type element = object.at(name).get(); + return element; + } + catch(json::exception &e) + { + CLOG(ERROR, OUTPUT_LOGGER) << "File " << file_name << " seems to be corrupted at " << name << ": " << e.what(); + exit(EXIT_FAILURE); } - - return display_map; } } diff --git a/FlippR-Driver/src/output/OutputDriverFactory.h b/FlippR-Driver/src/output/OutputDriverFactory.h index f7c3126..84a8c6d 100644 --- a/FlippR-Driver/src/output/OutputDriverFactory.h +++ b/FlippR-Driver/src/output/OutputDriverFactory.h @@ -1,4 +1,4 @@ -// + // Created by rhetenor on 04.10.18. // @@ -23,35 +23,32 @@ namespace output { namespace OutputDriverFactory { - std::shared_ptr get_OutputDriver(std::istream& output_pin_config, +std::shared_ptr get_OutputDriver(std::istream& output_pin_config, std::istream& solenoid_config, std::istream& lamp_config, std::istream& sound_config, std::istream& display_config); +std::map> create_solenoids(std::istream& solenoid_config, std::shared_ptr &driverBoardPinController); +std::shared_ptr create_solenoid(nlohmann::json &solenoid_json, nlohmann::json &port_extenders, std::shared_ptr &pin_controller, std::chrono::milliseconds deactivation_time); - std::map> create_solenoids(std::istream &solenoid_config, std::shared_ptr &pin_controller); - std::shared_ptr create_solenoid(nlohmann::json &solenoid_json, std::shared_ptr &pin_controller, std::chrono::milliseconds &deactivation_time); +std::map> create_flippers(std::istream &solenoid_config, std::shared_ptr &pin_controller); +std::shared_ptr create_flipper(nlohmann::json &flipper_json, nlohmann::json &port_extenders, std::shared_ptr &pin_controller); - std::map> create_lamps(std::istream &lamp_config, std::shared_ptr &pin_controller); - std::shared_ptr create_lamp(nlohmann::json &lamp_json, std::shared_ptr &pin_controller); +std::map> create_lamps(std::istream &lamp_config, std::shared_ptr &pin_controller); +std::shared_ptr create_lamp(nlohmann::json &lamp_json, nlohmann::json & port_extenders, std::shared_ptr &pin_controller); - std::map> create_flippers(std::istream &solenoid_config, std::shared_ptr &pin_controller); - std::shared_ptr create_flipper(nlohmann::json &flipper_json, std::shared_ptr &pin_controller); +std::map> create_sounds(std::istream &sound_config, std::shared_ptr &pin_controller); +std::shared_ptr create_sound(nlohmann::json &sound_json, nlohmann::json &port_extenders, std::shared_ptr &pin_controller, std::chrono::milliseconds &deactivation_time); +uint8_t get_sound_fire_address(std::istream &sound_config); - std::map> create_sounds(std::istream &sound_config, std::shared_ptr &pin_controller); - std::shared_ptr create_sound(nlohmann::json &sound_json, std::shared_ptr &pin_controller, std::chrono::milliseconds &deactivation_time); +void initialize_port_extenders(nlohmann::json &port_extenders, PinController * pin_controller, const std::string & file_name); - void initialize_port_extenders(nlohmann::json &json, std::shared_ptr &pin_controller); +uint8_t get_pin_base(nlohmann::json & object, nlohmann::json & port_extenders, const std::string & config_file_name); - std::chrono::milliseconds get_deactivation_time(nlohmann::json &json); - - std::vector> create_displays(std::istream &display_config); - std::map> map_displays(const std::vector> &displays); - std::shared_ptr create_display(nlohmann::json &display_json); - - std::map parse_pins_sound_board(nlohmann::json &sound_board_config); - std::map parse_pins_display_board(nlohmann::json &display_board_config); +nlohmann::json get_element(const std::string & name, nlohmann::json & object, const std::string & file_name); +template +type get_value(const std::string & name, nlohmann::json & object, const std::string & file_name); } } } diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp index f2358de..2e49d8b 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp @@ -13,17 +13,11 @@ namespace output namespace detail { -SoundBoardPinController::SoundBoardPinController(std::map pins_sound, std::shared_ptr output_item_mutex) : - pins_sound(std::move(pins_sound)), output_item_mutex(std::move(output_item_mutex)) +SoundBoardPinController::SoundBoardPinController(std::shared_ptr output_item_mutex, const uint8_t & fire_address) : + output_item_mutex(std::move(output_item_mutex)), + fire_address(fire_address) { - uint8_t i2c_address = pins_sound.at("i2c_address"); - uint8_t pin_base = pins_sound.at("pin_base"); - - initialize_i2c_address(i2c_address, pin_base); - initialize_pins_output(pin_base, pins_sound.begin(), pins_sound.end()); - - CLOG(INFO, OUTPUT_LOGGER) << "Created SoundBoardPinController with i2c_address 0x" << std::hex << i2c_address << " and pin_base " << std::dec << pin_base; - + CLOG(INFO, OUTPUT_LOGGER) << "Created SoundBoardPinController"; } void SoundBoardPinController::activate(const items::detail::Sound &sound) @@ -45,27 +39,27 @@ void SoundBoardPinController::deactivate(const items::detail::Sound &sound) } -void SoundBoardPinController::write_sound_address(uint8_t address) const +void SoundBoardPinController::write_sound_address(const uint8_t & address) const { - write_pin(pins_sound.at("A"), address & 0b0000001u); - write_pin(pins_sound.at("B"), address & 0b0000010u); - write_pin(pins_sound.at("C"), address & 0b0000100u); - write_pin(pins_sound.at("D"), address & 0b0001000u); - write_pin(pins_sound.at("E"), address & 0b0010000u); - write_pin(pins_sound.at("F"), address & 0b0100000u); - write_pin(pins_sound.at("G"), address & 0b1000000u); +// write_pin(pins_sound.at("A"), address & 0b0000001u); +// write_pin(pins_sound.at("B"), address & 0b0000010u); +// write_pin(pins_sound.at("C"), address & 0b0000100u); +// write_pin(pins_sound.at("D"), address & 0b0001000u); +// write_pin(pins_sound.at("E"), address & 0b0010000u); +// write_pin(pins_sound.at("F"), address & 0b0100000u); +// write_pin(pins_sound.at("G"), address & 0b1000000u); } void SoundBoardPinController::fire_sound() const { - PinController::write_pin(pins_sound.at("fire"), true); - - PinController::write_pin(pins_sound.at("fire"), false); +// PinController::write_pin(pins_sound.at("fire"), true); +// +// PinController::write_pin(pins_sound.at("fire"), false); } -void SoundBoardPinController::write_pin(uint8_t pin, bool value) const +void SoundBoardPinController::write_pin(const uint8_t & pin, const bool & value) const { - PinController::write_pin(pins_sound.at("pin_base") + pin, value); +// PinController::write_pin(pins_sound.at("pin_base") + pin, value); } } diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.h b/FlippR-Driver/src/output/detail/SoundBoardPinController.h index ce5a4ea..6a51fcc 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.h +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.h @@ -19,22 +19,22 @@ namespace detail class SoundBoardPinController : public output::SoundBoardPinController { public: - SoundBoardPinController(std::map pins_sound, std::shared_ptr output_item_mutex); + SoundBoardPinController(std::shared_ptr output_item_mutex, const uint8_t & fire_address); ~SoundBoardPinController() override = default; void activate(const items::detail::Sound &sound) override; void deactivate(const items::detail::Sound &sound) override; private: - void write_sound_address(uint8_t address) const; + void write_sound_address(const uint8_t & address) const; void fire_sound() const; - void write_pin(uint8_t pin, bool value) const; + void write_pin(const uint8_t & pin, const bool & value) const; private: std::shared_ptr output_item_mutex; - const std::map pins_sound; + uint8_t fire_address; }; diff --git a/FlippR-Driver/src/output/items/detail/Sound.cpp b/FlippR-Driver/src/output/items/detail/Sound.cpp index 1a1eebc..6f6f2a2 100644 --- a/FlippR-Driver/src/output/items/detail/Sound.cpp +++ b/FlippR-Driver/src/output/items/detail/Sound.cpp @@ -20,7 +20,7 @@ namespace items namespace detail { -Sound::Sound(std::shared_ptr pin_controller, const uint8_t & address, const uint8_t & pin_base, const std::string & name, const std::chrono::milliseconds & deactivation_time, u_int id) +Sound::Sound(std::shared_ptr pin_controller, const uint8_t & address, const uint8_t & pin_base, const std::string & name, const std::chrono::milliseconds & deactivation_time, const u_int id) : detail::Item(std::move(name)), DriverBoardItem(pin_controller, address, pin_base), pin_controller(std::move(pin_controller)), deactivation_time(deactivation_time), id(id) { CLOG(INFO, OUTPUT_LOGGER) << "Created sound " << id << " with name " << name << " and address " << address; diff --git a/FlippR-Driver/src/output/items/detail/Sound.h b/FlippR-Driver/src/output/items/detail/Sound.h index e0d96b2..c7d83ef 100644 --- a/FlippR-Driver/src/output/items/detail/Sound.h +++ b/FlippR-Driver/src/output/items/detail/Sound.h @@ -35,7 +35,7 @@ public: u_int id; public: - Sound(std::shared_ptr pin_controller, const uint8_t & address, const uint8_t & pin_base, const std::string & name, const std::chrono::milliseconds & deactivation_time, u_int id); + Sound(std::shared_ptr pin_controller, const uint8_t & address, const uint8_t & pin_base, const std::string & name, const std::chrono::milliseconds & deactivation_time, const u_int id); ~Sound() override = default; void play() override;