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",
"lowbatt",
"inactiv",
"a1_org",
"a1_red",
"a2_org",
"a2_red",
"a3_org",
"a3_red",
"a4_org",
"a4_red",
"rssi_org",
"rssi_red",
"swr_red",
@ -156,20 +148,18 @@ const char * const audioFilenames[] = {
"trainok",
"sensorko",
"servoko",
"rxko",
#if defined(PCBSKY9X)
"highmah",
"hightemp",
#endif
"error",
"keyup", // TODO remove this one
"keydown", // TODO remove this one
"menus", // TODO remove this one
"trim", // TODO remove this one
"warning1",
"warning2",
"warning3",
"midtrim",
"endtrim",
"mintrim",
"maxtrim",
"midstck1",
"midstck2",
"midstck3",
@ -187,10 +177,9 @@ const char * const audioFilenames[] = {
"mixwarn1",
"mixwarn2",
"mixwarn3",
"timer00",
"timer10",
"timer20",
"timer30"
"timovr1",
"timovr2",
"timovr3"
};
uint64_t sdAvailableSystemAudioFiles = 0;
@ -505,13 +494,13 @@ void audioTask(void * pdata)
setSampleRate(AUDIO_SAMPLE_RATE);
#if !defined(EEPROM)
AUDIO_TADA();
AUDIO_HELLO();
#elif defined(SDCARD)
if (!unexpectedShutdown) {
#if defined(EEPROM)
sdInit();
#endif
AUDIO_TADA();
AUDIO_HELLO();
}
#endif
@ -995,25 +984,106 @@ void audioPlay(unsigned int index, uint8_t id)
}
}
void audioEvent(unsigned int index, unsigned int freq)
void audioKeyPress()
{
if (g_eeGeneral.beepMode == e_mode_all) {
audioQueue.playTone(BEEP_DEFAULT_FREQ, 40, 20, PLAY_NOW);
}
#if defined(HAPTIC)
if (g_eeGeneral.hapticMode == e_mode_all) {
haptic.play(5, 0, PLAY_NOW);
}
#endif
}
void audioKeyError()
{
if (g_eeGeneral.beepMode >= e_mode_nokeys) {
audioQueue.playTone(BEEP_DEFAULT_FREQ, 160, 20, PLAY_NOW);
}
#if defined(HAPTIC)
if (g_eeGeneral.hapticMode >= e_mode_nokeys) {
haptic.play(15, 3, PLAY_NOW);
}
#endif
}
void audioTrimPress(int value)
{
value = limit(TRIM_MIN, value, TRIM_MAX);
value <<= 3;
value += 120*16;
if (g_eeGeneral.beepMode >= e_mode_nokeys) {
audioQueue.playTone(value, 40, 20, PLAY_NOW);
}
}
void audioTimerCountdown(uint8_t timer, int value)
{
if (g_model.timers[timer].countdownBeep == COUNTDOWN_VOICE) {
if (value >= 0 && value <= TIMER_COUNTDOWN_START(timer)) {
playNumber(value, 0, 0, 0);
}
else if (value == 30 || value == 20) {
playDuration(value, 0, 0);
}
}
else if (g_model.timers[timer].countdownBeep == COUNTDOWN_BEEPS) {
if (value == 0) {
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 300, 20, PLAY_NOW);
}
else if (value > 0 && value <= TIMER_COUNTDOWN_START(timer)) {
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 100, 20, PLAY_NOW);
}
else if (value == 30) {
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(2));
}
else if (value == 20) {
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(1));
}
else if (value == 10) {
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_NOW);
}
}
#if defined(HAPTIC)
else if (g_model.timers[timer].countdownBeep == COUNTDOWN_HAPTIC) {
if (value == 0) {
haptic.play(15, 3, PLAY_NOW);
}
else if (value > 0 && value <= TIMER_COUNTDOWN_START(timer)) {
haptic.play(10, 0, PLAY_NOW);
}
else if (value == 30) {
haptic.play(10, 3, PLAY_REPEAT(2) | PLAY_NOW);
}
else if (value == 20) {
haptic.play(10, 3, PLAY_REPEAT(1) | PLAY_NOW);
}
else if (value == 10) {
haptic.play(10, 3, PLAY_NOW);
}
}
#endif
}
void audioEvent(unsigned int index)
{
if (index == AU_NONE)
return;
#if defined(HAPTIC)
if (index >= AU_THROTTLE_ALERT) {
haptic.event(index); // do this before audio to help sync timings
}
#endif
if (index <= AU_ERROR || (index >= AU_WARNING1 && index < AU_SPECIAL_SOUND_FIRST)) {
if (index <= AU_ERROR) {
if (g_eeGeneral.alarmsFlash) {
flashCounter = FLASH_DURATION;
}
}
if (g_eeGeneral.beepMode > 0 || (g_eeGeneral.beepMode == 0 && index >= AU_TRIM_MOVE) ||
(g_eeGeneral.beepMode >= -1 && index <= AU_ERROR)) {
if (g_eeGeneral.beepMode >= e_mode_nokeys || (g_eeGeneral.beepMode >= e_mode_alarms && index <= AU_ERROR)) {
#if defined(SDCARD)
char filename[AUDIO_FILENAME_MAXLEN + 1];
if (index < AU_SPECIAL_SOUND_FIRST && isAudioFileReferenced(index, filename)) {
@ -1038,23 +1108,14 @@ void audioEvent(unsigned int index, unsigned int freq)
case AU_ERROR:
audioQueue.playTone(BEEP_DEFAULT_FREQ, 200, 20, PLAY_NOW);
break;
case AU_KEYPAD_UP:
audioQueue.playTone(BEEP_KEY_UP_FREQ, 80, 20, PLAY_NOW);
break;
case AU_KEYPAD_DOWN:
audioQueue.playTone(BEEP_KEY_DOWN_FREQ, 80, 20, PLAY_NOW);
break;
case AU_MENUS:
audioQueue.playTone(BEEP_DEFAULT_FREQ, 80, 20, PLAY_NOW);
break;
case AU_TRIM_MOVE:
audioQueue.playTone(freq, 40, 20, PLAY_NOW);
break;
case AU_TRIM_MIDDLE:
audioQueue.playTone(freq, 80, 20, PLAY_NOW);
audioQueue.playTone(120*16, 80, 20, PLAY_NOW);
break;
case AU_TRIM_END:
audioQueue.playTone(freq, 80, 20, PLAY_NOW);
case AU_TRIM_MIN:
audioQueue.playTone(TRIM_MIN*8 + 120*16, 80, 20, PLAY_NOW);
break;
case AU_TRIM_MAX:
audioQueue.playTone(TRIM_MAX*8 + 120*16, 80, 20, PLAY_NOW);
break;
case AU_WARNING1:
audioQueue.playTone(BEEP_DEFAULT_FREQ, 80, 20, PLAY_NOW);
@ -1089,30 +1150,11 @@ void audioEvent(unsigned int index, unsigned int freq)
case AU_MIX_WARNING_3:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 1680, 48, 32, PLAY_REPEAT(2));
break;
case AU_TIMER_00:
case AU_TIMER1_ELAPSED:
case AU_TIMER2_ELAPSED:
case AU_TIMER3_ELAPSED:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 300, 20, PLAY_NOW);
break;
case AU_TIMER_LT10:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_NOW);
break;
case AU_TIMER_20:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(1) | PLAY_NOW);
break;
case AU_TIMER_30:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(2) | PLAY_NOW);
break;
case AU_A1_ORANGE:
case AU_A2_ORANGE:
case AU_A3_ORANGE:
case AU_A4_ORANGE:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 600, 200, 20, PLAY_NOW);
break;
case AU_A1_RED:
case AU_A2_RED:
case AU_A3_RED:
case AU_A4_RED:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 600, 200, 20, PLAY_REPEAT(1) | PLAY_NOW);
break;
case AU_RSSI_ORANGE:
audioQueue.playTone(BEEP_DEFAULT_FREQ + 1500, 800, 20, PLAY_NOW);
break;

View file

