1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 16:25:16 +03:00

[All] Code refactoring

- keys beep and haptic refactoring (not anymore audio events)
- trims move/mid/min/max refactoring (trim end splitted to trim min / trim max)
- S6R new alarms
- S6R servos/rx status displayed as a text (not an integer which has no sense)
- Timer countdown configuration
- The splash was not displayed (but the timeout was there) after the first calibration
This commit is contained in:
Bertrand Songis 2016-05-13 14:06:35 +02:00
parent 24abad55ca
commit 7908eaa406
82 changed files with 749 additions and 598 deletions

View file

@ -139,14 +139,6 @@ const char * const audioFilenames[] = {
"baddata", "baddata",
"lowbatt", "lowbatt",
"inactiv", "inactiv",
"a1_org",
"a1_red",
"a2_org",
"a2_red",
"a3_org",
"a3_red",
"a4_org",
"a4_red",
"rssi_org", "rssi_org",
"rssi_red", "rssi_red",
"swr_red", "swr_red",
@ -156,20 +148,18 @@ const char * const audioFilenames[] = {
"trainok", "trainok",
"sensorko", "sensorko",
"servoko", "servoko",
"rxko",
#if defined(PCBSKY9X) #if defined(PCBSKY9X)
"highmah", "highmah",
"hightemp", "hightemp",
#endif #endif
"error", "error",
"keyup", // TODO remove this one
"keydown", // TODO remove this one
"menus", // TODO remove this one
"trim", // TODO remove this one
"warning1", "warning1",
"warning2", "warning2",
"warning3", "warning3",
"midtrim", "midtrim",
"endtrim", "mintrim",
"maxtrim",
"midstck1", "midstck1",
"midstck2", "midstck2",
"midstck3", "midstck3",
@ -187,10 +177,9 @@ const char * const audioFilenames[] = {
"mixwarn1", "mixwarn1",
"mixwarn2", "mixwarn2",
"mixwarn3", "mixwarn3",
"timer00", "timovr1",
"timer10", "timovr2",
"timer20", "timovr3"
"timer30"
}; };
uint64_t sdAvailableSystemAudioFiles = 0; uint64_t sdAvailableSystemAudioFiles = 0;
@ -505,13 +494,13 @@ void audioTask(void * pdata)
setSampleRate(AUDIO_SAMPLE_RATE); setSampleRate(AUDIO_SAMPLE_RATE);
#if !defined(EEPROM) #if !defined(EEPROM)
AUDIO_TADA(); AUDIO_HELLO();
#elif defined(SDCARD) #elif defined(SDCARD)
if (!unexpectedShutdown) { if (!unexpectedShutdown) {
#if defined(EEPROM) #if defined(EEPROM)
sdInit(); sdInit();
#endif #endif
AUDIO_TADA(); AUDIO_HELLO();
} }
#endif #endif
@ -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) if (index == AU_NONE)
return; return;
#if defined(HAPTIC) #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 #endif
if (index <= AU_ERROR || (index >= AU_WARNING1 && index < AU_SPECIAL_SOUND_FIRST)) { if (index <= AU_ERROR) {
if (g_eeGeneral.alarmsFlash) { if (g_eeGeneral.alarmsFlash) {
flashCounter = FLASH_DURATION; flashCounter = FLASH_DURATION;
} }
} }
if (g_eeGeneral.beepMode > 0 || (g_eeGeneral.beepMode == 0 && index >= AU_TRIM_MOVE) || if (g_eeGeneral.beepMode >= e_mode_nokeys || (g_eeGeneral.beepMode >= e_mode_alarms && index <= AU_ERROR)) {
(g_eeGeneral.beepMode >= -1 && index <= AU_ERROR)) {
#if defined(SDCARD) #if defined(SDCARD)
char filename[AUDIO_FILENAME_MAXLEN + 1]; char filename[AUDIO_FILENAME_MAXLEN + 1];
if (index < AU_SPECIAL_SOUND_FIRST && isAudioFileReferenced(index, filename)) { if (index < AU_SPECIAL_SOUND_FIRST && isAudioFileReferenced(index, filename)) {
@ -1038,23 +1108,14 @@ void audioEvent(unsigned int index, unsigned int freq)
case AU_ERROR: case AU_ERROR:
audioQueue.playTone(BEEP_DEFAULT_FREQ, 200, 20, PLAY_NOW); audioQueue.playTone(BEEP_DEFAULT_FREQ, 200, 20, PLAY_NOW);
break; 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: case AU_TRIM_MIDDLE:
audioQueue.playTone(freq, 80, 20, PLAY_NOW); audioQueue.playTone(120*16, 80, 20, PLAY_NOW);
break; break;
case AU_TRIM_END: case AU_TRIM_MIN:
audioQueue.playTone(freq, 80, 20, PLAY_NOW); 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; break;
case AU_WARNING1: case AU_WARNING1:
audioQueue.playTone(BEEP_DEFAULT_FREQ, 80, 20, PLAY_NOW); 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: case AU_MIX_WARNING_3:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 1680, 48, 32, PLAY_REPEAT(2)); audioQueue.playTone(BEEP_DEFAULT_FREQ + 1680, 48, 32, PLAY_REPEAT(2));
break; 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); audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 300, 20, PLAY_NOW);
break; 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: case AU_RSSI_ORANGE:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 1500, 800, 20, PLAY_NOW); audioQueue.playTone(BEEP_DEFAULT_FREQ + 1500, 800, 20, PLAY_NOW);
break; break;

View file

@ -284,7 +284,7 @@ enum {
}; };
void codecsInit(); 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 audioPlay(unsigned int index, uint8_t id=0);
void audioStart(); void audioStart();
@ -304,11 +304,16 @@ void audioStart();
#define AUDIO_TIMER_MINUTE(t) audioDefevent(AU_WARNING1) #define AUDIO_TIMER_MINUTE(t) audioDefevent(AU_WARNING1)
#endif #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_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_WARNING1() AUDIO_BUZZER(audioEvent(AU_WARNING1), beep(3))
#define AUDIO_WARNING2() AUDIO_BUZZER(audioEvent(AU_WARNING2), beep(2)) #define AUDIO_WARNING2() AUDIO_BUZZER(audioEvent(AU_WARNING2), beep(2))
#define AUDIO_TX_BATTERY_LOW() AUDIO_BUZZER(audioEvent(AU_TX_BATTERY_LOW), beep(4)) #define AUDIO_TX_BATTERY_LOW() AUDIO_BUZZER(audioEvent(AU_TX_BATTERY_LOW), beep(4))
@ -317,33 +322,17 @@ void audioStart();
#define AUDIO_TX_TEMP_HIGH() audioEvent(AU_TX_TEMP_HIGH) #define AUDIO_TX_TEMP_HIGH() audioEvent(AU_TX_TEMP_HIGH)
#endif #endif
#define AUDIO_ERROR() AUDIO_BUZZER(audioEvent(AU_ERROR), beep(4)) #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_COUNTDOWN(idx, val) audioTimerCountdown(idx, val)
#define AUDIO_TIMER_20() AUDIO_BUZZER(audioEvent(AU_TIMER_20), { beepAgain=1; beep(2); }) #define AUDIO_TIMER_ELAPSED(idx) AUDIO_BUZZER(audioEvent(AU_TIMER1_ELAPSED+idx), beep(3))
#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_INACTIVITY() AUDIO_BUZZER(audioEvent(AU_INACTIVITY), 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_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_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_MIDDLE() AUDIO_BUZZER(audioEvent(AU_TRIM_MIDDLE), beep(2))
#define AUDIO_TRIM_END(f) AUDIO_BUZZER(audioEvent(AU_TRIM_END, f), beep(2)) #define AUDIO_TRIM_MIN() AUDIO_BUZZER(audioEvent(AU_TRIM_MIN), 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_MAX() AUDIO_BUZZER(audioEvent(AU_TRIM_MAX), beep(2))
#define AUDIO_TRIM_PRESS(val) audioTrimPress(val)
#define AUDIO_PLAY(p) audioEvent(p) #define AUDIO_PLAY(p) audioEvent(p)
#define AUDIO_VARIO(fq, t, p, f) audioQueue.playTone(fq, t, p, f) #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_ORANGE() audioEvent(AU_RSSI_ORANGE)
#define AUDIO_RSSI_RED() audioEvent(AU_RSSI_RED) #define AUDIO_RSSI_RED() audioEvent(AU_RSSI_RED)
#define AUDIO_SWR_RED() audioEvent(AU_SWR_RED) #define AUDIO_SWR_RED() audioEvent(AU_SWR_RED)

View file

