fixed blocking bug

This commit is contained in:
Bruno Hütter 2020-12-04 14:32:52 +01:00
parent 54b3399aca
commit 5fe396173b
4 changed files with 32 additions and 12 deletions

View File

@ -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

View File

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

View File

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

View File

@ -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"