From 264044393fa5681d20420bef90563ca9f2af97e1 Mon Sep 17 00:00:00 2001 From: Johannes Wendel Date: Tue, 16 Jul 2019 21:20:03 +0200 Subject: [PATCH] Did big refactoring and further adapted OutputDriverFactory as well as uptuput dricer to new board layouts. --- FlippR-Driver/cli/OutputInterpreter.cpp | 12 +- FlippR-Driver/cli/OutputInterpreter.h | 5 +- .../json_example/output/Display_Config.json | 26 +++- .../output/Output_Pin_Config.json | 49 ------- FlippR-Driver/include/DriverFactory.h | 3 +- FlippR-Driver/include/output/OutputDriver.h | 52 ++++++-- FlippR-Driver/networking/FlippRServer.cpp | 14 +- FlippR-Driver/networking/FlippRServer.h | 4 - .../output/OutputRequestHandler.cpp | 40 ++++++ .../networking/output/OutputRequestHandler.h | 1 + FlippR-Driver/src/DriverFactory.cpp | 5 +- FlippR-Driver/src/PinController.cpp | 8 ++ FlippR-Driver/src/PinController.h | 3 + .../src/output/DisplayBoardPinController.h | 22 +++- FlippR-Driver/src/output/DisplayController.h | 25 +++- .../src/output/DriverBoardPinController.h | 4 +- .../src/output/OutputDriverFactory.cpp | 121 ++++++++++++++---- .../src/output/OutputDriverFactory.h | 8 +- .../src/output/OutputPinController.cpp | 24 ---- .../src/output/OutputPinController.h | 39 ------ .../src/output/SoundBoardPinController.h | 22 +++- .../detail/DisplayBoardPinController.cpp | 7 +- .../output/detail/DisplayBoardPinController.h | 44 ------- .../src/output/detail/DisplayController.cpp | 5 +- .../src/output/detail/DisplayController.h | 50 -------- .../src/output/detail/OutputDriver.cpp | 40 +++++- .../src/output/detail/OutputDriver.h | 69 ---------- .../output/detail/SoundBoardPinController.cpp | 5 +- .../output/detail/SoundBoardPinController.h | 44 ------- .../src/output/items/detail/Display.cpp | 9 +- .../src/output/items/detail/Display.h | 8 +- .../tests/output/TestDisplayController.cpp | 4 +- FlippR-Driver/tests/output/TestLamp.cpp | 4 +- .../tests/output/TestOutputDriver.cpp | 5 +- 34 files changed, 332 insertions(+), 449 deletions(-) delete mode 100644 FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json delete mode 100644 FlippR-Driver/src/output/OutputPinController.cpp delete mode 100644 FlippR-Driver/src/output/OutputPinController.h delete mode 100644 FlippR-Driver/src/output/detail/DisplayBoardPinController.h delete mode 100644 FlippR-Driver/src/output/detail/DisplayController.h delete mode 100644 FlippR-Driver/src/output/detail/OutputDriver.h delete mode 100644 FlippR-Driver/src/output/detail/SoundBoardPinController.h diff --git a/FlippR-Driver/cli/OutputInterpreter.cpp b/FlippR-Driver/cli/OutputInterpreter.cpp index cc20edf..8a1a3d6 100644 --- a/FlippR-Driver/cli/OutputInterpreter.cpp +++ b/FlippR-Driver/cli/OutputInterpreter.cpp @@ -9,9 +9,8 @@ using namespace std; -OutputInterpreter::OutputInterpreter(std::string output_pin_config_file, std::string output_lamp_config_file, - std::string output_solenoid_config_file, std::string output_sound_config_file, - std::string output_display_config_file) +OutputInterpreter::OutputInterpreter(std::string output_lamp_config_file, std::string output_solenoid_config_file, + std::string output_sound_config_file, std::string output_display_config_file) { std::ifstream output_pin_config_stream; std::ifstream lamp_config_stream; @@ -21,7 +20,6 @@ OutputInterpreter::OutputInterpreter(std::string output_pin_config_file, std::st try { - output_pin_config_stream.open(output_pin_config_file); lamp_config_stream.open(output_lamp_config_file); solenoid_config_stream.open(output_solenoid_config_file); sound_config_stream.open(output_sound_config_file); @@ -32,9 +30,5 @@ OutputInterpreter::OutputInterpreter(std::string output_pin_config_file, std::st cerr << e.what(); exit(EXIT_FAILURE); } - output_driver = flippR_driver::get_OutputDriver(output_pin_config_stream, lamp_config_stream, - solenoid_config_stream, - sound_config_stream, - display_config_stream); - + output_driver = flippR_driver::get_OutputDriver(lamp_config_stream, solenoid_config_stream, sound_config_stream, display_config_stream); } diff --git a/FlippR-Driver/cli/OutputInterpreter.h b/FlippR-Driver/cli/OutputInterpreter.h index 9094a17..130314c 100644 --- a/FlippR-Driver/cli/OutputInterpreter.h +++ b/FlippR-Driver/cli/OutputInterpreter.h @@ -10,9 +10,8 @@ class OutputInterpreter { public: - OutputInterpreter(std::string output_pin_config_file, std::string output_lamp_config_file, - std::string output_solenoid_config_file, std::string output_sound_config_file, - std::string output_display_config_file); + OutputInterpreter(std::string output_lamp_config_file, std::string output_solenoid_config_file, + std::string output_sound_config_file, std::string output_display_config_file); void startInterpreter(); diff --git a/FlippR-Driver/contrib/json_example/output/Display_Config.json b/FlippR-Driver/contrib/json_example/output/Display_Config.json index 4fa52ea..05ab9b2 100644 --- a/FlippR-Driver/contrib/json_example/output/Display_Config.json +++ b/FlippR-Driver/contrib/json_example/output/Display_Config.json @@ -1,7 +1,31 @@ { + "display_board" : + { + "display_select" : + { + "1" : 0, + "2" : 0, + "3" : 0, + "4" : 0, + "5" : 0 + }, + "segment_select" : + { + "A" : 0, + "B" : 0, + "C" : 0 + }, + "digit_select" : + { + "A": 0, + "B": 0, + "C": 0, + "D": 0 + }, + "run" : 0 + }, "displays" : [ - // todo add name! { "digits" : 8, "id" : 1, diff --git a/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json b/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json deleted file mode 100644 index 8aa8039..0000000 --- a/FlippR-Driver/contrib/json_example/output/Output_Pin_Config.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "display_board" : - { - "display_select" : - { - "1" : 0, - "2" : 0, - "3" : 0, - "4" : 0, - "5" : 0 - }, - "segment_select" : - { - "A" : 0, - "B" : 0, - "C" : 0 - }, - "digit_select" : - { - "A": 0, - "B": 0, - "C": 0, - "D": 0 - }, - "run" : 0 - }, - "driver_board" : - { - "i2c_address" : 32, - "pin_base" : 65, - "pin-select" : - { - "A" : 0, - "B" : 1, - "C" : 2 - }, - "data" : 3, - "CL" : 4, - "latch-select" : - { - "mux1" : 8, - "mux2" : 9, - "A" : 5, - "B" : 6, - "C" : 7 - } - - } -} diff --git a/FlippR-Driver/include/DriverFactory.h b/FlippR-Driver/include/DriverFactory.h index bf05658..4f9c867 100644 --- a/FlippR-Driver/include/DriverFactory.h +++ b/FlippR-Driver/include/DriverFactory.h @@ -14,8 +14,7 @@ namespace flippR_driver { std::shared_ptr get_InputDriver(std::istream& input_config_stream, std::istream& matrix_config_stream); - std::shared_ptr get_OutputDriver(std::istream& output_pin_config, - std::istream& lamp_config, + std::shared_ptr get_OutputDriver(std::istream& lamp_config, std::istream& solenoid_config, std::istream& sound_config, std::istream& display_config); diff --git a/FlippR-Driver/include/output/OutputDriver.h b/FlippR-Driver/include/output/OutputDriver.h index 10eb10f..0dc9895 100644 --- a/FlippR-Driver/include/output/OutputDriver.h +++ b/FlippR-Driver/include/output/OutputDriver.h @@ -10,13 +10,17 @@ #include #include +#include #include +#include "output/DisplayController.h" + #include "output/items/Solenoid.h" #include "output/items/Lamp.h" #include "output/items/Sound.h" #include "output/items/Display.h" +#include namespace flippR_driver @@ -27,24 +31,44 @@ namespace output class OutputDriver { public: - virtual ~OutputDriver() = default; + OutputDriver(std::unique_ptr display_controller, std::map> solenoids, + std::map> lamps, std::map> sounds, + std::map> flippers, std::map> displays); - virtual void activate_displays() const = 0; - virtual void deactivate_displays() const = 0; + ~OutputDriver() = default; - virtual void deactivate_all_lamps() const = 0; - virtual void activate_all_lamps() const = 0; - virtual void rotate_all_lamps() const = 0; + void activate_displays() const; + void deactivate_displays() const; - virtual std::vector> get_lamps() const = 0; - virtual std::vector> get_solenoids() const = 0; - virtual std::vector> get_sounds() const = 0; - virtual std::vector> get_displays() const = 0; + void activate_all_lamps() const; + void deactivate_all_lamps() const; + void rotate_all_lamps() const; - virtual boost::optional> get_lamp(const std::string &name) const = 0; - virtual boost::optional> get_solenoid(const std::string &name) const = 0; - virtual boost::optional> get_sound(const std::string &name) const = 0; - virtual boost::optional> get_display(uint8_t number) const = 0; + void activate_all_flipper_relays() const; + void deactivate_all_flipper_relays() const; + + // todo driver board run for activate/deactivate? + // todo what is flipper_relay ? + std::vector> get_lamps() const; + std::vector> get_solenoids() const; + std::vector> get_sounds() const; + std::vector> get_flippers() const; + std::vector> get_displays() const; + + boost::optional> get_lamp(const std::string &name) const; + boost::optional> get_solenoid(const std::string &name) const; + boost::optional> get_sound(const std::string &name) const; + boost::optional> get_flipper(const std::string &name) const; + boost::optional> get_display(uint8_t number) const; + +private: + std::unique_ptr display_controller; + + const std::map> lamps; + const std::map> solenoids; + const std::map> sounds; + const std::map> flippers; + const std::map> displays; }; } /* namespace output */ diff --git a/FlippR-Driver/networking/FlippRServer.cpp b/FlippR-Driver/networking/FlippRServer.cpp index 8c87dda..c0f6b75 100644 --- a/FlippR-Driver/networking/FlippRServer.cpp +++ b/FlippR-Driver/networking/FlippRServer.cpp @@ -40,7 +40,6 @@ FlippRServer::FlippRServer() : output_port(9981), input_config("Not set"), matrix_config("Not set"), - output_pin_config("Not set"), lamp_config("Not set"), solenoid_config("Not set"), sound_config("Not set"), @@ -104,7 +103,6 @@ void FlippRServer::initialize(Application &self) void FlippRServer::initialize_output_driver() { - std::ifstream output_pin_config_stream; std::ifstream lamp_config_stream; std::ifstream solenoid_config_stream; std::ifstream sound_config_stream; @@ -112,7 +110,6 @@ void FlippRServer::initialize_output_driver() try { - output_pin_config_stream.open(this->output_pin_config); lamp_config_stream.open(this->lamp_config); solenoid_config_stream.open(this->solenoid_config); sound_config_stream.open(this->sound_config); @@ -124,8 +121,7 @@ void FlippRServer::initialize_output_driver() exit(EXIT_FAILURE); } - this->output_driver = flippR_driver::get_OutputDriver(output_pin_config_stream, - lamp_config_stream, + this->output_driver = flippR_driver::get_OutputDriver(lamp_config_stream, solenoid_config_stream, sound_config_stream, display_config_stream); @@ -228,12 +224,6 @@ void FlippRServer::defineOptions(OptionSet& options) .callback(OptionCallback(this, &FlippRServer::handle_config_file)) .argument("matric-config", true)); - options.addOption(Option("output-pin-config", "O", "Specify where the matrix-config file is located. Only needed when not in this folder.") - .required(this->output_pin_config == "Not set") - .repeatable(false) - .callback(OptionCallback(this, &FlippRServer::handle_config_file)) - .argument("output-pin-config", true)); - options.addOption(Option("lamp-config", "L", "Specify where the lamp-config file is located. Only needed when not in this folder.") .required(this->lamp_config == "Not set") .repeatable(false) @@ -265,8 +255,6 @@ void FlippRServer::handle_config_file(const std::string &name, const std::string this->input_config = value; else if(name == "matrix-config") this->matrix_config = value; - else if(name == "output-pin-config") - this->output_pin_config = value; else if(name == "lamp-config") this->lamp_config = value; else if(name == "solenoid-config") diff --git a/FlippR-Driver/networking/FlippRServer.h b/FlippR-Driver/networking/FlippRServer.h index 0ebf711..743262b 100644 --- a/FlippR-Driver/networking/FlippRServer.h +++ b/FlippR-Driver/networking/FlippRServer.h @@ -26,9 +26,6 @@ public: void initialize(Poco::Util::Application& self); void defineOptions(Poco::Util::OptionSet& options); - - void handle_set_input_port(const std::string &name, const std::string &port); - void handle_set_output_port(const std::string &name, const std::string &port); void handle_help(const std::string &name, const std::string &port); void handle_config_file(const std::string &name, const std::string &value); @@ -52,7 +49,6 @@ private: std::string input_config; std::string matrix_config; - std::string output_pin_config; std::string lamp_config; std::string solenoid_config; std::string sound_config; diff --git a/FlippR-Driver/networking/output/OutputRequestHandler.cpp b/FlippR-Driver/networking/output/OutputRequestHandler.cpp index bc39e56..9b725cd 100644 --- a/FlippR-Driver/networking/output/OutputRequestHandler.cpp +++ b/FlippR-Driver/networking/output/OutputRequestHandler.cpp @@ -60,12 +60,14 @@ void OutputRequestHandler::handleRequest(HTTPServerRequest &request, { this->output_driver->deactivate_displays(); this->output_driver->deactivate_all_lamps(); + this->output_driver->deactivate_all_flipper_relays(); return; } if(item_type == "activate") { this->output_driver->activate_displays(); + this->output_driver->activate_all_flipper_relays(); return; } @@ -109,6 +111,10 @@ boost::optional OutputRequestHandler::parseRequest(const std { return parseDisplay(item_name, action, score); } + else if(item_type == "flippers") + { + return parseFlipper(item_name, action); + } else { throw new Poco::NotFoundException("No item type called " + item_type); @@ -249,6 +255,40 @@ boost::optional OutputRequestHandler::parseDisplay(const std return {}; } +boost::optional OutputRequestHandler::parseFlipper(const std::string& item_name, const std::string& action) +{ + if(item_name == "") + { + Poco::JSON::Object response; + response.set("flippers", this->output_driver->get_flippers()); + return response; + } + + auto opt_flipper = this->output_driver->get_flipper(item_name); + + if(!opt_flipper) + { + throw new Poco::NotFoundException("No flipper with name \"" + item_name + "\"!"); + } + + auto flipper = opt_flipper->get(); + + if(action == "activate") + { + flipper->activate(); + } + else if(action == "deactivate") + { + flipper->deactivate(); + } + else + { + throw new Poco::NotFoundException("No action with name \"" + action + "\" on flippers!"); + } + + return {}; +} + std::vector OutputRequestHandler::getPathSegments(Poco::URI uri) { std::vector path_segments; diff --git a/FlippR-Driver/networking/output/OutputRequestHandler.h b/FlippR-Driver/networking/output/OutputRequestHandler.h index bd07d59..14ba33b 100644 --- a/FlippR-Driver/networking/output/OutputRequestHandler.h +++ b/FlippR-Driver/networking/output/OutputRequestHandler.h @@ -33,6 +33,7 @@ private: boost::optional parseLamp(const std::string& item_name, const std::string& action); boost::optional parseSound(const std::string& item_name, const std::string& action); boost::optional parseDisplay(const std::string& item_name, const std::string& action, const std::string& score); + boost::optional parseFlipper(const std::string& item_name, const std::string& action); std::vector getPathSegments(Poco::URI uri); diff --git a/FlippR-Driver/src/DriverFactory.cpp b/FlippR-Driver/src/DriverFactory.cpp index aaa107c..291e3ec 100644 --- a/FlippR-Driver/src/DriverFactory.cpp +++ b/FlippR-Driver/src/DriverFactory.cpp @@ -14,12 +14,11 @@ namespace flippR_driver return input::InputDriverFactory::get_InputDriver(input_config_stream, matrix_config_stream); } - std::shared_ptr get_OutputDriver(std::istream& output_pin_config, - std::istream& lamp_config, + std::shared_ptr get_OutputDriver(std::istream& lamp_config, std::istream& solenoid_config, std::istream& sound_config, std::istream& display_config) { - return output::OutputDriverFactory::get_OutputDriver(output_pin_config, lamp_config, solenoid_config, sound_config, display_config); + return output::OutputDriverFactory::get_OutputDriver(lamp_config, solenoid_config, sound_config, display_config); } } diff --git a/FlippR-Driver/src/PinController.cpp b/FlippR-Driver/src/PinController.cpp index eeb83c4..d4b287f 100644 --- a/FlippR-Driver/src/PinController.cpp +++ b/FlippR-Driver/src/PinController.cpp @@ -50,4 +50,12 @@ void PinController::initialize_port_expander(const uint8_t i2c_address, const ui } +void PinController::initialize_pins_output(const uint8_t pin_base, std::map::iterator begin, std::map::iterator end) +{ + for(;begin != end; begin++) + { + initialize_output_pin(pin_base + begin->second); + } +} + } diff --git a/FlippR-Driver/src/PinController.h b/FlippR-Driver/src/PinController.h index ee65615..a93b943 100644 --- a/FlippR-Driver/src/PinController.h +++ b/FlippR-Driver/src/PinController.h @@ -12,6 +12,7 @@ #include #include +#include namespace flippR_driver { @@ -32,6 +33,8 @@ protected: static bool read_pin(uint8_t address); + static void initialize_pins_output(const uint8_t pin_base, std::map::iterator begin, std::map::iterator end); + public: static std::once_flag GPIO_LIB_INITIALIZED; }; diff --git a/FlippR-Driver/src/output/DisplayBoardPinController.h b/FlippR-Driver/src/output/DisplayBoardPinController.h index 9c95b72..ea23d9b 100644 --- a/FlippR-Driver/src/output/DisplayBoardPinController.h +++ b/FlippR-Driver/src/output/DisplayBoardPinController.h @@ -6,22 +6,32 @@ #define FLIPPR_DRIVER_DISPLAYPINCONTROLLER_H #include "output/items/OutputDisplay.h" -#include "OutputPinController.h" +#include "PinController.h" namespace flippR_driver { namespace output { -class DisplayBoardPinController : public OutputPinController +class DisplayBoardPinController : public PinController { public: - virtual ~DisplayBoardPinController() = default; + explicit DisplayBoardPinController(std::map pins_display); + ~DisplayBoardPinController() override = default; - virtual void activate_displays() const = 0; - virtual void deactivate_displays() const = 0; + void activate_displays() const; + void deactivate_displays() const; - virtual void write_display(const items::OutputDisplay &display) const = 0; + void write_display(const items::OutputDisplay &display) const; + +private: + void write_display_digit(uint8_t display_address, uint8_t content, uint8_t position) const; + void select_display_segment(uint8_t digit) const; + void select_display_digit(uint8_t content) const; + void run_display(uint8_t address) const; + +private: + const std::map pins_display_board; }; } diff --git a/FlippR-Driver/src/output/DisplayController.h b/FlippR-Driver/src/output/DisplayController.h index fa675fd..4ec0ce5 100644 --- a/FlippR-Driver/src/output/DisplayController.h +++ b/FlippR-Driver/src/output/DisplayController.h @@ -8,6 +8,12 @@ #ifndef _SRC_OUTPUT_IDISPLAYCONTROLLER_H_ #define _SRC_OUTPUT_IDISPLAYCONTROLLER_H_ +#include +#include + +#include "output/items/OutputDisplay.h" +#include "output/DisplayBoardPinController.h" + namespace flippR_driver { namespace output @@ -15,12 +21,23 @@ namespace output class DisplayController { - public: - virtual ~DisplayController () = default; + explicit DisplayController(std::vector> displays, std::unique_ptr pin_controller); + ~DisplayController(); - virtual void activate_displays() const = 0; - virtual void deactivate_displays() const = 0; + void activate_displays() const; + void deactivate_displays() const; + +private: + void cycle_displays() const; + +private: + const std::vector> displays; + + const std::shared_ptr pin_controller; + + std::thread display_cycle_thread; + bool is_running; }; } /* namespace output */ diff --git a/FlippR-Driver/src/output/DriverBoardPinController.h b/FlippR-Driver/src/output/DriverBoardPinController.h index 66fd4e6..207d6c9 100644 --- a/FlippR-Driver/src/output/DriverBoardPinController.h +++ b/FlippR-Driver/src/output/DriverBoardPinController.h @@ -5,7 +5,7 @@ #ifndef FLIPPR_DRIVER_DRIVERBOARDPINCONTROLLER_H #define FLIPPR_DRIVER_DRIVERBOARDPINCONTROLLER_H -#include "OutputPinController.h" +#include "PinController.h" #include @@ -19,7 +19,7 @@ namespace items class DriverBoardItem; } -class DriverBoardPinController : public OutputPinController +class DriverBoardPinController : public PinController { public: virtual ~DriverBoardPinController() = default; diff --git a/FlippR-Driver/src/output/OutputDriverFactory.cpp b/FlippR-Driver/src/output/OutputDriverFactory.cpp index 7038331..659351e 100644 --- a/FlippR-Driver/src/output/OutputDriverFactory.cpp +++ b/FlippR-Driver/src/output/OutputDriverFactory.cpp @@ -2,22 +2,17 @@ // Created by rhetenor on 04.10.18. // - - #include "OutputDriverFactory.h" #include "utility/LoggerFactory.h" -#include "output/detail/OutputDriver.h" -#include "output/detail/DisplayController.h" - -#include "output/detail/DisplayBoardPinController.h" -#include "output/detail/SoundBoardPinController.h" - +#include "output/DisplayController.h" +#include "output/SoundBoardPinController.h" #include "output/items/detail/EightDigitDisplay.h" + +#include "output/DisplayBoardPinController.h" #include "output/items/detail/SevenDigitDisplay.h" #include "output/items/Flipper.h" -#include "output/items/detail/Flipper.h" namespace flippR_driver { @@ -28,8 +23,7 @@ namespace OutputDriverFactory using namespace nlohmann; -std::shared_ptr get_OutputDriver(std::istream& output_pin_config, - std::istream& solenoid_config, +std::shared_ptr get_OutputDriver(std::istream& solenoid_config, std::istream& lamp_config, std::istream& sound_config, std::istream& display_config) @@ -38,29 +32,21 @@ std::shared_ptr get_OutputDriver(std::istream& output_pin_config, std::shared_ptr output_pin_mutex; - json output_config; - output_pin_config >> output_config; - - 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 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); - std::shared_ptr sound_board_pin_controller(new detail::SoundBoardPinController(output_pin_mutex, sound_fire_address)); + std::shared_ptr sound_board_pin_controller(new 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); -// return std::make_shared(NULL, NULL, NULL, NULL, NULL); + std::unique_ptr display_board_pin_controller(new DisplayBoardPinController(parse_pins_display_board(display_config))); + auto displays = create_displays(display_config); + std::unique_ptr display_controller(new 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) @@ -210,7 +196,86 @@ uint8_t get_sound_fire_address(std::istream &sound_config) return pin_base + address; } -void initialize_port_extenders(nlohmann::json &port_extenders, PinController * pin_controller, const std::string & file_name) +std::map parse_pins_display_board(std::istream &display_config) +{ + 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); + + std::map pins_display; + + pins_display["run"] = get_value("run", display_board_config, config_file); + + json display_select = display_board_config.at("display_select"); + for(int i = 1; i < 6; i++) + { + pins_display["display_select" + std::to_string(i)] = get_value(std::to_string(i), display_select, config_file); + } + + json segment_select = display_board_config.at("segment_select"); + pins_display["segment_select_A"] = get_value("A", segment_select, config_file); + pins_display["segment_select_B"] = get_value("B", segment_select, config_file); + pins_display["segment_select_C"] = get_value("C", segment_select, config_file); + + json digit_select = display_board_config.at("digit_select"); + pins_display["digit_select_A"] = get_value("A", digit_select, config_file); + pins_display["digit_select_B"] = get_value("B", digit_select, config_file); + pins_display["digit_select_C"] = get_value("C", digit_select, config_file); + pins_display["digit_select_D"] = get_value("D", digit_select, config_file);; + + return pins_display; +} + +std::vector> create_displays(std::istream &display_config) +{ + + json display_config_json; + display_config >> display_config_json; + + json displays_json = get_element("displays", display_config_json, "display_config.json"); + + std::vector> displays; + for(json &display_json : displays_json) + { + auto display = create_display(display_json); + displays.push_back(display); + } + + return displays; +} + +std::shared_ptr create_display(json & display_json) +{ + std::string config_file = "display_config.json"; + auto id = get_value("id", display_json, config_file); + auto address = get_value("address", display_json, config_file); + auto digits = get_value("digits", display_json, config_file); + if(digits == 8) + 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"); +} + +std::map> map_displays(const std::vector> &displays) +{ + std::map> display_map; + + for(auto &display : displays) + { + display_map.emplace(display->get_address(), display); + } + + return display_map; +} + +void initialize_port_extenders(json &port_extenders, PinController * pin_controller, const std::string & file_name) { for (auto & extender_json : port_extenders) diff --git a/FlippR-Driver/src/output/OutputDriverFactory.h b/FlippR-Driver/src/output/OutputDriverFactory.h index 84a8c6d..f660964 100644 --- a/FlippR-Driver/src/output/OutputDriverFactory.h +++ b/FlippR-Driver/src/output/OutputDriverFactory.h @@ -23,8 +23,7 @@ namespace output { namespace OutputDriverFactory { -std::shared_ptr get_OutputDriver(std::istream& output_pin_config, - std::istream& solenoid_config, +std::shared_ptr get_OutputDriver(std::istream& solenoid_config, std::istream& lamp_config, std::istream& sound_config, std::istream& display_config); @@ -42,6 +41,11 @@ std::map> create_sounds(std::istream 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::shared_ptr create_display(nlohmann::json &display_json); +std::map> map_displays(const std::vector> &displays); + void initialize_port_extenders(nlohmann::json &port_extenders, PinController * pin_controller, const std::string & file_name); uint8_t get_pin_base(nlohmann::json & object, nlohmann::json & port_extenders, const std::string & config_file_name); diff --git a/FlippR-Driver/src/output/OutputPinController.cpp b/FlippR-Driver/src/output/OutputPinController.cpp deleted file mode 100644 index c21e27e..0000000 --- a/FlippR-Driver/src/output/OutputPinController.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * OutputGPIOInterface.h - * - * Created on: May 31, 2018 - * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert - */ - -#include "OutputPinController.h" - -#include "utility/config.h" -#include "wiringPi/mcp23017.h" - -namespace flippR_driver -{ -namespace output -{ - -void OutputPinController::initialize_i2c_address(const uint8_t i2c_address, const uint8_t pin_base) -{ - mcp23017Setup(pin_base, i2c_address); -} - -} -} diff --git a/FlippR-Driver/src/output/OutputPinController.h b/FlippR-Driver/src/output/OutputPinController.h deleted file mode 100644 index 44beb5d..0000000 --- a/FlippR-Driver/src/output/OutputPinController.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * OutputGPIOInterface.h - * - * Created on: May 31, 2018 - * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert - */ - -#ifndef SRC_UTILITIES_OUTPUTGPIOINTERFACE_H_ -#define SRC_UTILITIES_OUTPUTGPIOINTERFACE_H_ - -#include "PinController.h" - -#include - -namespace flippR_driver -{ -namespace output -{ - -namespace items -{ - class DriverBoardItem; -} -class OutputPinController : public PinController -{ - -public: - virtual ~OutputPinController() = default; - -protected: - static void initialize_i2c_address(const uint8_t i2c_address, const uint8_t pin_base); - static void initialize_pins_output(const uint8_t pin_base, std::map::iterator begin, std::map::iterator end); - -}; - -} -} - -#endif diff --git a/FlippR-Driver/src/output/SoundBoardPinController.h b/FlippR-Driver/src/output/SoundBoardPinController.h index b07f2ce..989f416 100644 --- a/FlippR-Driver/src/output/SoundBoardPinController.h +++ b/FlippR-Driver/src/output/SoundBoardPinController.h @@ -6,20 +6,32 @@ #define FLIPPR_DRIVER_OUTPUT_SOUNDBOARDPINCONTROLLER_H #include "output/items/detail/Sound.h" -#include "OutputPinController.h" +#include "PinController.h" namespace flippR_driver { namespace output { -class SoundBoardPinController : public OutputPinController +class SoundBoardPinController : public PinController { public: - virtual ~SoundBoardPinController() = default; + SoundBoardPinController(std::shared_ptr output_item_mutex, const uint8_t & fire_address); + ~SoundBoardPinController() override = default; - virtual void activate(const items::detail::Sound &sound) = 0; - virtual void deactivate(const items::detail::Sound &sound) = 0; + void activate(const items::detail::Sound &sound); + void deactivate(const items::detail::Sound &sound); + +private: + void write_sound_address(const uint8_t & address) const; + void fire_sound() const; + + void write_pin(const uint8_t & pin, const bool & value) const; + +private: + std::shared_ptr output_item_mutex; + + uint8_t fire_address; }; } diff --git a/FlippR-Driver/src/output/detail/DisplayBoardPinController.cpp b/FlippR-Driver/src/output/detail/DisplayBoardPinController.cpp index fbdccda..4dfe42f 100644 --- a/FlippR-Driver/src/output/detail/DisplayBoardPinController.cpp +++ b/FlippR-Driver/src/output/detail/DisplayBoardPinController.cpp @@ -2,9 +2,9 @@ // Created by rhetenor on 14.12.18. // -#include +#include "output/DisplayBoardPinController.h" -#include "DisplayBoardPinController.h" +#include #include "utility/config.h" @@ -12,8 +12,6 @@ namespace flippR_driver { namespace output { -namespace detail -{ DisplayBoardPinController::DisplayBoardPinController(std::map pins_display) : pins_display_board(std::move(pins_display)) @@ -77,6 +75,5 @@ void DisplayBoardPinController::run_display(uint8_t address) const write_pin(pins_display_board.at("display_select_" + std::to_string(address)), 1); } -} } } \ No newline at end of file diff --git a/FlippR-Driver/src/output/detail/DisplayBoardPinController.h b/FlippR-Driver/src/output/detail/DisplayBoardPinController.h deleted file mode 100644 index d2250c9..0000000 --- a/FlippR-Driver/src/output/detail/DisplayBoardPinController.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// Created by rhetenor on 14.12.18. -// - -#ifndef FLIPPR_DRIVER_OUTPUT_IMPL_DISPLAYPINCONTROLLER_H -#define FLIPPR_DRIVER_OUTPUT_IMPL_DISPLAYPINCONTROLLER_H - -#include - -#include "output/DisplayBoardPinController.h" - - -namespace flippR_driver -{ -namespace output -{ -namespace detail -{ - -class DisplayBoardPinController : public output::DisplayBoardPinController -{ -public: - explicit DisplayBoardPinController(std::map pins_display); - ~DisplayBoardPinController() override = default; - - void activate_displays() const override; - void deactivate_displays() const override; - - void write_display(const items::OutputDisplay &display) const override; - -private: - void write_display_digit(uint8_t display_address, uint8_t content, uint8_t position) const; - void select_display_segment(uint8_t digit) const; - void select_display_digit(uint8_t content) const; - void run_display(uint8_t address) const; - -private: - const std::map pins_display_board; -}; - -} -} -} -#endif //FLIPPR_DRIVER_DISPLAYPINCONTROLLER_H diff --git a/FlippR-Driver/src/output/detail/DisplayController.cpp b/FlippR-Driver/src/output/detail/DisplayController.cpp index f3d8370..c89a4a1 100644 --- a/FlippR-Driver/src/output/detail/DisplayController.cpp +++ b/FlippR-Driver/src/output/detail/DisplayController.cpp @@ -5,7 +5,7 @@ * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert */ -#include "DisplayController.h" +#include "output/DisplayController.h" #include "utility/config.h" @@ -13,8 +13,6 @@ namespace flippR_driver { namespace output { -namespace detail -{ DisplayController::DisplayController(std::vector> displays, std::unique_ptr pin_controller) : displays(std::move(displays)), pin_controller(std::move(pin_controller)), is_running(true) @@ -58,4 +56,3 @@ void DisplayController::deactivate_displays() const } } -} diff --git a/FlippR-Driver/src/output/detail/DisplayController.h b/FlippR-Driver/src/output/detail/DisplayController.h deleted file mode 100644 index 12ed5d3..0000000 --- a/FlippR-Driver/src/output/detail/DisplayController.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * DisplayController.h - * - * Created on: Aug 7, 2018 - * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert - */ - -#ifndef _SRC_OUTPUT_DISPLAYCONTROLLER_H_ -#define _SRC_OUTPUT_DISPLAYCONTROLLER_H_ - -#include -#include - -#include "output/DisplayController.h" - -#include "output/items/OutputDisplay.h" -#include "output/DisplayBoardPinController.h" - -namespace flippR_driver -{ -namespace output -{ -namespace detail -{ - -class DisplayController : public output::DisplayController -{ -public: - explicit DisplayController(std::vector> displays, std::unique_ptr pin_controller); - ~DisplayController() override; - - void activate_displays() const override; - void deactivate_displays() const override; - -private: - void cycle_displays() const; - -private: - const std::vector> displays; - - const std::shared_ptr pin_controller; - - std::thread display_cycle_thread; - bool is_running; -}; - -} -} -} -#endif diff --git a/FlippR-Driver/src/output/detail/OutputDriver.cpp b/FlippR-Driver/src/output/detail/OutputDriver.cpp index d8247c3..166df99 100644 --- a/FlippR-Driver/src/output/detail/OutputDriver.cpp +++ b/FlippR-Driver/src/output/detail/OutputDriver.cpp @@ -9,7 +9,7 @@ #include #include -#include "OutputDriver.h" +#include "output/OutputDriver.h" #include "utility/config.h" @@ -17,13 +17,18 @@ namespace flippR_driver { namespace output { -namespace detail -{ using namespace items; -OutputDriver::OutputDriver(std::unique_ptr display_controller, std::map> solenoids, std::map> lamps, std::map> sounds, std::map> displays) -: display_controller(std::move(display_controller)), solenoids(std::move(solenoids)), lamps(std::move(lamps)), sounds(std::move(sounds)), displays(std::move(displays)) +OutputDriver::OutputDriver(std::unique_ptr display_controller, std::map> solenoids, + std::map> lamps, std::map> sounds, + std::map> flippers, std::map> displays): + display_controller(std::move(display_controller)), + solenoids(std::move(solenoids)), + lamps(std::move(lamps)), + sounds(std::move(sounds)), + flippers(std::move(flippers)), + displays(std::move(displays)) { CLOG(INFO, OUTPUT_LOGGER) << "Created OutputDriver"; } @@ -61,6 +66,16 @@ void OutputDriver::rotate_all_lamps() const } } +void OutputDriver::activate_all_flipper_relays() const +{ + +} + +void OutputDriver::deactivate_all_flipper_relays() const +{ + +} + std::vector> OutputDriver::get_sounds() const { std::vector> sounds; @@ -89,6 +104,15 @@ std::vector> OutputDriver::get_lamps() const return lamps; } +std::vector> OutputDriver::get_flippers() const +{ + std::vector> flippers; + + boost::copy(this->flippers | boost::adaptors::map_values, std::back_inserter(flippers)); + + return flippers; +} + std::vector> OutputDriver::get_solenoids() const { std::vector> solenoids; @@ -113,6 +137,11 @@ boost::optional> OutputDriver::get_sound(const std return this->sounds.find(name)->second; } +boost::optional> OutputDriver::get_flipper(const std::string &name) const +{ + return this->flippers.find(name)->second; +} + boost::optional> OutputDriver::get_display(uint8_t number) const { return this->displays.find(number)->second; @@ -121,4 +150,3 @@ boost::optional> OutputDriver::get_display(uint8 } } /* namespace output */ -} diff --git a/FlippR-Driver/src/output/detail/OutputDriver.h b/FlippR-Driver/src/output/detail/OutputDriver.h deleted file mode 100644 index dd95f45..0000000 --- a/FlippR-Driver/src/output/detail/OutputDriver.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * OutputDriver.h - * - * Created on: Aug 2, 2018 - * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert - */ - -#ifndef _SRC_OUTPUT_OUTPUTDRIVER_H_ -#define _SRC_OUTPUT_OUTPUTDRIVER_H_ - -#include - -#include "output/OutputDriver.h" -#include "output/DisplayController.h" - -namespace flippR_driver -{ -namespace output -{ -namespace detail -{ - -class OutputDriver : public output::OutputDriver -{ -public: - OutputDriver(std::unique_ptr display_controller, std::map> solenoids, - std::map> lamps, std::map> sounds, - std::map> displays); - - ~OutputDriver() override = default; - - void activate_displays() const override; - void deactivate_displays() const override; - - void activate_all_lamps() const override; - void deactivate_all_lamps() const override; - void rotate_all_lamps() const override; - - void activate_flipper_relay(); - void activate_top_flipper_relay(); - void deactivate_flipper_relay(); - void deactivate_top_flipper_relay(); - - // todo driver board run for activate/deactivate? - // todo what is flipper_relay ? - std::vector> get_lamps() const override; - std::vector> get_solenoids() const override; - std::vector> get_sounds() const override; - std::vector> get_displays() const override; - - boost::optional> get_lamp(const std::string &name) const override; - boost::optional> get_solenoid(const std::string &name) const override; - boost::optional> get_sound(const std::string &name) const override; - boost::optional> get_display(uint8_t number) const override; - -private: - std::unique_ptr display_controller; - - const std::map> lamps; - const std::map> solenoids; - const std::map> sounds; - - const std::map> displays; -}; - -} -} /* namespace output */ -} -#endif diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp index 2e49d8b..1f4ba9a 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp @@ -2,7 +2,7 @@ // Created by rhetenor on 14.12.18. // -#include "SoundBoardPinController.h" +#include "output/SoundBoardPinController.h" #include "utility/config.h" @@ -10,8 +10,6 @@ namespace flippR_driver { namespace output { -namespace detail -{ SoundBoardPinController::SoundBoardPinController(std::shared_ptr output_item_mutex, const uint8_t & fire_address) : output_item_mutex(std::move(output_item_mutex)), @@ -64,4 +62,3 @@ void SoundBoardPinController::write_pin(const uint8_t & pin, const bool & value) } } -} diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.h b/FlippR-Driver/src/output/detail/SoundBoardPinController.h deleted file mode 100644 index 6a51fcc..0000000 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// Created by rhetenor on 14.12.18. -// - -#ifndef FLIPPR_DRIVER_OUTPUT_IMPL_SOUNDBOARDPINCONTROLLER_H -#define FLIPPR_DRIVER_OUTPUT_IMPL_SOUNDBOARDPINCONTROLLER_H - -#include "output/SoundBoardPinController.h" - -#include - -namespace flippR_driver -{ -namespace output -{ -namespace detail -{ - -class SoundBoardPinController : public output::SoundBoardPinController -{ -public: - 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(const uint8_t & address) const; - void fire_sound() const; - - void write_pin(const uint8_t & pin, const bool & value) const; - -private: - std::shared_ptr output_item_mutex; - - uint8_t fire_address; - -}; - -} -} -} -#endif //FLIPPR_DRIVER_SOUNDBOARDPINCONTROLLER_H diff --git a/FlippR-Driver/src/output/items/detail/Display.cpp b/FlippR-Driver/src/output/items/detail/Display.cpp index 09c1a11..16e3a41 100644 --- a/FlippR-Driver/src/output/items/detail/Display.cpp +++ b/FlippR-Driver/src/output/items/detail/Display.cpp @@ -17,7 +17,7 @@ namespace items namespace detail { -Display::Display(uint8_t address, uint8_t id) : +Display::Display(const uint8_t & address, const uint8_t & id) : address(address), id(id) { @@ -29,7 +29,7 @@ uint8_t Display::get_id() const return this->id; } -void Display::write_score(unsigned int score, unsigned int length) +void Display::write_score(const unsigned int & score, const unsigned int & length) { auto score_string = std::to_string(score); @@ -38,7 +38,7 @@ void Display::write_score(unsigned int score, unsigned int length) write_content(score_string, length); } -std::string Display::fit_score_string(std::string &score_string, unsigned int length) +std::string Display::fit_score_string(std::string & score_string, const unsigned int & length) { auto score_length = score_string.length(); @@ -46,7 +46,6 @@ std::string Display::fit_score_string(std::string &score_string, unsigned int le { CLOG(DEBUG, OUTPUT_LOGGER) << "Score too long for display"; std::string full_display; - // TODO mach mal schöner hier wird 9999 angezeigt wenn die zahl zu groß is return full_display.insert(0, length, '9'); } @@ -54,7 +53,7 @@ std::string Display::fit_score_string(std::string &score_string, unsigned int le return score_string; } -void Display::write_content(std::string content, unsigned int length) +void Display::write_content(std::string & content, const unsigned int & length) { if(content.size() > length) { diff --git a/FlippR-Driver/src/output/items/detail/Display.h b/FlippR-Driver/src/output/items/detail/Display.h index 83cc05e..d98bf0f 100644 --- a/FlippR-Driver/src/output/items/detail/Display.h +++ b/FlippR-Driver/src/output/items/detail/Display.h @@ -24,18 +24,18 @@ namespace detail class Display : public items::OutputDisplay { public: - Display(uint8_t address, uint8_t id); + Display(const uint8_t & address, const uint8_t & id); virtual ~Display() = default; - void write_score(unsigned int score, unsigned int length); - void write_content(std::string content, unsigned int length); + void write_score(const unsigned int & score, const unsigned int & length); + void write_content(std::string & content, const unsigned int & length); std::string get_content() const override; uint8_t get_address() const override; uint8_t get_id() const override; private: - std::string fit_score_string(std::string &score_string, unsigned int length); + std::string fit_score_string(std::string & score_string, const unsigned int & length); public: std::string content; diff --git a/FlippR-Driver/tests/output/TestDisplayController.cpp b/FlippR-Driver/tests/output/TestDisplayController.cpp index bdc6605..8d190db 100644 --- a/FlippR-Driver/tests/output/TestDisplayController.cpp +++ b/FlippR-Driver/tests/output/TestDisplayController.cpp @@ -15,8 +15,8 @@ #include "output/DisplayController.h" #include "output/items/OutputDisplay.h" -#include "output/detail/DisplayBoardPinController.h" -#include "output/detail/DisplayController.h" +#include "output/DisplayBoardPinController.h" +#include "output/DisplayController.h" // testing purposes diff --git a/FlippR-Driver/tests/output/TestLamp.cpp b/FlippR-Driver/tests/output/TestLamp.cpp index 2e97864..a4dd0ff 100644 --- a/FlippR-Driver/tests/output/TestLamp.cpp +++ b/FlippR-Driver/tests/output/TestLamp.cpp @@ -23,7 +23,7 @@ SCENARIO("A Lamp gets activated") Fake(Dtor(pin_controller)); Fake(Method(pin_controller, activate)); - items::detail::Lamp lamp(std::shared_ptr(&pin_controller.get()), 0, "test"); + items::detail::Lamp lamp(std::shared_ptr(&pin_controller.get()), 0, 1, "test"); WHEN("The lamp gets activated") { @@ -50,7 +50,7 @@ SCENARIO("A Lamp gets deactivated") Fake(Dtor(pin_controller)); Fake(Method(pin_controller, deactivate)); - items::detail::Lamp lamp(std::shared_ptr(&pin_controller.get()), 0, "test"); + items::detail::Lamp lamp(std::shared_ptr(&pin_controller.get()), 0, 1, "test"); WHEN("The lamp gets deactivated") { diff --git a/FlippR-Driver/tests/output/TestOutputDriver.cpp b/FlippR-Driver/tests/output/TestOutputDriver.cpp index 82aef79..7775697 100644 --- a/FlippR-Driver/tests/output/TestOutputDriver.cpp +++ b/FlippR-Driver/tests/output/TestOutputDriver.cpp @@ -19,7 +19,7 @@ // testing purposes #define private public -#include "output/detail/OutputDriver.h" +#include "output/OutputDriver.h" using namespace flippR_driver; using namespace flippR_driver::output; @@ -37,9 +37,10 @@ SCENARIO("The OutputDriver should (de)activates the displays") std::map> solenoids; std::map> lamps; std::map> sounds; + std::map> flippers; std::map> displays; - output::detail::OutputDriver output_driver(std::unique_ptr(&display_controller.get()), solenoids, lamps, sounds, displays); + output::OutputDriver output_driver(std::unique_ptr(&display_controller.get()), solenoids, lamps, sounds, flippers, displays); WHEN("The displays get activated") {