@ -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) #if defined(HAPTIC)
haptic.event(e); //do this before audio to help sync timings 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()) { if (e < AU_SPECIAL_SOUND_FIRST || empty()) {
// TODO when VOICE enable some cases here are not needed! // TODO when VOICE enable some cases here are not needed!
switch (e) { switch (e) {
@ -168,12 +168,6 @@ void audioQueue::event(uint8_t e, uint8_t f)
} }
break; break;
#endif #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: case AU_SPECIAL_SOUND_RING:
play(BEEP_DEFAULT_FREQ+25, 5, 2, PLAY_REPEAT(10)); play(BEEP_DEFAULT_FREQ+25, 5, 2, PLAY_REPEAT(10));
play(BEEP_DEFAULT_FREQ+25, 5, 10, PLAY_REPEAT(1)); 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 = { static const pm_uint8_t singleSounds[] PROGMEM = {
70, 10, 2, PLAY_REPEAT(2)|PLAY_NOW, // INACTIVITY 70, 10, 2, PLAY_REPEAT(2)|PLAY_NOW, // INACTIVITY
BEEP_DEFAULT_FREQ, 40, 1, PLAY_NOW, // ERROR 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, 10, 1, PLAY_NOW, // WARNING1
BEEP_DEFAULT_FREQ, 20, 1, PLAY_NOW, // WARNING2 BEEP_DEFAULT_FREQ, 20, 1, PLAY_NOW, // WARNING2
BEEP_DEFAULT_FREQ, 30, 1, PLAY_NOW, // WARNING3 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, 10, 1, PLAY_NOW, // POT_STICK_MIDDLE
BEEP_DEFAULT_FREQ + 50, 6, 0, 0, // MIX_WARNING_1 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 + 52, 6, 3, PLAY_REPEAT(1), // MIX_WARNING_2
BEEP_DEFAULT_FREQ + 54, 6, 3, PLAY_REPEAT(2), // MIX_WARNING_3 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, 10, 1, 0, // FRSKY_BEEP1
BEEP_DEFAULT_FREQ, 20, 1, 0, // FRSKY_BEEP2 BEEP_DEFAULT_FREQ, 20, 1, 0, // FRSKY_BEEP2
BEEP_DEFAULT_FREQ, 30, 1, 0, // FRSKY_BEEP3 BEEP_DEFAULT_FREQ, 30, 1, 0, // FRSKY_BEEP3
@ -258,3 +244,85 @@ void audioDefevent(uint8_t e)
{ {
audio.event(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);
}
}
}

View file

@ -30,8 +30,6 @@
#define AUDIO_QUEUE_LENGTH (8) // 8 seems to suit most alerts #define AUDIO_QUEUE_LENGTH (8) // 8 seems to suit most alerts
#define BEEP_DEFAULT_FREQ (70) #define BEEP_DEFAULT_FREQ (70)
#define BEEP_OFFSET (10) #define BEEP_OFFSET (10)
#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+5)
#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-5)
class audioQueue class audioQueue
{ {
@ -44,7 +42,7 @@ class audioQueue
inline bool busy() { return (toneTimeLeft > 0); } 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() { inline void driver() {
if (toneFreq) { if (toneFreq) {
@ -109,29 +107,32 @@ void audioDefevent(uint8_t e);
#define VOICE_AUDIO_BUZZER(v, a, b) AUDIO_BUZZER(a, b) #define VOICE_AUDIO_BUZZER(v, a, b) AUDIO_BUZZER(a, b)
#endif #endif
#define AUDIO_KEYPAD_UP() AUDIO_BUZZER(audioDefevent(AU_KEYPAD_UP), beep(0)) #define AUDIO_KEY_PRESS() audioKeyPress()
#define AUDIO_KEYPAD_DOWN() AUDIO_BUZZER(audioDefevent(AU_KEYPAD_DOWN), beep(0)) #define AUDIO_KEY_ERROR() AUDIO_WARNING2()
#define AUDIO_MENUS() AUDIO_BUZZER(audioDefevent(AU_MENUS), beep(0))
#define AUDIO_WARNING1() AUDIO_BUZZER(audioDefevent(AU_WARNING1), beep(3)) #define AUDIO_WARNING1() AUDIO_BUZZER(audioDefevent(AU_WARNING1), beep(3))
#define AUDIO_WARNING2() AUDIO_BUZZER(audioDefevent(AU_WARNING2), beep(2)) #define AUDIO_WARNING2() AUDIO_BUZZER(audioDefevent(AU_WARNING2), beep(2))
#define AUDIO_ERROR() AUDIO_BUZZER(audioDefevent(AU_ERROR), beep(4)) #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_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_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_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_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_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_COUNTDOWN(idx, val) audioTimerCountdown(idx, val)
#define AUDIO_TIMER_20() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); }) #define AUDIO_TIMER_ELAPSED(idx) AUDIO_BUZZER(audioTimerCountdown(idx, 0), beep(3))
#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_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_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_POT_MIDDLE() AUDIO_BUZZER(audioDefevent(AU_POT_MIDDLE), beep(2))
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP) #define AUDIO_VARIO_UP() // audioDefevent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN) #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_MIDDLE() // AUDIO_BUZZER(audio.event(AU_TRIM_MIDDLE, f), beep(2))
#define AUDIO_TRIM_END(f) AUDIO_BUZZER(audioDefevent(f), beep(2)) #define AUDIO_TRIM_MIN() // 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_TRIM_MAX() // AUDIO_BUZZER(audioDefevent(f), beep(2))
#define AUDIO_TRIM_PRESS(val) audioTrimPress(val)
#define AUDIO_PLAY(p) audio.event(p) #define AUDIO_PLAY(p) audio.event(p)
#define AUDIO_VARIO(f, t) audio.play(f, t, 0, PLAY_BACKGROUND) #define AUDIO_VARIO(f, t) audio.play(f, t, 0, PLAY_BACKGROUND)

View file

@ -56,45 +56,47 @@ inline void beep(uint8_t) { }
#if defined(BUZZER) #if defined(BUZZER)
#if defined(VOICE) #if defined(VOICE)
#define AUDIO_TADA() PUSH_SYSTEM_PROMPT(AU_TADA) #define AUDIO_HELLO() PUSH_SYSTEM_PROMPT(AUDIO_HELLO)
#define AUDIO_BYE() #define AUDIO_BYE()
#define AUDIO_TX_BATTERY_LOW() PUSH_SYSTEM_PROMPT(AU_TX_BATTERY_LOW) #define AUDIO_TX_BATTERY_LOW() PUSH_SYSTEM_PROMPT(AU_TX_BATTERY_LOW)
#define AUDIO_INACTIVITY() PUSH_SYSTEM_PROMPT(AU_INACTIVITY) #define AUDIO_INACTIVITY() PUSH_SYSTEM_PROMPT(AU_INACTIVITY)
#define AUDIO_ERROR_MESSAGE(e) PUSH_SYSTEM_PROMPT((e)) #define AUDIO_ERROR_MESSAGE(e) PUSH_SYSTEM_PROMPT((e))
#define AUDIO_TIMER_MINUTE(t) playDuration(t) #define AUDIO_TIMER_MINUTE(t) playDuration(t)
// TODO
#define AUDIO_TIMER_30() PUSH_SYSTEM_PROMPT(AU_TIMER_30) #define AUDIO_TIMER_30() PUSH_SYSTEM_PROMPT(AU_TIMER_30)
#define AUDIO_TIMER_20() PUSH_SYSTEM_PROMPT(AU_TIMER_20) #define AUDIO_TIMER_20() PUSH_SYSTEM_PROMPT(AU_TIMER_20)
#else #else
#define AUDIO_TADA() #define AUDIO_HELLO()
#define AUDIO_BYE() #define AUDIO_BYE()
#define AUDIO_TX_BATTERY_LOW() beep(4) #define AUDIO_TX_BATTERY_LOW() beep(4)
#define AUDIO_INACTIVITY() beep(3) #define AUDIO_INACTIVITY() beep(3)
#define AUDIO_ERROR_MESSAGE(e) beep(4) #define AUDIO_ERROR_MESSAGE(e) beep(4)
#define AUDIO_TIMER_MINUTE(t) beep(2) #define AUDIO_TIMER_MINUTE(t) beep(2)
// TODO
#define AUDIO_TIMER_30() { beepAgain=2; beep(2); } #define AUDIO_TIMER_30() { beepAgain=2; beep(2); }
#define AUDIO_TIMER_20() { beepAgain=1; beep(2); } #define AUDIO_TIMER_20() { beepAgain=1; beep(2); }
#endif #endif
#define AUDIO_KEYPAD_UP() beep(0) #define AUDIO_KEY_PRESS() beep(0)
#define AUDIO_KEYPAD_DOWN() beep(0) #define AUDIO_KEY_ERROR() beep(2)
#define AUDIO_MENUS() beep(0)
#define AUDIO_WARNING2() beep(2) #define AUDIO_WARNING2() beep(2)
#define AUDIO_WARNING1() beep(3) #define AUDIO_WARNING1() beep(3)
#define AUDIO_ERROR() beep(4) #define AUDIO_ERROR() beep(4)
#define AUDIO_MIX_WARNING(x) beep(1) #define AUDIO_MIX_WARNING(x) beep(1)
#define AUDIO_POT_MIDDLE() beep(2) #define AUDIO_POT_MIDDLE() beep(2)
#define AUDIO_TIMER_LT10(m, x) beep(2) #define AUDIO_TIMER_COUNTDOWN(idx, val) beep(2)
#define AUDIO_TIMER_00(m) beep(3) #define AUDIO_TIMER_ELAPSED(idx) beep(3)
#define AUDIO_VARIO_UP() _beep(1) #define AUDIO_VARIO_UP() _beep(1)
#define AUDIO_VARIO_DOWN() _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_PRESS(f) { if (!IS_KEY_FIRST(event)) warble = true; beep(1); }
#define AUDIO_TRIM_MIDDLE(f) beep(2) #define AUDIO_TRIM_MIDDLE() beep(2)
#define AUDIO_TRIM_END(f) beep(2) #define AUDIO_TRIM_MIN() beep(2)
#define AUDIO_TRIM_MAX() beep(2)
#define AUDIO_PLAY(p) beep(3) #define AUDIO_PLAY(p) beep(3)
#define IS_AUDIO_BUSY() (g_beepCnt || beepAgain || beepOn) #define IS_AUDIO_BUSY() (g_beepCnt || beepAgain || beepOn)
#else /* BUZZER */ #else /* BUZZER */
#define AUDIO_TADA() #define AUDIO_HELLO()
#define AUDIO_BYE() #define AUDIO_BYE()
#define AUDIO_TX_BATTERY_LOW() #define AUDIO_TX_BATTERY_LOW()
#define AUDIO_INACTIVITY() #define AUDIO_INACTIVITY()

View file

@ -367,6 +367,7 @@ enum TelemetryUnit {
UNIT_CELLS = UNIT_FIRST_VIRTUAL, UNIT_CELLS = UNIT_FIRST_VIRTUAL,
UNIT_DATETIME, UNIT_DATETIME,
UNIT_GPS, UNIT_GPS,
UNIT_BITFIELD,
// Internal units (not stored in sensor unit) // Internal units (not stored in sensor unit)
UNIT_GPS_LONGITUDE, UNIT_GPS_LONGITUDE,
UNIT_GPS_LATITUDE, UNIT_GPS_LATITUDE,

View file

@ -441,7 +441,8 @@ PACK(struct TimerData {
uint32_t countdownBeep:2; uint32_t countdownBeep:2;
uint32_t minuteBeep:1; uint32_t minuteBeep:1;
uint32_t persistent:2; uint32_t persistent:2;
uint32_t spare:3; int32_t countdownStart:2;
uint32_t direction:1;
NOBACKUP(char name[LEN_TIMER_NAME]); NOBACKUP(char name[LEN_TIMER_NAME]);
}); });
#elif defined(CPUM2560) #elif defined(CPUM2560)

View file

@ -184,7 +184,7 @@ void menuGeneralSdManager(uint8_t _event)
// POPUP_MENU_ADD_ITEM(STR_COPY_FILE); TODO: Implement // POPUP_MENU_ADD_ITEM(STR_COPY_FILE); TODO: Implement
} }
} }
popupMenuHandler = onSdManagerMenu; POPUP_MENU_START(onSdManagerMenu);
break; break;
} }

View file

@ -230,7 +230,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2); 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)) { 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 { else {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);

View file

@ -812,7 +812,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event)
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_MOVE);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onExpoMixMenu; POPUP_MENU_START(onExpoMixMenu);
} }
#else #else
if (s_currCh) { if (s_currCh) {

View file

@ -240,7 +240,7 @@ void menuModelSelect(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL);
POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL);
} }
popupMenuHandler = onModelSelectMenu; POPUP_MENU_START(onModelSelectMenu);
#else #else
if (g_eeGeneral.currModel != sub) { if (g_eeGeneral.currModel != sub) {
selectModel(sub); selectModel(sub);

View file

@ -540,7 +540,7 @@ void menuModelTelemetry(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_EDIT);
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onSensorMenu; POPUP_MENU_START(onSensorMenu);
} }
else if (event == EVT_KEY_BREAK(KEY_ENTER)) { else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
pushMenu(menuModelSensor); pushMenu(menuModelSensor);

View file

@ -482,6 +482,7 @@ void displayWarning(uint8_t event);
#if defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64)) #if defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64))
#define NAVIGATION_MENUS #define NAVIGATION_MENUS
#define POPUP_MENU_ADD_ITEM(s) popupMenuItems[popupMenuNoItems++] = s #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 POPUP_MENU_MAX_LINES 6
#define MENU_MAX_DISPLAY_LINES POPUP_MENU_MAX_LINES #define MENU_MAX_DISPLAY_LINES POPUP_MENU_MAX_LINES
#if defined(SDCARD) #if defined(SDCARD)

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
vertpos_t menuVerticalOffset; vertpos_t menuVerticalOffset;
int8_t s_editMode; int8_t s_editMode;
@ -113,10 +113,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
if (newval > i_max) { if (newval > i_max) {
newval = val; newval = val;
killEvents(event); killEvents(event);
AUDIO_WARNING2(); AUDIO_KEY_ERROR();
}
else {
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)))) { 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)))) {
@ -132,10 +129,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
if (newval < i_min) { if (newval < i_min) {
newval = val; newval = val;
killEvents(event); killEvents(event);
AUDIO_WARNING2(); AUDIO_KEY_ERROR();
}
else {
AUDIO_KEYPAD_DOWN();
} }
} }
@ -175,20 +169,11 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
} }
#endif #endif
if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min);
killEvents(event);
AUDIO_WARNING2();
}
if (newval != val) { 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)) { 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 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)); storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1); 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)))) { 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++; 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)))) { 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--; newval--;
AUDIO_KEYPAD_DOWN();
} }
if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) { 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) { if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min); newval = (newval > i_max ? i_max : i_min);
killEvents(event); killEvents(event);
AUDIO_WARNING2(); AUDIO_KEY_ERROR();
} }
if (newval != val) { 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)) { 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 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(); if (!IS_KEY_REPT(event)) {
else AUDIO_KEY_PRESS();
AUDIO_KEYPAD_DOWN();
} }
storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1); checkIncDec_Ret = (newval > val ? 1 : -1);
@ -507,6 +489,7 @@ void check(check_event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, ui
break; break;
case EVT_KEY_BREAK(KEY_EXIT): case EVT_KEY_BREAK(KEY_EXIT):
AUDIO_KEY_PRESS();
#if defined(ROTARY_ENCODER_NAVIGATION) #if defined(ROTARY_ENCODER_NAVIGATION)
if (s_editMode == 0) if (s_editMode == 0)
s_editMode = EDIT_MODE_INIT; 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 popMenu(); // beeps itself
} }
else { else {
AUDIO_MENUS();
l_posVert = 0; l_posVert = 0;
l_posHorz = 0; l_posHorz = 0;
} }

