diff --git a/src/bmp.cpp b/src/bmp.cpp index e1c86c488..af7890a7e 100644 --- a/src/bmp.cpp +++ b/src/bmp.cpp @@ -116,7 +116,7 @@ const pm_char * bmpLoad(uint8_t *dest, const char *filename) return STR_INCOMPATIBLE; } - if (width > MODEL_BITMAP_WIDTH || height > MODEL_BITMAP_HEIGHT) { + if (width > MODEL_BITMAP_WIDTH || height > MODEL_BITMAP_HEIGHT) { f_close(&bmpFile); return STR_INCOMPATIBLE; } diff --git a/src/main_views.cpp b/src/main_views.cpp index 865c4126d..ce43ca6ee 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -440,6 +440,7 @@ void menuMainView(uint8_t event) for (uint8_t i=0; i<8; i++) { uint8_t sw; int16_t val; + // TODO simplify this + reuse code in checkSwitches() + Menu MODELSETUP switch(i) { case 5: sw = getValue(MIXSRC_SF-1) > 0 ? 3*i+2 : 3*i+1; diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 1e7bf8108..c10bf9451 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -647,7 +647,7 @@ enum menuModelSetupItems { #endif #if defined(LCD212) -#define MODEL_SETUP_2ND_COLUMN (DISPLAY_W-15*FW-MENUS_SCROLLBAR_WIDTH) +#define MODEL_SETUP_2ND_COLUMN (DISPLAY_W-17*FW-MENUS_SCROLLBAR_WIDTH) #else #define MODEL_SETUP_2ND_COLUMN (DISPLAY_W-11*FW-MENUS_SCROLLBAR_WIDTH) #endif @@ -779,18 +779,18 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_SWITCHES_WARNING: { lcd_putsLeft(y, STR_SWITCHWARNING); - uint8_t states = g_model.switchWarningStates; + swstate_t states = g_model.switchWarningStates; char c = !(states & 1); menu_lcd_onoff(MODEL_SETUP_2ND_COLUMN, y, c, attr); if (attr) { s_editMode = 0; switch(event) { - case EVT_KEY_LONG(KEY_MENU): + case EVT_KEY_LONG(KEY_ENTER): killEvents(event); getMovedSwitch(); g_model.switchWarningStates = 0x01 + (switches_states << 1); // no break - case EVT_KEY_BREAK(KEY_MENU): + case EVT_KEY_BREAK(KEY_ENTER): case EVT_KEY_BREAK(KEY_LEFT): case EVT_KEY_BREAK(KEY_RIGHT): g_model.switchWarningStates ^= 0x01; @@ -800,9 +800,15 @@ void menuModelSetup(uint8_t event) } if (c) { states >>= 1; - for (uint8_t i=1; i<7; i++) { + for (uint8_t i=1; i>= 2; +#else attr = 0; - if (i == 4) { + if (IS_3POS(i-1)) { c = '0'+(states & 0x03); states >>= 2; } @@ -813,6 +819,7 @@ void menuModelSetup(uint8_t event) states >>= 1; } lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+2*FW+i*FW, y, c, attr); +#endif } } break; diff --git a/src/myeeprom.h b/src/myeeprom.h index 2675c92be..f588eb33e 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -819,8 +819,10 @@ enum Dsm2Variants { #if defined(PCBX9D) || defined(PCBACT) #define MODELDATA_EXTRA char bitmap[10] +#define swstate_t uint16_t #else #define MODELDATA_EXTRA +#define swstate_t uint8_t #endif PACK(typedef struct t_ModelData { @@ -853,7 +855,7 @@ PACK(typedef struct t_ModelData { uint8_t thrTraceSrc; uint8_t modelId; - uint8_t switchWarningStates; + swstate_t switchWarningStates; MODEL_GVARS_DATA; diff --git a/src/open9x.cpp b/src/open9x.cpp index 206ffdbc5..4a15c024e 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -903,16 +903,34 @@ bool getSwitch(int8_t swtch, bool nc) return __getSwitch(swtch); } -uint8_t switches_states = 0; +swstate_t switches_states = 0; int8_t getMovedSwitch() { static tmr10ms_t s_last_time = 0; int8_t result = 0; +#if defined(PCBX9D) + for (uint8_t i=0; i> (i*2); + uint8_t next = (1024+getValue(MIXSRC_SA+i-1)) / 1024; + if (prev != next) { + switches_states = (switches_states & (~mask)) | (next << (i*2)); + if (i<5) + result = 1+(3*i)+next; + else if (i==5) + result = 1+(3*5)+(next!=0); + else if (i==6) + result = 1+(3*5)+2+next; + else + result = 1+(3*5)+2+3+next; + } + } +#else for (uint8_t i=MAX_PSWITCH; i>0; i--) { bool prev; - uint8_t mask = 0; + swstate_t mask = 0; if (i <= 3) { mask = (1<<(i-1)); prev = (switches_states & mask); @@ -934,6 +952,7 @@ int8_t getMovedSwitch() switches_states = (switches_states & 0xE7) | ((i-4) << 3); } } +#endif if ((tmr10ms_t)(get_tmr10ms() - s_last_time) > 10) result = 0; @@ -1305,8 +1324,8 @@ void checkAlarm() // added by Gohst void checkSwitches() { - uint8_t last_bad_switches = 0xff; - uint8_t states = g_model.switchWarningStates; + swstate_t last_bad_switches = 0xff; + swstate_t states = g_model.switchWarningStates; while (1) { @@ -1321,6 +1340,15 @@ void checkSwitches() // first - display warning if (last_bad_switches != switches_states) { MESSAGE(STR_SWITCHWARN, NULL, STR_PRESSANYKEYTOSKIP, AU_SWITCH_ALERT); +#if defined(PCBX9D) + for (uint8_t i=0; i> (1+i*2)]; + lcd_putcAtt(50+i*(2*FW+FW/2), 5*FH, 'A'+i, attr); + lcd_putcAtt(50+i*(2*FW+FW/2)+FW, 5*FH, c, attr); + } +#else uint8_t x = 2; for (uint8_t i=1; i<8; i++) { uint8_t attr = (states & (1 << i)) == (switches_states & (1 << i)) ? 0 : INVERS; @@ -1328,6 +1356,7 @@ void checkSwitches() if (i == 4 && attr) i++; if (i != 4) x += 3*FW+FW/2; } +#endif lcdRefresh(); last_bad_switches = switches_states; } diff --git a/src/open9x.h b/src/open9x.h index 0187411c2..abdd22616 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -627,10 +627,14 @@ enum CswFunctions { #define NUM_STICKS 4 #if defined(PCBX9D) || defined(PCBACT) +#define NUM_SWITCHES 8 +#define IS_3POS(sw) ((sw) != 5 && (sw) != 7) #define MAX_PSWITCH (SW_SH2-SW_SA0+1) #define NUM_POTS 4 #define NUM_SW_SRCRAW 8 #else +#define NUM_SWITCHES 7 +#define IS_3POS(sw) ((sw) == 3) #define MAX_PSWITCH (SW_TRN-SW_THR+1) // 9 physical switches #define NUM_POTS 3 #define NUM_SW_SRCRAW 1 @@ -811,7 +815,7 @@ NOINLINE void per10ms(); int16_t getValue(uint8_t i); bool getSwitch(int8_t swtch, bool nc); -extern uint8_t switches_states; +extern swstate_t switches_states; int8_t getMovedSwitch(); #ifdef FLIGHT_PHASES diff --git a/src/sky9x/board_sky9x.cpp b/src/sky9x/board_sky9x.cpp index 067bbf120..b7c41fdc4 100644 --- a/src/sky9x/board_sky9x.cpp +++ b/src/sky9x/board_sky9x.cpp @@ -292,13 +292,12 @@ void start_timer4() extern "C" void TC3_IRQHandler() //capture ppm in at 2MHz { - uint16_t capture ; static uint16_t lastCapt ; - capture = TC1->TC_CHANNEL[0].TC_RA ; - (void) TC1->TC_CHANNEL[0].TC_SR ; // Acknowledgethe interrupt + uint16_t capture = TC1->TC_CHANNEL[0].TC_RA ; + (void) TC1->TC_CHANNEL[0].TC_SR ; // Acknowledge the interrupt - uint16_t val = (capture - lastCapt) / 2; + uint16_t val = ((uint16_t)(capture - lastCapt)) / 2; // G: We process g_ppmIns immediately here, to make servo movement as smooth as possible // while under trainee control