Try to implement DisplayController

This commit is contained in:
Johannes Wendel
2020-02-19 13:43:59 +01:00
parent a2e3ede062
commit e4ed6654aa
9 changed files with 31 additions and 28 deletions

View File

@@ -15,7 +15,8 @@
"C": 6, "C": 6,
"D": 5 "D": 5
}, },
"run" : 12 "run" : 21,
"lt" : 26
}, },
"displays" : "displays" :
[ [

View File

@@ -5,6 +5,7 @@
#include "output/detail/DisplayBoardPinController.h" #include "output/detail/DisplayBoardPinController.h"
#include <thread> #include <thread>
#include <utility/wiringPiTesting.hpp>
#include "utility/config.h" #include "utility/config.h"
@@ -16,12 +17,10 @@ namespace detail
{ {
DisplayBoardPinController::DisplayBoardPinController(std::map<std::string, uint8_t> & pins_display) : DisplayBoardPinController::DisplayBoardPinController(std::map<std::string, uint8_t> & pins_display) :
pins_display_board{std::move(pins_display)} pins_display_board{}
{ {
this->set_pin_map(pins_display);
initialize_pins_output(); initialize_pins_output();
clear();
CLOG(DEBUG, OUTPUT_LOGGER) << "Created DisplayBoardPinController"; CLOG(DEBUG, OUTPUT_LOGGER) << "Created DisplayBoardPinController";
} }
@@ -31,26 +30,20 @@ DisplayBoardPinController::DisplayBoardPinController() :
CLOG(DEBUG, OUTPUT_LOGGER) << "Created DisplayBoardPinController without pin map"; CLOG(DEBUG, OUTPUT_LOGGER) << "Created DisplayBoardPinController without pin map";
} }
void DisplayBoardPinController::clear()
{
std::for_each(this->pins_display_board.begin(), this->pins_display_board.end(), [](auto& pin) { write_pin(pin.second, 0); });
}
void DisplayBoardPinController::initDisplay(const items::OutputDisplay &display) const void DisplayBoardPinController::initDisplay(const items::OutputDisplay &display) const
{ {
initialize_output_pin(display.get_address()); initialize_output_pin(display.get_address());
write_pin(display.get_address(), DISPLAY_LOW);
write_pin(display.get_address(), 0);
} }
void DisplayBoardPinController::activate_displays() const void DisplayBoardPinController::activate_displays() const
{ {
write_pin(pins_display_board.at("run"), 1); write_pin(pins_display_board.at("run"), DISPLAY_LOW);
} }
void DisplayBoardPinController::deactivate_displays() const void DisplayBoardPinController::deactivate_displays() const
{ {
write_pin(pins_display_board.at("run"), 0); write_pin(pins_display_board.at("run"), DISPLAY_HIGH);
} }
void DisplayBoardPinController::write_display(const items::OutputDisplay &display) const void DisplayBoardPinController::write_display(const items::OutputDisplay &display) const
@@ -66,11 +59,8 @@ void DisplayBoardPinController::write_display(const items::OutputDisplay &displa
void DisplayBoardPinController::write_display_digit(uint8_t display_address, uint8_t content, uint8_t position) const void DisplayBoardPinController::write_display_digit(uint8_t display_address, uint8_t content, uint8_t position) const
{ {
select_display_segment(position); select_display_segment(position);
select_display_digit(content); select_display_digit(content);
run_display(display_address); run_display(display_address);
std::this_thread::sleep_for(std::chrono::milliseconds(DISPLAY_SLEEP_TIME_MILLI)); std::this_thread::sleep_for(std::chrono::milliseconds(DISPLAY_SLEEP_TIME_MILLI));
} }
@@ -91,25 +81,33 @@ void DisplayBoardPinController::select_display_digit(uint8_t content) const
void DisplayBoardPinController::run_display(uint8_t address) const void DisplayBoardPinController::run_display(uint8_t address) const
{ {
write_pin(address, 1); write_pin(address, DISPLAY_HIGH);
write_pin(address, 0); write_pin(address, DISPLAY_LOW);
} }
void DisplayBoardPinController::set_pin_map(std::map<std::string, uint8_t> & pins_display) void DisplayBoardPinController::set_pin_map(std::map<std::string, uint8_t> & pins_display)
{ {
this->pins_display_board.insert(pins_display.begin(), pins_display.end()); this->pins_display_board.insert(pins_display.begin(), pins_display.end());
this->initialize_pins_output(); this->initialize_pins_output();
this->init_pin_states();
clear();
} }
void DisplayBoardPinController::initialize_pins_output() void DisplayBoardPinController::initialize_pins_output()
{ {
for(auto& pin : this->pins_display_board) { for(auto& pin : this->pins_display_board)
{
initialize_output_pin(pin.second); initialize_output_pin(pin.second);
} }
} }
void DisplayBoardPinController::init_pin_states()
{
for(auto& pin : this->pins_display_board)
{
write_pin(pin.second, DISPLAY_LOW);
}
write_pin(this->pins_display_board["run"], DISPLAY_HIGH);
}
} }
} }
} }