View file

@ -18,8 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#include "../../timers.h"
#define BIGSIZE DBLSIZE #define BIGSIZE DBLSIZE
#define LBOX_CENTERX (LCD_W/4 + 10) #define LBOX_CENTERX (LCD_W/4 + 10)
@ -310,7 +309,7 @@ void menuMainView(uint8_t event)
g_eeGeneral.view ^= ALTERNATE_VIEW; g_eeGeneral.view ^= ALTERNATE_VIEW;
#endif #endif
storageDirty(EE_GENERAL); storageDirty(EE_GENERAL);
AUDIO_KEYPAD_UP(); AUDIO_KEY_PRESS();
} }
break; break;
@ -339,7 +338,7 @@ void menuMainView(uint8_t event)
#if defined(CPUARM) #if defined(CPUARM)
POPUP_MENU_ADD_ITEM(STR_ABOUT_US); POPUP_MENU_ADD_ITEM(STR_ABOUT_US);
#endif #endif
popupMenuHandler = onMainViewMenu; POPUP_MENU_START(onMainViewMenu);
break; break;
#endif #endif
@ -366,7 +365,6 @@ void menuMainView(uint8_t event)
case EVT_KEY_BREAK(KEY_DOWN): 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)); 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); storageDirty(EE_GENERAL);
AUDIO_KEYPAD_UP();
break; break;
case EVT_KEY_STATISTICS: case EVT_KEY_STATISTICS:
@ -404,13 +402,11 @@ void menuMainView(uint8_t event)
if (view == VIEW_TIMER2) { if (view == VIEW_TIMER2) {
timerReset(1); timerReset(1);
} }
AUDIO_KEYPAD_UP();
break; break;
#if !defined(NAVIGATION_MENUS) #if !defined(NAVIGATION_MENUS)
case EVT_KEY_LONG(KEY_EXIT): case EVT_KEY_LONG(KEY_EXIT):
flightReset(); flightReset();
AUDIO_KEYPAD_UP();
break; break;
#endif #endif
} }

View file

@ -18,8 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#include "../../timers.h"
void menuStatisticsView(uint8_t event) void menuStatisticsView(uint8_t event)
{ {
@ -98,7 +97,6 @@ void menuStatisticsDebug(uint8_t event)
#endif #endif
sessionTimer = 0; sessionTimer = 0;
killEvents(event); killEvents(event);
AUDIO_KEYPAD_UP();
break; break;
#endif #endif
case EVT_KEY_FIRST(KEY_ENTER): case EVT_KEY_FIRST(KEY_ENTER):
@ -107,7 +105,6 @@ void menuStatisticsDebug(uint8_t event)
g_tmr1Latency_max = 0; g_tmr1Latency_max = 0;
#endif #endif
maxMixerDuration = 0; maxMixerDuration = 0;
AUDIO_KEYPAD_UP();
break; break;
#if defined(DEBUG_TRACE_BUFFER) #if defined(DEBUG_TRACE_BUFFER)

View file

@ -186,7 +186,7 @@ bool menuGeneralSdManager(evt_t _event)
killEvents(_event); killEvents(_event);
POPUP_MENU_ADD_ITEM(STR_SD_INFO); POPUP_MENU_ADD_ITEM(STR_SD_INFO);
POPUP_MENU_ADD_ITEM(STR_SD_FORMAT); POPUP_MENU_ADD_ITEM(STR_SD_FORMAT);
popupMenuHandler = onSdManagerMenu; POPUP_MENU_START(onSdManagerMenu);
} }
break; break;
#endif #endif
@ -248,7 +248,7 @@ bool menuGeneralSdManager(evt_t _event)
if (IS_FILE(line)) if (IS_FILE(line))
POPUP_MENU_ADD_ITEM(STR_DELETE_FILE); POPUP_MENU_ADD_ITEM(STR_DELETE_FILE);
} }
popupMenuHandler = onSdManagerMenu; POPUP_MENU_START(onSdManagerMenu);
} }
break; break;
} }

View file

@ -202,7 +202,7 @@ bool menuModelCurveOne(evt_t event)
POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET); POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET);
POPUP_MENU_ADD_ITEM(STR_MIRROR); POPUP_MENU_ADD_ITEM(STR_MIRROR);
POPUP_MENU_ADD_ITEM(STR_CLEAR); POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onCurveOneMenu; POPUP_MENU_START(onCurveOneMenu);
} }
break; break;
// TODO? // TODO?

View file

@ -158,7 +158,7 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc
break; break;
} }
} }
popupMenuHandler = onCustomFunctionsMenu; POPUP_MENU_START(onCustomFunctionsMenu);
} }
for (int i=0; i<NUM_BODY_LINES; i++) { for (int i=0; i<NUM_BODY_LINES; i++) {
@ -285,7 +285,7 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2); 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)) { 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 { else {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); 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); POPUP_MENU_ADD_ITEM(STR_GLOBALVAR);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC) if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC)
POPUP_MENU_ADD_ITEM(STR_INCDEC); POPUP_MENU_ADD_ITEM(STR_INCDEC);
popupMenuHandler = onAdjustGvarSourceLongEnterPress; POPUP_MENU_START(onAdjustGvarSourceLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD; s_editMode = EDIT_MODIFY_FIELD;
} }
} }

View file

@ -72,7 +72,7 @@ bool menuModelCustomScriptOne(evt_t event)
if (attr && event==EVT_KEY_FIRST(KEY_ENTER) && !READ_ONLY()) { if (attr && event==EVT_KEY_FIRST(KEY_ENTER) && !READ_ONLY()) {
killEvents(KEY_ENTER); killEvents(KEY_ENTER);
if (sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) { if (sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) {
popupMenuHandler = onModelCustomScriptMenu; POPUP_MENU_START(onModelCustomScriptMenu);
} }
else { else {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);

View file

@ -103,7 +103,7 @@ bool menuModelGVars(evt_t event)
else else
POPUP_MENU_ADD_ITEM(STR_ENABLE_POPUP); POPUP_MENU_ADD_ITEM(STR_ENABLE_POPUP);
POPUP_MENU_ADD_ITEM(STR_CLEAR); POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onGVARSMenu; POPUP_MENU_START(onGVARSMenu);
} }
return true; return true;

View file

@ -445,7 +445,7 @@ bool menuModelExposAll(evt_t event)
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_MOVE);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onExposMenu; POPUP_MENU_START(onExposMenu);
} }
} }
} }

View file

@ -149,7 +149,7 @@ bool menuModelLimits(evt_t event)
POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_RESET);
POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS);
POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS);
popupMenuHandler = onLimitsMenu; POPUP_MENU_START(onLimitsMenu);
} }
for (uint8_t j=0; j<ITEM_LIMITS_COUNT; j++) { for (uint8_t j=0; j<ITEM_LIMITS_COUNT; j++) {

View file

@ -96,7 +96,7 @@ bool menuModelLogicalSwitches(evt_t event)
POPUP_MENU_ADD_ITEM(STR_PASTE); POPUP_MENU_ADD_ITEM(STR_PASTE);
if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw)
POPUP_MENU_ADD_ITEM(STR_CLEAR); POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onLogicalSwitchesMenu; POPUP_MENU_START(onLogicalSwitchesMenu);
} }
for (int i=0; i<NUM_BODY_LINES; ++i) { for (int i=0; i<NUM_BODY_LINES; ++i) {

View file

@ -416,7 +416,7 @@ bool menuModelMixAll(evt_t event)
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_MOVE);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onMixesMenu; POPUP_MENU_START(onMixesMenu);
} }
} }
} }

View file

@ -194,7 +194,7 @@ bool menuModelSelect(evt_t event)
if (currentCategoryIndex > 0) { if (currentCategoryIndex > 0) {
POPUP_MENU_ADD_ITEM(STR_DELETE_CATEGORY); POPUP_MENU_ADD_ITEM(STR_DELETE_CATEGORY);
} }
popupMenuHandler = onCategorySelectMenu; POPUP_MENU_START(onCategorySelectMenu);
} }
else if (selectMode == MODE_SELECT_MODEL) { else if (selectMode == MODE_SELECT_MODEL) {
killEvents(event); killEvents(event);
@ -212,7 +212,7 @@ bool menuModelSelect(evt_t event)
POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL); POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL);
// POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL); // POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL);
// POPUP_MENU_ADD_ITEM(STR_RESTORE_MODEL); // POPUP_MENU_ADD_ITEM(STR_RESTORE_MODEL);
popupMenuHandler = onModelSelectMenu; POPUP_MENU_START(onModelSelectMenu);
} }
break; break;
} }

View file

@ -79,6 +79,7 @@ enum menuModelSetupItems {
}; };
#define MODEL_SETUP_2ND_COLUMN 200 #define MODEL_SETUP_2ND_COLUMN 200
#define MODEL_SETUP_3RD_COLUMN 270
#define MODEL_SETUP_BIND_OFS 40 #define MODEL_SETUP_BIND_OFS 40
#define MODEL_SETUP_RANGE_OFS 80 #define MODEL_SETUP_RANGE_OFS 80
#define MODEL_SETUP_SET_FAILSAFE_OFS 100 #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) 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) { 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); 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); drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1);
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (menuHorizontalPosition<=0 ? attr : 0)); 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)); putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer.start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR));
if (attr && s_editMode>0) { if (attr && s_editMode>0) {
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:
{ {
int8_t timerMode = timer->mode; int8_t timerMode = timer.mode;
if (timerMode < 0) timerMode -= TMRMODE_COUNT-1; if (timerMode < 0) timerMode -= TMRMODE_COUNT-1;
CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers); CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers);
if (timerMode < 0) timerMode += TMRMODE_COUNT-1; if (timerMode < 0) timerMode += TMRMODE_COUNT-1;
timer->mode = timerMode; timer.mode = timerMode;
#if defined(AUTOSWITCH) #if defined(AUTOSWITCH)
if (s_editMode>0) { 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); int8_t switchVal = checkIncDecMovedSwitch(val);
if (val != switchVal) { if (val != switchVal) {
timer->mode = switchVal + (TMRMODE_COUNT-1); timer.mode = switchVal + (TMRMODE_COUNT-1);
storageDirty(EE_MODEL); storageDirty(EE_MODEL);
} }
} }
@ -130,13 +131,33 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event)
case 1: case 1:
{ {
const int stopsMinutes[] = { 8, 60, 120, 180, 240, 300, 600, 900, 1200 }; 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; 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)) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
int getSwitchWarningsCount() int getSwitchWarningsCount()
@ -236,7 +257,7 @@ bool menuModelSetup(evt_t event)
if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
s_editMode = 0; s_editMode = 0;
if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) { 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 { else {
POPUP_WARNING(STR_NO_BITMAPS_ON_SD); POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
@ -259,8 +280,7 @@ bool menuModelSetup(evt_t event)
break; break;
case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); editTimerCountdown(0, y, attr, event);
g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, 0, 2, attr, event);
break; break;
case ITEM_MODEL_TIMER1_PERSISTENT: case ITEM_MODEL_TIMER1_PERSISTENT:
@ -284,8 +304,7 @@ bool menuModelSetup(evt_t event)
break; break;
case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); editTimerCountdown(1, y, attr, event);
g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, 0, 2, attr, event);
break; break;
case ITEM_MODEL_TIMER2_PERSISTENT: case ITEM_MODEL_TIMER2_PERSISTENT:
@ -310,8 +329,7 @@ bool menuModelSetup(evt_t event)
break; break;
case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN); editTimerCountdown(2, y, attr, event);
g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, 0, 2, attr, event);
break; break;
case ITEM_MODEL_TIMER3_PERSISTENT: case ITEM_MODEL_TIMER3_PERSISTENT:
@ -556,9 +574,9 @@ bool menuModelSetup(evt_t event)
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE); 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)); 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)) 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)) 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) { if (attr && s_editMode>0) {
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:

View file

@ -447,7 +447,7 @@ bool menuModelTelemetry(evt_t event)
POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_EDIT);
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onSensorMenu; POPUP_MENU_START(onSensorMenu);
} }
else if (event == EVT_KEY_BREAK(KEY_ENTER)) { else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
pushMenu(menuModelSensor); pushMenu(menuModelSensor);

View file

@ -30,6 +30,7 @@ void popMenu()
assert(menuLevel>0); assert(menuLevel>0);
menuLevel = menuLevel-1; menuLevel = menuLevel-1;
menuEvent = EVT_ENTRY_UP; menuEvent = EVT_ENTRY_UP;
AUDIO_KEY_PRESS();
TRACE("popMenu(%d)", menuLevel); TRACE("popMenu(%d)", menuLevel);
} }
@ -37,6 +38,7 @@ void chainMenu(MenuHandlerFunc newMenu)
{ {
menuHandlers[menuLevel] = newMenu; menuHandlers[menuLevel] = newMenu;
menuEvent = EVT_ENTRY; menuEvent = EVT_ENTRY;
AUDIO_KEY_PRESS();
TRACE("chainMenu(%d, %p)", menuLevel, newMenu); TRACE("chainMenu(%d, %p)", menuLevel, newMenu);
} }
@ -60,6 +62,7 @@ void pushMenu(MenuHandlerFunc newMenu)
menuHandlers[menuLevel] = newMenu; menuHandlers[menuLevel] = newMenu;
menuEvent = EVT_ENTRY; menuEvent = EVT_ENTRY;
AUDIO_KEY_PRESS();
TRACE("pushMenu(%d, %p)", menuLevel, newMenu); TRACE("pushMenu(%d, %p)", menuLevel, newMenu);
} }

