From 0ddf92ce0e69a9582ceb186b353a2d04e4cc959a Mon Sep 17 00:00:00 2001 From: bsongis Date: Mon, 18 Mar 2013 20:38:30 +0000 Subject: [PATCH] [X9D] PXX work. UI and pulses --- src/general_menus.cpp | 26 ++++- src/gtests.cpp | 2 +- src/main_views.cpp | 2 +- src/menus.h | 7 ++ src/model_menus.cpp | 131 +++++++++++++++++++++--- src/monitors_views.cpp | 2 +- src/myeeprom.h | 42 +++++--- src/open9x.cpp | 6 +- src/open9x.h | 50 +++++---- src/pulses_arm.cpp | 84 ++++++++++------ src/pulses_avr.cpp | 14 +-- src/translations.cpp | 3 + src/translations.h | 201 +++++++++++++++++++------------------ src/translations/de.h | 10 +- src/translations/en.h | 11 +- src/x9d/trainer_driver.cpp | 2 +- 16 files changed, 396 insertions(+), 197 deletions(-) diff --git a/src/general_menus.cpp b/src/general_menus.cpp index 3c2ca2d9c..b97157305 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -146,6 +146,7 @@ enum menuGeneralSetupItems { #endif IF_FRSKY(ITEM_SETUP_TIMEZONE) IF_FRSKY(ITEM_SETUP_GPSFORMAT) + IF_PXX(ITEM_SETUP_COUNTRYCODE) ITEM_SETUP_RX_CHANNEL_ORD, ITEM_SETUP_STICK_MODE_LABELS, ITEM_SETUP_STICK_MODE, @@ -164,7 +165,7 @@ void menuGeneralSetup(uint8_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) IF_BATTGRAPH(1) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/}); + MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) IF_BATTGRAPH(1) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) IF_PXX(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/}); uint8_t sub = m_posVert - 1; @@ -180,7 +181,7 @@ void menuGeneralSetup(uint8_t event) lcd_putsLeft(y, STR_DATE); lcd_putc(RADIO_SETUP_DATE_COLUMN, y, '-'); lcd_putc(RADIO_SETUP_DATE_COLUMN+3*FW-1, y, '-'); for (uint8_t j=0; j<3; j++) { - uint8_t rowattr = (m_posHorz<0 || m_posHorz==j) ? attr : 0; + uint8_t rowattr = (m_posHorz==j ? attr : 0); switch (j) { case 0: lcd_outdezAtt(RADIO_SETUP_DATE_COLUMN, y, t.tm_year+1900, rowattr); @@ -202,6 +203,9 @@ void menuGeneralSetup(uint8_t event) } } } +#if defined(PCBX9D) + if (attr && m_posHorz < 0) lcd_filled_rect(RADIO_SETUP_2ND_COLUMN, y, LCD_W-RADIO_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); +#endif if (attr && checkIncDec_Ret) g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated break; @@ -210,7 +214,7 @@ void menuGeneralSetup(uint8_t event) lcd_putsLeft(y, STR_TIME); lcd_putc(RADIO_SETUP_TIME_COLUMN-1, y, ':'); lcd_putc(RADIO_SETUP_TIME_COLUMN+3*FW-4, y, ':'); for (uint8_t j=0; j<3; j++) { - uint8_t rowattr = (m_posHorz<0 || m_posHorz==j) ? attr : 0; + uint8_t rowattr = (m_posHorz==j ? attr : 0); switch (j) { case 0: lcd_outdezNAtt(RADIO_SETUP_TIME_COLUMN, y, t.tm_hour, rowattr|LEADING0, 2); @@ -226,6 +230,9 @@ void menuGeneralSetup(uint8_t event) break; } } +#if defined(PCBX9D) + if (attr && m_posHorz < 0) lcd_filled_rect(RADIO_SETUP_2ND_COLUMN, y, LCD_W-RADIO_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); +#endif if (attr && checkIncDec_Ret) g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated break; @@ -235,8 +242,11 @@ void menuGeneralSetup(uint8_t event) case ITEM_SETUP_BATT_RANGE: lcd_putsLeft(y, STR_BATTERY_RANGE); lcd_putc(g_eeGeneral.vBatMin >= 10 ? RADIO_SETUP_2ND_COLUMN+2*FW+FWNUM-1 : RADIO_SETUP_2ND_COLUMN+2*FW+FWNUM-FW/2, y, '-'); - putsVolts(RADIO_SETUP_2ND_COLUMN, y, 90+g_eeGeneral.vBatMin, (m_posHorz<=0 ? attr : 0)|LEFT|NO_UNIT); - putsVolts(RADIO_SETUP_2ND_COLUMN+4*FW-2, y, 120+g_eeGeneral.vBatMax, (m_posHorz!=0 ? attr : 0)|LEFT|NO_UNIT); + putsVolts(RADIO_SETUP_2ND_COLUMN, y, 90+g_eeGeneral.vBatMin, (m_posHorz==0 ? attr : 0)|LEFT|NO_UNIT); + putsVolts(RADIO_SETUP_2ND_COLUMN+4*FW-2, y, 120+g_eeGeneral.vBatMax, (m_posHorz>0 ? attr : 0)|LEFT|NO_UNIT); +#if defined(PCBX9D) + if (attr && m_posHorz < 0) lcd_filled_rect(RADIO_SETUP_2ND_COLUMN, y, LCD_W-RADIO_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); +#endif if (attr && s_editMode>0) { if (m_posHorz==0) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -50, g_eeGeneral.vBatMax+20); // min=4.0V @@ -449,6 +459,12 @@ void menuGeneralSetup(uint8_t event) break; #endif +#if defined(PXX) + case ITEM_SETUP_COUNTRYCODE: + g_eeGeneral.countryCode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, PSTR("Country Code"), STR_COUNTRYCODES, g_eeGeneral.countryCode, 0, 2, attr, event); + break; +#endif + case ITEM_SETUP_RX_CHANNEL_ORD: lcd_putsLeft(y, STR_RXCHANNELORD); // RAET->AETR for (uint8_t i=1; i<=4; i++) diff --git a/src/gtests.cpp b/src/gtests.cpp index 937947011..6c8d71804 100644 --- a/src/gtests.cpp +++ b/src/gtests.cpp @@ -43,7 +43,7 @@ void doMixerCalculations(); #define MODEL_RESET() memset(&g_model, 0, sizeof(g_model)) #define MIXER_RESET() \ - memset(g_chans512, 0, sizeof(g_chans512)); \ + memset(channelOutputs, 0, sizeof(channelOutputs)); \ memset(ex_chans, 0, sizeof(ex_chans)) uint16_t anaIn(uint8_t chan) diff --git a/src/main_views.cpp b/src/main_views.cpp index 46e9ffa64..cc19ea45a 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -645,7 +645,7 @@ void menuMainView(uint8_t event) uint8_t chan = (g_eeGeneral.view & ALTERNATE_VIEW) ? 8+i : i; #endif - int16_t val = g_chans512[chan]; + int16_t val = channelOutputs[chan]; switch(view_base) { diff --git a/src/menus.h b/src/menus.h index b39bab645..e1b78593d 100644 --- a/src/menus.h +++ b/src/menus.h @@ -191,10 +191,17 @@ typedef void (*MenuFuncP_PROGMEM)(uint8_t event); void title(const pm_char * s); #define TITLE(str) title(str) +#if defined(CPUARM) +#define MENU(title, tab, menu, lines_count, ...) \ +const uint8_t mstate_tab[] = __VA_ARGS__; \ +if (!check(event,menu,tab,DIM(tab),mstate_tab,DIM(mstate_tab)-1,(lines_count)-1)) return; \ +TITLE(title) +#else #define MENU(title, tab, menu, lines_count, ...) \ static const pm_uint8_t mstate_tab[] PROGMEM = __VA_ARGS__; \ if (!check(event,menu,tab,DIM(tab),mstate_tab,DIM(mstate_tab)-1,(lines_count)-1)) return; \ TITLE(title) +#endif #define SIMPLE_MENU_NOTITLE(tab, menu, lines_count) \ if (!check_simple(event,menu,tab,DIM(tab),(lines_count)-1)) return; diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 18b20e7ff..ceed5e3b1 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -750,9 +750,16 @@ enum menuModelSetupItems { ITEM_MODEL_THROTTLE_WARNING, ITEM_MODEL_SWITCHES_WARNING, ITEM_MODEL_BEEP_CENTER, +#if defined(PCBX9D) + ITEM_MODE_INTERNAL_MODULE_LABEL, + ITEM_MODE_INTERNAL_MODULE_MODE, + ITEM_MODE_INTERNAL_MODULE_BIND, + ITEM_MODE_INTERNAL_MODULE_FAILSAFE, +#else ITEM_MODEL_PROTOCOL, IF_PCBSKY9X(ITEM_MODEL_PPM2_PROTOCOL) ITEM_MODEL_PROTOCOL_PARAMS, +#endif ITEM_MODEL_SETUP_MAX }; @@ -777,14 +784,17 @@ void menuModelSetup(uint8_t event) } #endif - uint8_t protocol = g_model.protocol; - #if defined(DSM2) if (event == EVT_KEY_LONG(KEY_EXIT)) s_rangecheck_mode = 0; #endif +#if defined(PCBX9D) + MENU(STR_MENUSETUP, menuTabModel, e_Model, 1+ITEM_MODEL_SETUP_MAX, { 0, 0, CASE_PCBX9D(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, LABEL(InternalModule), 2, 2, g_model.failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0}); +#else + uint8_t protocol = g_model.protocol; MENU(STR_MENUSETUP, menuTabModel, e_Model, ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX), { 0, 0, CASE_PCBX9D(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, IF_PCBSKY9X(1) 2 }); +#endif uint8_t sub = m_posVert - 1; int8_t editMode = s_editMode; @@ -838,8 +848,11 @@ void menuModelSetup(uint8_t event) } else { putsStrIdx(0*FW, y, STR_TIMER, k>=ITEM_MODEL_TIMER2 ? 2 : 1); - putsTmrMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, m_posHorz<=0 ? attr : 0); - putsTime(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, (m_posHorz<0 || m_posHorz==1) ? attr : 0, (m_posHorz<0 || m_posHorz==2) ? attr : 0); + putsTmrMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, m_posHorz==0 ? attr : 0); + putsTime(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, m_posHorz==1 ? attr : 0, m_posHorz==2 ? attr : 0); +#if defined(PCBX9D) + if (attr && m_posHorz < 0) lcd_filled_rect(MODEL_SETUP_2ND_COLUMN, y, LCD_W-MODEL_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); +#endif if (attr && (editMode>0 || p1valdiff)) { div_t qr = div(timer->start, 60); switch (m_posHorz) { @@ -969,6 +982,95 @@ void menuModelSetup(uint8_t event) } break; +#if defined(PCBX9D) + case ITEM_MODE_INTERNAL_MODULE_LABEL: + lcd_putsLeft(y, PSTR("Internal Module")); + break; + + case ITEM_MODE_INTERNAL_MODULE_MODE: + lcd_putsLeft(y, PSTR("\001Mode")); + lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, PSTR("\004""OFF\0""X16\0""D8\0 ""LR12"), 1+g_model.rfProtocol, m_posHorz==0 ? attr : 0); + lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+5*FW+3, y, STR_CH, m_posHorz==1 ? attr : 0); + lcd_outdezAtt(lcdLastPos, y, g_model.ppmSCH+1, LEFT | (m_posHorz==1 ? attr : 0)); + lcd_putc(lcdLastPos, y, '-'); + lcd_outdezAtt(lcdLastPos + FW+1, y, g_model.ppmSCH+NUM_PORT1_CHANNELS(g_model), LEFT | (m_posHorz==2 ? attr : 0)); + if (attr && m_posHorz < 0) lcd_filled_rect(MODEL_SETUP_2ND_COLUMN, y, LCD_W-MODEL_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); + if (attr && (editMode>0 || p1valdiff)) { + static const int8_t maxChannels[] = { 0, 4, 0, 2 }; + switch (m_posHorz) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.rfProtocol, RF_PROTO_OFF, RF_PROTO_LAST); + g_model.ppmSCH = 0; + g_model.ppmNCH = maxChannels[1+g_model.rfProtocol]; + break; + case 1: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.ppmSCH, 32-8-(g_model.ppmNCH*2)); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.ppmNCH, min(maxChannels[1+g_model.rfProtocol], (32-g_model.ppmSCH)/2-4)); + break; + } + } + break; + + case ITEM_MODE_INTERNAL_MODULE_BIND: + lcd_putsLeft(y, STR_RXNUM); + lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN, y, g_model.modelId, (m_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + if (attr && m_posHorz==0) { + if (editMode>0 || p1valdiff) { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.modelId, 63); + if (checkIncDec_Ret) + modelIds[g_eeGeneral.currModel] = g_model.modelId; + } + if (editMode==0 && event==EVT_KEY_BREAK(KEY_ENTER)) + checkModelIdUnique(g_eeGeneral.currModel); + } + + lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+3*FW, y, PSTR("[Bind]"), (m_posHorz==1 ? attr : 0)); + if (attr && m_posHorz==1) { + s_editMode = 0; + if (event==EVT_KEY_BREAK(KEY_ENTER)) { + pxxFlag = PXX_SEND_RXNUM; + } + } + + lcd_putsAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, PSTR("[Range]"), (pxxFlag == PXX_SEND_RANGECHECK ? BLINK : 0) | (m_posHorz==2 ? attr : 0)); + if (attr && m_posHorz==2) { + s_editMode = 0; + if (event==EVT_KEY_BREAK(KEY_ENTER)) { + pxxFlag ^= PXX_SEND_RANGECHECK; + } + } + + if (attr && m_posHorz < 0) lcd_filled_rect(MODEL_SETUP_2ND_COLUMN, y, LCD_W-MODEL_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); + break; + + case ITEM_MODE_INTERNAL_MODULE_FAILSAFE: + lcd_putsLeft(y, PSTR("\001FailSafe")); + lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, PSTR("\011""Hold\0 ""Custom\0 ""No pulses"), g_model.failsafeMode, (m_posHorz==0 || g_model.failsafeMode!=FAILSAFE_CUSTOM) ? attr : 0); + if (g_model.failsafeMode == FAILSAFE_CUSTOM) lcd_putsAtt(MODEL_SETUP_2ND_COLUMN + 10*FW, y, PSTR("[Set]"), m_posHorz==1 ? attr : 0); + if (attr) { + if (s_editMode==0 && g_model.failsafeMode!=FAILSAFE_CUSTOM) + m_posHorz = -1; + if (m_posHorz==0 || g_model.failsafeMode!=FAILSAFE_CUSTOM) { + if (editMode>0 || p1valdiff) { + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.failsafeMode, FAILSAFE_LAST); + } + } + else if (m_posHorz==1) { + s_editMode = 0; + if (g_model.failsafeMode==FAILSAFE_CUSTOM && event==EVT_KEY_LONG(KEY_ENTER)) { + for (int32_t i=g_model.ppmSCH; iNUM_PORT2_CHANNELS ? 4*(NUM_PORT1_CHANNELS-8) : 4*(NUM_PORT2_CHANNELS-8); + g_model.ppmFrameLength = NUM_PORT1_CHANNELS(g_model)>NUM_PORT2_CHANNELS(g_model) ? 4*(NUM_PORT1_CHANNELS(g_model)-8) : 4*(NUM_PORT2_CHANNELS(g_model)-8); #else CHECK_INCDEC_MODELVAR(event, g_model.ppmNCH, -2, 4); g_model.ppmFrameLength = g_model.ppmNCH * 8; @@ -1014,7 +1116,7 @@ void menuModelSetup(uint8_t event) case 2: if (IS_PPM_PROTOCOL(protocol)) { CHECK_INCDEC_MODELVAR(event, g_model.ppmNCH, -2, min(4, (32-g_model.ppmSCH)/2-4)); - g_model.ppmFrameLength = NUM_PORT1_CHANNELS>NUM_PORT2_CHANNELS ? 4*(NUM_PORT1_CHANNELS-8) : 4*(NUM_PORT2_CHANNELS-8); + g_model.ppmFrameLength = NUM_PORT1_CHANNELS(g_model)>NUM_PORT2_CHANNELS(g_model) ? 4*(NUM_PORT1_CHANNELS(g_model)-8) : 4*(NUM_PORT2_CHANNELS(g_model)-8); } else REPEAT_LAST_CURSOR_MOVE(); @@ -1036,11 +1138,11 @@ void menuModelSetup(uint8_t event) switch (m_posHorz) { case 0: CHECK_INCDEC_MODELVAR_ZERO(event, g_model.ppm2SCH, 32-8-(g_model.ppm2NCH*2)); - g_model.ppmFrameLength = NUM_PORT1_CHANNELS>NUM_PORT2_CHANNELS ? 4*(NUM_PORT1_CHANNELS-8) : 4*(NUM_PORT2_CHANNELS-8); + g_model.ppmFrameLength = NUM_PORT1_CHANNELS(g_model)>NUM_PORT2_CHANNELS(g_model) ? 4*(NUM_PORT1_CHANNELS(g_model)-8) : 4*(NUM_PORT2_CHANNELS(g_model)-8); break; case 1: CHECK_INCDEC_MODELVAR(event, g_model.ppm2NCH, -2, min(4, (32-g_model.ppm2SCH)/2-4)); - g_model.ppmFrameLength = NUM_PORT1_CHANNELS>NUM_PORT2_CHANNELS ? 4*(NUM_PORT1_CHANNELS-8) : 4*(NUM_PORT2_CHANNELS-8); + g_model.ppmFrameLength = NUM_PORT1_CHANNELS(g_model)>NUM_PORT2_CHANNELS(g_model) ? 4*(NUM_PORT1_CHANNELS(g_model)-8) : 4*(NUM_PORT2_CHANNELS(g_model)-8); break; } } @@ -1113,6 +1215,7 @@ void menuModelSetup(uint8_t event) } #endif break; +#endif // defined(PCBX9D) } } @@ -2725,10 +2828,10 @@ void menuModelLimits(uint8_t event) if (sub < NUM_CHNOUT) { #if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_UNIT_US) - lcd_outdezAtt(13*FW, 0, PPM_CH_CENTER(sub)+g_chans512[sub]/2, 0); + lcd_outdezAtt(13*FW, 0, PPM_CH_CENTER(sub)+channelOutputs[sub]/2, 0); lcd_puts(13*FW, 0, STR_US); #else - lcd_outdezAtt(13*FW, 0, calcRESXto1000(g_chans512[sub]), PREC1); + lcd_outdezAtt(13*FW, 0, calcRESXto1000(channelOutputs[sub]), PREC1); #endif } @@ -2775,8 +2878,8 @@ void menuModelLimits(uint8_t event) #if LCD_W >= 212 || !defined(PPM_CENTER_ADJUSTABLE) int16_t v = (ld->revert) ? -ld->offset : ld->offset; char swVal = '-'; // '-', '<', '>' - if((g_chans512[k] - v) > 50) swVal = (ld->revert ? 127 : 126); // Switch to raw inputs? - remove trim! - if((g_chans512[k] - v) < -50) swVal = (ld->revert ? 126 : 127); + if((channelOutputs[k] - v) > 50) swVal = (ld->revert ? 127 : 126); // Switch to raw inputs? - remove trim! + if((channelOutputs[k] - v) < -50) swVal = (ld->revert ? 126 : 127); putsChn(0, y, k+1, 0); lcd_putc(LIMITS_DIRECTION_POS, y, swVal); #endif @@ -2815,7 +2918,7 @@ void menuModelLimits(uint8_t event) } else if (attr && event==EVT_KEY_LONG(KEY_MENU)) { pauseMixerCalculations(); - int32_t zero = (int32_t)g_chans512[k]; + int32_t zero = (int32_t)channelOutputs[k]; perOut(e_perout_mode_nosticks+e_perout_mode_notrainer, 0); int32_t chan = chans[k]; int8_t lim = ld->max+100; diff --git a/src/monitors_views.cpp b/src/monitors_views.cpp index 96f2c5fb6..988629646 100644 --- a/src/monitors_views.cpp +++ b/src/monitors_views.cpp @@ -60,7 +60,7 @@ void menuChannelsMonitor(uint8_t event) // Channels for (uint8_t line=0; line<8; line++) { uint8_t y = 9+line*7; - int32_t val = g_chans512[ch]; + int32_t val = channelOutputs[ch]; uint8_t ofs = (col ? 0 : 1); // Channel name if present, number if not diff --git a/src/myeeprom.h b/src/myeeprom.h index 2d7a3cdaf..e7eeeb221 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -111,7 +111,7 @@ PACK(typedef struct t_FrSkyRSSIAlarm { int8_t value:6; }) FrSkyRSSIAlarm; -#if defined(PCBX9D) || defined(PCBACT) +#if defined(PCBX9D) enum MainViews { VIEW_TIMERS, VIEW_INPUTS, @@ -136,7 +136,7 @@ enum BeeperMode { }; #if defined(CPUARM) -#define EXTRA_GENERAL_FIELDS \ + #define EXTRA_GENERAL_FIELDS \ uint8_t backlightBright; \ int8_t currentCalib; \ int8_t temperatureWarn; \ @@ -147,17 +147,20 @@ enum BeeperMode { uint8_t btBaudrate; \ uint8_t optrexDisplay; \ uint8_t sticksGain; \ - uint8_t rotarySteps; + uint8_t rotarySteps; \ + uint8_t countryCode; +#elif defined(PXX) + #define EXTRA_GENERAL_FIELDS uint8_t countryCode; #else -#define EXTRA_GENERAL_FIELDS + #define EXTRA_GENERAL_FIELDS #endif -#if defined(PCBX9D) || defined(PCBACT) -#define MODELDATA_EXTRA char bitmap[10]; +#if defined(PCBX9D) +#define MODELDATA_EXTRA char bitmap[10]; int8_t rfProtocol; uint8_t ppmSCH; uint8_t failsafeMode; int16_t failsafeChannels[16]; #define LIMITDATA_EXTRA char name[6]; #define swstate_t uint16_t #elif defined(PCBSKY9X) -#define MODELDATA_EXTRA uint8_t ppmSCH; int8_t ppm2SCH; int8_t ppm2NCH; +#define MODELDATA_EXTRA uint8_t ppmSCH; int8_t ppm2SCH; int8_t ppm2NCH; int8_t rfProtocol; uint8_t rfCountryCode; #define LIMITDATA_EXTRA #define swstate_t uint8_t #else @@ -224,11 +227,11 @@ PACK(typedef struct t_EEGeneral { int8_t vBatMin; int8_t vBatMax; - EXTRA_GENERAL_FIELDS; + EXTRA_GENERAL_FIELDS }) EEGeneral; -#if defined(PCBX9D) || defined(PCBACT) +#if defined(PCBX9D) #define LEN_MODEL_NAME 12 #define LEN_EXPOMIX_NAME 10 #define LEN_FP_NAME 10 @@ -754,11 +757,7 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data #define ROTARY_ENCODER_MAX 1024 -#if defined(PCBACT) -#define NUM_ROTARY_ENCODERS 0 -#define ROTARY_ENCODER_ARRAY_EXTRA -#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1]; -#elif defined(PCBX9D) +#if defined(PCBX9D) #define NUM_ROTARY_ENCODERS 0 #define NUM_ROTARY_ENCODERS_EXTRA 0 #define ROTARY_ENCODER_ARRAY_EXTRA @@ -1088,6 +1087,21 @@ enum Protocols { PROTO_NONE }; +enum RfProtocols { + RF_PROTO_OFF = -1, + RF_PROTO_X16, + RF_PROTO_D8, + RF_PROTO_LR12, + RF_PROTO_LAST = RF_PROTO_LR12 +}; + +enum FailsafeModes { + FAILSAFE_HOLD, + FAILSAFE_CUSTOM, + FAILSAFE_NOPULSES, + FAILSAFE_LAST = FAILSAFE_NOPULSES +}; + #if defined(MAVLINK) #define TELEMETRY_DATA MavlinkData mavlink; #elif defined(FRSKY) || !defined(CPUM64) diff --git a/src/open9x.cpp b/src/open9x.cpp index 70513d278..feafd3efd 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -832,7 +832,7 @@ int16_t applyLimits(uint8_t channel, int32_t value) } int16_t calibratedStick[NUM_STICKS+NUM_POTS]; -int16_t g_chans512[NUM_CHNOUT] = {0}; +int16_t channelOutputs[NUM_CHNOUT] = {0}; int16_t ex_chans[NUM_CHNOUT] = {0}; // Outputs (before LIMITS) of the last perMain; #ifdef HELI int16_t cyc_anas[3] = {0}; @@ -3063,7 +3063,7 @@ void doMixerCalculations() int16_t value = applyLimits(i, q); // applyLimits will remove the 256 100% basis cli(); - g_chans512[i] = value; // copy consistent word to int-level + channelOutputs[i] = value; // copy consistent word to int-level sei(); } @@ -3087,7 +3087,7 @@ void doMixerCalculations() if (g_model.thrTraceSrc > NUM_POTS) { uint8_t ch = g_model.thrTraceSrc-NUM_POTS-1; - val = g_chans512[ch]; + val = channelOutputs[ch]; int16_t gModelMax = calc100toRESX(g_model.limitData[ch].max)+1024; int16_t gModelMin = calc100toRESX(g_model.limitData[ch].min)-1024; diff --git a/src/open9x.h b/src/open9x.h index 0107157ec..4af3da2bb 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -128,6 +128,12 @@ #define IF_FRSKY(x) #endif +#if defined(PXX) +#define IF_PXX(x) x, +#else +#define IF_PXX(x) +#endif + #if defined(SDCARD) #define IF_SDCARD(x) x, #else @@ -412,46 +418,51 @@ extern uint8_t s_bind_allowed; #endif #if defined(CPUARM) -#define IS_PPM_PROTOCOL(protocol) (protocol==PROTO_PPM) + #define IS_PPM_PROTOCOL(protocol) (protocol==PROTO_PPM) #else -#define IS_PPM_PROTOCOL(protocol) (protocol<=PROTO_PPMSIM) + #define IS_PPM_PROTOCOL(protocol) (protocol<=PROTO_PPMSIM) #endif #if defined(PXX) -#define IS_PXX_PROTOCOL(protocol) (protocol==PROTO_PXX) + #define IS_PXX_PROTOCOL(protocol) (protocol==PROTO_PXX) #else -#define IS_PXX_PROTOCOL(protocol) (0) + #define IS_PXX_PROTOCOL(protocol) (0) #endif #if defined(DSM2) -#define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTO_DSM2_LP45 && protocol<=PROTO_DSM2_DSMX) + #define IS_DSM2_PROTOCOL(protocol) (protocol>=PROTO_DSM2_LP45 && protocol<=PROTO_DSM2_DSMX) #else -#define IS_DSM2_PROTOCOL(protocol) (0) + #define IS_DSM2_PROTOCOL(protocol) (0) #endif #if defined(DSM2_SERIAL) -#define IS_DSM2_SERIAL_PROTOCOL(protocol) (IS_DSM2_PROTOCOL(protocol)) + #define IS_DSM2_SERIAL_PROTOCOL(protocol) (IS_DSM2_PROTOCOL(protocol)) #else -#define IS_DSM2_SERIAL_PROTOCOL(protocol) (0) + #define IS_DSM2_SERIAL_PROTOCOL(protocol) (0) #endif +#if defined(PCBX9D) + #define NUM_PORT1_CHANNELS(model) ((8+(model.ppmNCH*2))) +#else + #define NUM_PORT1_CHANNELS(model) (IS_PXX_PROTOCOL(model.protocol) ? 8 : (IS_DSM2_PROTOCOL(model.protocol) ? 6 : (8+(model.ppmNCH*2)))) +#endif -#define NUM_PORT1_CHANNELS (IS_PXX_PROTOCOL(g_model.protocol) ? 8 : (IS_DSM2_PROTOCOL(g_model.protocol) ? 6 : (8+(g_model.ppmNCH*2)))) #if defined(PCBSKY9X) -#define NUM_PORT2_CHANNELS (8+(g_model.ppm2NCH*2)) + #define NUM_PORT2_CHANNELS(model) (8+(model.ppm2NCH*2)) #endif #include "lcd.h" #include "menus.h" -#ifdef TEMPLATES -#include "templates.h" + +#if defined(TEMPLATES) + #include "templates.h" #endif #if !defined(SIMU) -#define assert(x) -#if !defined(CPUARM) || !defined(DEBUG) -#define printf printf_not_allowed -#endif + #define assert(x) + #if !defined(CPUARM) || !defined(DEBUG) + #define printf printf_not_allowed + #endif #endif extern const pm_uint8_t bchout_ar[]; @@ -642,8 +653,9 @@ extern uint16_t inacSum; extern uint8_t pxxFlag; #endif -#define PXX_SEND_RXNUM 0x01 -#define PXX_SEND_FAILSAFE 0x02 +#define PXX_SEND_RXNUM 0x01 +#define PXX_SEND_FAILSAFE 0x02 +#define PXX_SEND_RANGECHECK (1 << 1) #define ZCHAR_MAX (40 + LEN_SPECIAL_CHARS) @@ -1016,7 +1028,7 @@ extern uint8_t ppmInState; //0=unsync 1..8= wait for value i-1 extern int16_t g_ppmIns[8]; extern int32_t chans[NUM_CHNOUT]; extern int16_t ex_chans[NUM_CHNOUT]; // Outputs (before LIMITS) of the last perMain -extern int16_t g_chans512[NUM_CHNOUT]; +extern int16_t channelOutputs[NUM_CHNOUT]; extern uint16_t BandGap; extern int16_t expo(int16_t x, int16_t k); diff --git a/src/pulses_arm.cpp b/src/pulses_arm.cpp index 0f0a13dad..33e1c1a59 100644 --- a/src/pulses_arm.cpp +++ b/src/pulses_arm.cpp @@ -131,7 +131,7 @@ void setupPulsesPPM(PPM_PORT_PARAM) // Don't enable interrupts uint32_t rest = 22500u * 2; //Minimum Framelen=22.5 ms rest += (int32_t(g_model.ppmFrameLength)) * 1000; for (uint32_t i=firstCh; i 2047 ) -// { -// chan = 2047 ; -// } -// if ( chan_1 > 2047 ) -// { -// chan_1 = 2047 ; -// } - putPcmByte( chan ) ; // Low byte of channel - putPcmByte( ( ( chan >> 8 ) & 0x0F ) | ( chan_1 << 4) ) ; // 4 bits each from 2 channels - putPcmByte( chan_1 >> 4 ) ; // High byte of channel + PcmCrc = 0; + PcmOnesCount = 0; + + /* Sync */ + putPcmHead(); + + /* Rx Number */ + putPcmByte(g_model.modelId); + + /* FLAG1 */ + if (pxxFlag == PXX_SEND_RXNUM) { + putPcmByte((g_model.rfProtocol << 6) | (g_eeGeneral.countryCode << 1) | pxxFlag); + pxxFlag = 0; // reset flag after send } - chan = PcmCrc ; // get the crc - putPcmByte( chan ) ; // Checksum lo - putPcmByte( chan >> 8 ) ; // Checksum hi - putPcmHead( ) ; // sync byte - putPcmFlush() ; + else { + putPcmByte((g_model.rfProtocol << 6) | pxxFlag); + } + + /* FLAG2 */ + putPcmByte(0); + + /* PPM */ + static uint32_t pass = 0; + uint32_t sendUpperChannels = 0; + if (pass++ & 0x01) { + sendUpperChannels = g_model.ppmNCH*2; + } + for (uint32_t i=0; i<8; i+=2) { + if (i < sendUpperChannels) { + chan = limit(2048, channelOutputs[8+g_model.ppmSCH+i] + 3072, 4095); + chan_1 = limit(2048, channelOutputs[8+g_model.ppmSCH+i+1] + 3072, 4095); + } + else { + chan = limit(0, channelOutputs[g_model.ppmSCH+i] + 1024, 2047); + chan_1 = limit(0, channelOutputs[g_model.ppmSCH+i+1] + 1024, 2047); + } + putPcmByte(chan); // Low byte of channel + putPcmByte( ( ( chan >> 8 ) & 0x0F ) | ( chan_1 << 4) ) ; // 4 bits each from 2 channels + putPcmByte(chan_1 >> 4); // High byte of channel + } + + /* CRC16 */ + chan = PcmCrc; + putPcmByte(chan); + putPcmByte(chan >> 8); + + /* Sync */ + putPcmHead(); + + putPcmFlush(); } #if defined(DSM2) @@ -382,7 +405,7 @@ void setupPulsesDsm2(uint8_t chns) dsmDat[1]=g_eeGeneral.currModel+1; //DSM2 Header second byte for model match for(uint8_t i=0; i>5)+512,1023); + uint16_t pulse = limit(0, ((channelOutputs[i]*13)>>5)+512,1023); dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03); dsmDat[3+2*i] = pulse & 0xff; } @@ -485,7 +508,12 @@ void setupPulses() { heartbeat |= HEART_TIMER_PULSES; +#if defined(PCBX9D) + uint8_t required_protocol = (g_model.rfProtocol == RF_PROTO_OFF ? PROTO_NONE : PROTO_PXX); +#else uint8_t required_protocol = g_model.protocol; +#endif + if (s_pulses_paused) required_protocol = PROTO_NONE; diff --git a/src/pulses_avr.cpp b/src/pulses_avr.cpp index 1e658024a..0d8a2fa8d 100644 --- a/src/pulses_avr.cpp +++ b/src/pulses_avr.cpp @@ -169,7 +169,7 @@ void setupPulsesPPM(uint8_t proto) rest += (int32_t(g_model.ppmFrameLength))*1000; for (uint8_t i=(proto==PROTO_PPM16) ? p-8 : 0; i> 8 ) & 0x0F ) | ( chan_1 << 4) ) ; // 4 bits each from 2 channels putPcmByte( chan_1 >> 4 ) ; // High byte of channel @@ -405,7 +405,7 @@ FORCEINLINE void setupPulsesDsm2() *ptr++ = g_model.modelId; for (uint8_t i=0; i>5)+512,1023); + uint16_t pulse = limit(0, ((channelOutputs[i]*13)>>5)+512,1023); *ptr++ = (i<<2) | ((pulse>>8)&0x03); // encoded channel + upper 2 bits pulse width *ptr++ = pulse & 0xff; // low byte } @@ -533,7 +533,7 @@ void setupPulsesDsm2() dsmDat[1] = g_model.modelId; // DSM2 Header second byte for model match for (uint8_t i=0; i>5)+512,1023); + uint16_t pulse = limit(0, ((channelOutputs[i]*13)>>5)+512,1023); dsmDat[2+2*i] = (i<<2) | ((pulse>>8)&0x03); // encoded channel + upper 2 bits pulse width dsmDat[3+2*i] = pulse & 0xff; // low byte } @@ -675,8 +675,8 @@ NOINLINE int8_t reduce7s(int16_t v, uint8_t sfr, uint8_t sf2, int8_t ofs2) } //these defines allow the compiler to preclculate constants -#define getChan7u(i,bitsRes) reduce7u(g_chans512[i],(BITS-bitsRes)) -#define getChan7s(i,bitsRes) reduce7s(g_chans512[i],(BITS-bitsRes),1<<((BITS-bitsRes)-1),1<<(bitsRes-1)) +#define getChan7u(i,bitsRes) reduce7u(channelOutputs[i],(BITS-bitsRes)) +#define getChan7s(i,bitsRes) reduce7s(channelOutputs[i],(BITS-bitsRes),1<<((BITS-bitsRes)-1),1<<(bitsRes-1)) static void setupPulsesPiccoZ(uint8_t chn) { diff --git a/src/translations.cpp b/src/translations.cpp index bd2a530dc..635936712 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -95,6 +95,9 @@ const pm_char STR_OPEN9X[] PROGMEM = #endif #if defined(CPUARM) ISTR(VLCD) +#endif +#if defined(PXX) + ISTR(COUNTRYCODES) #endif ; diff --git a/src/translations.h b/src/translations.h index 7512abf0d..53963dc5c 100644 --- a/src/translations.h +++ b/src/translations.h @@ -76,143 +76,154 @@ extern const pm_char STR_OPEN9X[]; -#define OFS_OFFON 0 -#define OFS_MMMINV (OFS_OFFON + sizeof(TR_OFFON)) -#define OFS_NCHANNELS (OFS_MMMINV + sizeof(TR_MMMINV)) +#define OFS_OFFON 0 +#define OFS_MMMINV (OFS_OFFON + sizeof(TR_OFFON)) +#define OFS_NCHANNELS (OFS_MMMINV + sizeof(TR_MMMINV)) #if defined(GRAPHICS) -#define OFS_VBEEPMODE (OFS_NCHANNELS + sizeof(TR_NCHANNELS)) +#define OFS_VBEEPMODE (OFS_NCHANNELS + sizeof(TR_NCHANNELS)) #else -#define OFS_VBEEPLEN (OFS_NCHANNELS + sizeof(TR_NCHANNELS)) -#define OFS_VBEEPMODE (OFS_VBEEPLEN + sizeof(TR_VBEEPLEN)) +#define OFS_VBEEPLEN (OFS_NCHANNELS + sizeof(TR_NCHANNELS)) +#define OFS_VBEEPMODE (OFS_VBEEPLEN + sizeof(TR_VBEEPLEN)) #endif #if defined(ROTARY_ENCODERS) -#define OFS_VRENAVIG (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) -#define OFS_VRENCODERS (OFS_VRENAVIG + sizeof(TR_VRENAVIG)) -#define OFS_TRNMODE (OFS_VRENCODERS + sizeof(TR_VRENCODERS)) +#define OFS_VRENAVIG (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) +#define OFS_VRENCODERS (OFS_VRENAVIG + sizeof(TR_VRENAVIG)) +#define OFS_TRNMODE (OFS_VRENCODERS + sizeof(TR_VRENCODERS)) #elif defined(ROTARY_ENCODER_NAVIGATION) -#define OFS_VRENCODERS (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) -#define OFS_TRNMODE (OFS_VRENCODERS + sizeof(TR_VRENCODERS)) +#define OFS_VRENCODERS (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) +#define OFS_TRNMODE (OFS_VRENCODERS + sizeof(TR_VRENCODERS)) #else -#define OFS_TRNMODE (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) +#define OFS_TRNMODE (OFS_VBEEPMODE + sizeof(TR_VBEEPMODE)) #endif -#define OFS_TRNCHN (OFS_TRNMODE + sizeof(TR_TRNMODE)) -#define OFS_VTRIMINC (OFS_TRNCHN + sizeof(TR_TRNCHN)) -#define OFS_RETA123 (OFS_VTRIMINC + sizeof(TR_VTRIMINC)) -#define OFS_VPROTOS (OFS_RETA123 + sizeof(TR_RETA123)) -#define OFS_POSNEG (OFS_VPROTOS + sizeof(TR_VPROTOS)) -#define OFS_VBLMODE (OFS_POSNEG + sizeof(TR_POSNEG)) -#define OFS_VCURVEFUNC (OFS_VBLMODE + sizeof(TR_VBLMODE)) -#define OFS_VMLTPX (OFS_VCURVEFUNC + sizeof(TR_VCURVEFUNC)) -#define OFS_VMLTPX2 (OFS_VMLTPX + sizeof(TR_VMLTPX)) -#define OFS_VMIXTRIMS (OFS_VMLTPX2 + sizeof(TR_VMLTPX2)) -#define OFS_VCSWFUNC (OFS_VMIXTRIMS + sizeof(TR_VMIXTRIMS)) -#define OFS_VFSWFUNC (OFS_VCSWFUNC + sizeof(TR_VCSWFUNC)) -#define OFS_VFSWRESET (OFS_VFSWFUNC + sizeof(TR_VFSWFUNC)) -#define OFS_FUNCSOUNDS (OFS_VFSWRESET + sizeof(TR_VFSWRESET)) -#define OFS_VTELEMCHNS (OFS_FUNCSOUNDS + sizeof(TR_FUNCSOUNDS)) +#define OFS_TRNCHN (OFS_TRNMODE + sizeof(TR_TRNMODE)) +#define OFS_VTRIMINC (OFS_TRNCHN + sizeof(TR_TRNCHN)) +#define OFS_RETA123 (OFS_VTRIMINC + sizeof(TR_VTRIMINC)) +#define OFS_VPROTOS (OFS_RETA123 + sizeof(TR_RETA123)) +#define OFS_POSNEG (OFS_VPROTOS + sizeof(TR_VPROTOS)) +#define OFS_VBLMODE (OFS_POSNEG + sizeof(TR_POSNEG)) +#define OFS_VCURVEFUNC (OFS_VBLMODE + sizeof(TR_VBLMODE)) +#define OFS_VMLTPX (OFS_VCURVEFUNC + sizeof(TR_VCURVEFUNC)) +#define OFS_VMLTPX2 (OFS_VMLTPX + sizeof(TR_VMLTPX)) +#define OFS_VMIXTRIMS (OFS_VMLTPX2 + sizeof(TR_VMLTPX2)) +#define OFS_VCSWFUNC (OFS_VMIXTRIMS + sizeof(TR_VMIXTRIMS)) +#define OFS_VFSWFUNC (OFS_VCSWFUNC + sizeof(TR_VCSWFUNC)) +#define OFS_VFSWRESET (OFS_VFSWFUNC + sizeof(TR_VFSWFUNC)) +#define OFS_FUNCSOUNDS (OFS_VFSWRESET + sizeof(TR_VFSWRESET)) +#define OFS_VTELEMCHNS (OFS_FUNCSOUNDS + sizeof(TR_FUNCSOUNDS)) #if defined(FRSKY) || defined(CPUARM) -#define OFS_VTELEMUNIT (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS)) -#define OFS_VALARM (OFS_VTELEMUNIT + sizeof(TR_VTELEMUNIT)) -#define OFS_VALARMFN (OFS_VALARM + sizeof(TR_VALARM)) -#define OFS_VTELPROTO (OFS_VALARMFN + sizeof(TR_VALARMFN)) -#define OFS_GPSFORMAT (OFS_VTELPROTO + sizeof(TR_VTELPROTO)) -#define OFS_VOLTSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT)) -#define OFS_VARIOSRC (OFS_VOLTSRC + sizeof(TR_VOLTSRC)) -#define OFS_VSCREEN (OFS_VARIOSRC + sizeof(TR_VARIOSRC)) -#define OFS_ENDTELEM (OFS_VSCREEN + sizeof(TR_VSCREEN)) + #define OFS_VTELEMUNIT (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS)) + #define OFS_VALARM (OFS_VTELEMUNIT + sizeof(TR_VTELEMUNIT)) + #define OFS_VALARMFN (OFS_VALARM + sizeof(TR_VALARM)) + #define OFS_VTELPROTO (OFS_VALARMFN + sizeof(TR_VALARMFN)) + #define OFS_GPSFORMAT (OFS_VTELPROTO + sizeof(TR_VTELPROTO)) + #define OFS_VOLTSRC (OFS_GPSFORMAT + sizeof(TR_GPSFORMAT)) + #define OFS_VARIOSRC (OFS_VOLTSRC + sizeof(TR_VOLTSRC)) + #define OFS_VSCREEN (OFS_VARIOSRC + sizeof(TR_VARIOSRC)) + #define OFS_VTEMPLATES (OFS_VSCREEN + sizeof(TR_VSCREEN)) #else -#define OFS_ENDTELEM (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS)) + #define OFS_VTEMPLATES (OFS_VTELEMCHNS + sizeof(TR_VTELEMCHNS)) #endif -#ifdef TEMPLATES -#define OFS_VTEMPLATES (OFS_ENDTELEM) -#define OFS_ENDTPLS (OFS_VTEMPLATES + sizeof(TR_VTEMPLATES)) +#if defined(TEMPLATES) + #define OFS_VSWASHTYPE (OFS_VTEMPLATES + sizeof(TR_VTEMPLATES)) #else -#define OFS_ENDTPLS (OFS_ENDTELEM) + #define OFS_VSWASHTYPE (OFS_VTEMPLATES) #endif -#ifdef HELI -#define OFS_VSWASHTYPE (OFS_ENDTPLS) -#define OFS_ENDHELI (OFS_VSWASHTYPE + sizeof(TR_VSWASHTYPE)) +#if defined(HELI) + #define OFS_VKEYS (OFS_VSWASHTYPE + sizeof(TR_VSWASHTYPE)) #else -#define OFS_ENDHELI (OFS_ENDTPLS) + #define OFS_VKEYS (OFS_VSWASHTYPE) #endif -#define OFS_VKEYS (OFS_ENDHELI) -#define OFS_VSWITCHES (OFS_VKEYS + sizeof(TR_VKEYS)) -#define OFS_VSWITCHES_SHORT (OFS_VSWITCHES + sizeof(TR_VSWITCHES)) -#define OFS_VSRCRAW (OFS_VSWITCHES_SHORT + sizeof(TR_VSWITCHES_SHORT)) -#define OFS_VTMRMODES (OFS_VSRCRAW + sizeof(TR_VSRCRAW)) +#define OFS_VSWITCHES (OFS_VKEYS + sizeof(TR_VKEYS)) +#define OFS_VSWITCHES_SHORT (OFS_VSWITCHES + sizeof(TR_VSWITCHES)) +#define OFS_VSRCRAW (OFS_VSWITCHES_SHORT + sizeof(TR_VSWITCHES_SHORT)) +#define OFS_VTMRMODES (OFS_VSRCRAW + sizeof(TR_VSRCRAW)) +#define OFS_DATETIME (OFS_VTMRMODES + sizeof(TR_VTMRMODES)) #if defined(PCBGRUVIN9X) || defined(CPUARM) -#define OFS_DATETIME (OFS_VTMRMODES + sizeof(TR_VTMRMODES)) + #define OFS_VLCD (OFS_DATETIME + sizeof(TR_DATETIME)) +#else + #define OFS_VLCD (OFS_DATETIME) #endif #if defined(CPUARM) -#define OFS_VLCD (OFS_DATETIME + sizeof(TR_DATETIME)) + #define OFS_COUNTRYCODES (OFS_VLCD + sizeof(TR_VLCD)) +#else + #define OFS_COUNTRYCODES (OFS_VLCD) +#endif +#if defined(PXX) + #define OFS_SPARE (OFS_COUNTRYCODES + sizeof(TR_COUNTRYCODES)) +#else + #define OFS_SPARE (OFS_COUNTRYCODES) #endif -#define STR_OFFON (STR_OPEN9X + OFS_OFFON) -#define STR_MMMINV (STR_OPEN9X + OFS_MMMINV) -#define STR_NCHANNELS (STR_OPEN9X + OFS_NCHANNELS) +#define STR_OFFON (STR_OPEN9X + OFS_OFFON) +#define STR_MMMINV (STR_OPEN9X + OFS_MMMINV) +#define STR_NCHANNELS (STR_OPEN9X + OFS_NCHANNELS) #if !defined(GRAPHICS) -#define STR_VBEEPLEN (STR_OPEN9X + OFS_VBEEPLEN) +#define STR_VBEEPLEN (STR_OPEN9X + OFS_VBEEPLEN) #endif -#define STR_VBEEPMODE (STR_OPEN9X + OFS_VBEEPMODE) -#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_VBLMODE (STR_OPEN9X + OFS_VBLMODE) -#define STR_VCURVEFUNC (STR_OPEN9X + OFS_VCURVEFUNC) -#define STR_VSIDE STR_VCURVEFUNC -#define LEN_VSIDE LEN_VCURVEFUNC -#define STR_VMLTPX (STR_OPEN9X + OFS_VMLTPX) -#define STR_VMLTPX2 (STR_OPEN9X + OFS_VMLTPX2) -#define STR_VMIXTRIMS (STR_OPEN9X + OFS_VMIXTRIMS) -#define STR_VCSWFUNC (STR_OPEN9X + OFS_VCSWFUNC) -#define STR_VFSWFUNC (STR_OPEN9X + OFS_VFSWFUNC) -#define STR_VFSWRESET (STR_OPEN9X + OFS_VFSWRESET) -#define STR_FUNCSOUNDS (STR_OPEN9X + OFS_FUNCSOUNDS) -#define STR_VTELEMCHNS (STR_OPEN9X + OFS_VTELEMCHNS) +#define STR_VBEEPMODE (STR_OPEN9X + OFS_VBEEPMODE) +#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_VBLMODE (STR_OPEN9X + OFS_VBLMODE) +#define STR_VCURVEFUNC (STR_OPEN9X + OFS_VCURVEFUNC) +#define STR_VSIDE STR_VCURVEFUNC +#define LEN_VSIDE LEN_VCURVEFUNC +#define STR_VMLTPX (STR_OPEN9X + OFS_VMLTPX) +#define STR_VMLTPX2 (STR_OPEN9X + OFS_VMLTPX2) +#define STR_VMIXTRIMS (STR_OPEN9X + OFS_VMIXTRIMS) +#define STR_VCSWFUNC (STR_OPEN9X + OFS_VCSWFUNC) +#define STR_VFSWFUNC (STR_OPEN9X + OFS_VFSWFUNC) +#define STR_VFSWRESET (STR_OPEN9X + OFS_VFSWRESET) +#define STR_FUNCSOUNDS (STR_OPEN9X + OFS_FUNCSOUNDS) +#define STR_VTELEMCHNS (STR_OPEN9X + OFS_VTELEMCHNS) #if defined(FRSKY) || defined(CPUARM) -#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_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT) -#define STR_VOLTSRC (STR_OPEN9X + OFS_VOLTSRC) -#define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC) -#define STR_VSCREEN (STR_OPEN9X + OFS_VSCREEN) -#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS) +#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_GPSFORMAT (STR_OPEN9X + OFS_GPSFORMAT) +#define STR_VOLTSRC (STR_OPEN9X + OFS_VOLTSRC) +#define STR_VARIOSRC (STR_OPEN9X + OFS_VARIOSRC) +#define STR_VSCREEN (STR_OPEN9X + OFS_VSCREEN) +#define STR_TELEMCHNS (STR_OPEN9X + OFS_TELEMCHNS) #endif #ifdef TEMPLATES -#define STR_VTEMPLATES (STR_OPEN9X + OFS_VTEMPLATES) +#define STR_VTEMPLATES (STR_OPEN9X + OFS_VTEMPLATES) #endif #ifdef HELI -#define STR_VSWASHTYPE (STR_OPEN9X + OFS_VSWASHTYPE) +#define STR_VSWASHTYPE (STR_OPEN9X + OFS_VSWASHTYPE) #endif -#define STR_VKEYS (STR_OPEN9X + OFS_VKEYS) -#define STR_VSWITCHES (STR_OPEN9X + OFS_VSWITCHES) -#define STR_VSWITCHES_SHORT (STR_OPEN9X + OFS_VSWITCHES_SHORT) -#define STR_VSRCRAW (STR_OPEN9X + OFS_VSRCRAW) -#define STR_VTMRMODES (STR_OPEN9X + OFS_VTMRMODES) +#define STR_VKEYS (STR_OPEN9X + OFS_VKEYS) +#define STR_VSWITCHES (STR_OPEN9X + OFS_VSWITCHES) +#define STR_VSWITCHES_SHORT (STR_OPEN9X + OFS_VSWITCHES_SHORT) +#define STR_VSRCRAW (STR_OPEN9X + OFS_VSRCRAW) +#define STR_VTMRMODES (STR_OPEN9X + OFS_VTMRMODES) #if defined(ROTARY_ENCODERS) -#define STR_VRENAVIG (STR_OPEN9X + OFS_VRENAVIG) + #define STR_VRENAVIG (STR_OPEN9X + OFS_VRENAVIG) #endif #if defined(ROTARY_ENCODER_NAVIGATION) -#define STR_VRENCODERS (STR_OPEN9X + OFS_VRENCODERS) + #define STR_VRENCODERS (STR_OPEN9X + OFS_VRENCODERS) #endif #if defined(PCBGRUVIN9X) || defined(CPUARM) -#define STR_DATETIME (STR_OPEN9X + OFS_DATETIME) +#define STR_DATETIME (STR_OPEN9X + OFS_DATETIME) #endif #if defined(CPUARM) -#define STR_VLCD (STR_OPEN9X + OFS_VLCD) + #define STR_VLCD (STR_OPEN9X + OFS_VLCD) +#endif + +#if defined(PXX) + #define STR_COUNTRYCODES (STR_OPEN9X + OFS_COUNTRYCODES) #endif // The 0-terminated-strings diff --git a/src/translations/de.h b/src/translations/de.h index f1a81f393..2ecf5eafa 100644 --- a/src/translations/de.h +++ b/src/translations/de.h @@ -289,7 +289,7 @@ #define TR_VSWITCHES_SHORT "-012TREAG3456789" #if defined(PCBSKY9X) - #define TR_ROTARY_ENCODERS_VSRCRAW "DrG" + #define TR_ROTARY_ENCODERS_VSRCRAW "Dreh" #elif defined(PCBGRUVIN9X) && ROTARY_ENCODERS > 2 #define TR_ROTARY_ENCODERS_VSRCRAW "DGa ""DGb ""DGc ""DGd " #elif defined(PCBGRUVIN9X) && ROTARY_ENCODERS <= 2 @@ -304,7 +304,7 @@ #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "---\0""StR\0""H\203R\0""Gas\0""QuR\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS_VSRCRAW "MAX\0""3POS" TR_CYC_VSRCRAW "TrmS" "TrmH" "TrmG" "TrmQ" TR_SW_VSRCRAW +#define TR_VSRCRAW "---\0""Sei\0""H\203h\0""Gas\0""Que\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS_VSRCRAW "MAX\0" TR_CYC_VSRCRAW "TrmS" "TrmH" "TrmG" "TrmQ" TR_SW_VSRCRAW #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "AUS""ABS""GSs""GS%""GSt" @@ -314,6 +314,8 @@ #define LEN_INDENT 1 #define INDENT_WIDTH (FW/2) +#define TR_ENTER "[MENU]" + #if defined(PCBX9D) #define TR_POPUPS "[ENTER]\010[EXIT]" #else @@ -337,7 +339,7 @@ #define TR_EXPONAME "Expo Name" #define TR_BITMAP "Model Image" #define TR_TIMER "Stoppuhr" -#define TR_ELIMITS "Erw.Limit" +#define TR_ELIMITS "FrSkyMod." #define TR_ETRIMS "Erw.Trims" #define TR_TRIMINC "Trim Schr." #define TR_TTRACE "Gasquelle" @@ -580,4 +582,4 @@ #define TR_SET "SET" #define TR_FAILSAFESET "FAILSAFE SETTINGS" #define TR_RANGECHECK "R. Check" -#define TR_BIND "BIND" \ No newline at end of file +#define TR_BIND "BIND" diff --git a/src/translations/en.h b/src/translations/en.h index efc73c7aa..cdd157dab 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -68,6 +68,9 @@ #define LEN_VLCD "\006" #define TR_VLCD "NormalOptrex" +#define LEN_COUNTRYCODES TR("\002", "\007") +#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") + #define LEN_VTRIMINC TR("\006","\013") #define TR_VTRIMINC TR("Expo ""ExFine""Fine ""Medium""Coarse","Exponential""Extra Fine ""Fine ""Medium ""Coarse ") @@ -503,14 +506,14 @@ #define TR_MENUTEMPLATES "TEMPLATES" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" -#define TR_RXNUM TR("RxNum","Receiver No.") +#define TR_RXNUM TR("RxNum", INDENT"Receiver No.") #define TR_SYNCMENU "Sync "TR_ENTER #define TR_LIMIT INDENT"Limit" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD TR("GPS Coords","GPS coordinate format") -#define TR_VARIO TR("Vario","Variometer") +#define TR_GPSCOORD TR("GPS Coords", "GPS coordinate format") +#define TR_VARIO TR("Vario", "Variometer") #define TR_SHUTDOWN "SHUTTING DOWN" #define TR_BATT_CALIB "Battery Calib" #define TR_CURRENT_CALIB "Current Calib" @@ -585,4 +588,4 @@ #define TR_SET "SET" #define TR_FAILSAFESET "FAILSAFE SETTINGS" #define TR_RANGECHECK "R. Check" -#define TR_BIND "BIND" \ No newline at end of file +#define TR_BIND "BIND" diff --git a/src/x9d/trainer_driver.cpp b/src/x9d/trainer_driver.cpp index c4df12c73..7ed4ac96d 100644 --- a/src/x9d/trainer_driver.cpp +++ b/src/x9d/trainer_driver.cpp @@ -65,7 +65,7 @@ void setupTrainerPulses() rest += int32_t(g_model.ppmFrameLength) * 1000; for (uint32_t i = 0 ; i < p ; i += 1 ) { - uint32_t pulse = limit((int16_t)-PPM_range, g_chans512[i], (int16_t)PPM_range) + 2*PPM_CH_CENTER(i); + uint32_t pulse = limit((int16_t)-PPM_range, channelOutputs[i], (int16_t)PPM_range) + 2*PPM_CH_CENTER(i); rest -= pulse ; *ptr++ = pulse ; }