From 92a37bdabb72f7659a0f830c08f929eaa9d7c129 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Wed, 25 Dec 2019 13:27:52 +0100 Subject: [PATCH] refactor outputdriverfactory --- .../json_example/output/Sound_Config.json | 1 + .../src/output/OutputDriverFactory.cpp | 104 +++++++----------- .../src/output/OutputDriverFactory.h | 11 +- .../output/detail/SoundBoardPinController.cpp | 35 +++--- .../output/detail/SoundBoardPinController.h | 4 +- 5 files changed, 69 insertions(+), 86 deletions(-) diff --git a/FlippR-Driver/contrib/json_example/output/Sound_Config.json b/FlippR-Driver/contrib/json_example/output/Sound_Config.json index 39926eb..423f8ab 100644 --- a/FlippR-Driver/contrib/json_example/output/Sound_Config.json +++ b/FlippR-Driver/contrib/json_example/output/Sound_Config.json @@ -13,6 +13,7 @@ "address" : 13, "extender" : "extender_0" }, + "address_pins" : [ 15, 14, 12, 10, 8, 9, 11 ], "sounds" : [ { diff --git a/FlippR-Driver/src/output/OutputDriverFactory.cpp b/FlippR-Driver/src/output/OutputDriverFactory.cpp index e153411..0fec373 100644 --- a/FlippR-Driver/src/output/OutputDriverFactory.cpp +++ b/FlippR-Driver/src/output/OutputDriverFactory.cpp @@ -23,7 +23,15 @@ namespace OutputDriverFactory { using namespace nlohmann; - +namespace config { +namespace +{ +json solenoids; +json lamps; +json sounds; +json displays; +} +} std::shared_ptr get_OutputDriver(std::istream& solenoid_config, std::istream& lamp_config, std::istream& sound_config, @@ -31,38 +39,37 @@ std::shared_ptr get_OutputDriver(std::istream& solenoid_config, { utility::LoggerFactory::CreateOutputLogger(); + solenoid_config >> config::solenoids; + lamp_config >> config::lamps; + sound_config >> config::sounds; + display_config >> config::displays; + auto output_pin_mutex = std::make_shared(); - std::shared_ptr driver_board_pin_controller(new detail::DriverBoardPinController(output_pin_mutex)); - auto solenoids = create_solenoids(solenoid_config, driver_board_pin_controller); - auto flippers = create_flippers(solenoid_config, driver_board_pin_controller); - auto lamps = create_lamps(lamp_config, driver_board_pin_controller); - uint8_t sound_fire_address = get_sound_fire_address(sound_config); + auto solenoids = create_solenoids(driver_board_pin_controller); + auto flippers = create_flippers(driver_board_pin_controller); + auto lamps = create_lamps(driver_board_pin_controller); - 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); + auto sound_board_pin_controller = create_SoundBoardPinController(); + auto sounds = create_sounds(sound_board_pin_controller); std::unique_ptr display_board_pin_controller(new detail::DisplayBoardPinController(parse_pins_display_board(display_config))); - auto displays = create_displays(display_config); + auto displays = create_displays(); 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, flippers, display_map); } -std::map> create_solenoids(std::istream & solenoid_config, std::shared_ptr &pin_controller) +std::map> create_solenoids(std::shared_ptr &pin_controller) { - solenoid_config.clear(); - json solenoid_config_json; - solenoid_config >> solenoid_config_json; - - json port_extenders = get_element("port_extenders", solenoid_config_json, ""); + json port_extenders = get_element("port_extenders", config::solenoids, ""); initialize_port_extenders(port_extenders, pin_controller.get(), "solenoid_config.json"); - 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") }; + json solenoids_json = get_element("solenoids", config::solenoids, "solenoid_config.json"); + std::chrono::milliseconds deactivation_time{ get_value("deactivation_time_milliseconds", config::solenoids, "solenoid_config.json") }; std::map> solenoids; for(auto &solenoid_json : solenoids_json) @@ -75,8 +82,7 @@ std::map> create_solenoids(std::is std::shared_ptr create_solenoid(nlohmann::json &solenoid_json, nlohmann::json &port_extenders, std::shared_ptr &pin_controller, std::chrono::milliseconds deactivation_time) { - solenoid_json; - std::string config_file_name = "solenoid_config.json"; + std::string config_file_name = "config::solenoid.json"; uint8_t pin_base = get_pin_base(solenoid_json, port_extenders, config_file_name); @@ -91,17 +97,12 @@ std::shared_ptr create_solenoid(nlohmann::json &solenoi 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) +std::map> create_flippers(std::shared_ptr &pin_controller) { - solenoid_config.clear(); - solenoid_config.seekg(0, std::ios::beg); - json solenoid_config_json; - solenoid_config >> solenoid_config_json; + json port_extenders = get_element("port_extenders", config::solenoids, "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") }; + json flippers_json = get_element("flippers", config::solenoids, "solenoid_config.json"); + std::chrono::milliseconds deactivation_time{ get_value("deactivation_time_milliseconds", config::solenoids, "solenoid_config.json") }; std::map> flippers; for(auto &flipper_json : flippers_json) @@ -125,17 +126,12 @@ std::shared_ptr create_flipper(nlohmann::json &flipper_j std::map> create_lamps(std::istream &lamp_config, std::shared_ptr &pin_controller) { - lamp_config.clear(); - lamp_config.seekg(0, std::ios::beg); - json lamp_config_json; - lamp_config >> lamp_config_json; - - json port_extenders = get_element("port_extenders", lamp_config_json, "lamp_config.json"); + json port_extenders = get_element("port_extenders", config::lamps, "lamp_config.json"); initialize_port_extenders(port_extenders, pin_controller.get(), "lamp_config.json"); - json lamp_json = get_element("lamps", lamp_config_json, "lamp_config.json"); + json lamps_json = get_element("lamps", config::lamps, "lamp_config.json"); std::map> lamps; - for(auto &lamp_json : lamp_json) + for(auto &lamp_json : lamps_json) { auto lamp = create_lamp(lamp_json, port_extenders, pin_controller); lamps.emplace(lamp->get_name(), lamp); @@ -156,15 +152,10 @@ std::shared_ptr create_lamp(json &lamp_json, json & port_ex std::map> create_sounds(std::istream &sound_config, std::shared_ptr &pin_controller) { - sound_config.clear(); - sound_config.seekg(0, std::ios::beg); - json sound_config_json; - sound_config >> sound_config_json; - - json port_extenders = get_element("port_extenders", sound_config_json, "sound_config.json"); + json port_extenders = get_element("port_extenders", config::sounds, "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 sounds_json = get_element("sounds", sound_config_json, "sound_config.json"); + std::chrono::milliseconds deactivation_time{ get_value("deactivation_time_milliseconds", config::sounds, "solenoid_config.json") }; + json sounds_json = get_element("sounds", config::sounds, "sound_config.json"); std::map> sounds; for(auto &sound_json : sounds_json) @@ -187,16 +178,11 @@ std::shared_ptr create_sound(json &sound_json, json &port_ return std::make_shared(pin_controller, address, pin_base, name, deactivation_time, id); } -uint8_t get_sound_fire_address(std::istream &sound_config) +uint8_t get_sound_fire_address() { - sound_config.clear(); - sound_config.seekg(0, std::ios::beg); - json sound_config_json; - sound_config >> sound_config_json; + json port_extenders = get_element("port_extenders", config::sounds, "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"); + json fire_pin = get_element("fire_pin", config::sounds, "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"); @@ -205,14 +191,9 @@ uint8_t get_sound_fire_address(std::istream &sound_config) std::map parse_pins_display_board(std::istream &display_config) { - display_config.clear(); - display_config.seekg(0, std::ios::beg); std::string config_file = "display_config.json"; - json display_config_json; - display_config >> display_config_json; - - json display_board_config = get_element("display_board", display_config_json, config_file); + json display_board_config = get_element("display_board", config::displays, config_file); std::map pins_display; @@ -240,12 +221,7 @@ std::map parse_pins_display_board(std::istream &display_co std::vector> create_displays(std::istream &display_config) { - display_config.clear(); - display_config.seekg(0, std::ios::beg); - json display_config_json; - display_config >> display_config_json; - - json displays_json = get_element("displays", display_config_json, "display_config.json"); + json displays_json = get_element("displays", config::displays, "display_config.json"); std::vector> displays; for(json &display_json : displays_json) diff --git a/FlippR-Driver/src/output/OutputDriverFactory.h b/FlippR-Driver/src/output/OutputDriverFactory.h index 659bf06..66da63c 100644 --- a/FlippR-Driver/src/output/OutputDriverFactory.h +++ b/FlippR-Driver/src/output/OutputDriverFactory.h @@ -28,21 +28,22 @@ std::shared_ptr get_OutputDriver(std::istream& solenoid_config, std::istream& sound_config, std::istream& display_config); -std::map> create_solenoids(std::istream& solenoid_config, std::shared_ptr &driverBoardPinController); +std::map> create_solenoids(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_flippers(std::istream &solenoid_config, std::shared_ptr &pin_controller); +std::map> create_flippers(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::map> create_lamps(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_sounds(std::istream &sound_config, std::shared_ptr &pin_controller); +std::shared_ptr create_SoundBoardPinController(); +std::map> create_sounds(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 parse_pins_display_board(std::istream & display_config); -std::vector> create_displays(std::istream &display_config); +std::vector> create_displays(); std::shared_ptr create_display(nlohmann::json &display_json); std::map> map_displays(const std::vector> &displays); diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp index 6584f4b..43970e2 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp @@ -14,9 +14,12 @@ namespace detail { SoundBoardPinController::SoundBoardPinController(std::shared_ptr output_item_mutex, - const uint8_t &fire_address) : + uint8_t pin_base, + uint8_t this->fire_address, + const std::vector this->address_pins) : output_item_mutex(output_item_mutex), - fire_address(fire_address) + this->fire_address(this->fire_address), + this->address_pins(this->address_pins) { CLOG(INFO, OUTPUT_LOGGER) << "Created SoundBoardPinController"; } @@ -42,28 +45,28 @@ void SoundBoardPinController::deactivate(const items::detail::Sound &sound) 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(this->address_pins[0], address & 0b0000001u); + write_pin(this->address_pins[1], address & 0b0000010u); + write_pin(this->address_pins[2], address & 0b0000100u); + write_pin(this->address_pins[3], address & 0b0001000u); + write_pin(this->address_pins[4], address & 0b0010000u); + write_pin(this->address_pins[5], address & 0b0100000u); + write_pin(this->address_pins[6], 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(this->fire_address, true); + + PinController::write_pin(this->fire_address, false); } 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("fire"), true); - // - // PinController::write_pin(pins_sound.at("fire"), false); + PinController::write_pin(this->pin_base + pin, value); + PinController::write_pin(this->fire_address, true); + + PinController::write_pin(this->fire_address, false); } } diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.h b/FlippR-Driver/src/output/detail/SoundBoardPinController.h index bb3d3fc..01f4d47 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.h +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.h @@ -19,7 +19,7 @@ namespace detail class SoundBoardPinController : public output::SoundBoardPinController { public: - SoundBoardPinController(std::shared_ptr output_item_mutex, const uint8_t & fire_address); + SoundBoardPinController(std::shared_ptr output_item_mutex, uint8_t pin_base, uint8_t fire_address, const std::vector address_pins); ~SoundBoardPinController() override = default; void activate(const items::detail::Sound &sound); @@ -34,7 +34,9 @@ private: private: std::shared_ptr output_item_mutex; + uint8_t pin_base; uint8_t fire_address; + std::vector address_pins; }; }