View file

@ -487,6 +487,7 @@ extern uint8_t warningInfoFlags;
#define NAVIGATION_MENUS #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_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 POPUP_MENU_MAX_LINES 12
#define MENU_MAX_DISPLAY_LINES 9 #define MENU_MAX_DISPLAY_LINES 9
#define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12)

View file

@ -159,14 +159,9 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
newval++; newval++;
} }
} while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max);
if (newval > i_max) { if (newval > i_max) {
newval = val; newval = val;
killEvents(event); AUDIO_KEY_ERROR();
AUDIO_WARNING2();
}
else {
AUDIO_KEYPAD_UP();
} }
} }
else if (s_editMode>0 && event==EVT_ROTARY_LEFT) { 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--; newval--;
} }
} while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min);
if (newval < i_min) { if (newval < i_min) {
newval = val; newval = val;
killEvents(event); AUDIO_KEY_ERROR();
AUDIO_WARNING2();
}
else {
AUDIO_KEYPAD_DOWN();
} }
} }
@ -219,27 +209,10 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
} }
#endif #endif
if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min);
killEvents(event);
AUDIO_WARNING2();
}
if (newval != val) { 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)); storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1); checkIncDec_Ret = (newval > val ? 1 : -1);
AUDIO_KEY_PRESS();
} }
else { else {
checkIncDec_Ret = 0; 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) { if (checkIncDecSelection != 0) {
newval = checkIncDecSelection; 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(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER);
if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT);
popupMenuHandler = onSwitchLongEnterPress; POPUP_MENU_START(onSwitchLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD; s_editMode = EDIT_MODIFY_FIELD;
} }
if (checkIncDecSelection != 0) { 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 (s_editMode > 1) break;
if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) { if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) {
menuHorizontalPosition = 0; menuHorizontalPosition = 0;
AUDIO_KEY_PRESS();
} }
else if (READ_ONLY_UNLOCKED() && rowcount > 0) { else if (READ_ONLY_UNLOCKED() && rowcount > 0) {
s_editMode = (s_editMode<=0); s_editMode = (s_editMode<=0);
AUDIO_KEY_PRESS();
} }
break; break;
case EVT_KEY_FIRST(KEY_EXIT): case EVT_KEY_FIRST(KEY_EXIT):
if (s_editMode > 0) { if (s_editMode > 0) {
s_editMode = 0; s_editMode = 0;
AUDIO_KEY_PRESS();
break; 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)) { if (menuHorizontalPosition >= 0 && (COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) {
menuHorizontalPosition = -1; menuHorizontalPosition = -1;
AUDIO_KEY_PRESS();
} }
else { else {
uint8_t posVertInit = MENU_FIRST_LINE_EDIT; 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; menuVerticalOffset = 0;
menuVerticalPosition = posVertInit; menuVerticalPosition = posVertInit;
menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition); menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition);
AUDIO_KEY_PRESS();
} }
else if (!calibrationState) { else if (!calibrationState) {
popMenu(); popMenu();
@ -483,6 +461,8 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
break; break;
case EVT_KEY_FIRST(KEY_RIGHT): case EVT_KEY_FIRST(KEY_RIGHT):
AUDIO_KEY_PRESS();
// no break
case EVT_KEY_REPT(KEY_RIGHT): case EVT_KEY_REPT(KEY_RIGHT):
if (s_editMode == 0) { if (s_editMode == 0) {
INC(menuHorizontalPosition, 0, maxcol); INC(menuHorizontalPosition, 0, maxcol);
@ -490,6 +470,8 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
break; break;
case EVT_KEY_FIRST(KEY_LEFT): case EVT_KEY_FIRST(KEY_LEFT):
AUDIO_KEY_PRESS();
// no break
case EVT_KEY_REPT(KEY_LEFT): case EVT_KEY_REPT(KEY_LEFT):
if (s_editMode == 0) { if (s_editMode == 0) {
DEC(menuHorizontalPosition, 0, maxcol); 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: case EVT_ROTARY_RIGHT:
if (s_editMode != 0) break; if (s_editMode != 0) break;
AUDIO_KEY_PRESS();
if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) { if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) {
if (menuHorizontalPosition >= 0) { if (menuHorizontalPosition >= 0) {
INC(menuHorizontalPosition, 0, maxcol); 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); INC(menuVerticalPosition, MENU_FIRST_LINE_EDIT, rowcount-1);
} while (CURSOR_NOT_ALLOWED_IN_ROW(menuVerticalPosition)); } while (CURSOR_NOT_ALLOWED_IN_ROW(menuVerticalPosition));
menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition); menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition);
break; break;
case EVT_ROTARY_LEFT: case EVT_ROTARY_LEFT:
if (s_editMode != 0) break; if (s_editMode != 0) break;
AUDIO_KEY_PRESS();
if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) { if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) {
if (menuHorizontalPosition >= 0) { if (menuHorizontalPosition >= 0) {
DEC(menuHorizontalPosition, 0, maxcol); DEC(menuHorizontalPosition, 0, maxcol);

View file

@ -94,7 +94,7 @@ bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu
s_editMode = 0; s_editMode = 0;
if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(value->stringValue), value->stringValue, LIST_NONE_SD_FILE)) { if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(value->stringValue), value->stringValue, LIST_NONE_SD_FILE)) {
fileSelectionDone = false; fileSelectionDone = false;
popupMenuHandler = onZoneOptionFileSelectionMenu; POPUP_MENU_START(onZoneOptionFileSelectionMenu);
} }
else { else {
POPUP_WARNING(STR_NO_BITMAPS_ON_SD); POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
@ -330,7 +330,7 @@ bool menuWidgetsSetup(evt_t event)
if (currentWidget->getFactory()->getOptions()) if (currentWidget->getFactory()->getOptions())
POPUP_MENU_ADD_ITEM(STR_WIDGET_SETTINGS); POPUP_MENU_ADD_ITEM(STR_WIDGET_SETTINGS);
POPUP_MENU_ADD_ITEM(STR_REMOVE_WIDGET); POPUP_MENU_ADD_ITEM(STR_REMOVE_WIDGET);
popupMenuHandler = onZoneMenu; POPUP_MENU_START(onZoneMenu);
} }
else { else {
onZoneMenu(STR_SELECT_WIDGET); onZoneMenu(STR_SELECT_WIDGET);

View file

@ -144,7 +144,7 @@ bool menuMainView(evt_t event)
POPUP_MENU_ADD_ITEM(STR_STATISTICS); POPUP_MENU_ADD_ITEM(STR_STATISTICS);
POPUP_MENU_ADD_ITEM(STR_SETUP_SCREENS); POPUP_MENU_ADD_ITEM(STR_SETUP_SCREENS);
POPUP_MENU_ADD_ITEM(STR_ABOUT_US); POPUP_MENU_ADD_ITEM(STR_ABOUT_US);
popupMenuHandler = onMainViewMenu; POPUP_MENU_START(onMainViewMenu);
break; break;
case EVT_KEY_LONG(KEY_MODEL): case EVT_KEY_LONG(KEY_MODEL):
@ -179,7 +179,6 @@ bool menuMainView(evt_t event)
gvarDisplayTimer = 0; gvarDisplayTimer = 0;
} }
#endif #endif
AUDIO_KEYPAD_UP();
break; break;
} }

View file

@ -35,7 +35,6 @@ bool menuStatsGraph(evt_t event)
storageDirty(EE_GENERAL); storageDirty(EE_GENERAL);
sessionTimer = 0; sessionTimer = 0;
killEvents(event); killEvents(event);
AUDIO_KEYPAD_UP();
break; break;
} }
@ -107,7 +106,6 @@ bool menuStatsDebug(evt_t event)
maxLuaInterval = 0; maxLuaInterval = 0;
maxLuaDuration = 0; maxLuaDuration = 0;
#endif #endif
AUDIO_KEYPAD_UP();
break; break;
} }

View file

@ -568,7 +568,7 @@ void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2
if (att & TIMEHOUR) { if (att & TIMEHOUR) {
div_t qr2 = div(qr.quot, 60); div_t qr2 = div(qr.quot, 60);
lcdDrawNumber(x, y, qr2.quot, att|LEADING0|LEFT, 2); lcdDrawNumber(x, y, qr2.quot, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdLastPos, y, separator, att&att2); lcdDrawChar(lcdLastPos, y, separator, att);
qr.quot = qr2.rem; qr.quot = qr2.rem;
if (att & MIDSIZE) if (att & MIDSIZE)
x += 17; x += 17;
@ -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) 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]; TelemetryItem & telemetryItem = telemetryItems[channel];
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[channel]; TelemetrySensor & telemetrySensor = g_model.telemetrySensors[channel];
if (telemetrySensor.unit == UNIT_DATETIME) { 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) { else if (telemetrySensor.unit == UNIT_GPS) {
displayGpsCoords(x, y, telemetryItem, att); 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<DIM(RXS_STATUS); i++) {
if (value & (1<<i)) {
lcdDrawText(att & LEFT ? x : x-40, att & DBLSIZE ? y+1 : y, RXS_STATUS[i]);
break;
}
}
}
}
}
}
}
else { else {
LcdFlags flags = att; LcdFlags flags = att;
if (telemetrySensor.prec > 0) { if (telemetrySensor.prec > 0) {
@ -1139,4 +1187,3 @@ void lcdDrawBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset, co
} }
} }
#endif #endif

View file