@ -284,7 +284,7 @@ enum {
};
void codecsInit();
void audioEvent(unsigned int index, unsigned int freq=BEEP_DEFAULT_FREQ);
void audioEvent(unsigned int index);
void audioPlay(unsigned int index, uint8_t id=0);
void audioStart();
@ -304,11 +304,16 @@ void audioStart();
#define AUDIO_TIMER_MINUTE(t) audioDefevent(AU_WARNING1)
#endif
#define AUDIO_TADA() audioPlay(AU_TADA)
void audioKeyPress();
void audioKeyError();
void audioTrimPress(int value);
void audioTimerCountdown(uint8_t timer, int value);
#define AUDIO_KEY_PRESS() audioKeyPress()
#define AUDIO_KEY_ERROR() audioKeyError()
#define AUDIO_HELLO() audioPlay(AUDIO_HELLO)
#define AUDIO_BYE() audioPlay(AU_BYE, ID_PLAY_BYE)
#define AUDIO_KEYPAD_UP() AUDIO_BUZZER(audioEvent(AU_KEYPAD_UP), beep(0))
#define AUDIO_KEYPAD_DOWN() AUDIO_BUZZER(audioEvent(AU_KEYPAD_DOWN), beep(0))
#define AUDIO_MENUS() AUDIO_BUZZER(audioEvent(AU_MENUS), beep(0))
#define AUDIO_WARNING1() AUDIO_BUZZER(audioEvent(AU_WARNING1), beep(3))
#define AUDIO_WARNING2() AUDIO_BUZZER(audioEvent(AU_WARNING2), beep(2))
#define AUDIO_TX_BATTERY_LOW() AUDIO_BUZZER(audioEvent(AU_TX_BATTERY_LOW), beep(4))
@ -317,33 +322,17 @@ void audioStart();
#define AUDIO_TX_TEMP_HIGH() audioEvent(AU_TX_TEMP_HIGH)
#endif
#define AUDIO_ERROR() AUDIO_BUZZER(audioEvent(AU_ERROR), beep(4))
#define AUDIO_TIMER_30() AUDIO_BUZZER(audioEvent(AU_TIMER_30), { beepAgain=2; beep(2); })
#define AUDIO_TIMER_20() AUDIO_BUZZER(audioEvent(AU_TIMER_20), { beepAgain=1; beep(2); })
#if defined(HAPTIC)
#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else if (m==COUNTDOWN_HAPTIC) haptic.event(AU_TIMER_LT10); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0)
#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else if (m==COUNTDOWN_HAPTIC) haptic.event(AU_TIMER_00); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0)
#else
#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0)
#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0)
#endif
#define AUDIO_TIMER_COUNTDOWN(idx, val) audioTimerCountdown(idx, val)
#define AUDIO_TIMER_ELAPSED(idx) AUDIO_BUZZER(audioEvent(AU_TIMER1_ELAPSED+idx), beep(3))
#define AUDIO_INACTIVITY() AUDIO_BUZZER(audioEvent(AU_INACTIVITY), beep(3))
#define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioEvent(AU_MIX_WARNING_1+x-1), beep(1))
#define AUDIO_POT_MIDDLE(x) AUDIO_BUZZER(audioEvent(AU_STICK1_MIDDLE+x), beep(2))
#define AUDIO_TRIM_MIDDLE(f) AUDIO_BUZZER(audioEvent(AU_TRIM_MIDDLE, f), beep(2))
#define AUDIO_TRIM_END(f) AUDIO_BUZZER(audioEvent(AU_TRIM_END, f), beep(2))
#define AUDIO_TRIM(event, f) AUDIO_BUZZER(audioEvent(AU_TRIM_MOVE, f), { if (!IS_KEY_FIRST(event)) warble = true; beep(1); })
#define AUDIO_TRIM_MIDDLE() AUDIO_BUZZER(audioEvent(AU_TRIM_MIDDLE), beep(2))
#define AUDIO_TRIM_MIN() AUDIO_BUZZER(audioEvent(AU_TRIM_MIN), beep(2))
#define AUDIO_TRIM_MAX() AUDIO_BUZZER(audioEvent(AU_TRIM_MAX), beep(2))
#define AUDIO_TRIM_PRESS(val) audioTrimPress(val)
#define AUDIO_PLAY(p) audioEvent(p)
#define AUDIO_VARIO(fq, t, p, f) audioQueue.playTone(fq, t, p, f)
#define AUDIO_A1_ORANGE() audioEvent(AU_A1_ORANGE)
#define AUDIO_A1_RED() audioEvent(AU_A1_RED)
#define AUDIO_A2_ORANGE() audioEvent(AU_A2_ORANGE)
#define AUDIO_A2_RED() audioEvent(AU_A2_RED)
#define AUDIO_A3_ORANGE() audioEvent(AU_A3_ORANGE)
#define AUDIO_A3_RED() audioEvent(AU_A3_RED)
#define AUDIO_A4_ORANGE() audioEvent(AU_A4_ORANGE)
#define AUDIO_A4_RED() audioEvent(AU_A4_RED)
#define AUDIO_RSSI_ORANGE() audioEvent(AU_RSSI_ORANGE)
#define AUDIO_RSSI_RED() audioEvent(AU_RSSI_RED)
#define AUDIO_SWR_RED() audioEvent(AU_SWR_RED)

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)
haptic.event(e); //do this before audio to help sync timings
@ -156,7 +156,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
}
}
if (g_eeGeneral.beepMode>0 || (g_eeGeneral.beepMode==0 && e>=AU_TRIM_MOVE) || (g_eeGeneral.beepMode>=-1 && e<=AU_ERROR)) {
if (g_eeGeneral.beepMode >= e_mode_nokeys || (g_eeGeneral.beepMode >= e_mode_alarms && e <= AU_ERROR)) {
if (e < AU_SPECIAL_SOUND_FIRST || empty()) {
// TODO when VOICE enable some cases here are not needed!
switch (e) {
@ -168,12 +168,6 @@ void audioQueue::event(uint8_t e, uint8_t f)
}
break;
#endif
case AU_TRIM_MOVE:
play(f, 6, 1, PLAY_NOW);
break;
case AU_TRIM_MIDDLE:
play(f, 10, 2, PLAY_NOW);
break;
case AU_SPECIAL_SOUND_RING:
play(BEEP_DEFAULT_FREQ+25, 5, 2, PLAY_REPEAT(10));
play(BEEP_DEFAULT_FREQ+25, 5, 10, PLAY_REPEAT(1));
@ -214,22 +208,14 @@ void audioQueue::event(uint8_t e, uint8_t f)
static const pm_uint8_t singleSounds[] PROGMEM = {
70, 10, 2, PLAY_REPEAT(2)|PLAY_NOW, // INACTIVITY
BEEP_DEFAULT_FREQ, 40, 1, PLAY_NOW, // ERROR
BEEP_KEY_UP_FREQ, 10, 1, PLAY_NOW, // KEYPAD_UP
BEEP_KEY_DOWN_FREQ, 10, 1, PLAY_NOW, // KEYPAD_DOWN
BEEP_DEFAULT_FREQ, 10, 2, PLAY_NOW, // MENUS
0,0,0,0, // TRIM_MOVE
BEEP_DEFAULT_FREQ, 10, 1, PLAY_NOW, // WARNING1
BEEP_DEFAULT_FREQ, 20, 1, PLAY_NOW, // WARNING2
BEEP_DEFAULT_FREQ, 30, 1, PLAY_NOW, // WARNING3
0,0,0,0, // TRIM_MIDDLE
60, 10, 2, PLAY_NOW, // TRIM_MIDDLE
BEEP_DEFAULT_FREQ + 50, 10, 1, PLAY_NOW, // POT_STICK_MIDDLE
BEEP_DEFAULT_FREQ + 50, 6, 0, 0, // MIX_WARNING_1
BEEP_DEFAULT_FREQ + 52, 6, 3, PLAY_REPEAT(1), // MIX_WARNING_2
BEEP_DEFAULT_FREQ + 54, 6, 3, PLAY_REPEAT(2), // MIX_WARNING_3
BEEP_DEFAULT_FREQ + 50, 30, 3, PLAY_NOW, // TIMER_00
BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_NOW, // TIMER_LT10
BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(1)|PLAY_NOW, // TIMER_20
BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(2)|PLAY_NOW, // TIMER_30
BEEP_DEFAULT_FREQ, 10, 1, 0, // FRSKY_BEEP1
BEEP_DEFAULT_FREQ, 20, 1, 0, // FRSKY_BEEP2
BEEP_DEFAULT_FREQ, 30, 1, 0, // FRSKY_BEEP3
@ -258,3 +244,85 @@ void audioDefevent(uint8_t e)
{
audio.event(e);
}
void audioKeyPress()
{
#if defined(AUDIO)
if (g_eeGeneral.beepMode == e_mode_all) {
audio.play(BEEP_DEFAULT_FREQ, 10, 1, PLAY_NOW);
}
#else
beep(0);
#endif
#if defined(HAPTIC)
if (g_eeGeneral.hapticMode == e_mode_all) {
haptic.play(5, 0, PLAY_NOW);
}
#endif
}
void audioTrimPress(int16_t value)
{
if (g_eeGeneral.beepMode >= e_mode_nokeys) {
#if defined(AUDIO)
value = limit(TRIM_MIN, value, TRIM_MAX);
value >>= 2;
value += 60;
audio.play(value, 6, 1, PLAY_NOW);
#else
warble = true;
beep(1);
#endif
}
}
void audioTimerCountdown(uint8_t timer, int value)
{
if (0) {
// pass
}
#if defined(CPUM2560)
if (g_model.timers[timer].countdownBeep == COUNTDOWN_VOICE) {
if (value >= 0 && value <= g_model.timers[timer].countdownStart) {
playNumber(value, 0, 0, 0);
}
else if (value == 30 || value == 20) {
playDuration(value, 0, 0);
}
}
#endif
#if defined(HAPTIC)
else if (g_model.timers[timer].countdownBeep == COUNTDOWN_HAPTIC) {
if (value == 0) {
haptic.play(15, 3, PLAY_NOW);
}
else if (value > 0 && value <= 10) {
haptic.play(5, 0, PLAY_NOW);
}
else if (value == 30) {
haptic.play(10, 3, PLAY_REPEAT(2) | PLAY_NOW);
}
else if (value == 20) {
haptic.play(10, 3, PLAY_REPEAT(1) | PLAY_NOW);
}
}
#endif
else {
if (value == 0) {
audio.play(BEEP_DEFAULT_FREQ + 50, 30, 3, PLAY_NOW);
}
else if (value > 0 && value <= 10) {
audio.play(BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_NOW);
}
else if (value == 30) {
audio.play(BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(2) | PLAY_NOW);
}
else if (value == 20) {
audio.play(BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(1) | PLAY_NOW);
}
}
}

View file

@ -30,8 +30,6 @@
#define AUDIO_QUEUE_LENGTH (8) // 8 seems to suit most alerts
#define BEEP_DEFAULT_FREQ (70)
#define BEEP_OFFSET (10)
#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+5)
#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-5)
class audioQueue
{
@ -44,7 +42,7 @@ class audioQueue
inline bool busy() { return (toneTimeLeft > 0); }
void event(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ);
void event(uint8_t e);
inline void driver() {
if (toneFreq) {
@ -109,29 +107,32 @@ void audioDefevent(uint8_t e);
#define VOICE_AUDIO_BUZZER(v, a, b) AUDIO_BUZZER(a, b)
#endif
#define AUDIO_KEYPAD_UP() AUDIO_BUZZER(audioDefevent(AU_KEYPAD_UP), beep(0))
#define AUDIO_KEYPAD_DOWN() AUDIO_BUZZER(audioDefevent(AU_KEYPAD_DOWN), beep(0))
#define AUDIO_MENUS() AUDIO_BUZZER(audioDefevent(AU_MENUS), beep(0))
#define AUDIO_KEY_PRESS() audioKeyPress()
#define AUDIO_KEY_ERROR() AUDIO_WARNING2()
#define AUDIO_WARNING1() AUDIO_BUZZER(audioDefevent(AU_WARNING1), beep(3))
#define AUDIO_WARNING2() AUDIO_BUZZER(audioDefevent(AU_WARNING2), beep(2))
#define AUDIO_ERROR() AUDIO_BUZZER(audioDefevent(AU_ERROR), beep(4))
#define AUDIO_TADA() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TADA),,)
#define AUDIO_HELLO() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AUDIO_HELLO),,)
#define AUDIO_BYE()
#define AUDIO_TX_BATTERY_LOW() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TX_BATTERY_LOW), audioDefevent(AU_TX_BATTERY_LOW), beep(4))
#define AUDIO_INACTIVITY() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_INACTIVITY), audioDefevent(AU_INACTIVITY), beep(3))
#define AUDIO_ERROR_MESSAGE(e) VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT((e)), audioDefevent(AU_ERROR), beep(4))
#define AUDIO_TIMER_MINUTE(t) VOICE_AUDIO_BUZZER(playDuration(t), audioDefevent(AU_WARNING1), beep(2))
#define AUDIO_TIMER_30() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_30), audioDefevent(AU_TIMER_30), { beepAgain=2; beep(2); })
#define AUDIO_TIMER_20() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); })
#define AUDIO_TIMER_LT10(m, x) AUDIO_BUZZER(audioDefevent(AU_TIMER_LT10), beep(2))
#define AUDIO_TIMER_00(m) AUDIO_BUZZER(audioDefevent(AU_TIMER_00), beep(3))
#define AUDIO_TIMER_COUNTDOWN(idx, val) audioTimerCountdown(idx, val)
#define AUDIO_TIMER_ELAPSED(idx) AUDIO_BUZZER(audioTimerCountdown(idx, 0), beep(3))
//#define AUDIO_TIMER_30() // VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_30), audioDefevent(AU_TIMER_30), { beepAgain=2; beep(2); })
//#define AUDIO_TIMER_20() // VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); })
//#define AUDIO_TIMER_LT10(m, x) // AUDIO_BUZZER(audioDefevent(AU_TIMER_LT10), beep(2))
//#define AUDIO_TIMER_00(m) // AUDIO_BUZZER(audioDefevent(AU_TIMER_00), beep(3))
#define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioDefevent(AU_MIX_WARNING_1+x-1), beep(1))
#define AUDIO_POT_MIDDLE() AUDIO_BUZZER(audioDefevent(AU_POT_MIDDLE), beep(2))
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
#define AUDIO_TRIM_MIDDLE(f) AUDIO_BUZZER(audio.event(AU_TRIM_MIDDLE, f), beep(2))
#define AUDIO_TRIM_END(f) AUDIO_BUZZER(audioDefevent(f), beep(2))
#define AUDIO_TRIM(event, f) AUDIO_BUZZER(audio.event(AU_TRIM_MOVE, f), { if (!IS_KEY_FIRST(event)) warble = true; beep(1); })
#define AUDIO_VARIO_UP() // audioDefevent(AU_KEYPAD_UP)
#define AUDIO_VARIO_DOWN() // audioDefevent(AU_KEYPAD_DOWN)
#define AUDIO_TRIM_MIDDLE() // AUDIO_BUZZER(audio.event(AU_TRIM_MIDDLE, f), beep(2))
#define AUDIO_TRIM_MIN() // AUDIO_BUZZER(audioDefevent(f), beep(2))
#define AUDIO_TRIM_MAX() // AUDIO_BUZZER(audioDefevent(f), beep(2))
#define AUDIO_TRIM_PRESS(val) audioTrimPress(val)
#define AUDIO_PLAY(p) audio.event(p)
#define AUDIO_VARIO(f, t) audio.play(f, t, 0, PLAY_BACKGROUND)

View file

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

View file

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

View file

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

View file

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

View file

@ -230,7 +230,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
}
if (sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), cfn->play.name)) {
popupMenuHandler = onCustomFunctionsFileSelectionMenu;
POPUP_MENU_START(onCustomFunctionsFileSelectionMenu);
}
else {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);

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_MOVE);
POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onExpoMixMenu;
POPUP_MENU_START(onExpoMixMenu);
}
#else
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_MOVE_MODEL);
}
popupMenuHandler = onModelSelectMenu;
POPUP_MENU_START(onModelSelectMenu);
#else
if (g_eeGeneral.currModel != 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_COPY);
POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onSensorMenu;
POPUP_MENU_START(onSensorMenu);
}
else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
pushMenu(menuModelSensor);

