From fa4e1e4fc04fbed03dbccfdfd2f271eac53897e7 Mon Sep 17 00:00:00 2001 From: bsongis Date: Tue, 10 Jul 2012 13:37:55 +0000 Subject: [PATCH] No more alert for EEPROM overflow Trims buttons don't modify trim position on release [ersky9x] Audio stopped sometimes without reason --- src/eeprom_avr.cpp | 3 +- src/ersky9x/audio.cpp | 273 +++++++++++++++++++---------------- src/ersky9x/sound_driver.cpp | 28 ++-- src/main_views.cpp | 29 +++- src/menus.cpp | 6 +- src/menus.h | 2 + src/model_menus.cpp | 4 +- src/open9x.cpp | 50 +++++-- src/simpgmspace.h | 3 + src/translations/en.cpp | 20 ++- 10 files changed, 254 insertions(+), 164 deletions(-) diff --git a/src/eeprom_avr.cpp b/src/eeprom_avr.cpp index 38bdee5b7..6a05866b3 100644 --- a/src/eeprom_avr.cpp +++ b/src/eeprom_avr.cpp @@ -476,9 +476,10 @@ void RlcFile::nextWriteStep() } if (s_write_err == ERR_FULL) { - alert(STR_EEPROMWARN, STR_EEPROMOVERFLOW); + s_global_warning = STR_EEPROMOVERFLOW; m_write_step = 0; m_write_len = 0; + m_cur_rlc_len = 0; } if (!s_sync_write) diff --git a/src/ersky9x/audio.cpp b/src/ersky9x/audio.cpp index 3ea480177..6ac728032 100644 --- a/src/ersky9x/audio.cpp +++ b/src/ersky9x/audio.cpp @@ -157,7 +157,7 @@ extern uint16_t Sine_values[]; #define CODEC_ID_PCM_S16LE 1 #define CODEC_ID_PCM_ALAW 6 uint8_t pcmCodec; -uint16_t pcmFreq = 8000; +uint32_t pcmFreq = 8000; void audioTask(void* pdata) { @@ -183,119 +183,128 @@ void AudioQueue::wakeup() #endif if (prioIdx >= 0) { - ridx = prioIdx; - prioIdx = -1; - toneStop(); - nextAudioData = NULL; memset(¤t, 0, sizeof(current)); - if (state == AUDIO_PLAYING_WAV) { - state = AUDIO_RESUMING; - CoSetTmrCnt(audioTimer, 5/*10ms*/ + (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0); - CoStartTmr(audioTimer); - } - else if (state == AUDIO_PLAYING_TONE) { - state = AUDIO_RESUMING; - CoSetTmrCnt(audioTimer, 5/*10ms*/, 0); - CoStartTmr(audioTimer); - } - else { - CoSetFlag(audioFlag); - } + background.duration = 0; } + #if defined(SDCARD) && !defined(SIMU) - else if (current.file[0]) { - FRESULT result = FR_OK; - UINT read = 0; - if (current.file[1]) { - pcmFreq = 8000; - wavSamplesBuffer = wavSamplesArray; - result = f_open(&wavFile, current.file, FA_OPEN_EXISTING | FA_READ); - if (result == FR_OK) { - result = f_read(&wavFile, (uint8_t *)wavSamplesArray, WAV_HEADER_SIZE, &read); - if (result == FR_OK && read == WAV_HEADER_SIZE && !memcmp(wavSamplesArray, "RIFF", 4)) { - pcmCodec = wavSamplesArray[10]; - pcmFreq = wavSamplesArray[12]; - if (pcmCodec != CODEC_ID_PCM_S16LE) { - result = f_read(&wavFile, (uint8_t *)wavSamplesArray, 12, &read); + if (current.file[0]) { + if (!nextAudioData || DACC->DACC_ISR & DACC_ISR_TXBUFE) { + FRESULT result = FR_OK; + UINT read = 0; + if (current.file[1]) { + result = f_open(&wavFile, current.file, FA_OPEN_EXISTING | FA_READ); + current.file[1] = 0; + if (result == FR_OK) { + result = f_read(&wavFile, (uint8_t *) wavSamplesBuffer, + WAV_HEADER_SIZE, &read); + if (result == FR_OK && read == WAV_HEADER_SIZE + && !memcmp(wavSamplesBuffer, "RIFF", 4)) { + pcmCodec = wavSamplesBuffer[10]; + pcmFreq = wavSamplesBuffer[12]; + if (pcmCodec != CODEC_ID_PCM_S16LE) { + result = f_read(&wavFile, (uint8_t *) wavSamplesBuffer, 12, + &read); + } + setFrequency(pcmFreq); + } + else { + result = FR_DENIED; } } + } + + read = 0; + uint16_t bufsize = (pcmCodec == CODEC_ID_PCM_S16LE ? WAV_BUFFER_SIZE * sizeof(uint16_t) : WAV_BUFFER_SIZE); + if (result == FR_OK) { + result = f_read(&wavFile, (uint8_t *) wavSamplesBuffer, bufsize, &read); + } + + if (result != FR_OK) { + toneStop(); + current.file[0] = 0; + f_close(&wavFile); + CoSetTmrCnt(audioTimer, (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0); + CoClearFlag(audioFlag); + CoStartTmr(audioTimer); + state = AUDIO_RESUMING; + } + else { + if (read != bufsize) { + current.file[0] = 0; + f_close(&wavFile); + } + + if (pcmCodec == CODEC_ID_PCM_S16LE) { + read /= 2; + uint32_t i = 0; + for (; i < read; i++) + wavSamplesBuffer[i] = ((uint16_t) 0x8000 + ((int16_t) (wavSamplesBuffer[i]))) >> 4; + for (; i < WAV_BUFFER_SIZE; i++) + wavSamplesBuffer[i] = 0x8000; + } + else if (pcmCodec == CODEC_ID_PCM_ALAW) { + int32_t i; + for (i = read - 1; i >= 0; i--) + wavSamplesBuffer[i] = alawTable[((uint8_t *) wavSamplesBuffer)[i]]; + for (i = read; i < WAV_BUFFER_SIZE; i++) + wavSamplesBuffer[i] = 0x8000; + } + + read /= 2; + register Dacc *dacptr = DACC; + + if (read) { + state = AUDIO_PLAYING_WAV; + if (dacptr->DACC_ISR & DACC_ISR_TXBUFE) { + dacptr->DACC_TPR = CONVERT_PTR(wavSamplesBuffer); + dacptr->DACC_TCR = read; + nextAudioData = NULL; // TODO possible? + CoSetFlag(audioFlag); + } + else if (dacptr->DACC_TNCR == 0) { + dacptr->DACC_TNPR = CONVERT_PTR(wavSamplesBuffer); + dacptr->DACC_TNCR = read; + nextAudioData = NULL; // TODO possible? + CoSetFlag(audioFlag); + } + else { + nextAudioSize = read; + nextAudioData = wavSamplesBuffer; + toneStart(); + CoSetTmrCnt(audioTimer, (WAV_BUFFER_SIZE * 500) / pcmFreq, 0); + CoStartTmr(audioTimer); + } + + wavSamplesBuffer += WAV_BUFFER_SIZE; + if (wavSamplesBuffer >= wavSamplesArray + 3 * WAV_BUFFER_SIZE) + wavSamplesBuffer = wavSamplesArray; + } else { - result = FR_DENIED; - state = AUDIO_SLEEPING; - toneStop(); + CoSetFlag(audioFlag); } } } else { - wavSamplesBuffer += WAV_BUFFER_SIZE; - if (wavSamplesBuffer >= wavSamplesArray + 3*WAV_BUFFER_SIZE) - wavSamplesBuffer = wavSamplesArray; - } - - read = 0; - uint16_t bufsize = (pcmCodec == CODEC_ID_PCM_S16LE ? WAV_BUFFER_SIZE*sizeof(uint16_t) : WAV_BUFFER_SIZE); - if (result != FR_OK || f_read(&wavFile, (uint8_t *)wavSamplesBuffer, bufsize, &read) != FR_OK || read == 0) { - toneStop(); - current.file[0] = 0; - current.file[1] = 0; - f_close(&wavFile); - CoSetTmrCnt(audioTimer, (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0); + CoSetTmrCnt(audioTimer, 5/*10ms*/, 0); CoStartTmr(audioTimer); } - - if (pcmCodec == CODEC_ID_PCM_S16LE) { - read /= 2; - uint32_t i = 0; - for (; i> 4; - for (; i=0; i--) - wavSamplesBuffer[i] = alawTable[((uint8_t *)wavSamplesBuffer)[i]]; - for (i=read; iDACC_TPR = CONVERT_PTR(wavSamplesBuffer); - dacptr->DACC_TCR = read; - current.file[1] = 0; - CoSetFlag(audioFlag); - } - else if (read) { - if (dacptr->DACC_TNCR == 0) { - dacptr->DACC_TNPR = CONVERT_PTR(wavSamplesBuffer); - dacptr->DACC_TNCR = read; - CoSetFlag(audioFlag); - } - else { - nextAudioSize = read; - nextAudioData = wavSamplesBuffer; - toneStart(); - } - } } + else #endif - else if (current.duration > 0) { - if (state != AUDIO_PLAYING_TONE) { - state = AUDIO_PLAYING_TONE; - register Dacc *dacptr = DACC; - dacptr->DACC_TPR = CONVERT_PTR(Sine_values); - dacptr->DACC_TNPR = CONVERT_PTR(Sine_values); - dacptr->DACC_TCR = 50 ; // words, 100 16 bit values - dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values - } + if (current.duration > 0) { + state = AUDIO_PLAYING_TONE; + + register Dacc *dacptr = DACC; + dacptr->DACC_TPR = CONVERT_PTR(Sine_values); + dacptr->DACC_TNPR = CONVERT_PTR(Sine_values); + dacptr->DACC_TCR = 50 ; // words, 100 16 bit values + dacptr->DACC_TNCR = 50 ; // words, 100 16 bit values + setFrequency(current.freq * 6100 / 2); + if (current.freqIncr) { - CoSetTmrCnt(audioTimer, 5/*10ms*/, 0); + CoSetTmrCnt(audioTimer, 2, 0); current.freq += current.freqIncr; current.duration--; } @@ -304,6 +313,7 @@ void AudioQueue::wakeup() current.duration = 0; } toneStart(); + CoClearFlag(audioFlag); CoStartTmr(audioTimer); } else if (current.pause > 0) { @@ -311,16 +321,10 @@ void AudioQueue::wakeup() CoSetTmrCnt(audioTimer, current.pause*2, 0); current.pause = 0; toneStop(); + CoClearFlag(audioFlag); CoStartTmr(audioTimer); } - else if (ridx != widx) { - memcpy(¤t, &fragments[ridx], sizeof(current)); - if (!fragments[ridx].repeat--) { - ridx = (ridx + 1) % AUDIO_QUEUE_LENGTH; - } - CoSetFlag(audioFlag); - } - else if (background.duration > 0) { + else if (ridx == widx && prioIdx < 0 && background.duration > 0) { if (state != AUDIO_PLAYING_TONE) { state = AUDIO_PLAYING_TONE; register Dacc *dacptr = DACC; @@ -333,17 +337,49 @@ void AudioQueue::wakeup() background.duration = 0; setFrequency(background.freq * 6100 / 2); toneStart(); + CoClearFlag(audioFlag); CoStartTmr(audioTimer); } else { -#ifndef SIMU CoEnterMutexSection(audioMutex); -#endif - state = AUDIO_SLEEPING; -#ifndef SIMU + + if (ridx != widx) { + if (prioIdx >= 0) { + ridx = prioIdx; + prioIdx = -1; + toneStop(); + CoClearFlag(audioFlag); + nextAudioData = NULL; + memset(¤t, 0, sizeof(current)); + if (state == AUDIO_PLAYING_WAV) { + state = AUDIO_RESUMING; + CoSetTmrCnt(audioTimer, 1/*2ms*/ + (WAV_BUFFER_SIZE * 1000) / pcmFreq, 0); + CoStartTmr(audioTimer); + } + else if (state == AUDIO_PLAYING_TONE) { + state = AUDIO_RESUMING; + CoSetTmrCnt(audioTimer, 1/*2ms*/, 0); + CoStartTmr(audioTimer); + } + else { + CoSetFlag(audioFlag); + } + } + else { + CoSetFlag(audioFlag); + } + + memcpy(¤t, &fragments[ridx], sizeof(current)); + if (!fragments[ridx].repeat--) { + ridx = (ridx + 1) % AUDIO_QUEUE_LENGTH; + } + } + else { + state = AUDIO_SLEEPING; + toneStop(); + } + CoLeaveMutexSection(audioMutex); -#endif - toneStop(); } } @@ -370,9 +406,7 @@ extern OS_MutexID audioMutex; void AudioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlags, int8_t tFreqIncr) { -#ifndef SIMU CoEnterMutexSection(audioMutex); -#endif if (tFlags & PLAY_SOUND_VARIO) { background.freq = tFreq; @@ -408,19 +442,17 @@ void AudioQueue::play(uint8_t tFreq, uint8_t tLen, uint8_t tPause, uint8_t tFlag } } -#ifndef SIMU CoLeaveMutexSection(audioMutex); -#endif } void AudioQueue::playFile(const char *filename, uint8_t flags) { #ifdef SIMU - printf("playFile(\"%s\"\n", filename); fflush(stdout); -#else - CoEnterMutexSection(audioMutex); + printf("playFile(\"%s\")\n", filename); fflush(stdout); #endif + CoEnterMutexSection(audioMutex); + uint8_t next_widx = (widx + 1) % AUDIO_QUEUE_LENGTH; if (next_widx != ridx) { AudioFragment & fragment = fragments[widx]; @@ -436,9 +468,7 @@ void AudioQueue::playFile(const char *filename, uint8_t flags) } } -#ifndef SIMU CoLeaveMutexSection(audioMutex); -#endif } void audioEvent(uint8_t e, uint8_t f) @@ -640,5 +670,4 @@ void pushPrompt(uint16_t prompt) audioQueue.playFile(filename); #endif - } diff --git a/src/ersky9x/sound_driver.cpp b/src/ersky9x/sound_driver.cpp index 7fad878a4..e28f4318f 100644 --- a/src/ersky9x/sound_driver.cpp +++ b/src/ersky9x/sound_driver.cpp @@ -37,22 +37,22 @@ volatile uint8_t Buzzer_count ; // Must NOT be in flash, PDC needs a RAM source. +// Amplitude reduced to 30% to allow for voice volume uint16_t Sine_values[] = { -2048,2173,2298,2422,2545,2666,2784,2899,3011,3119, -3223,3322,3417,3505,3589,3666,3736,3800,3857,3907, -3950,3985,4012,4032,4044,4048,4044,4032,4012,3985, -3950,3907,3857,3800,3736,3666,3589,3505,3417,3322, -3223,3119,3011,2899,2784,2666,2545,2422,2298,2173, -2048,1922,1797,1673,1550,1429,1311,1196,1084, 976, - 872, 773, 678, 590, 506, 429, 359, 295, 238, 188, - 145, 110, 83, 63, 51, 48, 51, 63, 83, 110, - 145, 188, 238, 295, 359, 429, 506, 590, 678, 773, - 872, 976,1084,1196,1311,1429,1550,1673,1797,1922 -} ; + 2048,2085,2123,2160,2197,2233,2268,2303,2336,2369, + 2400,2430,2458,2485,2510,2533,2554,2573,2590,2605, + 2618,2629,2637,2643,2646,2648,2646,2643,2637,2629, + 2618,2605,2590,2573,2554,2533,2510,2485,2458,2430, + 2400,2369,2336,2303,2268,2233,2197,2160,2123,2085, + 2048,2010,1972,1935,1898,1862,1826,1792,1758,1726, + 1695,1665,1637,1610,1585,1562,1541,1522,1505,1490, + 1477,1466,1458,1452,1448,1448,1448,1452,1458,1466, + 1477,1490,1505,1522,1541,1562,1585,1610,1637,1665, + 1695,1726,1758,1792,1826,1862,1898,1935,1972,2010 +}; // Sound routines - void startSound() { register Pio *pioptr ; @@ -179,9 +179,6 @@ extern "C" void DAC_IRQHandler() DACC->DACC_TNPR = CONVERT_PTR(nextAudioData); DACC->DACC_TNCR = nextAudioSize; nextAudioData = NULL; - CoEnterISR(); // Enter the interrupt - CoSetFlag(audioFlag); - CoExitISR(); // Exit the interrupt } else { toneStop(); @@ -196,6 +193,7 @@ extern "C" void DAC_IRQHandler() void end_sound() { DACC->DACC_IDR = DACC_IDR_ENDTX ; + DACC->DACC_IDR = DACC_IDR_TXBUFE ; NVIC_DisableIRQ(DACC_IRQn) ; TWI0->TWI_IDR = TWI_IDR_TXCOMP ; NVIC_DisableIRQ(TWI0_IRQn) ; diff --git a/src/main_views.cpp b/src/main_views.cpp index 2a5fcfd5d..5832be35d 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -77,6 +77,11 @@ void menuMainView(uint8_t event) uint8_t view = g_eeGeneral.view; uint8_t view_base = view & 0x0f; + uint8_t _event = event; + if (s_global_warning) { + event = 0; + } + switch(event) { /* TODO if timer2 is OFF, it's possible to use this timer2 as in er9x... @@ -147,9 +152,12 @@ void menuMainView(uint8_t event) if(s_timerState[0]==TMR_BEEPING) { s_timerState[0] = TMR_STOPPED; } + else if (s_global_warning) { + s_global_warning = NULL; + } #if defined(ROTARY_ENCODERS) - else if (s_warning) { - s_warning = NULL; + else if (s_inflight_enable) { + s_inflight_enable = false; } #endif else if (view == e_timer2) { @@ -174,8 +182,8 @@ void menuMainView(uint8_t event) case EVT_KEY_LONG(BTN_REb): if (navigationRotaryEncoder(event)) { killEvents(event); - if (s_inflight_value && !s_warning) { - s_warning = s_inflight_label; + if (s_inflight_value && !s_inflight_enable) { + s_inflight_enable = true; s_editMode = 1; break; } @@ -183,7 +191,7 @@ void menuMainView(uint8_t event) // no break case EVT_KEY_BREAK(BTN_REa): case EVT_KEY_BREAK(BTN_REb): - s_warning = NULL; + s_inflight_enable = false; break; #endif } @@ -345,15 +353,24 @@ void menuMainView(uint8_t event) // lcd_outdezNAtt(33+11*FW, FH*6, s_timerVal_10ms[1], LEADING0, 2); // 1/100s } + if (s_global_warning) { + s_warning = s_global_warning; + displayWarning(_event); + if (!s_warning) s_global_warning = NULL; + s_warning = NULL; + } + #if defined(ROTARY_ENCODERS) check_rotary_encoder(); - if (s_warning) { + if (s_inflight_enable && !s_warning) { int8_t value = (((uint8_t)(*s_inflight_value)) >> s_inflight_bitshift) - s_inflight_shift; if (p1valdiff) { value = checkIncDecModel(event, value, s_inflight_min, s_inflight_max); *s_inflight_value = (((uint8_t)(*s_inflight_value)) & ((1 << s_inflight_bitshift) - 1)) + ((s_inflight_shift + value) << s_inflight_bitshift); } + s_warning = s_inflight_label; displayBox(); + s_warning = 0; lcd_outdezAtt(16, 4*FH, value, LEFT); } #endif diff --git a/src/menus.cpp b/src/menus.cpp index bf2f32604..3dd8d3efa 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -492,7 +492,7 @@ void popMenu() void chainMenu(MenuFuncP newMenu) { #if defined(ROTARY_ENCODERS) - s_warning = NULL; + s_inflight_enable = false; #endif g_menuStack[g_menuStackPtr] = newMenu; (*newMenu)(EVT_ENTRY); @@ -502,7 +502,7 @@ void chainMenu(MenuFuncP newMenu) void pushMenu(MenuFuncP newMenu) { #if defined(ROTARY_ENCODERS) - s_warning = NULL; + s_inflight_enable = false; #endif g_menuPos[g_menuStackPtr] = m_posVert; @@ -519,6 +519,7 @@ void pushMenu(MenuFuncP newMenu) (*newMenu)(EVT_ENTRY); } +const pm_char * s_global_warning = 0; const pm_char * s_warning = 0; const pm_char * s_warning_info; uint8_t s_warning_info_len; @@ -657,6 +658,7 @@ void drawStatusLine() #endif #if defined(ROTARY_ENCODERS) +bool s_inflight_enable = false; int8_t *s_inflight_value = NULL; int8_t s_inflight_min; int8_t s_inflight_max; diff --git a/src/menus.h b/src/menus.h index fe39a0cd3..f1984c42e 100644 --- a/src/menus.h +++ b/src/menus.h @@ -120,6 +120,7 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max); var = checkIncDecGen(event,var,min,max) #if defined(ROTARY_ENCODERS) +extern bool s_inflight_enable; extern int8_t *s_inflight_value; extern const pm_char *s_inflight_label; extern int8_t s_inflight_min; @@ -184,6 +185,7 @@ if (!check_submenu_simple(event,(lines_count)-1)) return; SIMPLE_SUBMENU_NOTITLE(lines_count); \ TITLE(title) +extern const pm_char * s_global_warning; extern const pm_char * s_warning; extern const pm_char * s_warning_info; extern uint8_t s_warning_info_len; diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 78a926612..731818acc 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -2305,7 +2305,7 @@ void menuProcFunctionSwitches(uint8_t event) break; } else if (sd->func == FUNC_PLAY_VALUE) { - val_max = NUM_XCHNPLAY; + val_max = NUM_XCHNPLAY-1; putsChnRaw(17*FW, y, val_displayed+1, attr); } #endif @@ -2320,7 +2320,7 @@ void menuProcFunctionSwitches(uint8_t event) lcd_outdezAtt(21*FW, y, val_displayed, attr); } else if (sd->func == FUNC_PLAY_VALUE) { - val_max = NUM_XCHNPLAY; + val_max = NUM_XCHNPLAY-1; putsChnRaw(17*FW, y, val_displayed+1, attr); } #endif diff --git a/src/open9x.cpp b/src/open9x.cpp index ff6abfa49..526a145fe 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -1084,12 +1084,12 @@ uint8_t checkTrim(uint8_t event) { int8_t k = (event & EVT_KEY_MASK) - TRM_BASE; int8_t s = g_model.trimInc; - if (k>=0 && k<8) { + if (k>=0 && k<8 && !IS_KEY_BREAK(event)) { #else void checkTrims() { uint8_t event = getEvent(true); - if (event) { + if (event && !IS_KEY_BREAK(event)) { int8_t k = (event & EVT_KEY_MASK) - TRM_BASE; int8_t s = g_model.trimInc; #endif @@ -1597,19 +1597,37 @@ void playValue(uint8_t idx) att |= PREC1; } } - playNumber(converted_value, UNIT_VOLTS, att); + playNumber(converted_value, 1+UNIT_VOLTS, att); break; } case NUM_XCHNRAW+TELEM_CELL-1: - playNumber(val, UNIT_VOLTS, PREC2); + playNumber(val, 1+UNIT_VOLTS, PREC2); + break; + + case NUM_XCHNRAW+TELEM_VFAS-1: + case NUM_XCHNRAW+TELEM_CELLS_SUM-1: + playNumber(val, 1+UNIT_VOLTS, PREC1); + break; + + case NUM_XCHNRAW+TELEM_CURRENT-1: + case NUM_XCHNRAW+TELEM_MAX_CURRENT-1: + playNumber(val, 1+UNIT_AMPS, PREC1); break; case NUM_XCHNRAW+TELEM_ACCx-1: case NUM_XCHNRAW+TELEM_ACCy-1: case NUM_XCHNRAW+TELEM_ACCz-1: case NUM_XCHNRAW+TELEM_VSPD-1: - playNumber(val, UNIT_RAW, PREC2); + playNumber(val, 0, PREC2); + break; + + case NUM_XCHNRAW+TELEM_CONSUMPTION-1: + playNumber(val, 1+UNIT_MAH); + break; + + case NUM_XCHNRAW+TELEM_POWER-1: + playNumber(val, 1+UNIT_WATTS); break; case NUM_XCHNRAW+TELEM_RSSI_TX-1: @@ -1617,27 +1635,35 @@ void playValue(uint8_t idx) playNumber(val); break; - #if defined(IMPERIAL_UNITS) +#if defined(IMPERIAL_UNITS) case NUM_XCHNRAW+TELEM_ALT-1: case NUM_XCHNRAW+TELEM_MIN_ALT-1: case NUM_XCHNRAW+TELEM_MAX_ALT-1: if (g_model.frsky.usrProto == USR_PROTO_WS_HOW_HIGH) { - playNumber(val, UNIT_FEET); + playNumber(val, 1+UNIT_FEET); break; } // no break - #endif +#endif default: { uint8_t unit; - if (idx >= NUM_XCHNRAW && idx <= NUM_XCHNRAW+TELEM_GPSALT-1) - unit = idx - NUM_XCHNRAW - 6; + if (idx >= NUM_XCHNRAW+TELEM_ALT-1 && idx <= NUM_XCHNRAW+TELEM_GPSALT-1) + unit = idx - (NUM_XCHNRAW+TELEM_ALT-1); else if (idx >= NUM_XCHNRAW+TELEM_MAX_T1-1 && idx <= NUM_XCHNRAW+TELEM_MAX_DIST-1) - unit = idx - NUM_XCHNRAW - 22; + unit = 3 + idx - (NUM_XCHNRAW+TELEM_MAX_T1-1); else unit = 1; - playNumber(val, pgm_read_byte(bchunit_ar+unit)); + unit = pgm_read_byte(bchunit_ar+unit); +#if !defined(IMPERIAL_UNITS) + if (unit == UNIT_KTS) { + // kts to km/h + unit = UNIT_KMH; + val = (val * 46) / 25; + } +#endif + playNumber(val, unit == UNIT_RAW ? 0 : unit+1); break; } } diff --git a/src/simpgmspace.h b/src/simpgmspace.h index 40dc00ca8..0c3634357 100644 --- a/src/simpgmspace.h +++ b/src/simpgmspace.h @@ -296,10 +296,13 @@ void eeprom_read_block (void *pointer_ram, #define board_init() #define CoSetFlag(...) +#define CoClearFlag(...) #define CoSetTmrCnt(...) #define CoEnterISR(...) #define CoExitISR(...) #define CoStartTmr(...) #define CoWaitForSingleFlag(...) +#define CoEnterMutexSection(...) +#define CoLeaveMutexSection(...) #endif diff --git a/src/translations/en.cpp b/src/translations/en.cpp index 3db316306..39516d94e 100644 --- a/src/translations/en.cpp +++ b/src/translations/en.cpp @@ -64,6 +64,10 @@ enum EnglishPrompts { PROMPT_DEGREES = PROMPT_UNITS_BASE+UNIT_DEGREES, PROMPT_PERCENT = PROMPT_UNITS_BASE+UNIT_PERCENT, PROMPT_MILLIAMPS = PROMPT_UNITS_BASE+UNIT_MILLIAMPS, + PROMPT_MAH = PROMPT_UNITS_BASE+UNIT_MAH, + PROMPT_WATTS = PROMPT_UNITS_BASE+UNIT_WATTS, + PROMPT_FEET = PROMPT_UNITS_BASE+UNIT_FEET, + PROMPT_KTS = PROMPT_UNITS_BASE+UNIT_KTS, }; #if defined(SOMO) || defined(PCBARM) @@ -79,27 +83,35 @@ void playNumber(int16_t number, uint8_t unit, uint8_t att) prompts.extend(self.getNumberPrompt(temp_digit)) prompts.append(Prompt(GUIDE_00_MILLION, dir=2)) */ + + if (number < 0) { + pushPrompt(PROMPT_MINUS); + number = -number; + } + if (number >= 1000) { playNumber(number / 1000); pushPrompt(PROMPT_THOUSAND); number %= 1000; if (number == 0) - return; + number = -1; } if (number >= 100) { pushPrompt(PROMPT_ZERO + number/100); pushPrompt(PROMPT_HUNDRED); number %= 100; if (number == 0) - return; + number = -1; } if (number >= 20) { pushPrompt(PROMPT_TWENTY + (number-20)/10); number %= 10; if (number == 0) - return; + number = -1; + } + if (number >= 0) { + pushPrompt(PROMPT_ZERO+number); } - pushPrompt(PROMPT_ZERO+number); if (unit) { pushPrompt(PROMPT_UNITS_BASE+unit-1);