From cdb81935ea4fb13b95e574aa8509b3252d302220 Mon Sep 17 00:00:00 2001 From: Korneliusz Osmenda Date: Mon, 22 Aug 2022 21:58:54 +0200 Subject: [PATCH] Fix display (needs new zephyr) --- boards/arm/controller/controller.dts | 7 +++- src/display.cpp | 18 ++++---- src/display.hpp | 19 +++++++++ src/main.cpp | 62 ++++++++++++++++++---------- src/main_modules.hpp | 3 ++ 5 files changed, 78 insertions(+), 31 deletions(-) diff --git a/boards/arm/controller/controller.dts b/boards/arm/controller/controller.dts index ed81a02..95b7021 100644 --- a/boards/arm/controller/controller.dts +++ b/boards/arm/controller/controller.dts @@ -108,18 +108,21 @@ spi-max-frequency = <4000000>; reg = <0>; width = <296>; - height = <136>; // it's 128 but needs 136 + height = <128>; pp-width-bits = <8>; pp-height-bits = <16>; dc-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 8 GPIO_ACTIVE_LOW>; busy-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; gdv = [17]; - sdv = [41 00 32]; + sdv = [41 B0 32]; vcom = <0x36>; //orientation-flipped; border-waveform = <0xC0>; //softstart = [d7 d6 9d]; + cntrl1-data = [00 80]; + data-mode-2; + display-option-data = [00 00 00 00 00 40 00 00 00 00]; lut-initial = [ 80 66 00 00 00 00 00 00 40 00 00 00 10 66 00 00 diff --git a/src/display.cpp b/src/display.cpp index 1e523b0..d3a7b20 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -30,9 +30,12 @@ int Display::Init() void Display::blank_off() { - k_mutex_lock(&mut, K_FOREVER); display_blanking_off(dev); - k_mutex_unlock(&mut); +} + +void Display::blank_on() +{ + display_blanking_on(dev); } void Display::print_chr(int x, int y, char c) @@ -52,16 +55,15 @@ void Display::print_chr(int x, int y, char c) .height=16, .pitch=8 }; - - - k_mutex_lock(&mut, K_FOREVER); display_write(dev,x,y,&desc,my_font_[idx]); - k_mutex_unlock(&mut); - } void Display::print_str(int x, int y, const char* str) { - + while(*str) + { + print_chr(x,y,*str++); + x+=8; + } } diff --git a/src/display.hpp b/src/display.hpp index 8ef10be..e4c92d9 100644 --- a/src/display.hpp +++ b/src/display.hpp @@ -14,8 +14,27 @@ class Display { const struct device *dev; k_mutex mut; public: + class Display_lock + { + k_mutex *m; + public: + Display_lock(k_mutex *_m) + : m(_m) + { + k_mutex_lock(m, K_FOREVER); + } + ~Display_lock() + { + k_mutex_unlock(m); + } + }; int Init(); + Display_lock lock() + { + return Display_lock(&mut); + } void blank_off(); + void blank_on(); void print_chr(int x, int y, char c); void print_str(int x, int y, const char* str); }; diff --git a/src/main.cpp b/src/main.cpp index 2c2ef1b..95b3423 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -58,8 +58,35 @@ void bt_enabled(int err) barrot_init(); } +#define DISPLAY_STACK_SIZE 500 +K_THREAD_STACK_DEFINE(display_stack_area, DISPLAY_STACK_SIZE); +struct k_thread display_thread_data; + +void display_thread(void*,void*,void*) +{ + int spinner_idx=0; + char spinner[] = "/-\\|"; + while(true) + { + k_sem_take(®_data.new_sample,K_FOREVER); + k_mutex_lock(®_data.mut, K_FOREVER); + Reg_data::Data cached = reg_data.d; + k_mutex_unlock(®_data.mut); + + { + auto l = display.lock(); + display.print_chr(0,0,spinner[spinner_idx++]); + display.blank_off(); + } + if (!spinner[spinner_idx]) + spinner_idx=0; + } +} + int main(void) { + k_mutex_init(®_data.mut); + if(!tlay2.Init()) return 1; @@ -76,27 +103,19 @@ int main(void) return 1; } + k_sem_init(®_data.new_sample, 0, 1); - k_mutex_init(®_data.mut); - + k_thread_create(&display_thread_data, display_stack_area, + K_THREAD_STACK_SIZEOF(display_stack_area), + display_thread, + NULL, NULL, NULL, + 5, 0, K_NO_WAIT); if (init_modbus_client()) { tlay2.printt("Modbus RTU client initialization failed"); return 1; } - display.blank_off(); - - display.print_chr(32,0,'a'); - - display.print_chr(32,32,'a'); - - display.print_chr(48,48,'a'); - - display.print_chr(48,128,'a'); - - display.print_chr(32,120,'a'); - while(1) { uint16_t holding_reg[11]; @@ -107,14 +126,15 @@ int main(void) continue; } k_mutex_lock(®_data.mut, K_FOREVER); - reg_data.b_soc = holding_reg[0]; - reg_data.b_v = holding_reg[1]; - reg_data.b_a = holding_reg[2]; - reg_data.l_v = holding_reg[5]; - reg_data.l_a = holding_reg[6]; - reg_data.s_v = holding_reg[9]; - reg_data.s_a = holding_reg[10]; + reg_data.d.b_soc = holding_reg[0]; + reg_data.d.b_v = holding_reg[1]; + reg_data.d.b_a = holding_reg[2]; + reg_data.d.l_v = holding_reg[5]; + reg_data.d.l_a = holding_reg[6]; + reg_data.d.s_v = holding_reg[9]; + reg_data.d.s_a = holding_reg[10]; k_mutex_unlock(®_data.mut); + k_sem_give(®_data.new_sample); printt("Read ok"); //k_msleep(1000); diff --git a/src/main_modules.hpp b/src/main_modules.hpp index f037401..386d024 100644 --- a/src/main_modules.hpp +++ b/src/main_modules.hpp @@ -15,6 +15,7 @@ #include struct Reg_data { + struct Data { uint16_t b_soc; uint16_t b_v; int16_t b_a; @@ -22,7 +23,9 @@ struct Reg_data { uint16_t l_a; uint16_t s_v; uint16_t s_a; + } d; k_mutex mut; + k_sem new_sample; }; extern struct Reg_data reg_data;