From 28b62a0f80ca20cacf22936f63f6d4c0a0a2d90b Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 20 Feb 2013 19:49:26 +0000 Subject: [PATCH] [X9D] Flight Phases screen reworked --- src/audio_arm.h | 2 +- src/beeper.h | 2 +- src/model_menus.cpp | 233 ++++++++++++++++++++++++++------------------ src/myeeprom.h | 100 ++++++++++--------- 4 files changed, 194 insertions(+), 143 deletions(-) diff --git a/src/audio_arm.h b/src/audio_arm.h index 29dd2b6c0..794bd62c5 100644 --- a/src/audio_arm.h +++ b/src/audio_arm.h @@ -155,7 +155,7 @@ void audioEvent(uint8_t e, uint8_t f=BEEP_DEFAULT_FREQ); #if defined(VOICE) #define AUDIO_ERROR_MESSAGE(e) audioEvent(e) - #define AUDIO_TIMER_MINUTE(t) playDuration(t) + #define AUDIO_TIMER_MINUTE(t) playDuration(t, 0) #else #define AUDIO_ERROR_MESSAGE(e) audioEvent(AU_ERROR) #define AUDIO_TIMER_MINUTE(t) audioDefevent(AU_WARNING1) diff --git a/src/beeper.h b/src/beeper.h index 8c9288a41..05e0d8f00 100644 --- a/src/beeper.h +++ b/src/beeper.h @@ -70,7 +70,7 @@ extern void beep(uint8_t val); #define AUDIO_TX_BATTERY_LOW() beep(4) #define AUDIO_ERROR() beep(4) #define AUDIO_ERROR_MESSAGE(e) beep(4) -#define AUDIO_TIMER_MINUTE() beep(2) +#define AUDIO_TIMER_MINUTE(t) beep(2) #define AUDIO_TIMER_30() { beepAgain=2; beep(2); } #define AUDIO_TIMER_20() { beepAgain=1; beep(2); } #define AUDIO_TIMER_10() beep(2) diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 868739d41..f8f80485a 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -600,7 +600,7 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, uin static uint8_t cursorPos = 0; #endif - lcd_putsnAtt(x, y, name, size, ZCHAR | (active ? ((s_editMode>0) ? 0 : INVERS) : 0)); + lcd_putsnAtt(x, y, name, size, ZCHAR | ((active && s_editMode <= 0) ? INVERS : 0)); if (active) { uint8_t cur = cursorPos; @@ -1150,95 +1150,134 @@ enum PhasesItems { ITEM_PHASES_LAST = ITEM_PHASES_COUNT-1 }; +void editPhaseTrims(uint8_t x, uint8_t y, uint8_t phase, uint8_t event, uint8_t active) +{ + static uint8_t cursorPos = 0; + + for (uint8_t t=0; t 0) { + if (p1valdiff || IS_ROTARY_RIGHT(event) || IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) + || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP)) { + int16_t v = getRawTrimValue(phase, cur); + if (v < TRIM_EXTENDED_MAX) v = TRIM_EXTENDED_MAX; + v = checkIncDec(event, v, TRIM_EXTENDED_MAX, TRIM_EXTENDED_MAX+MAX_PHASES-1, EE_MODEL); + if (checkIncDec_Ret) { + if (v == TRIM_EXTENDED_MAX) v = 0; + setTrimValue(phase, cur, v); + } + } + + switch (event) { +#if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBX9D) + case EVT_ROTARY_BREAK: + if (s_editMode == EDIT_MODIFY_FIELD) { + s_editMode = EDIT_MODIFY_STRING; + cur = 0; + } + else if (cur0) cur--; + break; + case EVT_KEY_BREAK(KEY_RIGHT): + if (cur= 0 && sub < MAX_PHASES) { - s_currIdx = sub; - pushMenu(menuModelPhaseOne); - } - break; - } - - uint8_t att; - for (uint8_t i=0; i(LCD_LINES-1)*FH+1) continue; -#else + for (uint8_t i=0; i 2 - putsFlightPhase(0, y, i+1, att|CONDENSED|(getFlightPhase()==i ? BOLD : 0)); -#else - putsFlightPhase(0, y, i+1, att|(getFlightPhase()==i ? BOLD : 0)); -#endif -#if defined(ROTARY_ENCODERS) -#if ROTARY_ENCODERS > 2 -#define NAME_OFS (-4-12) -#define SWITCH_OFS (-FW/2-2-13) -#define TRIMS_OFS (-FW/2-4-15) -#define ROTARY_ENC_OFS (0) -#else -#define NAME_OFS (-4) -#define SWITCH_OFS (-FW/2-2) -#define TRIMS_OFS (-FW/2-4) -#define ROTARY_ENC_OFS (2) -#endif -#else -#define NAME_OFS 0 -#define SWITCH_OFS (FW/2) -#define TRIMS_OFS (FW/2) -#endif - lcd_putsnAtt(4*FW+NAME_OFS, y, p->name, sizeof(p->name), ZCHAR); - if (i == 0) { - lcd_puts((5+LEN_FP_NAME)*FW+SWITCH_OFS, y, STR_DEFAULT); - } - else { - putsSwitches((5+LEN_FP_NAME)*FW+SWITCH_OFS, y, p->swtch, 0); - for (uint8_t t=0; t 0) { posHorz += 2; } + uint8_t attr = ((sub==k && posHorz==j) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); + uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ; + switch(j) + { + case ITEM_PHASES_NAME: + editName(4*FW, y, p->name, sizeof(p->name), event, attr); + break; + + case ITEM_PHASES_SWITCH: + if (i == 0) { + lcd_puts((5+LEN_FP_NAME)*FW+FW/2, y, STR_DEFAULT); + } + else { + putsSwitches((5+LEN_FP_NAME)*FW+FW/2, y, p->swtch, attr); + if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, -MAX_SWITCH, MAX_SWITCH); + } + break; + + case ITEM_PHASES_TRIMS: + if (i != 0) { + editPhaseTrims((10+LEN_FP_NAME)*FW+FW/2, y, i, event, attr); + } + break; + + case ITEM_PHASES_FADE_IN: + lcd_outdezAtt(29*FW, y, (10/DELAY_STEP)*p->fadeIn, attr|PREC1); + if (active) p->fadeIn = checkIncDec(event, p->fadeIn, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS); + break; + + case ITEM_PHASES_FADE_OUT: + lcd_outdezAtt(34*FW, y, (10/DELAY_STEP)*p->fadeOut, attr|PREC1); + if (active) p->fadeOut = checkIncDec(event, p->fadeOut, 0, DELAY_MAX, EE_MODEL|NO_INCDEC_MARKS); + break; + } -#if defined(PCBGRUVIN9X) - for (uint8_t t=0; tfadeIn || p->fadeOut) { - lcd_outdezAtt(24*FW, y, (10/SLOW_STEP)*p->fadeIn, PREC1|LEFT); - lcd_putc(lcdLastPos, y, '/'); - lcd_outdezAtt(lcdLastPos+FW, y, (10/SLOW_STEP)*p->fadeOut, PREC1|LEFT); - } - } - - if (s_pgOfs != MAX_PHASES-(LCD_LINES-2)) return; - - lcd_putsLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS); - putsFlightPhase(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_perout_flight_phase+1); - if (sub==MAX_PHASES && !trimsCheckTimer) { - lcd_status_line(); } } -#else +#else // LCD_W >= 212 enum menuModelPhaseItems { ITEM_MODEL_PHASE_NAME, @@ -1400,6 +1439,24 @@ void menuModelPhaseOne(uint8_t event) } } +#if defined(ROTARY_ENCODERS) + #if ROTARY_ENCODERS > 2 + #define NAME_OFS (-4-12) + #define SWITCH_OFS (-FW/2-2-13) + #define TRIMS_OFS (-FW/2-4-15) + #define ROTARY_ENC_OFS (0) + #else + #define NAME_OFS (-4) + #define SWITCH_OFS (-FW/2-2) + #define TRIMS_OFS (-FW/2-4) + #define ROTARY_ENC_OFS (2) + #endif +#else + #define NAME_OFS 0 + #define SWITCH_OFS (FW/2) + #define TRIMS_OFS (FW/2) +#endif + void menuModelPhasesAll(uint8_t event) { SIMPLE_MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_PhasesAll, 1+MAX_PHASES+1); @@ -1414,9 +1471,7 @@ void menuModelPhasesAll(uint8_t event) trimsCheckTimer = 200; // 2 seconds } // no break -#if !defined(PCBX9D) case EVT_KEY_FIRST(KEY_RIGHT): -#endif if (sub >= 0 && sub < MAX_PHASES) { s_currIdx = sub; pushMenu(menuModelPhaseOne); @@ -1439,23 +1494,7 @@ void menuModelPhasesAll(uint8_t event) #else putsFlightPhase(0, y, i+1, att|(getFlightPhase()==i ? BOLD : 0)); #endif -#if defined(ROTARY_ENCODERS) -#if ROTARY_ENCODERS > 2 -#define NAME_OFS (-4-12) -#define SWITCH_OFS (-FW/2-2-13) -#define TRIMS_OFS (-FW/2-4-15) -#define ROTARY_ENC_OFS (0) -#else -#define NAME_OFS (-4) -#define SWITCH_OFS (-FW/2-2) -#define TRIMS_OFS (-FW/2-4) -#define ROTARY_ENC_OFS (2) -#endif -#else -#define NAME_OFS 0 -#define SWITCH_OFS (FW/2) -#define TRIMS_OFS (FW/2) -#endif + lcd_putsnAtt(4*FW+NAME_OFS, y, p->name, sizeof(p->name), ZCHAR); if (i == 0) { lcd_puts((5+LEN_FP_NAME)*FW+SWITCH_OFS, y, STR_DEFAULT); @@ -1492,7 +1531,7 @@ void menuModelPhasesAll(uint8_t event) #endif // defined(FLIGHT_PHASES) -#ifdef HELI +#if defined(HELI) enum menuModelHeliItems { ITEM_HELI_SWASHTYPE, diff --git a/src/myeeprom.h b/src/myeeprom.h index 32d018511..196810f01 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -271,6 +271,7 @@ PACK(typedef struct t_MixData { uint8_t noExpo:1; int8_t carryTrim:3; uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := + uint8_t spare:1; int16_t weight; int8_t swtch; int8_t curveParam; @@ -329,10 +330,10 @@ PACK(typedef struct t_MixData { PACK(typedef struct t_CustomSwData { // Custom Switches data int8_t v1; //input int8_t v2; //offset - uint8_t func:5; - uint8_t andsw:3; // TODO 8bits for next EEPROM + uint8_t func; uint8_t delay; uint8_t duration; + uint8_t andsw; }) CustomSwData; #else PACK(typedef struct t_CustomSwData { // Custom Switches data @@ -404,7 +405,6 @@ PACK(typedef struct t_CustomFnData { // Function Switches data uint8_t func; char param[6]; uint8_t active; - uint8_t spare; }) CustomFnData; #define CFN_PARAM(p) (*((uint32_t*)(p)->param)) #define CFN_RESET_PARAM(p) memset(p->param, 0, sizeof(p->param)) @@ -665,25 +665,36 @@ typedef char gvar_name_t[6]; #endif #if defined(CPUM64) && 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] + #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(CPUM64) -#define MAX_GVARS 0 -#define MODEL_GVARS_DATA -#define PHASE_GVARS_DATA + #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] + #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 gvar_name_t gvarsNames[5]; -#define PHASE_GVARS_DATA gvar_t gvars[5] + #define MAX_GVARS 0 + #define MODEL_GVARS_DATA gvar_name_t gvarsNames[5]; + #define PHASE_GVARS_DATA gvar_t gvars[5] #endif +#if defined(CPUARM) +PACK(typedef struct t_PhaseData { + TRIM_ARRAY; + int8_t swtch; // swtch of phase[0] is not used + char name[LEN_FP_NAME]; + uint8_t fadeIn; + uint8_t fadeOut; + ROTARY_ENCODER_ARRAY; + PHASE_GVARS_DATA; +}) PhaseData; +#else PACK(typedef struct t_PhaseData { TRIM_ARRAY; int8_t swtch; // swtch of phase[0] is not used @@ -693,43 +704,44 @@ PACK(typedef struct t_PhaseData { ROTARY_ENCODER_ARRAY; PHASE_GVARS_DATA; }) PhaseData; +#endif #if defined(CPUARM) -#define MAX_MODELS 60 -#define NUM_CHNOUT 32 // number of real output channels CH1-CH32 -#define MAX_PHASES 9 -#define MAX_MIXERS 64 -#define MAX_EXPOS 32 -#define NUM_CSW 32 // number of custom switches -#define NUM_CFN 32 // number of functions assigned to switches + #define MAX_MODELS 60 + #define NUM_CHNOUT 32 // number of real output channels CH1-CH32 + #define MAX_PHASES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 32 + #define NUM_CSW 32 // number of custom switches + #define NUM_CFN 32 // number of functions assigned to switches #elif defined(PCBGRUVIN9X) || defined(CPUM128) -#define MAX_MODELS 30 -#define NUM_CHNOUT 16 // number of real output channels CH1-CH16 -#define MAX_PHASES 5 -#define MAX_MIXERS 32 -#define MAX_EXPOS 14 -#define NUM_CSW 12 // number of custom switches -#define NUM_CFN 16 // number of functions assigned to switches + #define MAX_MODELS 30 + #define NUM_CHNOUT 16 // number of real output channels CH1-CH16 + #define MAX_PHASES 5 + #define MAX_MIXERS 32 + #define MAX_EXPOS 14 + #define NUM_CSW 12 // number of custom switches + #define NUM_CFN 16 // number of functions assigned to switches #else -#define MAX_MODELS 16 -#define NUM_CHNOUT 16 // number of real output channels CH1-CH16 -#define MAX_PHASES 5 -#define MAX_MIXERS 32 -#define MAX_EXPOS 14 -#define NUM_CSW 12 // number of custom switches -#define NUM_CFN 16 // number of functions assigned to switches + #define MAX_MODELS 16 + #define NUM_CHNOUT 16 // number of real output channels CH1-CH16 + #define MAX_PHASES 5 + #define MAX_MIXERS 32 + #define MAX_EXPOS 14 + #define NUM_CSW 12 // number of custom switches + #define NUM_CFN 16 // number of functions assigned to switches #endif #define MAX_TIMERS 2 #if defined(CPUARM) -#define MAX_CURVES 16 -#define NUM_POINTS 512 -#define CURVTYPE int16_t + #define MAX_CURVES 16 + #define NUM_POINTS 512 + #define CURVTYPE int16_t #else -#define MAX_CURVES 8 -#define NUM_POINTS (112-MAX_CURVES) -#define CURVTYPE int8_t + #define MAX_CURVES 8 + #define NUM_POINTS (112-MAX_CURVES) + #define CURVTYPE int8_t #endif #define MAX_SWITCH (MAX_PSWITCH+NUM_CSW)