View file

@ -482,6 +482,7 @@ void displayWarning(uint8_t event);
#if defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64))
#define NAVIGATION_MENUS
#define POPUP_MENU_ADD_ITEM(s) popupMenuItems[popupMenuNoItems++] = s
#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0)
#define POPUP_MENU_MAX_LINES 6
#define MENU_MAX_DISPLAY_LINES POPUP_MENU_MAX_LINES
#if defined(SDCARD)

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details.
*/
#include "../../opentx.h"
#include "opentx.h"
vertpos_t menuVerticalOffset;
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) {
newval = val;
killEvents(event);
AUDIO_WARNING2();
}
else {
AUDIO_KEYPAD_UP();
AUDIO_KEY_ERROR();
}
}
else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) {
@ -132,10 +129,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
if (newval < i_min) {
newval = val;
killEvents(event);
AUDIO_WARNING2();
}
else {
AUDIO_KEYPAD_DOWN();
AUDIO_KEY_ERROR();
}
}
@ -175,20 +169,11 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
}
#endif
if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min);
killEvents(event);
AUDIO_WARNING2();
}
if (newval != val) {
if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) {
pauseEvents(event); // delay before auto-repeat continues
if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same
AUDIO_KEYPAD_UP();
else
AUDIO_KEYPAD_DOWN();
}
AUDIO_KEY_PRESS();
storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1);
}
@ -233,11 +218,9 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui
if (event==EVT_KEY_FIRST(KEY_RIGHT) || event==EVT_KEY_REPT(KEY_RIGHT) || (s_editMode>0 && (IS_ROTARY_RIGHT(event) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP)))) {
newval++;
AUDIO_KEYPAD_UP();
}
else if (event==EVT_KEY_FIRST(KEY_LEFT) || event==EVT_KEY_REPT(KEY_LEFT) || (s_editMode>0 && (IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN)))) {
newval--;
AUDIO_KEYPAD_DOWN();
}
if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) {
@ -279,16 +262,15 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui
if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min);
killEvents(event);
AUDIO_WARNING2();
AUDIO_KEY_ERROR();
}
if (newval != val) {
if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && (newval==0 || newval==-100 || newval==+100) && !IS_ROTARY_EVENT(event)) {
pauseEvents(event); // delay before auto-repeat continues
if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same
AUDIO_KEYPAD_UP();
else
AUDIO_KEYPAD_DOWN();
}
if (!IS_KEY_REPT(event)) {
AUDIO_KEY_PRESS();
}
storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1);
@ -507,6 +489,7 @@ void check(check_event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, ui
break;
case EVT_KEY_BREAK(KEY_EXIT):
AUDIO_KEY_PRESS();
#if defined(ROTARY_ENCODER_NAVIGATION)
if (s_editMode == 0)
s_editMode = EDIT_MODE_INIT;
@ -521,7 +504,6 @@ void check(check_event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, ui
popMenu(); // beeps itself
}
else {
AUDIO_MENUS();
l_posVert = 0;
l_posHorz = 0;
}

View file

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

View file

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

View file

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

View file

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

View file

@ -158,7 +158,7 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc
break;
}
}
popupMenuHandler = onCustomFunctionsMenu;
POPUP_MENU_START(onCustomFunctionsMenu);
}
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);
}
if (sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), cfn->play.name)) {
popupMenuHandler = onCustomFunctionsFileSelectionMenu;
POPUP_MENU_START(onCustomFunctionsFileSelectionMenu);
}
else {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);
@ -370,7 +370,7 @@ bool menuCustomFunctions(evt_t event, CustomFunctionData * functions, CustomFunc
POPUP_MENU_ADD_ITEM(STR_GLOBALVAR);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC)
POPUP_MENU_ADD_ITEM(STR_INCDEC);
popupMenuHandler = onAdjustGvarSourceLongEnterPress;
POPUP_MENU_START(onAdjustGvarSourceLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD;
}
}

