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

open9x translations

This commit is contained in:
bsongis 2012-01-18 20:24:15 +00:00
parent 40d418c007
commit 9cdf70f9d8
16 changed files with 903 additions and 282 deletions

View file

@ -393,7 +393,7 @@ void RlcFile::nextWriteStep()
}
if (s_write_err == ERR_FULL) {
alert(PSTR("EEPROM overflow"));
alert(STR_EEPROMOVERFLOW);
m_write_step = 0;
m_write_len = 0;
}

View file

@ -67,7 +67,7 @@ void menuProcSetup(uint8_t event)
#undef PARAM_OFS
#define PARAM_OFS 17*FW
SIMPLE_MENU("RADIO SETUP", menuTabDiag, e_Setup, COUNT_ITEMS+1);
SIMPLE_MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, COUNT_ITEMS+1);
int8_t sub = m_posVert;
@ -78,14 +78,14 @@ void menuProcSetup(uint8_t event)
uint8_t subN = 1;
if(s_pgOfs<subN) {
lcd_puts_P(0, y,PSTR("Beeper"));
lcd_putsnAtt(PARAM_OFS - FW, y, STR_BEEPER+LEN_BEEPER*g_eeGeneral.beeperVal, LEN_BEEPER, (sub==subN ? INVERS:0));
lcd_puts_P(0, y, STR_BEEPER);
lcd_putsnAtt(PARAM_OFS - FW, y, STR_VBEEPER+LEN_VBEEPER*g_eeGeneral.beeperVal, LEN_VBEEPER, (sub==subN ? INVERS:0));
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.beeperVal, 0, 4);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y,PSTR("Contrast"));
lcd_puts_P(0, y, STR_CONTRAST);
lcd_outdezAtt(PARAM_OFS,y,g_eeGeneral.contrast,(sub==subN ? INVERS : 0)|LEFT);
if(sub==subN) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.contrast, 10, 45);
@ -95,14 +95,14 @@ void menuProcSetup(uint8_t event)
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y,PSTR("Battery warning"));
lcd_puts_P(0, y,STR_BATTERYWARNING);
putsVolts(PARAM_OFS, y, g_eeGeneral.vBatWarn, (sub==subN ? INVERS : 0)|LEFT);
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y,PSTR("Inactivity alarm"));
lcd_puts_P(0, y,STR_INACTIVITYALARM);
lcd_outdezAtt(PARAM_OFS, y, g_eeGeneral.inactivityTimer, (sub==subN ? INVERS : 0)|LEFT);
lcd_putc(lcd_lastPos, y, 'm');
if(sub==subN) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes
@ -110,49 +110,49 @@ void menuProcSetup(uint8_t event)
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y,PSTR("Filter ADC"));
lcd_puts_P(0, y,STR_FILTERADC);
lcd_putsnAtt(PARAM_OFS, y, STR_ADCFILTER+LEN_ADCFILTER*g_eeGeneral.filterInput, LEN_ADCFILTER, (sub==subN ? INVERS:0));
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.filterInput, 0, 2);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y,PSTR("Throttle reverse"));
lcd_puts_P(0, y,STR_THROTTLEREVERSE);
menu_lcd_onoff( PARAM_OFS, y, g_eeGeneral.throttleReversed, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.throttleReversed, 0, 1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Minute beep"));
lcd_puts_P(0, y, STR_MINUTEBEEP);
menu_lcd_onoff( PARAM_OFS, y, g_eeGeneral.minuteBeep, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.minuteBeep, 0, 1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Beep countdown"));
lcd_puts_P(0, y, STR_BEEPCOUNTDOWN);
menu_lcd_onoff( PARAM_OFS, y, g_eeGeneral.preBeep, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.preBeep, 0, 1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Flash on beep"));
lcd_puts_P(0, y, STR_FLASHONBEEP);
menu_lcd_onoff( PARAM_OFS, y, g_eeGeneral.flashBeep, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.flashBeep, 0, 1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Light switch"));
lcd_puts_P(0, y, STR_LIGHTSWITCH);
putsSwitches(PARAM_OFS,y,g_eeGeneral.lightSw,sub==subN ? INVERS : 0);
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightSw, -MAX_SWITCH, MAX_SWITCH);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Light off after"));
lcd_puts_P(0, y, STR_LIGHTOFFAFTER);
if(g_eeGeneral.lightAutoOff) {
lcd_outdezAtt(PARAM_OFS, y, g_eeGeneral.lightAutoOff*5,LEFT|(sub==subN ? INVERS : 0));
lcd_putc(lcd_lastPos, y, 's');
@ -167,7 +167,7 @@ void menuProcSetup(uint8_t event)
#ifdef SPLASH
if(s_pgOfs<subN) {
uint8_t b = 1-g_eeGeneral.disableSplashScreen;
lcd_puts_P(0, y,PSTR("Splash screen"));
lcd_puts_P(0, y,STR_SPLASHSCREEN);
menu_lcd_onoff( PARAM_OFS, y, b, sub==subN ) ;
if(sub==subN)
{
@ -180,7 +180,7 @@ void menuProcSetup(uint8_t event)
if(s_pgOfs<subN) {
uint8_t b = 1-g_eeGeneral.disableThrottleWarning;
lcd_puts_P(0, y,PSTR("Throttle Warning"));
lcd_puts_P(0, y,STR_THROTTLEWARNING);
menu_lcd_onoff( PARAM_OFS, y, b, sub==subN ) ;
if(sub==subN)
{
@ -191,7 +191,7 @@ void menuProcSetup(uint8_t event)
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Switch Warning"));
lcd_puts_P(0, y, STR_SWITCHWARNING);
lcd_putsnAtt(PARAM_OFS, y, STR_WARNSW+LEN_WARNSW*(1+g_eeGeneral.switchWarning), LEN_WARNSW, (sub==subN ? INVERS:0));
if(sub==subN) CHECK_INCDEC_GENVAR(event, g_eeGeneral.switchWarning, -1, 1);
if((y+=FH)>7*FH) return;
@ -199,7 +199,7 @@ void menuProcSetup(uint8_t event)
if(s_pgOfs<subN) {
uint8_t b = 1-g_eeGeneral.disableMemoryWarning;
lcd_puts_P(0, y, PSTR("Memory Warning"));
lcd_puts_P(0, y, STR_MEMORYWARNING);
menu_lcd_onoff( PARAM_OFS, y, b, sub==subN ) ;
if(sub==subN)
{
@ -211,7 +211,7 @@ void menuProcSetup(uint8_t event)
if(s_pgOfs<subN) {
uint8_t b = 1-g_eeGeneral.disableAlarmWarning;
lcd_puts_P(0, y,PSTR("Alarm Warning"));
lcd_puts_P(0, y,STR_ALARMWARNING);
menu_lcd_onoff( PARAM_OFS, y, b, sub==subN ) ;
if(sub==subN)
{
@ -223,7 +223,7 @@ void menuProcSetup(uint8_t event)
if(s_pgOfs<subN) {
uint8_t b = g_eeGeneral.enableTelemetryAlarm;
lcd_puts_P(0, y,PSTR("NO DATA Alarm"));
lcd_puts_P(0, y,STR_NODATAALARM);
menu_lcd_onoff( PARAM_OFS, y, b, sub==subN ) ;
if(sub==subN)
{
@ -235,7 +235,7 @@ void menuProcSetup(uint8_t event)
if(s_pgOfs<subN) {
uint8_t attr = sub==subN?INVERS:0;
lcd_puts_P(0, y,PSTR("Rx Channel Ord"));// RAET->AETR
lcd_puts_P(0, y,STR_RXCHANNELORD);// RAET->AETR
for (uint8_t i=1; i<=4; i++)
putsChnLetter((16+i)*FW, y, CHANNEL_ORDER(i), attr);
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23);
@ -243,7 +243,7 @@ void menuProcSetup(uint8_t event)
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 1*FW, y, PSTR("Mode"));
lcd_puts_P( 1*FW, y, STR_MODE2); // TODO STR_MODE would save flash
if(y<7*FH) {for(uint8_t i=0; i<4; i++) lcd_img((6+4*i)*FW, y, sticks,i,0); }
if((y+=FH)>7*FH) return;
@ -260,7 +260,7 @@ void menuProcSetup(uint8_t event)
// SD card interface contains Real-Time-Clock chip
void menuProcTime(uint8_t event)
{
MENU("DATE AND TIME", menuTabDiag, e_FrskyTime, 3, {0, 2/*, 2*/});
MENU(STR_MENUDATEANDTIME, menuTabDiag, e_FrskyTime, 3, {0, 2/*, 2*/});
int8_t sub = m_posVert - 1; // vertical position (1 = page counter, top/right)
uint8_t subSub = m_posHorz; // horizontal position
@ -354,7 +354,7 @@ void menuProcTime(uint8_t event)
void menuProcTrainer(uint8_t event)
{
MENU("TRAINER", menuTabDiag, e_Trainer, 7, {0, 2, 2, 2, 2, 0/*, 0*/});
MENU(STR_MENUTRAINER, menuTabDiag, e_Trainer, 7, {0, 2, 2, 2, 2, 0/*, 0*/});
int8_t sub = m_posVert;
uint8_t subSub = m_posHorz;
@ -363,11 +363,11 @@ void menuProcTrainer(uint8_t event)
uint8_t blink ;
if (SLAVE_MODE) { // i am the slave
lcd_puts_P(7*FW, 3*FH, PSTR("Slave"));
lcd_puts_P(7*FW, 3*FH, STR_SLAVE);
return;
}
lcd_puts_P(3*FW, 1*FH, PSTR("mode % src"));
lcd_puts_P(3*FW, 1*FH, STR_MODESRC);
sub--;
y = 2*FH;
@ -400,13 +400,13 @@ void menuProcTrainer(uint8_t event)
y += FH;
}
lcd_puts_P(0*FW, y, PSTR("Multiplier"));
lcd_puts_P(0*FW, y, STR_MULTIPLIER);
lcd_outdezAtt(13*FW, y, g_eeGeneral.PPM_Multiplier+10, (sub==4 ? INVERS : 0)|PREC1);
if(sub==4) CHECK_INCDEC_GENVAR(event, g_eeGeneral.PPM_Multiplier, -10, 40);
y += FH;
edit = (sub==5);
lcd_putsAtt(0*FW, y, PSTR("Cal"), edit ? INVERS : 0);
lcd_putsAtt(0*FW, y, STR_CAL, edit ? INVERS : 0);
for (uint8_t i=0; i<4; i++) {
uint8_t x = (i*8+16)*FW/2;
#if defined (DECIMALS_DISPLAYED)
@ -427,20 +427,20 @@ void menuProcTrainer(uint8_t event)
void menuProcDiagVers(uint8_t event)
{
SIMPLE_MENU("VERSION", menuTabDiag, e_Vers, 1);
SIMPLE_MENU(STR_MENUVERSION, menuTabDiag, e_Vers, 1);
lcd_puts_P(0, 2*FH,stamp4 );
lcd_puts_P(0, 3*FH,stamp1 );
lcd_puts_P(0, 4*FH,stamp5 );
lcd_puts_P(0, 5*FH,stamp2 );
lcd_puts_P(0, 6*FH,stamp3 );
lcd_puts_P(0, 7*FH,PSTR("EEPROM v"));
lcd_puts_P(0, 7*FH,STR_EEPROMV);
lcd_outdezAtt(8*FW, 7*FH, g_eeGeneral.myVers, LEFT);
}
void menuProcDiagKeys(uint8_t event)
{
SIMPLE_MENU("DIAG", menuTabDiag, e_Keys, 1);
SIMPLE_MENU(STR_MENUDIAG, menuTabDiag, e_Keys, 1);
for(uint8_t i=0; i<9; i++)
{
@ -455,19 +455,19 @@ void menuProcDiagKeys(uint8_t event)
{
uint8_t y=(5-i)*FH+2*FH;
bool t=keyState((EnumKeys)(KEY_MENU+i));
lcd_putsn_P(0, y, PSTR(" Menu Exit Down UpRight Left")+5*i, 5);
lcd_putsn_P(0, y, STR_VKEYS+LEN_VKEYS*i, LEN_VKEYS);
lcd_putcAtt(5*FW+2, y, t+'0', t);
}
#if defined (PCBV4)
for(uint8_t i=0; i<2; i++) {
uint8_t y = i*FH + FH;
lcd_putsn_P(14*FW, y, PSTR("RE1RE2")+3*i, 3);
lcd_putsn_P(14*FW, y, STR_RE1RE2+LEN_RE1RE2*i, LEN_RE1RE2);
lcd_outdezNAtt(18*FW, y, g_rotenc[i], LEFT|(keyState((EnumKeys)(BTN_RE1+i)) ? INVERS : 0));
}
#endif
lcd_putsn_P(14*FW, 3*FH, PSTR("Trim- +"), 7);
lcd_puts_P(14*FW, 3*FH, STR_VTRIM);
for(uint8_t i=0; i<4; i++)
{
uint8_t y=i*FH+FH*4;
@ -481,14 +481,14 @@ void menuProcDiagKeys(uint8_t event)
void menuProcDiagAna(uint8_t event)
{
SIMPLE_MENU("ANA", menuTabDiag, e_Ana, 2);
SIMPLE_MENU(STR_MENUANA, menuTabDiag, e_Ana, 2);
int8_t sub = m_posVert ;
for(uint8_t i=0; i<8; i++)
{
uint8_t y=i*FH;
lcd_putsn_P( 4*FW, y,PSTR("A1A2A3A4A5A6A7A8")+2*i,2);
putsStrIdx(4*FW, y, PSTR("A"), i+1);
lcd_outhex4( 8*FW, y, anaIn(i));
if(i<7)
lcd_outdez8(17*FW, y, (int32_t)calibratedStick[i]*100/1024);
@ -498,7 +498,7 @@ void menuProcDiagAna(uint8_t event)
// lcd_outdezAtt( 21*FW, 3*FH, g_eeGeneral.vBatCalib, 0) ;
// lcd_outdezAtt( 21*FW, 4*FH, abRunningAvg, 0) ;
// Display raw BandGap result (debug)
lcd_putsn_P( 19*FW, 5*FH,PSTR("BG"),2) ;
lcd_puts_P( 19*FW, 5*FH, STR_BG) ;
lcd_outdezAtt(21*FW, 6*FH, BandGap, 0);
lcd_outdezAtt(21*FW, 7*FH, anaIn(7)*35/512, PREC1);
@ -506,11 +506,9 @@ void menuProcDiagAna(uint8_t event)
}
const prog_char APM menuWhenDone[] = " [MENU] WHEN DONE ";
void menuProcDiagCalib(uint8_t event)
{
SIMPLE_MENU("CALIBRATION", menuTabDiag, e_Calib, 1);
SIMPLE_MENU(STR_MENUCALIBRATION, menuTabDiag, e_Calib, 1);
static int16_t midVals[7];
static int16_t loVals[7];
@ -546,14 +544,14 @@ void menuProcDiagCalib(uint8_t event)
case 0:
// START CALIBRATION
// [MENU]
lcd_putsAtt(2*FW, 3*FH, PSTR(" [MENU] TO START "), 0);
lcd_puts_P(2*FW, 3*FH, STR_MENUTOSTART);
break;
case 1:
// SET MIDPOINT
// [MENU]
lcd_putsAtt(2*FW, 2*FH, PSTR(" SET MIDPOINT "), s_noScroll ? INVERS : 0);
lcd_putsnAtt(2*FW, 3*FH, menuWhenDone, 18, 0);
lcd_putsAtt(2*FW, 2*FH, STR_SETMIDPOINT, s_noScroll ? INVERS : 0);
lcd_puts_P(2*FW, 3*FH, STR_MENUWHENDONE);
for (uint8_t i=0; i<7; i++) {
loVals[i] = 15000;
@ -565,8 +563,8 @@ void menuProcDiagCalib(uint8_t event)
case 2:
// MOVE STICKS/POTS
// [MENU]
lcd_putsAtt(2*FW, 2*FH, PSTR(" MOVE STICKS/POTS "), s_noScroll ? INVERS : 0);
lcd_putsAtt(2*FW, 3*FH, menuWhenDone, 0);
lcd_putsAtt(2*FW, 2*FH, STR_MOVESTICKSPOTS, s_noScroll ? INVERS : 0);
lcd_puts_P(2*FW, 3*FH, STR_MENUWHENDONE);
for (uint8_t i=0; i<7; i++) {
if (abs(loVals[i]-hiVals[i])>50) {

View file

@ -59,12 +59,6 @@ bool warble = false;
uint8_t heartbeat;
// TODO reduce these tabs
const prog_char APM modi12x3[]=
"RUD ELE THR AIL "
"RUD THR ELE AIL "
"AIL ELE THR RUD "
"AIL THR ELE RUD ";
const prog_char APM s_charTab[] = "_-.,";
//R=1
@ -560,17 +554,17 @@ void checkLowEEPROM()
if(g_eeGeneral.disableMemoryWarning) return;
if(EeFsGetFree() < 200)
{
alert(PSTR("EEPROM low mem"));
alert(STR_EEPROMLOWMEM);
}
}
void alertMessages( const prog_char * s, const prog_char * t )
{
lcd_clear();
lcd_putsAtt(64-5*FW,0*FH,PSTR("ALERT"),DBLSIZE);
lcd_putsAtt(64-5*FW,0*FH,STR_ALERT,DBLSIZE);
lcd_puts_P(0,4*FH,s);
lcd_puts_P(0,5*FH,t);
lcd_puts_P(0,6*FH, PSTR("Press any key to skip") ) ;
lcd_puts_P(0,6*FH, STR_PRESSANYKEYTOSKIP ) ;
refreshDisplay();
lcdSetRefVolt(g_eeGeneral.contrast);
@ -592,7 +586,7 @@ void checkTHR()
if(v<=lowLim) return;
// first - display warning
alertMessages( PSTR("Throttle not idle"), PSTR("Reset throttle") ) ;
alertMessages( STR_THROTTLENOTIDLE, STR_RESETTHROTTLE ) ;
//loop until all switches are reset
while (1)
@ -620,7 +614,7 @@ void checkTHR()
void checkAlarm() // added by Gohst
{
if(g_eeGeneral.disableAlarmWarning) return;
if(!g_eeGeneral.beeperVal) alert(PSTR("Alarms Disabled"));
if(!g_eeGeneral.beeperVal) alert(STR_ALARMSDISABLED);
}
void checkSwitches()
@ -628,7 +622,7 @@ void checkSwitches()
if(!g_eeGeneral.switchWarning) return; // if warning is on
// first - display warning
alertMessages( PSTR("Switches not off"), PSTR("Please reset them") ) ;
alertMessages( STR_SWITCHESNOTOFF, STR_PLEASERESETTHEM ) ;
bool state = (g_eeGeneral.switchWarning > 0);
@ -661,7 +655,7 @@ uint8_t g_beepVal[5];
void message(const prog_char * s)
{
lcd_clear();
lcd_putsAtt(64-5*FW,0*FH,PSTR("MESSAGE"),DBLSIZE);
lcd_putsAtt(64-5*FW,0*FH,STR_MESSAGE,DBLSIZE);
lcd_puts_P(0,4*FW,s);
refreshDisplay();
lcdSetRefVolt(g_eeGeneral.contrast);
@ -670,9 +664,9 @@ void message(const prog_char * s)
void alert(const prog_char * s, bool defaults)
{
lcd_clear();
lcd_putsAtt(64-5*FW,0*FH,PSTR("ALERT"),DBLSIZE);
lcd_putsAtt(64-5*FW,0*FH,STR_ALERT,DBLSIZE);
lcd_puts_P(0,4*FH,s);
lcd_puts_P(64-6*FW,7*FH,PSTR("press any Key"));
lcd_puts_P(64-6*FW,7*FH,STR_PRESSANYKEY);
refreshDisplay();
lcdSetRefVolt(defaults ? 25 : g_eeGeneral.contrast);
beepErr();

View file

@ -301,19 +301,6 @@ enum EnumKeys {
#define CURVE_BASE 7
#define CSWITCH_STR "---- v>ofs v<ofs |v|>ofs|v|<ofsAND OR XOR ""v1==v2 ""v1!=v2 ""v1>v2 ""v1<v2 ""v1>=v2 ""v1<=v2 "
#define CSW_LEN_FUNC 7
#ifdef LOGS
#define LOGS_STR "SDCARD Logs "
#else
#define LOGS_STR
#endif
#define FSWITCH_STR "---- ""Trainer ""Trainer RUD ""Trainer ELE ""Trainer THR ""Trainer AIL ""Instant Trim ""Trims2Offsets "LOGS_STR
#define FSW_LEN_FUNC 14
#define SWASH_TYPE_STR "--- ""120 ""120X ""140 ""90 "
#define SWASH_TYPE_120 1
#define SWASH_TYPE_120X 2
#define SWASH_TYPE_140 3
@ -422,8 +409,6 @@ enum EnumKeys {
#define PROTO_SILV_C 5
#define PROTO_CTP1009 6
#define PROT_MAX 6
#define PROT_STR "PPM PXX DSM2 SILV_ASILV_BSILV_CTRAC09"
#define PROT_STR_LEN 6
extern uint8_t heartbeat;

View file

@ -405,20 +405,18 @@ void putsStrIdx(uint8_t x, uint8_t y, const prog_char *str, uint8_t idx, uint8_t
void putsChnRaw(uint8_t x, uint8_t y, uint8_t idx, uint8_t att)
{
if (idx==0)
lcd_putsnAtt(x, y, PSTR("----"), 4, att);
else if (idx<=NUM_STICKS)
lcd_putsnAtt(x, y, modi12x3+4*(idx-1), 4, att);
lcd_putsnAtt(x, y, STR_MMMINV, LEN_MMMINV, att);
else if (idx<=NUM_STICKS+NUM_POTS+2+3)
lcd_putsnAtt(x,y,PSTR("P1 P2 P3 MAX FULLCYC1CYC2CYC3")+4*(idx-5), 4, att);
lcd_putsnAtt(x, y, STR_VSRCRAW+LEN_VSRCRAW*(idx-1), LEN_VSRCRAW, att);
else if (idx<=NUM_STICKS+NUM_POTS+2+3+NUM_PPM)
putsStrIdx(x,y,PSTR("PPM"), idx - (NUM_STICKS+NUM_POTS+2+3), att);
putsStrIdx(x, y, STR_PPM, idx - (NUM_STICKS+NUM_POTS+2+3), att);
else if (idx<=NUM_STICKS+NUM_POTS+2+3+NUM_PPM+NUM_CHNOUT)
putsStrIdx(x, y, PSTR("CH"), idx - (NUM_STICKS+NUM_POTS+2+3+NUM_PPM), att);
putsStrIdx(x, y, STR_CH, idx - (NUM_STICKS+NUM_POTS+2+3+NUM_PPM), att);
else if (idx<=NUM_STICKS+NUM_POTS+2+3+NUM_PPM+NUM_CHNOUT+MAX_TIMERS)
putsStrIdx(x, y, PSTR("TMR"), idx - (NUM_STICKS+NUM_POTS+2+3+NUM_PPM+NUM_CHNOUT), att);
putsStrIdx(x, y, STR_TMR, idx - (NUM_STICKS+NUM_POTS+2+3+NUM_PPM+NUM_CHNOUT), att);
#ifdef FRSKY
else if (idx<=NUM_XCHNRAW)
lcd_putsnAtt(x, y, PSTR(TELEMETRY_CHANNELS)+TELEMETRY_STRLEN*(idx-1-(NUM_STICKS+NUM_POTS+2+3+NUM_PPM+MAX_TIMERS+NUM_CHNOUT)), TELEMETRY_STRLEN, att);
else /*if (idx<=NUM_XCHNRAW)*/
lcd_putsnAtt(x, y, STR_TELEMCHNS+LEN_TELEMCHNS*(idx-1-(NUM_STICKS+NUM_POTS+2+3+NUM_PPM+MAX_TIMERS+NUM_CHNOUT)), LEN_TELEMCHNS, att);
#endif
}
@ -430,7 +428,7 @@ void putsChn(uint8_t x, uint8_t y, uint8_t idx, uint8_t att)
void putsChnLetter(uint8_t x, uint8_t y, uint8_t idx, uint8_t attr)
{
lcd_putsnAtt(x, y, PSTR("RETA")+idx-1, 1, attr);
lcd_putsnAtt(x, y, STR_RETA123+idx-1, 1, attr);
}
void putsModelName(uint8_t x, uint8_t y, char *name, uint8_t id, uint8_t att)
@ -438,37 +436,35 @@ void putsModelName(uint8_t x, uint8_t y, char *name, uint8_t id, uint8_t att)
uint8_t len = sizeof(g_model.name);
while (len>0 && !name[len-1]) --len;
if (len==0) {
putsStrIdx(x, y, PSTR("MODEL"), id+1, att|LEADING0);
putsStrIdx(x, y, STR_MODEL, id+1, att|LEADING0);
}
else {
lcd_putsnAtt(x, y, name, sizeof(g_model.name), ZCHAR|att);
}
}
#define SWITCHES_STR "THR""RUD""ELE""ID0""ID1""ID2""AIL""GEA""TRN""SW1""SW2""SW3""SW4""SW5""SW6""SW7""SW8""SW9""SWA""SWB""SWC"
void putsSwitches(uint8_t x, uint8_t y, int8_t idx, uint8_t att)
{
switch(idx){
case 0: lcd_putsAtt(x,y,PSTR("---"),att);return;
case MAX_SWITCH: lcd_putsAtt(x,y,PSTR("ON "),att);return;
case -MAX_SWITCH: lcd_putsAtt(x,y,PSTR("OFF"),att);return;
case 0: lcd_putsnAtt(x, y, STR_MMMINV, LEN_MMMINV, att);return;
case MAX_SWITCH: lcd_putsnAtt(x, y, STR_ONOFF, LEN_OFFON, att);return;
case -MAX_SWITCH: lcd_putsnAtt(x, y, STR_OFFON, LEN_OFFON, att);return;
}
if (idx<0) lcd_vlineStip(x-2, y, 8, 0x5E/*'!'*/);
lcd_putsnAtt(x, y, PSTR(SWITCHES_STR)+3*(abs(idx)-1), 3, att);
lcd_putsnAtt(x, y, STR_VSWITCHES+LEN_VSWITCHES*(abs(idx)-1), LEN_VSWITCHES, att);
}
void putsFlightPhase(uint8_t x, uint8_t y, int8_t idx, uint8_t att)
{
if (idx==0) { lcd_putsAtt(x,y,PSTR("---"),att); return; }
if (idx==0) { lcd_putsnAtt(x, y, STR_MMMINV, LEN_MMMINV, att); return; }
if (idx < 0) { lcd_vlineStip(x-2, y, 8, 0x5E/*'!'*/); idx = -idx; }
putsStrIdx(x, y, PSTR("FP"), idx-1, att);
putsStrIdx(x, y, STR_FP, idx-1, att);
}
#define CURV_STR "---x>0x<0|x|f>0f<0|f|"
void putsCurve(uint8_t x, uint8_t y, uint8_t idx, uint8_t att)
{
if (idx < CURVE_BASE)
lcd_putsnAtt(x, y, PSTR(CURV_STR)+3*idx, 3, att);
lcd_putsnAtt(x, y, STR_VCURVEFUNC+LEN_VCURVEFUNC*idx, LEN_VCURVEFUNC, att);
else
putsStrIdx(x, y, PSTR("c"), idx-CURVE_BASE+1, att);
}
@ -480,7 +476,7 @@ void putsTmrMode(uint8_t x, uint8_t y, int8_t mode, uint8_t att)
lcd_putcAtt(x-1*FW, y, '!', att);
}
else if (mode < TMR_VAROFS) {
lcd_putsnAtt(x, y, PSTR("OFFABSTHsTH%THt")+3*mode, 3, att);
lcd_putsnAtt(x, y, STR_VTMRMODES+LEN_VTMRMODES*mode, LEN_VTMRMODES, att);
return;
}

View file

@ -84,7 +84,7 @@ void doMainScreenGrphics()
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
void displayAltitudeLine(uint8_t x, uint8_t y, uint8_t flags)
{
lcd_puts_P(x, y, PSTR("Alt:"));
lcd_puts_P(x, y, STR_ALT);
uint16_t value = frskyHubData.baroAltitude + baroAltitudeOffset;
lcd_outdezAtt(lcd_lastPos, (flags & DBLSIZE) ? y-FH : y, value, flags|LEFT|UNSIGN);
lcd_putc(lcd_lastPos, y, 'm') ;
@ -157,7 +157,7 @@ void menuMainView(uint8_t event)
JETI_EnableRXD(); // enable JETI-Telemetry reception
chainMenu(menuProcJeti);
#else
chainMenu(menuProcStatistic2);
chainMenu(menuProcDebug);
#endif
killEvents(event);
break;
@ -333,7 +333,7 @@ void menuMainView(uint8_t event)
V_BAR(SCREEN_WIDTH/2-5*4+2+i*5, SCREEN_HEIGHT-8, len)
}
for (uint8_t i=0; i<12; i++) {
if ((i%6) < 3) lcd_puts_P(i<6 ? 2*FW-2 : 16*FW-2, (i%3)*FH+4*FH, PSTR("SW"));
if ((i%6) < 3) lcd_puts_P(i<6 ? 2*FW-2 : 16*FW-2, (i%3)*FH+4*FH, STR_SW);
lcd_putcAtt((i<6 ? 2*FW-2 : 16*FW-2) + 2 * FW + ((i%6) < 3 ? 0 : FW), (i%3)*FH+4*FH, i<9 ? '1'+i : 'A'+i-9, getSwitch(10+i, 0) ? INVERS : 0);
}
}
@ -376,7 +376,7 @@ void menuMainView(uint8_t event)
// Display RX Batt Volts only if a valid channel (A1/A2) has been selected
if (g_eeFrsky.rxVoltsChannel >0)
{
y+=FH; lcd_puts_P(2*FW, y, PSTR("Rx Batt:"));
y+=FH; lcd_puts_P(2*FW, y, STR_RXBATT);
// Rx batt voltage bar frame
// Minimum voltage
@ -407,11 +407,11 @@ void menuMainView(uint8_t event)
}
#endif
lcd_puts_P(0, 6*FH, PSTR("Rx:"));
lcd_puts_P(0, 6*FH, STR_RX);
lcd_outdezAtt(3 * FW, 5*FH+2, staticRSSI[0], DBLSIZE|LEFT);
lcd_outdezAtt(4 * FW, 7*FH, frskyRSSI[0].min, 0);
lcd_outdezAtt(6 * FW, 7*FH, frskyRSSI[0].max, LEFT);
lcd_puts_P(11 * FW - 2, 6*FH, PSTR("Tx:"));
lcd_puts_P(11 * FW - 2, 6*FH, STR_TX);
lcd_outdezAtt(14 * FW - 2, 5*FH+2, staticRSSI[1], DBLSIZE|LEFT);
lcd_outdezAtt(15 * FW - 2, 7*FH, frskyRSSI[1].min, 0);
lcd_outdezAtt(17 * FW - 2, 7*FH, frskyRSSI[1].max, LEFT);
@ -456,20 +456,20 @@ void menuMainView(uint8_t event)
lcd_putc(lcd_lastPos+1, 3*FH, frskyHubData.gpsLatitudeNS ? frskyHubData.gpsLatitudeNS : '-');
// Course / Heading
lcd_puts_P(5, 5*FH, PSTR("Hdg:"));
lcd_puts_P(5, 5*FH, STR_HDG);
lcd_outdezNAtt(lcd_lastPos, 5*FH, frskyHubData.gpsCourse_bp, LEFT|LEADING0, 3); // before '.'
lcd_plot(lcd_lastPos, 6*FH-2, 0); // small decimal point
lcd_outdezAtt(lcd_lastPos+2, 5*FH, frskyHubData.gpsCourse_ap, LEFT); // after '.'
lcd_putc(lcd_lastPos, 5*FH, '@');
// Speed
lcd_puts_P(76, 5*FH, PSTR("Spd:"));
lcd_puts_P(76, 5*FH, STR_SPD);
lcd_outdezAtt(lcd_lastPos, 5*FH, frskyHubData.gpsSpeed_bp, LEFT); // before '.'
lcd_plot(lcd_lastPos, 6*FH-2, 0); // small decimal point
lcd_outdezAtt(lcd_lastPos+2, 5*FH, frskyHubData.gpsSpeed_ap, LEFT|UNSIGN); // after '.'
// Altitude
lcd_puts_P(7*FW, 7*FH, PSTR("Alt:"));
lcd_puts_P(7*FW, 7*FH, STR_ALT);
lcd_outdezNAtt(lcd_lastPos, 7*FH, frskyHubData.gpsAltitude_bp, LEFT|LEADING0, 3); // before '.'
lcd_plot(lcd_lastPos, 8*FH-2, 0); // small decimal point
lcd_outdezAtt(lcd_lastPos+2, 7*FH, frskyHubData.gpsAltitude_ap, LEFT|UNSIGN); // after '.'
@ -479,31 +479,31 @@ void menuMainView(uint8_t event)
uint8_t y = 2*FH;
// Temperature 1
lcd_puts_P(0, y, PSTR("Temp1:"));
lcd_puts_P(0, y, STR_TEMP1);
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.temperature1, LEFT);
lcd_puts_P(lcd_lastPos, y, PSTR("@C"));
y += FH;
// Temperature 2
lcd_puts_P(0, y, PSTR("Temp2:"));
lcd_puts_P(0, y, STR_TEMP2);
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.temperature2, LEFT);
lcd_puts_P(lcd_lastPos, y, PSTR("@C"));
y += 2*FH;
// RPM
lcd_puts_P(0, y, PSTR("RPM:"));
lcd_puts_P(0, y, STR_RPM);
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.rpm, LEFT);
y += FH;
// Fuel
lcd_puts_P(0, y, PSTR("Fuel:"));
lcd_puts_P(0, y, STR_FUEL);
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.fuelLevel, LEFT);
lcd_putc(lcd_lastPos, y, '%');
y += FH;
// Volts
lcd_puts_P(0, y, PSTR("Volts:"));
lcd_puts_P(0, y, STR_VOLTS);
lcd_outdezNAtt(lcd_lastPos, y, frskyHubData.volts, LEFT);
lcd_putc(lcd_lastPos, y, 'V');
y = 2*FH;
@ -513,7 +513,7 @@ void menuMainView(uint8_t event)
y += 2*FH;
// Acceleromter
lcd_puts_P(11*FW, y, PSTR("Accel"));
lcd_puts_P(11*FW, y, STR_ACCEL);
y += FH;
lcd_puts_P(11*FW, y, PSTR("x:"));
lcd_outdezNAtt(FW*17, y, (int32_t)frskyHubData.accelX * 100 / 256, PREC2);
@ -530,7 +530,7 @@ void menuMainView(uint8_t event)
#endif
else {
y0 = 5*FH;
//lcd_puts_P(2*FW-3, y0, PSTR("Tele:"));
//lcd_puts_P(2*FW-3, y0, STR_TELE);
x0 = 4*FW-3;
for (int i=0; i<2; i++) {
if (g_model.frsky.channels[i].ratio) {
@ -542,15 +542,15 @@ void menuMainView(uint8_t event)
}
}
y0+=FH;
//lcd_puts_P(2*FW-3, y0, PSTR("RSSI:"));
lcd_puts_P(4*FW-3, y0, PSTR("Rx:"));
//lcd_puts_P(2*FW-3, y0, STR_RSSI);
lcd_puts_P(4*FW-3, y0, STR_RX);
lcd_outdezAtt(7*FW-3, y0, staticRSSI[0], LEFT);
lcd_puts_P(13*FW-3, y0, PSTR("Tx:"));
lcd_puts_P(13*FW-3, y0, STR_TX);
lcd_outdezAtt(16*FW-3, y0, staticRSSI[1], LEFT);
}
}
else {
lcd_putsAtt(22, 40, PSTR("NO DATA"), DBLSIZE);
lcd_putsAtt(22, 40, STR_NODATA, DBLSIZE);
}
}
#endif

View file

@ -33,17 +33,11 @@ uint8_t s_noScroll;
int16_t g_chans512[NUM_CHNOUT]; // TODO not here!
// TODO does it save flash now?
void menu_lcd_onoff( uint8_t x,uint8_t y, uint8_t value, uint8_t mode )
{
lcd_putsnAtt(x, y, STR_OFFON+LEN_OFFON*value, LEN_OFFON, mode ? INVERS:0) ;
}
void menu_lcd_HYPHINV( uint8_t x,uint8_t y, uint8_t value, uint8_t mode )
{
lcd_putsnAtt( x, y, STR_MMMINV+LEN_MMMINV*value, LEN_MMMINV, mode ? INVERS:0) ;
}
void DisplayScreenIndex(uint8_t index, uint8_t count, uint8_t attr)
{
lcd_outdezAtt(128,0,count,attr);
@ -392,7 +386,7 @@ void popMenu()
(*g_menuStack[g_menuStackPtr])(EVT_ENTRY_UP);
}
else {
alert(PSTR("menuStack underflow"));
alert(STR_MENUSERROR);
}
}
@ -411,7 +405,7 @@ void pushMenu(MenuFuncP newMenu)
if(g_menuStackPtr >= DIM(g_menuStack))
{
g_menuStackPtr--;
alert(PSTR("menuStack overflow"));
alert(STR_MENUSERROR);
return;
}
beepKey();

View file

@ -45,7 +45,6 @@ extern uint8_t s_noHi;
extern uint8_t s_noScroll;
void menu_lcd_onoff(uint8_t x, uint8_t y, uint8_t value, uint8_t mode);
void menu_lcd_HYPHINV(uint8_t x, uint8_t y, uint8_t value, uint8_t mode);
extern MenuFuncP g_menuStack[5];
extern uint8_t g_menuStackPtr;
@ -67,7 +66,7 @@ void menuMainView(uint8_t event);
void menuProcSetup(uint8_t event);
void menuProcModelSelect(uint8_t event);
void menuProcStatistic(uint8_t event);
void menuProcStatistic2(uint8_t event);
void menuProcDebug(uint8_t event);
#if defined(NAVIGATION_POT1) || defined(NAVIGATION_RE1)
extern int16_t p1valdiff;
@ -99,7 +98,7 @@ bool check_submenu_simple(uint8_t event, uint8_t maxrow);
typedef PROGMEM void (*MenuFuncP_PROGMEM)(uint8_t event);
#define TITLEP(pstr) lcd_putsAtt(0,0,pstr,INVERS)
#define TITLE(str) TITLEP(PSTR(str))
#define TITLE(str) TITLEP(str)
#define MENU(title, tab, menu, lines_count, ...) \
TITLE(title); \

View file

@ -156,7 +156,7 @@ void menuProcModelSelect(uint8_t event)
{
char name[sizeof(g_model.name)];
TITLE("MODELSEL");
TITLE(STR_MENUMODELSEL);
// flush eeprom write
eeFlush();
@ -179,7 +179,7 @@ void menuProcModelSelect(uint8_t event)
if (!check_submenu_simple(_event_, MAX_MODELS-1)) return;
int8_t sub = m_posVert;
lcd_puts_P( 9*FW, 0, PSTR("free"));
lcd_puts_P( 9*FW, 0, STR_FREE);
lcd_outdezAtt( 17*FW, 0, EeFsGetFree(),0);
DisplayScreenIndex(e_ModelSelect, DIM(menuTabModel), INVERS);
@ -194,7 +194,7 @@ void menuProcModelSelect(uint8_t event)
break;
case EVT_KEY_LONG(KEY_EXIT):
if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && EFile::exists(FILE_MODEL(sub))) {
s_warning = PSTR("DELETE MODEL");
s_warning = STR_DELETEMODEL;
killEvents(_event);
break;
}
@ -211,7 +211,7 @@ void menuProcModelSelect(uint8_t event)
case EVT_KEY_LONG(KEY_MENU):
case EVT_KEY_BREAK(KEY_MENU):
if (s_copyMode && (s_copyTgtOfs || s_copySrcRow>=0)) {
displayPopup(s_copyMode==COPY_MODE ? PSTR("Copying model...") : PSTR("Moving model..."));
displayPopup(s_copyMode==COPY_MODE ? STR_COPYINGMODEL : STR_MOVINGMODEL);
eeCheck(true); // force writing of current model data before this is changed
uint8_t cur = (16 + sub + s_copyTgtOfs) % 16;
@ -243,7 +243,7 @@ void menuProcModelSelect(uint8_t event)
return;
}
else if (_event == EVT_KEY_LONG(KEY_MENU)) {
displayPopup(PSTR("Loading model..."));
displayPopup(STR_LOADINGMODEL);
eeCheck(true); // force writing of current model data before this is changed
if (g_eeGeneral.currModel != sub) {
g_eeGeneral.currModel = sub;
@ -387,14 +387,14 @@ void EditName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, boo
void menuProcModel(uint8_t event)
{
lcd_outdezNAtt(7*FW,0,g_eeGeneral.currModel+1,INVERS+LEADING0,2);
MENU("SETUP", menuTabModel, e_Model, (g_model.protocol ? 10 : 11), {0,sizeof(g_model.name)-1,2,2,0,0,0,0,6,2,1});
MENU(STR_MENUSETUP, menuTabModel, e_Model, (g_model.protocol ? 10 : 11), {0,sizeof(g_model.name)-1,2,2,0,0,0,0,6,2,1});
uint8_t sub = m_posVert;
uint8_t y = 1*FH;
uint8_t subN = 1;
if(s_pgOfs<subN) {
lcd_puts_P(0*FW, y, PSTR("Name"));
lcd_puts_P(0*FW, y, STR_NAME);
EditName(PARAM_OFS, y, g_model.name, sizeof(g_model.name), event, sub==subN, m_posHorz);
if((y+=FH)>7*FH) return;
}subN++;
@ -402,7 +402,7 @@ void menuProcModel(uint8_t event)
TimerData *timer = &g_model.timer1;
for (uint8_t i=0; i<2; i++, timer=&g_model.timer2) {
if (s_pgOfs<subN) {
lcd_putsnAtt(0*FW, y, PSTR("Timer1Timer2")+6*i, 6, 0);
putsStrIdx(0*FW, y, STR_TIMER, i+1);
putsTmrMode(PARAM_OFS, y, timer->mode, sub==subN && m_posHorz==0 ? ((s_editMode>0) ? BLINK : INVERS) : 0);
putsTime(14*FW, y, timer->val,
(sub==subN && m_posHorz==1 ? ((s_editMode>0) ? BLINK : INVERS):0),
@ -436,28 +436,28 @@ void menuProcModel(uint8_t event)
}
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("E.Limits"));
lcd_puts_P( 0, y, STR_ELIMITS);
menu_lcd_onoff( PARAM_OFS, y, g_model.extendedLimits, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_MODELVAR(event,g_model.extendedLimits,0,1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("E.Trims"));
lcd_puts_P( 0, y, STR_ETRIMS);
menu_lcd_onoff( PARAM_OFS, y, g_model.extendedTrims, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_MODELVAR(event,g_model.extendedTrims,0,1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("Trim Inc"));
lcd_putsnAtt( PARAM_OFS, y, PSTR("Exp ExFineFine MediumCoarse")+6*g_model.trimInc,6,(sub==subN ? INVERS:0));
lcd_puts_P( 0, y, STR_TRIMINC);
lcd_putsnAtt(PARAM_OFS, y, STR_VTRIMINC+LEN_VTRIMINC*g_model.trimInc, LEN_VTRIMINC, (sub==subN ? INVERS:0));
if(sub==subN) CHECK_INCDEC_MODELVAR(event,g_model.trimInc,0,4);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("T-Trace"));
lcd_puts_P( 0, y, STR_TTRACE);
int8_t idx = 3;
if (g_model.thrTraceSrc > NUM_POTS) idx = NUM_STICKS+2+3+NUM_PPM+g_model.thrTraceSrc;
else if (g_model.thrTraceSrc > 0) idx = NUM_STICKS+g_model.thrTraceSrc;
@ -467,15 +467,15 @@ void menuProcModel(uint8_t event)
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("T-Trim"));
lcd_puts_P( 0, y, STR_TTRIM);
menu_lcd_onoff(PARAM_OFS, y, g_model.thrTrim, sub==subN && m_posHorz==0) ;
if (sub==subN) CHECK_INCDEC_MODELVAR(event,g_model.thrTrim,0,1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("Beep Ctr"));
for(uint8_t i=0;i<7;i++) lcd_putsnAtt(PARAM_OFS+i*FW, y, PSTR("RETA123")+i,1, ((m_posHorz==i) && (sub==subN)) ? BLINK : ((g_model.beepANACenter & (1<<i)) ? INVERS : 0 ) );
lcd_puts_P( 0, y, STR_BEEPCTR);
for(uint8_t i=0;i<7;i++) lcd_putsnAtt(PARAM_OFS+i*FW, y, STR_RETA123+LEN_RETA123*i, LEN_RETA123, ((m_posHorz==i) && (sub==subN)) ? BLINK : ((g_model.beepANACenter & (1<<i)) ? INVERS : 0 ) );
if(sub==subN){
if((event==EVT_KEY_FIRST(KEY_MENU)) || p1valdiff) {
killEvents(event);
@ -488,12 +488,12 @@ void menuProcModel(uint8_t event)
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P(0, y, PSTR("Proto"));
lcd_putsnAtt(PARAM_OFS, y, PSTR(PROT_STR)+PROT_STR_LEN*g_model.protocol,PROT_STR_LEN,
lcd_puts_P(0, y, STR_PROTO);
lcd_putsnAtt(PARAM_OFS, y, STR_VPROTOS+LEN_VPROTOS*g_model.protocol, LEN_VPROTOS,
(sub==subN && m_posHorz==0 ? (s_editMode>0 ? BLINK : INVERS):0));
if(!g_model.protocol) {
lcd_putsnAtt(PARAM_OFS+4*FW, y, STR_NCHANNELS+LEN_NCHANNELS*(g_model.ppmNCH+2), LEN_NCHANNELS, ((sub==subN && m_posHorz==1) ? ((s_editMode>0) ? BLINK : INVERS) : 0));
lcd_putsAtt(PARAM_OFS+11*FW, y, PSTR("u"),0);
lcd_puts_P(PARAM_OFS+11*FW, y, PSTR("u"));
lcd_outdezAtt(PARAM_OFS+11*FW, y, (g_model.ppmDelay*50)+300, ((sub==subN && m_posHorz==2) ? ((s_editMode>0) ? BLINK : INVERS) : 0));
}
else if (sub==subN) {
@ -517,10 +517,10 @@ void menuProcModel(uint8_t event)
if(s_pgOfs<subN) {
if (!g_model.protocol) {
lcd_puts_P(0, y, PSTR("PPM frame"));
lcd_puts_P(PARAM_OFS+3*FW, y, PSTR("ms"));
lcd_puts_P(0, y, STR_PPMFRAME);
lcd_puts_P(PARAM_OFS+3*FW, y, STR_MS);
lcd_outdezAtt(PARAM_OFS, y, (int16_t)g_model.ppmFrameLength*5 + 225, ((sub==subN && m_posHorz==0) ? (s_editMode>0 ? BLINK : INVERS) : 0) | PREC1|LEFT);
lcd_putsnAtt(PARAM_OFS+6*FW, y, PSTR("POSNEG")+3*g_model.pulsePol, 3, (sub==subN && m_posHorz==1) ? INVERS : 0);
lcd_putsnAtt(PARAM_OFS+6*FW, y, STR_POSNEG+LEN_POSNEG*g_model.pulsePol, LEN_POSNEG, (sub==subN && m_posHorz==1) ? INVERS : 0);
if(sub==subN && (s_editMode>0 || p1valdiff)) {
switch (m_posHorz) {
case 0:
@ -545,7 +545,7 @@ void menuProcPhaseOne(uint8_t event)
PhaseData *phase = phaseaddress(s_currIdx);
putsFlightPhase(13*FW, 0, s_currIdx+1, 0);
SUBMENU("FLIGHT PHASE", (s_currIdx==0 ? 3 : 5), {6, 0, 3/*, 0, 0*/});
SUBMENU(STR_MENUFLIGHTPHASE, (s_currIdx==0 ? 3 : 5), {6, 0, 3/*, 0, 0*/});
int8_t sub = m_posVert;
@ -554,16 +554,16 @@ void menuProcPhaseOne(uint8_t event)
uint8_t attr = sub==k ? INVERS : 0;
switch(i) {
case 0:
lcd_puts_P(0, y, PSTR("Name"));
lcd_puts_P(0, y, STR_NAME);
EditName(10*FW, y, phase->name, sizeof(phase->name), event, attr, m_posHorz);
break;
case 1:
lcd_puts_P(0, y, PSTR("Switch"));
lcd_puts_P(0, y, STR_SWITCH);
putsSwitches(10*FW, y, phase->swtch, attr);
if(attr) CHECK_INCDEC_MODELVAR(event, phase->swtch, -MAX_DRSWITCH, MAX_DRSWITCH);
break;
case 2:
lcd_puts_P(0, y, PSTR("Trims"));
lcd_puts_P(0, y, STR_TRIMS);
for (uint8_t t=0; t<NUM_STICKS; t++) {
int16_t v = getTrimValue(s_currIdx, t);
if (v > TRIM_EXTENDED_MAX) {
@ -585,12 +585,12 @@ void menuProcPhaseOne(uint8_t event)
}
break;
case 3:
lcd_puts_P(0, y, PSTR("Fade In"));
lcd_puts_P(0, y, STR_FADEIN);
lcd_outdezAtt(10*FW, y, phase->fadeIn, attr|LEFT);
if(attr) CHECK_INCDEC_MODELVAR(event, phase->fadeIn, 0, 15);
break;
case 4:
lcd_puts_P(0, y, PSTR("Fade Out"));
lcd_puts_P(0, y, STR_FADEOUT);
lcd_outdezAtt(10*FW, y, phase->fadeOut, attr|LEFT);
if(attr) CHECK_INCDEC_MODELVAR(event, phase->fadeOut, 0, 15);
break;
@ -600,7 +600,7 @@ void menuProcPhaseOne(uint8_t event)
void menuProcPhasesAll(uint8_t event)
{
SIMPLE_MENU("FLIGHT PHASES", menuTabModel, e_PhasesAll, 1+MAX_PHASES+1);
SIMPLE_MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_PhasesAll, 1+MAX_PHASES+1);
int8_t sub = m_posVert - 1;
@ -626,7 +626,7 @@ void menuProcPhasesAll(uint8_t event)
putsFlightPhase(0, y, i+1, att);
lcd_putsnAtt(4*FW, y, p->name, 6, ZCHAR);
if (i == 0) {
lcd_puts_P(11*FW+FW/2, y, PSTR("(default)"));
lcd_puts_P(11*FW+FW/2, y, STR_DEFAULT);
}
else {
putsSwitches(11*FW+FW/2, y, p->swtch, 0);
@ -649,56 +649,62 @@ void menuProcPhasesAll(uint8_t event)
}
att = (sub==MAX_PHASES && !trimsCheckTimer) ? INVERS : 0;
lcd_putsAtt(0, 7*FH, PSTR("Check Trims"), att);
lcd_putsAtt(0, 7*FH, STR_CHECKTRIMS, att);
putsFlightPhase(6*FW, 7*FH, getFlightPhase()+1, att);
}
#ifdef HELI
void menu_lcd_HYPHINV( uint8_t x,uint8_t y, uint8_t value, uint8_t mode )
{
lcd_putsnAtt( x, y, STR_MMMINV+LEN_MMMINV*value, LEN_MMMINV, mode ? INVERS:0) ;
}
void menuProcHeli(uint8_t event)
{
SIMPLE_MENU("HELI SETUP", menuTabModel, e_Heli, 7);
SIMPLE_MENU(STR_MENUHELISETUP, menuTabModel, e_Heli, 7);
int8_t sub = m_posVert;
uint8_t y = 1*FH;
uint8_t subN = 1;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("Swash Type"));
lcd_putsnAtt( 14*FW, y, PSTR(SWASH_TYPE_STR)+6*g_model.swashR.type,6,(sub==subN ? INVERS:0));
lcd_puts_P( 0, y, STR_SWASHTYPE);
lcd_putsnAtt( 14*FW, y, STR_VSWASHTYPE+LEN_VSWASHTYPE*g_model.swashR.type, LEN_VSWASHTYPE, (sub==subN ? INVERS:0));
if(sub==subN) CHECK_INCDEC_MODELVAR(event,g_model.swashR.type,0,SWASH_TYPE_NUM);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("Collective"));
lcd_puts_P( 0, y, STR_COLLECTIVE);
putsChnRaw(14*FW, y, g_model.swashR.collectiveSource, sub==subN ? INVERS : 0);
if(sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.swashR.collectiveSource, 0, NUM_XCHNRAW);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("Swash Ring"));
lcd_puts_P( 0, y, STR_SWASHRING);
lcd_outdezAtt(14*FW, y, g_model.swashR.value, LEFT|(sub==subN ? INVERS : 0));
if(sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.swashR.value, 0, 100);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("ELE Direction"));
lcd_puts_P( 0, y, STR_ELEDIRECTION);
menu_lcd_HYPHINV( 14*FW, y, g_model.swashR.invertELE, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.swashR.invertELE, 0, 1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("AIL Direction"));
lcd_puts_P( 0, y, STR_AILDIRECTION);
menu_lcd_HYPHINV( 14*FW, y, g_model.swashR.invertAIL, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.swashR.invertAIL, 0, 1);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("COL Direction"));
lcd_puts_P( 0, y, STR_COLDIRECTION);
menu_lcd_HYPHINV( 14*FW, y, g_model.swashR.invertCOL, sub==subN ) ;
if(sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.swashR.invertCOL, 0, 1);
if((y+=FH)>7*FH) return;
@ -743,7 +749,7 @@ void menuProcCurveOne(uint8_t event)
static int8_t dfltCrv;
static uint8_t autoThrStep;
TITLE("CURVE");
TITLE(STR_MENUCURVE);
lcd_outdezAtt(5*FW+1, 0, s_curveChan+1, INVERS|LEFT);
theFile.DisplayProgressBar(20*FW+1);
@ -816,8 +822,8 @@ void menuProcCurveOne(uint8_t event)
lcd_outdezAtt(x, y, crv[i], attr);
}
lcd_puts_P(0*FW, 7*FH, PSTR("MODE"));
lcd_putsnAtt(5*FW-2, 7*FH, PSTR("EDIT ""PRSET""A.THR")+5*(s_editMode<=0)*m_posHorz, 5, s_editMode>0 || autoThrStep ? 0 : INVERS);
lcd_puts_P(0*FW, 7*FH, STR_MODE);
lcd_putsnAtt(5*FW-2, 7*FH, STR_CURVMODES+LEN_CURVMODES*(s_editMode<=0)*m_posHorz, LEN_CURVMODES, s_editMode>0 || autoThrStep ? 0 : INVERS);
if (s_editMode>0 || autoThrStep) {
for (uint8_t i=0; i<points; i++) {
@ -860,7 +866,7 @@ bool reachExpoMixCountLimit(uint8_t expo)
{
// check mixers count limit
if (getExpoMixCount(expo) >= (expo ? MAX_EXPOS : MAX_MIXERS)) {
s_warning = (expo ? PSTR("No free expo!") : PSTR("No free mixer!"));
s_warning = (expo ? STR_NOFREEEXPO : STR_NOFREEMIXER);
return true;
}
return false;
@ -1038,7 +1044,7 @@ inline void editExpoVals(uint8_t event, uint8_t which, bool edit, uint8_t y, uin
if(edit) CHECK_INCDEC_MODELVAR(event, ed->swtch, -MAX_DRSWITCH, MAX_DRSWITCH);
break;
case 4:
lcd_putsnAtt(6*FW+5, y, PSTR("---x>0x<0")+9-3*ed->mode, 3, invBlk);
lcd_putsnAtt(6*FW+5, y, STR_VWHEN+3*LEN_VWHEN-LEN_VWHEN*ed->mode, LEN_VWHEN, invBlk);
if(edit) ed->mode = 4 - checkIncDecModel(event, 4-ed->mode, 1, 3);
break;
case 5:
@ -1057,14 +1063,14 @@ void menuProcExpoOne(uint8_t event)
ExpoData *ed = expoaddress(s_currIdx);
putsChnRaw(7*FW+FW/2,0,ed->chn+1,0);
SIMPLE_SUBMENU("DR/EXPO", 6);
SIMPLE_SUBMENU(STR_MENUDREXPO, 6);
int8_t sub = m_posVert;
uint8_t y = FH;
for (uint8_t i=0; i<7; i++) {
lcd_putsnAtt(0, y, PSTR("Weight""Expo ""Phase ""Swtch ""When ""Curve "" ")+6*i, 6, 0);
lcd_putsnAtt(0, y, STR_EXPLABELS+LEN_EXPLABELS*i, LEN_EXPLABELS, 0);
editExpoVals(event, i, sub==i, y, s_currIdx);
y+=FH;
}
@ -1089,7 +1095,7 @@ void menuProcExpoOne(uint8_t event)
void menuProcMixOne(uint8_t event)
{
TITLEP(s_currCh ? PSTR("INSERT MIX ") : PSTR("EDIT MIX "));
TITLEP(s_currCh ? STR_INSERTMIX : STR_EDITMIX);
MixData *md2 = mixaddress(s_currIdx) ;
putsChn(lcd_lastPos+1*FW,0,md2->destCh,0);
SIMPLE_SUBMENU_NOTITLE(13);
@ -1103,28 +1109,28 @@ void menuProcMixOne(uint8_t event)
uint8_t attr = sub==i ? INVERS : 0;
switch(i) {
case 0:
lcd_puts_P( 2*FW,y,PSTR("Source"));
lcd_puts_P( 2*FW,y,STR_SOURCE);
putsChnRaw( FW*10,y,md2->srcRaw,attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->srcRaw, 1,NUM_XCHNRAW);
break;
case 1:
lcd_puts_P( 2*FW,y,PSTR("Weight"));
lcd_puts_P( 2*FW,y,STR_WEIGHT);
lcd_outdezAtt(FW*10,y,md2->weight,attr|LEFT);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->weight, -125,125);
break;
case 2:
lcd_puts_P( 2*FW,y,PSTR("Offset"));
lcd_puts_P( 2*FW,y,STR_OFFSET);
lcd_outdezAtt(FW*10,y,md2->sOffset,attr|LEFT);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->sOffset, -125,125);
break;
case 3:
// TODO hidden when src is not a STICK as it has no sense
lcd_puts_P( 2*FW,y,PSTR("Trim"));
lcd_putsnAtt(FW*10,y, PSTR("ON OFF")+3*md2->carryTrim,3,attr); //default is 0=ON
lcd_puts_P( 2*FW,y,STR_TRIM);
lcd_putsnAtt(FW*10,y, STR_OFFON+LEN_OFFON*(1-md2->carryTrim), LEN_OFFON, attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->carryTrim, 0,1);
break;
case 4:
lcd_putsAtt( 2*FW,y,PSTR("Curves"),0);
lcd_puts_P(2*FW, y, STR_CURVES);
putsCurve(FW*10, y, md2->curve, attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->curve, 0,MAX_CURVE5+MAX_CURVE9+7-1);
if(attr && md2->curve>=CURVE_BASE && event==EVT_KEY_FIRST(KEY_MENU)){
@ -1133,45 +1139,45 @@ void menuProcMixOne(uint8_t event)
}
break;
case 5:
lcd_puts_P( 2*FW,y,PSTR("Switch"));
lcd_puts_P( 2*FW,y,STR_SWITCH);
putsSwitches(10*FW, y,md2->swtch,attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->swtch, -MAX_SWITCH, MAX_SWITCH);
break;
case 6:
lcd_puts_P( 2*FW,y,PSTR("F.Phase"));
lcd_puts_P( 2*FW,y,STR_FPHASE);
putsFlightPhase(10*FW, y, md2->phase, attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->phase, -MAX_PHASES, MAX_PHASES);
break;
case 7:
lcd_puts_P( 2*FW,y,PSTR("Warning"));
lcd_puts_P( 2*FW,y,STR_WARNING);
if(md2->mixWarn)
lcd_outdezAtt(FW*10,y,md2->mixWarn,attr|LEFT);
else
lcd_putsAtt( FW*10,y,PSTR("OFF"),attr);
lcd_puts_P( FW*10,y,STR_OFF);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->mixWarn, 0,3);
break;
case 8:
lcd_puts_P( 2*FW,y,PSTR("Multpx"));
lcd_putsnAtt(10*FW, y,PSTR("Add MultiplyReplace ")+8*md2->mltpx,8,attr);
lcd_puts_P( 2*FW,y,STR_MULTPX);
lcd_putsnAtt(10*FW, y, STR_VMLTPX+LEN_VMLTPX*md2->mltpx, LEN_VMLTPX, attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->mltpx, 0, 2);
break;
case 9:
lcd_puts_P( 2*FW,y,PSTR("Delay Down"));
lcd_puts_P( 2*FW,y,STR_DELAYDOWN);
lcd_outdezAtt(FW*16,y,md2->delayDown,attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->delayDown, 0,15);
break;
case 10:
lcd_puts_P( 2*FW,y,PSTR("Delay Up"));
lcd_puts_P( 2*FW,y,STR_DELAYUP);
lcd_outdezAtt(FW*16,y,md2->delayUp,attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->delayUp, 0,15);
break;
case 11:
lcd_puts_P( 2*FW,y,PSTR("Slow Down"));
lcd_puts_P( 2*FW,y,STR_SLOWDOWN);
lcd_outdezAtt(FW*16,y,md2->speedDown,attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->speedDown, 0,15);
break;
case 12:
lcd_puts_P( 2*FW,y,PSTR("Slow Up"));
lcd_puts_P( 2*FW,y,STR_SLOWUP);
lcd_outdezAtt(FW*16,y,md2->speedUp,attr);
if(attr) CHECK_INCDEC_MODELVAR( event, md2->speedUp, 0,15);
break;
@ -1188,7 +1194,7 @@ inline void displayMixerLine(uint8_t row, uint8_t mix, uint8_t ch, uint8_t idx,
uint8_t y = (row-s_pgOfs)*FH;
MixData *md = mixaddress(mix);
if (idx > 0)
lcd_putsnAtt(FW, y, PSTR("+=*=:=")+md->mltpx*2, 2, 0);
lcd_putsnAtt(FW, y, STR_VMLTPX2+LEN_VMLTPX2*md->mltpx, LEN_VMLTPX2, 0);
putsChnRaw(4*FW+2, y, md->srcRaw, 0);
@ -1258,7 +1264,7 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_)
event -= KEY_EXIT;
}
TITLEP(expo ? PSTR("DR/EXPO") : PSTR("MIXER"));
TITLEP(expo ? STR_DREXPO : STR_MIXER);
lcd_outdezAtt(lcd_lastPos+2*FW+FW/2, 0, getExpoMixCount(expo));
lcd_puts_P(lcd_lastPos, 0, expo ? PSTR("/14") : PSTR("/32"));
SIMPLE_MENU_NOTITLE(menuTabModel, expo ? e_ExposAll : e_MixAll, s_maxLines);
@ -1448,7 +1454,7 @@ void menuProcMixAll(uint8_t event)
void menuProcLimits(uint8_t event)
{
MENU("LIMITS", menuTabModel, e_Limits, NUM_CHNOUT+2, {0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3/*, 0*/});
MENU(STR_MENULIMITS, menuTabModel, e_Limits, NUM_CHNOUT+2, {0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3/*, 0*/});
static bool swVal[NUM_CHNOUT];
@ -1461,7 +1467,7 @@ void menuProcLimits(uint8_t event)
if (k==NUM_CHNOUT) {
//last line available - add the "copy trim menu" line
uint8_t attr = (sub==NUM_CHNOUT) ? INVERS : 0;
lcd_putsAtt(3*FW, y, PSTR("COPY TRIM [MENU]"), s_noHi ? 0 : attr);
lcd_putsAtt(3*FW, y, STR_COPYTRIMMENU, s_noHi ? 0 : attr);
if (attr && event==EVT_KEY_LONG(KEY_MENU)) {
s_noHi = NO_HI_LEN;
killEvents(event);
@ -1516,7 +1522,7 @@ void menuProcLimits(uint8_t event)
}
break;
case 3:
lcd_putsnAtt( 18*FW, y, PSTR("---INV")+ld->revert*3,3,attr);
lcd_putsnAtt(18*FW, y, STR_MMMINV+LEN_MMMINV*ld->revert, LEN_MMMINV, attr);
if (active) {
CHECK_INCDEC_MODELVAR(event, ld->revert, 0, 1);
}
@ -1528,7 +1534,7 @@ void menuProcLimits(uint8_t event)
void menuProcCurvesAll(uint8_t event)
{
SIMPLE_MENU("CURVES", menuTabModel, e_CurvesAll, 1+MAX_CURVE5+MAX_CURVE9);
SIMPLE_MENU(STR_MENUCURVES, menuTabModel, e_CurvesAll, 1+MAX_CURVE5+MAX_CURVE9);
int8_t sub = m_posVert - 1;
@ -1553,7 +1559,7 @@ void menuProcCurvesAll(uint8_t event)
if(cv9 && (yd>6)) break;
if(yd>7) break;
if(!m) m = attr;
putsStrIdx(0, y, PSTR("CV"), k+1, attr);
putsStrIdx(0, y, STR_CV, k+1, attr);
int8_t *crv = cv9 ? g_model.curves9[k-MAX_CURVE5] : g_model.curves5[k];
for (uint8_t j = 0; j < (5); j++) {
lcd_outdezAtt( j*(3*FW+3) + 7*FW + 2, y, crv[j], 0);
@ -1572,7 +1578,7 @@ void menuProcCurvesAll(uint8_t event)
void menuProcCustomSwitches(uint8_t event)
{
MENU("CUSTOM SWITCHES", menuTabModel, e_CustomSwitches, NUM_CSW+1, {0, 2/*repeated...*/});
MENU(STR_MENUCUSTOMSWITCHES, menuTabModel, e_CustomSwitches, NUM_CSW+1, {0, 2/*repeated...*/});
uint8_t y = 0;
uint8_t k = 0;
@ -1586,9 +1592,9 @@ void menuProcCustomSwitches(uint8_t event)
CustomSwData &cs = g_model.customSw[k];
//write SW names here
lcd_putsnAtt( 0*FW , y, PSTR("SW"),2,0);
lcd_puts_P(0*FW, y, STR_SW);
lcd_putc(2*FW, y, k + (k>8 ? 'A'-9: '1'));
lcd_putsnAtt( 4*FW - 1, y, PSTR(CSWITCH_STR)+CSW_LEN_FUNC*cs.func,CSW_LEN_FUNC,m_posHorz==0 ? attr : 0);
lcd_putsnAtt(4*FW - 1, y, STR_VCSWFUNC+LEN_VCSWFUNC*cs.func, LEN_VCSWFUNC, m_posHorz==0 ? attr : 0);
uint8_t cstate = CS_STATE(cs.func);
int8_t v1_min=0, v1_max=NUM_XCHNRAW, v2_min=0, v2_max=NUM_XCHNRAW;
@ -1673,7 +1679,7 @@ void menuProcCustomSwitches(uint8_t event)
void menuProcFunctionSwitches(uint8_t event)
{
MENU("FUNC SWITCHES", menuTabModel, e_FunctionSwitches, NUM_FSW+1, {0, 1/*repeated*/});
MENU(STR_MENUFUNCSWITCHES, menuTabModel, e_FunctionSwitches, NUM_FSW+1, {0, 1/*repeated*/});
uint8_t y = 0;
uint8_t k = 0;
@ -1696,7 +1702,7 @@ void menuProcFunctionSwitches(uint8_t event)
break;
case 1:
if (sd->swtch) {
lcd_putsnAtt(5*FW, y, PSTR(FSWITCH_STR)+FSW_LEN_FUNC*sd->func, FSW_LEN_FUNC, attr);
lcd_putsnAtt(5*FW, y, STR_VFSWFUNC+LEN_VFSWFUNC*sd->func, LEN_VFSWFUNC, attr);
if (active) {
CHECK_INCDEC_MODELVAR( event, sd->func, 0, FUNC_MAX-1);
}
@ -1712,7 +1718,7 @@ void menuProcFunctionSwitches(uint8_t event)
void menuProcSafetySwitches(uint8_t event)
{
MENU("SAFETY SWITCHES", menuTabModel, e_SafetySwitches, NUM_CHNOUT+1, {0, 1/*repeated*/});
MENU(STR_MENUSAFETYSWITCHES, menuTabModel, e_SafetySwitches, NUM_CHNOUT+1, {0, 1/*repeated*/});
uint8_t y = 0;
uint8_t k = 0;
@ -1749,9 +1755,9 @@ void menuProcSafetySwitches(uint8_t event)
void menuProcTelemetry(uint8_t event)
{
#if defined FRSKY_HUB || defined WS_HOW_HIGH
MENU("TELEMETRY", menuTabModel, e_Telemetry, 14, {0, -1, 1, 0, 1, 2, 2, -1, 1, 0, 1, 2, 2, 0});
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 14, {0, -1, 1, 0, 1, 2, 2, -1, 1, 0, 1, 2, 2, 0});
#else
MENU("TELEMETRY", menuTabModel, e_Telemetry, 13, {0, -1, 1, 0, 1, 2, 2, -1, 1, 0, 1, 2, 2});
MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, 13, {0, -1, 1, 0, 1, 2, 2, -1, 1, 0, 1, 2, 2});
#endif
int8_t sub = m_posVert;
@ -1774,16 +1780,16 @@ void menuProcTelemetry(uint8_t event)
for (int i=0; i<2; i++) {
if(s_pgOfs<subN) {
y=(subN-s_pgOfs)*FH;
lcd_putsAtt(0, y, PSTR("A channel"), 0);
lcd_puts_P(0, y, STR_ACHANNEL);
lcd_outdezAtt(2*FW, y, 1+i, 0);
}
subN++;
if(s_pgOfs<subN) {
y=(subN-s_pgOfs)*FH;
lcd_putsAtt(4, y, PSTR("Max"), 0);
lcd_puts_P(4, y, STR_MAX);
putsTelemetryValue(8*FW, y, g_model.frsky.channels[i].ratio, g_model.frsky.channels[i].type, (sub==subN && m_posHorz==0 ? blink:0)|NO_UNIT|LEFT);
lcd_putsnAtt(lcd_lastPos, y, PSTR("v-")+g_model.frsky.channels[i].type, 1, (sub==subN && m_posHorz==1 ? blink:0));
lcd_putsnAtt(lcd_lastPos, y, STR_VTELEMUNIT+LEN_VTELEMUNIT*g_model.frsky.channels[i].type, LEN_VTELEMUNIT, (sub==subN && m_posHorz==1 ? blink:0));
if (sub==subN && (s_editMode>0 || p1valdiff)) {
if (m_posHorz == 0)
g_model.frsky.channels[i].ratio = checkIncDec(event, g_model.frsky.channels[i].ratio, 0, 255, EE_MODEL);
@ -1795,7 +1801,7 @@ void menuProcTelemetry(uint8_t event)
if(s_pgOfs<subN) {
y=(subN-s_pgOfs)*FH;
lcd_putsAtt(4, y, PSTR("Calib"), 0);
lcd_puts_P(4, y, STR_CALIB);
putsTelemetryChannel(8*FW, y, i, frskyTelemetry[i].value, (sub==subN ? blink:0)|LEFT);
if(sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.frsky.channels[i].offset, -127, 127);
}
@ -1803,7 +1809,7 @@ void menuProcTelemetry(uint8_t event)
if(s_pgOfs<subN) {
y=(subN-s_pgOfs)*FH;
lcd_puts_P(4, y, PSTR("Bar"));
lcd_puts_P(4, y, STR_BAR);
putsTelemetryChannel(8*FW, y, i, g_model.frsky.channels[i].barMin, (sub==subN && m_posHorz==0 ? blink:0)|LEFT);
putsTelemetryChannel(13*FW, y, i, g_model.frsky.channels[i].barMax, (sub==subN && m_posHorz==1 ? blink:0)|LEFT);
if(sub==subN && m_posHorz==0 && (s_editMode>0 || p1valdiff)) g_model.frsky.channels[i].barMin = checkIncDec(event, g_model.frsky.channels[i].barMin, 0, 255, EE_MODEL);
@ -1814,9 +1820,9 @@ void menuProcTelemetry(uint8_t event)
for (int j=0; j<2; j++) {
if(s_pgOfs<subN) {
y=(subN-s_pgOfs)*FH;
lcd_putsAtt(4, y, PSTR("Alarm"), 0);
lcd_putsnAtt(8*FW, y, PSTR("---YelOrgRed")+3*ALARM_LEVEL(i, j),3,(sub==subN && m_posHorz==0 ? blink:0));
lcd_putsnAtt(12*FW, y, PSTR("<>")+ALARM_GREATER(i, j),1,(sub==subN && m_posHorz==1 ? blink:0));
lcd_puts_P(4, y, STR_ALARM);
lcd_putsnAtt(8*FW, y, STR_VALARM+LEN_VALARM*ALARM_LEVEL(i, j), LEN_VALARM, (sub==subN && m_posHorz==0 ? blink:0));
lcd_putsnAtt(12*FW, y, STR_VALARMFN+LEN_VALARMFN*ALARM_GREATER(i, j), LEN_VALARMFN,(sub==subN && m_posHorz==1 ? blink:0));
putsTelemetryChannel(14*FW, y, i, g_model.frsky.channels[i].alarms_value[j], (sub==subN && m_posHorz==2 ? blink:0) | LEFT);
if(sub==subN && (s_editMode>0 || p1valdiff)) {
@ -1844,15 +1850,13 @@ void menuProcTelemetry(uint8_t event)
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
if(s_pgOfs<subN) {
y = (subN-s_pgOfs)*FH;
lcd_puts_P(0, y, PSTR("UsrProto"));
lcd_puts_P(0, y, STR_USRPROTO);
#if defined(WS_HOW_HIGH)
#define USR_PROTO_STR "NoneHub WSHH"
#define USR_PROTO_MAX 2
#else
#define USR_PROTO_STR "NoneHub "
#define USR_PROTO_MAX 1
#endif
lcd_putsnAtt(10*FW, y, PSTR(USR_PROTO_STR)+4*g_model.frsky.usrProto, 4, sub==subN ? INVERS:0);
lcd_putsnAtt(10*FW, y, STR_VTELPROTO+LEN_VTELPROTO*g_model.frsky.usrProto, LEN_VTELPROTO, sub==subN ? INVERS:0);
if (sub==subN)
CHECK_INCDEC_MODELVAR(event, g_model.frsky.usrProto, 0, USR_PROTO_MAX);
}
@ -1863,7 +1867,7 @@ void menuProcTelemetry(uint8_t event)
#ifdef TEMPLATES
void menuProcTemplates(uint8_t event)
{
SIMPLE_MENU("TEMPLATES", menuTabModel, e_Templates, 1+NUM_TEMPLATES+1);
SIMPLE_MENU(STR_MENUTEMPLATES, menuTabModel, e_Templates, 1+NUM_TEMPLATES+1);
uint8_t y = 0;
uint8_t k = 0;
@ -1890,13 +1894,13 @@ void menuProcTemplates(uint8_t event)
//write mix names here
lcd_outdezNAtt(3*FW, y, k+1, (sub==k ? INVERS : 0)|LEADING0, 2);
lcd_putsnAtt(4*FW, y, PSTR(TEMPLATES_STR)+TEMPLATES_LEN*k, TEMPLATES_LEN, (s_noHi ? 0 : (sub==k ? INVERS : 0)));
lcd_putsnAtt(4*FW, y, STR_VTEMPLATES+LEN_VTEMPLATES*k, LEN_VTEMPLATES, (s_noHi ? 0 : (sub==k ? INVERS : 0)));
y+=FH;
}
if(y>7*FH) return;
uint8_t attr = s_noHi ? 0 : ((sub==NUM_TEMPLATES) ? INVERS : 0);
lcd_putsAtt( 1*FW,y,PSTR("CLEAR MIXES [MENU]"),attr);
lcd_putsAtt( 1*FW,y,STR_CLEARMIXMENU,attr);
y+=FH;
}
#endif

View file

@ -12,15 +12,211 @@ const prog_char APM STR_OPEN9X[] =
TR_OFFON
TR_MMMINV
TR_NCHANNELS
TR_BEEPER
TR_VBEEPER
TR_ADCFILTER
TR_WARNSW
TR_TRNMODE
TR_TRNCHN
TR_VTRIMINC
TR_RETA123
TR_VPROTOS
TR_POSNEG
TR_VCURVEFUNC
TR_CURVMODES
TR_EXPLABELS
TR_VMLTPX
TR_VMLTPX2
TR_VCSWFUNC
TR_VFSWFUNC
TR_VTELEMUNIT
TR_VALARM
TR_VALARMFN
TR_VTELPROTO
TR_VTEMPLATES
TR_VSWASHTYPE
TR_VKEYS
TR_VSWITCHES
TR_VSRCRAW
TR_VTMRMODES
TR_TELEMCHNS
#if defined(PCBV3)
TR_RE1RE2
TR_DATETIME
#endif
;
// The 0-terminated-strings
const prog_char APM STR_POPUPS[] = TR_POPUPS;
const prog_char APM STR_MENUWHENDONE[] = TR_MENUWHENDONE;
const prog_char APM STR_FREE[] = TR_FREE;
const prog_char APM STR_DELETEMODEL[] = TR_DELETEMODEL;
const prog_char APM STR_COPYINGMODEL[] = TR_COPYINGMODEL;
const prog_char APM STR_MOVINGMODEL[] = TR_MOVINGMODEL;
const prog_char APM STR_LOADINGMODEL[] = TR_LOADINGMODEL;
const prog_char APM STR_NAME[] = TR_NAME;
const prog_char APM STR_TIMER[] = TR_TIMER;
const prog_char APM STR_ELIMITS[] = TR_ELIMITS;
const prog_char APM STR_ETRIMS[] = TR_ETRIMS;
const prog_char APM STR_TRIMINC[] = TR_TRIMINC;
const prog_char APM STR_TTRACE[] = TR_TTRACE;
const prog_char APM STR_TTRIM[] = TR_TTRIM;
const prog_char APM STR_BEEPCTR[] = TR_BEEPCTR;
const prog_char APM STR_PROTO[] = TR_PROTO;
const prog_char APM STR_PPMFRAME[] = TR_PPMFRAME;
const prog_char APM STR_MS[] = TR_MS;
const prog_char APM STR_SWITCH[] = TR_SWITCH;
const prog_char APM STR_TRIMS[] = TR_TRIMS;
const prog_char APM STR_FADEIN[] = TR_FADEIN;
const prog_char APM STR_FADEOUT[] = TR_FADEOUT;
const prog_char APM STR_DEFAULT[] = TR_DEFAULT;
const prog_char APM STR_CHECKTRIMS[] = TR_CHECKTRIMS;
const prog_char APM STR_SWASHTYPE[] = TR_SWASHTYPE;
const prog_char APM STR_COLLECTIVE[] = TR_COLLECTIVE;
const prog_char APM STR_SWASHRING[] = TR_SWASHRING;
const prog_char APM STR_ELEDIRECTION[] = TR_ELEDIRECTION;
const prog_char APM STR_AILDIRECTION[] = TR_AILDIRECTION;
const prog_char APM STR_COLDIRECTION[] = TR_COLDIRECTION;
const prog_char APM STR_MODE[] = TR_MODE;
const prog_char APM STR_NOFREEEXPO[] = TR_NOFREEEXPO;
const prog_char APM STR_NOFREEMIXER[] = TR_NOFREEMIXER;
const prog_char APM STR_INSERTMIX[] = TR_INSERTMIX;
const prog_char APM STR_EDITMIX[] = TR_EDITMIX;
const prog_char APM STR_SOURCE[] = TR_SOURCE;
const prog_char APM STR_WEIGHT[] = TR_WEIGHT;
const prog_char APM STR_OFFSET[] = TR_OFFSET;
const prog_char APM STR_TRIM[] = TR_TRIM;
const prog_char APM STR_CURVES[] = TR_CURVES;
const prog_char APM STR_FPHASE[] = TR_FPHASE;
const prog_char APM STR_WARNING[] = TR_WARNING;
const prog_char APM STR_OFF[] = TR_OFF;
const prog_char APM STR_MULTPX[] = TR_MULTPX;
const prog_char APM STR_DELAYDOWN[] = TR_DELAYDOWN;
const prog_char APM STR_DELAYUP[] = TR_DELAYUP;
const prog_char APM STR_SLOWDOWN[] = TR_SLOWDOWN;
const prog_char APM STR_SLOWUP[] = TR_SLOWUP;
const prog_char APM STR_DREXPO[] = TR_DREXPO;
const prog_char APM STR_MIXER[] = TR_MIXER;
const prog_char APM STR_COPYTRIMMENU[] = TR_COPYTRIMMENU;
const prog_char APM STR_CV[] = TR_CV;
const prog_char APM STR_SW[] = TR_SW;
const prog_char APM STR_ACHANNEL[] = TR_ACHANNEL;
const prog_char APM STR_MAX[] = TR_MAX;
const prog_char APM STR_CALIB[] = TR_CALIB;
const prog_char APM STR_BAR[] = TR_BAR;
const prog_char APM STR_ALARM[] = TR_ALARM;
const prog_char APM STR_USRPROTO[] = TR_USRPROTO;
const prog_char APM STR_CLEARMIXMENU[] = TR_CLEARMIXMENU;
const prog_char APM STR_BEEPER[] = TR_BEEPER;
const prog_char APM STR_CONTRAST[] = TR_CONTRAST;
const prog_char APM STR_BATTERYWARNING[] = TR_BATTERYWARNING;
const prog_char APM STR_INACTIVITYALARM[] = TR_INACTIVITYALARM;
const prog_char APM STR_FILTERADC[] = TR_FILTERADC;
const prog_char APM STR_THROTTLEREVERSE[] = TR_THROTTLEREVERSE;
const prog_char APM STR_MINUTEBEEP[] = TR_MINUTEBEEP;
const prog_char APM STR_BEEPCOUNTDOWN[] = TR_BEEPCOUNTDOWN;
const prog_char APM STR_FLASHONBEEP[] = TR_FLASHONBEEP;
const prog_char APM STR_LIGHTSWITCH[] = TR_LIGHTSWITCH;
const prog_char APM STR_LIGHTOFFAFTER[] = TR_LIGHTOFFAFTER;
const prog_char APM STR_SPLASHSCREEN[] = TR_SPLASHSCREEN;
const prog_char APM STR_THROTTLEWARNING[] = TR_THROTTLEWARNING;
const prog_char APM STR_SWITCHWARNING[] = TR_SWITCHWARNING;
const prog_char APM STR_MEMORYWARNING[] = TR_MEMORYWARNING;
const prog_char APM STR_ALARMWARNING[] = TR_ALARMWARNING;
const prog_char APM STR_NODATAALARM[] = TR_NODATAALARM;
const prog_char APM STR_RXCHANNELORD[] = TR_RXCHANNELORD;
const prog_char APM STR_MODE2[] = TR_MODE2;
const prog_char APM STR_SLAVE[] = TR_SLAVE;
const prog_char APM STR_MODESRC[] = TR_MODESRC;
const prog_char APM STR_MULTIPLIER[] = TR_MULTIPLIER;
const prog_char APM STR_CAL[] = TR_CAL;
const prog_char APM STR_EEPROMV[] = TR_EEPROMV;
const prog_char APM STR_VTRIM[] = TR_VTRIM;
const prog_char APM STR_BG[] = TR_BG;
const prog_char APM STR_MENUTOSTART[] = TR_MENUTOSTART;
const prog_char APM STR_SETMIDPOINT[] = TR_SETMIDPOINT;
const prog_char APM STR_MOVESTICKSPOTS[] = TR_MOVESTICKSPOTS;
const prog_char APM STR_ALT[] = TR_ALT;
const prog_char APM STR_RXBATT[] = TR_RXBATT;
const prog_char APM STR_RX[] = TR_RX;
const prog_char APM STR_TX[] = TR_TX;
const prog_char APM STR_HDG[] = TR_HDG;
const prog_char APM STR_SPD[] = TR_SPD;
const prog_char APM STR_TEMP1[] = TR_TEMP1;
const prog_char APM STR_TEMP2[] = TR_TEMP2;
const prog_char APM STR_RPM[] = TR_RPM;
const prog_char APM STR_FUEL[] = TR_FUEL;
const prog_char APM STR_VOLTS[] = TR_VOLTS;
const prog_char APM STR_ACCEL[] = TR_ACCEL;
const prog_char APM STR_TELE[] = TR_TELE;
const prog_char APM STR_RSSI[] = TR_RSSI;
const prog_char APM STR_NODATA[] = TR_NODATA;
const prog_char APM STR_TM1[] = TR_TM1;
const prog_char APM STR_TM2[] = TR_TM2;
const prog_char APM STR_THR[] = TR_THR;
const prog_char APM STR_TH[] = TR_TH;
const prog_char APM STR_TOT[] = TR_TOT;
const prog_char APM STR_TMR1LATMAXUS[] = TR_TMR1LATMAXUS;
const prog_char APM STR_TMR1LATMINUS[] = TR_TMR1LATMINUS;
const prog_char APM STR_TMR1JITTERUS[] = TR_TMR1JITTERUS;
const prog_char APM STR_TMAINMAXMS[] = TR_TMAINMAXMS;
const prog_char APM STR_T10MSUS[] = TR_T10MSUS;
const prog_char APM STR_FREESTACKMINB[] = TR_FREESTACKMINB;
const prog_char APM STR_MENUTORESET[] = TR_MENUTORESET;
const prog_char APM STR_PPM[] = TR_PPM;
const prog_char APM STR_CH[] = TR_CH;
const prog_char APM STR_TMR[] = TR_TMR;
const prog_char APM STR_MODEL[] = TR_MODEL;
const prog_char APM STR_FP[] = TR_FP;
const prog_char APM STR_EEPROMLOWMEM[] = TR_EEPROMLOWMEM;
const prog_char APM STR_ALERT[] = TR_ALERT;
const prog_char APM STR_PRESSANYKEYTOSKIP[] = TR_PRESSANYKEYTOSKIP;
const prog_char APM STR_THROTTLENOTIDLE[] = TR_THROTTLENOTIDLE;
const prog_char APM STR_RESETTHROTTLE[] = TR_RESETTHROTTLE;
const prog_char APM STR_ALARMSDISABLED[] = TR_ALARMSDISABLED;
const prog_char APM STR_SWITCHESNOTOFF[] = TR_SWITCHESNOTOFF;
const prog_char APM STR_PLEASERESETTHEM[] = TR_PLEASERESETTHEM;
const prog_char APM STR_MESSAGE[] = TR_MESSAGE;
const prog_char APM STR_PRESSANYKEY[] = TR_PRESSANYKEY;
const prog_char APM STR_BADEEPROMDATA[] = TR_BADEEPROMDATA;
const prog_char APM STR_EEPROMFORMATTING[] = TR_EEPROMFORMATTING;
const prog_char APM STR_EEPROMOVERFLOW[] = TR_EEPROMOVERFLOW;
const prog_char APM STR_MENUSERROR[] = TR_MENUSERROR;
const prog_char APM STR_MENURADIOSETUP[] = TR_MENURADIOSETUP;
#ifdef PCBV3
const prog_char APM STR_MENUDATEANDTIME[] = TR_MENUDATEANDTIME;
#endif
const prog_char APM STR_MENUTRAINER[] = TR_MENUTRAINER;
const prog_char APM STR_MENUVERSION[] = TR_MENUVERSION;
const prog_char APM STR_MENUDIAG[] = TR_MENUDIAG;
const prog_char APM STR_MENUANA[] = TR_MENUANA;
const prog_char APM STR_MENUCALIBRATION[] = TR_MENUCALIBRATION;
const prog_char APM STR_MENUMODELSEL[] = TR_MENUMODELSEL;
const prog_char APM STR_MENUSETUP[] = TR_MENUSETUP;
const prog_char APM STR_MENUFLIGHTPHASE[] = TR_MENUFLIGHTPHASE;
const prog_char APM STR_MENUFLIGHTPHASES[] = TR_MENUFLIGHTPHASES;
#ifdef HELI
const prog_char APM STR_MENUHELISETUP[] = TR_MENUHELISETUP;
#endif
const prog_char APM STR_MENUDREXPO[] = TR_MENUDREXPO;
const prog_char APM STR_MENULIMITS[] = TR_MENULIMITS;
const prog_char APM STR_MENUCURVES[] = TR_MENUCURVES;
const prog_char APM STR_MENUCURVE[] = TR_MENUCURVE;
const prog_char APM STR_MENUCUSTOMSWITCHES[] = TR_MENUCUSTOMSWITCHES;
const prog_char APM STR_MENUFUNCSWITCHES[] = TR_MENUFUNCSWITCHES;
const prog_char APM STR_MENUSAFETYSWITCHES[] = TR_MENUSAFETYSWITCHES;
#ifdef FRSKY
const prog_char APM STR_MENUTELEMETRY[] = TR_MENUTELEMETRY;
#endif
#ifdef TEMPLATES
const prog_char APM STR_MENUTEMPLATES[] = TR_MENUTEMPLATES;
#endif
const prog_char APM STR_MENUSTAT[] = TR_MENUSTAT;
const prog_char APM STR_MENUDEBUG[] = TR_MENUDEBUG;
#ifdef CTP1009
const prog_char APM STR_PULSETABOVERFLOW[] = TR_PULSETABOVERFLOW;
#endif

View file

@ -17,30 +17,243 @@ extern const PROGMEM char STR_OPEN9X[];
#define OFS_OFFON 0
#define OFS_MMMINV (OFS_OFFON + PSIZE(TR_OFFON))
#define OFS_NCHANNELS (OFS_MMMINV + PSIZE(TR_MMMINV))
#define OFS_BEEPER (OFS_NCHANNELS + PSIZE(TR_NCHANNELS))
#define OFS_ADCFILTER (OFS_BEEPER + PSIZE(TR_BEEPER))
#define OFS_VBEEPER (OFS_NCHANNELS + PSIZE(TR_NCHANNELS))
#define OFS_ADCFILTER (OFS_VBEEPER + PSIZE(TR_VBEEPER))
#define OFS_WARNSW (OFS_ADCFILTER + PSIZE(TR_ADCFILTER))
#define OFS_TRNMODE (OFS_WARNSW + PSIZE(TR_WARNSW))
#define OFS_TRNCHN (OFS_TRNMODE + PSIZE(TR_TRNMODE))
#define OFS_VTRIMINC (OFS_TRNCHN + PSIZE(TR_TRNCHN))
#define OFS_RETA123 (OFS_VTRIMINC + PSIZE(TR_VTRIMINC))
#define OFS_VPROTOS (OFS_RETA123 + PSIZE(TR_RETA123))
#define OFS_POSNEG (OFS_VPROTOS + PSIZE(TR_VPROTOS))
#define OFS_VCURVEFUNC (OFS_POSNEG + PSIZE(TR_POSNEG))
#define OFS_CURVMODES (OFS_VCURVEFUNC + PSIZE(TR_VCURVEFUNC))
#define OFS_EXPLABELS (OFS_CURVMODES + PSIZE(TR_CURVMODES))
#define OFS_VMLTPX (OFS_EXPLABELS + PSIZE(TR_EXPLABELS))
#define OFS_VMLTPX2 (OFS_VMLTPX + PSIZE(TR_VMLTPX))
#define OFS_VCSWFUNC (OFS_VMLTPX2 + PSIZE(TR_VMLTPX2))
#define OFS_VFSWFUNC (OFS_VCSWFUNC + PSIZE(TR_VCSWFUNC))
#define OFS_VTELEMUNIT (OFS_VFSWFUNC + PSIZE(TR_VFSWFUNC))
#define OFS_VALARM (OFS_VTELEMUNIT + PSIZE(TR_VTELEMUNIT))
#define OFS_VALARMFN (OFS_VALARM + PSIZE(TR_VALARM))
#define OFS_VTELPROTO (OFS_VALARMFN + PSIZE(TR_VALARMFN))
#define OFS_VTEMPLATES (OFS_VTELPROTO + PSIZE(TR_VTELPROTO))
#define OFS_VSWASHTYPE (OFS_VTEMPLATES + PSIZE(TR_VTEMPLATES))
#define OFS_VKEYS (OFS_VSWASHTYPE + PSIZE(TR_VSWASHTYPE))
#define OFS_VSWITCHES (OFS_VKEYS + PSIZE(TR_VKEYS))
#define OFS_VSRCRAW (OFS_VSWITCHES + PSIZE(TR_VSWITCHES))
#define OFS_VTMRMODES (OFS_VSRCRAW + PSIZE(TR_VSRCRAW))
#define OFS_TELEMCHNS (OFS_VTMRMODES + PSIZE(TR_VTMRMODES))
#if defined(PCBV3)
#define OFS_DATETIME (OFS_TRNCHN + PSIZE(TR_TRNCHN))
#define OFS_RE1RE2 (OFS_TELEMCHNS + PSIZE(TR_TELEMCHNS))
#define OFS_DATETIME (OFS_RE1RE2 + PSIZE(TR_RE1RE2))
#endif
#define STR_OFFON (STR_OPEN9X + OFS_OFFON)
#define STR_ONOFF (STR_OPEN9X + OFS_OFFON + LEN_OFFON)
#define STR_MMMINV (STR_OPEN9X + OFS_MMMINV)
#define STR_NCHANNELS (STR_OPEN9X + OFS_NCHANNELS)
#define STR_BEEPER (STR_OPEN9X + OFS_BEEPER)
#define STR_VBEEPER (STR_OPEN9X + OFS_VBEEPER)
#define STR_ADCFILTER (STR_OPEN9X + OFS_ADCFILTER)
#define STR_WARNSW (STR_OPEN9X + OFS_WARNSW)
#define STR_TRNMODE (STR_OPEN9X + OFS_TRNMODE)
#define STR_TRNCHN (STR_OPEN9X + OFS_TRNCHN)
#define STR_VTRIMINC (STR_OPEN9X + OFS_VTRIMINC)
#define STR_RETA123 (STR_OPEN9X + OFS_RETA123)
#define STR_VPROTOS (STR_OPEN9X + OFS_VPROTOS)
#define STR_POSNEG (STR_OPEN9X + OFS_POSNEG)
#define STR_VCURVEFUNC (STR_OPEN9X + OFS_VCURVEFUNC)
#define STR_VWHEN STR_VCURVEFUNC
#define LEN_VWHEN LEN_VCURVEFUNC
#define STR_CURVMODES (STR_OPEN9X + OFS_CURVMODES)
#define STR_EXPLABELS (STR_OPEN9X + OFS_EXPLABELS)
#define STR_VMLTPX (STR_OPEN9X + OFS_VMLTPX)
#define STR_VMLTPX2 (STR_OPEN9X + OFS_VMLTPX2)
#define STR_VCSWFUNC (STR_OPEN9X + OFS_VCSWFUNC)
#define STR_VFSWFUNC (STR_OPEN9X + OFS_VFSWFUNC)
#define STR_VTELEMUNIT (STR_OPEN9X + OFS_VTELEMUNIT)
#define STR_VALARM (STR_OPEN9X + OFS_VALARM)
#define STR_VALARMFN (STR_OPEN9X + OFS_VALARMFN)
#define STR_VTELPROTO (STR_OPEN9X + OFS_VTELPROTO)
#define STR_VTEMPLATES (STR_OPEN9X + OFS_VTEMPLATES)
#define STR_VSWASHTYPE (STR_OPEN9X + OFS_VSWASHTYPE)
#define STR_VKEYS (STR_OPEN9X + OFS_VKEYS)
#define STR_VSWITCHES (STR_OPEN9X + OFS_VSWITCHES)
#define STR_VSRCRAW (STR_OPEN9X + OFS_VSRCRAW)
#define STR_VTMRMODES (STR_OPEN9X + OFS_VTMRMODES)
#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS)
#if defined(PCBV3)
#define STR_RE1RE2 (STR_OPEN9X + OFS_RE1RE2)
#define STR_DATETIME (STR_OPEN9X + OFS_DATETIME)
#endif
// The 0-terminated-strings
extern const PROGMEM char STR_POPUPS[];
extern const PROGMEM char STR_MENUWHENDONE[];
extern const PROGMEM char STR_FREE[];
extern const PROGMEM char STR_DELETEMODEL[];
extern const PROGMEM char STR_COPYINGMODEL[];
extern const PROGMEM char STR_MOVINGMODEL[];
extern const PROGMEM char STR_LOADINGMODEL[];
extern const PROGMEM char STR_NAME[];
extern const PROGMEM char STR_TIMER[];
extern const PROGMEM char STR_ELIMITS[];
extern const PROGMEM char STR_ETRIMS[];
extern const PROGMEM char STR_TRIMINC[];
extern const PROGMEM char STR_TTRACE[];
extern const PROGMEM char STR_TTRIM[];
extern const PROGMEM char STR_BEEPCTR[];
extern const PROGMEM char STR_PROTO[];
extern const PROGMEM char STR_PPMFRAME[];
extern const PROGMEM char STR_MS[];
extern const PROGMEM char STR_SWITCH[];
extern const PROGMEM char STR_TRIMS[];
extern const PROGMEM char STR_FADEIN[];
extern const PROGMEM char STR_FADEOUT[];
extern const PROGMEM char STR_DEFAULT[];
extern const PROGMEM char STR_CHECKTRIMS[];
extern const PROGMEM char STR_SWASHTYPE[];
extern const PROGMEM char STR_COLLECTIVE[];
extern const PROGMEM char STR_SWASHRING[];
extern const PROGMEM char STR_ELEDIRECTION[];
extern const PROGMEM char STR_AILDIRECTION[];
extern const PROGMEM char STR_COLDIRECTION[];
extern const PROGMEM char STR_MODE[];
extern const PROGMEM char STR_NOFREEEXPO[];
extern const PROGMEM char STR_NOFREEMIXER[];
extern const PROGMEM char STR_INSERTMIX[];
extern const PROGMEM char STR_EDITMIX[];
extern const PROGMEM char STR_SOURCE[];
extern const PROGMEM char STR_WEIGHT[];
extern const PROGMEM char STR_OFFSET[];
extern const PROGMEM char STR_TRIM[];
extern const PROGMEM char STR_CURVES[];
extern const PROGMEM char STR_FPHASE[];
extern const PROGMEM char STR_WARNING[];
extern const PROGMEM char STR_OFF[];
extern const PROGMEM char STR_MULTPX[];
extern const PROGMEM char STR_DELAYDOWN[];
extern const PROGMEM char STR_DELAYUP[];
extern const PROGMEM char STR_SLOWDOWN[];
extern const PROGMEM char STR_SLOWUP[];
extern const PROGMEM char STR_DREXPO[];
extern const PROGMEM char STR_MIXER[];
extern const PROGMEM char STR_COPYTRIMMENU[];
extern const PROGMEM char STR_CV[];
extern const PROGMEM char STR_SW[];
extern const PROGMEM char STR_ACHANNEL[];
extern const PROGMEM char STR_MAX[];
extern const PROGMEM char STR_CALIB[];
extern const PROGMEM char STR_BAR[];
extern const PROGMEM char STR_ALARM[];
extern const PROGMEM char STR_USRPROTO[];
extern const PROGMEM char STR_CLEARMIXMENU[];
extern const PROGMEM char STR_BEEPER[];
extern const PROGMEM char STR_CONTRAST[];
extern const PROGMEM char STR_BATTERYWARNING[];
extern const PROGMEM char STR_INACTIVITYALARM[];
extern const PROGMEM char STR_FILTERADC[];
extern const PROGMEM char STR_THROTTLEREVERSE[];
extern const PROGMEM char STR_MINUTEBEEP[];
extern const PROGMEM char STR_BEEPCOUNTDOWN[];
extern const PROGMEM char STR_FLASHONBEEP[];
extern const PROGMEM char STR_LIGHTSWITCH[];
extern const PROGMEM char STR_LIGHTOFFAFTER[];
extern const PROGMEM char STR_SPLASHSCREEN[];
extern const PROGMEM char STR_THROTTLEWARNING[];
extern const PROGMEM char STR_SWITCHWARNING[];
extern const PROGMEM char STR_MEMORYWARNING[];
extern const PROGMEM char STR_ALARMWARNING[];
extern const PROGMEM char STR_NODATAALARM[];
extern const PROGMEM char STR_RXCHANNELORD[];
extern const PROGMEM char STR_MODE2[];
extern const PROGMEM char STR_SLAVE[];
extern const PROGMEM char STR_MODESRC[];
extern const PROGMEM char STR_MULTIPLIER[];
extern const PROGMEM char STR_CAL[];
extern const PROGMEM char STR_EEPROMV[];
extern const PROGMEM char STR_VTRIM[];
extern const PROGMEM char STR_BG[];
extern const PROGMEM char STR_MENUTOSTART[];
extern const PROGMEM char STR_SETMIDPOINT[];
extern const PROGMEM char STR_MOVESTICKSPOTS[];
extern const PROGMEM char STR_ALT[];
extern const PROGMEM char STR_RXBATT[];
extern const PROGMEM char STR_RX[];
extern const PROGMEM char STR_TX[];
extern const PROGMEM char STR_HDG[];
extern const PROGMEM char STR_SPD[];
extern const PROGMEM char STR_TEMP1[];
extern const PROGMEM char STR_TEMP2[];
extern const PROGMEM char STR_RPM[];
extern const PROGMEM char STR_FUEL[];
extern const PROGMEM char STR_VOLTS[];
extern const PROGMEM char STR_ACCEL[];
extern const PROGMEM char STR_TELE[];
extern const PROGMEM char STR_RSSI[];
extern const PROGMEM char STR_NODATA[];
extern const PROGMEM char STR_TM1[];
extern const PROGMEM char STR_TM2[];
extern const PROGMEM char STR_THR[];
extern const PROGMEM char STR_TH[];
extern const PROGMEM char STR_TOT[];
extern const PROGMEM char STR_TMR1LATMAXUS[];
extern const PROGMEM char STR_TMR1LATMINUS[];
extern const PROGMEM char STR_TMR1JITTERUS[];
extern const PROGMEM char STR_TMAINMAXMS[];
extern const PROGMEM char STR_T10MSUS[];
extern const PROGMEM char STR_FREESTACKMINB[];
extern const PROGMEM char STR_MENUTORESET[];
extern const PROGMEM char STR_PPM[];
extern const PROGMEM char STR_CH[];
extern const PROGMEM char STR_TMR[];
extern const PROGMEM char STR_MODEL[];
extern const PROGMEM char STR_FP[];
extern const PROGMEM char STR_EEPROMLOWMEM[];
extern const PROGMEM char STR_ALERT[];
extern const PROGMEM char STR_PRESSANYKEYTOSKIP[];
extern const PROGMEM char STR_THROTTLENOTIDLE[];
extern const PROGMEM char STR_RESETTHROTTLE[];
extern const PROGMEM char STR_ALARMSDISABLED[];
extern const PROGMEM char STR_SWITCHESNOTOFF[];
extern const PROGMEM char STR_PLEASERESETTHEM[];
extern const PROGMEM char STR_MESSAGE[];
extern const PROGMEM char STR_PRESSANYKEY[];
extern const PROGMEM char STR_BADEEPROMDATA[];
extern const PROGMEM char STR_EEPROMFORMATTING[];
extern const PROGMEM char STR_EEPROMOVERFLOW[];
extern const PROGMEM char STR_MENUSERROR[];
extern const PROGMEM char STR_MENURADIOSETUP[];
extern const PROGMEM char STR_MENUDATEANDTIME[];
extern const PROGMEM char STR_MENUTRAINER[];
extern const PROGMEM char STR_MENUVERSION[];
extern const PROGMEM char STR_MENUDIAG[];
extern const PROGMEM char STR_MENUANA[];
extern const PROGMEM char STR_MENUCALIBRATION[];
extern const PROGMEM char STR_MENUMODELSEL[];
extern const PROGMEM char STR_MENUSETUP[];
extern const PROGMEM char STR_MENUFLIGHTPHASE[];
extern const PROGMEM char STR_MENUFLIGHTPHASES[];
extern const PROGMEM char STR_MENUHELISETUP[];
extern const PROGMEM char STR_MENUDREXPO[];
extern const PROGMEM char STR_MENULIMITS[];
extern const PROGMEM char STR_MENUCURVES[];
extern const PROGMEM char STR_MENUCURVE[];
extern const PROGMEM char STR_MENUCUSTOMSWITCHES[];
extern const PROGMEM char STR_MENUFUNCSWITCHES[];
extern const PROGMEM char STR_MENUSAFETYSWITCHES[];
extern const PROGMEM char STR_MENUTELEMETRY[];
extern const PROGMEM char STR_MENUTEMPLATES[];
extern const PROGMEM char STR_MENUSTAT[];
extern const PROGMEM char STR_MENUDEBUG[];
#ifdef CTP1009
extern const PROGMEM char STR_PULSETABOVERFLOW[];
#endif
#endif

View file

@ -151,8 +151,8 @@ void eeReadAll()
!eeLoadGeneral()
)
{
alert(PSTR("Bad EEprom Data"), true);
message(PSTR("EEPROM Formatting"));
alert(STR_BADEEPROMDATA, true);
message(STR_EEPROMFORMATTING);
EeFsFormat();
//alert(PSTR("format ok"));
generalDefault();

View file

@ -405,7 +405,7 @@ inline void __attribute__ ((always_inline)) setupPulsesTracerCtp1009()
sendByteTra( (chk>>4) | (chk<<4) );
_send_hilo( 7000*2, 2000*2 );
}
if((pulses2MHzWPtr-pulses2MHz) >= (signed)DIM(pulses2MHz)) alert(PSTR("pulse tab overflow"));
if((pulses2MHzWPtr-pulses2MHz) >= (signed)DIM(pulses2MHz)) alert(STR_PULSETABOVERFLOW);
}
#endif

View file

@ -23,11 +23,11 @@
void menuProcStatistic(uint8_t event)
{
TITLE("STAT");
TITLE(STR_MENUSTAT);
switch(event)
{
case EVT_KEY_FIRST(KEY_UP):
chainMenu(menuProcStatistic2);
chainMenu(menuProcDebug);
break;
case EVT_KEY_FIRST(KEY_DOWN):
case EVT_KEY_FIRST(KEY_EXIT):
@ -35,17 +35,17 @@ void menuProcStatistic(uint8_t event)
break;
}
lcd_puts_P( 1*FW, FH*1, PSTR("TM1"));
lcd_puts_P( 1*FW, FH*1, STR_TM1);
putsTime( 5*FW, FH*1, s_timerVal[0], 0, 0);
lcd_puts_P( 17*FW, FH*1, PSTR("TM2"));
lcd_puts_P( 17*FW, FH*1, STR_TM2);
putsTime( 12*FW, FH*1, s_timerVal[1], 0, 0);
lcd_puts_P( 1*FW, FH*2, PSTR("THR"));
lcd_puts_P( 1*FW, FH*2, STR_THR);
putsTime( 5*FW, FH*2, s_timeCumThr, 0, 0);
lcd_puts_P( 17*FW, FH*2, PSTR("TH%"));
lcd_puts_P( 17*FW, FH*2, STR_TH);
putsTime( 12*FW, FH*2, s_timeCum16ThrP/16, 0, 0);
lcd_puts_P( 17*FW, FH*0, PSTR("TOT"));
lcd_puts_P( 17*FW, FH*0, STR_TOT);
putsTime( 12*FW, FH*0, s_timeCumTot, 0, 0);
uint16_t traceRd = s_traceCnt>MAXTRACE ? s_traceWr : 0;
@ -67,9 +67,10 @@ void menuProcStatistic(uint8_t event)
}
}
void menuProcStatistic2(uint8_t event)
// TODO ifdef DEBUG
void menuProcDebug(uint8_t event)
{
TITLE("STAT2");
TITLE(STR_MENUDEBUG);
switch(event)
{
case EVT_KEY_FIRST(KEY_MENU):
@ -87,19 +88,19 @@ void menuProcStatistic2(uint8_t event)
chainMenu(menuMainView);
break;
}
lcd_puts_P( 0*FW, 1*FH, PSTR("tmr1Lat max us"));
lcd_puts_P( 0*FW, 1*FH, STR_TMR1LATMAXUS);
lcd_outdez8(15*FW , 1*FH, g_tmr1Latency_max/2 );
lcd_puts_P( 0*FW, 2*FH, PSTR("tmr1Lat min us"));
lcd_puts_P( 0*FW, 2*FH, STR_TMR1LATMINUS);
lcd_outdez8(15*FW , 2*FH, g_tmr1Latency_min/2 );
lcd_puts_P( 0*FW, 3*FH, PSTR("tmr1 Jitter us"));
lcd_puts_P( 0*FW, 3*FH, STR_TMR1JITTERUS);
lcd_outdez8(15*FW , 3*FH, (g_tmr1Latency_max - g_tmr1Latency_min) /2 );
lcd_puts_P( 0*FW, 4*FH, PSTR("tmain max ms"));
lcd_puts_P( 0*FW, 4*FH, STR_TMAINMAXMS);
lcd_outdezAtt(15*FW, 4*FH, (g_timeMain*100)/16, PREC2);
lcd_puts_P( 0*FW, 5*FH, PSTR("t10ms us"));
lcd_puts_P( 0*FW, 5*FH, STR_T10MSUS);
lcd_outdez8(15*FW , 5*FH, g_time_per10/2 );
#ifndef SIMU
lcd_puts_P( 0*FW, 6*FH, PSTR("Free Stack min b"));
lcd_puts_P( 0*FW, 6*FH, STR_FREESTACKMINB);
lcd_outdezAtt(18*FW-1, 6*FH, stack_free(), UNSIGN) ;
#endif
lcd_puts_P( 3*FW, 7*FH, PSTR("[MENU] to reset"));
lcd_puts_P( 3*FW, 7*FH, STR_MENUTORESET);
}

View file

@ -69,8 +69,6 @@
#define CURVE5(x) ((x)-1)
#define CURVE9(x) (MAX_CURVE5+(x)-1)
#define TEMPLATES_STR "Simple 4-CH ""T-Cut ""V-Tail ""Elevon\\Delta""eCCPM ""Heli Setup ""Servo Test "
#define TEMPLATES_LEN 12
#define NUM_TEMPLATES 7
void clearMixes();

View file

@ -8,8 +8,8 @@
#define LEN_NCHANNELS 4
#define TR_NCHANNELS "4CH 6CH 8CH 10CH12CH14CH16CH"
#define LEN_BEEPER 5
#define TR_BEEPER "Quiet""NoKey""Norm ""Long ""xLong"
#define LEN_VBEEPER 5
#define TR_VBEEPER "Quiet""NoKey""Norm ""Long ""xLong"
#define LEN_ADCFILTER 4
#define TR_ADCFILTER "SING""OSMP""FILT"
@ -26,6 +26,249 @@
#define LEN_DATETIME 5
#define TR_DATETIME "DATE:""TIME:"
// ZERO TERMINATED STRINGS
#define TR_POPUPS "[MENU] [EXIT]";
#define LEN_VTRIMINC 6
#define TR_VTRIMINC "Exp ""ExFine""Fine ""Medium""Coarse"
#define LEN_RETA123 1
#define TR_RETA123 "RETA123"
#define LEN_VPROTOS 6
#define TR_VPROTOS "PPM ""PXX ""DSM2 ""SILV_A""SILV_B""SILV_C""TRAC09"
#define LEN_POSNEG 3
#define TR_POSNEG "POS""NEG"
#define LEN_VCURVEFUNC 3
#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|"
#define LEN_CURVMODES 5
#define TR_CURVMODES "EDIT ""PRSET""A.THR"
#define LEN_EXPLABELS 6
#define TR_EXPLABELS "Weight""Expo ""Phase ""Swtch ""When ""Curve "" "
#define LEN_VMLTPX 8
#define TR_VMLTPX "Add ""Multiply""Replace "
#define LEN_VMLTPX2 2
#define TR_VMLTPX2 "+=""*="":="
#define LEN_VCSWFUNC 7
#define TR_VCSWFUNC "---- ""v>ofs ""v<ofs ""|v|>ofs""|v|<ofs""AND ""OR ""XOR ""v1==v2 ""v1!=v2 ""v1>v2 ""v1<v2 ""v1>=v2 ""v1<=v2 "
#define LEN_VFSWFUNC 14
#ifdef LOGS
#define TR_SDCLOGGS "SDCARD Logs "
#else
#define TR_SDCLOGGS
#endif
#define TR_VFSWFUNC "---- ""Trainer ""Trainer RUD ""Trainer ELE ""Trainer THR ""Trainer AIL ""Instant Trim ""Trims2Offsets "TR_SDCLOGGS
#define LEN_VTELEMUNIT 1
#define TR_VTELEMUNIT "v""-"
#define LEN_VALARM 3
#define TR_VALARM "---""Yel""Org""Red"
#define LEN_VALARMFN 1
#define TR_VALARMFN "<>"
#define LEN_VTELPROTO 4
#if defined(WS_HOW_HIGH)
#define TR_VTELPROTO "NoneHub WSHH"
#elif defined(FRSKY_HUB)
#define TR_VTELPROTO "NoneHub "
#endif
#define LEN_VTEMPLATES 12
#define TR_VTEMPLATES "Simple 4-CH ""T-Cut ""V-Tail ""Elevon\\Delta""eCCPM ""Heli Setup ""Servo Test "
#define LEN_VSWASHTYPE 6
#define TR_VSWASHTYPE "--- ""120 ""120X ""140 ""90 "
#define LEN_VKEYS 5
#define TR_VKEYS " Menu"" Exit"" Down"" Up""Right"" Left"
#define LEN_RE1RE2 3
#define TR_RE1RE2 "RE1""RE2"
#define LEN_VSWITCHES 3
#define TR_VSWITCHES "THR""RUD""ELE""ID0""ID1""ID2""AIL""GEA""TRN""SW1""SW2""SW3""SW4""SW5""SW6""SW7""SW8""SW9""SWA""SWB""SWC"
#define LEN_VSRCRAW 4
#define TR_VSRCRAW "RUD ""ELE ""THR ""AIL ""P1 ""P2 ""P3 ""MAX ""FULL""CYC1""CYC2""CYC3"
#define LEN_VTMRMODES 3
#define TR_VTMRMODES "OFF""ABS""THs""TH%""THt"
#define LEN_TELEMCHNS 3
#if defined(FRSKY_HUB)
#define TR_TELEMCHNS "AD1AD2ALTRPM"
#elif defined(WS_HOW_HIGH)
#define TR_TELEMCHNS "AD1AD2ALT"
#elif defined(FRSKY)
#define TR_TELEMCHNS "AD1AD2"
#endif
// ZERO TERMINATED STRINGS
#define TR_POPUPS "[MENU] [EXIT]"
#define TR_MENUWHENDONE " [MENU] WHEN DONE"
#define TR_FREE "free"
#define TR_DELETEMODEL "DELETE MODEL"
#define TR_COPYINGMODEL "Copying model..."
#define TR_MOVINGMODEL "Moving model..."
#define TR_LOADINGMODEL "Loading model..."
#define TR_NAME "Name"
#define TR_TIMER "Timer"
#define TR_ELIMITS "E.Limits"
#define TR_ETRIMS "E.Trims"
#define TR_TRIMINC "Trim Inc"
#define TR_TTRACE "T-Trace"
#define TR_TTRIM "T-Trim"
#define TR_BEEPCTR "Beep Ctr"
#define TR_PROTO "Proto"
#define TR_PPMFRAME "PPM frame"
#define TR_MS "ms"
#define TR_SWITCH "Switch"
#define TR_TRIMS "Trims"
#define TR_FADEIN "Fade In"
#define TR_FADEOUT "Fade Out"
#define TR_DEFAULT "(default)"
#define TR_CHECKTRIMS "Check Trims"
#define TR_SWASHTYPE "Swash Type"
#define TR_COLLECTIVE "Collective"
#define TR_SWASHRING "Swash Ring"
#define TR_ELEDIRECTION "ELE Direction"
#define TR_AILDIRECTION "AIL Direction"
#define TR_COLDIRECTION "COL Direction"
#define TR_MODE "MODE"
#define TR_NOFREEEXPO "No free expo!"
#define TR_NOFREEMIXER "No free mixer!"
#define TR_INSERTMIX "INSERT MIX "
#define TR_EDITMIX "EDIT MIX "
#define TR_SOURCE "Source"
#define TR_WEIGHT "Weight"
#define TR_OFFSET "Offset"
#define TR_TRIM "Trim"
#define TR_CURVES "Curves"
#define TR_FPHASE "F.Phase"
#define TR_WARNING "Warning"
#define TR_OFF "OFF"
#define TR_MULTPX "Multpx"
#define TR_DELAYDOWN "Delay Down"
#define TR_DELAYUP "Delay Up"
#define TR_SLOWDOWN "Slow Down"
#define TR_SLOWUP "Slow Up"
#define TR_DREXPO "DR/EXPO"
#define TR_MIXER "MIXER"
#define TR_COPYTRIMMENU "COPY TRIM [MENU]"
#define TR_CV "CV"
#define TR_SW "SW"
#define TR_ACHANNEL "A channel"
#define TR_MAX "Max"
#define TR_CALIB "Calib"
#define TR_BAR "Bar"
#define TR_ALARM "Alarm"
#define TR_USRPROTO "UsrProto"
#define TR_CLEARMIXMENU "CLEAR MIXES [MENU]"
#define TR_BEEPER "Beeper"
#define TR_CONTRAST "Contrast"
#define TR_BATTERYWARNING "Battery warning"
#define TR_INACTIVITYALARM "Inactivity alarm"
#define TR_FILTERADC "Filter ADC"
#define TR_THROTTLEREVERSE "Throttle reverse"
#define TR_MINUTEBEEP "Minute beep"
#define TR_BEEPCOUNTDOWN "Beep countdown"
#define TR_FLASHONBEEP "Flash on beep"
#define TR_LIGHTSWITCH "Light switch"
#define TR_LIGHTOFFAFTER "Light off after"
#define TR_SPLASHSCREEN "Splash screen"
#define TR_THROTTLEWARNING "Throttle Warning"
#define TR_SWITCHWARNING "Switch Warning"
#define TR_MEMORYWARNING "Memory Warning"
#define TR_ALARMWARNING "Alarm Warning"
#define TR_NODATAALARM "NO DATA Alarm"
#define TR_RXCHANNELORD "Rx Channel Ord"
#define TR_MODE2 "Mode"
#define TR_SLAVE "Slave"
#define TR_MODESRC "mode % src"
#define TR_MULTIPLIER "Multiplier"
#define TR_CAL "Cal"
#define TR_EEPROMV "EEPROM v"
#define TR_VTRIM "Trim- +"
#define TR_BG "BG"
#define TR_MENUTOSTART " [MENU] TO START "
#define TR_SETMIDPOINT " SET MIDPOINT "
#define TR_MOVESTICKSPOTS " MOVE STICKS/POTS "
#define TR_ALT "Alt:"
#define TR_RXBATT "Rx Batt:"
#define TR_RX "Rx:"
#define TR_TX "Tx:"
#define TR_HDG "Hdg:"
#define TR_SPD "Spd:"
#define TR_TEMP1 "Temp1:"
#define TR_TEMP2 "Temp2:"
#define TR_RPM "RPM:"
#define TR_FUEL "Fuel:"
#define TR_VOLTS "Volts:"
#define TR_ACCEL "Accel"
#define TR_TELE "Tele:"
#define TR_RSSI "RSSI:"
#define TR_NODATA "NO DATA"
#define TR_TM1 "TM1"
#define TR_TM2 "TM2"
#define TR_THR "THR"
#define TR_TH "TH%"
#define TR_TOT "TOT"
#define TR_TMR1LATMAXUS "tmr1Lat max us"
#define TR_TMR1LATMINUS "tmr1Lat min us"
#define TR_TMR1JITTERUS "tmr1 Jitter us"
#define TR_TMAINMAXMS "tmain max ms"
#define TR_T10MSUS "t10ms us"
#define TR_FREESTACKMINB "Free Stack min b"
#define TR_MENUTORESET "[MENU] to reset"
#define TR_PPM "PPM"
#define TR_CH "CH"
#define TR_TMR "TMR"
#define TR_MODEL "MODEL"
#define TR_FP "FP"
#define TR_EEPROMLOWMEM "EEPROM low mem"
#define TR_ALERT "ALERT"
#define TR_PRESSANYKEYTOSKIP "Press any key to skip"
#define TR_THROTTLENOTIDLE "Throttle not idle"
#define TR_RESETTHROTTLE "Reset throttle"
#define TR_ALARMSDISABLED "Alarms Disabled"
#define TR_SWITCHESNOTOFF "Switches not off"
#define TR_PLEASERESETTHEM "Please reset them"
#define TR_MESSAGE "MESSAGE"
#define TR_PRESSANYKEY "press any Key"
#define TR_BADEEPROMDATA "Bad EEprom Data"
#define TR_EEPROMFORMATTING "EEPROM Formatting"
#define TR_EEPROMOVERFLOW "EEPROM overflow"
#define TR_PULSETABOVERFLOW "PULSES OVERFLOW"
#define TR_MENURADIOSETUP "RADIO SETUP"
#define TR_MENUDATEANDTIME "DATE AND TIME"
#define TR_MENUTRAINER "TRAINER"
#define TR_MENUVERSION "VERSION"
#define TR_MENUDIAG "DIAG"
#define TR_MENUANA "ANA"
#define TR_MENUCALIBRATION "CALIBRATION"
#define TR_MENUSERROR "MENUS OVERFLOW"
#define TR_MENUMODELSEL "MODELSEL"
#define TR_MENUSETUP "SETUP"
#define TR_MENUFLIGHTPHASE "FLIGHT PHASE"
#define TR_MENUFLIGHTPHASES "FLIGHT PHASES"
#define TR_MENUHELISETUP "HELI SETUP"
#define TR_MENUDREXPO "DR/EXPO"
#define TR_MENULIMITS "LIMITS"
#define TR_MENUCURVES "CURVES"
#define TR_MENUCURVE "CURVE"
#define TR_MENUCUSTOMSWITCHES "CUSTOM SWITCHES"
#define TR_MENUFUNCSWITCHES "FUNC SWITCHES"
#define TR_MENUSAFETYSWITCHES "SAFETY SWITCHES"
#define TR_MENUTELEMETRY "TELEMETRY"
#define TR_MENUTEMPLATES "TEMPLATES"
#define TR_MENUSTAT "STAT"
#define TR_MENUDEBUG "DEBUG"