From 5ad4df344e31fccd4c095783fd2814869049839b Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Fri, 5 Dec 2014 20:45:54 +0100 Subject: [PATCH] Fixes #1017: Startup key stuck display --- radio/src/keys.cpp | 26 +++++++++++++++++++++----- radio/src/keys.h | 2 +- radio/src/opentx.cpp | 13 ++++++++++++- radio/src/targets/simu/simpgmspace.h | 1 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 16 files changed, 47 insertions(+), 7 deletions(-) diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 4d9fa3cc3..eddf6c341 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -159,22 +159,38 @@ void killEvents(uint8_t event) } } -void clearKeyEvents() +bool clearKeyEvents() { #if defined(PCBSKY9X) CoTickDelay(100); // 200ms #endif // loop until all keys are up +#if !defined(BOOT) + tmr10ms_t deadline = get_tmr10ms() + 300; // wait no more than 3 seconds +#endif + + while (keyDown()) { #if defined(SIMU) - while (keyDown()) SIMU_SLEEP(1/*ms*/); -#elif defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) && !defined(TELEMETREZ) - while (keyDown()) { wdt_reset(); rotencPoll(); } + SIMU_SLEEP_NORET(1/*ms*/); #else - while (keyDown()) wdt_reset(); + wdt_reset(); #endif +#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) && !defined(TELEMETREZ) + rotencPoll(); +#endif + +#if !defined(BOOT) + if (get_tmr10ms() >= deadline) { + //timeout expired, at least one key stuck + return false; + } +#endif + } + memclear(keys, sizeof(keys)); putEvent(0); + return true; } diff --git a/radio/src/keys.h b/radio/src/keys.h index 16bac5b55..09c603177 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -269,7 +269,7 @@ extern uint8_t s_evt; #define putEvent(evt) s_evt = evt -void clearKeyEvents(); +bool clearKeyEvents(); void pauseEvents(uint8_t enuk); void killEvents(uint8_t enuk); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 86c99c6f4..1de6279a8 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1116,7 +1116,18 @@ void checkAll() } #endif - clearKeyEvents(); + if (!clearKeyEvents()) { + displayPopup(STR_KEYSTUCK); + tmr10ms_t tgtime = get_tmr10ms() + 500; + while (tgtime != get_tmr10ms()) { +#if defined(SIMU) + SIMU_SLEEP(1); +#elif defined(CPUARM) + CoTickDelay(1); +#endif + wdt_reset(); + } + } START_SILENCE_PERIOD(); } diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 1c7e00585..b328cdf4a 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -354,6 +354,7 @@ extern uint8_t main_thread_running; #define getADC_bandgap() #define SIMU_SLEEP(x) do { if (!main_thread_running) return; sleep(x/*ms*/); } while (0) +#define SIMU_SLEEP_NORET(x) do { sleep(x/*ms*/); } while (0) void simuSetKey(uint8_t key, bool state); void simuSetTrim(uint8_t trim, bool state); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index f0c8e834a..f652b3a65 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -426,6 +426,7 @@ const pm_char STR_EEPROM_CONVERTING[] PROGMEM = TR_EEPROM_CONVERTING; const pm_char STR_THROTTLEWARN[] PROGMEM = TR_THROTTLEWARN; const pm_char STR_ALARMSWARN[] PROGMEM = TR_ALARMSWARN; const pm_char STR_SWITCHWARN[] PROGMEM = TR_SWITCHWARN; +const pm_char STR_KEYSTUCK[] PROGMEM = TR_KEYSTUCK; const pm_char STR_SPEAKER_VOLUME[] PROGMEM = TR_SPEAKER_VOLUME; const pm_char STR_LCD[] PROGMEM = TR_LCD; diff --git a/radio/src/translations.h b/radio/src/translations.h index 71e123e64..e4ca9ec85 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -591,6 +591,7 @@ extern const pm_char STR_EEPROM_CONVERTING[]; extern const pm_char STR_THROTTLEWARN[]; extern const pm_char STR_ALARMSWARN[]; extern const pm_char STR_SWITCHWARN[]; +extern const pm_char STR_KEYSTUCK[]; extern const pm_char STR_SPEAKER_VOLUME[]; extern const pm_char STR_LCD[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index cb3444634..963ff6d2a 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -730,6 +730,7 @@ #define TR_THROTTLEWARN "PLYNU" #define TR_ALARMSWARN "ALARMU" #define TR_SWITCHWARN "POZICE" +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR "Invertovat plyn?" #define TR_SPEAKER_VOLUME INDENT "Hlasitost" #define TR_LCD "LCD" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 62f941797..41ea2d44c 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -734,6 +734,7 @@ #define TR_THROTTLEWARN "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Gas umkehren?","Vollgas hinten?") // Th9x 9XR #define TR_SPEAKER_VOLUME INDENT "Lautstärke" #define TR_LCD "Bildschirm" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index fa84bf1a4..8ea888338 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -756,6 +756,7 @@ #define TR_THROTTLEWARN "THROTTLE" #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH","CONTROL") +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invert Thr?","Invert Throttle?") #define TR_SPEAKER_VOLUME INDENT "Volume" // TODO could be TR_VOLUME ? #define TR_LCD "LCD" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 133650107..e815c468b 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "ACELERADOR" #define TR_ALARMSWARN "ALARMAS" #define TR_SWITCHWARN "INTERPTOR" +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invertir Acel?", "Invertir Acel.?") #define TR_SPEAKER_VOLUME INDENT "Volumen" #define TR_LCD "LCD" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 0f93d1163..7d77e8d94 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "THROTTLE" #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH","CONTROL") +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invert Thr?","Invert Throttle?") #define TR_SPEAKER_VOLUME INDENT "Volume" #define TR_LCD "LCD" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index dbd3d5e40..d81e924b8 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "GAZ" #define TR_ALARMSWARN "SON" #define TR_SWITCHWARN TR("INTERS","CONTROLES") +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR "Inverser Gaz?" #define TR_SPEAKER_VOLUME INDENT "Volume" #define TR_LCD "Afficheur" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 52b661cbc..bfefb8543 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "MOTORE" #define TR_ALARMSWARN "ALLARMI" #define TR_SWITCHWARN "CONTROLLI" +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR "Inverti Mot?" #define TR_SPEAKER_VOLUME "Volume Audio" #define TR_LCD "LCD" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index cf16154b1..a3e4db941 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "GAZ" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN TR("Przełą","Kontrola") +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Odw.Gaz?","Odwróć gaz?") #define TR_SPEAKER_VOLUME INDENT "Głośność" #define TR_LCD "LCD" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 6cd2b3045..cc3a7b015 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "ACELERAD" #define TR_ALARMSWARN "ALARMES" #define TR_SWITCHWARN "CHAVES" +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR "Inverte Acel?" #define TR_SPEAKER_VOLUME INDENT "Volume" #define TR_LCD "LCD" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 3d3c0fe16..1993d3663 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -727,6 +727,7 @@ #define TR_THROTTLEWARN "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "BRYTARE" +#define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invert.Gas?", "Invertera Gasen?") #define TR_SPEAKER_VOLUME INDENT "Volym" #define TR_LCD "LCD"