From 2f423f73a010e766710fd13dfe9a145fa16c1e94 Mon Sep 17 00:00:00 2001 From: bsongis Date: Mon, 20 Aug 2012 11:56:23 +0000 Subject: [PATCH] Issue 92 fixed (saves 114bytes flash) --- src/model_menus.cpp | 158 +++++++++++++++++++++++++++--------------- src/myeeprom.h | 18 ++--- src/open9x.cpp | 35 +++------- src/open9x.h | 5 -- src/translations.cpp | 1 + src/translations.h | 1 + src/translations/cz.h | 1 + src/translations/de.h | 1 + src/translations/en.h | 1 + src/translations/fr.h | 1 + src/translations/it.h | 1 + src/translations/se.h | 1 + 12 files changed, 128 insertions(+), 96 deletions(-) diff --git a/src/model_menus.cpp b/src/model_menus.cpp index c115b30cd..50f92ff02 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -828,11 +828,13 @@ void menuProcModel(uint8_t event) static uint8_t s_currIdx; #if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_CZ) -#define MIXES_2ND_COLUMN (13*FW) +#define MIXES_2ND_COLUMN (13*FW) #else -#define MIXES_2ND_COLUMN (9*FW) +#define MIXES_2ND_COLUMN (9*FW) #endif +#define EXPO_ONE_2ND_COLUMN (7*FW+2) + uint8_t editDelay(const uint8_t y, const uint8_t event, const uint8_t attr, const pm_char *str, uint8_t delay) { lcd_putsLeft(y, str); @@ -841,7 +843,36 @@ uint8_t editDelay(const uint8_t y, const uint8_t event, const uint8_t attr, cons return delay; } -#ifdef FLIGHT_PHASES +#if defined(FLIGHT_PHASES) + +#if defined(PCBARM) +#define PhasesType uint16_t +#else +#define PhasesType uint8_t +#endif + +PhasesType editPhases(uint8_t x, uint8_t y, uint8_t event, PhasesType value, uint8_t attr) +{ + for (uint8_t p=0; p EXPO_ONE_2ND_COLUMN+2*FW) + continue; +#endif + lcd_putcAtt(x, y, '0'+p, ((m_posHorz==p) && attr) ? BLINK|INVERS : ((value & (1<name), +#else +#define EXPO_ONE_ARM_ROW +#endif +#if defined(CURVES) +#define EXPO_ONE_CURVES_ROW 1, +#else +#define EXPO_ONE_CURVES_ROW +#endif +#if defined(FLIGHT_PHASES) +#define EXPO_ONE_PHASES_ROW MAX_PHASES-1, +#else +#define EXPO_ONE_PHASES_ROW +#endif + void menuProcExpoOne(uint8_t event) { ExpoData *ed = expoaddress(s_currIdx); putsChnRaw(7*FW+FW/2,0,ed->chn+1,0); - SIMPLE_SUBMENU(STR_MENUDREXPO, EXPO_FIELD_MAX); + SUBMENU(STR_MENUDREXPO, EXPO_FIELD_MAX, {EXPO_ONE_ARM_ROW 0, 0, EXPO_ONE_CURVES_ROW EXPO_ONE_PHASES_ROW 0 /*, ...*/}); int8_t sub = m_posVert; @@ -1499,58 +1546,60 @@ void menuProcExpoOne(uint8_t event) { #if defined(PCBARM) case EXPO_FIELD_NAME: - EditName(6*FW+5, y, ed->name, sizeof(ed->name), event, attr, m_posHorz); + EditName(EXPO_ONE_2ND_COLUMN-3*FW, y, ed->name, sizeof(ed->name), event, attr, m_posHorz); break; #endif - case EXPO_FIELD_WIDTH: { #if defined(PCBARM) - lcd_outdezAtt(9*FW+5, y, ed->weight, attr|INFLIGHT(ed->weight)); + lcd_outdezAtt(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->weight, attr|INFLIGHT(ed->weight)); if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, ed->weight, 0, 100, 0, STR_DRWEIGHT); #else PREPARE_INFLIGHT_BITFIELD(&ed->expo - 1); - lcd_outdezAtt(9*FW+5, y, ed->weight, attr|INFLIGHT(*bitfield)); + lcd_outdezAtt(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->weight, attr|INFLIGHT(*bitfield)); if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR_BITFIELD(event, ed->weight, 0, 100, 0, STR_DRWEIGHT, 1); #endif } break; case EXPO_FIELD_EXPO: - lcd_outdezAtt(9*FW+5, y, ed->expo, attr|INFLIGHT(ed->expo)); - if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, ed->expo, -100, 100, 0, STR_DREXPO); + if (ed->curveMode==MODE_EXPO || ed->curveParam==0) { + ed->curveMode = MODE_EXPO; + lcd_outdezAtt(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->curveParam, attr|INFLIGHT(ed->curveParam)); + if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, ed->curveParam, -100, 100, 0, STR_DREXPO); + } + else { + lcd_putsAtt(EXPO_ONE_2ND_COLUMN, y, STR_NA, attr); + } break; #ifdef CURVES case EXPO_FIELD_CURVE: - putsCurve(6*FW+5, y, ed->curve, attr); - if (attr) { - CHECK_INCDEC_MODELVAR(event, ed->curve, 0, MAX_CURVES+7-1); - if (ed->curve>=CURVE_BASE && event==EVT_KEY_FIRST(KEY_MENU)) { - s_curveChan = ed->curve - CURVE_BASE; - pushMenu(menuProcCurveOne); + if (ed->curveMode!=MODE_EXPO || ed->curveParam==0) { + putsCurve(EXPO_ONE_2ND_COLUMN, y, ed->curveParam, attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, ed->curveParam, 0, MAX_CURVES+7-1); + if (ed->curveParam) ed->curveMode = MODE_CURVE; + if (ed->curveParam>=CURVE_BASE && event==EVT_KEY_FIRST(KEY_MENU)) { + s_curveChan = ed->curveParam - CURVE_BASE; + pushMenu(menuProcCurveOne); + } } } + else { + lcd_putsAtt(EXPO_ONE_2ND_COLUMN, y, STR_NA, attr); + } break; #endif #ifdef FLIGHT_PHASES case EXPO_FIELD_FLIGHT_PHASE: - { -#if defined(PCBARM) - putsFlightPhase(6*FW+5, y, ed->phase, attr); - if (attr) { ed->phase = checkIncDecModel(event, ed->phase, -MAX_PHASES, MAX_PHASES); } -#else - int8_t phase = ed->negPhase ? -ed->phase : +ed->phase; - putsFlightPhase(6*FW+5, y, phase, attr); - if (attr) { phase = checkIncDecModel(event, phase, -MAX_PHASES, MAX_PHASES); ed->negPhase = (phase < 0); ed->phase = abs(phase); } -#endif - } + ed->phases = editPhases(EXPO_ONE_2ND_COLUMN-2*FW, y, event, ed->phases, attr); break; #endif case EXPO_FIELD_SWITCH: - putsSwitches(6*FW+5, y, ed->swtch, attr); - if (attr) CHECK_INCDEC_MODELSWITCH(event, ed->swtch, -MAX_DRSWITCH, MAX_DRSWITCH); + putsSwitches(EXPO_ONE_2ND_COLUMN, y, ed->swtch, attr); + if (attr) CHECK_INCDEC_MODELSWITCH(event, ed->swtch, -MAX_SWITCH, MAX_SWITCH); break; case EXPO_FIELD_WHEN: - lcd_putsiAtt(6*FW+5, y, STR_VWHEN, 3-ed->mode, attr); + lcd_putsiAtt(EXPO_ONE_2ND_COLUMN, y, STR_VWHEN, 3-ed->mode, attr); if (attr) ed->mode = 4 - checkIncDecModel(event, 4-ed->mode, 1, 3); break; } @@ -1596,17 +1645,29 @@ enum MixFields { MIX_FIELD_COUNT }; +#if defined(PCBARM) +#define MIX_ONE_ARM_ROW sizeof(md2->name), +#else +#define MIX_ONE_ARM_ROW +#endif +#if defined(CURVES) +#define MIX_ONE_CURVES_ROW 1, +#else +#define MIX_ONE_CURVES_ROW +#endif +#if defined(FLIGHT_PHASES) +#define MIX_ONE_PHASES_ROW MAX_PHASES-1, +#else +#define MIX_ONE_PHASES_ROW +#endif + void menuProcMixOne(uint8_t event) { TITLEP(s_currCh ? STR_INSERTMIX : STR_EDITMIX); MixData *md2 = mixaddress(s_currIdx) ; putsChn(lcdLastPos+1*FW,0,md2->destCh+1,0); -#if defined(PCBARM) - SUBMENU_NOTITLE(MIX_FIELD_COUNT, {sizeof(md2->name), 0, 0, 0, 1, 1, 0, MAX_PHASES-1, 0 /*, ...*/}); -#else - SUBMENU_NOTITLE(MIX_FIELD_COUNT, {0, 0, 0, 1, 1, 0, MAX_PHASES-1, 0 /*, ...*/}); -#endif + SUBMENU_NOTITLE(MIX_FIELD_COUNT, {MIX_ONE_ARM_ROW 0, 0, 0, 1, MIX_ONE_CURVES_ROW 0, MIX_ONE_PHASES_ROW 0 /*, ...*/}); int8_t sub = m_posVert; @@ -1655,7 +1716,6 @@ void menuProcMixOne(uint8_t event) #if defined(CURVES) case MIX_FIELD_CURVE: lcd_putsLeft(y, STR_CURVE); - if (attr) { int8_t curveParam = md2->curveParam; if (md2->curveMode==MODE_CURVE) { @@ -1701,16 +1761,7 @@ void menuProcMixOne(uint8_t event) #if defined(FLIGHT_PHASES) case MIX_FIELD_FLIGHT_PHASE: lcd_putsLeft(y, STR_FPHASE); - for (uint8_t p=0; pphases & (1<phases ^= (1<phases = editPhases(MIXES_2ND_COLUMN, y, event, md2->phases, attr); break; #endif case MIX_FIELD_WARNING: @@ -1933,9 +1984,14 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) uint8_t attr = ((s_copyMode || sub != cur) ? 0 : INVERS); if (expo) { lcd_outdezAtt(EXPO_LINE_WEIGHT_POS, y, ed->weight, attr | (isExpoActive(i) ? BOLD : 0)); - if (attr != 0) + if (attr != 0) { CHECK_INCDEC_MODELVAR(_event, ed->weight, 0, 100); - lcd_outdezAtt(EXPO_LINE_EXPO_POS, y, ed->expo, 0); + } + + if (ed->curveMode == MODE_CURVE) + putsCurve(EXPO_LINE_EXPO_POS-3*FW, y, ed->curveParam); + else + lcd_outdezAtt(EXPO_LINE_EXPO_POS, y, ed->curveParam, 0); #if defined(PCBARM) if (ed->name[0]) { @@ -1945,16 +2001,8 @@ void menuProcExpoMix(uint8_t expo, uint8_t _event_) else #endif { -#if defined(FLIGHT_PHASES) -#if defined(PCBARM) - putsFlightPhase(EXPO_LINE_PHASE_POS, y, ed->phase); -#else - putsFlightPhase(EXPO_LINE_PHASE_POS, y, ed->negPhase ? -ed->phase : +ed->phase); -#endif -#endif putsSwitches(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); // normal switches if (ed->mode!=3) lcd_putc(17*FW, y, ed->mode == 2 ? 126 : 127);//'|' : (stkVal[i] ? '<' : '>'),0);*/ - if (ed->curve) putsCurve(18*FW+2, y, ed->curve); } } else { diff --git a/src/myeeprom.h b/src/myeeprom.h index 6fbad7385..d4a7e87bc 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -174,22 +174,21 @@ PACK(typedef struct t_ExpoData { uint8_t chn; int8_t curve; // 0=no curve, 1-6=std curves, 7-10=CV1-CV4, 11-15=CV9-CV13 int8_t swtch; - int8_t phase; + uint16_t phases; int8_t weight; - int8_t expo; + uint8_t curveMode; char name[6]; - uint8_t spare[4]; + int8_t curveParam; }) ExpoData; #else PACK(typedef struct t_ExpoData { uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both + int8_t swtch:6; uint8_t chn:2; - uint8_t curve:4; // 0=no curve, 1-6=std curves, 7-14=CV1-CV8 - int8_t swtch:5; - uint8_t phase:3; // if negPhase is 0: 0=normal, 5=FP4 if negPhase is 1: 5=!FP4 - uint8_t negPhase:1; - uint8_t weight:7; - int8_t expo; + uint8_t phases:5; + uint8_t curveMode:1; + uint8_t weight; // we have one bit spare here :) + int8_t curveParam; }) ExpoData; #endif @@ -264,6 +263,7 @@ enum MixSources { #define MLTPX_REP 2 #define MODE_DIFFERENTIAL 0 +#define MODE_EXPO 0 #define MODE_CURVE 1 #if defined(PCBARM) diff --git a/src/open9x.cpp b/src/open9x.cpp index 116b69246..45c08ed4f 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -406,7 +406,6 @@ void applyExpos(int16_t *anas) int16_t anas2[NUM_STICKS]; // values before expo, to ensure same expo base when multiple expo lines are used memcpy(anas2, anas, sizeof(anas2)); - uint8_t phase = s_perout_flight_phase + 1; int8_t cur_chn = -1; #ifdef BOLD_FONT @@ -415,31 +414,11 @@ void applyExpos(int16_t *anas) for (uint8_t i=0; i=0 && ed.mode&2)) { cur_chn = ed.chn; - int16_t k = ed.expo; - v = expo(v, k); - uint8_t ed_curve = ed.curve; - if (ed_curve) v = applyCurve(v, ed_curve); + if (ed.curveParam) { + if (ed.curveMode == MODE_CURVE) + v = applyCurve(v, ed.curveParam); + else + v = expo(v, ed.curveParam); + } v = ((int32_t)v * ed.weight) / 100; anas[cur_chn] = v; } diff --git a/src/open9x.h b/src/open9x.h index 2ddd93ae8..0f31b9008 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -395,11 +395,6 @@ enum CswFunctions { #define MAX_SWITCH (MAX_PSWITCH+NUM_CSW) #define SWITCH_ON (1+MAX_SWITCH) #define SWITCH_OFF (-SWITCH_ON) -#if defined(PCBARM) -#define MAX_DRSWITCH (MAX_PSWITCH+NUM_CSW) // 15(9+6) !switches + 0 + 15 switches: 5 bits needed -#else -#define MAX_DRSWITCH (MAX_PSWITCH+NUM_CSW/2) // 15(9+6) !switches + 0 + 15 switches: 5 bits needed -#endif #define NUM_STICKS 4 #define NUM_POTS 3 diff --git a/src/translations.cpp b/src/translations.cpp index 2ae322648..975c5c5e0 100644 --- a/src/translations.cpp +++ b/src/translations.cpp @@ -352,6 +352,7 @@ const pm_char STR_DELETE_FILE[] PROGMEM = TR_DELETE_FILE; const pm_char STR_COPY_FILE[] PROGMEM = TR_COPY_FILE; const pm_char STR_RENAME_FILE[] PROGMEM = TR_RENAME_FILE; const pm_char STR_REMOVED[] PROGMEM = TR_REMOVED; +const pm_char STR_NA[] PROGMEM = TR_NA; const pm_uchar font[] PROGMEM = { #include "font.lbm" diff --git a/src/translations.h b/src/translations.h index e0f613447..7af946694 100644 --- a/src/translations.h +++ b/src/translations.h @@ -434,6 +434,7 @@ extern const pm_char STR_DELETE_FILE[]; extern const pm_char STR_COPY_FILE[]; extern const pm_char STR_RENAME_FILE[]; extern const pm_char STR_REMOVED[]; +extern const pm_char STR_NA[]; #if defined(VOICE) diff --git a/src/translations/cz.h b/src/translations/cz.h index 68117aa2c..3b75d960b 100644 --- a/src/translations/cz.h +++ b/src/translations/cz.h @@ -437,3 +437,4 @@ #define TR_COPY_FILE "Kop\204rovat" #define TR_RENAME_FILE "P\206ejmenovat" #define TR_REMOVED " odstran\203n" +#define TR_NA "N/A" diff --git a/src/translations/de.h b/src/translations/de.h index 6e9408213..ef1649d2d 100644 --- a/src/translations/de.h +++ b/src/translations/de.h @@ -437,3 +437,4 @@ #define TR_COPY_FILE "Copy" #define TR_RENAME_FILE "Rename" #define TR_REMOVED " removed" +#define TR_NA "N/A" diff --git a/src/translations/en.h b/src/translations/en.h index 745f29c4d..60364ccf4 100644 --- a/src/translations/en.h +++ b/src/translations/en.h @@ -438,3 +438,4 @@ #define TR_COPY_FILE "Copy" #define TR_RENAME_FILE "Rename" #define TR_REMOVED " removed" +#define TR_NA "N/A" diff --git a/src/translations/fr.h b/src/translations/fr.h index 99fadc8cc..681974d2e 100644 --- a/src/translations/fr.h +++ b/src/translations/fr.h @@ -436,3 +436,4 @@ #define TR_COPY_FILE "Copier" #define TR_RENAME_FILE "Renommer" #define TR_REMOVED " supprim\200" +#define TR_NA "N/A" diff --git a/src/translations/it.h b/src/translations/it.h index 726f57eb0..d8a53eef4 100644 --- a/src/translations/it.h +++ b/src/translations/it.h @@ -437,3 +437,4 @@ #define TR_COPY_FILE "Copia" #define TR_RENAME_FILE "Rinomomina" #define TR_REMOVED " rimosso" +#define TR_NA "N/A" diff --git a/src/translations/se.h b/src/translations/se.h index 8385ceed9..b60592e20 100644 --- a/src/translations/se.h +++ b/src/translations/se.h @@ -435,3 +435,4 @@ #define TR_COPY_FILE "Copy" #define TR_RENAME_FILE "Rename" #define TR_REMOVED " removed" +#define TR_NA "N/A"