diff --git a/radio/src/cli.cpp b/radio/src/cli.cpp index 56f1abc37..6bb489b96 100644 --- a/radio/src/cli.cpp +++ b/radio/src/cli.cpp @@ -960,13 +960,13 @@ int cliDisplay(const char ** argv) uint8_t len = STR_VKEYS[0]; strncpy(name, STR_VKEYS+1+len*i, len); name[len] = '\0'; - serialPrint("[%s] = %s", name, keyState(i) ? "on" : "off"); + serialPrint("[%s] = %s", name, keys[i].state() ? "on" : "off"); } #if defined(ROTARY_ENCODER_NAVIGATION) serialPrint("[Enc.] = %d", rotencValue / ROTARY_ENCODER_GRANULARITY); #endif for (int i=TRM_BASE; i<=TRM_LAST; i++) { - serialPrint("[Trim%d] = %s", i-TRM_BASE, keyState(i) ? "on" : "off"); + serialPrint("[Trim%d] = %s", i-TRM_BASE, keys[i].state() ? "on" : "off"); } for (int i=MIXSRC_FIRST_SWITCH; i<=MIXSRC_LAST_SWITCH; i++) { mixsrc_t sw = i - MIXSRC_FIRST_SWITCH; diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp index 813459aa5..bd8668c82 100644 --- a/radio/src/gui/128x64/radio_diagkeys.cpp +++ b/radio/src/gui/128x64/radio_diagkeys.cpp @@ -22,7 +22,7 @@ void displayKeyState(uint8_t x, uint8_t y, uint8_t key) { - uint8_t t = keyState(key); + uint8_t t = keys[key].state(); lcdDrawChar(x, y, t+'0', t ? INVERS : 0); } diff --git a/radio/src/gui/212x64/radio_diagkeys.cpp b/radio/src/gui/212x64/radio_diagkeys.cpp index c6e48b57e..a221e6260 100644 --- a/radio/src/gui/212x64/radio_diagkeys.cpp +++ b/radio/src/gui/212x64/radio_diagkeys.cpp @@ -22,7 +22,7 @@ void displayKeyState(uint8_t x, uint8_t y, uint8_t key) { - uint8_t t = keyState(key); + uint8_t t = keys[key].state(); lcdDrawChar(x, y, t+'0', t ? INVERS : 0); } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index f45e254a6..352bdf86c 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -249,8 +249,6 @@ #define SW_DSM2_BIND SW_TRN #endif -#define NUM_PSWITCH (SWSRC_LAST_SWITCH-SWSRC_FIRST_SWITCH+1) - #include "myeeprom.h" inline void memclear(void * p, size_t size) @@ -447,11 +445,7 @@ div_t switchInfo(int switchPosition); extern uint8_t potsPos[NUM_XPOTS]; #endif -#if defined(PCBHORUS) - uint16_t trimDown(uint16_t idx); // TODO why? -#else - uint8_t trimDown(uint8_t idx); -#endif +bool trimDown(uint8_t idx); void readKeysAndTrims(); uint16_t evalChkSum(); diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index f775e7b14..3583a54a8 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -315,44 +315,44 @@ void OpenTxSim::updateKeysAndSwitches(bool start) else { \ state##key = false; \ } \ - simuSetSwitch(swtch, state_##swtch-states); + simuSetSwitch(swtch, state_##swtch-states) -#if defined(PCBX9E) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 3); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 3); - SWITCH_KEY(I, 8, 3); - SWITCH_KEY(J, 9, 3); - SWITCH_KEY(K, 10, 3); - SWITCH_KEY(L, 11, 3); - SWITCH_KEY(M, 12, 3); - SWITCH_KEY(N, 13, 3); - SWITCH_KEY(O, 14, 3); - SWITCH_KEY(P, 15, 3); - SWITCH_KEY(Q, 16, 3); - SWITCH_KEY(R, 17, 3); -#elif defined(PCBTARANIS) || defined(PCBHORUS) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 2); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 2); -#else - SWITCH_KEY(1, 0, 2); +#if defined(PCBSKY9X) + SWITCH_KEY(1, 0, 3); SWITCH_KEY(2, 1, 2); SWITCH_KEY(3, 2, 2); - SWITCH_KEY(4, 3, 3); + SWITCH_KEY(4, 3, 2); SWITCH_KEY(5, 4, 2); SWITCH_KEY(6, 5, 2); SWITCH_KEY(7, 6, 2); +#else + SWITCH_KEY(A, 0, 3); + SWITCH_KEY(B, 1, 3); + SWITCH_KEY(C, 2, 3); + SWITCH_KEY(D, 3, 3); + + #if defined(PCBX7) || defined(PCBXLITE) + SWITCH_KEY(F, 4, 2); + SWITCH_KEY(H, 5, 2); + #else + SWITCH_KEY(E, 4, 3); + SWITCH_KEY(F, 5, 2); + SWITCH_KEY(G, 6, 3); + SWITCH_KEY(H, 7, 2); + #endif + + #if defined(PCBX9E) + SWITCH_KEY(I, 8, 3); + SWITCH_KEY(J, 9, 3); + SWITCH_KEY(K, 10, 3); + SWITCH_KEY(L, 11, 3); + SWITCH_KEY(M, 12, 3); + SWITCH_KEY(N, 13, 3); + SWITCH_KEY(O, 14, 3); + SWITCH_KEY(P, 15, 3); + SWITCH_KEY(Q, 16, 3); + SWITCH_KEY(R, 17, 3); + #endif #endif } @@ -385,49 +385,6 @@ long OpenTxSim::onTimeout(FXObject*, FXSelector, void*) rotencAction = false; } #endif - -#if defined(PCBX9E) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 2); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 2); - SWITCH_KEY(I, 8, 3); - SWITCH_KEY(J, 9, 3); - SWITCH_KEY(K, 10, 3); - SWITCH_KEY(L, 11, 3); - SWITCH_KEY(M, 12, 3); - SWITCH_KEY(N, 13, 3); - SWITCH_KEY(O, 14, 3); - SWITCH_KEY(P, 15, 3); - SWITCH_KEY(Q, 16, 3); - SWITCH_KEY(R, 17, 3); -#elif defined(PCBTARANIS) || defined(PCBHORUS) - SWITCH_KEY(A, 0, 3); - SWITCH_KEY(B, 1, 3); - SWITCH_KEY(C, 2, 3); - SWITCH_KEY(D, 3, 3); -#if defined(PCBX7) - SWITCH_KEY(F, 4, 2); - SWITCH_KEY(H, 5, 2); -#else - SWITCH_KEY(E, 4, 3); - SWITCH_KEY(F, 5, 2); - SWITCH_KEY(G, 6, 3); - SWITCH_KEY(H, 7, 2); -#endif -#else - SWITCH_KEY(1, 0, 2); - SWITCH_KEY(2, 1, 2); - SWITCH_KEY(3, 2, 2); - SWITCH_KEY(4, 3, 3); - SWITCH_KEY(5, 4, 2); - SWITCH_KEY(6, 5, 2); - SWITCH_KEY(7, 6, 2); -#endif } per10ms(); diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index de552d87f..6b2199a0d 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -525,13 +525,13 @@ swsrc_t getMovedSwitch() // -4..-8 for all other switches if changed to false // 9 for Trainer switch if changed to true; Change to false is ignored swarnstate_t mask = 0x80; - for (uint8_t i=NUM_PSWITCH; i>1; i--) { + for (uint8_t i=NUM_SWITCHES_POSITIONS; i>1; i--) { bool prev; prev = (switches_states & mask); // don't use getSwitch here to always get the proper value, even getSwitch manipulates bool next = switchState(i-1); if (prev != next) { - if (((i3)) || next==true) + if (((i3)) || next==true) result = next ? i : -i; if (i<=3 && result==0) result = 1; switches_states ^= mask; diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 90d196f41..533a28ab5 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -192,12 +192,12 @@ set(SRC set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} + keys_driver.cpp diskio.cpp ) set(TARGET_SRC ${TARGET_SRC} - keys_driver.cpp telemetry_driver.cpp ) diff --git a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp index b8d06a03a..6a2445c44 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -71,7 +71,7 @@ void rotaryEncoderInit() void rotaryEncoderCheck() { uint8_t newPosition = ROTARY_ENCODER_POSITION(); - if (newPosition != rotencPosition && !keyState(KEY_ENTER)) { + if (newPosition != rotencPosition && !(readKeys() & (1 << KEY_ENTER))) { if ((rotencPosition & 0x01) ^ ((newPosition & 0x02) >> 1)) { --rotencValue; } diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 26e01fe54..60c98b9fd 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -309,16 +309,12 @@ enum EnumSwitchesPositions SW_SGMBR0, SW_SGMBR1, SW_SGMBR2, - STORAGE_NUM_SWITCHES_POSITIONS + NUM_SWITCHES_POSITIONS }; - -#if defined(__cplusplus) -static_assert(STORAGE_NUM_SWITCHES_POSITIONS == NUM_SWITCHES * 3, "Wrong switches positions count"); -#endif +#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) void keysInit(void); -uint8_t keyState(uint8_t index); uint32_t switchState(uint8_t index); uint32_t readKeys(void); #define KEYS_PRESSED() (readKeys()) diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 0f0b5f7ac..090376b42 100644 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -79,9 +79,9 @@ uint32_t readTrims() return result; } -uint16_t trimDown(uint16_t idx) +bool trimDown(uint8_t idx) { - return readTrims() & (1 << idx); + return readTrims() & ((uint32_t)1 << idx); } bool keyDown() @@ -158,11 +158,6 @@ void readKeysAndTrims() } \ break -uint8_t keyState(uint8_t index) -{ - return keys[index].state(); -} - #if !defined(BOOT) uint32_t switchState(uint8_t index) { diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 6a061eaca..d5edb9d7d 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -144,197 +144,28 @@ void simuInit() PIOC->PIO_PDSR &= ~PIO_PC17; #endif - for (int i = 0; i <= 17; i++) { - simuSetSwitch(i, 0); - simuSetKey(i, false); // a little dirty, but setting keys that don't exist is perfectly OK here - } - for (int i = 0; i < 2*NUM_TRIMS; i++) - simuSetTrim(i, false); - #if defined(ROTARY_ENCODER_NAVIGATION) rotencValue = 0; #endif } -#define NEG_CASE(sw_or_key, pin, mask) \ - case sw_or_key: \ - if ((int)state > 0) pin &= ~(mask); else pin |= (mask); \ - break; -#define POS_CASE(sw_or_key, pin, mask) \ - case sw_or_key: \ - if ((int)state > 0) pin |= (mask); else pin &= ~(mask); \ - break; - - #if defined(PCBHORUS) || (defined(PCBTARANIS) && !defined(PCBX9E)) - #define SWITCH_CASE NEG_CASE - #define SWITCH_INV POS_CASE - #else - #define SWITCH_CASE POS_CASE - #endif - #define KEY_CASE NEG_CASE - #define SWITCH_3_CASE(swtch, pin1, pin2, mask1, mask2) \ - case swtch: \ - if ((int)state < 0) pin1 &= ~(mask1); else pin1 |= (mask1); \ - if ((int)state > 0) pin2 &= ~(mask2); else pin2 |= (mask2); \ - break; - #define SWITCH_3_INV(swtch, pin1, pin2, mask1, mask2) SWITCH_3_CASE(swtch, pin2, pin1, mask2, mask1) - -#define TRIM_CASE KEY_CASE - +bool keysStates[NUM_KEYS] = { false }; void simuSetKey(uint8_t key, bool state) { - // if (state) TRACE_SIMPGMSPACE("simuSetKey(%d, %d)", key, state); - - switch (key) { -#if defined(PCBX12S) - KEY_CASE(KEY_PGUP, KEYS_GPIO_REG_PGUP, KEYS_GPIO_PIN_PGUP) - KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_PGDN, KEYS_GPIO_PIN_PGDN) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_TELEM, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_RADIO, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_MODEL, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(PCBX10) - KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_PGDN, KEYS_GPIO_PIN_PGDN) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_TELEM, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_RADIO, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_MODEL, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(PCBXLITE) - KEY_CASE(KEY_SHIFT, KEYS_GPIO_REG_SHIFT, KEYS_GPIO_PIN_SHIFT) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(RADIO_T12) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#elif defined(PCBTARANIS) - KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER) - KEY_CASE(KEY_PAGE, KEYS_GPIO_REG_PAGE, KEYS_GPIO_PIN_PAGE) - #if defined(KEYS_GPIO_REG_MINUS) - KEY_CASE(KEY_MINUS, KEYS_GPIO_REG_MINUS, KEYS_GPIO_PIN_MINUS) - KEY_CASE(KEY_PLUS, KEYS_GPIO_REG_PLUS, KEYS_GPIO_PIN_PLUS) - #endif -#else - KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU) - KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT) - KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT) - KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT) - KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP) - KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN) -#endif - } + keysStates[key] = state; } +bool trimsStates[NUM_TRIMS*2] = { false }; void simuSetTrim(uint8_t trim, bool state) { - // TRACE_SIMPGMSPACE("trim=%d state=%d", trim, state); - - switch (trim) { - TRIM_CASE(0, TRIMS_GPIO_REG_LHL, TRIMS_GPIO_PIN_LHL) - TRIM_CASE(1, TRIMS_GPIO_REG_LHR, TRIMS_GPIO_PIN_LHR) - TRIM_CASE(2, TRIMS_GPIO_REG_LVD, TRIMS_GPIO_PIN_LVD) - TRIM_CASE(3, TRIMS_GPIO_REG_LVU, TRIMS_GPIO_PIN_LVU) - #if defined(TRIMS_GPIO_REG_RVD) - TRIM_CASE(4, TRIMS_GPIO_REG_RVD, TRIMS_GPIO_PIN_RVD) - TRIM_CASE(5, TRIMS_GPIO_REG_RVU, TRIMS_GPIO_PIN_RVU) - TRIM_CASE(6, TRIMS_GPIO_REG_RHL, TRIMS_GPIO_PIN_RHL) - TRIM_CASE(7, TRIMS_GPIO_REG_RHR, TRIMS_GPIO_PIN_RHR) - #endif -#if defined(PCBHORUS) - TRIM_CASE(8, TRIMS_GPIO_REG_LSD, TRIMS_GPIO_PIN_LSD) - TRIM_CASE(9, TRIMS_GPIO_REG_LSU, TRIMS_GPIO_PIN_LSU) - TRIM_CASE(10, TRIMS_GPIO_REG_RSD, TRIMS_GPIO_PIN_RSD) - TRIM_CASE(11, TRIMS_GPIO_REG_RSU, TRIMS_GPIO_PIN_RSU) -#endif - } + trimsStates[trim] = state; } -// TODO use a better numbering to allow google tests to work on Taranis +int8_t switchesStates[NUM_SWITCHES] = { -1 }; void simuSetSwitch(uint8_t swtch, int8_t state) { - // TRACE_SIMPGMSPACE("simuSetSwitch(%d, %d)", swtch, state); - - switch (swtch) { -#if defined(PCBTARANIS) - #if defined(SWITCHES_GPIO_REG_A_L) - SWITCH_3_CASE(0, SWITCHES_GPIO_REG_A_L, SWITCHES_GPIO_REG_A_H, SWITCHES_GPIO_PIN_A_L, SWITCHES_GPIO_PIN_A_H) - SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) - #endif - #if defined(SWITCHES_GPIO_REG_C_L) - SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) - #endif - #if defined(SWITCHES_GPIO_REG_D_L) - SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) - #elif defined(SWITCHES_GPIO_REG_D) - SWITCH_CASE (3, SWITCHES_GPIO_REG_D, SWITCHES_GPIO_PIN_D) - #endif - #if defined(PCBX7) - SWITCH_CASE (4, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - SWITCH_CASE (5, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) - SWITCH_CASE (6, SWITCHES_GPIO_REG_I, SWITCHES_GPIO_PIN_I) - SWITCH_CASE (7, SWITCHES_GPIO_REG_J, SWITCHES_GPIO_PIN_J) - #elif defined(PCBXLITES) - SWITCH_CASE (4, SWITCHES_GPIO_REG_E, SWITCHES_GPIO_PIN_E) - SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #elif !defined(PCBXLITE) && !defined(PCBX9LITE) - SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) - SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - SWITCH_3_CASE(6, SWITCHES_GPIO_REG_G_L, SWITCHES_GPIO_REG_G_H, SWITCHES_GPIO_PIN_G_L, SWITCHES_GPIO_PIN_G_H) - SWITCH_CASE (7, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) - #endif - #if defined(SWITCHES_GPIO_REG_I_L) - SWITCH_3_CASE(8, SWITCHES_GPIO_REG_I_L, SWITCHES_GPIO_REG_I_H, SWITCHES_GPIO_PIN_I_L, SWITCHES_GPIO_PIN_I_H) - SWITCH_3_CASE(9, SWITCHES_GPIO_REG_J_L, SWITCHES_GPIO_REG_J_H, SWITCHES_GPIO_PIN_J_L, SWITCHES_GPIO_PIN_J_H) - SWITCH_3_CASE(10, SWITCHES_GPIO_REG_K_L, SWITCHES_GPIO_REG_K_H, SWITCHES_GPIO_PIN_K_L, SWITCHES_GPIO_PIN_K_H) - SWITCH_3_CASE(11, SWITCHES_GPIO_REG_L_L, SWITCHES_GPIO_REG_L_H, SWITCHES_GPIO_PIN_L_L, SWITCHES_GPIO_PIN_L_H) - SWITCH_3_CASE(12, SWITCHES_GPIO_REG_M_L, SWITCHES_GPIO_REG_M_H, SWITCHES_GPIO_PIN_M_L, SWITCHES_GPIO_PIN_M_H) - SWITCH_3_CASE(13, SWITCHES_GPIO_REG_N_L, SWITCHES_GPIO_REG_N_H, SWITCHES_GPIO_PIN_N_L, SWITCHES_GPIO_PIN_N_H) - SWITCH_3_CASE(14, SWITCHES_GPIO_REG_O_L, SWITCHES_GPIO_REG_O_H, SWITCHES_GPIO_PIN_O_L, SWITCHES_GPIO_PIN_O_H) - SWITCH_3_CASE(15, SWITCHES_GPIO_REG_P_L, SWITCHES_GPIO_REG_P_H, SWITCHES_GPIO_PIN_P_L, SWITCHES_GPIO_PIN_P_H) - SWITCH_3_CASE(16, SWITCHES_GPIO_REG_Q_L, SWITCHES_GPIO_REG_Q_H, SWITCHES_GPIO_PIN_Q_L, SWITCHES_GPIO_PIN_Q_H) - SWITCH_3_CASE(17, SWITCHES_GPIO_REG_R_L, SWITCHES_GPIO_REG_R_H, SWITCHES_GPIO_PIN_R_L, SWITCHES_GPIO_PIN_R_H) - #endif -#elif defined(PCBHORUS) - SWITCH_3_CASE(0, SWITCHES_GPIO_REG_A_L, SWITCHES_GPIO_REG_A_H, SWITCHES_GPIO_PIN_A_L, SWITCHES_GPIO_PIN_A_H) - #if defined(PCBX10) - SWITCH_3_INV (1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) - SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) - SWITCH_3_INV (3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) - SWITCH_3_INV (4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) - SWITCH_CASE (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #else // X12 - SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) - SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) - SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) - SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) - SWITCH_INV (5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) - #endif - SWITCH_3_CASE(6, SWITCHES_GPIO_REG_G_L, SWITCHES_GPIO_REG_G_H, SWITCHES_GPIO_PIN_G_L, SWITCHES_GPIO_PIN_G_H) - SWITCH_CASE (7, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) -#elif defined(PCBSKY9X) - SWITCH_3_CASE(0, PIOC->PIO_PDSR, PIOC->PIO_PDSR, 0x00004000, 0x00000800) - SWITCH_CASE(1, PIOC->PIO_PDSR, 1<<20) - SWITCH_CASE(2, PIOA->PIO_PDSR, 1<<15) - SWITCH_CASE(3, PIOC->PIO_PDSR, 1<<31) - SWITCH_CASE(4, PIOA->PIO_PDSR, 1<<2) - SWITCH_CASE(5, PIOC->PIO_PDSR, 1<<16) - SWITCH_CASE(6, PIOC->PIO_PDSR, 1<<8) -#endif - - default: - break; - } + // TRACE("simuSetSwitch(%d, %d)", swtch, state); + switchesStates[swtch] = state; } void StartSimu(bool tests, const char * sdPath, const char * settingsPath) @@ -569,7 +400,7 @@ void StopAudioThread() bool simuLcdRefresh = true; display_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; -#if !defined(PCBHORUS) +#if !defined(COLORLCD) void lcdSetRefVolt(uint8_t val) { } @@ -638,8 +469,90 @@ uint32_t pwrPressed() #endif } +void pwrInit() +{ +} + +void readKeysAndTrims() +{ + uint8_t index = 0; + uint32_t in = readKeys(); + for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) { + keys[index++].input(in & i); + } + + in = readTrims(); + for (uint8_t i = 1; i != uint8_t(1 << 8); i <<= 1) { + keys[index++].input(in & i); + } +} + +bool keyDown() +{ + return readKeys(); +} + +bool trimDown(uint8_t idx) +{ + return readTrims() & (1 << idx); +} + +uint32_t readKeys() +{ + uint32_t result = 0; + + for (int i=0; i 0; + default: + return switchesStates[index - 2] > 0; + } +#else + div_t qr = div(index, 3); + int state = switchesStates[qr.quot]; + switch (qr.rem) { + case 0: + return state < 0; + case 2: + return state > 0; + default: + return state == 0; + } +#endif +} + #if defined(STM32) -void pwrInit() { } int usbPlugged() { return false; } int getSelectedUsbMode() { return USB_JOYSTICK_MODE; } void setSelectedUsbMode(int mode) {} diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 944910749..9add10595 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -90,6 +90,7 @@ set(FIRMWARE_TARGET_SRC eeprom_driver.cpp lcd_driver.cpp pwr_driver.cpp + keys_driver.cpp usb/device/core/USBD_UDP.c usb/device/core/USBDDriver.c usb/device/massstorage/MSDDriver.c @@ -115,7 +116,6 @@ set(TARGET_SRC telemetry_driver.cpp adc_driver.cpp pulses_driver.cpp - keys_driver.cpp audio_driver.cpp buzzer_driver.cpp haptic_driver.cpp diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index 9648b92e9..8846d63ff 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -52,6 +52,7 @@ void rotaryEncoderEnd(); // Keys driver #define NUM_SWITCHES 7 #define STORAGE_NUM_SWITCHES NUM_SWITCHES +#define NUM_SWITCHES_POSITIONS 9 enum EnumKeys { @@ -220,7 +221,6 @@ void stop_trainer_capture(); void flashWrite(uint32_t * address, uint32_t * buffer); // Keys driver -uint8_t keyState(uint8_t index); uint32_t switchState(uint8_t index); uint32_t readKeys(void); uint32_t readTrims(void); diff --git a/radio/src/targets/sky9x/keys_driver.cpp b/radio/src/targets/sky9x/keys_driver.cpp index dd959d8fc..9f7dac244 100644 --- a/radio/src/targets/sky9x/keys_driver.cpp +++ b/radio/src/targets/sky9x/keys_driver.cpp @@ -80,7 +80,7 @@ uint32_t readTrims() return result; } -uint8_t trimDown(uint8_t idx) +bool trimDown(uint8_t idx) { return readTrims() & (1 << idx); } @@ -113,11 +113,6 @@ void readKeysAndTrims() } } -uint8_t keyState(uint8_t index) -{ - return keys[index].state(); -} - uint32_t switchState(uint8_t index) { uint32_t a = PIOA->PIO_PDSR; diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 11cd6c90d..983515c5e 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -488,7 +488,6 @@ enum EnumSwitchesPositions #define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) void keysInit(void); -uint8_t keyState(uint8_t index); uint32_t switchState(uint8_t index); uint32_t readKeys(void); uint32_t readTrims(void); diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 09d92434c..9ae7c98d9 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -100,7 +100,7 @@ uint32_t readTrims() return result; } -uint8_t trimDown(uint8_t idx) +bool trimDown(uint8_t idx) { return readTrims() & (1 << idx); } @@ -168,11 +168,6 @@ void readKeysAndTrims() } \ break -uint8_t keyState(uint8_t index) -{ - return keys[index].state(); -} - #if !defined(BOOT) uint32_t switchState(uint8_t index) { diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 41ed52b45..4c84a8944 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -455,18 +455,17 @@ TEST_F(MixerTest, SlowOnPhase) CHECK_SLOW_MOVEMENT(0, -1, 250); } - TEST_F(MixerTest, SlowOnSwitchSource) { g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; -#if defined(PCBTARANIS) || defined(PCBHORUS) +#if defined(PCBSKY9X) + g_model.mixData[0].srcRaw = MIXSRC_THR; + int switchIndex = 1; +#else g_eeGeneral.switchConfig = 0x03; g_model.mixData[0].srcRaw = MIXSRC_SA; - int switch_index = 0; -#else - g_model.mixData[0].srcRaw = MIXSRC_THR; - int switch_index = 1; + int switchIndex = 0; #endif g_model.mixData[0].weight = 100; g_model.mixData[0].speedUp = SLOW_STEP*5; @@ -474,11 +473,11 @@ TEST_F(MixerTest, SlowOnSwitchSource) s_mixer_first_run_done = true; - simuSetSwitch(switch_index, -1); + simuSetSwitch(switchIndex, -1); CHECK_SLOW_MOVEMENT(0, -1, 250); EXPECT_EQ(chans[0], -CHANNEL_MAX); - simuSetSwitch(switch_index, 1); + simuSetSwitch(switchIndex, 1); CHECK_SLOW_MOVEMENT(0, +1, 500); }