Create 'handledDisplay' class
To abstract rather complex functions for 7 segment displays e.g. blink text, scroll text... a class was created. This makes it possible to have 2 instances for displayTop and displayBottom resulting in no duplicate code
This commit is contained in:
parent
6acf99d894
commit
586c335896
@ -145,12 +145,15 @@ void task_control(void *pvParameter)
|
|||||||
encoder_queue = init_encoder(&encoder);
|
encoder_queue = init_encoder(&encoder);
|
||||||
|
|
||||||
//initialize display
|
//initialize display
|
||||||
display_init(); //outsourced in display.c
|
max7219_t two7SegDisplays = display_init();
|
||||||
|
//create two separate handled display instances
|
||||||
|
handledDisplay displayTop(two7SegDisplays, 0);
|
||||||
|
handledDisplay displayBot(two7SegDisplays, 8);
|
||||||
|
|
||||||
//--- display welcome msg ---
|
//--- display welcome msg ---
|
||||||
//display welcome message on two 7 segment displays
|
//display welcome message on two 7 segment displays
|
||||||
//currently show name and date and scrolling 'hello'
|
//currently show name and date and scrolling 'hello'
|
||||||
display_ShowWelcomeMsg();
|
display_ShowWelcomeMsg(two7SegDisplays);
|
||||||
|
|
||||||
|
|
||||||
//================
|
//================
|
||||||
@ -338,7 +341,7 @@ void task_control(void *pvParameter)
|
|||||||
// 123456789
|
// 123456789
|
||||||
//limit length to 8 digits + decimal point (drop decimal places when it does not fit)
|
//limit length to 8 digits + decimal point (drop decimal places when it does not fit)
|
||||||
sprintf(buf_disp1, "%.9s", buf_tmp);
|
sprintf(buf_disp1, "%.9s", buf_tmp);
|
||||||
display1_showString(buf_disp1);
|
displayTop.showString(buf_disp1);
|
||||||
|
|
||||||
|
|
||||||
//--------------------------
|
//--------------------------
|
||||||
@ -347,18 +350,18 @@ void task_control(void *pvParameter)
|
|||||||
//setting target length: blink target length
|
//setting target length: blink target length
|
||||||
if (SW_SET.state == true){
|
if (SW_SET.state == true){
|
||||||
sprintf(buf_tmp, "S0LL%5.3f", (float)lengthTarget/1000);
|
sprintf(buf_tmp, "S0LL%5.3f", (float)lengthTarget/1000);
|
||||||
display2_blinkStrings(buf_tmp, " ", 400, 100);
|
displayBot.blinkStrings(buf_tmp, " ", 300, 100);
|
||||||
}
|
}
|
||||||
//manual state: blink "manual"
|
//manual state: blink "manual"
|
||||||
else if (controlState == MANUAL) {
|
else if (controlState == MANUAL) {
|
||||||
display2_blinkStrings(" MANUAL ", " ", 1000, 500);
|
displayBot.blinkStrings(" MANUAL ", " ", 1000, 800);
|
||||||
}
|
}
|
||||||
//otherwise show target length
|
//otherwise show target length
|
||||||
else {
|
else {
|
||||||
//sprintf(buf_disp2, "%06.1f cm", (float)lengthTarget/10); //cm
|
//sprintf(buf_disp2, "%06.1f cm", (float)lengthTarget/10); //cm
|
||||||
sprintf(buf_tmp, "S0LL%5.3f", (float)lengthTarget/1000); //m
|
sprintf(buf_tmp, "S0LL%5.3f", (float)lengthTarget/1000); //m
|
||||||
// 1234 5678
|
// 1234 5678
|
||||||
display2_showString(buf_tmp);
|
displayBot.showString(buf_tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@ extern "C"
|
|||||||
#include "driver/adc.h"
|
#include "driver/adc.h"
|
||||||
|
|
||||||
#include "rotary_encoder.h"
|
#include "rotary_encoder.h"
|
||||||
|
#include "max7219.h"
|
||||||
|
|
||||||
}
|
}
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
179
main/display.cpp
179
main/display.cpp
@ -3,23 +3,15 @@
|
|||||||
|
|
||||||
//=== variables ===
|
//=== variables ===
|
||||||
static const char *TAG = "display"; //tag for logging
|
static const char *TAG = "display"; //tag for logging
|
||||||
max7219_t display;
|
|
||||||
|
|
||||||
bool disp1_blinkMode = false;
|
|
||||||
|
|
||||||
char disp2_strOn[20];
|
|
||||||
char disp2_strOff[20];
|
|
||||||
bool disp2_state = false;
|
|
||||||
bool disp2_blinkMode = false;
|
|
||||||
uint32_t disp2_timestampOn;
|
|
||||||
uint32_t disp2_timestampOff;
|
|
||||||
uint32_t disp2_msOn;
|
|
||||||
uint32_t disp2_msOff;
|
|
||||||
|
|
||||||
//========================
|
//==============================
|
||||||
//===== init display =====
|
//======== init display ========
|
||||||
//========================
|
//==============================
|
||||||
void display_init(){
|
//initialize display with parameters defined in config.hpp
|
||||||
|
//TODO: dont use global variables/macros here
|
||||||
|
max7219_t display_init(){
|
||||||
|
|
||||||
ESP_LOGI(TAG, "initializing display...");
|
ESP_LOGI(TAG, "initializing display...");
|
||||||
// Configure SPI bus
|
// Configure SPI bus
|
||||||
@ -43,124 +35,115 @@ void display_init(){
|
|||||||
ESP_ERROR_CHECK(max7219_init(&dev));
|
ESP_ERROR_CHECK(max7219_init(&dev));
|
||||||
//0...15
|
//0...15
|
||||||
ESP_ERROR_CHECK(max7219_set_brightness(&dev, 12));
|
ESP_ERROR_CHECK(max7219_set_brightness(&dev, 12));
|
||||||
//return dev;
|
return dev;
|
||||||
display = dev;
|
//display = dev;
|
||||||
ESP_LOGI(TAG, "initializing display - done");
|
ESP_LOGI(TAG, "initializing display - done");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void display_ShowWelcomeMsg(){
|
//===================================
|
||||||
//-----------------------------------
|
//======= display welcome msg =======
|
||||||
//------- display welcome msg -------
|
//===================================
|
||||||
//-----------------------------------
|
void display_ShowWelcomeMsg(max7219_t dev){
|
||||||
//display welcome message on two 7 segment displays
|
//display welcome message on two 7 segment displays
|
||||||
//show name and date
|
//show name and date
|
||||||
ESP_LOGI(TAG, "showing startup message...");
|
ESP_LOGI(TAG, "showing startup message...");
|
||||||
max7219_clear(&display);
|
max7219_clear(&dev);
|
||||||
max7219_draw_text_7seg(&display, 0, "CUTTER 20.08.2022");
|
max7219_draw_text_7seg(&dev, 0, "CUTTER 20.08.2022");
|
||||||
// 1234567812 34 5678
|
// 1234567812 34 5678
|
||||||
vTaskDelay(pdMS_TO_TICKS(700));
|
vTaskDelay(pdMS_TO_TICKS(700));
|
||||||
//scroll "hello" over 2 displays
|
//scroll "hello" over 2 displays
|
||||||
for (int offset = 0; offset < 23; offset++) {
|
for (int offset = 0; offset < 23; offset++) {
|
||||||
max7219_clear(&display);
|
max7219_clear(&dev);
|
||||||
char hello[40] = " HELL0 ";
|
char hello[40] = " HELL0 ";
|
||||||
max7219_draw_text_7seg(&display, 0, hello + (22 - offset) );
|
max7219_draw_text_7seg(&dev, 0, hello + (22 - offset) );
|
||||||
vTaskDelay(pdMS_TO_TICKS(50));
|
vTaskDelay(pdMS_TO_TICKS(50));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void display1_showString(const char * buf){
|
|
||||||
max7219_draw_text_7seg(&display, 0, buf);
|
|
||||||
disp1_blinkMode = false;
|
|
||||||
}
|
|
||||||
void display2_showString(const char * buf){
|
|
||||||
max7219_draw_text_7seg(&display, 8, buf);
|
|
||||||
disp2_blinkMode = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void display_showString(uint8_t pos, const char * buf){
|
|
||||||
max7219_draw_text_7seg(&display, pos, buf);
|
//---------------------------------
|
||||||
|
//---------- constructor ----------
|
||||||
|
//---------------------------------
|
||||||
|
handledDisplay::handledDisplay(max7219_t displayDevice, uint8_t posStart_f) {
|
||||||
|
ESP_LOGI(TAG, "Creating handledDisplay instance with startPos at %i", posStart);
|
||||||
|
//copy variables
|
||||||
|
dev = displayDevice;
|
||||||
|
posStart = posStart_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------
|
||||||
|
//---------- showString ----------
|
||||||
|
//--------------------------------
|
||||||
|
//function that displays a given string on the display
|
||||||
|
void handledDisplay::showString(const char * buf, uint8_t pos_f){
|
||||||
|
//calculate actual absolute position
|
||||||
|
uint8_t pos = posStart + pos_f;
|
||||||
|
//draw string on display
|
||||||
|
max7219_draw_text_7seg(&dev, pos, buf);
|
||||||
|
//disable blinking mode
|
||||||
|
blinkMode = false;
|
||||||
|
}
|
||||||
|
|
||||||
//function that handles blinking of display2
|
|
||||||
void display2_handle(){
|
|
||||||
if (disp2_blinkMode == false){
|
//----------------------------------
|
||||||
return;
|
//---------- blinkStrings ----------
|
||||||
|
//----------------------------------
|
||||||
|
//function switches between two strings in a given interval
|
||||||
|
void handledDisplay::blinkStrings(const char * strOn_f, const char * strOff_f, uint32_t msOn_f, uint32_t msOff_f){
|
||||||
|
//copy/update variables
|
||||||
|
strcpy(strOn, strOn_f);
|
||||||
|
strcpy(strOff, strOff_f);
|
||||||
|
msOn = msOn_f;
|
||||||
|
msOff = msOff_f;
|
||||||
|
//if changed to blink mode just now
|
||||||
|
if (blinkMode == false) {
|
||||||
|
ESP_LOGI(TAG, "pos:%i changing to blink mode", posStart);
|
||||||
|
blinkMode = true;
|
||||||
|
//start with on state
|
||||||
|
state = true;
|
||||||
|
timestampOn = esp_log_timestamp();
|
||||||
}
|
}
|
||||||
|
//run handle function for display update
|
||||||
|
handle();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------
|
||||||
|
//------------ handle ------------
|
||||||
|
//--------------------------------
|
||||||
|
//function that handles blinking of display2
|
||||||
|
void handledDisplay::handle() {
|
||||||
|
if (blinkMode == false){
|
||||||
|
return; //not in blinking mode - nothing todo
|
||||||
|
}
|
||||||
|
|
||||||
//--- define state on/off ---
|
//--- define state on/off ---
|
||||||
if (disp2_state == true){ //display in ON state
|
if (state == true){ //display in ON state
|
||||||
if (esp_log_timestamp() - disp2_timestampOn > disp2_msOn){
|
if (esp_log_timestamp() - timestampOn > msOn){
|
||||||
disp2_state = false;
|
state = false;
|
||||||
disp2_timestampOff = esp_log_timestamp();
|
timestampOff = esp_log_timestamp();
|
||||||
}
|
}
|
||||||
} else { //display in OFF state
|
} else { //display in OFF state
|
||||||
if (esp_log_timestamp() - disp2_timestampOff > disp2_msOff) {
|
if (esp_log_timestamp() - timestampOff > msOff) {
|
||||||
disp2_state = true;
|
state = true;
|
||||||
disp2_timestampOn = esp_log_timestamp();
|
timestampOn = esp_log_timestamp();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--- draw text of current state ---
|
//--- draw text of current state ---
|
||||||
if (disp2_state) {
|
if (state) {
|
||||||
max7219_draw_text_7seg(&display, 8, disp2_strOn);
|
max7219_draw_text_7seg(&dev, posStart, strOn);
|
||||||
} else {
|
} else {
|
||||||
max7219_draw_text_7seg(&display, 8, disp2_strOff);
|
max7219_draw_text_7seg(&dev, posStart, strOff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//function switches between two strings in a given interval
|
|
||||||
void display2_blinkStrings(const char * strOn, const char * strOff, uint32_t msOn, uint32_t msOff){
|
|
||||||
//copy variables
|
|
||||||
strcpy(disp2_strOn, strOn);
|
|
||||||
strcpy(disp2_strOff, strOff);
|
|
||||||
disp2_msOn = msOn;
|
|
||||||
disp2_msOff = msOff;
|
|
||||||
//set to blink mode
|
|
||||||
disp2_blinkMode = true;
|
|
||||||
//run handle function for display update
|
|
||||||
display2_handle();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// //---------------------------
|
|
||||||
// //--------- display ---------
|
|
||||||
// //---------------------------
|
|
||||||
// //-- show current position on display1 ---
|
|
||||||
// //sprintf(buf_tmp, "%06.1f cm", (float)lengthNow/10); //cm
|
|
||||||
// sprintf(buf_tmp, "1ST %5.4f", (float)lengthNow/1000); //m
|
|
||||||
// // 123456789
|
|
||||||
// //limit length to 8 digits + decimal point (drop decimal places when it does not fit)
|
|
||||||
// sprintf(buf_disp1, "%.9s", buf_tmp);
|
|
||||||
//
|
|
||||||
// //--- show target length on display2 ---
|
|
||||||
// //sprintf(buf_disp2, "%06.1f cm", (float)lengthTarget/10); //cm
|
|
||||||
// sprintf(buf_disp2, "S0LL%5.3f", (float)lengthTarget/1000); //m
|
|
||||||
// // 1234 5678
|
|
||||||
//
|
|
||||||
// //TODO: blink disp2 when set button pressed
|
|
||||||
// //TODO: blink disp2 when preset button pressed (exept manual mode)
|
|
||||||
// //TODO: write "MAN CTL" to disp2 when in manual mode
|
|
||||||
// //TODO: display or blink "REACHED" when reached state and start pressed
|
|
||||||
//
|
|
||||||
// //--- write to display ---
|
|
||||||
// //max7219_clear(&display); //results in flickering display if same value anyways
|
|
||||||
// max7219_draw_text_7seg(&display, 0, buf_disp1);
|
|
||||||
// max7219_draw_text_7seg(&display, 8, buf_disp2);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
@ -18,13 +18,41 @@ extern "C"
|
|||||||
|
|
||||||
#include "config.hpp"
|
#include "config.hpp"
|
||||||
|
|
||||||
void display_init();
|
//function for initializing the display using configuration from macros in config.hpp
|
||||||
void display_ShowWelcomeMsg();
|
max7219_t display_init();
|
||||||
void display1_showString(const char * buf);
|
|
||||||
void display2_showString(const char * buf);
|
|
||||||
void display_showString(uint8_t pos, const char * buf);
|
|
||||||
|
|
||||||
//function that handles blinking of display2
|
//show welcome message on the entire display
|
||||||
void display2_handle();
|
void display_ShowWelcomeMsg(max7219_t displayDevice);
|
||||||
//function switches between two strings in a given interval
|
|
||||||
void display2_blinkStrings(const char * strOn, const char * strOff, uint32_t msOn, uint32_t msOff);
|
|
||||||
|
class handledDisplay {
|
||||||
|
public:
|
||||||
|
//--- constructor ---
|
||||||
|
//TODO add posMax to prevent writing in segments of other instance
|
||||||
|
handledDisplay(max7219_t displayDevice, uint8_t posStart);
|
||||||
|
|
||||||
|
//--- methods ---
|
||||||
|
void showString(const char * buf, uint8_t pos = 0);
|
||||||
|
//function switches between two strings in a given interval
|
||||||
|
void blinkStrings(const char * strOn, const char * strOff, uint32_t msOn, uint32_t msOff);
|
||||||
|
//TODO: add 'scroll string' method
|
||||||
|
//function that handles blinking of display
|
||||||
|
void handle();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
//--- variables ---
|
||||||
|
//config
|
||||||
|
max7219_t dev;
|
||||||
|
uint8_t posStart; //absolute position this display instance starts (e.g. multiple or very long 7 segment display)
|
||||||
|
|
||||||
|
//blink mode
|
||||||
|
char strOn[20];
|
||||||
|
char strOff[20];
|
||||||
|
bool state = false;
|
||||||
|
bool blinkMode = false;
|
||||||
|
uint32_t msOn;
|
||||||
|
uint32_t msOff;
|
||||||
|
uint32_t timestampOn;
|
||||||
|
uint32_t timestampOff;
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user