From e442f4c0213344ec188826102089265fb52c8ec6 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Tue, 11 Dec 2018 22:45:42 +0100 Subject: [PATCH] implemented display logic --- .../src/output/DisplayController.cpp | 4 +- .../src/output/IOutputGPIOInterface.h | 2 +- .../src/output/OutputGPIOInterface.cpp | 41 ++++++++++++++++++- .../src/output/OutputGPIOInterface.h | 7 +++- FlippR-Driver/src/output/items/Display.h | 3 +- FlippR-Driver/src/output/items/IDisplay.h | 2 + 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/FlippR-Driver/src/output/DisplayController.cpp b/FlippR-Driver/src/output/DisplayController.cpp index e49a66c..50b9917 100644 --- a/FlippR-Driver/src/output/DisplayController.cpp +++ b/FlippR-Driver/src/output/DisplayController.cpp @@ -33,9 +33,9 @@ void DisplayController::cycle_displays() { while(is_running) { - for(auto& display : this->displays) + for(auto &display : this->displays) { - output_gpio_interface->write_display(display); + output_gpio_interface->write_display(*display); } } } diff --git a/FlippR-Driver/src/output/IOutputGPIOInterface.h b/FlippR-Driver/src/output/IOutputGPIOInterface.h index a080c4e..2a7ec8f 100644 --- a/FlippR-Driver/src/output/IOutputGPIOInterface.h +++ b/FlippR-Driver/src/output/IOutputGPIOInterface.h @@ -29,7 +29,7 @@ public: virtual void deactivate(items::DriverBoardItem *driver_board_item) = 0; virtual void deactivate(items::Item *sound) = 0; - virtual void write_display(std::shared_ptr display) = 0; + virtual void write_display(items::IDisplay &display) = 0; //Display gpio interface! }; diff --git a/FlippR-Driver/src/output/OutputGPIOInterface.cpp b/FlippR-Driver/src/output/OutputGPIOInterface.cpp index 476fdd9..3902107 100644 --- a/FlippR-Driver/src/output/OutputGPIOInterface.cpp +++ b/FlippR-Driver/src/output/OutputGPIOInterface.cpp @@ -140,9 +140,46 @@ void OutputGPIOInterface::fire_sound(bool fire) GPIOInterface::write_pin(pins_sound.at("fire"), fire); } -void OutputGPIOInterface::write_display(std::shared_ptr display) +void OutputGPIOInterface::write_display(IDisplay &display) { - return; + std::vector content = display.get_content(); + + for(uint8_t i = 0; i < content.size(); i++) + { + write_display_digit(display.get_address(), content.at(i), i); + } +} + + +void OutputGPIOInterface::write_display_digit(const uint8_t display_address, const char &content, const uint8_t &position) +{ + select_display_segment(position); + + select_display_digit(content); + + run_display(display_address); +} + +void OutputGPIOInterface::select_display_segment(const uint8_t &segment) +{ + write_pin(pins_display.at("segment_select_A"), segment & 0b001u); + write_pin(pins_display.at("segment_select_B"), segment & 0b010u); + write_pin(pins_display.at("segment_select_C"), segment & 0b100u); +} + +void OutputGPIOInterface::select_display_digit(const char &content) +{ + write_pin(pins_display.at("digit_select_A"), content & 0b0001u); + write_pin(pins_display.at("digit_select_B"), content & 0b0010u); + write_pin(pins_display.at("digit_select_C"), content & 0b0100u); + write_pin(pins_display.at("digit_select_D"), content & 0b1000u); +} + +void OutputGPIOInterface::run_display(const uint8_t &address) +{ + write_pin(pins_display.at("display_select_" + std::to_string(address)), true); + + write_pin(pins_display.at("display_select_" + std::to_string(address)), false); } } diff --git a/FlippR-Driver/src/output/OutputGPIOInterface.h b/FlippR-Driver/src/output/OutputGPIOInterface.h index f3894e0..32f8f4e 100644 --- a/FlippR-Driver/src/output/OutputGPIOInterface.h +++ b/FlippR-Driver/src/output/OutputGPIOInterface.h @@ -33,9 +33,14 @@ public: void deactivate(items::DriverBoardItem *driver_board_item) override; void deactivate(items::Item *sound) override; - void write_display(std::shared_ptr display) override; + void write_display(items::IDisplay &display) override; private: + void write_display_digit(const uint8_t display_address, const char &content, const uint8_t &position); + void select_display_segment(const uint8_t &digit); + void select_display_digit(const char &content); + void run_display(const uint8_t &address); + void initialize_i2c_addresses(); void initialize_pins(); diff --git a/FlippR-Driver/src/output/items/Display.h b/FlippR-Driver/src/output/items/Display.h index c991351..dea6ef9 100644 --- a/FlippR-Driver/src/output/items/Display.h +++ b/FlippR-Driver/src/output/items/Display.h @@ -29,7 +29,8 @@ public: virtual void write_score(int score); virtual void write_content(std::array content); - virtual std::vector get_content(); + std::vector get_content() override; + uint8_t get_address() override; public: std::array content; diff --git a/FlippR-Driver/src/output/items/IDisplay.h b/FlippR-Driver/src/output/items/IDisplay.h index b6efc10..c3695b1 100644 --- a/FlippR-Driver/src/output/items/IDisplay.h +++ b/FlippR-Driver/src/output/items/IDisplay.h @@ -9,6 +9,7 @@ #define _SRC_OUTPUT_IDISPLAY_H_ #include +#include namespace flippR_driver { @@ -23,6 +24,7 @@ class IDisplay public: virtual ~IDisplay() = default; + virtual uint8_t get_address() = 0; virtual std::vector get_content() = 0; };