@ -262,7 +262,7 @@ void menuGeneralSdManager(evt_t _event)
killEvents(_event); killEvents(_event);
POPUP_MENU_ADD_ITEM(STR_SD_INFO); POPUP_MENU_ADD_ITEM(STR_SD_INFO);
POPUP_MENU_ADD_ITEM(STR_SD_FORMAT); POPUP_MENU_ADD_ITEM(STR_SD_FORMAT);
popupMenuHandler = onSdManagerMenu; POPUP_MENU_START(onSdManagerMenu);
} }
break; break;
@ -333,7 +333,7 @@ void menuGeneralSdManager(evt_t _event)
if (IS_FILE(line)) if (IS_FILE(line))
POPUP_MENU_ADD_ITEM(STR_DELETE_FILE); POPUP_MENU_ADD_ITEM(STR_DELETE_FILE);
} }
popupMenuHandler = onSdManagerMenu; POPUP_MENU_START(onSdManagerMenu);
} }
break; break;
} }

View file

@ -228,9 +228,11 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_BEEP_VOLUME: case ITEM_SETUP_BEEP_VOLUME:
SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr);
break; break;
case ITEM_SETUP_WAV_VOLUME: case ITEM_SETUP_WAV_VOLUME:
SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr);
break; break;
case ITEM_SETUP_BACKGROUND_VOLUME: case ITEM_SETUP_BACKGROUND_VOLUME:
SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr);
break; break;
@ -253,21 +255,25 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_VARIO_LABEL: case ITEM_SETUP_VARIO_LABEL:
lcd_putsLeft(y, STR_VARIO); lcd_putsLeft(y, STR_VARIO);
break; break;
case ITEM_SETUP_VARIO_VOLUME: case ITEM_SETUP_VARIO_VOLUME:
SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr); SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr);
break; break;
case ITEM_SETUP_VARIO_PITCH: case ITEM_SETUP_VARIO_PITCH:
lcd_putsLeft(y, STR_PITCH_AT_ZERO); lcd_putsLeft(y, STR_PITCH_AT_ZERO);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT);
lcdDrawText(lcdLastPos, y, "Hz", attr); lcdDrawText(lcdLastPos, y, "Hz", attr);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40);
break; break;
case ITEM_SETUP_VARIO_RANGE: case ITEM_SETUP_VARIO_RANGE:
lcd_putsLeft(y, STR_PITCH_AT_MAX); 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); 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); lcdDrawText(lcdLastPos, y, "Hz", attr);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80);
break; break;
case ITEM_SETUP_VARIO_REPEAT: case ITEM_SETUP_VARIO_REPEAT:
lcd_putsLeft(y, STR_REPEAT_AT_ZERO); lcd_putsLeft(y, STR_REPEAT_AT_ZERO);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT);

View file

@ -191,7 +191,7 @@ void menuModelCurveOne(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET); POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET);
POPUP_MENU_ADD_ITEM(STR_MIRROR); POPUP_MENU_ADD_ITEM(STR_MIRROR);
POPUP_MENU_ADD_ITEM(STR_CLEAR); POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onCurveOneMenu; POPUP_MENU_START(onCurveOneMenu);
} }
break; break;
case EVT_KEY_LONG(KEY_MENU): case EVT_KEY_LONG(KEY_MENU):

View file

@ -165,7 +165,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
break; break;
} }
} }
popupMenuHandler = onCustomFunctionsMenu; POPUP_MENU_START(onCustomFunctionsMenu);
} }
for (int i=0; i<NUM_BODY_LINES; i++) { for (int i=0; i<NUM_BODY_LINES; i++) {
@ -298,7 +298,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2); 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)) { 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 { else {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); 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); POPUP_MENU_ADD_ITEM(STR_GLOBALVAR);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC) if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC)
POPUP_MENU_ADD_ITEM(STR_INCDEC); POPUP_MENU_ADD_ITEM(STR_INCDEC);
popupMenuHandler = onAdjustGvarSourceLongEnterPress; POPUP_MENU_START(onAdjustGvarSourceLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD; s_editMode = EDIT_MODIFY_FIELD;
} }
} }

View file

@ -72,7 +72,7 @@ void menuModelCustomScriptOne(uint8_t event)
if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && !READ_ONLY()) { if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && !READ_ONLY()) {
s_editMode = 0; s_editMode = 0;
if (sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) { if (sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), sd.file, LIST_NONE_SD_FILE)) {
popupMenuHandler = onModelCustomScriptMenu; POPUP_MENU_START(onModelCustomScriptMenu);
} }
else { else {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);

View file

@ -183,6 +183,6 @@ void menuModelGVars(uint8_t event)
killEvents(event); killEvents(event);
POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_EDIT);
POPUP_MENU_ADD_ITEM(STR_CLEAR); POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onGVARSMenu; POPUP_MENU_START(onGVARSMenu);
} }
} }

View file

@ -433,7 +433,7 @@ void menuModelExposAll(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_MOVE);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onExposMenu; POPUP_MENU_START(onExposMenu);
} }
} }
} }

View file

@ -159,7 +159,7 @@ void menuModelLimits(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_RESET);
POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS);
POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS);
popupMenuHandler = onLimitsMenu; POPUP_MENU_START(onLimitsMenu);
} }
for (int j=0; j<ITEM_LIMITS_COUNT; j++) { for (int j=0; j<ITEM_LIMITS_COUNT; j++) {

View file

@ -95,7 +95,7 @@ void menuModelLogicalSwitches(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_PASTE); POPUP_MENU_ADD_ITEM(STR_PASTE);
if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw)
POPUP_MENU_ADD_ITEM(STR_CLEAR); POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onLogicalSwitchesMenu; POPUP_MENU_START(onLogicalSwitchesMenu);
} }
for (int i=0; i<NUM_BODY_LINES; ++i) { for (int i=0; i<NUM_BODY_LINES; ++i) {

View file

@ -457,7 +457,7 @@ void menuModelMixAll(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_MOVE); POPUP_MENU_ADD_ITEM(STR_MOVE);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onMixesMenu; POPUP_MENU_START(onMixesMenu);
} }
} }
} }

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#define MODELSIZE_POS_X 170 #define MODELSIZE_POS_X 170
#define MODELSEL_W 133 #define MODELSEL_W 133
@ -178,7 +178,7 @@ void menuModelSelect(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_COPY_MODEL); POPUP_MENU_ADD_ITEM(STR_COPY_MODEL);
POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL); POPUP_MENU_ADD_ITEM(STR_MOVE_MODEL);
} }
popupMenuHandler = onModelSelectMenu; POPUP_MENU_START(onModelSelectMenu);
} }
else if (eeModelExists(sub)) { else if (eeModelExists(sub)) {
s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE); s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE);

View file

@ -94,6 +94,7 @@ enum menuModelSetupItems {
#define FIELD_PROTOCOL_MAX 1 #define FIELD_PROTOCOL_MAX 1
#define MODEL_SETUP_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH-1) #define MODEL_SETUP_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH-1)
#define MODEL_SETUP_3RD_COLUMN (MODEL_SETUP_2ND_COLUMN+6*FW)
#define MODEL_SETUP_BIND_OFS 3*FW-2 #define MODEL_SETUP_BIND_OFS 3*FW-2
#define MODEL_SETUP_RANGE_OFS 7*FW #define MODEL_SETUP_RANGE_OFS 7*FW
#define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2 #define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2
@ -123,27 +124,27 @@ void onModelSetupBitmapMenu(const char *result)
void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event) void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event)
{ {
TimerData * timer = &g_model.timers[timerIdx]; TimerData & timer = g_model.timers[timerIdx];
drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1); drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1);
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, 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); 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, 11*FW, FH+1); if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 13*FW-3, FH+1);
if (attr && s_editMode>0) { if (attr && s_editMode>0) {
div_t qr = div(timer->start, 60); div_t qr = div(timer.start, 60);
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:
{ {
swsrc_t timerMode = timer->mode; swsrc_t timerMode = timer.mode;
if (timerMode < 0) timerMode -= TMRMODE_COUNT-1; if (timerMode < 0) timerMode -= TMRMODE_COUNT-1;
CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers); CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers);
if (timerMode < 0) timerMode += TMRMODE_COUNT-1; if (timerMode < 0) timerMode += TMRMODE_COUNT-1;
timer->mode = timerMode; timer.mode = timerMode;
#if defined(AUTOSWITCH) #if defined(AUTOSWITCH)
if (s_editMode>0) { 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); swsrc_t switchVal = checkIncDecMovedSwitch(val);
if (val != switchVal) { if (val != switchVal) {
timer->mode = switchVal + (TMRMODE_COUNT-1); timer.mode = switchVal + (TMRMODE_COUNT-1);
storageDirty(EE_MODEL); storageDirty(EE_MODEL);
} }
} }
@ -152,13 +153,34 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event)
} }
case 1: case 1:
qr.quot = checkIncDec(event, qr.quot, 0, 1439, EE_MODEL | NO_INCDEC_MARKS); // 23h59 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; break;
case 2: case 2:
qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2; qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2;
timer->start -= qr.rem ; timer.start -= qr.rem ;
if ((int16_t)timer->start < 0) timer->start=0; if ((int16_t)timer.start < 0) timer.start=0;
if ((int32_t)timer->start > 86399) timer->start=86399; // 23h59:59 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; break;
} }
} }
@ -202,7 +224,7 @@ int getSwitchWarningsCount()
#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW #define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW
#endif #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 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) #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) #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 #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 #if TIMERS == 1
#define TIMERS_ROWS TIMER_ROWS #define TIMERS_ROWS TIMER_ROWS(0)
#elif TIMERS == 2 #elif TIMERS == 2
#define TIMERS_ROWS TIMER_ROWS, TIMER_ROWS #define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1)
#elif TIMERS == 3 #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 #endif
#if defined(REV9E) #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) #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()) { if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
s_editMode = 0; s_editMode = 0;
if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) { 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 { else {
POPUP_WARNING(STR_NO_BITMAPS_ON_SD); POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
@ -324,7 +346,7 @@ void menuModelSetup(uint8_t event)
break; break;
case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP: 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; break;
case ITEM_MODEL_TIMER1_PERSISTENT: case ITEM_MODEL_TIMER1_PERSISTENT:
@ -345,7 +367,7 @@ void menuModelSetup(uint8_t event)
break; break;
case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP: 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; break;
case ITEM_MODEL_TIMER2_PERSISTENT: case ITEM_MODEL_TIMER2_PERSISTENT:
@ -367,7 +389,7 @@ void menuModelSetup(uint8_t event)
break; break;
case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP: 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; break;
case ITEM_MODEL_TIMER3_PERSISTENT: case ITEM_MODEL_TIMER3_PERSISTENT:
@ -635,7 +657,7 @@ void menuModelSetup(uint8_t event)
lcd_putsLeft(y, STR_MODE); lcd_putsLeft(y, STR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); 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)) 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) { if (attr && s_editMode>0) {
switch (menuHorizontalPosition) { switch (menuHorizontalPosition) {
case 0: case 0:
@ -683,13 +705,13 @@ void menuModelSetup(uint8_t event)
lcd_putsLeft(y, STR_MODE); lcd_putsLeft(y, STR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0); 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)) 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)) 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) #if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) { 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); 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) { switch(multi_rfProto) {
case MM_RF_PROTO_FLYSKY: case MM_RF_PROTO_FLYSKY:
@ -955,10 +977,11 @@ void menuModelSetup(uint8_t event)
} }
if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) { 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); 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); CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
} }
} }
}
#endif #endif
break; break;
} }

View file

