From 5fe396173b35caf055cc84da54de036a08e40622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20H=C3=BCtter?= Date: Fri, 4 Dec 2020 14:32:52 +0100 Subject: [PATCH] fixed blocking bug --- README.md | 12 ++++----- src/display/display.cpp | 2 +- src/display/display.h | 4 +-- ...ingUserinterface.cpp => myU8g2changes.cpp} | 26 +++++++++++++++++-- 4 files changed, 32 insertions(+), 12 deletions(-) rename src/display/{nonblockingUserinterface.cpp => myU8g2changes.cpp} (94%) diff --git a/README.md b/README.md index 0197955..dc2e443 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,11 @@ Die aktuell einzige externe Abhängigkeit ist die [U8g2-Library von olikraus](ht ## Probleme, offene Fragen -- ***Großes Problem:*** Während des Gedrückthaltens einer Menütaste am Regler blockiert das Programm fast (nur noch ca. 10 Loops / Sekunde). In diesem Fall funktioiert Modbus nicht mehr. -***### TODO - Das liegt an der Zeit, die gebraucht wird, um das Display zu beschreiben (70 - 100+ ms). Wenn praktisch dauernd das Display neu beschrieben wird, bleibt einfach keine Zeit für was anderes -- SCHNELL EINE LÖSUNG FINDEN*** -Eine Erhöhung der SPI-Clockrate kommt leider nicht in Frage, da im Test das Display dabei nicht mehr richtig funktionierte. Folgend die ungefähr benötigten Zeiten in ms, um den Displayinhalt aufzubauen (Homescreen, Startmenü): - - U8G2_ST7920_128X64_1_HW_SPI: 192, 125 - - U8G2_ST7920_128X64_2_HW_SPI: 131, 92 - - U8G2_ST7920_128X64_F_HW_SPI: 87, 67 -- Der Durchschnittswert der Temperatur wird nicht mehr gebildet (außer das Macro _MODBUS_AVERAGE_TEMPERATURES ist 1 - dafür reicht der RAM aber eh nicht ;-) ). +- Das Macro *_FAST_STEP_MS* (Millisekunden, nach denen eine gedrückte Menütaste ein MenuEvent auslöst) darf nicht auf unter 100 gesetzt werden, da die Displayroutinen sonst zu sehr blockieren und Modbus nicht mehr funktioniert. Dabei muss jedenfalls der Konstruktor ***U8G2_ST7920_128X64_F_HW_SPI*** für das Display verwendet werden, da die Displayroutinen sonst zu langsam sind (siehe Liste unten). Eine Erhöhung der SPI-Clockrate kommt leider nicht in Frage, da im Test das Display dabei nicht mehr richtig funktionierte. Folgend die ungefähr benötigten Zeiten (abhängig vom Konstruktor) in ms, um den Displayinhalt aufzubauen (Homescreen, Startmenü): + - *U8G2_ST7920_128X64_1_HW_SPI*: 192, 125 + - *U8G2_ST7920_128X64_2_HW_SPI*: 131, 92 + - *U8G2_ST7920_128X64_F_HW_SPI*: 87, 67 +- Der Durchschnittswert der Temperatur wird nicht mehr gebildet (außer das Macro *_MODBUS_AVERAGE_TEMPERATURES* ist 1 - dafür reicht der RAM aber eh nicht ;-) ). ***Frage:*** Ist die Mittelung der Temperatur wirklich nicht notwendig? # Modbus diff --git a/src/display/display.cpp b/src/display/display.cpp index a9cb978..ca26a6c 100644 --- a/src/display/display.cpp +++ b/src/display/display.cpp @@ -612,7 +612,7 @@ uint8_t Display::_event() event = U8X8_MSG_GPIO_MENU_NEXT; else if (prev) event = U8X8_MSG_GPIO_MENU_PREV; - else if (cancel) + else if (cancel && _selection) event = _BACK_TO_HOME_SCREEN; if (millis() - _checkFastStepTime > _BEGIN_BIG_STEPS_DELAY) _enableBigSteps = true; diff --git a/src/display/display.h b/src/display/display.h index e0382ff..bdff0e7 100644 --- a/src/display/display.h +++ b/src/display/display.h @@ -17,7 +17,7 @@ #define _BEGIN_FAST_STEPS_DELAY 500 #define _BEGIN_BIG_STEPS_DELAY 3000 -#define _FAST_STEP_MS 50 +#define _FAST_STEP_MS 100 #define _BIG_STEP 10 #define _BACK_TO_HOME_SCREEN 1 @@ -76,6 +76,7 @@ extern "C" uint8_t my_UserInterfaceMessage(u8g2_t *u8g2, const char *title1, con extern "C" uint8_t my_UserInterfaceSelectionList(u8g2_t *u8g2, const char *title, uint8_t start_pos, const char *sl); // extern "C" void my_UserInterfaceInputValue(u8g2_t *u8g2, const char *title, const char *pre, uint8_t value, uint8_t digits, const char *post); extern "C" void my_UserInterfaceInputValueString(u8g2_t *u8g2, const char *title, const char *sub, const char *text); +// extern "C" uint8_t my_read_pin_state(u8x8_t *u8x8); class Display : public U8G2_ST7920_128X64_F_HW_SPI { @@ -109,7 +110,6 @@ private: unsigned long _checkFastStepTime; // letzte Zeit, zu der ein entsprechender Button NICHT gedrückt war unsigned long _lastFastStep; // letzte Zeit, zu der ein schneller Schritt ausgeführt wurde int _stepSize; // Um wieviel der entsprechende Wert auf einmal geändert werden soll - // String _str1, _str2; parameters *_params; values *_vals; diff --git a/src/display/nonblockingUserinterface.cpp b/src/display/myU8g2changes.cpp similarity index 94% rename from src/display/nonblockingUserinterface.cpp rename to src/display/myU8g2changes.cpp index 3a0dcf6..7784516 100644 --- a/src/display/nonblockingUserinterface.cpp +++ b/src/display/myU8g2changes.cpp @@ -1,11 +1,13 @@ /* - nonblockingUserinterface.cpp + myU8g2changes.cpp - These original files were modified to this file by brunotic: + This file contains brunotified (modified ;-) ) functions of the following + original files: U8g2/src/clib/u8g2_message.c U8g2/src/clib/u8g2_selection_list.c U8g2/src/clib/u8g2_input_value.c + U8g2/src/clib/u8g2_debounce.c |---------------- | ORIGINAL TEXT: @@ -337,4 +339,24 @@ void my_UserInterfaceInputValueString(u8g2_t *u8g2, const char *title, const cha // } while( u8g2_NextPage(u8g2) ); // } +// original u8x8_read_pin_state(), aber nicht static +uint8_t my_read_pin_state(u8x8_t *u8x8) +{ + uint8_t i; + uint8_t pin_state; + + pin_state = 255; /* be compatible with the setup of the default pin setup, which is 255 */ + for( i = 0; i < U8X8_PIN_INPUT_CNT; i++ ) + { + pin_state <<= 1; + + /* the callback function should put the return value into this variable */ + u8x8->gpio_result = 1; + u8x8_gpio_call(u8x8, U8X8_MSG_GPIO(i+U8X8_PIN_OUTPUT_CNT), 0); + pin_state |= u8x8->gpio_result & 1; + } + + return pin_state; +} + } //extern "C"