implemented display logic

This commit is contained in:
Jonas Zeunert
2018-12-11 22:45:42 +01:00
parent 50f2ae087a
commit e442f4c021
6 changed files with 52 additions and 7 deletions

View File

@@ -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);
}
}
}

View File

@@ -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<output::items::IDisplay> display) = 0;
virtual void write_display(items::IDisplay &display) = 0;
//Display gpio interface!
};

View File

@@ -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<output::items::IDisplay> display)
void OutputGPIOInterface::write_display(IDisplay &display)
{
return;
std::vector<char> 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);
}
}

View File

@@ -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<output::items::IDisplay> 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();

View File

@@ -29,7 +29,8 @@ public:
virtual void write_score(int score);
virtual void write_content(std::array<char, DigitCount> content);
virtual std::vector<char> get_content();
std::vector<char> get_content() override;
uint8_t get_address() override;
public:
std::array<char, DigitCount> content;

View File

@@ -9,6 +9,7 @@
#define _SRC_OUTPUT_IDISPLAY_H_
#include <vector>
#include <cstdint>
namespace flippR_driver
{
@@ -23,6 +24,7 @@ class IDisplay
public:
virtual ~IDisplay() = default;
virtual uint8_t get_address() = 0;
virtual std::vector<char> get_content() = 0;
};