@ -499,7 +499,7 @@ void menuModelTelemetry(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_EDIT); POPUP_MENU_ADD_ITEM(STR_EDIT);
POPUP_MENU_ADD_ITEM(STR_COPY); POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_DELETE); POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onSensorMenu; POPUP_MENU_START(onSensorMenu);
} }
else if (event == EVT_KEY_BREAK(KEY_ENTER)) { else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
pushMenu(menuModelSensor); pushMenu(menuModelSensor);
@ -670,7 +670,7 @@ void menuModelTelemetry(uint8_t event)
if (menuHorizontalPosition==1 && attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { if (menuHorizontalPosition==1 && attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
s_editMode = 0; s_editMode = 0;
if (sdListFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), g_model.frsky.screens[screenIndex].script.file)) { if (sdListFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), g_model.frsky.screens[screenIndex].script.file)) {
popupMenuHandler = onTelemetryScriptFileSelectionMenu; POPUP_MENU_START(onTelemetryScriptFileSelectionMenu);
} }
else { else {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
MenuHandlerFunc menuHandlers[5]; MenuHandlerFunc menuHandlers[5];
uint8_t menuEvent = 0; uint8_t menuEvent = 0;
@ -30,6 +30,7 @@ void popMenu()
assert(menuLevel>0); assert(menuLevel>0);
menuLevel = menuLevel-1; menuLevel = menuLevel-1;
menuEvent = EVT_ENTRY_UP; menuEvent = EVT_ENTRY_UP;
AUDIO_KEY_PRESS();
TRACE("popMenu(%d)", menuLevel); TRACE("popMenu(%d)", menuLevel);
} }
@ -37,6 +38,7 @@ void chainMenu(MenuHandlerFunc newMenu)
{ {
menuHandlers[menuLevel] = newMenu; menuHandlers[menuLevel] = newMenu;
menuEvent = EVT_ENTRY; menuEvent = EVT_ENTRY;
AUDIO_KEY_PRESS();
TRACE("chainMenu(%d, %p)", menuLevel, newMenu); TRACE("chainMenu(%d, %p)", menuLevel, newMenu);
} }
@ -60,6 +62,7 @@ void pushMenu(MenuHandlerFunc newMenu)
menuHandlers[menuLevel] = newMenu; menuHandlers[menuLevel] = newMenu;
menuEvent = EVT_ENTRY; menuEvent = EVT_ENTRY;
AUDIO_KEY_PRESS();
TRACE("pushMenu(%d, %p)", menuLevel, newMenu); TRACE("pushMenu(%d, %p)", menuLevel, newMenu);
} }

View file

@ -408,6 +408,7 @@ extern uint8_t warningInfoFlags;
#define NAVIGATION_MENUS #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_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 POPUP_MENU_MAX_LINES 12
#define MENU_MAX_DISPLAY_LINES 6 #define MENU_MAX_DISPLAY_LINES 6
#define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s)

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
vertpos_t menuVerticalOffset; vertpos_t menuVerticalOffset;
vertpos_t menuVerticalPosition; vertpos_t menuVerticalPosition;
@ -166,14 +166,10 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
newval++; newval++;
} }
} while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max);
if (newval > i_max) { if (newval > i_max) {
newval = val; newval = val;
killEvents(event); killEvents(event);
AUDIO_WARNING2(); AUDIO_KEY_ERROR();
}
else {
AUDIO_KEYPAD_UP();
} }
} }
else if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_REPT(KEY_MINUS))) { 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--; newval--;
} }
} while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min);
if (newval < i_min) { if (newval < i_min) {
newval = val; newval = val;
killEvents(event); killEvents(event);
AUDIO_WARNING2(); AUDIO_KEY_ERROR();
}
else {
AUDIO_KEYPAD_DOWN();
} }
} }
@ -226,25 +218,18 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
} }
#endif #endif
if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min);
killEvents(event);
AUDIO_WARNING2();
}
if (newval != val) { if (newval != val) {
if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && stops.contains(newval)) { 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)); bool pause = (newval > val ? !stops.contains(newval+1) : !stops.contains(newval-1));
if (pause) { if (pause) {
pauseEvents(event); // delay before auto-repeat continues 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)); storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1); checkIncDec_Ret = (newval > val ? 1 : -1);
if (!IS_KEY_REPT(event)) {
AUDIO_KEY_PRESS();
}
} }
else { else {
checkIncDec_Ret = 0; checkIncDec_Ret = 0;
@ -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) { if (checkIncDecSelection != 0) {
newval = checkIncDecSelection; 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(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER);
if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT);
popupMenuHandler = onSwitchLongEnterPress; POPUP_MENU_START(onSwitchLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD; s_editMode = EDIT_MODIFY_FIELD;
} }
if (checkIncDecSelection != 0) { if (checkIncDecSelection != 0) {
@ -365,7 +350,7 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl
if (modelHasNotes()) { if (modelHasNotes()) {
POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS); POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS);
POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES);
popupMenuHandler = onLongMenuPress; POPUP_MENU_START(onLongMenuPress);
} }
else { else {
pushMenu(menuChannelsView); 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 (s_editMode > 1) break;
if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) { if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) {
l_posHorz = 0; l_posHorz = 0;
AUDIO_KEY_PRESS();
} }
else if (READ_ONLY_UNLOCKED()) { else if (READ_ONLY_UNLOCKED()) {
s_editMode = (s_editMode<=0); s_editMode = (s_editMode<=0);
AUDIO_KEY_PRESS();
} }
break; 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): case EVT_KEY_BREAK(KEY_EXIT):
if (s_editMode > 0) { if (s_editMode > 0) {
s_editMode = 0; s_editMode = 0;
AUDIO_KEY_PRESS();
break; break;
} }
if (l_posHorz >= 0 && (COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if (l_posHorz >= 0 && (COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {
l_posHorz = -1; l_posHorz = -1;
AUDIO_KEY_PRESS();
} }
else { else {
uint8_t posVertInit = MENU_FIRST_LINE_EDIT; 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; menuVerticalOffset = 0;
l_posVert = posVertInit; l_posVert = posVertInit;
l_posHorz = POS_HORZ_INIT(l_posVert); l_posHorz = POS_HORZ_INIT(l_posVert);
AUDIO_KEY_PRESS();
} }
else { else {
popMenu(); popMenu();
@ -457,6 +447,8 @@ void check(const char * name, check_event_t event, uint8_t curr, const MenuHandl
break; break;
case EVT_KEY_FIRST(KEY_RIGHT): case EVT_KEY_FIRST(KEY_RIGHT):
AUDIO_KEY_PRESS();
// no break
case EVT_KEY_REPT(KEY_RIGHT): case EVT_KEY_REPT(KEY_RIGHT):
if (s_editMode != 0) break; if (s_editMode != 0) break;
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { 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; break;
case EVT_KEY_FIRST(KEY_LEFT): case EVT_KEY_FIRST(KEY_LEFT):
AUDIO_KEY_PRESS();
// no break
case EVT_KEY_REPT(KEY_LEFT): case EVT_KEY_REPT(KEY_LEFT):
if (s_editMode != 0) break; if (s_editMode != 0) break;
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {

View file

@ -19,7 +19,6 @@
*/ */
#include "opentx.h" #include "opentx.h"
#include "timers.h"
#define BIGSIZE MIDSIZE #define BIGSIZE MIDSIZE
#define LBOX_CENTERX (BOX_WIDTH/2 + 16) #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_RESET_SUBMENU);
POPUP_MENU_ADD_ITEM(STR_STATISTICS); POPUP_MENU_ADD_ITEM(STR_STATISTICS);
POPUP_MENU_ADD_ITEM(STR_ABOUT_US); POPUP_MENU_ADD_ITEM(STR_ABOUT_US);
popupMenuHandler = onMainViewMenu; POPUP_MENU_START(onMainViewMenu);
break; break;
#if MENUS_LOCK != 2/*no menus*/ #if MENUS_LOCK != 2/*no menus*/
@ -481,12 +480,14 @@ void menuMainView(uint8_t event)
g_eeGeneral.view = 0; g_eeGeneral.view = 0;
chainMenu(menuMainViewChannelsMonitor); chainMenu(menuMainViewChannelsMonitor);
} }
AUDIO_KEY_PRESS();
break; break;
case EVT_KEY_LONG(KEY_PAGE): case EVT_KEY_LONG(KEY_PAGE):
if (!IS_FAI_ENABLED()) if (!IS_FAI_ENABLED())
chainMenu(menuTelemetryFrsky); chainMenu(menuTelemetryFrsky);
killEvents(event); killEvents(event);
AUDIO_KEY_PRESS();
break; break;
case EVT_KEY_FIRST(KEY_EXIT): case EVT_KEY_FIRST(KEY_EXIT):
@ -495,7 +496,6 @@ void menuMainView(uint8_t event)
gvarDisplayTimer = 0; gvarDisplayTimer = 0;
} }
#endif #endif
AUDIO_KEYPAD_UP();
break; break;
} }

View file

@ -18,8 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#include "../../timers.h"
#define STATS_1ST_COLUMN FW/2 #define STATS_1ST_COLUMN FW/2
#define STATS_2ND_COLUMN 12*FW+FW/2 #define STATS_2ND_COLUMN 12*FW+FW/2
@ -118,7 +117,6 @@ void menuStatisticsDebug(uint8_t event)
storageDirty(EE_GENERAL); storageDirty(EE_GENERAL);
sessionTimer = 0; sessionTimer = 0;
killEvents(event); killEvents(event);
AUDIO_KEYPAD_UP();
break; break;
case EVT_KEY_FIRST(KEY_ENTER): case EVT_KEY_FIRST(KEY_ENTER):
#if defined(LUA) #if defined(LUA)
@ -126,7 +124,6 @@ void menuStatisticsDebug(uint8_t event)
maxLuaDuration = 0; maxLuaDuration = 0;
#endif #endif
maxMixerDuration = 0; maxMixerDuration = 0;
AUDIO_KEYPAD_UP();
break; break;
#if defined(DEBUG_TRACE_BUFFER) #if defined(DEBUG_TRACE_BUFFER)

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
#define STATUS_BAR_Y (7*FH+1) #define STATUS_BAR_Y (7*FH+1)
#define TELEM_2ND_COLUMN (11*FW) #define TELEM_2ND_COLUMN (11*FW)
@ -237,7 +237,7 @@ void menuTelemetryFrsky(uint8_t event)
killEvents(event); killEvents(event);
POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
popupMenuHandler = onMainViewMenu; POPUP_MENU_START(onMainViewMenu);
break; break;
} }

View file

@ -94,15 +94,11 @@ void hapticQueue::play(uint8_t tLen, uint8_t tPause, uint8_t tFlags)
void hapticQueue::event(uint8_t e) 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) if (e <= AU_ERROR)
play(15, 3, PLAY_NOW); play(15, 3, PLAY_NOW);
else if (e <= AU_TRIM_MOVE) else if (e <= AU_MIX_WARNING_3)
play(5, 0, PLAY_NOW);
else if (e <= AU_TIMER_LT10)
play(15, 3, PLAY_NOW); 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()) { else if (e >= AU_SPECIAL_SOUND_LAST && empty()) {
play(30, 10, 0); play(30, 10, 0);
play(10, 50-10*(e-AU_SPECIAL_SOUND_LAST), (e-AU_SPECIAL_SOUND_LAST)); play(10, 50-10*(e-AU_SPECIAL_SOUND_LAST), (e-AU_SPECIAL_SOUND_LAST));

View file

@ -359,7 +359,6 @@ void guiMain(evt_t evt)
TRACE("menuEvent 0x%02x", menuEvent); TRACE("menuEvent 0x%02x", menuEvent);
} }
menuEvent = 0; menuEvent = 0;
AUDIO_MENUS();
} }
if (warningText) { if (warningText) {

View file

@ -123,7 +123,6 @@ void perMain()
menuHorizontalPosition = 0; menuHorizontalPosition = 0;
evt = menuEvent; evt = menuEvent;
menuEvent = 0; menuEvent = 0;
AUDIO_MENUS();
} }
menuHandlers[menuLevel]((warn || popupMenuActive) ? 0 : evt); menuHandlers[menuLevel]((warn || popupMenuActive) ? 0 : evt);

View file