View file

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

View file

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

View file

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

View file

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

View file

@ -96,7 +96,7 @@ bool menuModelLogicalSwitches(evt_t event)
POPUP_MENU_ADD_ITEM(STR_PASTE);
if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw)
POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onLogicalSwitchesMenu;
POPUP_MENU_START(onLogicalSwitchesMenu);
}
for (int i=0; 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_MOVE);
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) {
POPUP_MENU_ADD_ITEM(STR_DELETE_CATEGORY);
}
popupMenuHandler = onCategorySelectMenu;
POPUP_MENU_START(onCategorySelectMenu);
}
else if (selectMode == MODE_SELECT_MODEL) {
killEvents(event);
@ -212,7 +212,7 @@ bool menuModelSelect(evt_t event)
POPUP_MENU_ADD_ITEM(STR_DELETE_MODEL);
// POPUP_MENU_ADD_ITEM(STR_CREATE_MODEL);
// POPUP_MENU_ADD_ITEM(STR_RESTORE_MODEL);
popupMenuHandler = onModelSelectMenu;
POPUP_MENU_START(onModelSelectMenu);
}
break;
}

View file

@ -79,6 +79,7 @@ enum menuModelSetupItems {
};
#define MODEL_SETUP_2ND_COLUMN 200
#define MODEL_SETUP_3RD_COLUMN 270
#define MODEL_SETUP_BIND_OFS 40
#define MODEL_SETUP_RANGE_OFS 80
#define MODEL_SETUP_SET_FAILSAFE_OFS 100
@ -99,28 +100,28 @@ void onModelSetupBitmapMenu(const char *result)
void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event)
{
TimerData * timer = &g_model.timers[timerIdx];
TimerData & timer = g_model.timers[timerIdx];
if (attr && menuHorizontalPosition < 0) {
lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN-INVERT_HORZ_MARGIN, y-INVERT_VERT_MARGIN+1, 115+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR);
}
drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1);
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (menuHorizontalPosition<=0 ? attr : 0));
putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer->start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR));
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, (menuHorizontalPosition<=0 ? attr : 0));
putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer.start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR));
if (attr && s_editMode>0) {
switch (menuHorizontalPosition) {
case 0:
{
int8_t timerMode = timer->mode;
int8_t timerMode = timer.mode;
if (timerMode < 0) timerMode -= TMRMODE_COUNT-1;
CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers);
if (timerMode < 0) timerMode += TMRMODE_COUNT-1;
timer->mode = timerMode;
timer.mode = timerMode;
#if defined(AUTOSWITCH)
if (s_editMode>0) {
int8_t val = timer->mode - (TMRMODE_COUNT-1);
int8_t val = timer.mode - (TMRMODE_COUNT-1);
int8_t switchVal = checkIncDecMovedSwitch(val);
if (val != switchVal) {
timer->mode = switchVal + (TMRMODE_COUNT-1);
timer.mode = switchVal + (TMRMODE_COUNT-1);
storageDirty(EE_MODEL);
}
}
@ -130,13 +131,33 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, evt_t event)
case 1:
{
const int stopsMinutes[] = { 8, 60, 120, 180, 240, 300, 600, 900, 1200 };
timer->start = checkIncDec(event, timer->start, 0, 60*60, EE_MODEL, NULL, (const CheckIncDecStops&)stopsMinutes);
timer.start = checkIncDec(event, timer.start, 0, 60*60, EE_MODEL, NULL, (const CheckIncDecStops&)stopsMinutes);
break;
}
}
}
}
void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, evt_t event)
{
TimerData & timer = g_model.timers[timerIdx];
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, timer.countdownBeep, (menuHorizontalPosition == 0 ? attr : 0));
if (timer.countdownBeep != COUNTDOWN_SILENT) {
lcdDrawNumber(MODEL_SETUP_3RD_COLUMN, y, TIMER_COUNTDOWN_START(timerIdx), (menuHorizontalPosition == 1 ? attr : 0) | LEFT, 0, NULL, "s");
}
if (attr && s_editMode > 0) {
switch (menuHorizontalPosition) {
case 0:
CHECK_INCDEC_MODELVAR(event, timer.countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1);
break;
case 1:
timer.countdownStart = -checkIncDecModel(event, -timer.countdownStart, -1, +2);
break;
}
}
}
#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE))
int getSwitchWarningsCount()
@ -236,7 +257,7 @@ bool menuModelSetup(evt_t event)
if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
s_editMode = 0;
if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) {
popupMenuHandler = onModelSetupBitmapMenu;
POPUP_MENU_START(onModelSetupBitmapMenu);
}
else {
POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
@ -259,8 +280,7 @@ bool menuModelSetup(evt_t event)
break;
case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN);
g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, 0, 2, attr, event);
editTimerCountdown(0, y, attr, event);
break;
case ITEM_MODEL_TIMER1_PERSISTENT:
@ -284,8 +304,7 @@ bool menuModelSetup(evt_t event)
break;
case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN);
g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, 0, 2, attr, event);
editTimerCountdown(1, y, attr, event);
break;
case ITEM_MODEL_TIMER2_PERSISTENT:
@ -310,8 +329,7 @@ bool menuModelSetup(evt_t event)
break;
case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BEEPCOUNTDOWN);
g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, 0, 2, attr, event);
editTimerCountdown(2, y, attr, event);
break;
case ITEM_MODEL_TIMER3_PERSISTENT:
@ -556,9 +574,9 @@ bool menuModelSetup(evt_t event)
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, (menuHorizontalPosition==0 ? attr : 0));
if (IS_MODULE_XJT(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+70, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
else if (IS_MODULE_DSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+70, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
if (attr && s_editMode>0) {
switch (menuHorizontalPosition) {
case 0:

View file

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

View file

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

View file

@ -487,6 +487,7 @@ extern uint8_t warningInfoFlags;
#define NAVIGATION_MENUS
#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0)
#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0)
#define POPUP_MENU_MAX_LINES 12
#define MENU_MAX_DISPLAY_LINES 9
#define MENU_LINE_LENGTH (LEN_MODEL_NAME+12)

View file

@ -159,14 +159,9 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
newval++;
}
} while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max);
if (newval > i_max) {
newval = val;
killEvents(event);
AUDIO_WARNING2();
}
else {
AUDIO_KEYPAD_UP();
AUDIO_KEY_ERROR();
}
}
else if (s_editMode>0 && event==EVT_ROTARY_LEFT) {
@ -178,14 +173,9 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
newval--;
}
} while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min);
if (newval < i_min) {
newval = val;
killEvents(event);
AUDIO_WARNING2();
}
else {
AUDIO_KEYPAD_DOWN();
AUDIO_KEY_ERROR();
}
}
@ -219,27 +209,10 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
}
#endif
if (newval > i_max || newval < i_min) {
newval = (newval > i_max ? i_max : i_min);
killEvents(event);
AUDIO_WARNING2();
}
if (newval != val) {
#if 0
if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && stops.contains(newval) && !IS_ROTARY_EVENT(event)) {
bool pause = (newval > val ? !stops.contains(newval+1) : !stops.contains(newval-1));
if (pause) {
pauseEvents(event); // delay before auto-repeat continues
if (newval>val) // without AUDIO it's optimized, because the 2 sounds are the same
AUDIO_KEYPAD_UP();
else
AUDIO_KEYPAD_DOWN();
}
}
#endif
storageDirty(i_flags & (EE_GENERAL|EE_MODEL));
checkIncDec_Ret = (newval > val ? 1 : -1);
AUDIO_KEY_PRESS();
}
else {
checkIncDec_Ret = 0;
@ -285,7 +258,7 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
}
}
}
popupMenuHandler = onSourceLongEnterPress;
POPUP_MENU_START(onSourceLongEnterPress);
}
if (checkIncDecSelection != 0) {
newval = checkIncDecSelection;
@ -310,7 +283,7 @@ int checkIncDec(evt_t event, int val, int i_min, int i_max, unsigned int i_flags
}
if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER);
if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT);
popupMenuHandler = onSwitchLongEnterPress;
POPUP_MENU_START(onSwitchLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD;
}
if (checkIncDecSelection != 0) {
@ -450,15 +423,18 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
if (s_editMode > 1) break;
if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) {
menuHorizontalPosition = 0;
AUDIO_KEY_PRESS();
}
else if (READ_ONLY_UNLOCKED() && rowcount > 0) {
s_editMode = (s_editMode<=0);
AUDIO_KEY_PRESS();
}
break;
case EVT_KEY_FIRST(KEY_EXIT):
if (s_editMode > 0) {
s_editMode = 0;
AUDIO_KEY_PRESS();
break;
}
@ -468,6 +444,7 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
if (menuHorizontalPosition >= 0 && (COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) {
menuHorizontalPosition = -1;
AUDIO_KEY_PRESS();
}
else {
uint8_t posVertInit = MENU_FIRST_LINE_EDIT;
@ -475,6 +452,7 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
menuVerticalOffset = 0;
menuVerticalPosition = posVertInit;
menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition);
AUDIO_KEY_PRESS();
}
else if (!calibrationState) {
popMenu();
@ -483,6 +461,8 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
break;
case EVT_KEY_FIRST(KEY_RIGHT):
AUDIO_KEY_PRESS();
// no break
case EVT_KEY_REPT(KEY_RIGHT):
if (s_editMode == 0) {
INC(menuHorizontalPosition, 0, maxcol);
@ -490,6 +470,8 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
break;
case EVT_KEY_FIRST(KEY_LEFT):
AUDIO_KEY_PRESS();
// no break
case EVT_KEY_REPT(KEY_LEFT):
if (s_editMode == 0) {
DEC(menuHorizontalPosition, 0, maxcol);
@ -498,6 +480,7 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
case EVT_ROTARY_RIGHT:
if (s_editMode != 0) break;
AUDIO_KEY_PRESS();
if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) {
if (menuHorizontalPosition >= 0) {
INC(menuHorizontalPosition, 0, maxcol);
@ -512,10 +495,12 @@ bool check(check_event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, u
INC(menuVerticalPosition, MENU_FIRST_LINE_EDIT, rowcount-1);
} while (CURSOR_NOT_ALLOWED_IN_ROW(menuVerticalPosition));
menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition);
break;
case EVT_ROTARY_LEFT:
if (s_editMode != 0) break;
AUDIO_KEY_PRESS();
if ((COLATTR(menuVerticalPosition) & NAVIGATION_LINE_BY_LINE)) {
if (menuHorizontalPosition >= 0) {
DEC(menuHorizontalPosition, 0, maxcol);

View file

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

View file

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

View file

@ -35,7 +35,6 @@ bool menuStatsGraph(evt_t event)
storageDirty(EE_GENERAL);
sessionTimer = 0;
killEvents(event);
AUDIO_KEYPAD_UP();
break;
}
@ -107,7 +106,6 @@ bool menuStatsDebug(evt_t event)
maxLuaInterval = 0;
maxLuaDuration = 0;
#endif
AUDIO_KEYPAD_UP();
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) {
div_t qr2 = div(qr.quot, 60);
lcdDrawNumber(x, y, qr2.quot, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdLastPos, y, separator, att&att2);
lcdDrawChar(lcdLastPos, y, separator, att);
qr.quot = qr2.rem;
if (att & MIDSIZE)
x += 17;
@ -940,7 +940,9 @@ void displayGpsCoords(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFl
void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t value, LcdFlags att)
{
if (channel >= MAX_SENSORS) return; //Lua luaLcdDrawChannel() can call us with a bad value
if (channel >= MAX_SENSORS)
return; // Lua luaLcdDrawChannel() can call us with a bad value
TelemetryItem & telemetryItem = telemetryItems[channel];
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[channel];
if (telemetrySensor.unit == UNIT_DATETIME) {
@ -949,6 +951,52 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t va
else if (telemetrySensor.unit == UNIT_GPS) {
displayGpsCoords(x, y, telemetryItem, att);
}
else if (telemetrySensor.unit == UNIT_BITFIELD) {
if (IS_FRSKY_SPORT_PROTOCOL()) {
if (telemetrySensor.id >= RBOX_STATE_FIRST_ID && telemetrySensor.id <= RBOX_STATE_LAST_ID) {
if (telemetrySensor.subId == 0) {
if (value == 0) {
lcdDrawText(att & LEFT ? x : x-15, att & DBLSIZE ? y+1 : y, "OK");
}
else {
for (uint8_t i=0; i<16; i++) {
if (value & (1 << i)) {
drawStringWithIndex(att & LEFT ? x : x-40, att & DBLSIZE ? y+1 : y, "CH", i+1);
lcdDrawText(lcdLastPos+3, att & DBLSIZE ? y+1 : y, "KO");
break;
}
}
}
}
else {
if (value == 0) {
lcdDrawText(x, att & DBLSIZE ? y+1 : y, "Rx OK");
}
else {
static const char * const RXS_STATUS[] = {
"Rx1 Ovl",
"Rx2 Ovl",
"SBUS Ovl",
"Rx1 FS",
"Rx1 LF",
"Rx2 FS",
"Rx2 LF",
"Rx1 Lost",
"Rx2 Lost",
"Rx1 NS",
"Rx2 NS",
};
for (uint8_t i=0; i<DIM(RXS_STATUS); i++) {
if (value & (1<<i)) {
lcdDrawText(att & LEFT ? x : x-40, att & DBLSIZE ? y+1 : y, RXS_STATUS[i]);
break;
}
}
}
}
}
}
}
else {
LcdFlags flags = att;
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

View file

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

View file

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

View file

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

View file

@ -165,7 +165,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
break;
}
}
popupMenuHandler = onCustomFunctionsMenu;
POPUP_MENU_START(onCustomFunctionsMenu);
}
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);
}
if (sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), cfn->play.name)) {
popupMenuHandler = onCustomFunctionsFileSelectionMenu;
POPUP_MENU_START(onCustomFunctionsFileSelectionMenu);
}
else {
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);
@ -386,7 +386,7 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
POPUP_MENU_ADD_ITEM(STR_GLOBALVAR);
if (CFN_GVAR_MODE(cfn) != FUNC_ADJUST_GVAR_INCDEC)
POPUP_MENU_ADD_ITEM(STR_INCDEC);
popupMenuHandler = onAdjustGvarSourceLongEnterPress;
POPUP_MENU_START(onAdjustGvarSourceLongEnterPress);
s_editMode = EDIT_MODIFY_FIELD;
}
}

