1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 16:55:20 +03:00

Refactoring keys/switches/trims in simu (#6515)

Refactoring keys/switches/trims in simu
This commit is contained in:
Bertrand Songis 2019-06-18 20:07:15 +02:00 committed by GitHub
parent 4998191910
commit eaf595bd76
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 147 additions and 304 deletions

View file

@ -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;

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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();

View file

@ -315,17 +315,33 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
else { \
state##key = false; \
} \
simuSetSwitch(swtch, state_##swtch-states);
simuSetSwitch(swtch, state_##swtch-states)
#if defined(PCBX9E)
#if defined(PCBSKY9X)
SWITCH_KEY(1, 0, 3);
SWITCH_KEY(2, 1, 2);
SWITCH_KEY(3, 2, 2);
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, 3);
SWITCH_KEY(F, 5, 2);
SWITCH_KEY(G, 6, 3);
SWITCH_KEY(H, 7, 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);
@ -336,23 +352,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
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);
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
#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();

View file

@ -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 (((i<NUM_PSWITCH) && (i>3)) || next==true)
if (((i<NUM_SWITCHES_POSITIONS) && (i>3)) || next==true)
result = next ? i : -i;
if (i<=3 && result==0) result = 1;
switches_states ^= mask;

View file

@ -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
)

View file

@ -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;
}

View file

@ -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())

View file

@ -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)
{

View file

@ -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<NUM_KEYS; i++) {
if (keysStates[i]) {
// TRACE("key pressed %d", i);
result |= 1 << i;
}
}
return result;
}
uint32_t readTrims()
{
uint32_t result = 0;
for (int i=0; i<NUM_TRIMS*2; i++) {
if (trimsStates[i]) {
// TRACE("trim pressed %d", i);
result |= 1 << i;
}
}
return result;
}
uint32_t switchState(uint8_t index)
{
#if defined(PCBSKY9X)
switch(index) {
case 0:
return switchesStates[0] < 0;
case 1:
return switchesStates[0] == 0;
case 2:
return switchesStates[0] > 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) {}

View file

@ -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

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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)
{

View file

@ -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);
}