@ -455,6 +455,12 @@ enum SwashType {
#define IS_MANUAL_RESET_TIMER(idx) 0 #define IS_MANUAL_RESET_TIMER(idx) 0
#endif #endif
#if defined(CPUARM) && !defined(PCBSKY9X)
#define TIMER_COUNTDOWN_START(x) (g_model.timers[x].countdownStart > 0 ? 5 : 10 - g_model.timers[x].countdownStart * 10)
#else
#define TIMER_COUNTDOWN_START(x) 10
#endif
enum Protocols { enum Protocols {
PROTO_PPM, PROTO_PPM,
#if !defined(CPUARM) #if !defined(CPUARM)

View file

@ -19,7 +19,6 @@
*/ */
#include "opentx.h" #include "opentx.h"
#include "timers.h"
RadioData g_eeGeneral; RadioData g_eeGeneral;
ModelData g_model; ModelData g_model;
@ -1014,17 +1013,15 @@ void doSplash()
#endif #endif
if (SPLASH_NEEDED()) { if (SPLASH_NEEDED()) {
#if !defined(PCBTARANIS) && !defined(PCBHORUS)
drawSplash(); drawSplash();
#endif
#if !defined(CPUARM) #if !defined(CPUARM)
AUDIO_TADA(); AUDIO_HELLO();
#endif #endif
#if defined(PCBSTD) #if defined(PCBSTD)
lcdSetContrast(); lcdSetContrast();
#elif !defined(PCBHORUS) && !defined(PCBTARANIS) #elif defined(PCBSKY9X)
tmr10ms_t curTime = get_tmr10ms() + 10; tmr10ms_t curTime = get_tmr10ms() + 10;
uint8_t contrast = 10; uint8_t contrast = 10;
lcdSetRefVolt(contrast); lcdSetRefVolt(contrast);
@ -1074,7 +1071,7 @@ void doSplash()
} }
#endif #endif
#if !defined(PCBHORUS) && !defined(PCBTARANIS) && !defined(PCBSTD) #if defined(PCBSKY9X)
if (curTime < get_tmr10ms()) { if (curTime < get_tmr10ms()) {
curTime += 10; curTime += 10;
if (contrast < g_eeGeneral.contrast) { 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) 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 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 int16_t after = (k&1) ? before + v : before - v; // positive = k&1
#if defined(CPUARM)
uint8_t beepTrim = 0;
#else
bool beepTrim = false; bool beepTrim = false;
#endif
for (int16_t mark=TRIM_MIN; mark<=TRIM_MAX; mark+=TRIM_MAX) { if (!thro && after==0 && before!=0) {
if ((mark!=0 || !thro) && ((mark!=TRIM_MIN && after>=mark && before<mark) || (mark!=TRIM_MAX && after<=mark && before>mark))) { beepTrim = true;
after = mark; AUDIO_TRIM_MIDDLE();
beepTrim = (mark == 0 ? 1 : 2); pauseEvents(event);
} }
else if (before>TRIM_MIN && after<=TRIM_MIN) {
beepTrim = true;
AUDIO_TRIM_MIN();
killEvents(event);
}
else if (before<TRIM_MAX && after>=TRIM_MAX) {
beepTrim = true;
AUDIO_TRIM_MAX();
killEvents(event);
} }
if ((before<after && after>TRIM_MAX) || (before>after && after<TRIM_MIN)) { if ((before<after && after>TRIM_MAX) || (before>after && after<TRIM_MIN)) {
@ -1412,35 +1415,10 @@ uint8_t checkTrim(uint8_t event)
#endif #endif
} }
#if defined(AUDIO) if (!beepTrim) {
// toneFreq higher/lower according to trim position AUDIO_TRIM_PRESS(after);
// limit the frequency, range -125 to 125 = toneFreq: 19 to 101 }
if (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) {
if (beepTrim == 1) {
AUDIO_TRIM_MIDDLE(after);
pauseEvents(event);
}
else {
AUDIO_TRIM_END(after);
killEvents(event);
}
}
else {
AUDIO_TRIM(event, after);
}
#if !defined(CPUARM) #if !defined(CPUARM)
return 0; return 0;
#endif #endif
@ -1632,9 +1610,9 @@ uint8_t trimsDisplayTimer = 0;
uint8_t trimsDisplayMask = 0; uint8_t trimsDisplayMask = 0;
#endif #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 // 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)) { if (!IS_MANUAL_RESET_TIMER(0)) {
@ -1662,6 +1640,12 @@ void flightReset()
START_SILENCE_PERIOD(); START_SILENCE_PERIOD();
RESET_THR_TRACE(); RESET_THR_TRACE();
logicalSwitchesReset();
if (check) {
checkAll();
}
} }
#if defined(THRTRACE) #if defined(THRTRACE)

View file

@ -897,7 +897,7 @@ extern uint8_t trimsDisplayTimer;
extern uint8_t trimsDisplayMask; extern uint8_t trimsDisplayMask;
#endif #endif
void flightReset(); void flightReset(uint8_t check=true);
extern uint8_t unexpectedShutdown; extern uint8_t unexpectedShutdown;
@ -1326,7 +1326,7 @@ uint16_t crc16(const uint8_t * ptr, uint32_t len);
#define PLAY_INCREMENT(x) ((uint8_t)(((uint8_t)x) << 6)) /* -1, 0, 1, 2 */ #define PLAY_INCREMENT(x) ((uint8_t)(((uint8_t)x) << 6)) /* -1, 0, 1, 2 */
enum AUDIO_SOUNDS { enum AUDIO_SOUNDS {
AU_TADA, AUDIO_HELLO,
#if defined(CPUARM) #if defined(CPUARM)
AU_BYE, AU_BYE,
#endif #endif
@ -1338,14 +1338,6 @@ enum AUDIO_SOUNDS {
AU_TX_BATTERY_LOW, AU_TX_BATTERY_LOW,
AU_INACTIVITY, AU_INACTIVITY,
#if defined(CPUARM) #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_ORANGE,
AU_RSSI_RED, AU_RSSI_RED,
AU_SWR_RED, AU_SWR_RED,
@ -1355,37 +1347,33 @@ enum AUDIO_SOUNDS {
AU_TRAINER_BACK, AU_TRAINER_BACK,
AU_SENSOR_LOST, AU_SENSOR_LOST,
AU_SERVO_KO, AU_SERVO_KO,
AU_RX_OVERLOAD,
#endif #endif
#if defined(PCBSKY9X) #if defined(PCBSKY9X)
AU_TX_MAH_HIGH, AU_TX_MAH_HIGH,
AU_TX_TEMP_HIGH, AU_TX_TEMP_HIGH,
#endif #endif
AU_ERROR, AU_ERROR,
AU_KEYPAD_UP,
AU_KEYPAD_DOWN,
AU_MENUS,
AU_TRIM_MOVE,
AU_WARNING1, AU_WARNING1,
AU_WARNING2, AU_WARNING2,
AU_WARNING3, AU_WARNING3,
AU_TRIM_MIDDLE, AU_TRIM_MIDDLE,
#if defined(CPUARM) #if defined(CPUARM)
AU_TRIM_END, AU_TRIM_MIN,
AU_TRIM_MAX,
#endif #endif
#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) #if defined(CPUARM)
AU_STICK1_MIDDLE, AU_STICK1_MIDDLE,
AU_STICK2_MIDDLE, AU_STICK2_MIDDLE,
AU_STICK3_MIDDLE, AU_STICK3_MIDDLE,
AU_STICK4_MIDDLE, AU_STICK4_MIDDLE,
#endif
#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS)
AU_POT1_MIDDLE, AU_POT1_MIDDLE,
AU_POT2_MIDDLE, AU_POT2_MIDDLE,
AU_SLIDER1_MIDDLE, AU_SLIDER1_MIDDLE,
AU_SLIDER2_MIDDLE, AU_SLIDER2_MIDDLE,
#elif defined(CPUARM) #elif defined(CPUARM)
AU_STICK1_MIDDLE,
AU_STICK2_MIDDLE,
AU_STICK3_MIDDLE,
AU_STICK4_MIDDLE,
AU_POT1_MIDDLE, AU_POT1_MIDDLE,
AU_POT2_MIDDLE, AU_POT2_MIDDLE,
AU_POT3_MIDDLE, AU_POT3_MIDDLE,
@ -1395,10 +1383,11 @@ enum AUDIO_SOUNDS {
AU_MIX_WARNING_1, AU_MIX_WARNING_1,
AU_MIX_WARNING_2, AU_MIX_WARNING_2,
AU_MIX_WARNING_3, AU_MIX_WARNING_3,
AU_TIMER_00, #if defined(CPUARM)
AU_TIMER_LT10, AU_TIMER1_ELAPSED,
AU_TIMER_20, AU_TIMER2_ELAPSED,
AU_TIMER_30, AU_TIMER3_ELAPSED,
#endif
AU_SPECIAL_SOUND_FIRST, AU_SPECIAL_SOUND_FIRST,
AU_SPECIAL_SOUND_BEEP1 = AU_SPECIAL_SOUND_FIRST, AU_SPECIAL_SOUND_BEEP1 = AU_SPECIAL_SOUND_FIRST,

View file

@ -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->countdownBeep = src->countdownBeep;
dest->minuteBeep = src->minuteBeep; dest->minuteBeep = src->minuteBeep;
dest->persistent = src->persistent; dest->persistent = src->persistent;
dest->spare = src->spare; dest->countdownStart = src->countdownStart;
} }
template <class A, class B> template <class A, class B>
@ -192,6 +192,7 @@ void copyModuleData(A * dest, B * src)
dest->channelsStart = src->channelsStart; dest->channelsStart = src->channelsStart;
dest->channelsCount = src->channelsCount; dest->channelsCount = src->channelsCount;
dest->failsafeMode = src->failsafeMode; dest->failsafeMode = src->failsafeMode;
dest->subType = src->subType;
dest->invertedSerial = src->invertedSerial; dest->invertedSerial = src->invertedSerial;
memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels)); memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels));
copyModuleData_ppm(&dest->ppm, &src->ppm); copyModuleData_ppm(&dest->ppm, &src->ppm);
@ -344,3 +345,4 @@ void copyModuleData_ppm(A * dest, B * src)
dest->outputType = src->outputType; dest->outputType = src->outputType;
dest->frameLength = src->frameLength; dest->frameLength = src->frameLength;
} }

View file

