From 45bdef6b3acac74f116d1a2e0355ef178fb608d8 Mon Sep 17 00:00:00 2001 From: bsongis Date: Tue, 15 May 2012 21:00:57 +0000 Subject: [PATCH] TrmR / TrmE / TrmT / TrmA sources added to mixers and custom switches The choice for Trim in mixers will be: OFF / ON / Rud / Ele / Thr / Ail EEPROM formatted on ARM when invalid EEPROM No EEPROM format when ARM board USB powered --- src/board_ersky9x.cpp | 4 ++ src/eeprom_arm.cpp | 10 +++- src/lcd.cpp | 20 ++++---- src/main_views.cpp | 2 +- src/model_menus.cpp | 25 ++++----- src/myeeprom.h | 23 ++++++--- src/open9x.cpp | 114 +++++++++++++++++------------------------- src/open9x.h | 11 ++-- src/simpgmspace.h | 1 + src/translations/cz.h | 6 +-- src/translations/en.h | 6 +-- src/translations/fr.h | 6 +-- src/translations/it.h | 6 +-- src/translations/se.h | 6 +-- 14 files changed, 116 insertions(+), 124 deletions(-) diff --git a/src/board_ersky9x.cpp b/src/board_ersky9x.cpp index f2cfa93a6..2fb23128f 100644 --- a/src/board_ersky9x.cpp +++ b/src/board_ersky9x.cpp @@ -72,6 +72,10 @@ inline void init_soft_power() uint32_t check_soft_power() { +#ifdef SIMU + return e_power_on; +#endif + if ( PIOC->PIO_PDSR & 0x02000000 ) { return e_power_usb ; // Detected USB diff --git a/src/eeprom_arm.cpp b/src/eeprom_arm.cpp index 06c196f6d..da11048ef 100644 --- a/src/eeprom_arm.cpp +++ b/src/eeprom_arm.cpp @@ -529,8 +529,14 @@ void eeReadAll() modelDefault(0); - STORE_GENERALVARS; - STORE_MODELVARS; + if (check_soft_power() < e_power_usb) { // Usb on or power off + /* we remove all models */ + for (uint32_t i=0; i 0 && idx <= NUM_CHNOUT) - putsChnRaw(x, y, idx+(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+2+3+NUM_PPM), att); + putsChnRaw(x, y, idx+(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+2+NUM_CYC+NUM_PPM), att); } void putsMixerSource(uint8_t x, uint8_t y, uint8_t idx, uint8_t att) { - if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+2) + if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+2) putsChnRaw(x, y, idx, att); - else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+2+MAX_SWITCH) - putsSwitches(x, y, idx-NUM_STICKS-NUM_POTS-NUM_ROTARY_ENCODERS-2, att); + else if (idx<=NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+2+MAX_SWITCH) + putsSwitches(x, y, idx-NUM_STICKS-NUM_POTS-NUM_ROTARY_ENCODERS-NUM_STICKS-2, att); else putsChnRaw(x, y, idx-MAX_SWITCH, att); } diff --git a/src/main_views.cpp b/src/main_views.cpp index 23e3e75a1..fe2e4c7b7 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -189,7 +189,7 @@ void menuMainView(uint8_t event) } { - uint8_t phase = getFlightPhase(); + uint8_t phase = s_perout_flight_phase; lcd_putsnAtt(6*FW, 2*FH, g_model.phaseData[phase].name, sizeof(g_model.phaseData[phase].name), ZCHAR); uint8_t att = (g_vbat100mV < g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | DBLSIZE; diff --git a/src/model_menus.cpp b/src/model_menus.cpp index b6f7116b0..6f5e228e4 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -706,7 +706,7 @@ void menuProcModel(uint8_t event) if (m_posHorz > 1) m_posHorz = 1; int8_t x = limit((int8_t)0, (int8_t)g_model.ppmNCH, (int8_t)2); g_model.ppmNCH = x; - lcd_putsiAtt(MODEL_PARAM_OFS+7*FW, y, STR_DSM2MODE, x, (attr && m_posHorz==1) ? blink : 0); + lcd_putsiAtt(MODEL_PARAM_OFS+5*FW, y, STR_DSM2MODE, x, (attr && m_posHorz==1) ? blink : 0); } #endif else if (attr) { @@ -755,16 +755,14 @@ void menuProcModel(uint8_t event) // TODO port PPM16 ppmDelay from er9x #if defined(DSM2) || defined(PXX) else if (IS_DSM2_PROTOCOL(protocol) || IS_PXX_PROTOCOL(protocol)) { - lcd_putsLeft( y, STR_RXNUM); + if (attr && m_posHorz > 0 && IS_DSM2_PROTOCOL(protocol)) + m_posHorz = 0; + + lcd_putsLeft(y, STR_RXNUM); lcd_outdezNAtt(MODEL_PARAM_OFS-(IS_DSM2_PROTOCOL(protocol) ? 0 : 3*FW), y, g_model.modelId, ((attr && m_posHorz==0) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0) | LEADING0|LEFT, 2); - if (attr && (s_editMode>0 || p1valdiff)) { - switch (m_posHorz) { - case 0: - CHECK_INCDEC_MODELVAR(event, g_model.modelId, 0, 99); - break; - } - } + if (attr && (IS_DSM2_PROTOCOL(protocol) || (m_posHorz==0 && (s_editMode>0 || p1valdiff)))) + CHECK_INCDEC_MODELVAR(event, g_model.modelId, 0, 99); #if defined(PXX) if (protocol == PROTO_PXX) { @@ -940,7 +938,7 @@ void menuProcPhasesAll(uint8_t event) att = (sub==MAX_PHASES && !trimsCheckTimer) ? INVERS : 0; lcd_putsAtt(0, 7*FH, STR_CHECKTRIMS, att); - putsFlightPhase(6*FW, 7*FH, getFlightPhase()+1, att); + putsFlightPhase(6*FW, 7*FH, s_perout_flight_phase+1, att); } #endif @@ -1474,8 +1472,8 @@ void menuProcMixOne(uint8_t event) break; case MIX_FIELD_TRIM: lcd_puts(2*FW, y, STR_TRIM); - lcd_putsiAtt(FW*10, y, STR_VMIXTRIMS, (md2->srcRaw <= 4) ? md2->carryTrim : 1, attr); - if (attr) CHECK_INCDEC_MODELVAR( event, md2->carryTrim, TRIM_ON, TRIM_OFFSET); + lcd_putsiAtt(FW*10, y, STR_VMIXTRIMS, 1-md2->carryTrim, attr); + if (attr) md2->carryTrim = -checkIncDecModel(event, -(int8_t)md2->carryTrim, -TRIM_OFF, -TRIM_AIL); break; case MIX_FIELD_CURVE: lcd_puts(2*FW, y, STR_CURVES); @@ -1733,7 +1731,7 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) putsFlightPhase(10*FW+4, y, ed->negPhase ? -ed->phase : +ed->phase); #else putsFlightPhase(10*FW, y, ed->negPhase ? -ed->phase : +ed->phase); -#endif +#endif #endif #endif putsSwitches(13*FW+4, y, ed->swtch, 0); // normal switches @@ -2457,7 +2455,6 @@ void menuProcTelemetry(uint8_t event) #endif #ifdef TEMPLATES -// TODO s_noHi needed? void menuProcTemplates(uint8_t _event) { uint8_t event = (s_warning ? 0 : _event); diff --git a/src/myeeprom.h b/src/myeeprom.h index 989c29a25..e084566b7 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -49,11 +49,11 @@ #define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 ) #if defined(PCBARM) -#define EEPROM_VER 208 +#define EEPROM_VER 209 #elif defined(PCBV4) -#define EEPROM_VER 208 +#define EEPROM_VER 209 #else -#define EEPROM_VER 208 +#define EEPROM_VER 209 #endif #ifndef PACK @@ -196,6 +196,10 @@ enum MixSources { MIXSRC_REe, #endif #endif + MIXSRC_TrimRud, + MIXSRC_TrimEle, + MIXSRC_TrimThr, + MIXSRC_TrimAil, MIXSRC_MAX , MIXSRC_3POS, MIXSRC_THR, @@ -224,9 +228,12 @@ enum MixSources { MIXSRC_CH16 = MIXSRC_CH11 + 5 }; -#define TRIM_ON 0 #define TRIM_OFF 1 -#define TRIM_OFFSET 2 +#define TRIM_ON 0 +#define TRIM_RUD -1 +#define TRIM_ELE -2 +#define TRIM_THR -3 +#define TRIM_AIL -4 #define MLTPX_ADD 0 #define MLTPX_MUL 1 @@ -247,7 +254,7 @@ PACK(typedef struct t_MixData { uint8_t speedDown; // 0 nichts uint8_t srcRaw; // int8_t differential; - uint8_t carryTrim; + int8_t carryTrim; int8_t sOffset; }) MixData; #else @@ -263,9 +270,9 @@ PACK(typedef struct t_MixData { uint8_t delayDown:4; uint8_t speedUp:4; // Servogeschwindigkeit aus Tabelle (10ms Cycle) uint8_t speedDown:4; // 0 nichts - uint16_t srcRaw:7; // + uint16_t srcRaw:6; // int16_t differential:7; - uint16_t carryTrim:2; + int16_t carryTrim:3; int8_t sOffset; }) MixData; #endif diff --git a/src/open9x.cpp b/src/open9x.cpp index 24294cc66..15f4621e1 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -315,15 +315,12 @@ int16_t Expo::expo(int16_t x) #endif -void applyExpos(int16_t *anas, uint8_t phase) +void applyExpos(int16_t *anas) { static int16_t anas2[NUM_STICKS]; // values before expo, to ensure same expo base when multiple expo lines are used memcpy(anas2, anas, sizeof(anas2)); - if (phase == 255) - phase = getFlightPhase(); - phase++; - + uint8_t phase = s_perout_flight_phase + 1; int8_t cur_chn = -1; for (uint8_t i=0; itrim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03); + return (((int16_t)p->trim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03); #else - result = p->trim[idx]; + return p->trim[idx]; #endif - } - return result; } int16_t getTrimValue(uint8_t phase, uint8_t idx) @@ -667,18 +658,13 @@ int16_t getTrimValue(uint8_t phase, uint8_t idx) void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim) { - if (s_trimPtr[idx]) { - *s_trimPtr[idx] = limit((int16_t)-125, trim, (int16_t)+125); - } - else { - PhaseData *p = phaseaddress(phase); + PhaseData *p = phaseaddress(phase); #if defined(PCBSTD) - p->trim[idx] = (int8_t)(trim >> 2); - p->trim_ext = (p->trim_ext & ~(0x03 << (2*idx))) + (((trim & 0x03) << (2*idx))); + p->trim[idx] = (int8_t)(trim >> 2); + p->trim_ext = (p->trim_ext & ~(0x03 << (2*idx))) + (((trim & 0x03) << (2*idx))); #else - p->trim[idx] = trim; + p->trim[idx] = trim; #endif - } STORE_MODELVARS; } @@ -696,11 +682,9 @@ uint8_t getTrimFlightPhase(uint8_t phase, uint8_t idx) } #if defined(PCBV4) -uint8_t s_perOut_flight_phase; - uint8_t getRotaryEncoderFlightPhase(uint8_t idx) { - uint8_t phase = s_perOut_flight_phase; + uint8_t phase = s_perout_flight_phase; for (uint8_t i=0; irotaryEncoders[idx]; @@ -928,7 +912,8 @@ void alert(const pm_char * s) sleep(1/*ms*/); #endif - if (check_soft_power() > e_power_trainer) return; // Usb on or power off + + if (check_soft_power() >= e_power_usb) return; // Usb on or power off if (keyDown()) return; // wait for key release @@ -954,8 +939,6 @@ void message(const pm_char *title, const pm_char *s, const pm_char *t, const cha clearKeyEvents(); } -int8_t *s_trimPtr[NUM_STICKS] = { NULL, NULL, NULL, NULL }; - uint8_t checkTrim(uint8_t event) { int8_t k = (event & EVT_KEY_MASK) - TRM_BASE; @@ -964,7 +947,7 @@ uint8_t checkTrim(uint8_t event) if (k>=0 && k<8) { // && (event & _MSK_KEY_REPT)) //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(getFlightPhase(), idx); + uint8_t phase = getTrimFlightPhase(s_perout_flight_phase, idx); int16_t before = getRawTrimValue(phase, idx); int8_t v = (s==0) ? min(32, abs(before)/4+1) : 1 << (s-1); // 1=>1 2=>2 3=>4 4=>8 bool thro = (idx==THR_STICK && g_model.thrTrim); @@ -1295,8 +1278,9 @@ int32_t act [MAX_MIXERS] = {0}; uint8_t swOn [MAX_MIXERS] = {0}; uint8_t mixWarning; -FORCEINLINE void evalTrims(uint8_t phase) +FORCEINLINE void evalTrims() { + uint8_t phase = s_perout_flight_phase; for (uint8_t i=0; i throttle trim if applicable // TODO avoid int32_t vv @@ -1325,7 +1309,7 @@ enum PerOutMode { uint8_t s_perout_mode = e_perout_mode_normal; -BeepANACenter evalSticks(uint8_t phase) +BeepANACenter evalSticks() { BeepANACenter anaCenter = 0; @@ -1399,10 +1383,10 @@ BeepANACenter evalSticks(uint8_t phase) } /* EXPOs */ - applyExpos(anas, phase); + applyExpos(anas); /* TRIMs */ - evalTrims(phase); + evalTrims(); return anaCenter; } @@ -1525,13 +1509,10 @@ void evalFunctions() } } -void perOut(uint8_t phase) +uint8_t s_perout_flight_phase; +void perOut() { -#if defined(PCBV4) - s_perOut_flight_phase = phase; -#endif - - BeepANACenter anaCenter = evalSticks(phase); + BeepANACenter anaCenter = evalSticks(); if (s_perout_mode == e_perout_mode_normal) { //===========BEEP CENTER================ @@ -1603,17 +1584,13 @@ void perOut(uint8_t phase) } } #endif - - s_trimPtr[0] = NULL; - s_trimPtr[1] = NULL; - s_trimPtr[2] = NULL; - s_trimPtr[3] = NULL; } memset(chans, 0, sizeof(chans)); // All outputs to 0 //========== MIXER LOOP =============== uint8_t lv_mixWarning = 0; + uint8_t phase = s_perout_flight_phase + 1; for (uint8_t i=0; iphase != 0) { if (md->phase > 0) { - if (phase+1 != md->phase) + if (phase != md->phase) continue; } else { - if (phase+1 == -md->phase) + if (phase == -md->phase) continue; } } @@ -1741,15 +1718,16 @@ void perOut(uint8_t phase) v = applyCurve(v, md->curve); //========== TRIMS =============== - if (k < NUM_STICKS) { - if (s_perout_mode < e_perout_mode_zeros && md->carryTrim == TRIM_ON) { - v += trims[k]; - } - if (s_perout_mode == e_perout_mode_normal && md->carryTrim == TRIM_OFFSET) { - v = md->sOffset; - v = calc1000toRESX(v << 3); - s_trimPtr[k] = &md->sOffset; // use the value stored here for the trim - } + if (s_perout_mode < e_perout_mode_zeros) { + int8_t mix_trim = md->carryTrim; + if (mix_trim < TRIM_ON) + mix_trim = -mix_trim-1; + else if (mix_trim == TRIM_ON && k < NUM_STICKS) + mix_trim = k; + else + mix_trim = -1; + if (mix_trim >= 0) + v += trims[mix_trim]; } //========== MULTIPLEX =============== @@ -1831,17 +1809,20 @@ void perMain() weight = 0; for (uint8_t p=0; pofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " @@ -204,7 +204,7 @@ #else #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "Smer""Vysk""Plyn""Krid""Pot1""Pot2""Pot3" TR_ROTARY_ENCODERS_VSRCRAW "MAX ""3POS" TR_CYC_VSRCRAW +#define TR_VSRCRAW "Smer""Vysk""Plyn""Krid""Pot1""Pot2""Pot3" TR_ROTARY_ENCODERS_VSRCRAW "TrmR" "TrmE" "TrmT" "TrmA" "MAX ""3POS" TR_CYC_VSRCRAW #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "VYP""ABS""THs""TH%""THt" diff --git a/src/translations/en.h b/src/translations/en.h index 75a504e7c..f4fa412b9 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -82,8 +82,8 @@ #define LEN_VMLTPX2 "\002" #define TR_VMLTPX2 "+=""*="":=" -#define LEN_VMIXTRIMS "\006" -#define TR_VMIXTRIMS "ON ""OFF ""Offset" +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON ""Rud""Ele""Thr""Ail" #define LEN_VCSWFUNC "\007" #define TR_VCSWFUNC "----\0 ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " @@ -204,7 +204,7 @@ #else #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "Rud ""Ele ""Thr ""Ail ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "MAX ""3POS" TR_CYC_VSRCRAW +#define TR_VSRCRAW "Rud ""Ele ""Thr ""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" diff --git a/src/translations/fr.h b/src/translations/fr.h index 3277a4022..580a4030c 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -82,8 +82,8 @@ #define LEN_VMLTPX2 "\002" #define TR_VMLTPX2 "+=""*="":=" -#define LEN_VMIXTRIMS "\006" -#define TR_VMIXTRIMS "ON ""OFF ""Offset" +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON ""Dir""Prf""Gaz""Ail" #define LEN_VCSWFUNC "\007" #define TR_VCSWFUNC "----\0 ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " @@ -207,7 +207,7 @@ #else #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "Dir ""Prf ""Gaz ""Ail ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "MAX ""3POS" TR_CYC_VSRCRAW +#define TR_VSRCRAW "Dir ""Prf ""Gaz ""Ail ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "TrmD" "TrmP" "TrmG" "TrmA" "MAX ""3POS" TR_CYC_VSRCRAW #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""GZs""GZ%""GZt" diff --git a/src/translations/it.h b/src/translations/it.h index 438e04522..20adafc6e 100644 --- a/src/translations/it.h +++ b/src/translations/it.h @@ -82,8 +82,8 @@ #define LEN_VMLTPX2 "\002" #define TR_VMLTPX2 "+=""*="":=" -#define LEN_VMIXTRIMS "\006" -#define TR_VMIXTRIMS "ON ""OFF ""Offset" +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON ""Rud""Ele""Thr""Ail" #define LEN_VCSWFUNC "\007" #define TR_VCSWFUNC "----\0 ""v>ofs ""vofs""|v|v2 ""v1=v2 ""v1<=v2 " @@ -204,7 +204,7 @@ #else #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "Rud ""Ele ""Thr ""Ail ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "MAX ""3POS" TR_CYC_VSRCRAW +#define TR_VSRCRAW "Rud ""Ele ""Thr ""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" diff --git a/src/translations/se.h b/src/translations/se.h index 1de309015..47379c657 100644 --- a/src/translations/se.h +++ b/src/translations/se.h @@ -82,8 +82,8 @@ #define LEN_VMLTPX2 "\002" #define TR_VMLTPX2 "+=""*="":=" -#define LEN_VMIXTRIMS "\006" -#define TR_VMIXTRIMS "P\203 ""AV ""Offset" +#define LEN_VMIXTRIMS "\003" +#define TR_VMIXTRIMS "OFF""ON ""Rud""Ele""Thr""Ail" #define LEN_VCSWFUNC "\007" #define TR_VCSWFUNC "----\0 ""v>ofs ""vofs""(v)v2 ""v1=v2 ""v1<=v2 " @@ -207,7 +207,7 @@ #else #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "ROD ""H\205J ""GAS ""SKE ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "MAX ""FULL" TR_CYC_VSRCRAW +#define TR_VSRCRAW "ROD ""H\205J ""GAS ""SKE ""P1 ""P2 ""P3 " TR_ROTARY_ENCODERS_VSRCRAW "TrmR" "TrmE" "TrmT" "TrmA" "MAX ""3POS" TR_CYC_VSRCRAW #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "AV ""ABS""THs""TH%""THt"