diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index 86eac5583..1d1bd6f53 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -20,7 +20,7 @@ #include "opentx.h" #include - + extern OS_MutexID audioMutex; const int16_t sineValues[] = @@ -139,14 +139,6 @@ const char * const audioFilenames[] = { "baddata", "lowbatt", "inactiv", - "a1_org", - "a1_red", - "a2_org", - "a2_red", - "a3_org", - "a3_red", - "a4_org", - "a4_red", "rssi_org", "rssi_red", "swr_red", @@ -156,20 +148,18 @@ const char * const audioFilenames[] = { "trainok", "sensorko", "servoko", + "rxko", #if defined(PCBSKY9X) "highmah", "hightemp", #endif "error", - "keyup", // TODO remove this one - "keydown", // TODO remove this one - "menus", // TODO remove this one - "trim", // TODO remove this one "warning1", "warning2", "warning3", "midtrim", - "endtrim", + "mintrim", + "maxtrim", "midstck1", "midstck2", "midstck3", @@ -187,10 +177,9 @@ const char * const audioFilenames[] = { "mixwarn1", "mixwarn2", "mixwarn3", - "timer00", - "timer10", - "timer20", - "timer30" + "timovr1", + "timovr2", + "timovr3" }; uint64_t sdAvailableSystemAudioFiles = 0; @@ -505,13 +494,13 @@ void audioTask(void * pdata) setSampleRate(AUDIO_SAMPLE_RATE); #if !defined(EEPROM) - AUDIO_TADA(); + AUDIO_HELLO(); #elif defined(SDCARD) if (!unexpectedShutdown) { #if defined(EEPROM) sdInit(); #endif - AUDIO_TADA(); + AUDIO_HELLO(); } #endif @@ -674,7 +663,7 @@ int ToneContext::mixBuffer(AudioBuffer * buffer, int volume, unsigned int fade) fragment.tone.freq += freqChange; } else { - fragment.tone.freq = BEEP_MIN_FREQ; + fragment.tone.freq = BEEP_MIN_FREQ; } } } @@ -995,25 +984,106 @@ void audioPlay(unsigned int index, uint8_t id) } } -void audioEvent(unsigned int index, unsigned int freq) +void audioKeyPress() +{ + if (g_eeGeneral.beepMode == e_mode_all) { + audioQueue.playTone(BEEP_DEFAULT_FREQ, 40, 20, PLAY_NOW); + } + +#if defined(HAPTIC) + if (g_eeGeneral.hapticMode == e_mode_all) { + haptic.play(5, 0, PLAY_NOW); + } +#endif +} + +void audioKeyError() +{ + if (g_eeGeneral.beepMode >= e_mode_nokeys) { + audioQueue.playTone(BEEP_DEFAULT_FREQ, 160, 20, PLAY_NOW); + } + +#if defined(HAPTIC) + if (g_eeGeneral.hapticMode >= e_mode_nokeys) { + haptic.play(15, 3, PLAY_NOW); + } +#endif +} + +void audioTrimPress(int value) +{ + value = limit(TRIM_MIN, value, TRIM_MAX); + value <<= 3; + value += 120*16; + if (g_eeGeneral.beepMode >= e_mode_nokeys) { + audioQueue.playTone(value, 40, 20, PLAY_NOW); + } +} + +void audioTimerCountdown(uint8_t timer, int value) +{ + if (g_model.timers[timer].countdownBeep == COUNTDOWN_VOICE) { + if (value >= 0 && value <= TIMER_COUNTDOWN_START(timer)) { + playNumber(value, 0, 0, 0); + } + else if (value == 30 || value == 20) { + playDuration(value, 0, 0); + } + } + else if (g_model.timers[timer].countdownBeep == COUNTDOWN_BEEPS) { + if (value == 0) { + audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 300, 20, PLAY_NOW); + } + else if (value > 0 && value <= TIMER_COUNTDOWN_START(timer)) { + audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 100, 20, PLAY_NOW); + } + else if (value == 30) { + audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(2)); + } + else if (value == 20) { + audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(1)); + } + else if (value == 10) { + audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_NOW); + } + } +#if defined(HAPTIC) + else if (g_model.timers[timer].countdownBeep == COUNTDOWN_HAPTIC) { + if (value == 0) { + haptic.play(15, 3, PLAY_NOW); + } + else if (value > 0 && value <= TIMER_COUNTDOWN_START(timer)) { + haptic.play(10, 0, PLAY_NOW); + } + else if (value == 30) { + haptic.play(10, 3, PLAY_REPEAT(2) | PLAY_NOW); + } + else if (value == 20) { + haptic.play(10, 3, PLAY_REPEAT(1) | PLAY_NOW); + } + else if (value == 10) { + haptic.play(10, 3, PLAY_NOW); + } + } +#endif +} + +void audioEvent(unsigned int index) { if (index == AU_NONE) return; #if defined(HAPTIC) - if (index >= AU_THROTTLE_ALERT) { - haptic.event(index); //do this before audio to help sync timings - } + haptic.event(index); // do this before audio to help sync timings #endif - if (index <= AU_ERROR || (index >= AU_WARNING1 && index < AU_SPECIAL_SOUND_FIRST)) { + if (index <= AU_ERROR) { if (g_eeGeneral.alarmsFlash) { flashCounter = FLASH_DURATION; } } - if (g_eeGeneral.beepMode > 0 || (g_eeGeneral.beepMode == 0 && index >= AU_TRIM_MOVE) || - (g_eeGeneral.beepMode >= -1 && index <= AU_ERROR)) { + if (g_eeGeneral.beepMode >= e_mode_nokeys || (g_eeGeneral.beepMode >= e_mode_alarms && index <= AU_ERROR)) { #if defined(SDCARD) char filename[AUDIO_FILENAME_MAXLEN + 1]; if (index < AU_SPECIAL_SOUND_FIRST && isAudioFileReferenced(index, filename)) { @@ -1038,23 +1108,14 @@ void audioEvent(unsigned int index, unsigned int freq) case AU_ERROR: audioQueue.playTone(BEEP_DEFAULT_FREQ, 200, 20, PLAY_NOW); break; - case AU_KEYPAD_UP: - audioQueue.playTone(BEEP_KEY_UP_FREQ, 80, 20, PLAY_NOW); - break; - case AU_KEYPAD_DOWN: - audioQueue.playTone(BEEP_KEY_DOWN_FREQ, 80, 20, PLAY_NOW); - break; - case AU_MENUS: - audioQueue.playTone(BEEP_DEFAULT_FREQ, 80, 20, PLAY_NOW); - break; - case AU_TRIM_MOVE: - audioQueue.playTone(freq, 40, 20, PLAY_NOW); - break; case AU_TRIM_MIDDLE: - audioQueue.playTone(freq, 80, 20, PLAY_NOW); + audioQueue.playTone(120*16, 80, 20, PLAY_NOW); break; - case AU_TRIM_END: - audioQueue.playTone(freq, 80, 20, PLAY_NOW); + case AU_TRIM_MIN: + audioQueue.playTone(TRIM_MIN*8 + 120*16, 80, 20, PLAY_NOW); + break; + case AU_TRIM_MAX: + audioQueue.playTone(TRIM_MAX*8 + 120*16, 80, 20, PLAY_NOW); break; case AU_WARNING1: audioQueue.playTone(BEEP_DEFAULT_FREQ, 80, 20, PLAY_NOW); @@ -1089,30 +1150,11 @@ void audioEvent(unsigned int index, unsigned int freq) case AU_MIX_WARNING_3: audioQueue.playTone(BEEP_DEFAULT_FREQ + 1680, 48, 32, PLAY_REPEAT(2)); break; - case AU_TIMER_00: + case AU_TIMER1_ELAPSED: + case AU_TIMER2_ELAPSED: + case AU_TIMER3_ELAPSED: audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 300, 20, PLAY_NOW); break; - case AU_TIMER_LT10: - audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_NOW); - break; - case AU_TIMER_20: - audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(1) | PLAY_NOW); - break; - case AU_TIMER_30: - audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(2) | PLAY_NOW); - break; - case AU_A1_ORANGE: - case AU_A2_ORANGE: - case AU_A3_ORANGE: - case AU_A4_ORANGE: - audioQueue.playTone(BEEP_DEFAULT_FREQ + 600, 200, 20, PLAY_NOW); - break; - case AU_A1_RED: - case AU_A2_RED: - case AU_A3_RED: - case AU_A4_RED: - audioQueue.playTone(BEEP_DEFAULT_FREQ + 600, 200, 20, PLAY_REPEAT(1) | PLAY_NOW); - break; case AU_RSSI_ORANGE: audioQueue.playTone(BEEP_DEFAULT_FREQ + 1500, 800, 20, PLAY_NOW); break; diff --git a/radio/src/audio_arm.h b/radio/src/audio_arm.h index d98a5a948..fbc16aba9 100644 --- a/radio/src/audio_arm.h +++ b/radio/src/audio_arm.h @@ -284,7 +284,7 @@ enum { }; void codecsInit(); -void audioEvent(unsigned int index, unsigned int freq=BEEP_DEFAULT_FREQ); +void audioEvent(unsigned int index); void audioPlay(unsigned int index, uint8_t id=0); void audioStart(); @@ -304,46 +304,35 @@ void audioStart(); #define AUDIO_TIMER_MINUTE(t) audioDefevent(AU_WARNING1) #endif -#define AUDIO_TADA() audioPlay(AU_TADA) +void audioKeyPress(); +void audioKeyError(); +void audioTrimPress(int value); +void audioTimerCountdown(uint8_t timer, int value); + +#define AUDIO_KEY_PRESS() audioKeyPress() +#define AUDIO_KEY_ERROR() audioKeyError() + +#define AUDIO_HELLO() audioPlay(AUDIO_HELLO) #define AUDIO_BYE() audioPlay(AU_BYE, ID_PLAY_BYE) -#define AUDIO_KEYPAD_UP() AUDIO_BUZZER(audioEvent(AU_KEYPAD_UP), beep(0)) -#define AUDIO_KEYPAD_DOWN() AUDIO_BUZZER(audioEvent(AU_KEYPAD_DOWN), beep(0)) -#define AUDIO_MENUS() AUDIO_BUZZER(audioEvent(AU_MENUS), beep(0)) #define AUDIO_WARNING1() AUDIO_BUZZER(audioEvent(AU_WARNING1), beep(3)) #define AUDIO_WARNING2() AUDIO_BUZZER(audioEvent(AU_WARNING2), beep(2)) #define AUDIO_TX_BATTERY_LOW() AUDIO_BUZZER(audioEvent(AU_TX_BATTERY_LOW), beep(4)) #if defined(PCBSKY9X) - #define AUDIO_TX_MAH_HIGH() audioEvent(AU_TX_MAH_HIGH) - #define AUDIO_TX_TEMP_HIGH() audioEvent(AU_TX_TEMP_HIGH) +#define AUDIO_TX_MAH_HIGH() audioEvent(AU_TX_MAH_HIGH) +#define AUDIO_TX_TEMP_HIGH() audioEvent(AU_TX_TEMP_HIGH) #endif #define AUDIO_ERROR() AUDIO_BUZZER(audioEvent(AU_ERROR), beep(4)) -#define AUDIO_TIMER_30() AUDIO_BUZZER(audioEvent(AU_TIMER_30), { beepAgain=2; beep(2); }) -#define AUDIO_TIMER_20() AUDIO_BUZZER(audioEvent(AU_TIMER_20), { beepAgain=1; beep(2); }) - -#if defined(HAPTIC) -#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else if (m==COUNTDOWN_HAPTIC) haptic.event(AU_TIMER_LT10); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0) -#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else if (m==COUNTDOWN_HAPTIC) haptic.event(AU_TIMER_00); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0) -#else -#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0) -#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0) -#endif - +#define AUDIO_TIMER_COUNTDOWN(idx, val) audioTimerCountdown(idx, val) +#define AUDIO_TIMER_ELAPSED(idx) AUDIO_BUZZER(audioEvent(AU_TIMER1_ELAPSED+idx), beep(3)) #define AUDIO_INACTIVITY() AUDIO_BUZZER(audioEvent(AU_INACTIVITY), beep(3)) #define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioEvent(AU_MIX_WARNING_1+x-1), beep(1)) #define AUDIO_POT_MIDDLE(x) AUDIO_BUZZER(audioEvent(AU_STICK1_MIDDLE+x), beep(2)) -#define AUDIO_TRIM_MIDDLE(f) AUDIO_BUZZER(audioEvent(AU_TRIM_MIDDLE, f), beep(2)) -#define AUDIO_TRIM_END(f) AUDIO_BUZZER(audioEvent(AU_TRIM_END, f), beep(2)) -#define AUDIO_TRIM(event, f) AUDIO_BUZZER(audioEvent(AU_TRIM_MOVE, f), { if (!IS_KEY_FIRST(event)) warble = true; beep(1); }) +#define AUDIO_TRIM_MIDDLE() AUDIO_BUZZER(audioEvent(AU_TRIM_MIDDLE), beep(2)) +#define AUDIO_TRIM_MIN() AUDIO_BUZZER(audioEvent(AU_TRIM_MIN), beep(2)) +#define AUDIO_TRIM_MAX() AUDIO_BUZZER(audioEvent(AU_TRIM_MAX), beep(2)) +#define AUDIO_TRIM_PRESS(val) audioTrimPress(val) #define AUDIO_PLAY(p) audioEvent(p) #define AUDIO_VARIO(fq, t, p, f) audioQueue.playTone(fq, t, p, f) -#define AUDIO_A1_ORANGE() audioEvent(AU_A1_ORANGE) -#define AUDIO_A1_RED() audioEvent(AU_A1_RED) -#define AUDIO_A2_ORANGE() audioEvent(AU_A2_ORANGE) -#define AUDIO_A2_RED() audioEvent(AU_A2_RED) -#define AUDIO_A3_ORANGE() audioEvent(AU_A3_ORANGE) -#define AUDIO_A3_RED() audioEvent(AU_A3_RED) -#define AUDIO_A4_ORANGE() audioEvent(AU_A4_ORANGE) -#define AUDIO_A4_RED() audioEvent(AU_A4_RED) #define AUDIO_RSSI_ORANGE() audioEvent(AU_RSSI_ORANGE) #define AUDIO_RSSI_RED() audioEvent(AU_RSSI_RED) #define AUDIO_SWR_RED() audioEvent(AU_SWR_RED) diff --git a/radio/src/audio_avr.cpp b/radio/src/audio_avr.cpp index 08ac2ed7b..8321fa135 100644 --- a/radio/src/audio_avr.cpp +++ b/radio/src/audio_avr.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -79,7 +79,7 @@ void audioQueue::heartbeat() toneFreq = tone2Freq; #endif tone2TimeLeft--; //time gets counted down - } + } else { speakerOff(); } @@ -128,7 +128,7 @@ void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlag else { tFlags++; } - + tFlags &= 0x0f; if (tFlags) { uint8_t next_queueWidx = (t_queueWidx + 1) & (AUDIO_QUEUE_LENGTH-1); @@ -144,7 +144,7 @@ void audioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlag } } -void audioQueue::event(uint8_t e, uint8_t f) +void audioQueue::event(uint8_t e) { #if defined(HAPTIC) haptic.event(e); //do this before audio to help sync timings @@ -156,7 +156,7 @@ void audioQueue::event(uint8_t e, uint8_t f) } } - if (g_eeGeneral.beepMode>0 || (g_eeGeneral.beepMode==0 && e>=AU_TRIM_MOVE) || (g_eeGeneral.beepMode>=-1 && e<=AU_ERROR)) { + if (g_eeGeneral.beepMode >= e_mode_nokeys || (g_eeGeneral.beepMode >= e_mode_alarms && e <= AU_ERROR)) { if (e < AU_SPECIAL_SOUND_FIRST || empty()) { // TODO when VOICE enable some cases here are not needed! switch (e) { @@ -168,12 +168,6 @@ void audioQueue::event(uint8_t e, uint8_t f) } break; #endif - case AU_TRIM_MOVE: - play(f, 6, 1, PLAY_NOW); - break; - case AU_TRIM_MIDDLE: - play(f, 10, 2, PLAY_NOW); - break; case AU_SPECIAL_SOUND_RING: play(BEEP_DEFAULT_FREQ+25, 5, 2, PLAY_REPEAT(10)); play(BEEP_DEFAULT_FREQ+25, 5, 10, PLAY_REPEAT(1)); @@ -214,22 +208,14 @@ void audioQueue::event(uint8_t e, uint8_t f) static const pm_uint8_t singleSounds[] PROGMEM = { 70, 10, 2, PLAY_REPEAT(2)|PLAY_NOW, // INACTIVITY BEEP_DEFAULT_FREQ, 40, 1, PLAY_NOW, // ERROR - BEEP_KEY_UP_FREQ, 10, 1, PLAY_NOW, // KEYPAD_UP - BEEP_KEY_DOWN_FREQ, 10, 1, PLAY_NOW, // KEYPAD_DOWN - BEEP_DEFAULT_FREQ, 10, 2, PLAY_NOW, // MENUS - 0,0,0,0, // TRIM_MOVE BEEP_DEFAULT_FREQ, 10, 1, PLAY_NOW, // WARNING1 BEEP_DEFAULT_FREQ, 20, 1, PLAY_NOW, // WARNING2 BEEP_DEFAULT_FREQ, 30, 1, PLAY_NOW, // WARNING3 - 0,0,0,0, // TRIM_MIDDLE + 60, 10, 2, PLAY_NOW, // TRIM_MIDDLE BEEP_DEFAULT_FREQ + 50, 10, 1, PLAY_NOW, // POT_STICK_MIDDLE BEEP_DEFAULT_FREQ + 50, 6, 0, 0, // MIX_WARNING_1 BEEP_DEFAULT_FREQ + 52, 6, 3, PLAY_REPEAT(1), // MIX_WARNING_2 BEEP_DEFAULT_FREQ + 54, 6, 3, PLAY_REPEAT(2), // MIX_WARNING_3 - BEEP_DEFAULT_FREQ + 50, 30, 3, PLAY_NOW, // TIMER_00 - BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_NOW, // TIMER_LT10 - BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(1)|PLAY_NOW, // TIMER_20 - BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(2)|PLAY_NOW, // TIMER_30 BEEP_DEFAULT_FREQ, 10, 1, 0, // FRSKY_BEEP1 BEEP_DEFAULT_FREQ, 20, 1, 0, // FRSKY_BEEP2 BEEP_DEFAULT_FREQ, 30, 1, 0, // FRSKY_BEEP3 @@ -258,3 +244,85 @@ void audioDefevent(uint8_t e) { audio.event(e); } + +void audioKeyPress() +{ +#if defined(AUDIO) + if (g_eeGeneral.beepMode == e_mode_all) { + audio.play(BEEP_DEFAULT_FREQ, 10, 1, PLAY_NOW); + } +#else + beep(0); +#endif + +#if defined(HAPTIC) + if (g_eeGeneral.hapticMode == e_mode_all) { + haptic.play(5, 0, PLAY_NOW); + } +#endif +} + +void audioTrimPress(int16_t value) +{ + if (g_eeGeneral.beepMode >= e_mode_nokeys) { +#if defined(AUDIO) + value = limit(TRIM_MIN, value, TRIM_MAX); + value >>= 2; + value += 60; + audio.play(value, 6, 1, PLAY_NOW); +#else + warble = true; + beep(1); +#endif + } +} + +void audioTimerCountdown(uint8_t timer, int value) +{ + if (0) { + // pass + } + +#if defined(CPUM2560) + if (g_model.timers[timer].countdownBeep == COUNTDOWN_VOICE) { + if (value >= 0 && value <= g_model.timers[timer].countdownStart) { + playNumber(value, 0, 0, 0); + } + else if (value == 30 || value == 20) { + playDuration(value, 0, 0); + } + } +#endif + +#if defined(HAPTIC) + else if (g_model.timers[timer].countdownBeep == COUNTDOWN_HAPTIC) { + if (value == 0) { + haptic.play(15, 3, PLAY_NOW); + } + else if (value > 0 && value <= 10) { + haptic.play(5, 0, PLAY_NOW); + } + else if (value == 30) { + haptic.play(10, 3, PLAY_REPEAT(2) | PLAY_NOW); + } + else if (value == 20) { + haptic.play(10, 3, PLAY_REPEAT(1) | PLAY_NOW); + } + } +#endif + + else { + if (value == 0) { + audio.play(BEEP_DEFAULT_FREQ + 50, 30, 3, PLAY_NOW); + } + else if (value > 0 && value <= 10) { + audio.play(BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_NOW); + } + else if (value == 30) { + audio.play(BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(2) | PLAY_NOW); + } + else if (value == 20) { + audio.play(BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(1) | PLAY_NOW); + } + } +} diff --git a/radio/src/audio_avr.h b/radio/src/audio_avr.h index 78857540c..77b48e5bb 100644 --- a/radio/src/audio_avr.h +++ b/radio/src/audio_avr.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -30,8 +30,6 @@ #define AUDIO_QUEUE_LENGTH (8) // 8 seems to suit most alerts #define BEEP_DEFAULT_FREQ (70) #define BEEP_OFFSET (10) -#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+5) -#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-5) class audioQueue { @@ -41,10 +39,10 @@ class audioQueue void play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags=0); void pause(uint8_t tLen); - + inline bool busy() { return (toneTimeLeft > 0); } - void event(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ); + void event(uint8_t e); inline void driver() { if (toneFreq) { @@ -79,7 +77,7 @@ class audioQueue // vario has less priority uint8_t tone2Freq; uint8_t tone2TimeLeft; - + // queue arrays uint8_t queueToneFreq[AUDIO_QUEUE_LENGTH]; int8_t queueToneFreqIncr[AUDIO_QUEUE_LENGTH]; @@ -109,29 +107,32 @@ void audioDefevent(uint8_t e); #define VOICE_AUDIO_BUZZER(v, a, b) AUDIO_BUZZER(a, b) #endif -#define AUDIO_KEYPAD_UP() AUDIO_BUZZER(audioDefevent(AU_KEYPAD_UP), beep(0)) -#define AUDIO_KEYPAD_DOWN() AUDIO_BUZZER(audioDefevent(AU_KEYPAD_DOWN), beep(0)) -#define AUDIO_MENUS() AUDIO_BUZZER(audioDefevent(AU_MENUS), beep(0)) +#define AUDIO_KEY_PRESS() audioKeyPress() +#define AUDIO_KEY_ERROR() AUDIO_WARNING2() #define AUDIO_WARNING1() AUDIO_BUZZER(audioDefevent(AU_WARNING1), beep(3)) #define AUDIO_WARNING2() AUDIO_BUZZER(audioDefevent(AU_WARNING2), beep(2)) #define AUDIO_ERROR() AUDIO_BUZZER(audioDefevent(AU_ERROR), beep(4)) -#define AUDIO_TADA() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TADA),,) +#define AUDIO_HELLO() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AUDIO_HELLO),,) #define AUDIO_BYE() #define AUDIO_TX_BATTERY_LOW() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TX_BATTERY_LOW), audioDefevent(AU_TX_BATTERY_LOW), beep(4)) #define AUDIO_INACTIVITY() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_INACTIVITY), audioDefevent(AU_INACTIVITY), beep(3)) #define AUDIO_ERROR_MESSAGE(e) VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT((e)), audioDefevent(AU_ERROR), beep(4)) #define AUDIO_TIMER_MINUTE(t) VOICE_AUDIO_BUZZER(playDuration(t), audioDefevent(AU_WARNING1), beep(2)) -#define AUDIO_TIMER_30() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_30), audioDefevent(AU_TIMER_30), { beepAgain=2; beep(2); }) -#define AUDIO_TIMER_20() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); }) -#define AUDIO_TIMER_LT10(m, x) AUDIO_BUZZER(audioDefevent(AU_TIMER_LT10), beep(2)) -#define AUDIO_TIMER_00(m) AUDIO_BUZZER(audioDefevent(AU_TIMER_00), beep(3)) +#define AUDIO_TIMER_COUNTDOWN(idx, val) audioTimerCountdown(idx, val) +#define AUDIO_TIMER_ELAPSED(idx) AUDIO_BUZZER(audioTimerCountdown(idx, 0), beep(3)) + +//#define AUDIO_TIMER_30() // VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_30), audioDefevent(AU_TIMER_30), { beepAgain=2; beep(2); }) +//#define AUDIO_TIMER_20() // VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); }) +//#define AUDIO_TIMER_LT10(m, x) // AUDIO_BUZZER(audioDefevent(AU_TIMER_LT10), beep(2)) +//#define AUDIO_TIMER_00(m) // AUDIO_BUZZER(audioDefevent(AU_TIMER_00), beep(3)) #define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioDefevent(AU_MIX_WARNING_1+x-1), beep(1)) #define AUDIO_POT_MIDDLE() AUDIO_BUZZER(audioDefevent(AU_POT_MIDDLE), beep(2)) -#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP) -#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN) -#define AUDIO_TRIM_MIDDLE(f) AUDIO_BUZZER(audio.event(AU_TRIM_MIDDLE, f), beep(2)) -#define AUDIO_TRIM_END(f) AUDIO_BUZZER(audioDefevent(f), beep(2)) -#define AUDIO_TRIM(event, f) AUDIO_BUZZER(audio.event(AU_TRIM_MOVE, f), { if (!IS_KEY_FIRST(event)) warble = true; beep(1); }) +#define AUDIO_VARIO_UP() // audioDefevent(AU_KEYPAD_UP) +#define AUDIO_VARIO_DOWN() // audioDefevent(AU_KEYPAD_DOWN) +#define AUDIO_TRIM_MIDDLE() // AUDIO_BUZZER(audio.event(AU_TRIM_MIDDLE, f), beep(2)) +#define AUDIO_TRIM_MIN() // AUDIO_BUZZER(audioDefevent(f), beep(2)) +#define AUDIO_TRIM_MAX() // AUDIO_BUZZER(audioDefevent(f), beep(2)) +#define AUDIO_TRIM_PRESS(val) audioTrimPress(val) #define AUDIO_PLAY(p) audio.event(p) #define AUDIO_VARIO(f, t) audio.play(f, t, 0, PLAY_BACKGROUND) diff --git a/radio/src/buzzer.h b/radio/src/buzzer.h index 8a5616f38..cebebbd2f 100644 --- a/radio/src/buzzer.h +++ b/radio/src/buzzer.h @@ -1,25 +1,25 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _BUZZER_H_ -#define _BUZZER_H_ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _BUZZER_H_ +#define _BUZZER_H_ #if defined(BUZZER) extern uint8_t g_beepCnt; @@ -56,45 +56,47 @@ inline void beep(uint8_t) { } #if defined(BUZZER) #if defined(VOICE) - #define AUDIO_TADA() PUSH_SYSTEM_PROMPT(AU_TADA) + #define AUDIO_HELLO() PUSH_SYSTEM_PROMPT(AUDIO_HELLO) #define AUDIO_BYE() #define AUDIO_TX_BATTERY_LOW() PUSH_SYSTEM_PROMPT(AU_TX_BATTERY_LOW) #define AUDIO_INACTIVITY() PUSH_SYSTEM_PROMPT(AU_INACTIVITY) #define AUDIO_ERROR_MESSAGE(e) PUSH_SYSTEM_PROMPT((e)) #define AUDIO_TIMER_MINUTE(t) playDuration(t) + // TODO #define AUDIO_TIMER_30() PUSH_SYSTEM_PROMPT(AU_TIMER_30) #define AUDIO_TIMER_20() PUSH_SYSTEM_PROMPT(AU_TIMER_20) #else - #define AUDIO_TADA() + #define AUDIO_HELLO() #define AUDIO_BYE() #define AUDIO_TX_BATTERY_LOW() beep(4) #define AUDIO_INACTIVITY() beep(3) #define AUDIO_ERROR_MESSAGE(e) beep(4) #define AUDIO_TIMER_MINUTE(t) beep(2) + // TODO #define AUDIO_TIMER_30() { beepAgain=2; beep(2); } #define AUDIO_TIMER_20() { beepAgain=1; beep(2); } #endif - #define AUDIO_KEYPAD_UP() beep(0) - #define AUDIO_KEYPAD_DOWN() beep(0) - #define AUDIO_MENUS() beep(0) + #define AUDIO_KEY_PRESS() beep(0) + #define AUDIO_KEY_ERROR() beep(2) #define AUDIO_WARNING2() beep(2) #define AUDIO_WARNING1() beep(3) #define AUDIO_ERROR() beep(4) #define AUDIO_MIX_WARNING(x) beep(1) #define AUDIO_POT_MIDDLE() beep(2) - #define AUDIO_TIMER_LT10(m, x) beep(2) - #define AUDIO_TIMER_00(m) beep(3) + #define AUDIO_TIMER_COUNTDOWN(idx, val) beep(2) + #define AUDIO_TIMER_ELAPSED(idx) beep(3) #define AUDIO_VARIO_UP() _beep(1) #define AUDIO_VARIO_DOWN() _beep(1) - #define AUDIO_TRIM(event, f) { if (!IS_KEY_FIRST(event)) warble = true; beep(1); } - #define AUDIO_TRIM_MIDDLE(f) beep(2) - #define AUDIO_TRIM_END(f) beep(2) + #define AUDIO_TRIM_PRESS(f) { if (!IS_KEY_FIRST(event)) warble = true; beep(1); } + #define AUDIO_TRIM_MIDDLE() beep(2) + #define AUDIO_TRIM_MIN() beep(2) + #define AUDIO_TRIM_MAX() beep(2) #define AUDIO_PLAY(p) beep(3) #define IS_AUDIO_BUSY() (g_beepCnt || beepAgain || beepOn) #else /* BUZZER */ - #define AUDIO_TADA() + #define AUDIO_HELLO() #define AUDIO_BYE() #define AUDIO_TX_BATTERY_LOW() #define AUDIO_INACTIVITY() @@ -173,4 +175,4 @@ inline void BUZZER_HEARTBEAT() #endif // BUZZER #endif // CPUARM -#endif // _BUZZER_H_ +#endif // _BUZZER_H_ diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index d21260dae..de2fc6316 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -367,6 +367,7 @@ enum TelemetryUnit { UNIT_CELLS = UNIT_FIRST_VIRTUAL, UNIT_DATETIME, UNIT_GPS, + UNIT_BITFIELD, // Internal units (not stored in sensor unit) UNIT_GPS_LONGITUDE, UNIT_GPS_LATITUDE, diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index cfe8a2f47..3176a85b9 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -441,7 +441,8 @@ PACK(struct TimerData { uint32_t countdownBeep:2; uint32_t minuteBeep:1; uint32_t persistent:2; - uint32_t spare:3; + int32_t countdownStart:2; + uint32_t direction:1; NOBACKUP(char name[LEN_TIMER_NAME]); }); #elif defined(CPUM2560) diff --git a/radio/src/gui/9x/menu_general_sdmanager.cpp b/radio/src/gui/9x/menu_general_sdmanager.cpp index ba1413424..89f219516 100644 --- a/radio/src/gui/9x/menu_general_sdmanager.cpp +++ b/radio/src/gui/9x/menu_general_sdmanager.cpp @@ -184,7 +184,7 @@ void menuGeneralSdManager(uint8_t _event) // POPUP_MENU_ADD_ITEM(STR_COPY_FILE); TODO: Implement } } - popupMenuHandler = onSdManagerMenu; + POPUP_MENU_START(onSdManagerMenu); break; } diff --git a/radio/src/gui/9x/menu_model_custom_functions.cpp b/radio/src/gui/9x/menu_model_custom_functions.cpp index a298cc2be..4c12ae0af 100644 --- a/radio/src/gui/9x/menu_model_custom_functions.cpp +++ b/radio/src/gui/9x/menu_model_custom_functions.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -230,7 +230,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2); } if (sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), cfn->play.name)) { - popupMenuHandler = onCustomFunctionsFileSelectionMenu; + POPUP_MENU_START(onCustomFunctionsFileSelectionMenu); } else { POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); diff --git a/radio/src/gui/9x/menu_model_inputs_mixes.cpp b/radio/src/gui/9x/menu_model_inputs_mixes.cpp index afaada3a2..ba747176b 100644 --- a/radio/src/gui/9x/menu_model_inputs_mixes.cpp +++ b/radio/src/gui/9x/menu_model_inputs_mixes.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -812,7 +812,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event) POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_DELETE); - popupMenuHandler = onExpoMixMenu; + POPUP_MENU_START(onExpoMixMenu); } #else if (s_currCh) { diff --git a/radio/src/gui/9x/menu_model_select.cpp b/radio/src/gui/9x/menu_model_select.cpp index 94ce81ea1..5a53c03cc 100644 --- a/radio/src/gui/9x/menu_model_select.cpp +++ b/radio/src/gui/9x/menu_model_select.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -240,7 +240,7 @@ void menuModelSelect(uint8_t event) POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); } - popupMenuHandler = onModelSelectMenu; + POPUP_MENU_START(onModelSelectMenu); #else if (g_eeGeneral.currModel != sub) { selectModel(sub); diff --git a/radio/src/gui/9x/menu_model_telemetry.cpp b/radio/src/gui/9x/menu_model_telemetry.cpp index 1c8e298f2..2e4d2a524 100644 --- a/radio/src/gui/9x/menu_model_telemetry.cpp +++ b/radio/src/gui/9x/menu_model_telemetry.cpp @@ -540,7 +540,7 @@ void menuModelTelemetry(uint8_t event) POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_DELETE); - popupMenuHandler = onSensorMenu; + POPUP_MENU_START(onSensorMenu); } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { pushMenu(menuModelSensor); diff --git a/radio/src/gui/9x/menus.h b/radio/src/gui/9x/menus.h index 08cfb1016..e33970e29 100644 --- a/radio/src/gui/9x/menus.h +++ b/radio/src/gui/9x/menus.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -481,11 +481,12 @@ void displayWarning(uint8_t event); #if defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64)) #define NAVIGATION_MENUS - #define POPUP_MENU_ADD_ITEM(s) popupMenuItems[popupMenuNoItems++] = s - #define POPUP_MENU_MAX_LINES 6 + #define POPUP_MENU_ADD_ITEM(s) popupMenuItems[popupMenuNoItems++] = s + #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) + #define POPUP_MENU_MAX_LINES 6 #define MENU_MAX_DISPLAY_LINES POPUP_MENU_MAX_LINES #if defined(SDCARD) - #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) + #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) #else #define POPUP_MENU_ADD_SD_ITEM(s) #endif @@ -498,7 +499,7 @@ void displayWarning(uint8_t event); const char * displayPopupMenu(uint8_t event); extern void (*popupMenuHandler)(const char *result); #else - #define popupMenuNoItems 0 + #define popupMenuNoItems 0 #endif #if defined(SDCARD) diff --git a/radio/src/gui/9x/navigation.cpp b/radio/src/gui/9x/navigation.cpp index 23516b334..5875b301e 100644 --- a/radio/src/gui/9x/navigation.cpp +++ b/radio/src/gui/9x/navigation.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" vertpos_t menuVerticalOffset; int8_t s_editMode; @@ -106,37 +106,31 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int #endif if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || (s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { - do { - newval++; - } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); + do { + newval++; + } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); - if (newval > i_max) { - newval = val; - killEvents(event); - AUDIO_WARNING2(); - } - else { - AUDIO_KEYPAD_UP(); - } + if (newval > i_max) { + newval = val; + killEvents(event); + AUDIO_KEY_ERROR(); + } } else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { - do { - if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { - newval -= min(10, val-i_min); - } - else { - newval--; - } - } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); + do { + if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { + newval -= min(10, val-i_min); + } + else { + newval--; + } + } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); - if (newval < i_min) { - newval = val; - killEvents(event); - AUDIO_WARNING2(); - } - else { - AUDIO_KEYPAD_DOWN(); - } + if (newval < i_min) { + newval = val; + killEvents(event); + AUDIO_KEY_ERROR(); + } } if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) { @@ -175,20 +169,11 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int } #endif - if (newval > i_max || newval < i_min) { - newval = (newval > i_max ? i_max : i_min); - killEvents(event); - AUDIO_WARNING2(); - } - if (newval != val) { if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) { pauseEvents(event); // delay before auto-repeat continues - if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same - AUDIO_KEYPAD_UP(); - else - AUDIO_KEYPAD_DOWN(); } + AUDIO_KEY_PRESS(); storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); checkIncDec_Ret = (newval > val ? 1 : -1); } @@ -233,11 +218,9 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || (s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) { newval++; - AUDIO_KEYPAD_UP(); } else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) { newval--; - AUDIO_KEYPAD_DOWN(); } if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) { @@ -279,16 +262,15 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui if (newval > i_max || newval < i_min) { newval = (newval > i_max ? i_max : i_min); killEvents(event); - AUDIO_WARNING2(); + AUDIO_KEY_ERROR(); } if (newval != val) { if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) { pauseEvents(event); // delay before auto-repeat continues - if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same - AUDIO_KEYPAD_UP(); - else - AUDIO_KEYPAD_DOWN(); + } + if (!IS_KEY_REPT(event)) { + AUDIO_KEY_PRESS(); } storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); checkIncDec_Ret = (newval > val ? 1 : -1); @@ -507,6 +489,7 @@ void check(check_event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, ui break; case EVT_KEY_BREAK(KEY_EXIT): + AUDIO_KEY_PRESS(); #if defined(ROTARY_ENCODER_NAVIGATION) if (s_editMode == 0) s_editMode = EDIT_MODE_INIT; @@ -521,7 +504,6 @@ void check(check_event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, ui popMenu(); // beeps itself } else { - AUDIO_MENUS(); l_posVert = 0; l_posHorz = 0; } diff --git a/radio/src/gui/9x/view_main.cpp b/radio/src/gui/9x/view_main.cpp index a4ea13f79..187ddd1fc 100644 --- a/radio/src/gui/9x/view_main.cpp +++ b/radio/src/gui/9x/view_main.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,8 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" -#include "../../timers.h" +#include "opentx.h" #define BIGSIZE DBLSIZE #define LBOX_CENTERX (LCD_W/4 + 10) @@ -310,7 +309,7 @@ void menuMainView(uint8_t event) g_eeGeneral.view ^= ALTERNATE_VIEW; #endif storageDirty(EE_GENERAL); - AUDIO_KEYPAD_UP(); + AUDIO_KEY_PRESS(); } break; @@ -339,7 +338,7 @@ void menuMainView(uint8_t event) #if defined(CPUARM) POPUP_MENU_ADD_ITEM(STR_ABOUT_US); #endif - popupMenuHandler = onMainViewMenu; + POPUP_MENU_START(onMainViewMenu); break; #endif @@ -366,7 +365,6 @@ void menuMainView(uint8_t event) case EVT_KEY_BREAK(KEY_DOWN): g_eeGeneral.view = (event == EVT_KEY_BREAK(KEY_UP) ? (view_base == VIEW_COUNT-1 ? 0 : view_base+1) : (view_base == 0 ? VIEW_COUNT-1 : view_base-1)); storageDirty(EE_GENERAL); - AUDIO_KEYPAD_UP(); break; case EVT_KEY_STATISTICS: @@ -404,13 +402,11 @@ void menuMainView(uint8_t event) if (view == VIEW_TIMER2) { timerReset(1); } - AUDIO_KEYPAD_UP(); break; #if !defined(NAVIGATION_MENUS) case EVT_KEY_LONG(KEY_EXIT): flightReset(); - AUDIO_KEYPAD_UP(); break; #endif } diff --git a/radio/src/gui/9x/view_statistics.cpp b/radio/src/gui/9x/view_statistics.cpp index 3ab84fa95..fa6b841a3 100644 --- a/radio/src/gui/9x/view_statistics.cpp +++ b/radio/src/gui/9x/view_statistics.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,8 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" -#include "../../timers.h" +#include "opentx.h" void menuStatisticsView(uint8_t event) { @@ -51,7 +50,7 @@ void menuStatisticsView(uint8_t event) putsTimer( 12*FW+5*FWNUM+1, FH*2, s_timeCum16ThrP/16, 0, 0); putsTimer( 12*FW+5*FWNUM+1, FH*0, sessionTimer, 0, 0); - + #if defined(THRTRACE) const coord_t x = 5; const coord_t y = 60; @@ -98,7 +97,6 @@ void menuStatisticsDebug(uint8_t event) #endif sessionTimer = 0; killEvents(event); - AUDIO_KEYPAD_UP(); break; #endif case EVT_KEY_FIRST(KEY_ENTER): @@ -107,7 +105,6 @@ void menuStatisticsDebug(uint8_t event) g_tmr1Latency_max = 0; #endif maxMixerDuration = 0; - AUDIO_KEYPAD_UP(); break; #if defined(DEBUG_TRACE_BUFFER) diff --git a/radio/src/gui/horus/menu_general_sdmanager.cpp b/radio/src/gui/horus/menu_general_sdmanager.cpp index a9c1f52d2..b24a24e83 100644 --- a/radio/src/gui/horus/menu_general_sdmanager.cpp +++ b/radio/src/gui/horus/menu_general_sdmanager.cpp @@ -186,7 +186,7 @@ bool menuGeneralSdManager(evt_t _event) killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); POPUP_MENU_ADD_ITEM(STR_SD_FORMAT); - popupMenuHandler = onSdManagerMenu; + POPUP_MENU_START(onSdManagerMenu); } break; #endif @@ -248,7 +248,7 @@ bool menuGeneralSdManager(evt_t _event) if (IS_FILE(line)) POPUP_MENU_ADD_ITEM(STR_DELETE_FILE); } - popupMenuHandler = onSdManagerMenu; + POPUP_MENU_START(onSdManagerMenu); } break; } diff --git a/radio/src/gui/horus/menu_model_curves.cpp b/radio/src/gui/horus/menu_model_curves.cpp index 2d1e62e90..4a4bf5860 100644 --- a/radio/src/gui/horus/menu_model_curves.cpp +++ b/radio/src/gui/horus/menu_model_curves.cpp @@ -202,7 +202,7 @@ bool menuModelCurveOne(evt_t event) POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET); POPUP_MENU_ADD_ITEM(STR_MIRROR); POPUP_MENU_ADD_ITEM(STR_CLEAR); - popupMenuHandler = onCurveOneMenu; + POPUP_MENU_START(onCurveOneMenu); } break; // TODO? diff --git a/radio/src/gui/horus/menu_model_custom_functions.cpp b/radio/src/gui/horus/menu_model_custom_functions.cpp index 3b21e9235..cda767db3 100644 --- a/radio/src/gui/horus/menu_model_custom_functions.cpp +++ b/radio/src/gui/horus/menu_model_custom_functions.cpp @@ -158,7 +158,7 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc break; } } - popupMenuHandler = onCustomFunctionsMenu; + POPUP_MENU_START(onCustomFunctionsMenu); } for (int i=0; iid, 2); } if (sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), cfn->play.name)) { - popupMenuHandler = onCustomFunctionsFileSelectionMenu; + POPUP_MENU_START(onCustomFunctionsFileSelectionMenu); } else { POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); @@ -370,7 +370,7 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc POPUP_MENU_ADD_ITEM(STR_GLOBALVAR); if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC) POPUP_MENU_ADD_ITEM(STR_INCDEC); - popupMenuHandler = onAdjustGvarSourceLongEnterPress; + POPUP_MENU_START(onAdjustGvarSourceLongEnterPress); s_editMode = EDIT_MODIFY_FIELD; } } diff --git a/radio/src/gui/horus/menu_model_custom_scripts.cpp b/radio/src/gui/horus/menu_model_custom_scripts.cpp index f25147f36..ab228dbf3 100644 --- a/radio/src/gui/horus/menu_model_custom_scripts.cpp +++ b/radio/src/gui/horus/menu_model_custom_scripts.cpp @@ -72,7 +72,7 @@ bool menuModelCustomScriptOne(evt_t event) if (attr && event==EVT_KEY_FIRST(KEY_ENTER) && !READ_ONLY()) { killEvents(KEY_ENTER); if (sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) { - popupMenuHandler = onModelCustomScriptMenu; + POPUP_MENU_START(onModelCustomScriptMenu); } else { POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); diff --git a/radio/src/gui/horus/menu_model_gvars.cpp b/radio/src/gui/horus/menu_model_gvars.cpp index fd680007f..3f203748f 100644 --- a/radio/src/gui/horus/menu_model_gvars.cpp +++ b/radio/src/gui/horus/menu_model_gvars.cpp @@ -103,7 +103,7 @@ bool menuModelGVars(evt_t event) else POPUP_MENU_ADD_ITEM(STR_ENABLE_POPUP); POPUP_MENU_ADD_ITEM(STR_CLEAR); - popupMenuHandler = onGVARSMenu; + POPUP_MENU_START(onGVARSMenu); } return true; diff --git a/radio/src/gui/horus/menu_model_inputs.cpp b/radio/src/gui/horus/menu_model_inputs.cpp index e5e00f26c..80ad3190f 100644 --- a/radio/src/gui/horus/menu_model_inputs.cpp +++ b/radio/src/gui/horus/menu_model_inputs.cpp @@ -445,7 +445,7 @@ bool menuModelExposAll(evt_t event) POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_DELETE); - popupMenuHandler = onExposMenu; + POPUP_MENU_START(onExposMenu); } } } diff --git a/radio/src/gui/horus/menu_model_limits.cpp b/radio/src/gui/horus/menu_model_limits.cpp index 3f5fcb901..178a1f2dd 100644 --- a/radio/src/gui/horus/menu_model_limits.cpp +++ b/radio/src/gui/horus/menu_model_limits.cpp @@ -149,7 +149,7 @@ bool menuModelLimits(evt_t event) POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); - popupMenuHandler = onLimitsMenu; + POPUP_MENU_START(onLimitsMenu); } for (uint8_t j=0; jfunc || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_CLEAR); - popupMenuHandler = onLogicalSwitchesMenu; + POPUP_MENU_START(onLogicalSwitchesMenu); } for (int i=0; iname, LEN_MODEL_FILENAME, 0); } else if (result == STR_CHANGE_CATEGORY) { - + } else if (result == STR_DUPLICATE_MODEL) { char duplicatedFilename[LEN_MODEL_FILENAME+1]; @@ -194,7 +194,7 @@ bool menuModelSelect(evt_t event) if (currentCategoryIndex > 0) { POPUP_MENU_ADD_ITEM(STR_DELETE_CATEGORY); } - popupMenuHandler = onCategorySelectMenu; + POPUP_MENU_START(onCategorySelectMenu); } else if (selectMode == MODE_SELECT_MODEL) { killEvents(event); @@ -212,7 +212,7 @@ bool menuModelSelect(evt_t event) POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL); // POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL); // POPUP_MENU_ADD_ITEM(STR_RESTORE_MODEL); - popupMenuHandler = onModelSelectMenu; + POPUP_MENU_START(onModelSelectMenu); } break; } diff --git a/radio/src/gui/horus/menu_model_setup.cpp b/radio/src/gui/horus/menu_model_setup.cpp index b60735c23..38d77cc08 100644 --- a/radio/src/gui/horus/menu_model_setup.cpp +++ b/radio/src/gui/horus/menu_model_setup.cpp @@ -79,6 +79,7 @@ enum menuModelSetupItems { }; #define MODEL_SETUP_2ND_COLUMN 200 +#define MODEL_SETUP_3RD_COLUMN 270 #define MODEL_SETUP_BIND_OFS 40 #define MODEL_SETUP_RANGE_OFS 80 #define MODEL_SETUP_SET_FAILSAFE_OFS 100 @@ -99,28 +100,28 @@ void onModelSetupBitmapMenu(const char *result) void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event) { - TimerData * timer = &g_model.timers[timerIdx]; + TimerData & timer = g_model.timers[timerIdx]; if (attr && menuHorizontalPosition < 0) { lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN-INVERT_HORZ_MARGIN, y-INVERT_VERT_MARGIN+1, 115+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR); } drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1); - putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (menuHorizontalPosition<=0 ? attr : 0)); - putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer->start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR)); + putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, (menuHorizontalPosition<=0 ? attr : 0)); + putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer.start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR)); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: { - int8_t timerMode = timer->mode; + int8_t timerMode = timer.mode; if (timerMode < 0) timerMode -= TMRMODE_COUNT-1; CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers); if (timerMode < 0) timerMode += TMRMODE_COUNT-1; - timer->mode = timerMode; + timer.mode = timerMode; #if defined(AUTOSWITCH) if (s_editMode>0) { - int8_t val = timer->mode - (TMRMODE_COUNT-1); + int8_t val = timer.mode - (TMRMODE_COUNT-1); int8_t switchVal = checkIncDecMovedSwitch(val); if (val != switchVal) { - timer->mode = switchVal + (TMRMODE_COUNT-1); + timer.mode = switchVal + (TMRMODE_COUNT-1); storageDirty(EE_MODEL); } } @@ -130,13 +131,33 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event) case 1: { const int stopsMinutes[] = { 8, 60, 120, 180, 240, 300, 600, 900, 1200 }; - timer->start = checkIncDec(event, timer->start, 0, 60*60, EE_MODEL, NULL, (const CheckIncDecStops&)stopsMinutes); + timer.start = checkIncDec(event, timer.start, 0, 60*60, EE_MODEL, NULL, (const CheckIncDecStops&)stopsMinutes); break; } } } } +void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, evt_t event) +{ + TimerData & timer = g_model.timers[timerIdx]; + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, timer.countdownBeep, (menuHorizontalPosition == 0 ? attr : 0)); + if (timer.countdownBeep != COUNTDOWN_SILENT) { + lcdDrawNumber(MODEL_SETUP_3RD_COLUMN, y, TIMER_COUNTDOWN_START(timerIdx), (menuHorizontalPosition == 1 ? attr : 0) | LEFT, 0, NULL, "s"); + } + if (attr && s_editMode > 0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, timer.countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1); + break; + case 1: + timer.countdownStart = -checkIncDecModel(event, -timer.countdownStart, -1, +2); + break; + } + } +} + #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) int getSwitchWarningsCount() @@ -236,7 +257,7 @@ bool menuModelSetup(evt_t event) if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { s_editMode = 0; if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) { - popupMenuHandler = onModelSetupBitmapMenu; + POPUP_MENU_START(onModelSetupBitmapMenu); } else { POPUP_WARNING(STR_NO_BITMAPS_ON_SD); @@ -259,8 +280,7 @@ bool menuModelSetup(evt_t event) break; case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); - g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, 0, 2, attr, event); + editTimerCountdown(0, y, attr, event); break; case ITEM_MODEL_TIMER1_PERSISTENT: @@ -284,8 +304,7 @@ bool menuModelSetup(evt_t event) break; case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); - g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, 0, 2, attr, event); + editTimerCountdown(1, y, attr, event); break; case ITEM_MODEL_TIMER2_PERSISTENT: @@ -310,8 +329,7 @@ bool menuModelSetup(evt_t event) break; case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); - g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, 0, 2, attr, event); + editTimerCountdown(2, y, attr, event); break; case ITEM_MODEL_TIMER3_PERSISTENT: @@ -529,7 +547,7 @@ bool menuModelSetup(evt_t event) } } break; - + case ITEM_MODEL_INTERNAL_MODULE_ANTENNA: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ANTENNASELECTION); newAntennaSel = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VANTENNATYPES, g_model.moduleData[INTERNAL_MODULE].ppm.pulsePol, 0, 1, attr, event); @@ -556,9 +574,9 @@ bool menuModelSetup(evt_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, (menuHorizontalPosition==0 ? attr : 0)); if (IS_MODULE_XJT(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+70, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); else if (IS_MODULE_DSM2(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+70, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0)); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: diff --git a/radio/src/gui/horus/menu_model_telemetry.cpp b/radio/src/gui/horus/menu_model_telemetry.cpp index d74e7bd06..22a600e5a 100644 --- a/radio/src/gui/horus/menu_model_telemetry.cpp +++ b/radio/src/gui/horus/menu_model_telemetry.cpp @@ -447,7 +447,7 @@ bool menuModelTelemetry(evt_t event) POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_DELETE); - popupMenuHandler = onSensorMenu; + POPUP_MENU_START(onSensorMenu); } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { pushMenu(menuModelSensor); diff --git a/radio/src/gui/horus/menus.cpp b/radio/src/gui/horus/menus.cpp index b7a623024..8b47da269 100644 --- a/radio/src/gui/horus/menus.cpp +++ b/radio/src/gui/horus/menus.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -30,6 +30,7 @@ void popMenu() assert(menuLevel>0); menuLevel = menuLevel-1; menuEvent = EVT_ENTRY_UP; + AUDIO_KEY_PRESS(); TRACE("popMenu(%d)", menuLevel); } @@ -37,6 +38,7 @@ void chainMenu(MenuHandlerFunc newMenu) { menuHandlers[menuLevel] = newMenu; menuEvent = EVT_ENTRY; + AUDIO_KEY_PRESS(); TRACE("chainMenu(%d, %p)", menuLevel, newMenu); } @@ -60,6 +62,7 @@ void pushMenu(MenuHandlerFunc newMenu) menuHandlers[menuLevel] = newMenu; menuEvent = EVT_ENTRY; + AUDIO_KEY_PRESS(); TRACE("pushMenu(%d, %p)", menuLevel, newMenu); } diff --git a/radio/src/gui/horus/menus.h b/radio/src/gui/horus/menus.h index 76bfc1376..4e1250fa4 100644 --- a/radio/src/gui/horus/menus.h +++ b/radio/src/gui/horus/menus.h @@ -487,6 +487,7 @@ extern uint8_t warningInfoFlags; #define NAVIGATION_MENUS #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) +#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 9 #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) diff --git a/radio/src/gui/horus/navigation.cpp b/radio/src/gui/horus/navigation.cpp index 34ba5ab2d..6e0794a0c 100644 --- a/radio/src/gui/horus/navigation.cpp +++ b/radio/src/gui/horus/navigation.cpp @@ -159,14 +159,9 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags newval++; } } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); - if (newval > i_max) { newval = val; - killEvents(event); - AUDIO_WARNING2(); - } - else { - AUDIO_KEYPAD_UP(); + AUDIO_KEY_ERROR(); } } else if (s_editMode>0 && event==EVT_ROTARY_LEFT) { @@ -178,14 +173,9 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags newval--; } } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); - if (newval < i_min) { newval = val; - killEvents(event); - AUDIO_WARNING2(); - } - else { - AUDIO_KEYPAD_DOWN(); + AUDIO_KEY_ERROR(); } } @@ -218,28 +208,11 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags } } #endif - - if (newval > i_max || newval < i_min) { - newval = (newval > i_max ? i_max : i_min); - killEvents(event); - AUDIO_WARNING2(); - } - + if (newval != val) { -#if 0 - if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && stops.contains(newval) && !IS_ROTARY_EVENT(event)) { - bool pause = (newval > val ? !stops.contains(newval+1) : !stops.contains(newval-1)); - if (pause) { - pauseEvents(event); // delay before auto-repeat continues - if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same - AUDIO_KEYPAD_UP(); - else - AUDIO_KEYPAD_DOWN(); - } - } -#endif storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); checkIncDec_Ret = (newval > val ? 1 : -1); + AUDIO_KEY_PRESS(); } else { checkIncDec_Ret = 0; @@ -285,7 +258,7 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags } } } - popupMenuHandler = onSourceLongEnterPress; + POPUP_MENU_START(onSourceLongEnterPress); } if (checkIncDecSelection != 0) { newval = checkIncDecSelection; @@ -310,7 +283,7 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags } if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - popupMenuHandler = onSwitchLongEnterPress; + POPUP_MENU_START(onSwitchLongEnterPress); s_editMode = EDIT_MODIFY_FIELD; } if (checkIncDecSelection != 0) { @@ -450,15 +423,18 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u if (s_editMode > 1) break; if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) { menuHorizontalPosition = 0; + AUDIO_KEY_PRESS(); } else if (READ_ONLY_UNLOCKED() && rowcount > 0) { s_editMode = (s_editMode<=0); + AUDIO_KEY_PRESS(); } break; case EVT_KEY_FIRST(KEY_EXIT): if (s_editMode > 0) { s_editMode = 0; + AUDIO_KEY_PRESS(); break; } @@ -468,6 +444,7 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u if (menuHorizontalPosition >= 0 && (COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) { menuHorizontalPosition = -1; + AUDIO_KEY_PRESS(); } else { uint8_t posVertInit = MENU_FIRST_LINE_EDIT; @@ -475,6 +452,7 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u menuVerticalOffset = 0; menuVerticalPosition = posVertInit; menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition); + AUDIO_KEY_PRESS(); } else if (!calibrationState) { popMenu(); @@ -483,6 +461,8 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u break; case EVT_KEY_FIRST(KEY_RIGHT): + AUDIO_KEY_PRESS(); + // no break case EVT_KEY_REPT(KEY_RIGHT): if (s_editMode == 0) { INC(menuHorizontalPosition, 0, maxcol); @@ -490,6 +470,8 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u break; case EVT_KEY_FIRST(KEY_LEFT): + AUDIO_KEY_PRESS(); + // no break case EVT_KEY_REPT(KEY_LEFT): if (s_editMode == 0) { DEC(menuHorizontalPosition, 0, maxcol); @@ -498,6 +480,7 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u case EVT_ROTARY_RIGHT: if (s_editMode != 0) break; + AUDIO_KEY_PRESS(); if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) { if (menuHorizontalPosition >= 0) { INC(menuHorizontalPosition, 0, maxcol); @@ -512,10 +495,12 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u INC(menuVerticalPosition, MENU_FIRST_LINE_EDIT, rowcount-1); } while (CURSOR_NOT_ALLOWED_IN_ROW(menuVerticalPosition)); menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition); + break; case EVT_ROTARY_LEFT: if (s_editMode != 0) break; + AUDIO_KEY_PRESS(); if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) { if (menuHorizontalPosition >= 0) { DEC(menuHorizontalPosition, 0, maxcol); diff --git a/radio/src/gui/horus/screens_setup.cpp b/radio/src/gui/horus/screens_setup.cpp index 4bfb2e00e..e5e21649d 100644 --- a/radio/src/gui/horus/screens_setup.cpp +++ b/radio/src/gui/horus/screens_setup.cpp @@ -94,7 +94,7 @@ bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu s_editMode = 0; if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(value->stringValue), value->stringValue, LIST_NONE_SD_FILE)) { fileSelectionDone = false; - popupMenuHandler = onZoneOptionFileSelectionMenu; + POPUP_MENU_START(onZoneOptionFileSelectionMenu); } else { POPUP_WARNING(STR_NO_BITMAPS_ON_SD); @@ -330,7 +330,7 @@ bool menuWidgetsSetup(evt_t event) if (currentWidget->getFactory()->getOptions()) POPUP_MENU_ADD_ITEM(STR_WIDGET_SETTINGS); POPUP_MENU_ADD_ITEM(STR_REMOVE_WIDGET); - popupMenuHandler = onZoneMenu; + POPUP_MENU_START(onZoneMenu); } else { onZoneMenu(STR_SELECT_WIDGET); diff --git a/radio/src/gui/horus/view_main.cpp b/radio/src/gui/horus/view_main.cpp index 84a6b347a..96305b9cf 100644 --- a/radio/src/gui/horus/view_main.cpp +++ b/radio/src/gui/horus/view_main.cpp @@ -144,7 +144,7 @@ bool menuMainView(evt_t event) POPUP_MENU_ADD_ITEM(STR_STATISTICS); POPUP_MENU_ADD_ITEM(STR_SETUP_SCREENS); POPUP_MENU_ADD_ITEM(STR_ABOUT_US); - popupMenuHandler = onMainViewMenu; + POPUP_MENU_START(onMainViewMenu); break; case EVT_KEY_LONG(KEY_MODEL): @@ -179,7 +179,6 @@ bool menuMainView(evt_t event) gvarDisplayTimer = 0; } #endif - AUDIO_KEYPAD_UP(); break; } diff --git a/radio/src/gui/horus/view_statistics.cpp b/radio/src/gui/horus/view_statistics.cpp index 88a77a4ec..5f61e6a1d 100644 --- a/radio/src/gui/horus/view_statistics.cpp +++ b/radio/src/gui/horus/view_statistics.cpp @@ -35,10 +35,9 @@ bool menuStatsGraph(evt_t event) storageDirty(EE_GENERAL); sessionTimer = 0; killEvents(event); - AUDIO_KEYPAD_UP(); break; } - + MENU("Statistics", STATS_ICONS, menuTabStats, e_StatsGraph, 0, { 0 }); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Session"); @@ -107,7 +106,6 @@ bool menuStatsDebug(evt_t event) maxLuaInterval = 0; maxLuaDuration = 0; #endif - AUDIO_KEYPAD_UP(); break; } diff --git a/radio/src/gui/taranis/lcd.cpp b/radio/src/gui/taranis/lcd.cpp index ba74fa448..3d0aa0e68 100644 --- a/radio/src/gui/taranis/lcd.cpp +++ b/radio/src/gui/taranis/lcd.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -568,7 +568,7 @@ void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2 if (att & TIMEHOUR) { div_t qr2 = div(qr.quot, 60); lcdDrawNumber(x, y, qr2.quot, att|LEADING0|LEFT, 2); - lcdDrawChar(lcdLastPos, y, separator, att&att2); + lcdDrawChar(lcdLastPos, y, separator, att); qr.quot = qr2.rem; if (att & MIDSIZE) x += 17; @@ -646,7 +646,7 @@ void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) lcdDrawChar(x, y, '\307', att); //stick symbol else if (idx < MIXSRC_FIRST_SLIDER-MIXSRC_Rud ) lcdDrawChar(x, y, '\310', att); //pot symbol - else + else lcdDrawChar(x, y, '\311', att); //slider symbol lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, ZCHAR|att); } @@ -940,7 +940,9 @@ void displayGpsCoords(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFl void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t value, LcdFlags att) { - if (channel >= MAX_SENSORS) return; //Lua luaLcdDrawChannel() can call us with a bad value + if (channel >= MAX_SENSORS) + return; // Lua luaLcdDrawChannel() can call us with a bad value + TelemetryItem & telemetryItem = telemetryItems[channel]; TelemetrySensor & telemetrySensor = g_model.telemetrySensors[channel]; if (telemetrySensor.unit == UNIT_DATETIME) { @@ -949,6 +951,52 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t va else if (telemetrySensor.unit == UNIT_GPS) { displayGpsCoords(x, y, telemetryItem, att); } + else if (telemetrySensor.unit == UNIT_BITFIELD) { + if (IS_FRSKY_SPORT_PROTOCOL()) { + if (telemetrySensor.id >= RBOX_STATE_FIRST_ID && telemetrySensor.id <= RBOX_STATE_LAST_ID) { + if (telemetrySensor.subId == 0) { + if (value == 0) { + lcdDrawText(att & LEFT ? x : x-15, att & DBLSIZE ? y+1 : y, "OK"); + } + else { + for (uint8_t i=0; i<16; i++) { + if (value & (1 << i)) { + drawStringWithIndex(att & LEFT ? x : x-40, att & DBLSIZE ? y+1 : y, "CH", i+1); + lcdDrawText(lcdLastPos+3, att & DBLSIZE ? y+1 : y, "KO"); + break; + } + } + } + } + else { + if (value == 0) { + lcdDrawText(x, att & DBLSIZE ? y+1 : y, "Rx OK"); + } + else { + static const char * const RXS_STATUS[] = { + "Rx1 Ovl", + "Rx2 Ovl", + "SBUS Ovl", + "Rx1 FS", + "Rx1 LF", + "Rx2 FS", + "Rx2 LF", + "Rx1 Lost", + "Rx2 Lost", + "Rx1 NS", + "Rx2 NS", + }; + for (uint8_t i=0; i 0) { @@ -1139,4 +1187,3 @@ void lcdDrawBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset, co } } #endif - diff --git a/radio/src/gui/taranis/menu_general_sdmanager.cpp b/radio/src/gui/taranis/menu_general_sdmanager.cpp index 039229b02..efcd3431f 100644 --- a/radio/src/gui/taranis/menu_general_sdmanager.cpp +++ b/radio/src/gui/taranis/menu_general_sdmanager.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -262,7 +262,7 @@ void menuGeneralSdManager(evt_t _event) killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); POPUP_MENU_ADD_ITEM(STR_SD_FORMAT); - popupMenuHandler = onSdManagerMenu; + POPUP_MENU_START(onSdManagerMenu); } break; @@ -333,7 +333,7 @@ void menuGeneralSdManager(evt_t _event) if (IS_FILE(line)) POPUP_MENU_ADD_ITEM(STR_DELETE_FILE); } - popupMenuHandler = onSdManagerMenu; + POPUP_MENU_START(onSdManagerMenu); } break; } @@ -345,7 +345,7 @@ void menuGeneralSdManager(evt_t _event) TCHAR lfn[_MAX_LFN + 1]; fno.lfname = lfn; fno.lfsize = sizeof(lfn); - + if (menuVerticalOffset == 0) { reusableBuffer.sdmanager.offset = 0; memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); diff --git a/radio/src/gui/taranis/menu_general_setup.cpp b/radio/src/gui/taranis/menu_general_setup.cpp index f5dce9cd9..e6f65c4df 100644 --- a/radio/src/gui/taranis/menu_general_setup.cpp +++ b/radio/src/gui/taranis/menu_general_setup.cpp @@ -228,9 +228,11 @@ void menuGeneralSetup(uint8_t event) case ITEM_SETUP_BEEP_VOLUME: SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); break; + case ITEM_SETUP_WAV_VOLUME: SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); break; + case ITEM_SETUP_BACKGROUND_VOLUME: SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); break; @@ -253,21 +255,25 @@ void menuGeneralSetup(uint8_t event) case ITEM_SETUP_VARIO_LABEL: lcd_putsLeft(y, STR_VARIO); break; + case ITEM_SETUP_VARIO_VOLUME: SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr); break; + case ITEM_SETUP_VARIO_PITCH: lcd_putsLeft(y, STR_PITCH_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT); lcdDrawText(lcdLastPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40); break; + case ITEM_SETUP_VARIO_RANGE: lcd_putsLeft(y, STR_PITCH_AT_MAX); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10)+VARIO_FREQUENCY_RANGE+(g_eeGeneral.varioRange*10), attr|LEFT); lcdDrawText(lcdLastPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80); break; + case ITEM_SETUP_VARIO_REPEAT: lcd_putsLeft(y, STR_REPEAT_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT); @@ -310,7 +316,7 @@ void menuGeneralSetup(uint8_t event) case ITEM_SETUP_BATTERY_WARNING: lcd_putsLeft(y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); - if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); // 4-12V break; case ITEM_SETUP_MEMORY_WARNING: diff --git a/radio/src/gui/taranis/menu_model_curves.cpp b/radio/src/gui/taranis/menu_model_curves.cpp index 7fe47edd8..bbb91726f 100644 --- a/radio/src/gui/taranis/menu_model_curves.cpp +++ b/radio/src/gui/taranis/menu_model_curves.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -191,7 +191,7 @@ void menuModelCurveOne(uint8_t event) POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET); POPUP_MENU_ADD_ITEM(STR_MIRROR); POPUP_MENU_ADD_ITEM(STR_CLEAR); - popupMenuHandler = onCurveOneMenu; + POPUP_MENU_START(onCurveOneMenu); } break; case EVT_KEY_LONG(KEY_MENU): diff --git a/radio/src/gui/taranis/menu_model_custom_functions.cpp b/radio/src/gui/taranis/menu_model_custom_functions.cpp index d0fdd2ae5..a0cd0db7e 100644 --- a/radio/src/gui/taranis/menu_model_custom_functions.cpp +++ b/radio/src/gui/taranis/menu_model_custom_functions.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -165,7 +165,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu break; } } - popupMenuHandler = onCustomFunctionsMenu; + POPUP_MENU_START(onCustomFunctionsMenu); } for (int i=0; iid, 2); } if (sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), cfn->play.name)) { - popupMenuHandler = onCustomFunctionsFileSelectionMenu; + POPUP_MENU_START(onCustomFunctionsFileSelectionMenu); } else { POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); @@ -386,7 +386,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu POPUP_MENU_ADD_ITEM(STR_GLOBALVAR); if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC) POPUP_MENU_ADD_ITEM(STR_INCDEC); - popupMenuHandler = onAdjustGvarSourceLongEnterPress; + POPUP_MENU_START(onAdjustGvarSourceLongEnterPress); s_editMode = EDIT_MODIFY_FIELD; } } diff --git a/radio/src/gui/taranis/menu_model_custom_scripts.cpp b/radio/src/gui/taranis/menu_model_custom_scripts.cpp index 2c4a51827..1db47e000 100644 --- a/radio/src/gui/taranis/menu_model_custom_scripts.cpp +++ b/radio/src/gui/taranis/menu_model_custom_scripts.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -72,7 +72,7 @@ void menuModelCustomScriptOne(uint8_t event) if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && !READ_ONLY()) { s_editMode = 0; if (sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) { - popupMenuHandler = onModelCustomScriptMenu; + POPUP_MENU_START(onModelCustomScriptMenu); } else { POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); diff --git a/radio/src/gui/taranis/menu_model_gvars.cpp b/radio/src/gui/taranis/menu_model_gvars.cpp index a2d0dbdbe..2529f8eab 100644 --- a/radio/src/gui/taranis/menu_model_gvars.cpp +++ b/radio/src/gui/taranis/menu_model_gvars.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -183,6 +183,6 @@ void menuModelGVars(uint8_t event) killEvents(event); POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_CLEAR); - popupMenuHandler = onGVARSMenu; + POPUP_MENU_START(onGVARSMenu); } } diff --git a/radio/src/gui/taranis/menu_model_inputs.cpp b/radio/src/gui/taranis/menu_model_inputs.cpp index 590789198..8eb2d9a07 100644 --- a/radio/src/gui/taranis/menu_model_inputs.cpp +++ b/radio/src/gui/taranis/menu_model_inputs.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -433,7 +433,7 @@ void menuModelExposAll(uint8_t event) POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_DELETE); - popupMenuHandler = onExposMenu; + POPUP_MENU_START(onExposMenu); } } } diff --git a/radio/src/gui/taranis/menu_model_limits.cpp b/radio/src/gui/taranis/menu_model_limits.cpp index 54b9f90db..b0a1db249 100644 --- a/radio/src/gui/taranis/menu_model_limits.cpp +++ b/radio/src/gui/taranis/menu_model_limits.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -159,7 +159,7 @@ void menuModelLimits(uint8_t event) POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); - popupMenuHandler = onLimitsMenu; + POPUP_MENU_START(onLimitsMenu); } for (int j=0; jfunc || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_CLEAR); - popupMenuHandler = onLogicalSwitchesMenu; + POPUP_MENU_START(onLogicalSwitchesMenu); } for (int i=0; imode, menuHorizontalPosition==0 ? attr : 0); - putsTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR, menuHorizontalPosition==2 ? attr|TIMEHOUR : TIMEHOUR); - if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 11*FW, FH+1); + putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, menuHorizontalPosition==0 ? attr : 0); + putsTimer(MODEL_SETUP_3RD_COLUMN+5*FWNUM+2, y, timer.start, menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR, menuHorizontalPosition==2 ? attr|TIMEHOUR : TIMEHOUR); + if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 13*FW-3, FH+1); if (attr && s_editMode>0) { - div_t qr = div(timer->start, 60); + div_t qr = div(timer.start, 60); switch (menuHorizontalPosition) { case 0: { - swsrc_t timerMode = timer->mode; + swsrc_t timerMode = timer.mode; if (timerMode < 0) timerMode -= TMRMODE_COUNT-1; CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers); if (timerMode < 0) timerMode += TMRMODE_COUNT-1; - timer->mode = timerMode; + timer.mode = timerMode; #if defined(AUTOSWITCH) if (s_editMode>0) { - swsrc_t val = timer->mode - (TMRMODE_COUNT-1); + swsrc_t val = timer.mode - (TMRMODE_COUNT-1); swsrc_t switchVal = checkIncDecMovedSwitch(val); if (val != switchVal) { - timer->mode = switchVal + (TMRMODE_COUNT-1); + timer.mode = switchVal + (TMRMODE_COUNT-1); storageDirty(EE_MODEL); } } @@ -152,13 +153,34 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event) } case 1: qr.quot = checkIncDec(event, qr.quot, 0, 1439, EE_MODEL | NO_INCDEC_MARKS); // 23h59 - timer->start = qr.rem + qr.quot*60; + timer.start = qr.rem + qr.quot*60; break; case 2: qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2; - timer->start -= qr.rem ; - if ((int16_t)timer->start < 0) timer->start=0; - if ((int32_t)timer->start > 86399) timer->start=86399; // 23h59:59 + timer.start -= qr.rem ; + if ((int16_t)timer.start < 0) timer.start=0; + if ((int32_t)timer.start > 86399) timer.start=86399; // 23h59:59 + break; + } + } +} + +void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, uint8_t event) +{ + TimerData & timer = g_model.timers[timerIdx]; + lcd_putsLeft(y, STR_BEEPCOUNTDOWN); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, timer.countdownBeep, (menuHorizontalPosition==0 ? attr : 0)); + if (timer.countdownBeep != COUNTDOWN_SILENT) { + lcdDrawNumber(MODEL_SETUP_3RD_COLUMN, y, TIMER_COUNTDOWN_START(timerIdx), (menuHorizontalPosition == 1 ? attr : 0) | LEFT); + lcdDrawChar(lcdLastPos, y, 's'); + } + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, timer.countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1); + break; + case 1: + timer.countdownStart = -checkIncDecModel(event, -timer.countdownStart, -1, +2); break; } } @@ -202,7 +224,7 @@ int getSwitchWarningsCount() #define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW #endif #define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x)) -#define TIMER_ROWS 2|NAVIGATION_LINE_BY_LINE, 0, CASE_PERSISTENT_TIMERS(0) 0, 0 +#define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0 #if defined(MULTIMODULE) #define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ) @@ -215,11 +237,11 @@ int getSwitchWarningsCount() #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0 #if TIMERS == 1 - #define TIMERS_ROWS TIMER_ROWS + #define TIMERS_ROWS TIMER_ROWS(0) #elif TIMERS == 2 - #define TIMERS_ROWS TIMER_ROWS, TIMER_ROWS + #define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1) #elif TIMERS == 3 - #define TIMERS_ROWS TIMER_ROWS, TIMER_ROWS, TIMER_ROWS + #define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1), TIMER_ROWS(2) #endif #if defined(REV9E) #define SW_WARN_ITEMS() uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)), uint8_t(getSwitchWarningsCount() > 8 ? TITLE_ROW : HIDDEN_ROW), uint8_t(getSwitchWarningsCount() > 16 ? TITLE_ROW : HIDDEN_ROW) @@ -303,7 +325,7 @@ void menuModelSetup(uint8_t event) if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { s_editMode = 0; if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) { - popupMenuHandler = onModelSetupBitmapMenu; + POPUP_MENU_START(onModelSetupBitmapMenu); } else { POPUP_WARNING(STR_NO_BITMAPS_ON_SD); @@ -324,7 +346,7 @@ void menuModelSetup(uint8_t event) break; case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP: - g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event); + editTimerCountdown(0, y, attr, event); break; case ITEM_MODEL_TIMER1_PERSISTENT: @@ -345,7 +367,7 @@ void menuModelSetup(uint8_t event) break; case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP: - g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event); + editTimerCountdown(1, y, attr, event); break; case ITEM_MODEL_TIMER2_PERSISTENT: @@ -367,7 +389,7 @@ void menuModelSetup(uint8_t event) break; case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: - g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event); + editTimerCountdown(2, y, attr, event); break; case ITEM_MODEL_TIMER3_PERSISTENT: @@ -635,7 +657,7 @@ void menuModelSetup(uint8_t event) lcd_putsLeft(y, STR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); if (IS_MODULE_XJT(INTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: @@ -683,13 +705,13 @@ void menuModelSetup(uint8_t event) lcd_putsLeft(y, STR_MODE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); if (IS_MODULE_XJT(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (IS_MODULE_DSM2(EXTERNAL_MODULE)) - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); #if defined(MULTIMODULE) else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { int8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); + lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0); switch(multi_rfProto) { case MM_RF_PROTO_FLYSKY: @@ -955,8 +977,9 @@ void menuModelSetup(uint8_t event) } if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr); - if (attr) + if (attr) { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127); + } } } #endif diff --git a/radio/src/gui/taranis/menu_model_telemetry.cpp b/radio/src/gui/taranis/menu_model_telemetry.cpp index 389bf922b..fb1e00932 100644 --- a/radio/src/gui/taranis/menu_model_telemetry.cpp +++ b/radio/src/gui/taranis/menu_model_telemetry.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -373,7 +373,7 @@ void menuModelSensor(uint8_t event) case SENSOR_FIELD_FILTER: ON_OFF_MENU_ITEM(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event); break; - + case SENSOR_FIELD_PERSISTENT: ON_OFF_MENU_ITEM(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event); if (checkIncDec_Ret && !sensor->persistent) { @@ -410,7 +410,7 @@ void onSensorMenu(const char *result) } else if (result == STR_COPY) { int newIndex = availableTelemetryIndex(); - + if (newIndex >= 0) { TelemetrySensor & sourceSensor = g_model.telemetrySensors[index]; TelemetrySensor & newSensor = g_model.telemetrySensors[newIndex]; @@ -419,7 +419,7 @@ void onSensorMenu(const char *result) TelemetryItem & newItem = telemetryItems[newIndex]; newItem = sourceItem; storageDirty(EE_MODEL); - } + } else { POPUP_WARNING(STR_TELEMETRYFULL); } @@ -454,7 +454,7 @@ void menuModelTelemetry(uint8_t event) delTelemetryIndex(i); } } - + MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX, { TELEMETRY_TYPE_ROWS RSSI_ROWS SENSORS_ROWS VARIO_ROWS LABEL(TopBar), 0, 0, TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), TELEMETRY_SCREEN_ROWS(2), TELEMETRY_SCREEN_ROWS(3) }); for (int i=0; i0); menuLevel = menuLevel-1; menuEvent = EVT_ENTRY_UP; + AUDIO_KEY_PRESS(); TRACE("popMenu(%d)", menuLevel); } @@ -37,6 +38,7 @@ void chainMenu(MenuHandlerFunc newMenu) { menuHandlers[menuLevel] = newMenu; menuEvent = EVT_ENTRY; + AUDIO_KEY_PRESS(); TRACE("chainMenu(%d, %p)", menuLevel, newMenu); } @@ -60,6 +62,7 @@ void pushMenu(MenuHandlerFunc newMenu) menuHandlers[menuLevel] = newMenu; menuEvent = EVT_ENTRY; + AUDIO_KEY_PRESS(); TRACE("pushMenu(%d, %p)", menuLevel, newMenu); } diff --git a/radio/src/gui/taranis/menus.h b/radio/src/gui/taranis/menus.h index 893cdb49c..be303f1db 100644 --- a/radio/src/gui/taranis/menus.h +++ b/radio/src/gui/taranis/menus.h @@ -408,6 +408,7 @@ extern uint8_t warningInfoFlags; #define NAVIGATION_MENUS #define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) +#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 6 #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) diff --git a/radio/src/gui/taranis/navigation.cpp b/radio/src/gui/taranis/navigation.cpp index d0252e9de..37114ab40 100644 --- a/radio/src/gui/taranis/navigation.cpp +++ b/radio/src/gui/taranis/navigation.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" vertpos_t menuVerticalOffset; vertpos_t menuVerticalPosition; @@ -89,7 +89,7 @@ void onSourceLongEnterPress(const char * result) break; } } - } + } } void onSwitchLongEnterPress(const char *result) @@ -166,14 +166,10 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int newval++; } } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); - if (newval > i_max) { newval = val; killEvents(event); - AUDIO_WARNING2(); - } - else { - AUDIO_KEYPAD_UP(); + AUDIO_KEY_ERROR(); } } else if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_REPT(KEY_MINUS))) { @@ -185,14 +181,10 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int newval--; } } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); - if (newval < i_min) { newval = val; killEvents(event); - AUDIO_WARNING2(); - } - else { - AUDIO_KEYPAD_DOWN(); + AUDIO_KEY_ERROR(); } } @@ -226,35 +218,28 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int } #endif - if (newval > i_max || newval < i_min) { - newval = (newval > i_max ? i_max : i_min); - killEvents(event); - AUDIO_WARNING2(); - } - if (newval != val) { if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && stops.contains(newval)) { bool pause = (newval > val ? !stops.contains(newval+1) : !stops.contains(newval-1)); if (pause) { pauseEvents(event); // delay before auto-repeat continues - if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same - AUDIO_KEYPAD_UP(); - else - AUDIO_KEYPAD_DOWN(); } } storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); checkIncDec_Ret = (newval > val ? 1 : -1); + if (!IS_KEY_REPT(event)) { + AUDIO_KEY_PRESS(); + } } else { checkIncDec_Ret = 0; } - + if (i_flags & INCDEC_SOURCE) { if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); checkIncDecSelection = MIXSRC_NONE; - + if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE) { POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); @@ -280,7 +265,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable(MIXSRC_FIRST_GVAR)) { POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); } - + if (i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { for (int i = 0; i < MAX_SENSORS; i++) { TelemetrySensor * sensor = & g_model.telemetrySensors[i]; @@ -290,7 +275,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int } } } - popupMenuHandler = onSourceLongEnterPress; + POPUP_MENU_START(onSourceLongEnterPress); } if (checkIncDecSelection != 0) { newval = checkIncDecSelection; @@ -315,7 +300,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int } if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); - popupMenuHandler = onSwitchLongEnterPress; + POPUP_MENU_START(onSwitchLongEnterPress); s_editMode = EDIT_MODIFY_FIELD; } if (checkIncDecSelection != 0) { @@ -365,7 +350,7 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl if (modelHasNotes()) { POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS); POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); - popupMenuHandler = onLongMenuPress; + POPUP_MENU_START(onLongMenuPress); } else { pushMenu(menuChannelsView); @@ -423,9 +408,11 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl if (s_editMode > 1) break; if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) { l_posHorz = 0; + AUDIO_KEY_PRESS(); } else if (READ_ONLY_UNLOCKED()) { s_editMode = (s_editMode<=0); + AUDIO_KEY_PRESS(); } break; @@ -437,11 +424,13 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl case EVT_KEY_BREAK(KEY_EXIT): if (s_editMode > 0) { s_editMode = 0; + AUDIO_KEY_PRESS(); break; } if (l_posHorz >= 0 && (COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { l_posHorz = -1; + AUDIO_KEY_PRESS(); } else { uint8_t posVertInit = MENU_FIRST_LINE_EDIT; @@ -449,6 +438,7 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl menuVerticalOffset = 0; l_posVert = posVertInit; l_posHorz = POS_HORZ_INIT(l_posVert); + AUDIO_KEY_PRESS(); } else { popMenu(); @@ -457,6 +447,8 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl break; case EVT_KEY_FIRST(KEY_RIGHT): + AUDIO_KEY_PRESS(); + // no break case EVT_KEY_REPT(KEY_RIGHT): if (s_editMode != 0) break; if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { @@ -485,6 +477,8 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl break; case EVT_KEY_FIRST(KEY_LEFT): + AUDIO_KEY_PRESS(); + // no break case EVT_KEY_REPT(KEY_LEFT): if (s_editMode != 0) break; if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { diff --git a/radio/src/gui/taranis/view_main.cpp b/radio/src/gui/taranis/view_main.cpp index d7cbd0a8a..796365417 100644 --- a/radio/src/gui/taranis/view_main.cpp +++ b/radio/src/gui/taranis/view_main.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -19,7 +19,6 @@ */ #include "opentx.h" -#include "timers.h" #define BIGSIZE MIDSIZE #define LBOX_CENTERX (BOX_WIDTH/2 + 16) @@ -460,7 +459,7 @@ void menuMainView(uint8_t event) POPUP_MENU_ADD_ITEM(STR_RESET_SUBMENU); POPUP_MENU_ADD_ITEM(STR_STATISTICS); POPUP_MENU_ADD_ITEM(STR_ABOUT_US); - popupMenuHandler = onMainViewMenu; + POPUP_MENU_START(onMainViewMenu); break; #if MENUS_LOCK != 2/*no menus*/ @@ -481,12 +480,14 @@ void menuMainView(uint8_t event) g_eeGeneral.view = 0; chainMenu(menuMainViewChannelsMonitor); } + AUDIO_KEY_PRESS(); break; case EVT_KEY_LONG(KEY_PAGE): if (!IS_FAI_ENABLED()) chainMenu(menuTelemetryFrsky); killEvents(event); + AUDIO_KEY_PRESS(); break; case EVT_KEY_FIRST(KEY_EXIT): @@ -495,7 +496,6 @@ void menuMainView(uint8_t event) gvarDisplayTimer = 0; } #endif - AUDIO_KEYPAD_UP(); break; } diff --git a/radio/src/gui/taranis/view_statistics.cpp b/radio/src/gui/taranis/view_statistics.cpp index 5b0969905..f9d42a892 100644 --- a/radio/src/gui/taranis/view_statistics.cpp +++ b/radio/src/gui/taranis/view_statistics.cpp @@ -18,8 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" -#include "../../timers.h" +#include "opentx.h" #define STATS_1ST_COLUMN FW/2 #define STATS_2ND_COLUMN 12*FW+FW/2 @@ -118,7 +117,6 @@ void menuStatisticsDebug(uint8_t event) storageDirty(EE_GENERAL); sessionTimer = 0; killEvents(event); - AUDIO_KEYPAD_UP(); break; case EVT_KEY_FIRST(KEY_ENTER): #if defined(LUA) @@ -126,7 +124,6 @@ void menuStatisticsDebug(uint8_t event) maxLuaDuration = 0; #endif maxMixerDuration = 0; - AUDIO_KEYPAD_UP(); break; #if defined(DEBUG_TRACE_BUFFER) diff --git a/radio/src/gui/taranis/view_telemetry.cpp b/radio/src/gui/taranis/view_telemetry.cpp index 97b51f65c..bf36080e6 100644 --- a/radio/src/gui/taranis/view_telemetry.cpp +++ b/radio/src/gui/taranis/view_telemetry.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" #define STATUS_BAR_Y (7*FH+1) #define TELEM_2ND_COLUMN (11*FW) @@ -135,7 +135,7 @@ bool displayNumbersTelemetryScreen(FrSkyScreenData & screen) else { putsMixerSource(pos[j], 1+FH+2*FH*i, field, 0); } - + if (field >= MIXSRC_FIRST_TELEM) { TelemetryItem & telemetryItem = telemetryItems[(field-MIXSRC_FIRST_TELEM)/3]; // TODO macro to convert a source to a telemetry index if (!telemetryItem.isAvailable()) { @@ -237,7 +237,7 @@ void menuTelemetryFrsky(uint8_t event) killEvents(event); POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - popupMenuHandler = onMainViewMenu; + POPUP_MENU_START(onMainViewMenu); break; } diff --git a/radio/src/haptic.cpp b/radio/src/haptic.cpp index a30bc2b0e..7b611767d 100644 --- a/radio/src/haptic.cpp +++ b/radio/src/haptic.cpp @@ -94,15 +94,11 @@ void hapticQueue::play(uint8_t tLen, uint8_t tPause, uint8_t tFlags) void hapticQueue::event(uint8_t e) { - if (g_eeGeneral.hapticMode>0 || (g_eeGeneral.hapticMode==0 && e>=AU_WARNING1) || (g_eeGeneral.hapticMode>=-1 && e<=AU_ERROR)) { + if (g_eeGeneral.hapticMode >= e_mode_nokeys || (g_eeGeneral.hapticMode >= e_mode_alarms && e <= AU_ERROR)) { if (e <= AU_ERROR) play(15, 3, PLAY_NOW); - else if (e <= AU_TRIM_MOVE) - play(5, 0, PLAY_NOW); - else if (e <= AU_TIMER_LT10) + else if (e <= AU_MIX_WARNING_3) play(15, 3, PLAY_NOW); - else if (e < AU_SPECIAL_SOUND_FIRST) - play(15, 3, (e-AU_TIMER_20+1)|PLAY_NOW); else if (e >= AU_SPECIAL_SOUND_LAST && empty()) { play(30, 10, 0); play(10, 50-10*(e-AU_SPECIAL_SOUND_LAST), (e-AU_SPECIAL_SOUND_LAST)); diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 60faa5329..badf5ce1d 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -359,7 +359,6 @@ void guiMain(evt_t evt) TRACE("menuEvent 0x%02x", menuEvent); } menuEvent = 0; - AUDIO_MENUS(); } if (warningText) { diff --git a/radio/src/main_avr.cpp b/radio/src/main_avr.cpp index 82381fa90..5b3e33a53 100644 --- a/radio/src/main_avr.cpp +++ b/radio/src/main_avr.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -59,18 +59,18 @@ void perMain() t0=getTmr16KHz(); delta= (nextMixerEndTime - lastMixerDuration) - t0; } while ((delta>0) && (delta 0 ? 5 : 10 - g_model.timers[x].countdownStart * 10) +#else +#define TIMER_COUNTDOWN_START(x) 10 #endif enum Protocols { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index ec9978f96..e37d0d0b2 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -19,7 +19,6 @@ */ #include "opentx.h" -#include "timers.h" RadioData g_eeGeneral; ModelData g_model; @@ -1014,17 +1013,15 @@ void doSplash() #endif if (SPLASH_NEEDED()) { -#if !defined(PCBTARANIS) && !defined(PCBHORUS) drawSplash(); -#endif #if !defined(CPUARM) - AUDIO_TADA(); + AUDIO_HELLO(); #endif #if defined(PCBSTD) lcdSetContrast(); -#elif !defined(PCBHORUS) && !defined(PCBTARANIS) +#elif defined(PCBSKY9X) tmr10ms_t curTime = get_tmr10ms() + 10; uint8_t contrast = 10; lcdSetRefVolt(contrast); @@ -1074,7 +1071,7 @@ void doSplash() } #endif -#if !defined(PCBHORUS) && !defined(PCBTARANIS) && !defined(PCBSTD) +#if defined(PCBSKY9X) if (curTime < get_tmr10ms()) { curTime += 10; if (contrast < g_eeGeneral.contrast) { @@ -1372,16 +1369,22 @@ uint8_t checkTrim(uint8_t event) int8_t v = (trimInc==-1) ? min(32, abs(before)/4+1) : (1 << trimInc); // TODO flash saving if (trimInc < 0) if (thro) v = 4; // if throttle trim and trim trottle then step=4 int16_t after = (k&1) ? before + v : before - v; // positive = k&1 -#if defined(CPUARM) - uint8_t beepTrim = 0; -#else bool beepTrim = false; -#endif - for (int16_t mark=TRIM_MIN; mark<=TRIM_MAX; mark+=TRIM_MAX) { - if ((mark!=0 || !thro) && ((mark!=TRIM_MIN && after>=mark && beforemark))) { - after = mark; - beepTrim = (mark == 0 ? 1 : 2); - } + + if (!thro && after==0 && before!=0) { + beepTrim = true; + AUDIO_TRIM_MIDDLE(); + pauseEvents(event); + } + else if (before>TRIM_MIN && after<=TRIM_MIN) { + beepTrim = true; + AUDIO_TRIM_MIN(); + killEvents(event); + } + else if (before=TRIM_MAX) { + beepTrim = true; + AUDIO_TRIM_MAX(); + killEvents(event); } if ((beforeTRIM_MAX) || (before>after && after TRIM_MAX) - after = TRIM_MAX; - if (after < TRIM_MIN) - after = TRIM_MIN; -#if defined(CPUARM) - after <<= 3; - after += 120*16; -#else - after >>= 2; - after += 60; -#endif -#endif + if (!beepTrim) { + AUDIO_TRIM_PRESS(after); + } - if (beepTrim) { - if (beepTrim == 1) { - AUDIO_TRIM_MIDDLE(after); - pauseEvents(event); - } - else { - AUDIO_TRIM_END(after); - killEvents(event); - } - } - else { - AUDIO_TRIM(event, after); - } #if !defined(CPUARM) return 0; #endif @@ -1632,9 +1610,9 @@ uint8_t trimsDisplayTimer = 0; uint8_t trimsDisplayMask = 0; #endif -void flightReset() +void flightReset(uint8_t check) { - // we don't reset the whole audio here (the tada.wav would be cut, if a prompt is queued before FlightReset, it should be played) + // we don't reset the whole audio here (the hello.wav would be cut, if a prompt is queued before FlightReset, it should be played) // TODO check if the vario / background music are stopped correctly if switching to a model which doesn't have these functions enabled if (!IS_MANUAL_RESET_TIMER(0)) { @@ -1662,6 +1640,12 @@ void flightReset() START_SILENCE_PERIOD(); RESET_THR_TRACE(); + + logicalSwitchesReset(); + + if (check) { + checkAll(); + } } #if defined(THRTRACE) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 7a5a4d0b1..f36fb2667 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -897,7 +897,7 @@ extern uint8_t trimsDisplayTimer; extern uint8_t trimsDisplayMask; #endif -void flightReset(); +void flightReset(uint8_t check=true); extern uint8_t unexpectedShutdown; @@ -1326,100 +1326,89 @@ uint16_t crc16(const uint8_t * ptr, uint32_t len); #define PLAY_INCREMENT(x) ((uint8_t)(((uint8_t)x) << 6)) /* -1, 0, 1, 2 */ enum AUDIO_SOUNDS { - AU_TADA, + AUDIO_HELLO, #if defined(CPUARM) - AU_BYE, + AU_BYE, #endif #if defined(VOICE) - AU_THROTTLE_ALERT, - AU_SWITCH_ALERT, - AU_BAD_RADIODATA, + AU_THROTTLE_ALERT, + AU_SWITCH_ALERT, + AU_BAD_RADIODATA, #endif - AU_TX_BATTERY_LOW, - AU_INACTIVITY, + AU_TX_BATTERY_LOW, + AU_INACTIVITY, #if defined(CPUARM) - AU_A1_ORANGE, - AU_A1_RED, - AU_A2_ORANGE, - AU_A2_RED, - AU_A3_ORANGE, - AU_A3_RED, - AU_A4_ORANGE, - AU_A4_RED, - AU_RSSI_ORANGE, - AU_RSSI_RED, - AU_SWR_RED, - AU_TELEMETRY_LOST, - AU_TELEMETRY_BACK, - AU_TRAINER_LOST, - AU_TRAINER_BACK, - AU_SENSOR_LOST, - AU_SERVO_KO, + AU_RSSI_ORANGE, + AU_RSSI_RED, + AU_SWR_RED, + AU_TELEMETRY_LOST, + AU_TELEMETRY_BACK, + AU_TRAINER_LOST, + AU_TRAINER_BACK, + AU_SENSOR_LOST, + AU_SERVO_KO, + AU_RX_OVERLOAD, #endif #if defined(PCBSKY9X) - AU_TX_MAH_HIGH, - AU_TX_TEMP_HIGH, + AU_TX_MAH_HIGH, + AU_TX_TEMP_HIGH, #endif - AU_ERROR, - AU_KEYPAD_UP, - AU_KEYPAD_DOWN, - AU_MENUS, - AU_TRIM_MOVE, - AU_WARNING1, - AU_WARNING2, - AU_WARNING3, - AU_TRIM_MIDDLE, + AU_ERROR, + AU_WARNING1, + AU_WARNING2, + AU_WARNING3, + AU_TRIM_MIDDLE, #if defined(CPUARM) - AU_TRIM_END, + AU_TRIM_MIN, + AU_TRIM_MAX, +#endif +#if defined(CPUARM) + AU_STICK1_MIDDLE, + AU_STICK2_MIDDLE, + AU_STICK3_MIDDLE, + AU_STICK4_MIDDLE, #endif #if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) - AU_STICK1_MIDDLE, - AU_STICK2_MIDDLE, - AU_STICK3_MIDDLE, - AU_STICK4_MIDDLE, - AU_POT1_MIDDLE, - AU_POT2_MIDDLE, - AU_SLIDER1_MIDDLE, - AU_SLIDER2_MIDDLE, + AU_POT1_MIDDLE, + AU_POT2_MIDDLE, + AU_SLIDER1_MIDDLE, + AU_SLIDER2_MIDDLE, #elif defined(CPUARM) - AU_STICK1_MIDDLE, - AU_STICK2_MIDDLE, - AU_STICK3_MIDDLE, - AU_STICK4_MIDDLE, - AU_POT1_MIDDLE, - AU_POT2_MIDDLE, - AU_POT3_MIDDLE, + AU_POT1_MIDDLE, + AU_POT2_MIDDLE, + AU_POT3_MIDDLE, #else - AU_POT_MIDDLE, + AU_POT_MIDDLE, +#endif + AU_MIX_WARNING_1, + AU_MIX_WARNING_2, + AU_MIX_WARNING_3, +#if defined(CPUARM) + AU_TIMER1_ELAPSED, + AU_TIMER2_ELAPSED, + AU_TIMER3_ELAPSED, #endif - AU_MIX_WARNING_1, - AU_MIX_WARNING_2, - AU_MIX_WARNING_3, - AU_TIMER_00, - AU_TIMER_LT10, - AU_TIMER_20, - AU_TIMER_30, - AU_SPECIAL_SOUND_FIRST, - AU_SPECIAL_SOUND_BEEP1 = AU_SPECIAL_SOUND_FIRST, - AU_SPECIAL_SOUND_BEEP2, - AU_SPECIAL_SOUND_BEEP3, - AU_SPECIAL_SOUND_WARN1, - AU_SPECIAL_SOUND_WARN2, - AU_SPECIAL_SOUND_CHEEP, - AU_SPECIAL_SOUND_RATATA, - AU_SPECIAL_SOUND_TICK, - AU_SPECIAL_SOUND_SIREN, - AU_SPECIAL_SOUND_RING, - AU_SPECIAL_SOUND_SCIFI, - AU_SPECIAL_SOUND_ROBOT, - AU_SPECIAL_SOUND_CHIRP, - AU_SPECIAL_SOUND_TADA, - AU_SPECIAL_SOUND_CRICKET, - AU_SPECIAL_SOUND_ALARMC, - AU_SPECIAL_SOUND_LAST, + AU_SPECIAL_SOUND_FIRST, + AU_SPECIAL_SOUND_BEEP1 = AU_SPECIAL_SOUND_FIRST, + AU_SPECIAL_SOUND_BEEP2, + AU_SPECIAL_SOUND_BEEP3, + AU_SPECIAL_SOUND_WARN1, + AU_SPECIAL_SOUND_WARN2, + AU_SPECIAL_SOUND_CHEEP, + AU_SPECIAL_SOUND_RATATA, + AU_SPECIAL_SOUND_TICK, + AU_SPECIAL_SOUND_SIREN, + AU_SPECIAL_SOUND_RING, + AU_SPECIAL_SOUND_SCIFI, + AU_SPECIAL_SOUND_ROBOT, + AU_SPECIAL_SOUND_CHIRP, + AU_SPECIAL_SOUND_TADA, + AU_SPECIAL_SOUND_CRICKET, + AU_SPECIAL_SOUND_ALARMC, + AU_SPECIAL_SOUND_LAST, - AU_NONE=0xff + AU_NONE=0xff }; #if defined(AUDIO) diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 56a8f8e33..103737df7 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:26:09 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Sat May 7 11:05:00 2016. Do not edit this file! @@ -121,7 +121,7 @@ void copyTimerData(A * dest, B * src) dest->countdownBeep = src->countdownBeep; dest->minuteBeep = src->minuteBeep; dest->persistent = src->persistent; - dest->spare = src->spare; + dest->countdownStart = src->countdownStart; } template @@ -192,6 +192,7 @@ void copyModuleData(A * dest, B * src) dest->channelsStart = src->channelsStart; dest->channelsCount = src->channelsCount; dest->failsafeMode = src->failsafeMode; + dest->subType = src->subType; dest->invertedSerial = src->invertedSerial; memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels)); copyModuleData_ppm(&dest->ppm, &src->ppm); @@ -344,3 +345,4 @@ void copyModuleData_ppm(A * dest, B * src) dest->outputType = src->outputType; dest->frameLength = src->frameLength; } + diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 7f2e3eeb5..ac5aa8564 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -59,8 +59,7 @@ void preModelLoad() void postModelLoad(bool newModel) { AUDIO_FLUSH(); - flightReset(); - logicalSwitchesReset(); + flightReset(false); if (pulsesStarted()) { #if defined(GUI) diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 219c0b909..82951edbe 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../opentx.h" +#include "opentx.h" uint32_t readKeys() { diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 342a63741..df5bea099 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -75,8 +75,8 @@ const FrSkySportSensor sportSensors[] = { { RBOX_BATT2_FIRST_ID, RBOX_BATT2_LAST_ID, 1, ZSTR_BATT2_CURRENT, UNIT_AMPS, 2 }, { RBOX_CNSP_FIRST_ID, RBOX_CNSP_LAST_ID, 0, ZSTR_BATT1_CONSUMPTION, UNIT_MAH, 0 }, { RBOX_CNSP_FIRST_ID, RBOX_CNSP_LAST_ID, 1, ZSTR_BATT2_CONSUMPTION, UNIT_MAH, 0 }, - { RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 0, ZSTR_CHANS_STATE, UNIT_RAW, 0 }, - { RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 1, ZSTR_RB_STATE, UNIT_RAW, 0 }, + { RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 0, ZSTR_CHANS_STATE, UNIT_BITFIELD, 0 }, + { RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 1, ZSTR_RB_STATE, UNIT_BITFIELD, 0 }, { 0, 0, 0, NULL, UNIT_RAW, 0 } // sentinel }; @@ -299,11 +299,15 @@ void processSportPacket(uint8_t * packet) } else if (id >= RBOX_STATE_FIRST_ID && id <= RBOX_STATE_LAST_ID) { uint16_t newServosState = data & 0xffff; - if (servosState == 0 && newServosState != 0) { + if (newServosState != 0 && servosState == 0) { audioEvent(AU_SERVO_KO); } + uint16_t newRboxState = data >> 16; + if ((newRboxState & 0x07) && (rboxState & 0x07) == 0) { + audioEvent(AU_RX_OVERLOAD); + } servosState = newServosState; - rboxState = data >> 16; + rboxState = newRboxState; processSportPacket(id, 0, instance, servosState); processSportPacket(id, 1, instance, rboxState); } diff --git a/radio/src/tests/timers.cpp b/radio/src/tests/timers.cpp index 1b2e89186..b992696e5 100644 --- a/radio/src/tests/timers.cpp +++ b/radio/src/tests/timers.cpp @@ -49,15 +49,10 @@ void timerSet(int idx, int16_t val) void initModelTimer(uint32_t idx, uint8_t mode, int16_t start = 0) { + memset(g_model.timers[0], 0, sizeof(g_model.timers[0])); g_model.timers[0].mode = mode; g_model.timers[0].start = start; g_model.timers[0].countdownBeep = COUNTDOWN_SILENT; - g_model.timers[0].minuteBeep = 0; - g_model.timers[0].spare = 0; -#if defined(CPUARM) || defined(CPUM2560) - g_model.timers[0].persistent = 0; - g_model.timers[0].value = 0; -#endif } /* diff --git a/radio/src/timers.cpp b/radio/src/timers.cpp index d70a84862..92fbc9dfa 100644 --- a/radio/src/timers.cpp +++ b/radio/src/timers.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -153,7 +153,7 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) switch (timerState->state) { case TMR_RUNNING: if (timerStart && newTimerVal>=(tmrval_t)timerStart) { - AUDIO_TIMER_00(g_model.timers[i].countdownBeep); + AUDIO_TIMER_ELAPSED(i); timerState->state = TMR_NEGATIVE; // TRACE("Timer[%d] negative", i); } @@ -172,18 +172,7 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) timerState->val = newTimerVal; if (timerState->state == TMR_RUNNING) { if (g_model.timers[i].countdownBeep && g_model.timers[i].start) { - if (newTimerVal == 30) { - AUDIO_TIMER_30(); - // TRACE("Timer[%d] 30s announcement", i); - } - if (newTimerVal == 20) { - AUDIO_TIMER_20(); - // TRACE("Timer[%d] 20s announcement", i); - } - if (newTimerVal <= 10) { - AUDIO_TIMER_LT10(g_model.timers[i].countdownBeep, newTimerVal); - // TRACE("Timer[%d] %ds announcement", i, newTimerVal); - } + AUDIO_TIMER_COUNTDOWN(i, newTimerVal); } if (g_model.timers[i].minuteBeep && (newTimerVal % 60)==0) { AUDIO_TIMER_MINUTE(newTimerVal); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 083c033ac..bff5acc44 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -599,16 +599,18 @@ const pm_char STR_MODEL_SELECT[] PROGMEM = TR_MODEL_SELECT; const pm_char STR_ONLYPOSITIVE[] PROGMEM = TR_ONLYPOSITIVE; const pm_char STR_FILTER[] PROGMEM = TR_FILTER; const pm_char STR_TELEMETRYFULL[] PROGMEM = TR_TELEMETRYFULL; + const pm_char STR_SERVOS_OK[] PROGMEM = TR_SERVOS_OK; + const pm_char STR_SERVOS_KO[] PROGMEM = TR_SERVOS_KO; const pm_char STR_INVERTED_SERIAL[] PROGMEM = TR_INVERTED_SERIAL; const pm_char STR_IGNORE_INSTANCE[] PROGMEM = TR_IGNORE_INSTANCE; const pm_char STR_DISCOVER_SENSORS[] PROGMEM = TR_DISCOVER_SENSORS; const pm_char STR_STOP_DISCOVER_SENSORS[] PROGMEM = TR_STOP_DISCOVER_SENSORS; const pm_char STR_DELETE_ALL_SENSORS[] PROGMEM = TR_DELETE_ALL_SENSORS; const pm_char STR_CONFIRMDELETE[] PROGMEM = TR_CONFIRMDELETE; -const pm_char STR_SELECT_WIDGET[] PROGMEM = TR_SELECT_WIDGET; -const pm_char STR_REMOVE_WIDGET[] PROGMEM = TR_REMOVE_WIDGET; -const pm_char STR_WIDGET_SETTINGS[] PROGMEM = TR_WIDGET_SETTINGS; -const pm_char STR_REMOVE_SCREEN[] PROGMEM = TR_REMOVE_SCREEN; + const pm_char STR_SELECT_WIDGET[] PROGMEM = TR_SELECT_WIDGET; + const pm_char STR_REMOVE_WIDGET[] PROGMEM = TR_REMOVE_WIDGET; + const pm_char STR_WIDGET_SETTINGS[] PROGMEM = TR_WIDGET_SETTINGS; + const pm_char STR_REMOVE_SCREEN[] PROGMEM = TR_REMOVE_SCREEN; #endif #if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) diff --git a/radio/src/translations.h b/radio/src/translations.h index 7a7dc0cae..73d41e6bf 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -861,6 +861,8 @@ extern const pm_char STR_BLCOLOR[]; extern const pm_char STR_ONLYPOSITIVE[]; extern const pm_char STR_FILTER[]; extern const pm_char STR_TELEMETRYFULL[]; + extern const pm_char STR_SERVOS_OK[]; + extern const pm_char STR_SERVOS_KO[]; extern const pm_char STR_INVERTED_SERIAL[]; extern const pm_char STR_IGNORE_INSTANCE[]; extern const pm_char STR_DISCOVER_SENSORS[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e8daa0efe..028035967 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1163,6 +1163,8 @@ #define TR_ONLYPOSITIVE "Jen kladné" #define TR_FILTER "Filtr" #define TR_TELEMETRYFULL "Všechny sloty jsou plné!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" //TODO: translation #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE INDENT "Ignoruj chyby ID" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 8fbdc73c7..bd191a3e6 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1167,6 +1167,8 @@ #define TR_ONLYPOSITIVE "Nur Positiv" #define TR_FILTER "Filter aktiv" #define TR_TELEMETRYFULL "Telemetriezeilen voll!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invert." #define TR_IGNORE_INSTANCE TR(INDENT "Keine ID", INDENT "Keine Multisen-ID") //unklar #define TR_DISCOVER_SENSORS INDENT "Start Sensorsuche" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 4e3a7e529..bb6cf6f5e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1181,6 +1181,8 @@ #define TR_ONLYPOSITIVE "Positive" #define TR_FILTER "Filter" #define TR_TELEMETRYFULL "All telemetry slots full!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE TR(INDENT "No inst.", INDENT "Ignore instances") #define TR_DISCOVER_SENSORS INDENT "Discover new sensors" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7e16fcfb0..dc989413b 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1127,6 +1127,8 @@ #define TR_ONLYPOSITIVE "Positive" #define TR_FILTER "Filter" #define TR_TELEMETRYFULL "All telemetry slots full!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE INDENT "Ignore instance" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index d2076c619..04472f74b 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1127,6 +1127,8 @@ #define TR_ONLYPOSITIVE "Positive" #define TR_FILTER "Filter" #define TR_TELEMETRYFULL "All telemetry slots full!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE INDENT "Ignore instance" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 030748da3..8b43aee19 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1154,6 +1154,8 @@ #define TR_ONLYPOSITIVE "Positive" #define TR_FILTER "Filtrage" #define TR_TELEMETRYFULL "Plus de capteurs libres!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Inverti" #define TR_IGNORE_INSTANCE TR(INDENT "Ign. inst.", INDENT "Ignorer instance") #define TR_DISCOVER_SENSORS INDENT "Découvrir capteurs" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 251a95e28..0651fd18e 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1162,6 +1162,8 @@ #define TR_ONLYPOSITIVE "Positivo" #define TR_FILTER "Filtro" #define TR_TELEMETRYFULL "Tutti gli slot sono pieni!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" //TODO: translation #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE TR(INDENT "No inst.","Ignora instanza") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 2cc2b1e12..e05fa28d6 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1176,6 +1176,8 @@ #define TR_ONLYPOSITIVE "Geen Negatief" #define TR_FILTER "Filter aktief" #define TR_TELEMETRYFULL "Telemetrie slots vol!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" //TODO: translation #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE TR(INDENT "Neg. ID ","Negeer ID's") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 9bb464261..a23dd4ffb 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1164,6 +1164,8 @@ #define TR_ONLYPOSITIVE "Dodatni" #define TR_FILTER "Filtr" #define TR_TELEMETRYFULL "Wszyskie miejsca zajęte!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" //TODO: translation #define TR_INVERTED SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE INDENT "Ignoruj przypadek" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index e6bbf16bf..53b9cc56d 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1123,6 +1123,8 @@ #define TR_ONLYPOSITIVE "Positive" #define TR_FILTER "Filter" #define TR_TELEMETRYFULL "All telemetry slots full!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE INDENT "Ignore instance" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 5f2767d2d..e090460ab 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1178,6 +1178,8 @@ #define TR_ONLYPOSITIVE "Positiv" #define TR_FILTER "Filter" #define TR_TELEMETRYFULL "Alla telemetriplatser upptagna!" +#define TR_SERVOS_OK "Servos OK" +#define TR_SERVOS_KO "Servos KO" //TODO: translation #define TR_INVERTED_SERIAL INDENT "Invert" #define TR_IGNORE_INSTANCE TR(INDENT "Inst.fel", INDENT "Hantera Instansfel") diff --git a/radio/src/translations/tts_fr.cpp b/radio/src/translations/tts_fr.cpp index f36e04b57..17ff28ce5 100644 --- a/radio/src/translations/tts_fr.cpp +++ b/radio/src/translations/tts_fr.cpp @@ -20,7 +20,7 @@ * */ -#include "../opentx.h" +#include "opentx.h" enum FrenchPrompts { FR_PROMPT_NUMBERS_BASE = 0, diff --git a/radio/util/tts_en.py b/radio/util/tts_en.py index ff0dd17be..a8f598566 100755 --- a/radio/util/tts_en.py +++ b/radio/util/tts_en.py @@ -47,6 +47,9 @@ for i, s in enumerate(["point zero", "point one", "point two", "point three", systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 165 + i))) for s, f, a in [(u"trim center", "midtrim", 495), (u"maximum trim reached", "endtrim", NO_ALTERNATE), + (u"timer 1 elapsed", "timovr1", NO_ALTERNATE), + (u"timer 2 elapsed", "timovr2", NO_ALTERNATE), + (u"timer 3 elapsed", "timovr3", NO_ALTERNATE), (u"transmitter battery low", "lowbatt", 485), (u"inactivity alarm", "inactiv", 486), (u"throttle warning", "thralert", 481), @@ -62,6 +65,7 @@ for s, f, a in [(u"trim center", "midtrim", 495), (u"trainer signal recovered", "trainok", NO_ALTERNATE), (u"sensor lost", "sensorko", NO_ALTERNATE), (u"servo overload", "servoko", NO_ALTERNATE), + (u"power overload", "rxko", NO_ALTERNATE), ]: systemSounds.append((s, filename(f, a))) for i, (s, f) in enumerate([(u"gear!, up!", "gearup"), diff --git a/radio/util/tts_fr.py b/radio/util/tts_fr.py index 46fed2cc0..49f4722f2 100755 --- a/radio/util/tts_fr.py +++ b/radio/util/tts_fr.py @@ -21,6 +21,9 @@ for i, s in enumerate(["virgule 0", "virgule 1", "virgule 2", "virgule 3", "virg systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 180 + i))) for s, f, a in [(u"Trim centré", "midtrim", 495), (u"Trim maximum atteint", "endtrim", NO_ALTERNATE), + (u"Chrono 1 à 0", "timovr1", NO_ALTERNATE), + (u"Chrono 2 à 0", "timovr2", NO_ALTERNATE), + (u"Chrono 3 à 0", "timovr3", NO_ALTERNATE), (u"Batterie radio faible !", "lowbatt", 485), (u"Radio inactive !", "inactiv", 486), (u"Alerte manche des gaz", "thralert", 481), @@ -36,6 +39,7 @@ for s, f, a in [(u"Trim centré", "midtrim", 495), (u"Signal écolage retrouvé", "trainok", NO_ALTERNATE), (u"Sonde de télémétrie perdue", "sensorko", NO_ALTERNATE), (u"Servo en surcharge", "servoko", NO_ALTERNATE), + (u"Surcharge réception", "rxko", NO_ALTERNATE), ]: systemSounds.append((s, filename(f, a))) for i, (s, f) in enumerate([(u"altitude", "altitude"),