diff --git a/src/Makefile b/src/Makefile index 106b7b766..15b45a466 100644 --- a/src/Makefile +++ b/src/Makefile @@ -159,7 +159,7 @@ DSM2 = NO IRPROTOS = NO # TRANSLATIONS -# Values = cz, de, en, fr, it, se +# Values = cz, de, en, fr, it, se, es TRANSLATIONS = EN # TTS @@ -560,7 +560,7 @@ ifeq ($(PCB), STD) # STD PCB, so ... OPT = s EXTRAINCDIRS += stock - CPPDEFS += -DPCBSTD -DVARIANT=$(shell echo ${VARIANT} | bc) + CPPDEFS += -DPCBSTD -DM64 -DVARIANT=$(shell echo ${VARIANT} | bc) BOARDSRC = board_stock.cpp EEPROMSRC = eeprom_avr.cpp PULSESSRC = pulses_avr.cpp @@ -754,7 +754,7 @@ arm-stamp: @echo "#define SVN_VERS \"open9x-r$(SVNREV)\"" >> stamp-open9x-arm.txt @cat stamp-open9x-arm.txt -font.lbm: font_6x1.xbm +font.lbm: font_6x1.xbm translations/font_se.xbm translations/font_de.xbm translations/font_it.xbm translations/font_cz.xbm translations/font_fr.xbm translations/font_es.xbm @echo @echo "Convert font from xbm to lbm:" $(IMG2LBM) $< $@ char @@ -763,8 +763,9 @@ font.lbm: font_6x1.xbm $(IMG2LBM) translations/font_it.xbm translations/font_it.lbm char $(IMG2LBM) translations/font_cz.xbm translations/font_cz.lbm char $(IMG2LBM) translations/font_fr.xbm translations/font_fr.lbm char + $(IMG2LBM) translations/font_es.xbm translations/font_es.lbm char -font_dblsize.lbm: font_dblsize.xbm +font_dblsize.lbm: font_dblsize.xbm translations/font_dblsize_se.xbm translations/font_dblsize_de.xbm translations/font_dblsize_it.xbm translations/font_dblsize_fr.xbm translations/font_dblsize_es.xbm @echo @echo "Convert font from xbm to lbm:" $(IMG2LBM) $< $@ dblsize @@ -772,6 +773,7 @@ font_dblsize.lbm: font_dblsize.xbm $(IMG2LBM) translations/font_dblsize_de.xbm translations/font_dblsize_de.lbm dblsize $(IMG2LBM) translations/font_dblsize_it.xbm translations/font_dblsize_it.lbm dblsize $(IMG2LBM) translations/font_dblsize_fr.xbm translations/font_dblsize_fr.lbm dblsize + $(IMG2LBM) translations/font_dblsize_es.xbm translations/font_dblsize_es.lbm dblsize sticks.lbm: sticks_4x1.xbm @echo diff --git a/src/general_menus.cpp b/src/general_menus.cpp index 7d6704e2f..843990be7 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -92,30 +92,35 @@ void displaySlider(uint8_t x, uint8_t y, uint8_t value, uint8_t attr) enum menuGeneralSetupItems { IF_RTCLOCK(ITEM_SETUP_DATE) IF_RTCLOCK(ITEM_SETUP_TIME) + ITEM_SETUP_SOUND_LABEL, ITEM_SETUP_BEEPER_MODE, ITEM_SETUP_BEEPER_LENGTH, IF_AUDIO(ITEM_SETUP_SPEAKER_PITCH) IF_VOICE(ITEM_SETUP_SPEAKER_VOLUME) + IF_HAPTIC(ITEM_SETUP_HAPTIC_LABEL) IF_HAPTIC(ITEM_SETUP_HAPTIC_MODE) IF_HAPTIC(ITEM_SETUP_HAPTIC_LENGTH) IF_HAPTIC(ITEM_SETUP_HAPTIC_STRENGTH) IF_PCBSKY9X(ITEM_SETUP_BRIGHTNESS) ITEM_SETUP_CONTRAST, + ITEM_SETUP_ALARMS_LABEL, ITEM_SETUP_BATTERY_WARNING, IF_PCBSKY9X(ITEM_SETUP_CAPACITY_WARNING) IF_PCBSKY9X(ITEM_SETUP_TEMPERATURE_WARNING) ITEM_SETUP_INACTIVITY_ALARM, + ITEM_SETUP_MEMORY_WARNING, + ITEM_SETUP_ALARM_WARNING, IF_ROTARY_ENCODERS(ITEM_SETUP_RE_NAVIGATION) ITEM_SETUP_FILTER_ADC, ITEM_SETUP_THROTTLE_REVERSED, + ITEM_SETUP_BEEP_LABEL, ITEM_SETUP_MINUTE_BEEP, ITEM_SETUP_COUNTDOWN_BEEP, + ITEM_SETUP_BACKLIGHT_LABEL, ITEM_SETUP_FLASH_BEEP, ITEM_SETUP_BACKLIGHT_MODE, ITEM_SETUP_BACKLIGHT_DELAY, IF_SPLASH(ITEM_SETUP_DISABLE_SPLASH) - ITEM_SETUP_MEMORY_WARNING, - ITEM_SETUP_ALARM_WARNING, IF_FRSKY(ITEM_SETUP_TIMEZONE) IF_FRSKY(ITEM_SETUP_GPSFORMAT) ITEM_SETUP_RX_CHANNEL_ORD, @@ -133,7 +138,7 @@ void menuGeneralSetup(uint8_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) 0, 0, IF_PCBSKY9X(0) IF_PCBSKY9X(0) 0, IF_ROTARY_ENCODERS(0) 0, 0, 0, 0, 0, 0, 0, IF_SPLASH(0) 0, 0, IF_FRSKY(0) IF_FRSKY(0) 0, (uint8_t)-1, 1}); + MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) (uint8_t)-1, 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC((uint8_t)-1) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) 0, (uint8_t)-1, 0, IF_PCBSKY9X(0) IF_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, 0, (uint8_t)-1, 0, 0, (uint8_t)-1, 0, 0, 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, (uint8_t)-1, 1}); uint8_t sub = m_posVert - 1; @@ -206,15 +211,19 @@ void menuGeneralSetup(uint8_t event) break; #endif + case ITEM_SETUP_SOUND_LABEL: + lcd_putsLeft(y, STR_SOUND_LABEL); + break; + case ITEM_SETUP_BEEPER_MODE: - g_eeGeneral.beeperMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_BEEPERMODE, STR_VBEEPMODE, g_eeGeneral.beeperMode, -2, 1, attr, event); + g_eeGeneral.beeperMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBEEPMODE, g_eeGeneral.beeperMode, -2, 1, attr, event); #if defined(FRSKY) if (attr && checkIncDec_Ret) FRSKY_setModelAlarms(); #endif break; case ITEM_SETUP_BEEPER_LENGTH: - SLIDER(y, g_eeGeneral.beeperLength, -2, 2, STR_BEEPERLEN, STR_VBEEPLEN, event, attr); + SLIDER(y, g_eeGeneral.beeperLength, -2, 2, STR_LENGTH, STR_VBEEPLEN, event, attr); break; #if defined(AUDIO) @@ -253,12 +262,16 @@ void menuGeneralSetup(uint8_t event) #endif #if defined(HAPTIC) + case ITEM_SETUP_HAPTIC_LABEL: + lcd_putsLeft(y, STR_HAPTIC_LABEL); + break; + case ITEM_SETUP_HAPTIC_MODE: - g_eeGeneral.hapticMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_HAPTICMODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); + g_eeGeneral.hapticMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); break; case ITEM_SETUP_HAPTIC_LENGTH: - SLIDER(y, g_eeGeneral.hapticLength, -2, 2, STR_HAPTICLENGTH, STR_VBEEPLEN, event, attr); + SLIDER(y, g_eeGeneral.hapticLength, -2, 2, STR_LENGTH, STR_VBEEPLEN, event, attr); break; case ITEM_SETUP_HAPTIC_STRENGTH: @@ -292,12 +305,30 @@ void menuGeneralSetup(uint8_t event) } break; + case ITEM_SETUP_ALARMS_LABEL: + lcd_putsLeft(y, STR_ALARMS_LABEL); + break; + case ITEM_SETUP_BATTERY_WARNING: lcd_putsLeft( y,STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V break; + case ITEM_SETUP_MEMORY_WARNING: + { + uint8_t b = 1-g_eeGeneral.disableMemoryWarning; + g_eeGeneral.disableMemoryWarning = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event ) ; + break; + } + + case ITEM_SETUP_ALARM_WARNING: + { + uint8_t b = 1-g_eeGeneral.disableAlarmWarning; + g_eeGeneral.disableAlarmWarning = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event ) ; + break; + } + #if defined(PCBSKY9X) case ITEM_SETUP_CAPACITY_WARNING: lcd_putsLeft(y, STR_CAPAWARNING); @@ -335,6 +366,10 @@ void menuGeneralSetup(uint8_t event) g_eeGeneral.filterInput = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_FILTERADC, STR_VFILTERADC, g_eeGeneral.filterInput, 0, 2, attr, event); break; + case ITEM_SETUP_BEEP_LABEL: + lcd_putsLeft(y, STR_BEEP_LABEL); + break; + case ITEM_SETUP_THROTTLE_REVERSED: g_eeGeneral.throttleReversed = onoffMenuItem( g_eeGeneral.throttleReversed, RADIO_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ; break; @@ -347,12 +382,16 @@ void menuGeneralSetup(uint8_t event) g_eeGeneral.preBeep = onoffMenuItem( g_eeGeneral.preBeep, RADIO_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, attr, event ) ; break; + case ITEM_SETUP_BACKLIGHT_LABEL: + lcd_putsLeft(y, STR_BACKLIGHT_LABEL); + break; + case ITEM_SETUP_FLASH_BEEP: - g_eeGeneral.flashBeep = onoffMenuItem( g_eeGeneral.flashBeep, RADIO_SETUP_2ND_COLUMN, y, STR_FLASHONBEEP, attr, event ) ; + g_eeGeneral.flashBeep = onoffMenuItem( g_eeGeneral.flashBeep, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ; break; case ITEM_SETUP_BACKLIGHT_MODE: - g_eeGeneral.backlightMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_BLMODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); + g_eeGeneral.backlightMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); break; case ITEM_SETUP_BACKLIGHT_DELAY: @@ -371,20 +410,6 @@ void menuGeneralSetup(uint8_t event) } #endif - case ITEM_SETUP_MEMORY_WARNING: - { - uint8_t b = 1-g_eeGeneral.disableMemoryWarning; - g_eeGeneral.disableMemoryWarning = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event ) ; - break; - } - - case ITEM_SETUP_ALARM_WARNING: - { - uint8_t b = 1-g_eeGeneral.disableAlarmWarning; - g_eeGeneral.disableAlarmWarning = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event ) ; - break; - } - #if defined(FRSKY) case ITEM_SETUP_TIMEZONE: lcd_putsLeft(y, STR_TIMEZONE); @@ -405,7 +430,7 @@ void menuGeneralSetup(uint8_t event) break; case ITEM_SETUP_STICK_MODE_LABELS: - lcd_putsLeft(y, STR_MODE); + lcd_putsLeft(y, NO_INDENT(STR_MODE)); for (uint8_t i=0; i<4; i++) lcd_img((6+4*i)*FW, y, sticks, i, 0); break; diff --git a/src/lcd.cpp b/src/lcd.cpp index 4b03c7f1f..92110c111 100644 --- a/src/lcd.cpp +++ b/src/lcd.cpp @@ -194,7 +194,7 @@ void lcd_putsnAtt(xcoord_t x,uint8_t y,const pm_char * s,uint8_t len,uint8_t mod if (mode&DBLSIZE) x += FW-1; } else { - x += (c*FW); + x += (c*FW/2); } s++; len--; diff --git a/src/main_views.cpp b/src/main_views.cpp index 80562a4f8..5c34e67b4 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -396,13 +396,13 @@ void menuMainView(uint8_t event) s_gvar_timer--; s_warning = PSTR("Global Variable"); displayBox(); -#if defined(PCBSKY9X) - lcd_putsnAtt(16, 5*FH, g_model.gvars[s_gvar_last].name, sizeof(g_model.gvars[s_gvar_last].name), ZCHAR); - lcd_putsAtt(16+7*FW, 5*FH, PSTR("[\004]"), BOLD); - lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last), BOLD); -#else +#if defined(M64) lcd_putsAtt(16+4*FW, 5*FH, PSTR("[\004]"), BOLD); - lcd_outdezAtt(16+4*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last), BOLD); + lcd_outdezAtt(16+4*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, s_perout_flight_phase), BOLD); +#else + lcd_putsnAtt(16, 5*FH, g_model.gvarsNames[s_gvar_last], sizeof(gvar_name_t), ZCHAR); + lcd_putsAtt(16+7*FW, 5*FH, PSTR("[\004]"), BOLD); + lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, s_perout_flight_phase), BOLD); #endif s_warning = NULL; } diff --git a/src/menus.cpp b/src/menus.cpp index e7658bf2f..b6f73fb15 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -618,7 +618,7 @@ int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, bool invers = attr&INVERS; if (invers && event == EVT_KEY_LONG(KEY_MENU)) { s_editMode = !s_editMode; - value = ((value >= 126 || value <= -126) ? GVAR(value, min, max) : 126); + value = ((value >= 126 || value <= -126) ? GET_GVAR(value, min, max, s_perout_flight_phase) : 126); eeDirty(EE_MODEL); } if (value >= 126 || value <= -126) { diff --git a/src/model_menus.cpp b/src/model_menus.cpp index d251ca00e..3ee3665ec 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -757,7 +757,7 @@ void menuModelSetup(uint8_t event) break; case ITEM_MODEL_PROTOCOL: - lcd_putsLeft(y, STR_PROTO); + lcd_putsLeft(y, NO_INDENT(STR_PROTO)); lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, protocol, (attr && m_posHorz==0 ? (editMode>0 ? BLINK|INVERS : INVERS):0)); if (protocol <= PROTO_PPMSIM) { @@ -856,7 +856,7 @@ static uint8_t s_currIdx; #if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_CZ) || defined(TRANSLATIONS_SE) || defined(TRANSLATIONS_DE) #define MIXES_2ND_COLUMN (13*FW) #else -#define MIXES_2ND_COLUMN (10*FW) +#define MIXES_2ND_COLUMN (11*FW) #endif #if defined(PCBX9D) @@ -914,29 +914,71 @@ PhasesType editPhases(uint8_t x, uint8_t y, uint8_t event, PhasesType value, uin return value; } +enum menuModelPhaseItems { + ITEM_MODEL_PHASE_NAME, + ITEM_MODEL_PHASE_SWITCH, + ITEM_MODEL_PHASE_TRIMS, + IF_ROTARY_ENCODERS(ITEM_MODEL_PHASE_ROTARY_ENCODERS) + ITEM_MODEL_PHASE_FADE_IN, + ITEM_MODEL_PHASE_FADE_OUT, +#if defined(GVARS) && !defined(M64) + ITEM_MODEL_PHASE_GVARS_LABEL, + ITEM_MODEL_PHASE_GV1, + ITEM_MODEL_PHASE_GV2, + ITEM_MODEL_PHASE_GV3, + ITEM_MODEL_PHASE_GV4, + ITEM_MODEL_PHASE_GV5, +#endif + ITEM_MODEL_PHASE_MAX +}; + void menuModelPhaseOne(uint8_t event) { PhaseData *phase = phaseaddress(s_currIdx); putsFlightPhase(13*FW, 0, s_currIdx+1, (getFlightPhase()==s_currIdx ? BOLD : 0)); -#define MAX_TRIM_LINE (3+NUM_ROTARY_ENCODERS) +#if defined(GVARS) && !defined(M64) + static bool editingName = false; + if (editingName && s_editMode <= 0) editingName = false; + if (!editingName && s_editMode > 0 && m_posHorz == 0) editingName = true; - SUBMENU(STR_MENUFLIGHTPHASE, (s_currIdx==0 ? 3 : 5), {ZCHAR|(sizeof(phase->name)-1), 0, MAX_TRIM_LINE, 0/*, 0*/}); + static const pm_uint8_t mstate_tab_phase1[] PROGMEM = {ZCHAR|(sizeof(phase->name)-1), 0, 0, (uint8_t)-1, 2, 2, 2, 2, 2}; + static const pm_uint8_t mstate_tab_others[] PROGMEM = {ZCHAR|(sizeof(phase->name)-1), 0, 3, IF_ROTARY_ENCODERS(NUM_ROTARY_ENCODERS-1) 0, 0, (uint8_t)-1, 2, 2, 2, 2, 2}; + + if (!check(event, 0, NULL, 0, (s_currIdx == 0) ? mstate_tab_phase1 : mstate_tab_others, DIM(mstate_tab_others)-1, ITEM_MODEL_PHASE_MAX - 1 - (s_currIdx==0 ? 3 : 0))) return; + + TITLE(STR_MENUFLIGHTPHASE); + + #define PHASE_ONE_FIRST_LINE (1*FH) +#else + SUBMENU(STR_MENUFLIGHTPHASE, 3 + (s_currIdx==0 ? 0 : 2 + (bool)NUM_ROTARY_ENCODERS), {ZCHAR|(sizeof(phase->name)-1), 0, 3, IF_ROTARY_ENCODERS(NUM_ROTARY_ENCODERS-1) 0/*, 0*/}); + #define PHASE_ONE_FIRST_LINE (2*FH) +#endif int8_t sub = m_posVert; int8_t editMode = s_editMode; - for (uint8_t i=0, k=0, y=2*FH; i<5; i++, k++, y+=FH) { - if (s_currIdx == 0 && i==1) i = 3; +#if defined(GVARS) && !defined(M64) + if (s_currIdx == 0 && sub>=ITEM_MODEL_PHASE_SWITCH) sub += ITEM_MODEL_PHASE_FADE_IN-ITEM_MODEL_PHASE_SWITCH; + + for (uint8_t k=0; k<7; k++) { + uint8_t y = (k+1) * FH; + int8_t i = k + s_pgOfs; + if (s_currIdx == 0 && i>=ITEM_MODEL_PHASE_SWITCH) i += ITEM_MODEL_PHASE_FADE_IN-ITEM_MODEL_PHASE_SWITCH; + uint8_t attr = (sub==i ? (editMode>0 ? BLINK|INVERS : INVERS) : 0); +#else + for (uint8_t i=0, k=0, y=PHASE_ONE_FIRST_LINE; i0 ? BLINK|INVERS : INVERS) : 0); +#endif switch(i) { - case 0: + case ITEM_MODEL_PHASE_NAME: editName(MIXES_2ND_COLUMN, y, phase->name, sizeof(phase->name), event, attr, m_posHorz); break; - case 1: + case ITEM_MODEL_PHASE_SWITCH: phase->swtch = switchMenuItem(MIXES_2ND_COLUMN, y, phase->swtch, attr, event); break; - case 2: + case ITEM_MODEL_PHASE_TRIMS: lcd_putsLeft(y, STR_TRIMS); for (uint8_t t=0; t0) ? BLINK|INVERS : INVERS) : 0); @@ -950,10 +992,14 @@ void menuModelPhaseOne(uint8_t event) } } } + break; + #if defined(ROTARY_ENCODERS) + case ITEM_MODEL_PHASE_ROTARY_ENCODERS: + lcd_putsLeft(y, PSTR("R.Encs")); for (uint8_t t=0; t0) ? BLINK|INVERS : INVERS) : 0); - if (attr && m_posHorz==4+t && ((editMode>0) || p1valdiff)) { + putsRotaryEncoderMode(MIXES_2ND_COLUMN+(t*FW), y, s_currIdx, t, (attr && m_posHorz==t) ? ((editMode>0) ? BLINK|INVERS : INVERS) : 0); + if (attr && m_posHorz==t && ((editMode>0) || p1valdiff)) { #if defined(EXTRA_ROTARY_ENCODERS) int16_t v; if(t < (NUM_ROTARY_ENCODERS - NUM_ROTARY_ENCODERS_EXTRA)) @@ -978,14 +1024,60 @@ void menuModelPhaseOne(uint8_t event) } } } -#endif break; - case 3: +#endif + + case ITEM_MODEL_PHASE_FADE_IN: phase->fadeIn = editDelay(y, event, attr, STR_FADEIN, phase->fadeIn); break; - case 4: + case ITEM_MODEL_PHASE_FADE_OUT: phase->fadeOut = editDelay(y, event, attr, STR_FADEOUT, phase->fadeOut); break; + +#if defined(GVARS) && !defined(M64) + + case ITEM_MODEL_PHASE_GVARS_LABEL: + lcd_putsLeft(y, PSTR("Global Variables")); + break; + + default: + { + uint8_t idx = i-ITEM_MODEL_PHASE_GV1; + + if (editingName) + editName(4*FW, y, g_model.gvarsNames[idx], sizeof(gvar_name_t), event, attr, m_posHorz); + else + lcd_putsnAtt(4*FW, y, g_model.gvarsNames[idx], sizeof(gvar_name_t), ZCHAR|(m_posHorz==0 ? attr : 0)); + + lcd_putsLeft(y, PSTR(" ")); + putsStrIdx(INDENT_WIDTH, y, STR_GV, idx+1); + + int16_t v = phase->gvars[idx]; + if (v > GVAR_MAX) { + uint8_t p = v - GVAR_MAX - 1; + if (p >= s_currIdx) p++; + putsFlightPhase(MIXES_2ND_COLUMN, y, p+1, !editingName && m_posHorz==1 ? attr : 0); + } + else { + lcd_putsAtt(MIXES_2ND_COLUMN, y, PSTR("Own"), !editingName && m_posHorz==1 ? attr : 0); + } + if (attr && !editingName && s_currIdx>0 && m_posHorz==1 && ((editMode>0) || p1valdiff)) { + if (v < GVAR_MAX) v = GVAR_MAX; + v = checkIncDec(event, v, GVAR_MAX, GVAR_MAX+MAX_PHASES-1, EE_MODEL); + if (checkIncDec_Ret) { + if (v == GVAR_MAX) v = 0; + phase->gvars[idx] = v; + } + } + + uint8_t p = getGVarFlightPhase(s_currIdx, idx); + lcd_outdezAtt(21*FW, y, GVAR_VALUE(idx, p), !editingName && m_posHorz==2 ? attr : 0); + if (attr && !editingName && m_posHorz==2 && ((editMode>0) || p1valdiff)) + CHECK_INCDEC_MODELVAR(event, GVAR_VALUE(idx, p), -125, +125); + + break; + } +#endif } } } @@ -1634,7 +1726,7 @@ void menuModelMixOne(uint8_t event) break; #endif case MIX_FIELD_SOURCE: - lcd_putsLeft(y, STR_SOURCE); + lcd_putsLeft(y, NO_INDENT(STR_SOURCE)); putsMixerSource(MIXES_2ND_COLUMN, y, md2->srcRaw, attr); if(attr) CHECK_INCDEC_MODELVAR(event, md2->srcRaw, 1, NUM_XCHNMIX); break; @@ -1643,8 +1735,8 @@ void menuModelMixOne(uint8_t event) md2->weight = gvarMenuItem(MIXES_2ND_COLUMN, y, md2->weight, -125, 125, attr|LEFT, event); break; case MIX_FIELD_OFFSET: - lcd_putsLeft(y, STR_OFFSET); - md2->sOffset = gvarMenuItem(MIXES_2ND_COLUMN, y, md2->sOffset, -125, 125, attr|LEFT, event); + lcd_putsLeft(y, NO_INDENT(STR_OFFSET)); + md2->offset = gvarMenuItem(MIXES_2ND_COLUMN, y, md2->offset, -125, 125, attr|LEFT, event); break; case MIX_FIELD_TRIM: { @@ -2227,45 +2319,22 @@ void menuModelLimits(uint8_t event) } } -#if defined(GVARS) && defined(PCBSKY9X) -void menuModelRegisterOne(uint8_t event) -{ - gvar_t *reg = &g_model.gvars[s_curveChan]; - - putsStrIdx(11*FW, 0, STR_GV, s_curveChan+1); - - // TODO Translation - SUBMENU(PSTR("GLOBAL VAR"), 2, {ZCHAR|(sizeof(reg->name)-1), 0}); - - int8_t sub = m_posVert; - - for (uint8_t i=0, k=0, y=2*FH; i<2; i++, k++, y+=FH) { - uint8_t attr = (sub==k ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); - switch(i) { - case 0: - editName(MIXES_2ND_COLUMN, y, reg->name, sizeof(reg->name), event, attr, m_posHorz); - break; - case 1: - lcd_putsLeft(y, PSTR("Value")); - lcd_outdezAtt(MIXES_2ND_COLUMN, y, reg->value, attr|LEFT); - if (attr) CHECK_INCDEC_MODELVAR(event, reg->value, -125, 125); - break; - } - } -} -#endif - #if defined(CURVES) #if defined(GVARS) #define CURVE_SELECTED() (sub >= 0 && sub < MAX_CURVES) +#define GVAR_SELECTED() (sub >= MAX_CURVES) #else #define CURVE_SELECTED() (sub >= 0) #endif void menuModelCurvesAll(uint8_t event) { +#if defined(GVARS) && defined(M64) SIMPLE_MENU(STR_MENUCURVES, menuTabModel, e_CurvesAll, 1+MAX_CURVES+MAX_GVARS); +#else + SIMPLE_MENU(STR_MENUCURVES, menuTabModel, e_CurvesAll, 1+MAX_CURVES); +#endif int8_t sub = m_posVert - 1; @@ -2283,12 +2352,6 @@ void menuModelCurvesAll(uint8_t event) s_curveChan = sub; pushMenu(menuModelCurveOne); } -#if defined(GVARS) && defined(PCBSKY9X) - else if (sub >= MAX_CURVES) { - s_curveChan = sub-MAX_CURVES; - pushMenu(menuModelRegisterOne); - } -#endif break; } @@ -2296,25 +2359,17 @@ void menuModelCurvesAll(uint8_t event) uint8_t y = FH + i*FH; uint8_t k = i + s_pgOfs; uint8_t attr = (sub == k ? INVERS : 0); -#if defined(GVARS) +#if defined(GVARS) && defined(M64) if (k < MAX_CURVES) { putsStrIdx(0, y, STR_CV, k+1, attr); } else { -#if defined(PCBSKY9X) - putsStrIdx(0, y, STR_GV, k-MAX_CURVES+1, attr); - if (sub >= MAX_CURVES) { - lcd_outdezAtt(10*FW, y, GVAR_VALUE(k-MAX_CURVES)); - lcd_putsnAtt(12*FW, y, g_model.gvars[k-MAX_CURVES].name, sizeof(g_model.gvars[k-MAX_CURVES].name), ZCHAR); - } -#else putsStrIdx(0, y, STR_GV, k-MAX_CURVES+1); - if (sub >= MAX_CURVES) { + if (GVAR_SELECTED()) { if (attr && s_editMode>0) attr |= BLINK; - lcd_outdezAtt(10*FW, y, GVAR_VALUE(k-MAX_CURVES), attr); - if (attr) CHECK_INCDEC_MODELVAR(event, g_model.gvars[k-MAX_CURVES], -125, 125); + lcd_outdezAtt(10*FW, y, GVAR_VALUE(k-MAX_CURVES, -1), attr); + if (attr) g_model.gvars[k-MAX_CURVES] = checkIncDec(event, g_model.gvars[k-MAX_CURVES], -1000, 1000, EE_MODEL); } -#endif } #else putsStrIdx(0, y, STR_CV, k+1, attr); @@ -2892,7 +2947,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_A1_RANGE: case ITEM_TELEMETRY_A2_RANGE: - lcd_puts(4, y, STR_RANGE); + lcd_putsLeft(y, STR_RANGE); putsTelemetryChannel(TELEM_COL2, y, dest, 255-channel.offset, ((attr && m_posHorz==0) ? blink : 0)|NO_UNIT|LEFT); lcd_putsiAtt(lcdLastPos, y, STR_VTELEMUNIT, channel.type, (attr && m_posHorz==1 ? blink : 0)); if (attr && (s_editMode>0 || p1valdiff)) { @@ -2918,7 +2973,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_A1_OFFSET: case ITEM_TELEMETRY_A2_OFFSET: - lcd_puts(4, y, STR_OFFSET); + lcd_putsLeft(y, STR_OFFSET); putsTelemetryChannel(TELEM_COL2, y, dest, 0, LEFT|attr); if (attr) channel.offset = checkIncDec(event, channel.offset, -256, 256, EE_MODEL); break; @@ -2929,7 +2984,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_A2_ALARM2: { uint8_t j = ((k==ITEM_TELEMETRY_A1_ALARM1 || k==ITEM_TELEMETRY_A2_ALARM1) ? 0 : 1); - lcd_puts(4, y, STR_ALARM); + lcd_putsLeft(y, STR_ALARM); lcd_putsiAtt(TELEM_COL2, y, STR_VALARM, ALARM_LEVEL(ch, j), (attr && m_posHorz==0) ? blink : 0); lcd_putsiAtt(TELEM_COL2+4*FW, y, STR_VALARMFN, ALARM_GREATER(ch, j), (attr && m_posHorz==1) ? blink : 0); putsTelemetryChannel(TELEM_COL2+6*FW, y, dest, channel.alarms_value[j], (attr && m_posHorz==2 ? blink : 0) | LEFT); @@ -2963,7 +3018,7 @@ void menuModelTelemetry(uint8_t event) case ITEM_TELEMETRY_RSSI_ALARM1: case ITEM_TELEMETRY_RSSI_ALARM2: { uint8_t j = k-ITEM_TELEMETRY_RSSI_ALARM1; - lcd_puts(4, y, STR_ALARM); + lcd_putsLeft(y, STR_ALARM); lcd_putsiAtt(TELEM_COL2, y, STR_VALARM, ((2+j+g_model.frsky.rssiAlarms[j].level)%4), (attr && m_posHorz==0) ? blink : 0); lcd_putc(TELEM_COL2+4*FW, y, '<'); lcd_outdezNAtt(TELEM_COL2+6*FW, y, getRssiAlarmValue(j), LEFT|((attr && m_posHorz==1) ? blink : 0), 3); @@ -2987,26 +3042,26 @@ void menuModelTelemetry(uint8_t event) break; case ITEM_TELEMETRY_USR_PROTO: - lcd_puts(4, y, STR_PROTO); + lcd_putsLeft(y, STR_PROTO); lcd_putsiAtt(TELEM_COL2, y, STR_VTELPROTO, g_model.frsky.usrProto, attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.usrProto, 0, 2); break; case ITEM_TELEMETRY_USR_BLADES: - lcd_puts(4, y, STR_BLADES); + lcd_putsLeft(y, STR_BLADES); lcd_outdezAtt(TELEM_COL2+FWNUM, y, 2+g_model.frsky.blades, attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.blades, 0, 3); break; #endif case ITEM_TELEMETRY_USR_VOLTAGE_SOURCE: - lcd_puts(4, y, STR_VOLTAGE); + lcd_putsLeft(y, STR_VOLTAGE); lcd_putsiAtt(TELEM_COL2, y, STR_VOLTSRC, g_model.frsky.voltsSource+1, attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.voltsSource, 0, 3); break; case ITEM_TELEMETRY_USR_CURRENT_SOURCE: - lcd_puts(4, y, STR_CURRENT); + lcd_putsLeft(y, STR_CURRENT); lcd_putsiAtt(TELEM_COL2, y, STR_VOLTSRC, g_model.frsky.currentSource, attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.currentSource, 0, 3); break; @@ -3017,13 +3072,13 @@ void menuModelTelemetry(uint8_t event) break; case ITEM_TELEMETRY_VARIO_SOURCE: - lcd_puts(4, y, STR_SOURCE); + lcd_putsLeft(y, STR_SOURCE); lcd_putsiAtt(TELEM_COL2, y, STR_VARIOSRC, g_model.frsky.varioSource, attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.frsky.varioSource, VARIO_SOURCE_FIRST, VARIO_SOURCE_LAST); break; case ITEM_TELEMETRY_VARIO_SPEED: - lcd_puts(4, y, STR_LIMIT); + lcd_putsLeft(y, STR_LIMIT); if (!g_model.frsky.varioSpeedDownMin) lcd_putsAtt(TELEM_COL2, y, STR_OFF, ((attr && m_posHorz==0) ? blink : 0)); else @@ -3102,7 +3157,7 @@ void menuModelTelemetry(uint8_t event) if (IS_BARS_SCREEN(screenIndex)) { FrSkyBarData & bar = g_model.frsky.screens[screenIndex].bars[lineIndex]; uint8_t barSource = bar.source; - lcd_putsiAtt(4, y, STR_VTELEMCHNS, barSource, (attr && m_posHorz==0) ? blink : 0); + lcd_putsiAtt(INDENT_WIDTH, y, STR_VTELEMCHNS, barSource, (attr && m_posHorz==0) ? blink : 0); if (barSource) { putsTelemetryChannel(56-3*FW, y, barSource-1, convertBarValue(barSource, bar.barMin), (attr && m_posHorz==1 ? blink : 0) | LEFT); putsTelemetryChannel(14*FW-3, y, barSource-1, convertBarValue(barSource, 31-bar.barMax), (attr && m_posHorz==2 ? blink : 0) | LEFT); @@ -3127,7 +3182,7 @@ void menuModelTelemetry(uint8_t event) else { for (uint8_t c=0; c<2; c++) { uint8_t & value = g_model.frsky.screens[screenIndex].lines[lineIndex].sources[c]; - lcd_putsiAtt(c==0?4:TELEM_COL2, y, STR_VTELEMCHNS, value, (attr && m_posHorz==c) ? blink : 0); + lcd_putsiAtt(c==0?INDENT_WIDTH:TELEM_COL2, y, STR_VTELEMCHNS, value, (attr && m_posHorz==c) ? blink : 0); if (attr && m_posHorz==c && (s_editMode>0 || p1valdiff)) { CHECK_INCDEC_MODELVAR(event, value, 0, g_model.frsky.usrProto ? ((lineIndex==3 && c==0) ? TELEM_STATUS_MAX : TELEM_DISPLAY_MAX) : TELEM_NOUSR_MAX); } diff --git a/src/myeeprom.h b/src/myeeprom.h index 79524c6af..ad095c2b0 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -302,7 +302,7 @@ PACK(typedef struct t_MixData { uint8_t speedUp; uint8_t speedDown; uint8_t srcRaw; - int8_t sOffset; + int8_t offset; char name[LEN_EXPOMIX_NAME]; }) MixData; #else @@ -325,7 +325,7 @@ PACK(typedef struct t_MixData { uint8_t speedUp:4; uint8_t speedDown:4; int8_t curveParam; - int8_t sOffset; + int8_t offset; }) MixData; #endif @@ -616,41 +616,37 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data #define ROTARY_ENCODER_ARRAY_EXTRA #endif -#if defined(PCBSTD) +#if defined(M64) #define TRIM_ARRAY int8_t trim[4]; int8_t trim_ext:8 #else #define TRIM_ARRAY int16_t trim[4] #endif -#if defined(PCBSKY9X) -PACK(typedef struct { - int8_t value; - char name[6]; -}) gvar_t; -#define GVAR_VALUE(x) g_model.gvars[x].value -#else -typedef int8_t gvar_t; -#define GVAR_VALUE(x) g_model.gvars[x] +typedef int16_t gvar_t; + +#if !defined(M64) +typedef char gvar_name_t[6]; +#define GVAR_MAX 1024 #endif -#if defined(PCBSTD) -#define PHASE_GVARS_DATA -#if defined(GVARS) +#if defined(M64) && defined(GVARS) #define MAX_GVARS 5 #define MODEL_GVARS_DATA gvar_t gvars[MAX_GVARS] +#define PHASE_GVARS_DATA +#define GVAR_VALUE(x, p) g_model.gvars[x] +#elif defined(M64) +#define MAX_GVARS 0 +#define MODEL_GVARS_DATA +#define PHASE_GVARS_DATA +#elif defined(GVARS) +#define MAX_GVARS 5 +#define MODEL_GVARS_DATA gvar_name_t gvarsNames[MAX_GVARS] +#define PHASE_GVARS_DATA gvar_t gvars[MAX_GVARS] +#define GVAR_VALUE(x, p) g_model.phaseData[p].gvars[x] #else #define MAX_GVARS 0 #define MODEL_GVARS_DATA -#endif -#else -#define PHASE_GVARS_DATA -#if defined(GVARS) -#define MAX_GVARS 5 -#define MODEL_GVARS_DATA gvar_t gvars[MAX_GVARS] -#else -#define MAX_GVARS 0 -#define MODEL_GVARS_DATA gvar_t gvars[5] -#endif +#define PHASE_GVARS_DATA gvar_t gvars[5] #endif PACK(typedef struct t_PhaseData { @@ -752,7 +748,7 @@ enum Dsm2Variants { #if defined(MAVLINK) #define TELEMETRY_DATA MavlinkData mavlink -#elif defined(FRSKY) || !defined(PCBSTD) +#elif defined(FRSKY) || !defined(M64) #define TELEMETRY_DATA FrSkyData frsky #else #define TELEMETRY_DATA diff --git a/src/open9x.cpp b/src/open9x.cpp index 269155af4..abbe639f8 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -77,7 +77,7 @@ const pm_uchar splashdata[] PROGMEM = { 'S','P','S',0, const pm_uchar * splash_lbm = splashdata+4; #endif -#if defined(PCBGRUVIN9X) || defined(PCBSKY9X) || defined(M128) || defined(EXTSTD) +#if !defined(M64) || defined(EXTSTD) const pm_uchar asterisk_lbm[] PROGMEM = { #include "asterisk.lbm" }; @@ -205,7 +205,7 @@ CustomSwData *cswaddress(uint8_t idx) return &g_model.customSw[idx]; } -#if defined(PCBSTD) && !defined(M128) +#if defined(M64) void memclear(void *ptr, uint8_t size) { memset(ptr, 0, size); @@ -317,6 +317,7 @@ int16_t intpol(int16_t x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 10 } #if defined(CURVES) +// TODO use an enum here and replace CURVE_BASE int16_t applyCurve(int16_t x, int8_t idx) { /* already tried to have only one return at the end */ @@ -447,9 +448,9 @@ void applyExpos(int16_t *anas) if (ed.curveMode == MODE_CURVE) v = applyCurve(v, curveParam); else - v = expo(v, GVAR(curveParam, -100, 100)); + v = expo(v, GET_GVAR(curveParam, -100, 100, s_perout_flight_phase)); } - v = ((int32_t)v * GVAR(ed.weight, 0, 100)) / 100; + v = ((int32_t)v * GET_GVAR(ed.weight, 0, 100, s_perout_flight_phase)) / 100; anas[cur_chn] = v; } } @@ -829,11 +830,12 @@ int8_t getMovedSwitch() } #ifdef FLIGHT_PHASES +// TODO int8_t? uint8_t getFlightPhase() { for (uint8_t i=1; iswtch && getSwitch(phase->swtch, 0)) { + if (phase->swtch && getSwitch(phase->swtch, 0)) { // TODO phase->swtch needed? return i; } } @@ -844,7 +846,7 @@ uint8_t getFlightPhase() int16_t getRawTrimValue(uint8_t phase, uint8_t idx) { PhaseData *p = phaseaddress(phase); -#if defined(PCBSTD) +#if defined(M64) return (((int16_t)p->trim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03); #else return p->trim[idx]; @@ -859,7 +861,7 @@ int16_t getTrimValue(uint8_t phase, uint8_t idx) void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim) { PhaseData *p = phaseaddress(phase); -#if defined(PCBSTD) +#if defined(M64) p->trim[idx] = (int8_t)(trim >> 2); p->trim_ext = (p->trim_ext & ~(0x03 << (2*idx))) + (((trim & 0x03) << (2*idx))); #else @@ -931,22 +933,59 @@ void incRotaryEncoder(uint8_t idx, int8_t inc) #endif #if defined(GVARS) -int8_t GVAR(int8_t x, int8_t min, int8_t max) -{ - return (x >= 126 || x <= -126) ? limit(min, GVAR_VALUE((uint8_t)x - 126), max) : x; -} - uint8_t s_gvar_timer = 0; uint8_t s_gvar_last = 0; -void setGVarValue(uint8_t x, int8_t value) + +#if defined(M64) +int16_t getGVarValue(int8_t x, int16_t min, int16_t max) { - if (GVAR_VALUE(x) != value) { - GVAR_VALUE(x) = value; + return (x >= 126 || x <= -126) ? limit(min, GVAR_VALUE((uint8_t)x - 126, -1), max) : x; +} + +void setGVarValue(uint8_t idx, int8_t value) +{ + if (GVAR_VALUE(idx, -1) != value) { + GVAR_VALUE(idx, -1) = value; eeDirty(EE_MODEL); - s_gvar_last = x; + s_gvar_last = idx; s_gvar_timer = GVAR_DISPLAY_TIME; } } +#else +uint8_t getGVarFlightPhase(uint8_t phase, uint8_t idx) +{ + for (uint8_t i=0; i= phase) result++; + phase = result; + } + return 0; +} + +int16_t getGVarValue(int8_t x, int16_t min, int16_t max, int8_t phase) +{ + if (x >= -125 && x <= 125) + return x; + + uint8_t idx = (uint8_t)x - 126; + return limit(min, GVAR_VALUE(idx, getGVarFlightPhase(phase, idx)), max); +} + +void setGVarValue(uint8_t idx, int8_t value, int8_t phase) +{ + phase = getGVarFlightPhase(phase, idx); + if (GVAR_VALUE(idx, phase) != value) { + GVAR_VALUE(idx, phase) = value; + eeDirty(EE_MODEL); + s_gvar_last = idx; + s_gvar_timer = GVAR_DISPLAY_TIME; + } +} +#endif + #endif #if defined(FRSKY) || defined(PCBSKY9X) @@ -1246,7 +1285,7 @@ void message(const pm_char *title, const pm_char *t, const char *last MESSAGE_SO #if defined(PCBX9D) lcd_img(DISPLAY_W-29, 0, asterisk_lbm, 0, 0); #endif -#if defined(PCBGRUVIN9X) || defined(PCBSKY9X) || defined(M128) || defined(EXTSTD) +#if !defined(M64) || defined(EXTSTD) lcd_img(2, 0, asterisk_lbm, 0, 0); #else lcd_putsAtt(0, 0, PSTR("(!)"), DBLSIZE); @@ -1270,7 +1309,7 @@ void message(const pm_char *title, const pm_char *t, const char *last MESSAGE_SO } #if defined(GVARS) -int8_t *trimPtr[NUM_STICKS] = { NULL, NULL, NULL, NULL }; +int8_t trimGvar[NUM_STICKS] = { -1, -1, -1, -1 }; #endif #if defined(PCBSTD) @@ -1289,21 +1328,29 @@ void checkTrims() #endif // LH_DWN LH_UP LV_DWN LV_UP RV_DWN RV_UP RH_DWN RH_UP uint8_t idx = CONVERT_MODE(1+k/2) - 1; - uint8_t phase = getTrimFlightPhase(s_perout_flight_phase, idx); + #if defined(GVARS) -#define TRIM_REUSED() trimPtr[idx] - int16_t before; +#define TRIM_REUSED() trimGvar[idx] >= 0 + uint8_t phase; + int16_t before; // TODO declarations outside #ifdef bool thro; if (TRIM_REUSED()) { - before = *trimPtr[idx]; +#if defined(M64) + phase = 0; +#else + phase = getGVarFlightPhase(s_perout_flight_phase, trimGvar[idx]); +#endif + before = GVAR_VALUE(trimGvar[idx], phase); thro = false; } else { + phase = getTrimFlightPhase(s_perout_flight_phase, idx); before = getRawTrimValue(phase, idx); thro = (idx==THR_STICK && g_model.thrTrim); } #else #define TRIM_REUSED() 0 + uint8_t phase = getTrimFlightPhase(s_perout_flight_phase, idx); int16_t before = getRawTrimValue(phase, idx); bool thro = (idx==THR_STICK && g_model.thrTrim); #endif @@ -1335,9 +1382,9 @@ void checkTrims() #if defined(GVARS) if (TRIM_REUSED()) { - *trimPtr[idx] = after; + GVAR_VALUE(trimGvar[idx], phase) = after; eeDirty(EE_MODEL); - s_gvar_last = (trimPtr[idx] - &GVAR_VALUE(0)) / sizeof(g_model.gvars[0]); + s_gvar_last = trimGvar[idx]; s_gvar_timer = GVAR_DISPLAY_TIME; } else { @@ -1956,7 +2003,7 @@ void evalFunctions() #if defined(GVARS) for (uint8_t i=0; i<4; i++) - trimPtr[i] = NULL; + trimGvar[i] = -1; #endif for (uint8_t i=0; ifunc >= FUNC_ADJUST_GV1) { if (FSW_PARAM(sd) >= MIXSRC_TrimRud-1 && FSW_PARAM(sd) <= MIXSRC_TrimAil-1) { - trimPtr[FSW_PARAM(sd)-MIXSRC_TrimRud+1] = &GVAR_VALUE(sd->func-FUNC_ADJUST_GV1); + trimGvar[FSW_PARAM(sd)-MIXSRC_TrimRud+1] = sd->func-FUNC_ADJUST_GV1; } #if defined(ROTARY_ENCODERS) else if (FSW_PARAM(sd) >= MIXSRC_REa-1 && FSW_PARAM(sd) < MIXSRC_TrimRud-1) { int8_t scroll = rePreviousValues[FSW_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[FSW_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY); if (scroll) { - setGVarValue(sd->func-FUNC_ADJUST_GV1, GVAR_VALUE(sd->func-FUNC_ADJUST_GV1) + scroll); + SET_GVAR(sd->func-FUNC_ADJUST_GV1, GVAR_VALUE(sd->func-FUNC_ADJUST_GV1, s_perout_flight_phase) + scroll, s_perout_flight_phase); } } #endif else { - setGVarValue(sd->func-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(FSW_PARAM(sd)), (int16_t)1250) / 10); + SET_GVAR(sd->func-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(FSW_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase); } } #endif @@ -2362,7 +2409,7 @@ void perOut(uint8_t tick10ms) //========== OFFSET =============== if (apply_offset) { - int8_t offset = GVAR(md->sOffset, -125, 125); + int8_t offset = GET_GVAR(md->offset, -125, 125, s_perout_flight_phase); if (offset) v += calc100toRESX(offset); } @@ -2379,7 +2426,7 @@ void perOut(uint8_t tick10ms) v += trims[mix_trim]; } - int8_t weight = GVAR(md->weight, -125, 125); + int16_t weight = GET_GVAR(md->weight, -500, 500, s_perout_flight_phase); //========== SPEED =============== if (s_perout_mode == e_perout_mode_normal && (md->speedUp || md->speedDown)) // there are delay values @@ -2419,7 +2466,7 @@ void perOut(uint8_t tick10ms) //========== DIFFERENTIAL ========= if (md->curveMode == MODE_DIFFERENTIAL) { - int8_t curveParam = GVAR(md->curveParam, -100, 100); + int8_t curveParam = GET_GVAR(md->curveParam, -100, 100, s_perout_flight_phase); if (curveParam>0 && dv<0) dv = (dv * (100-curveParam)) / 100; else if (curveParam<0 && dv>0) @@ -2974,8 +3021,8 @@ ISR(TIMER5_COMPA_vect, ISR_NOBLOCK) // mixer interrupt lastTMR = tmr10ms; if (s_current_protocol < PROTO_NONE) { - checkTrims(); doMixerCalculations(tmr10ms, tick10ms); + checkTrims(); } heartbeat |= HEART_TIMER10ms; @@ -3476,10 +3523,10 @@ void mixerTask(void * pdata) lastTMR = tmr10ms; if (s_current_protocol < PROTO_NONE) { - if (tick10ms) checkTrims(); CoEnterMutexSection(mixerMutex); doMixerCalculations(tmr10ms, tick10ms); CoLeaveMutexSection(mixerMutex); + if (tick10ms) checkTrims(); } heartbeat |= HEART_TIMER10ms; diff --git a/src/open9x.h b/src/open9x.h index da90fbff6..e4e07644c 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -312,7 +312,7 @@ extern uint8_t s_bind_allowed; # define INP_E_TELEM_RX 1 # define OUT_E_TELEM_TX 0 -# define INP_D_HAPTIC 7 +# define OUT_D_HAPTIC 7 # define INP_D_SPARE4 6 # define INP_D_ROT_ENC_2_PUSH 5 # define INP_D_ROT_ENC_1_PUSH 4 @@ -388,7 +388,7 @@ extern uint8_t s_bind_allowed; #define OUT_G_SIM_CTL 4 //1 : phone-jack=ppm_in #define INP_G_ID1 3 -#define INP_G_HAPTIC 2 +#define OUT_G_HAPTIC 2 #define INP_G_RF_POW 1 #define INP_G_RuddDR 0 @@ -679,6 +679,8 @@ extern uint8_t s_perout_mode; // Fiddle to force compiler to use a pointer #define FORCE_INDIRECT(ptr) __asm__ __volatile__ ("" : "=e" (ptr) : "0" (ptr)) +extern uint8_t s_perout_flight_phase; + void perOut(uint8_t tick10ms); void perMain(); NOINLINE void per10ms(); @@ -700,8 +702,6 @@ extern int16_t getRawTrimValue(uint8_t phase, uint8_t idx); extern int16_t getTrimValue(uint8_t phase, uint8_t idx); extern void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim); -extern uint8_t s_perout_flight_phase; - #if defined(ROTARY_ENCODERS) int16_t getRotaryEncoder(uint8_t idx); void incRotaryEncoder(uint8_t idx, int8_t inc); @@ -717,12 +717,23 @@ inline bool navigationRotaryEncoder(uint8_t event) #endif #if defined(GVARS) -int8_t GVAR(int8_t x, int8_t min, int8_t max); +#if defined(M64) +int16_t getGVarValue(int8_t x, int16_t min, int16_t max); +void setGVarValue(uint8_t x, int8_t value); +#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max) +#define SET_GVAR(idx, val, p) setGVarValue(idx, val) +#else +uint8_t getGVarFlightPhase(uint8_t phase, uint8_t idx); +int16_t getGVarValue(int8_t x, int16_t min, int16_t max, int8_t phase); +void setGVarValue(uint8_t x, int8_t value, int8_t phase); +#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max, p) +#define SET_GVAR(idx, val, p) setGVarValue(idx, val, p) +#endif #define GVAR_DISPLAY_TIME 100 /*1 second*/; extern uint8_t s_gvar_timer; extern uint8_t s_gvar_last; #else -#define GVAR(x, min, max) (x) +#define GET_GVAR(x, ...) (x) #endif extern uint16_t s_timeCumTot; @@ -757,8 +768,6 @@ extern uint8_t s_traceWr; extern int8_t s_traceCnt; #endif -extern int8_t *s_trimPtr[NUM_STICKS]; - #if defined(PCBSKY9X) static inline uint16_t getTmr2MHz() { return TC1->TC_CHANNEL[0].TC_CV; } #else @@ -771,13 +780,13 @@ uint16_t stack_free(uint8_t tid); uint16_t stack_free(); #endif -#if defined(PCBSTD) && !defined(M128) +#if defined(M64) void memclear(void *ptr, uint8_t size); #else #define memclear(p, s) memset(p, 0, s) #endif -#ifdef SPLASH +#if defined(SPLASH) void doSplash(); #endif @@ -844,11 +853,11 @@ void read_9_adc(void ) ; #if defined(PCBSKY9X) #define HAPTIC_OFF hapticOff() #elif defined(PCBGRUVIN9X) -#define HAPTIC_ON PORTD &= ~(1 << INP_D_HAPTIC) -#define HAPTIC_OFF PORTD |= (1 << INP_D_HAPTIC) +#define HAPTIC_ON PORTD &= ~(1 << OUT_D_HAPTIC) +#define HAPTIC_OFF PORTD |= (1 << OUT_D_HAPTIC) #else -#define HAPTIC_ON PORTG |= (1 << INP_G_HAPTIC) -#define HAPTIC_OFF PORTG &= ~(1 << INP_G_HAPTIC) +#define HAPTIC_ON PORTG |= (1 << OUT_G_HAPTIC) +#define HAPTIC_OFF PORTG &= ~(1 << OUT_G_HAPTIC) #endif #else #define HAPTIC_ON diff --git a/src/translations.cpp b/src/translations.cpp index ab7c718b3..a0a614410 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -161,34 +161,34 @@ const pm_char STR_ALARM[] PROGMEM = TR_ALARM; const pm_char STR_USRDATA[] PROGMEM = TR_USRDATA; const pm_char STR_BLADES[] PROGMEM = TR_BLADES; const pm_char STR_SCREEN[] PROGMEM = TR_SCREEN; -const pm_char STR_BEEPERMODE[] PROGMEM = TR_BEEPERMODE; -const pm_char STR_BEEPERLEN[] PROGMEM = TR_BEEPERLEN; +const pm_char STR_SOUND_LABEL[] PROGMEM = TR_SOUND_LABEL; +const pm_char STR_LENGTH[] PROGMEM = TR_LENGTH; #if defined(AUDIO) const pm_char STR_SPKRPITCH[] PROGMEM = TR_SPKRPITCH; #endif #if defined(HAPTIC) -const pm_char STR_HAPTICMODE[] PROGMEM = TR_HAPTICMODE; +const pm_char STR_HAPTIC_LABEL[] PROGMEM = TR_HAPTIC_LABEL; const pm_char STR_HAPTICSTRENGTH[] PROGMEM = TR_HAPTICSTRENGTH; -const pm_char STR_HAPTICLENGTH[] PROGMEM = TR_HAPTICLENGTH; #endif const pm_char STR_CONTRAST[] PROGMEM = TR_CONTRAST; +const pm_char STR_ALARMS_LABEL[] PROGMEM = TR_ALARMS_LABEL; const pm_char STR_BATTERYWARNING[] PROGMEM = TR_BATTERYWARNING; const pm_char STR_INACTIVITYALARM[] PROGMEM = TR_INACTIVITYALARM; +const pm_char STR_MEMORYWARNING[] PROGMEM = TR_MEMORYWARNING; +const pm_char STR_ALARMWARNING[] PROGMEM = TR_ALARMWARNING; #if defined(ROTARY_ENCODERS) const pm_char STR_RENAVIG[] PROGMEM = TR_RENAVIG; #endif const pm_char STR_FILTERADC[] PROGMEM = TR_FILTERADC; const pm_char STR_THROTTLEREVERSE[] PROGMEM = TR_THROTTLEREVERSE; +const pm_char STR_BEEP_LABEL[] PROGMEM = TR_BEEP_LABEL; const pm_char STR_MINUTEBEEP[] PROGMEM = TR_MINUTEBEEP; const pm_char STR_BEEPCOUNTDOWN[] PROGMEM = TR_BEEPCOUNTDOWN; -const pm_char STR_FLASHONBEEP[] PROGMEM = TR_FLASHONBEEP; -const pm_char STR_BLMODE[] PROGMEM = TR_BLMODE; +const pm_char STR_BACKLIGHT_LABEL[] PROGMEM = TR_BACKLIGHT_LABEL; const pm_char STR_BLDELAY[] PROGMEM = TR_BLDELAY; const pm_char STR_SPLASHSCREEN[] PROGMEM = TR_SPLASHSCREEN; const pm_char STR_THROTTLEWARNING[] PROGMEM = TR_THROTTLEWARNING; const pm_char STR_SWITCHWARNING[] PROGMEM = TR_SWITCHWARNING; -const pm_char STR_MEMORYWARNING[] PROGMEM = TR_MEMORYWARNING; -const pm_char STR_ALARMWARNING[] PROGMEM = TR_ALARMWARNING; #ifdef FRSKY const pm_char STR_TIMEZONE[] PROGMEM = TR_TIMEZONE; const pm_char STR_GPSCOORD[] PROGMEM = TR_GPSCOORD; @@ -383,6 +383,8 @@ const pm_uchar font[] PROGMEM = { #include "font_cz.lbm" #elif defined(TRANSLATIONS_FR) #include "font_fr.lbm" +#elif defined(TRANSLATIONS_ES) +#include "font_es.lbm" #endif }; @@ -396,5 +398,7 @@ const pm_uchar font_dblsize[] PROGMEM = { #include "font_dblsize_it.lbm" #elif defined(TRANSLATIONS_FR) #include "font_dblsize_fr.lbm" +#elif defined(TRANSLATIONS_ES) +#include "font_dblsize_es.lbm" #endif }; diff --git a/src/translations.h b/src/translations.h index 79a323d71..4b1f5b8d5 100644 --- a/src/translations.h +++ b/src/translations.h @@ -49,6 +49,9 @@ #elif defined(TRANSLATIONS_CZ) #include "translations/cz.h" #define LEN_SPECIAL_CHARS 0 +#elif defined(TRANSLATIONS_ES) +#include "translations/es.h" +#define LEN_SPECIAL_CHARS 0 #else #include "translations/en.h" #define LEN_SPECIAL_CHARS 0 @@ -204,6 +207,7 @@ extern const pm_char STR_OPEN9X[]; #endif // The 0-terminated-strings +#define NO_INDENT(x) (x)+LEN_INDENT extern const pm_char STR_POPUPS[]; #define STR_EXIT (STR_POPUPS + OFS_EXIT) @@ -269,28 +273,28 @@ extern const pm_char STR_ALARM[]; extern const pm_char STR_USRDATA[]; extern const pm_char STR_BLADES[]; extern const pm_char STR_SCREEN[]; -extern const pm_char STR_BEEPERMODE[]; -extern const pm_char STR_BEEPERLEN[]; +extern const pm_char STR_SOUND_LABEL[]; +extern const pm_char STR_LENGTH[]; extern const pm_char STR_SPKRPITCH[]; -extern const pm_char STR_HAPTICMODE[]; +extern const pm_char STR_HAPTIC_LABEL[]; extern const pm_char STR_HAPTICSTRENGTH[]; -extern const pm_char STR_HAPTICLENGTH[]; extern const pm_char STR_CONTRAST[]; +extern const pm_char STR_ALARMS_LABEL[]; extern const pm_char STR_BATTERYWARNING[]; extern const pm_char STR_INACTIVITYALARM[]; +extern const pm_char STR_MEMORYWARNING[]; +extern const pm_char STR_ALARMWARNING[]; extern const pm_char STR_RENAVIG[]; extern const pm_char STR_FILTERADC[]; extern const pm_char STR_THROTTLEREVERSE[]; +extern const pm_char STR_BEEP_LABEL[]; extern const pm_char STR_MINUTEBEEP[]; extern const pm_char STR_BEEPCOUNTDOWN[]; -extern const pm_char STR_FLASHONBEEP[]; -extern const pm_char STR_BLMODE[]; +extern const pm_char STR_BACKLIGHT_LABEL[]; extern const pm_char STR_BLDELAY[]; extern const pm_char STR_SPLASHSCREEN[]; extern const pm_char STR_THROTTLEWARNING[]; extern const pm_char STR_SWITCHWARNING[]; -extern const pm_char STR_MEMORYWARNING[]; -extern const pm_char STR_ALARMWARNING[]; extern const pm_char STR_TIMEZONE[]; extern const pm_char STR_GPSCOORD[]; extern const pm_char STR_VARIO[]; diff --git a/src/translations/en.h b/src/translations/en.h index 019334c34..404646261 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -229,7 +229,11 @@ #define TR_DSM2MODE "LP4/LP5DSMonlyDSMX " // ZERO TERMINATED STRINGS -#define TR_POPUPS "[MENU]\004[EXIT]" +#define INDENT "\001" +#define LEN_INDENT 1 +#define INDENT_WIDTH (FW/2) + +#define TR_POPUPS "[MENU]\010[EXIT]" #define OFS_EXIT 7 #define TR_MENUWHENDONE "[MENU] WHEN DONE" #define TR_FREE "free" @@ -245,7 +249,7 @@ #define TR_TTRACE "T-Trace" #define TR_TTRIM "T-Trim" #define TR_BEEPCTR "Beep Ctr" -#define TR_PROTO "Proto" +#define TR_PROTO INDENT"Proto" #define TR_PPMFRAME "PPM frame" #define TR_MS "ms" #define TR_SWITCH "Switch" @@ -253,7 +257,7 @@ #define TR_FADEIN "Fade In" #define TR_FADEOUT "Fade Out" #define TR_DEFAULT "(default)" -#define TR_CHECKTRIMS "\003Check\005Trims" +#define TR_CHECKTRIMS "\006Check\012Trims" #define OFS_CHECKTRIMS (9*FW) #define TR_SWASHTYPE "Swash Type" #define TR_COLLECTIVE "Collective" @@ -261,17 +265,17 @@ #define TR_ELEDIRECTION "ELE Direction" #define TR_AILDIRECTION "AIL Direction" #define TR_COLDIRECTION "COL Direction" -#define TR_MODE "Mode" +#define TR_MODE INDENT"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_SOURCE INDENT"Source" #define TR_WEIGHT "Weight" #define TR_EXPO "Expo" #define TR_SIDE "Side" #define TR_DIFFERENTIAL "Differ" -#define TR_OFFSET "Offset" +#define TR_OFFSET INDENT"Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define TR_CURVE "Curve" @@ -286,47 +290,42 @@ #define TR_MIXER "MIXER" #define TR_CV "CV" #define TR_GV "GV" -#define TR_ACHANNEL "A\002channel" -#define TR_RANGE "Range" +#define TR_ACHANNEL "A\004channel" +#define TR_RANGE INDENT"Range" #define TR_BAR "Bar" -#define TR_ALARM "Alarm" +#define TR_ALARM INDENT"Alarm" #define TR_USRDATA "UsrData" -#define TR_BLADES "Blades" +#define TR_BLADES INDENT"Blades" #define TR_SCREEN "Screen " -#ifdef AUDIO -#define TR_BEEPERMODE "Speaker Mode" -#define TR_BEEPERLEN "Speaker Length" -#define TR_SPKRPITCH "Speaker Pitch" -#else -#define TR_BEEPERMODE "Beeper Mode" -#define TR_BEEPERLEN "Beeper Length" -#endif -#define TR_HAPTICMODE "Haptic Mode" -#define TR_HAPTICSTRENGTH "Haptic Strength" -#define TR_HAPTICLENGTH "Haptic Length" +#define TR_SOUND_LABEL "Sound" +#define TR_LENGTH INDENT"Length" +#define TR_SPKRPITCH INDENT"Pitch" +#define TR_HAPTIC_LABEL "Haptic" +#define TR_HAPTICSTRENGTH INDENT"Strength" #define TR_CONTRAST "Contrast" -#define TR_BATTERYWARNING "Battery Warning" -#define TR_INACTIVITYALARM "Inactivity alrm" +#define TR_ALARMS_LABEL "Alarms" +#define TR_BATTERYWARNING INDENT"Battery Low" +#define TR_INACTIVITYALARM INDENT"Inactivity" +#define TR_MEMORYWARNING INDENT"Memory Low" +#define TR_ALARMWARNING INDENT"Sound Off" #define TR_RENAVIG "Navig RotEnc" #define TR_FILTERADC "Filter ADC" #define TR_THROTTLEREVERSE "Thr reverse" -#define TR_MINUTEBEEP "Minute beep" -#define TR_BEEPCOUNTDOWN "Beep countdown" -#define TR_FLASHONBEEP "Flash on beep" -#define TR_BLMODE "Backlight mode" -#define TR_BLDELAY "Backlight delay" +#define TR_BEEP_LABEL "Timer events" +#define TR_MINUTEBEEP INDENT"Minute " +#define TR_BEEPCOUNTDOWN INDENT"Countdown" +#define TR_BACKLIGHT_LABEL "Backlight" +#define TR_BLDELAY INDENT"Delay" #define TR_SPLASHSCREEN "Splash screen" #define TR_THROTTLEWARNING "T-Warning" #define TR_SWITCHWARNING "S-Warning" -#define TR_MEMORYWARNING "Memory Warning" -#define TR_ALARMWARNING "Alarm Warning" #define TR_TIMEZONE "Time Zone" #define TR_RXCHANNELORD "Rx Channel Ord" #define TR_SLAVE "Slave" -#define TR_MODESRC "mode\003% src" +#define TR_MODESRC "mode\006% src" #define TR_MULTIPLIER "Multiplier" #define TR_CAL "Cal" -#define TR_EEPROMV "EEpr:\004-" +#define TR_EEPROMV "EEpr:\010-" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" #define TR_MENUTOSTART "[MENU] TO START" @@ -337,31 +336,31 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA "NO DATA" -#define TR_TM1TM2 "TM1\015TM2" -#define TR_THRTHP "THR\015TH%" +#define TR_TM1TM2 "TM1\032TM2" +#define TR_THRTHP "THR\032TH%" #define TR_TOT "TOT" -#define TR_TMR1LATMAXUS "Tmr1Lat max\003us" +#define TR_TMR1LATMAXUS "Tmr1Lat max\006us" #define STR_US (STR_TMR1LATMAXUS+12) -#define TR_TMR1LATMINUS "Tmr1Lat min\003us" -#define TR_TMR1JITTERUS "Tmr1 Jitter\003us" +#define TR_TMR1LATMINUS "Tmr1Lat min\006us" +#define TR_TMR1JITTERUS "Tmr1 Jitter\006us" #if defined(PCBSKY9X) -#define TR_TMAINMAXMS "Tmain max\004ms" +#define TR_TMAINMAXMS "Tmain max\010ms" #else -#define TR_TMAINMAXMS "Tmain max\005ms" +#define TR_TMAINMAXMS "Tmain max\012ms" #endif -#define TR_T10MSUS "T10ms\007us" -#define TR_FREESTACKMINB "Free Stack\004b" +#define TR_T10MSUS "T10ms\016us" +#define TR_FREESTACKMINB "Free Stack\010b" #define TR_MENUTORESET "[MENU] to reset" #define TR_PPM "PPM" #define TR_CH "CH" #define TR_MODEL "MODEL" #define TR_FP "FP" #define TR_EEPROMLOWMEM "EEPROM low mem" -#define TR_ALERT "\007ALERT" +#define TR_ALERT "\016ALERT" #define TR_PRESSANYKEYTOSKIP "Press any key to skip" #define TR_THROTTLENOTIDLE "Throttle not idle" #define TR_ALARMSDISABLED "Alarms Disabled" -#define TR_PRESSANYKEY "\004Press any Key" +#define TR_PRESSANYKEY "\010Press any Key" #define TR_BADEEPROMDATA "Bad EEprom Data" #define TR_EEPROMFORMATTING "Formatting EEPROM" #define TR_EEPROMOVERFLOW "EEPROM overflow" @@ -397,7 +396,7 @@ #define TR_RXNUM "RxNum" #define TR_SYNCMENU "Sync [MENU]" #define TR_BACK "Back" -#define TR_LIMIT "Limit" +#define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" @@ -406,8 +405,8 @@ #define TR_SHUTDOWN "SHUTTING DOWN" #define TR_BATT_CALIB "Battery Calib" #define TR_CURRENT_CALIB "Current Calib" -#define TR_VOLTAGE "Voltage" -#define TR_CURRENT "Current" +#define TR_VOLTAGE INDENT"Voltage" +#define TR_CURRENT INDENT"Current" #define TR_SELECT_MODEL "Select Model" #define TR_CREATE_MODEL "Create Model" #define TR_BACKUP_MODEL "Backup Model" @@ -422,14 +421,14 @@ #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN "SWITCH" #define TR_INVERT_THR "Invert Thr?" -#define TR_SPEAKER_VOLUME "Speaker Volume" +#define TR_SPEAKER_VOLUME INDENT"Volume" #define TR_LCD "LCD" #define TR_BRIGHTNESS "Brightness" -#define TR_CPU_TEMP "CPU Temp.\007>" -#define TR_CPU_CURRENT "Current\011>" +#define TR_CPU_TEMP "CPU Temp.\016>" +#define TR_CPU_CURRENT "Current\022>" #define TR_CPU_MAH "Consumpt." #define TR_COPROC "CoProc." -#define TR_COPROC_TEMP "MB Temp. \007>" +#define TR_COPROC_TEMP "MB Temp. \016>" #define TR_CAPAWARNING "Capacity Warning" #define TR_TEMPWARNING "Temp Warning" #define TR_FUNC "Func" diff --git a/src/translations/es.h b/src/translations/es.h new file mode 100644 index 000000000..28dd71e56 --- /dev/null +++ b/src/translations/es.h @@ -0,0 +1,458 @@ +// NON ZERO TERMINATED STRINGS +#define LEN_OFFON "\003" +#define TR_OFFON "OFF""ON\0" + +#define LEN_MMMINV "\003" +#define TR_MMMINV "---""INV" + +#define LEN_NCHANNELS "\004" +#define TR_NCHANNELS "\0014CH\0016CH\0018CH10CH12CH14CH16CH" + +#define LEN_VBEEPMODE "\005" +#define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo " + +#define LEN_VBEEPLEN "\005" +#define TR_VBEEPLEN "0====""=0===""==0==""===0=""====0" + +#define LEN_VRENAVIG "\003" +#define TR_VRENAVIG "No REaREb" + +#define LEN_VFILTERADC "\004" +#define TR_VFILTERADC "SIMP""OSMP""FILT" + +#define LEN_VBLMODE "\004" +#define TR_VBLMODE "OFF ""Keys""Stks""Dos ""ON\0" + +#define LEN_TRNMODE "\003" +#define TR_TRNMODE "off"" +="" :=" + +#define LEN_TRNCHN "\003" +#define TR_TRNCHN "ch1ch2ch3ch4" + +#define LEN_DATETIME "\005" +#define TR_DATETIME "DATA:""HORA:" + +#define LEN_VLCD "\006" +#define TR_VLCD "NormalOptrex" + +#define LEN_VTRIMINC "\006" +#define TR_VTRIMINC "Expo ""ExFino""Fino ""Medio ""Grueso" + +#define LEN_RETA123 "\001" +#if defined(PCBGRUVIN9X) +#if defined(EXTRA_ROTARY_ENCODERS) +#define TR_RETA123 "RETA123abcd" +#else //EXTRA_ROTARY_ENCODERS +#define TR_RETA123 "RETA123ab" +#endif //EXTRA_ROTARY_ENCODERS +#else +#define TR_RETA123 "RETA123" +#endif + +#define LEN_VPROTOS "\006" +#ifdef PXX +#define TR_PXX "PXX\0 " +#else +#define TR_PXX "[PXX]\0" +#endif +#ifdef DSM2 +#define TR_DSM2 "DSM2\0 " +#else +#define TR_DSM2 "[DSM2]" +#endif +#ifdef IRPROTOS +#define TR_IRPROTOS "SILV TRAC09PICZ SWIFT\0" +#else +#define TR_IRPROTOS +#endif +#define TR_VPROTOS "PPM\0 ""PPM16\0""PPMsim" TR_PXX TR_DSM2 TR_IRPROTOS + +#define LEN_POSNEG "\003" +#define TR_POSNEG "POS""NEG" + +#define LEN_VCURVEFUNC "\003" +#define TR_VCURVEFUNC "---""x>0""x<0""|x|""f>0""f<0""|f|" + +#define LEN_VMLTPX "\010" +#define TR_VMLTPX "Agregar ""Multipl.""Cambiar " + +#define LEN_VMLTPX2 "\002" +#define TR_VMLTPX2 "+=""*="":=" + +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON\0""Dir""Ele""Ace""Ale" + +#define LEN_VCSWFUNC "\010" +#define TR_VCSWFUNC "---\0 ""v>ofs\0 ""vofs\0""|v|v2\0 ""v1=v2\0 ""v1<=v2\0 ""d>=ofs\0 ""|d|>=ofs" + +#define LEN_VFSWFUNC "\015" +#if defined(VARIO) +#define TR_VVARIO "Vario " +#else +#define TR_VVARIO "[Vario] " +#endif +#if defined(AUDIO) +#define TR_SOUND "Oir Sonido\0 " +#else +#define TR_SOUND "Beep\0 " +#endif +#if defined(HAPTIC) +#define TR_HAPTIC "Vibrar\0 " +#else +#define TR_HAPTIC "[Vibrar]\0 " +#endif +#if defined(VOICE) +#define TR_PLAY_TRACK "Oir Pista \0 " +#define TR_PLAY_VALUE "Oir Valor \0 " +#else +#define TR_PLAY_TRACK "[Oir Pista] \0" +#define TR_PLAY_VALUE "[Oir Valor] \0" +#endif +#if defined(PCBSKY9X) +#if defined(SDCARD) +#define TR_SDCLOGS "SDCARD Logo\0 " +#else +#define TR_SDCLOGS "[SDCARD Logo]" +#endif +#define TR_FSW_VOLUME "Volumen\0 " +#elif defined(PCBGRUVIN9X) +#if defined(SDCARD) +#define TR_SDCLOGS "SDCARD Logo " +#else +#define TR_SDCLOGS "[SDCARD Logo]" +#endif +#define TR_FSW_VOLUME +#else +#define TR_SDCLOGS +#define TR_FSW_VOLUME + +#endif +#ifdef DEBUG +#define TR_TEST "Test\0" +#else +#define TR_TEST +#endif +#define TR_VFSWFUNC "Seguro\0 ""Aprendiz \0 ""Ajuste Rapido" TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Panel Luz\0 " TR_TEST + +#define LEN_VFSWRESET "\006" +#define TR_VFSWRESET "Reloj1""Reloj2""Todo ""Telem." + +#define LEN_FUNCSOUNDS "\006" +#define TR_FUNCSOUNDS "Pito1 ""Pito2 ""Pito3 ""Avis1 ""Avis2 ""Pio ""Ring ""SciFi ""Robot ""Gorjeo""Tada ""Crickt""Sirena""Alarma""Ratata""Tictac" + +#define LEN_VTELEMCHNS "\004" +#define TR_VTELEMCHNS "---\0""Tmr1""Tmr2""Tx\0 ""Rx\0 ""A1\0 ""A2\0 ""Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VVel""A1-\0""A2-\0""Alt-""Alt+""Rpm+""T1+\0""T2+\0""Vel+""Dst+""Cur+""Acc\0""Hora" + +#ifdef IMPERIAL_UNITS +#define LENGTH_UNIT "ft\0" +#define SPEED_UNIT "kts" +#else +#define LENGTH_UNIT "m\0 " +#define SPEED_UNIT "kmh" +#endif + +#define LEN_VTELEMUNIT "\003" +#define TR_VTELEMUNIT "v\0 ""A\0 ""m/s""-\0 " SPEED_UNIT LENGTH_UNIT "@\0 ""%\0 ""mA\0""mAh""W\0 " +#define STR_V (STR_VTELEMUNIT+1) +#define STR_A (STR_VTELEMUNIT+4) + +#define LEN_VALARM "\003" +#define TR_VALARM "---""Ama""Nar""Roj" + +#define LEN_VALARMFN "\001" +#define TR_VALARMFN "<>" + +#define LEN_VTELPROTO "\007" +#define TR_VTELPROTO "Nada\0 ""Hub\0 ""WSHHigh""Halcyon" + +#define LEN_VOLTSRC "\003" +#define TR_VOLTSRC "---""A1\0""A2\0""FAS""Cel" + +#define LEN_VARIOSRC "\004" +#define TR_VARIOSRC "Data""A1\0 ""A2\0" + +#define LEN_VSCREEN "\004" +#define TR_VSCREEN "Nums""Bars" + +#define LEN_GPSFORMAT "\004" +#define TR_GPSFORMAT "HMS NMEA" + +#define LEN2_VTEMPLATES 13 +#define LEN_VTEMPLATES "\015" +#define TR_VTEMPLATES "Elim Mezcla\0\0""Simple 4-CH \0""Anular Motor\0""V-Tail \0""Elevon\\Delta\0""eCCPM \0""Heli Setup \0""Servo Test \0" + +#define LEN_VSWASHTYPE "\004" +#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" + +#define LEN_VKEYS "\005" +#define TR_VKEYS " Menu""Salir""Abajo""Arrib""Drcha"" Izqda" + +#define LEN_VRENCODERS "\003" +#define TR_VRENCODERS "REa""REb" + +#define LEN_VSWITCHES "\003" +#if defined(PCBSKY9X) +#define TR_VSWITCHES "THR""RUD""ELE""ID0""ID1""ID2""AIL""GEA""TRN""CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC""CSD""CSE""CSF""CSG""CSH""CSI""CSJ""CSK""CSL""CSM""CSN""CSO""CSP""CSQ""CSR""CSS""CST""CSU""CSV""CSW"" ON" +#else +#define TR_VSWITCHES "THR""RUD""ELE""ID0""ID1""ID2""AIL""GEA""TRN""CS1""CS2""CS3""CS4""CS5""CS6""CS7""CS8""CS9""CSA""CSB""CSC"" ON" +#endif + +#define LEN_VSRCRAW "\004" +#if defined(PCBSKY9X) +#define TR_ROTARY_ENCODERS_VSRCRAW "REa " +#elif defined(PCBGRUVIN9X) && defined(EXTRA_ROTARY_ENCODERS) +#define TR_ROTARY_ENCODERS_VSRCRAW "REa ""REb ""REc ""REd " +#elif defined(PCBGRUVIN9X) && !defined(EXTRA_ROTARY_ENCODERS) +#define TR_ROTARY_ENCODERS_VSRCRAW "REa ""REb " +#else +#define TR_ROTARY_ENCODERS_VSRCRAW +#endif +#if defined(HELI) +#define TR_CYC_VSRCRAW "CYC1""CYC2""CYC3" +#else +#define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" +#endif +#define TR_VSRCRAW "Dir ""Ele ""Acel""Ail ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "TrmR" "TrmE" "TrmT" "TrmA" "MAX ""3POS" TR_CYC_VSRCRAW + +#define LEN_VTMRMODES "\003" +#define TR_VTMRMODES "OFF""ABS""THs""TH%""THt" + +#define LEN_DSM2MODE "\007" +#define TR_DSM2MODE "LP4/LP5DSMonlyDSMX " + +// ZERO TERMINATED STRINGS +#define INDENT "\001" +#define LEN_INDENT 1 +#define INDENT_WIDTH (FW/2) + +#define TR_POPUPS "[MENU]\010[SALIR]" +#define OFS_EXIT 7 +#define TR_MENUWHENDONE "[MENU]AL FINAL" +#define TR_FREE "Libre" +#define TR_DELETEMODEL "BORRA MODELO" +#define TR_COPYINGMODEL "Copiando modelo." +#define TR_MOVINGMODEL "Mover modelo..." +#define TR_LOADINGMODEL "Cargar modelo..." +#define TR_NAME "Nombre" +#define TR_TIMER "Reloj" +#define TR_ELIMITS "F.Limites" +#define TR_ETRIMS "F.Ajustes" +#define TR_TRIMINC "Modo Ajte" +#define TR_TTRACE "T-Rastro" +#define TR_TTRIM "T-Ajuste" +#define TR_BEEPCTR "Pitido en" +#define TR_PROTO INDENT"Protocolo" +#define TR_PPMFRAME "Medida PPM" +#define TR_MS "ms" +#define TR_SWITCH "Llave" +#define TR_TRIMS "Ajustes" +#define TR_FADEIN "Aparecer" +#define TR_FADEOUT "Ocultar" +#define TR_DEFAULT "(p/defecto)" +#define TR_CHECKTRIMS "\006Check\012Ajtes" +#define OFS_CHECKTRIMS (9*FW) +#define TR_SWASHTYPE "Ciclico Tipo" +#define TR_COLLECTIVE "Colectivo" +#define TR_SWASHRING "Anillo Cvo" +#define TR_ELEDIRECTION "ELE Direccion" +#define TR_AILDIRECTION "ALE Direccion" +#define TR_COLDIRECTION "COL Direccion" +#define TR_MODE "Modo" +#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 INDENT"Fuente" +#define TR_WEIGHT "Cantidad" +#define TR_EXPO "Expo" +#define TR_SIDE "Lado" +#define TR_DIFFERENTIAL "Diferir" +#define TR_OFFSET INDENT"Offset" +#define TR_TRIM "Ajte" +#define TR_DREX "DRex" +#define TR_CURVE "Curva" +#define TR_FPHASE "Fase" +#define TR_MIXWARNING "Aviso" +#define TR_OFF "OFF" +#define TR_MULTPX "Multipl" +#define TR_DELAYDOWN "Delay Dn" +#define TR_DELAYUP "Delay Up" +#define TR_SLOWDOWN "Slow Dn" +#define TR_SLOWUP "Slow Up" +#define TR_MIXER "MEZCLA" +#define TR_CV "CV" +#define TR_GV "GV" +#define TR_ACHANNEL "A\004Canal" +#define TR_RANGE INDENT"Range" +#define TR_BAR "Bar" +#define TR_ALARM INDENT"Alarma" +#define TR_USRDATA "UsrData" +#define TR_BLADES INDENT"Palas" +#define TR_SCREEN "Screen " +#ifdef AUDIO +#define TR_BEEPERMODE "Modo Altavoz" +#define TR_BEEPERLEN "Talla Altavoz" +#define TR_SPKRPITCH "Speaker Pitch" +#else +#define TR_BEEPERMODE "Modo Pitido" +#define TR_BEEPERLEN "Talla Pitido" +#endif +#define TR_HAPTICMODE "Haptic Modo" +#define TR_HAPTICSTRENGTH "Haptic Strength" +#define TR_HAPTICLENGTH "Haptic Length" +#define TR_CONTRAST "Contraste" +#define TR_BATTERYWARNING "Aviso Bateria" +#define TR_INACTIVITYALARM "Alarma Reposo" +#define TR_RENAVIG "Navig RotEnc" +#define TR_FILTERADC "Filtro ADC" +#define TR_THROTTLEREVERSE "Inversion Acel." +#define TR_MINUTEBEEP "Pitido/minuto" +#define TR_BEEPCOUNTDOWN "Pitido ctaatras" +#define TR_FLASHONBEEP "Flash al pitido" +#define TR_BLMODE "Modo P.Luminoso" +#define TR_BLDELAY "Tiempo de Luz" +#define TR_SPLASHSCREEN "Pantalla Inicio" +#define TR_THROTTLEWARNING "Aviso Acelerdor" +#define TR_SWITCHWARNING "Aviso de Llaves" +#define TR_MEMORYWARNING "Aviso Memoria" +#define TR_ALARMWARNING "Aviso de alarma" +#define TR_TIMEZONE "Zona Horaria" +#define TR_RXCHANNELORD "Rx Ord Canal" +#define TR_SLAVE "Esclavo" +#define TR_MODESRC "modo\006% src" +#define TR_MULTIPLIER "Multiplicar" +#define TR_CAL "Cal" +#define TR_EEPROMV "EEpr:\010-" +#define TR_VTRIM "Ajte- +" +#define TR_BG "BG:" +#define TR_MENUTOSTART "[MENU] INICIAR" +#define TR_SETMIDPOINT "AJUSTAR CENTROS" +#define TR_MOVESTICKSPOTS "MOVER STICK/POT" +#define TR_RXBATT "Rx Batt:" +#define TR_TXnRX "Tx:\0Rx:" +#define OFS_RX 4 +#define TR_ACCEL "Acc:" +#define TR_NODATA "si" +#define TR_TM1TM2 "TM1\032TM2" +#define TR_THRTHP "THR\032TH%" +#define TR_TOT "TOT" +#define TR_TMR1LATMAXUS "Tmr1Lat max\006us" +#define STR_US (STR_TMR1LATMAXUS+12) +#define TR_TMR1LATMINUS "Tmr1Lat min\006us" +#define TR_TMR1JITTERUS "Tmr1 Jitter\006us" +#if defined(PCBSKY9X) +#define TR_TMAINMAXMS "Tmain max\010ms" +#else +#define TR_TMAINMAXMS "Tmain max\012ms" +#endif +#define TR_T10MSUS "T10ms\016us" +#define TR_FREESTACKMINB "Pila libre\010b" +#define TR_MENUTORESET "[MENU] Reinicia" +#define TR_PPM "PPM" +#define TR_CH "CH" +#define TR_MODEL "MODELO" +#define TR_FP "FP" +#define TR_EEPROMLOWMEM "EEPROM Baja mem" +#define TR_ALERT "\016ALERTA" +#define TR_PRESSANYKEYTOSKIP "Pulsa tecla x omitir" +#define TR_THROTTLENOTIDLE "Acelerador activado" +#define TR_ALARMSDISABLED "Alarmas Desact." +#define TR_PRESSANYKEY "\010Pulse una tecla" +#define TR_BADEEPROMDATA "Datos EEprom mal" +#define TR_EEPROMFORMATTING "Formateo EEPROM" +#define TR_EEPROMOVERFLOW "Desborde EEPROM" +#define TR_MENURADIOSETUP "AJUSTAR RADIO" +#define TR_MENUDATEANDTIME "FECHA Y HORA" +#define TR_MENUTRAINER "APRENDIZAJE" +#define TR_MENUVERSION "VERSION" +#define TR_MENUDIAG "DIAGNOST." +#define TR_MENUANA "ANALOGICOS" +#define TR_MENUCALIBRATION "CALIBRACION" +#define TR_TRIMS2OFFSETS "Trims => Offsets" +#define TR_MENUMODELSEL "MODELSEL" +#define TR_MENUSETUP "AJUSTE" +#define TR_MENUFLIGHTPHASE "FASE DE VUELO" +#define TR_MENUFLIGHTPHASES "FASES DE VUELO" +#define TR_MENUHELISETUP "AJUSTE HELI" +#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ... +#define TR_MENUDREXPO "STICKS" +#define TR_MENULIMITS "SALIDAS" +#else +#define TR_MENUDREXPO "DR/EXPO" +#define TR_MENULIMITS "LIMITES" +#endif +#define TR_MENUCURVES "CURVAS" +#define TR_MENUCURVE "CURVA" +#define TR_MENUCUSTOMSWITCH "AJUSTES PROPIOS" +#define TR_MENUCUSTOMSWITCHES "AJUSTE PROPIO" +#define TR_MENUFUNCSWITCHES "AJUSTAR FUNCIONES" +#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUTEMPLATES "PLANTILLAS" +#define TR_MENUSTAT "REGISTRO" +#define TR_MENUDEBUG "DEPURAR" +#define TR_RXNUM "RxNum" +#define TR_SYNCMENU "Sync [MENU]" +#define TR_BACK "Atras" +#define TR_LIMIT INDENT"Limit" +#define TR_MINRSSI "Min Rssi" +#define TR_LATITUDE "Latitud" +#define TR_LONGITUDE "Longitud" +#define TR_GPSCOORD "Gps Coords" +#define TR_VARIO "Vario" +#define TR_SHUTDOWN "APAGANDO" +#define TR_BATT_CALIB "Bateria Calib" +#define TR_CURRENT_CALIB "Actual Calib" +#define TR_VOLTAGE "Voltaje" +#define TR_CURRENT "Actual" +#define TR_SELECT_MODEL "Selec Modelo" +#define TR_CREATE_MODEL "Crear Modelo" +#define TR_BACKUP_MODEL "Salvar Model" +#define TR_DELETE_MODEL "Borrar Model" +#define TR_RESTORE_MODEL "Recupr.Model" +#define TR_SDCARD_ERROR "SDCARD Error" +#define TR_NO_SDCARD "No SDCARD" +#define TR_INCOMPATIBLE "Inconpatible" +#define TR_WARNING "AVISO" +#define TR_EEPROMWARN "EEPROM" +#define TR_THROTTLEWARN "ACELERAD" +#define TR_ALARMSWARN "ALARMAS" +#define TR_SWITCHWARN "LLAVE" +#define TR_INVERT_THR "Invert acel?" +#define TR_SPEAKER_VOLUME "Volume Altavoz" +#define TR_LCD "LCD" +#define TR_BRIGHTNESS "Brillo" +#define TR_CPU_TEMP "CPU Temp.\016>" +#define TR_CPU_CURRENT "Actual\022>" +#define TR_CPU_MAH "Consum." +#define TR_COPROC "CoProc." +#define TR_COPROC_TEMP "MB Temp. \016>" +#define TR_CAPAWARNING "Aviso Capacidad" +#define TR_TEMPWARNING "Aviso Temperat." +#define TR_FUNC "Funcion" +#define TR_V1 "V1" +#define TR_V2 "V2" +#define TR_DURATION "Duracion" +#define TR_DELAY "Retardo" +#define TR_SD_CARD "SD Card" +#define TR_SDHC_CARD "SD-HC Card" +#define TR_NO_SOUNDS_ON_SD "No Sonido en SD" +#define TR_NO_MODELS_ON_SD "No Modelos en SD" +#define TR_PLAY_FILE "Play" +#define TR_DELETE_FILE "Borrar" +#define TR_COPY_FILE "Copiar" +#define TR_RENAME_FILE "Renomb" +#define TR_REMOVED "borrado" +#define TR_SD_INFO "Infos" +#define TR_SD_FORMAT "Formateo" +#define TR_NA "N/A" +#define TR_HARDWARE "HARDWARE" +#define TR_FORMATTING "Formatting..." +#define TR_TEMP_CALIB "Temp. Calib" +#define TR_TIME "Time" +#define TR_BAUDRATE "BT Baudrate" +#define TR_SD_INFO_TITLE "SD INFO" +#define TR_SD_TYPE "Type:" +#define TR_SD_SPEED "Speed:" +#define TR_SD_SECTORS "Sectors:" +#define TR_SD_SIZE "Size:" +#define TR_CURVE_TYPE "Type" diff --git a/src/translations/font_dblsize_es.xbm b/src/translations/font_dblsize_es.xbm new file mode 100644 index 000000000..92de2eae5 --- /dev/null +++ b/src/translations/font_dblsize_es.xbm @@ -0,0 +1,7 @@ +#define font_dblsize_es_width 20 +#define font_dblsize_es_height 16 +static unsigned char font_dblsize_es_bits[] = { + 0x00, 0x00, 0x00, 0x8c, 0x61, 0x0c, 0xd6, 0xb0, 0x06, 0x63, 0x18, 0x03, + 0x00, 0x00, 0x00, 0x03, 0xcf, 0x03, 0x07, 0xef, 0x07, 0x0f, 0x7f, 0x0e, + 0x1f, 0x3f, 0x0c, 0x3b, 0x0f, 0x0c, 0x73, 0x0f, 0x0c, 0xe3, 0x0f, 0x0c, + 0xc3, 0x0f, 0x0c, 0x83, 0x0f, 0x0c, 0x03, 0x0f, 0x0c, 0x00, 0x00, 0x00 }; diff --git a/src/translations/font_de.lbm b/src/translations/font_de.lbm index b776fbfe8..d6b5a02e6 100644 --- a/src/translations/font_de.lbm +++ b/src/translations/font_de.lbm @@ -1 +1 @@ -0x7c,0x13,0x12,0x13,0x7c,0x20,0x55,0x54,0x55,0x78,0x3c,0x43,0x42,0x43,0x3c,0x38,0x45,0x44,0x45,0x38,0x3e,0x41,0x40,0x41,0x3e,0x3c,0x41,0x40,0x21,0x7c,0x7e,0x01,0x49,0x56,0x20, +0x7c,0x13,0x12,0x13,0x7c,0x20,0x55,0x54,0x55,0x78,0x3c,0x43,0x42,0x43,0x3c,0x38,0x45,0x44,0x45,0x38,0x3e,0x41,0x40,0x41,0x3e,0x3c,0x41,0x40,0x21,0x7c,0x7e,0x01,0x49,0x56,0x20, diff --git a/src/translations/font_es.xbm b/src/translations/font_es.xbm new file mode 100644 index 000000000..38ebda4ad --- /dev/null +++ b/src/translations/font_es.xbm @@ -0,0 +1,5 @@ +#define font_es_width 10 +#define font_es_height 8 +static unsigned char font_es_bits[] = { + 0x94, 0x02, 0x4a, 0x01, 0x11, 0x00, 0xb3, 0x01, 0x75, 0x02, 0x39, 0x02, + 0x31, 0x02, 0x00, 0x00 };