@ -59,8 +59,7 @@ void preModelLoad()
void postModelLoad(bool newModel) void postModelLoad(bool newModel)
{ {
AUDIO_FLUSH(); AUDIO_FLUSH();
flightReset(); flightReset(false);
logicalSwitchesReset();
if (pulsesStarted()) { if (pulsesStarted()) {
#if defined(GUI) #if defined(GUI)

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include "../../opentx.h" #include "opentx.h"
uint32_t readKeys() uint32_t readKeys()
{ {

View file

@ -75,8 +75,8 @@ const FrSkySportSensor sportSensors[] = {
{ RBOX_BATT2_FIRST_ID, RBOX_BATT2_LAST_ID, 1, ZSTR_BATT2_CURRENT, UNIT_AMPS, 2 }, { 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, 0, ZSTR_BATT1_CONSUMPTION, UNIT_MAH, 0 },
{ RBOX_CNSP_FIRST_ID, RBOX_CNSP_LAST_ID, 1, ZSTR_BATT2_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, 0, ZSTR_CHANS_STATE, UNIT_BITFIELD, 0 },
{ RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 1, ZSTR_RB_STATE, UNIT_RAW, 0 }, { RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 1, ZSTR_RB_STATE, UNIT_BITFIELD, 0 },
{ 0, 0, 0, NULL, UNIT_RAW, 0 } // sentinel { 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) { else if (id >= RBOX_STATE_FIRST_ID && id <= RBOX_STATE_LAST_ID) {
uint16_t newServosState = data & 0xffff; uint16_t newServosState = data & 0xffff;
if (servosState == 0 && newServosState != 0) { if (newServosState != 0 && servosState == 0) {
audioEvent(AU_SERVO_KO); audioEvent(AU_SERVO_KO);
} }
uint16_t newRboxState = data >> 16;
if ((newRboxState & 0x07) && (rboxState & 0x07) == 0) {
audioEvent(AU_RX_OVERLOAD);
}
servosState = newServosState; servosState = newServosState;
rboxState = data >> 16; rboxState = newRboxState;
processSportPacket(id, 0, instance, servosState); processSportPacket(id, 0, instance, servosState);
processSportPacket(id, 1, instance, rboxState); processSportPacket(id, 1, instance, rboxState);
} }

View file

@ -49,15 +49,10 @@ void timerSet(int idx, int16_t val)
void initModelTimer(uint32_t idx, uint8_t mode, int16_t start = 0) 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].mode = mode;
g_model.timers[0].start = start; g_model.timers[0].start = start;
g_model.timers[0].countdownBeep = COUNTDOWN_SILENT; 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
} }
/* /*

View file

@ -153,7 +153,7 @@ void evalTimers(int16_t throttle, uint8_t tick10ms)
switch (timerState->state) { switch (timerState->state) {
case TMR_RUNNING: case TMR_RUNNING:
if (timerStart && newTimerVal>=(tmrval_t)timerStart) { if (timerStart && newTimerVal>=(tmrval_t)timerStart) {
AUDIO_TIMER_00(g_model.timers[i].countdownBeep); AUDIO_TIMER_ELAPSED(i);
timerState->state = TMR_NEGATIVE; timerState->state = TMR_NEGATIVE;
// TRACE("Timer[%d] negative", i); // TRACE("Timer[%d] negative", i);
} }
@ -172,18 +172,7 @@ void evalTimers(int16_t throttle, uint8_t tick10ms)
timerState->val = newTimerVal; timerState->val = newTimerVal;
if (timerState->state == TMR_RUNNING) { if (timerState->state == TMR_RUNNING) {
if (g_model.timers[i].countdownBeep && g_model.timers[i].start) { if (g_model.timers[i].countdownBeep && g_model.timers[i].start) {
if (newTimerVal == 30) { AUDIO_TIMER_COUNTDOWN(i, newTimerVal);
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);
}
} }
if (g_model.timers[i].minuteBeep && (newTimerVal % 60)==0) { if (g_model.timers[i].minuteBeep && (newTimerVal % 60)==0) {
AUDIO_TIMER_MINUTE(newTimerVal); AUDIO_TIMER_MINUTE(newTimerVal);

View file

@ -599,6 +599,8 @@ const pm_char STR_MODEL_SELECT[] PROGMEM = TR_MODEL_SELECT;
const pm_char STR_ONLYPOSITIVE[] PROGMEM = TR_ONLYPOSITIVE; const pm_char STR_ONLYPOSITIVE[] PROGMEM = TR_ONLYPOSITIVE;
const pm_char STR_FILTER[] PROGMEM = TR_FILTER; const pm_char STR_FILTER[] PROGMEM = TR_FILTER;
const pm_char STR_TELEMETRYFULL[] PROGMEM = TR_TELEMETRYFULL; 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_INVERTED_SERIAL[] PROGMEM = TR_INVERTED_SERIAL;
const pm_char STR_IGNORE_INSTANCE[] PROGMEM = TR_IGNORE_INSTANCE; const pm_char STR_IGNORE_INSTANCE[] PROGMEM = TR_IGNORE_INSTANCE;
const pm_char STR_DISCOVER_SENSORS[] PROGMEM = TR_DISCOVER_SENSORS; const pm_char STR_DISCOVER_SENSORS[] PROGMEM = TR_DISCOVER_SENSORS;

View file

@ -861,6 +861,8 @@ extern const pm_char STR_BLCOLOR[];
extern const pm_char STR_ONLYPOSITIVE[]; extern const pm_char STR_ONLYPOSITIVE[];
extern const pm_char STR_FILTER[]; extern const pm_char STR_FILTER[];
extern const pm_char STR_TELEMETRYFULL[]; 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_INVERTED_SERIAL[];
extern const pm_char STR_IGNORE_INSTANCE[]; extern const pm_char STR_IGNORE_INSTANCE[];
extern const pm_char STR_DISCOVER_SENSORS[]; extern const pm_char STR_DISCOVER_SENSORS[];

View file

@ -1163,6 +1163,8 @@
#define TR_ONLYPOSITIVE "Jen kladné" #define TR_ONLYPOSITIVE "Jen kladné"
#define TR_FILTER "Filtr" #define TR_FILTER "Filtr"
#define TR_TELEMETRYFULL "Všechny sloty jsou plné!" #define TR_TELEMETRYFULL "Všechny sloty jsou plné!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
//TODO: translation //TODO: translation
#define TR_INVERTED_SERIAL INDENT "Invert" #define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignoruj chyby ID" #define TR_IGNORE_INSTANCE INDENT "Ignoruj chyby ID"

View file

@ -1167,6 +1167,8 @@
#define TR_ONLYPOSITIVE "Nur Positiv" #define TR_ONLYPOSITIVE "Nur Positiv"
#define TR_FILTER "Filter aktiv" #define TR_FILTER "Filter aktiv"
#define TR_TELEMETRYFULL "Telemetriezeilen voll!" #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_INVERTED_SERIAL INDENT "Invert."
#define TR_IGNORE_INSTANCE TR(INDENT "Keine ID", INDENT "Keine Multisen-ID") //unklar #define TR_IGNORE_INSTANCE TR(INDENT "Keine ID", INDENT "Keine Multisen-ID") //unklar
#define TR_DISCOVER_SENSORS INDENT "Start Sensorsuche" #define TR_DISCOVER_SENSORS INDENT "Start Sensorsuche"

View file

@ -1181,6 +1181,8 @@
#define TR_ONLYPOSITIVE "Positive" #define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter" #define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!" #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_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE TR(INDENT "No inst.", INDENT "Ignore instances") #define TR_IGNORE_INSTANCE TR(INDENT "No inst.", INDENT "Ignore instances")
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1127,6 +1127,8 @@
#define TR_ONLYPOSITIVE "Positive" #define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter" #define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!" #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_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignore instance" #define TR_IGNORE_INSTANCE INDENT "Ignore instance"
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1127,6 +1127,8 @@
#define TR_ONLYPOSITIVE "Positive" #define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter" #define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!" #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_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignore instance" #define TR_IGNORE_INSTANCE INDENT "Ignore instance"
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1154,6 +1154,8 @@
#define TR_ONLYPOSITIVE "Positive" #define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filtrage" #define TR_FILTER "Filtrage"
#define TR_TELEMETRYFULL "Plus de capteurs libres!" #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_INVERTED_SERIAL INDENT "Inverti"
#define TR_IGNORE_INSTANCE TR(INDENT "Ign. inst.", INDENT "Ignorer instance") #define TR_IGNORE_INSTANCE TR(INDENT "Ign. inst.", INDENT "Ignorer instance")
#define TR_DISCOVER_SENSORS INDENT "Découvrir capteurs" #define TR_DISCOVER_SENSORS INDENT "Découvrir capteurs"

View file

@ -1162,6 +1162,8 @@
#define TR_ONLYPOSITIVE "Positivo" #define TR_ONLYPOSITIVE "Positivo"
#define TR_FILTER "Filtro" #define TR_FILTER "Filtro"
#define TR_TELEMETRYFULL "Tutti gli slot sono pieni!" #define TR_TELEMETRYFULL "Tutti gli slot sono pieni!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
//TODO: translation //TODO: translation
#define TR_INVERTED_SERIAL INDENT "Invert" #define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE TR(INDENT "No inst.","Ignora instanza") #define TR_IGNORE_INSTANCE TR(INDENT "No inst.","Ignora instanza")

View file

@ -1176,6 +1176,8 @@
#define TR_ONLYPOSITIVE "Geen Negatief" #define TR_ONLYPOSITIVE "Geen Negatief"
#define TR_FILTER "Filter aktief" #define TR_FILTER "Filter aktief"
#define TR_TELEMETRYFULL "Telemetrie slots vol!" #define TR_TELEMETRYFULL "Telemetrie slots vol!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
//TODO: translation //TODO: translation
#define TR_INVERTED_SERIAL INDENT "Invert" #define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE TR(INDENT "Neg. ID ","Negeer ID's") #define TR_IGNORE_INSTANCE TR(INDENT "Neg. ID ","Negeer ID's")

View file

@ -1164,6 +1164,8 @@
#define TR_ONLYPOSITIVE "Dodatni" #define TR_ONLYPOSITIVE "Dodatni"
#define TR_FILTER "Filtr" #define TR_FILTER "Filtr"
#define TR_TELEMETRYFULL "Wszyskie miejsca zajęte!" #define TR_TELEMETRYFULL "Wszyskie miejsca zajęte!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
//TODO: translation //TODO: translation
#define TR_INVERTED SERIAL INDENT "Invert" #define TR_INVERTED SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignoruj przypadek" #define TR_IGNORE_INSTANCE INDENT "Ignoruj przypadek"

View file

@ -1123,6 +1123,8 @@
#define TR_ONLYPOSITIVE "Positive" #define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter" #define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!" #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_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignore instance" #define TR_IGNORE_INSTANCE INDENT "Ignore instance"
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors" #define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1178,6 +1178,8 @@
#define TR_ONLYPOSITIVE "Positiv" #define TR_ONLYPOSITIVE "Positiv"
#define TR_FILTER "Filter" #define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "Alla telemetriplatser upptagna!" #define TR_TELEMETRYFULL "Alla telemetriplatser upptagna!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
//TODO: translation //TODO: translation
#define TR_INVERTED_SERIAL INDENT "Invert" #define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE TR(INDENT "Inst.fel", INDENT "Hantera Instansfel") #define TR_IGNORE_INSTANCE TR(INDENT "Inst.fel", INDENT "Hantera Instansfel")

View file

@ -20,7 +20,7 @@
* *
*/ */
#include "../opentx.h" #include "opentx.h"
enum FrenchPrompts { enum FrenchPrompts {
FR_PROMPT_NUMBERS_BASE = 0, FR_PROMPT_NUMBERS_BASE = 0,

View file

@ -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))) systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 165 + i)))
for s, f, a in [(u"trim center", "midtrim", 495), for s, f, a in [(u"trim center", "midtrim", 495),
(u"maximum trim reached", "endtrim", NO_ALTERNATE), (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"transmitter battery low", "lowbatt", 485),
(u"inactivity alarm", "inactiv", 486), (u"inactivity alarm", "inactiv", 486),
(u"throttle warning", "thralert", 481), (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"trainer signal recovered", "trainok", NO_ALTERNATE),
(u"sensor lost", "sensorko", NO_ALTERNATE), (u"sensor lost", "sensorko", NO_ALTERNATE),
(u"servo overload", "servoko", NO_ALTERNATE), (u"servo overload", "servoko", NO_ALTERNATE),
(u"power overload", "rxko", NO_ALTERNATE),
]: ]:
systemSounds.append((s, filename(f, a))) systemSounds.append((s, filename(f, a)))
for i, (s, f) in enumerate([(u"gear!, up!", "gearup"), for i, (s, f) in enumerate([(u"gear!, up!", "gearup"),

View file

@ -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))) systemSounds.append((s, filename(PROMPT_SYSTEM_BASE + 180 + i)))
for s, f, a in [(u"Trim centré", "midtrim", 495), for s, f, a in [(u"Trim centré", "midtrim", 495),
(u"Trim maximum atteint", "endtrim", NO_ALTERNATE), (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"Batterie radio faible !", "lowbatt", 485),
(u"Radio inactive !", "inactiv", 486), (u"Radio inactive !", "inactiv", 486),
(u"Alerte manche des gaz", "thralert", 481), (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"Signal écolage retrouvé", "trainok", NO_ALTERNATE),
(u"Sonde de télémétrie perdue", "sensorko", NO_ALTERNATE), (u"Sonde de télémétrie perdue", "sensorko", NO_ALTERNATE),
(u"Servo en surcharge", "servoko", NO_ALTERNATE), (u"Servo en surcharge", "servoko", NO_ALTERNATE),
(u"Surcharge réception", "rxko", NO_ALTERNATE),
]: ]:
systemSounds.append((s, filename(f, a))) systemSounds.append((s, filename(f, a)))
for i, (s, f) in enumerate([(u"altitude", "altitude"), for i, (s, f) in enumerate([(u"altitude", "altitude"),