View file

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

View file

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

View file

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

View file

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

View file

@ -95,7 +95,7 @@ void menuModelLogicalSwitches(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_PASTE);
if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw)
POPUP_MENU_ADD_ITEM(STR_CLEAR);
popupMenuHandler = onLogicalSwitchesMenu;
POPUP_MENU_START(onLogicalSwitchesMenu);
}
for (int i=0; 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_MOVE);
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.
*/
#include "../../opentx.h"
#include "opentx.h"
#define MODELSIZE_POS_X 170
#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_MOVE_MODEL);
}
popupMenuHandler = onModelSelectMenu;
POPUP_MENU_START(onModelSelectMenu);
}
else if (eeModelExists(sub)) {
s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE);

View file

@ -94,6 +94,7 @@ enum menuModelSetupItems {
#define FIELD_PROTOCOL_MAX 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_RANGE_OFS 7*FW
#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)
{
TimerData * timer = &g_model.timers[timerIdx];
TimerData & timer = g_model.timers[timerIdx];
drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1);
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);
if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 11*FW, FH+1);
putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, menuHorizontalPosition==0 ? attr : 0);
putsTimer(MODEL_SETUP_3RD_COLUMN+5*FWNUM+2, y, timer.start, menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR, menuHorizontalPosition==2 ? attr|TIMEHOUR : TIMEHOUR);
if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 13*FW-3, FH+1);
if (attr && s_editMode>0) {
div_t qr = div(timer->start, 60);
div_t qr = div(timer.start, 60);
switch (menuHorizontalPosition) {
case 0:
{
swsrc_t timerMode = timer->mode;
swsrc_t timerMode = timer.mode;
if (timerMode < 0) timerMode -= TMRMODE_COUNT-1;
CHECK_INCDEC_MODELVAR_CHECK(event, timerMode, -TMRMODE_COUNT-SWSRC_LAST+1, TMRMODE_COUNT+SWSRC_LAST-1, isSwitchAvailableInTimers);
if (timerMode < 0) timerMode += TMRMODE_COUNT-1;
timer->mode = timerMode;
timer.mode = timerMode;
#if defined(AUTOSWITCH)
if (s_editMode>0) {
swsrc_t val = timer->mode - (TMRMODE_COUNT-1);
swsrc_t val = timer.mode - (TMRMODE_COUNT-1);
swsrc_t switchVal = checkIncDecMovedSwitch(val);
if (val != switchVal) {
timer->mode = switchVal + (TMRMODE_COUNT-1);
timer.mode = switchVal + (TMRMODE_COUNT-1);
storageDirty(EE_MODEL);
}
}
@ -152,13 +153,34 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event)
}
case 1:
qr.quot = checkIncDec(event, qr.quot, 0, 1439, EE_MODEL | NO_INCDEC_MARKS); // 23h59
timer->start = qr.rem + qr.quot*60;
timer.start = qr.rem + qr.quot*60;
break;
case 2:
qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2;
timer->start -= qr.rem ;
if ((int16_t)timer->start < 0) timer->start=0;
if ((int32_t)timer->start > 86399) timer->start=86399; // 23h59:59
timer.start -= qr.rem ;
if ((int16_t)timer.start < 0) timer.start=0;
if ((int32_t)timer.start > 86399) timer.start=86399; // 23h59:59
break;
}
}
}
void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, uint8_t event)
{
TimerData & timer = g_model.timers[timerIdx];
lcd_putsLeft(y, STR_BEEPCOUNTDOWN);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, timer.countdownBeep, (menuHorizontalPosition==0 ? attr : 0));
if (timer.countdownBeep != COUNTDOWN_SILENT) {
lcdDrawNumber(MODEL_SETUP_3RD_COLUMN, y, TIMER_COUNTDOWN_START(timerIdx), (menuHorizontalPosition == 1 ? attr : 0) | LEFT);
lcdDrawChar(lcdLastPos, y, 's');
}
if (attr && s_editMode>0) {
switch (menuHorizontalPosition) {
case 0:
CHECK_INCDEC_MODELVAR(event, timer.countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1);
break;
case 1:
timer.countdownStart = -checkIncDecModel(event, -timer.countdownStart, -1, +2);
break;
}
}
@ -202,7 +224,7 @@ int getSwitchWarningsCount()
#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW
#endif
#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x))
#define TIMER_ROWS 2|NAVIGATION_LINE_BY_LINE, 0, CASE_PERSISTENT_TIMERS(0) 0, 0
#define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0
#if defined(MULTIMODULE)
#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ)
@ -215,11 +237,11 @@ int getSwitchWarningsCount()
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
#if TIMERS == 1
#define TIMERS_ROWS TIMER_ROWS
#define TIMERS_ROWS TIMER_ROWS(0)
#elif TIMERS == 2
#define TIMERS_ROWS TIMER_ROWS, TIMER_ROWS
#define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1)
#elif TIMERS == 3
#define TIMERS_ROWS TIMER_ROWS, TIMER_ROWS, TIMER_ROWS
#define TIMERS_ROWS TIMER_ROWS(0), TIMER_ROWS(1), TIMER_ROWS(2)
#endif
#if defined(REV9E)
#define SW_WARN_ITEMS() uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)), uint8_t(getSwitchWarningsCount() > 8 ? TITLE_ROW : HIDDEN_ROW), uint8_t(getSwitchWarningsCount() > 16 ? TITLE_ROW : HIDDEN_ROW)
@ -303,7 +325,7 @@ void menuModelSetup(uint8_t event)
if (attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
s_editMode = 0;
if (sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), g_model.header.bitmap, LIST_NONE_SD_FILE)) {
popupMenuHandler = onModelSetupBitmapMenu;
POPUP_MENU_START(onModelSetupBitmapMenu);
}
else {
POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
@ -324,7 +346,7 @@ void menuModelSetup(uint8_t event)
break;
case ITEM_MODEL_TIMER1_COUNTDOWN_BEEP:
g_model.timers[0].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[0].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
editTimerCountdown(0, y, attr, event);
break;
case ITEM_MODEL_TIMER1_PERSISTENT:
@ -345,7 +367,7 @@ void menuModelSetup(uint8_t event)
break;
case ITEM_MODEL_TIMER2_COUNTDOWN_BEEP:
g_model.timers[1].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[1].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
editTimerCountdown(1, y, attr, event);
break;
case ITEM_MODEL_TIMER2_PERSISTENT:
@ -367,7 +389,7 @@ void menuModelSetup(uint8_t event)
break;
case ITEM_MODEL_TIMER3_COUNTDOWN_BEEP:
g_model.timers[2].countdownBeep = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, STR_VBEEPCOUNTDOWN, g_model.timers[2].countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT-1, attr, event);
editTimerCountdown(2, y, attr, event);
break;
case ITEM_MODEL_TIMER3_PERSISTENT:
@ -635,7 +657,7 @@ void menuModelSetup(uint8_t event)
lcd_putsLeft(y, STR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0);
if (IS_MODULE_XJT(INTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[INTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
if (attr && s_editMode>0) {
switch (menuHorizontalPosition) {
case 0:
@ -683,13 +705,13 @@ void menuModelSetup(uint8_t event)
lcd_putsLeft(y, STR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_TARANIS_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].type, menuHorizontalPosition==0 ? attr : 0);
if (IS_MODULE_XJT(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_XJT_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
else if (IS_MODULE_DSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
#if defined(MULTIMODULE)
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
int8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
switch(multi_rfProto) {
case MM_RF_PROTO_FLYSKY:
@ -955,10 +977,11 @@ void menuModelSetup(uint8_t event)
}
if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) {
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
if (attr)
if (attr) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
}
}
}
#endif
break;
}

View file

@ -499,7 +499,7 @@ void menuModelTelemetry(uint8_t event)
POPUP_MENU_ADD_ITEM(STR_EDIT);
POPUP_MENU_ADD_ITEM(STR_COPY);
POPUP_MENU_ADD_ITEM(STR_DELETE);
popupMenuHandler = onSensorMenu;
POPUP_MENU_START(onSensorMenu);
}
else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
pushMenu(menuModelSensor);
@ -670,7 +670,7 @@ void menuModelTelemetry(uint8_t event)
if (menuHorizontalPosition==1 && attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) {
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)) {
popupMenuHandler = onTelemetryScriptFileSelectionMenu;
POPUP_MENU_START(onTelemetryScriptFileSelectionMenu);
}
else {
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);

View file

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

View file

@ -408,6 +408,7 @@ extern uint8_t warningInfoFlags;
#define NAVIGATION_MENUS
#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0)
#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0)
#define POPUP_MENU_MAX_LINES 12
#define MENU_MAX_DISPLAY_LINES 6
#define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s)

View file

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

View file

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

View file

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

View file

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

View file

@ -94,15 +94,11 @@ void hapticQueue::play(uint8_t tLen, uint8_t tPause, uint8_t tFlags)
void hapticQueue::event(uint8_t e)
{
if (g_eeGeneral.hapticMode>0 || (g_eeGeneral.hapticMode==0 && e>=AU_WARNING1) || (g_eeGeneral.hapticMode>=-1 && e<=AU_ERROR)) {
if (g_eeGeneral.hapticMode >= e_mode_nokeys || (g_eeGeneral.hapticMode >= e_mode_alarms && e <= AU_ERROR)) {
if (e <= AU_ERROR)
play(15, 3, PLAY_NOW);
else if (e <= AU_TRIM_MOVE)
play(5, 0, PLAY_NOW);
else if (e <= AU_TIMER_LT10)
else if (e <= AU_MIX_WARNING_3)
play(15, 3, PLAY_NOW);
else if (e < AU_SPECIAL_SOUND_FIRST)
play(15, 3, (e-AU_TIMER_20+1)|PLAY_NOW);
else if (e >= AU_SPECIAL_SOUND_LAST && empty()) {
play(30, 10, 0);
play(10, 50-10*(e-AU_SPECIAL_SOUND_LAST), (e-AU_SPECIAL_SOUND_LAST));

View file

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

View file

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

View file

@ -455,6 +455,12 @@ enum SwashType {
#define IS_MANUAL_RESET_TIMER(idx) 0
#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 {
PROTO_PPM,
#if !defined(CPUARM)

View file

@ -19,7 +19,6 @@
*/
#include "opentx.h"
#include "timers.h"
RadioData g_eeGeneral;
ModelData g_model;
@ -1014,17 +1013,15 @@ void doSplash()
#endif
if (SPLASH_NEEDED()) {
#if !defined(PCBTARANIS) && !defined(PCBHORUS)
drawSplash();
#endif
#if !defined(CPUARM)
AUDIO_TADA();
AUDIO_HELLO();
#endif
#if defined(PCBSTD)
lcdSetContrast();
#elif !defined(PCBHORUS) && !defined(PCBTARANIS)
#elif defined(PCBSKY9X)
tmr10ms_t curTime = get_tmr10ms() + 10;
uint8_t contrast = 10;
lcdSetRefVolt(contrast);
@ -1074,7 +1071,7 @@ void doSplash()
}
#endif
#if !defined(PCBHORUS) && !defined(PCBTARANIS) && !defined(PCBSTD)
#if defined(PCBSKY9X)
if (curTime < get_tmr10ms()) {
curTime += 10;
if (contrast < g_eeGeneral.contrast) {
@ -1372,16 +1369,22 @@ uint8_t checkTrim(uint8_t event)
int8_t v = (trimInc==-1) ? min(32, abs(before)/4+1) : (1 << trimInc); // TODO flash saving if (trimInc < 0)
if (thro) v = 4; // if throttle trim and trim trottle then step=4
int16_t after = (k&1) ? before + v : before - v; // positive = k&1
#if defined(CPUARM)
uint8_t beepTrim = 0;
#else
bool beepTrim = false;
#endif
for (int16_t mark=TRIM_MIN; mark<=TRIM_MAX; mark+=TRIM_MAX) {
if ((mark!=0 || !thro) && ((mark!=TRIM_MIN && after>=mark && before<mark) || (mark!=TRIM_MAX && after<=mark && before>mark))) {
after = mark;
beepTrim = (mark == 0 ? 1 : 2);
if (!thro && after==0 && before!=0) {
beepTrim = true;
AUDIO_TRIM_MIDDLE();
pauseEvents(event);
}
else if (before>TRIM_MIN && after<=TRIM_MIN) {
beepTrim = true;
AUDIO_TRIM_MIN();
killEvents(event);
}
else if (before<TRIM_MAX && after>=TRIM_MAX) {
beepTrim = true;
AUDIO_TRIM_MAX();
killEvents(event);
}
if ((before<after && after>TRIM_MAX) || (before>after && after<TRIM_MIN)) {
@ -1412,35 +1415,10 @@ uint8_t checkTrim(uint8_t event)
#endif
}
#if defined(AUDIO)
// toneFreq higher/lower according to trim position
// 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) {
AUDIO_TRIM_PRESS(after);
}
if (beepTrim) {
if (beepTrim == 1) {
AUDIO_TRIM_MIDDLE(after);
pauseEvents(event);
}
else {
AUDIO_TRIM_END(after);
killEvents(event);
}
}
else {
AUDIO_TRIM(event, after);
}
#if !defined(CPUARM)
return 0;
#endif
@ -1632,9 +1610,9 @@ uint8_t trimsDisplayTimer = 0;
uint8_t trimsDisplayMask = 0;
#endif
void flightReset()
void flightReset(uint8_t check)
{
// we don't reset the whole audio here (the tada.wav would be cut, if a prompt is queued before FlightReset, it should be played)
// we don't reset the whole audio here (the hello.wav would be cut, if a prompt is queued before FlightReset, it should be played)
// TODO check if the vario / background music are stopped correctly if switching to a model which doesn't have these functions enabled
if (!IS_MANUAL_RESET_TIMER(0)) {
@ -1662,6 +1640,12 @@ void flightReset()
START_SILENCE_PERIOD();
RESET_THR_TRACE();
logicalSwitchesReset();
if (check) {
checkAll();
}
}
#if defined(THRTRACE)

View file

@ -897,7 +897,7 @@ extern uint8_t trimsDisplayTimer;
extern uint8_t trimsDisplayMask;
#endif
void flightReset();
void flightReset(uint8_t check=true);
extern uint8_t unexpectedShutdown;
@ -1326,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 */
enum AUDIO_SOUNDS {
AU_TADA,
AUDIO_HELLO,
#if defined(CPUARM)
AU_BYE,
#endif
@ -1338,14 +1338,6 @@ enum AUDIO_SOUNDS {
AU_TX_BATTERY_LOW,
AU_INACTIVITY,
#if defined(CPUARM)
AU_A1_ORANGE,
AU_A1_RED,
AU_A2_ORANGE,
AU_A2_RED,
AU_A3_ORANGE,
AU_A3_RED,
AU_A4_ORANGE,
AU_A4_RED,
AU_RSSI_ORANGE,
AU_RSSI_RED,
AU_SWR_RED,
@ -1355,37 +1347,33 @@ enum AUDIO_SOUNDS {
AU_TRAINER_BACK,
AU_SENSOR_LOST,
AU_SERVO_KO,
AU_RX_OVERLOAD,
#endif
#if defined(PCBSKY9X)
AU_TX_MAH_HIGH,
AU_TX_TEMP_HIGH,
#endif
AU_ERROR,
AU_KEYPAD_UP,
AU_KEYPAD_DOWN,
AU_MENUS,
AU_TRIM_MOVE,
AU_WARNING1,
AU_WARNING2,
AU_WARNING3,
AU_TRIM_MIDDLE,
#if defined(CPUARM)
AU_TRIM_END,
AU_TRIM_MIN,
AU_TRIM_MAX,
#endif
#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS)
#if defined(CPUARM)
AU_STICK1_MIDDLE,
AU_STICK2_MIDDLE,
AU_STICK3_MIDDLE,
AU_STICK4_MIDDLE,
#endif
#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS)
AU_POT1_MIDDLE,
AU_POT2_MIDDLE,
AU_SLIDER1_MIDDLE,
AU_SLIDER2_MIDDLE,
#elif defined(CPUARM)
AU_STICK1_MIDDLE,
AU_STICK2_MIDDLE,
AU_STICK3_MIDDLE,
AU_STICK4_MIDDLE,
AU_POT1_MIDDLE,
AU_POT2_MIDDLE,
AU_POT3_MIDDLE,
@ -1395,10 +1383,11 @@ enum AUDIO_SOUNDS {
AU_MIX_WARNING_1,
AU_MIX_WARNING_2,
AU_MIX_WARNING_3,
AU_TIMER_00,
AU_TIMER_LT10,
AU_TIMER_20,
AU_TIMER_30,
#if defined(CPUARM)
AU_TIMER1_ELAPSED,
AU_TIMER2_ELAPSED,
AU_TIMER3_ELAPSED,
#endif
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->minuteBeep = src->minuteBeep;
dest->persistent = src->persistent;
dest->spare = src->spare;
dest->countdownStart = src->countdownStart;
}
template <class A, class B>
@ -192,6 +192,7 @@ void copyModuleData(A * dest, B * src)
dest->channelsStart = src->channelsStart;
dest->channelsCount = src->channelsCount;
dest->failsafeMode = src->failsafeMode;
dest->subType = src->subType;
dest->invertedSerial = src->invertedSerial;
memcpy(dest->failsafeChannels, src->failsafeChannels, sizeof(dest->failsafeChannels));
copyModuleData_ppm(&dest->ppm, &src->ppm);
@ -344,3 +345,4 @@ void copyModuleData_ppm(A * dest, B * src)
dest->outputType = src->outputType;
dest->frameLength = src->frameLength;
}

View file

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

View file

@ -18,7 +18,7 @@
* GNU General Public License for more details.
*/
#include "../../opentx.h"
#include "opentx.h"
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_CNSP_FIRST_ID, RBOX_CNSP_LAST_ID, 0, ZSTR_BATT1_CONSUMPTION, UNIT_MAH, 0 },
{ RBOX_CNSP_FIRST_ID, RBOX_CNSP_LAST_ID, 1, ZSTR_BATT2_CONSUMPTION, UNIT_MAH, 0 },
{ RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 0, ZSTR_CHANS_STATE, UNIT_RAW, 0 },
{ RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 1, ZSTR_RB_STATE, UNIT_RAW, 0 },
{ RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 0, ZSTR_CHANS_STATE, UNIT_BITFIELD, 0 },
{ RBOX_STATE_FIRST_ID, RBOX_STATE_LAST_ID, 1, ZSTR_RB_STATE, UNIT_BITFIELD, 0 },
{ 0, 0, 0, NULL, UNIT_RAW, 0 } // sentinel
};
@ -299,11 +299,15 @@ void processSportPacket(uint8_t * packet)
}
else if (id >= RBOX_STATE_FIRST_ID && id <= RBOX_STATE_LAST_ID) {
uint16_t newServosState = data & 0xffff;
if (servosState == 0 && newServosState != 0) {
if (newServosState != 0 && servosState == 0) {
audioEvent(AU_SERVO_KO);
}
uint16_t newRboxState = data >> 16;
if ((newRboxState & 0x07) && (rboxState & 0x07) == 0) {
audioEvent(AU_RX_OVERLOAD);
}
servosState = newServosState;
rboxState = data >> 16;
rboxState = newRboxState;
processSportPacket(id, 0, instance, servosState);
processSportPacket(id, 1, instance, rboxState);
}

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)
{
memset(g_model.timers[0], 0, sizeof(g_model.timers[0]));
g_model.timers[0].mode = mode;
g_model.timers[0].start = start;
g_model.timers[0].countdownBeep = COUNTDOWN_SILENT;
g_model.timers[0].minuteBeep = 0;
g_model.timers[0].spare = 0;
#if defined(CPUARM) || defined(CPUM2560)
g_model.timers[0].persistent = 0;
g_model.timers[0].value = 0;
#endif
}
/*

View file

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

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_FILTER[] PROGMEM = TR_FILTER;
const pm_char STR_TELEMETRYFULL[] PROGMEM = TR_TELEMETRYFULL;
const pm_char STR_SERVOS_OK[] PROGMEM = TR_SERVOS_OK;
const pm_char STR_SERVOS_KO[] PROGMEM = TR_SERVOS_KO;
const pm_char STR_INVERTED_SERIAL[] PROGMEM = TR_INVERTED_SERIAL;
const pm_char STR_IGNORE_INSTANCE[] PROGMEM = TR_IGNORE_INSTANCE;
const pm_char STR_DISCOVER_SENSORS[] PROGMEM = TR_DISCOVER_SENSORS;

View file

@ -861,6 +861,8 @@ extern const pm_char STR_BLCOLOR[];
extern const pm_char STR_ONLYPOSITIVE[];
extern const pm_char STR_FILTER[];
extern const pm_char STR_TELEMETRYFULL[];
extern const pm_char STR_SERVOS_OK[];
extern const pm_char STR_SERVOS_KO[];
extern const pm_char STR_INVERTED_SERIAL[];
extern const pm_char STR_IGNORE_INSTANCE[];
extern const pm_char STR_DISCOVER_SENSORS[];

View file

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

View file

@ -1167,6 +1167,8 @@
#define TR_ONLYPOSITIVE "Nur Positiv"
#define TR_FILTER "Filter aktiv"
#define TR_TELEMETRYFULL "Telemetriezeilen voll!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
#define TR_INVERTED_SERIAL INDENT "Invert."
#define TR_IGNORE_INSTANCE TR(INDENT "Keine ID", INDENT "Keine Multisen-ID") //unklar
#define TR_DISCOVER_SENSORS INDENT "Start Sensorsuche"

View file

@ -1181,6 +1181,8 @@
#define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
#define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE TR(INDENT "No inst.", INDENT "Ignore instances")
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1127,6 +1127,8 @@
#define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
#define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignore instance"
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1127,6 +1127,8 @@
#define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
#define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignore instance"
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

@ -1154,6 +1154,8 @@
#define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filtrage"
#define TR_TELEMETRYFULL "Plus de capteurs libres!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
#define TR_INVERTED_SERIAL INDENT "Inverti"
#define TR_IGNORE_INSTANCE TR(INDENT "Ign. inst.", INDENT "Ignorer instance")
#define TR_DISCOVER_SENSORS INDENT "Découvrir capteurs"

View file

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

View file

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

View file

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

View file

@ -1123,6 +1123,8 @@
#define TR_ONLYPOSITIVE "Positive"
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_SERVOS_OK "Servos OK"
#define TR_SERVOS_KO "Servos KO"
#define TR_INVERTED_SERIAL INDENT "Invert"
#define TR_IGNORE_INSTANCE INDENT "Ignore instance"
#define TR_DISCOVER_SENSORS INDENT "Discover new sensors"

View file

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

View file

@ -20,7 +20,7 @@
*
*/
#include "../opentx.h"
#include "opentx.h"
enum FrenchPrompts {
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)))
for s, f, a in [(u"trim center", "midtrim", 495),
(u"maximum trim reached", "endtrim", NO_ALTERNATE),
(u"timer 1 elapsed", "timovr1", NO_ALTERNATE),
(u"timer 2 elapsed", "timovr2", NO_ALTERNATE),
(u"timer 3 elapsed", "timovr3", NO_ALTERNATE),
(u"transmitter battery low", "lowbatt", 485),
(u"inactivity alarm", "inactiv", 486),
(u"throttle warning", "thralert", 481),
@ -62,6 +65,7 @@ for s, f, a in [(u"trim center", "midtrim", 495),
(u"trainer signal recovered", "trainok", NO_ALTERNATE),
(u"sensor lost", "sensorko", NO_ALTERNATE),
(u"servo overload", "servoko", NO_ALTERNATE),
(u"power overload", "rxko", NO_ALTERNATE),
]:
systemSounds.append((s, filename(f, a)))
for i, (s, f) in enumerate([(u"gear!, up!", "gearup"),

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