View File

@@ -34,11 +34,11 @@ public:
private: private:
void initialize_pins_output(); void initialize_pins_output();
void clear();
void write_display_digit(uint8_t display_address, uint8_t content, uint8_t position) const; 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_segment(uint8_t digit) const;
void select_display_digit(uint8_t content) const; void select_display_digit(uint8_t content) const;
void run_display(uint8_t address) const; void run_display(uint8_t address) const;
void init_pin_states();
private: private:
std::map<std::string, uint8_t> pins_display_board; std::map<std::string, uint8_t> pins_display_board;

View File

@@ -34,7 +34,7 @@ DisplayController::DisplayController(std::map<std::string, std::shared_ptr<items
activate_displays(); activate_displays();
//this->display_cycle_thread = std::thread(&DisplayController::cycle_displays, this); this->display_cycle_thread = std::thread(&DisplayController::cycle_displays, this);
CLOG(DEBUG, OUTPUT_LOGGER) << "Created DisplayController and started cycling them."; CLOG(DEBUG, OUTPUT_LOGGER) << "Created DisplayController and started cycling them.";
} }

View File

@@ -45,6 +45,7 @@ void DisplayFactory::create_pin_map()
{ {
nlohmann::json board_config = this->object.at(config_path::display_board); nlohmann::json board_config = this->object.at(config_path::display_board);
this->pin_map["run"] = board_config.at(config_path::run_pin); this->pin_map["run"] = board_config.at(config_path::run_pin);
this->pin_map["lt"] = board_config.at(config_path::display_lt_pin);
nlohmann::json segment_select = board_config.at(config_path::display_segement_select); nlohmann::json segment_select = board_config.at(config_path::display_segement_select);
this->pin_map["segment_select_A"] = segment_select.at("A"); this->pin_map["segment_select_A"] = segment_select.at("A");

View File

@@ -48,6 +48,7 @@ namespace config_path
const char display_digit_select[] = "digit_select"; const char display_digit_select[] = "digit_select";
const char display_digits[] = "digits"; const char display_digits[] = "digits";
const char display_list[] = "displays"; const char display_list[] = "displays";
const char display_lt_pin[] = "lt";
} }
class ItemFactory class ItemFactory

View File

@@ -45,8 +45,8 @@ std::string Display::fit_score_string(std::string & score_string, const unsigned
if (score_length > length) if (score_length > length)
{ {
CLOG(DEBUG, OUTPUT_LOGGER) << "Score too long for display"; CLOG(DEBUG, OUTPUT_LOGGER) << "Score too long for display";
std::string full_display; std::string filled_display;
return full_display.insert(0, length, '9'); return filled_display.insert(0, length, '9');
} }
score_string.insert(0, length - score_length, '\0'); score_string.insert(0, length - score_length, '\0');

View File

@@ -10,6 +10,8 @@
#define INPUT 0 #define INPUT 0
#define OUTPUT 1 #define OUTPUT 1
#define DISPLAY_HIGH 0
#define DISPLAY_LOW 1
static int wiringPiSetup() static int wiringPiSetup()
{ {

0
cli/main.py Normal file → Executable file
View File