1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-13 03:19:53 +03:00

[V10] Fixes

This commit is contained in:
Bertrand Songis 2025-02-28 17:29:23 +01:00
parent fe18f5a17f
commit 9cccae08d4
No known key found for this signature in database
GPG key ID: F189F79290FEC50F
35 changed files with 608 additions and 275 deletions

View file

@ -431,7 +431,7 @@ enum SwitchSources {
SWSRC_SD2,
#endif
#if defined(FUNCTION_SWITCHES) && defined(RADIO_TPRO)
#if FUNCTION_SWITCHES > 0 && defined(RADIO_TPRO)
SWSRC_FIRST_FUNCTION_SWITCH,
SWSRC_SE0 = SWSRC_FIRST_FUNCTION_SWITCH,
SWSRC_SE1,
@ -536,6 +536,11 @@ enum SwitchSources {
SWSRC_LAST_SWITCH = SWSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES_POSITIONS - 1,
#endif
#if FUNCTION_SWITCHES > 0
SWSRC_FIRST_FUNCTION_SWITCH,
SWSRC_LAST_FUNCTION_SWITCH = SWSRC_FIRST_FUNCTION_SWITCH + FUNCTION_SWITCHES - 1,
#endif
#if NUM_XPOTS > 0
SWSRC_FIRST_MULTIPOS_SWITCH,
SWSRC_LAST_MULTIPOS_SWITCH = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS * XPOTS_MULTIPOS_COUNT) - 1,
@ -565,7 +570,7 @@ enum SwitchSources {
SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH,
SWSRC_SW2,
// ...
SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1,
SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH + MAX_LOGICAL_SWITCHES - 1,
SWSRC_ON,
SWSRC_ONE,
@ -600,7 +605,7 @@ enum SwitchSources {
SWSRC_INVERT = SWSRC_COUNT+1,
};
#if NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES >= 8
#if NUM_SWITCHES - FUNCTION_SWITCHES >= 8
#define SWSRC_TRAINER SWSRC_SH2
#else
#define SWSRC_TRAINER SWSRC_LAST_SWITCH,
@ -778,6 +783,14 @@ enum MixSources {
MIXSRC_GEA,
MIXSRC_TRN,
#endif
MIXSRC_LAST_SWITCH = MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES - 1,
#if FUNCTION_SWITCHES > 0
MIXSRC_FIRST_FS_SWITCH,
MIXSRC_LAST_FS_SWITCH = MIXSRC_FIRST_FS_SWITCH + FUNCTION_SWITCHES - 1,
#endif
MIXSRC_FIRST_LOGICAL_SWITCH,
MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES)
MIXSRC_LAST_LOGICAL_SWITCH = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1,
@ -830,19 +843,10 @@ enum MixSources {
MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1
};
#if defined(__cplusplus)
static_assert(MIXSRC_FIRST_LOGICAL_SWITCH == MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES, "Wrong switches definition in MIXSRC list");
#endif
#define MIXSRC_FIRST (MIXSRC_NONE + 1)
#define MIXSRC_LAST MIXSRC_LAST_CH
#define MIXSRC_LAST_SWITCH (MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES - 1)
#define INPUTSRC_FIRST MIXSRC_Rud
#define INPUTSRC_LAST MIXSRC_LAST_TELEM
#if defined(FUNCTION_SWITCHES)
#define MIXSRC_LAST_REGULAR_SWITCH (MIXSRC_FIRST_SWITCH + NUM_REGULAR_SWITCHES - 1)
#define MIXSRC_FIRST_FS_SWITCH (MIXSRC_LAST_REGULAR_SWITCH + 1)
#endif
enum BacklightMode {
e_backlight_mode_off = 0,

View file

@ -577,13 +577,13 @@ PACK(struct CustomScreenData {
#define SCRIPT_DATA
#endif
#if defined(FUNCTION_SWITCHES) && NUM_FUNCTIONS_SWITCHES < 8
#if FUNCTION_SWITCHES > 0
#define FUNCTION_SWITCHS_FIELDS \
uint16_t functionSwitchConfig; \
uint16_t functionSwitchGroup; \
uint16_t functionSwitchStartConfig; \
uint8_t functionSwitchLogicalState; \
char switchNames[NUM_FUNCTIONS_SWITCHES][LEN_SWITCH_NAME];
char switchNames[FUNCTION_SWITCHES][LEN_SWITCH_NAME];
#else
#define FUNCTION_SWITCHS_FIELDS
#endif
@ -752,7 +752,7 @@ PACK(struct TrainerData {
uint8_t backlightColor; \
swarnstate_t switchUnlockStates; \
swconfig_t switchConfig; \
char switchNames[STORAGE_NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES][LEN_SWITCH_NAME]; \
char switchNames[STORAGE_NUM_SWITCHES - FUNCTION_SWITCHES][LEN_SWITCH_NAME]; \
char anaNames[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS][LEN_ANA_NAME]; \
MODEL_FILE_NAME_FIELD \
BLUETOOTH_FIELDS

View file

@ -35,7 +35,7 @@
#define FILL_WHITE 0x10
#endif
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7) || defined(NAVIGATION_HORUS)
#define HEADER_LINE 0
#define HEADER_LINE_COLUMNS
#else
@ -156,9 +156,15 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla
#define CURSOR_ON_LINE() (0)
#endif
#if defined(NAVIGATION_HORUS)
bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, const uint8_t * horTab, uint8_t horTabMax, int maxrow, uint8_t flags=0);
bool check_simple(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, int maxrow);
bool check_submenu_simple(event_t event, uint8_t maxrow);
#else
void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuTabSize, const uint8_t *horTab, uint8_t horTabMax, vertpos_t maxrow);
void check_simple(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuTabSize, vertpos_t maxrow);
void check_submenu_simple(event_t event, uint8_t maxrow);
#endif
void title(const char * s);
@ -274,6 +280,8 @@ void menuChannelsViewCommon(event_t event);
#define REPEAT_LAST_CURSOR_MOVE() repeatLastCursorMove(event)
#endif
#define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0)
// TODO enum
#if defined(PCBX7) || defined(PCBX9LITE)
#define EDIT_MODE_INIT 0

View file

@ -37,7 +37,7 @@ uint8_t g_moduleIdx;
uint8_t getSwitchWarningsCount()
{
uint8_t count = 0;
for (int i=0; i<NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES; ++i) {
for (int i=0; i<NUM_SWITCHES - FUNCTION_SWITCHES; ++i) {
if (SWITCH_WARNING_ALLOWED(i)) {
++count;
}
@ -63,14 +63,16 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_TIMER3_PERSISTENT,
ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP,
ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP,
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
ITEM_MODEL_SETUP_LABEL,
ITEM_MODEL_SETUP_SW1,
ITEM_MODEL_SETUP_SW2,
ITEM_MODEL_SETUP_SW3,
ITEM_MODEL_SETUP_SW4,
#if FUNCTION_SWITCHES >= 6
ITEM_MODEL_SETUP_SW5,
ITEM_MODEL_SETUP_SW6,
#endif
ITEM_MODEL_SETUP_FS_STARTUP,
#endif
ITEM_MODEL_SETUP_EXTENDED_LIMITS,
@ -279,8 +281,10 @@ inline uint8_t MODULE_SUBTYPE_ROWS(int moduleIdx)
#define EXTRA_MODULE_ROWS
#endif
#if defined(FUNCTION_SWITCHES)
#define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1),
#if FUNCTION_SWITCHES == 6
#define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(FUNCTION_SWITCHES-1),
#elif FUNCTION_SWITCHES == 4
#define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(FUNCTION_SWITCHES-1),
#else
#define FUNCTION_SWITCHES_ROWS
#endif
@ -609,8 +613,7 @@ void menuModelSetup(event_t event)
timer->persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, timer->persistent, 0, 2, attr, event);
break;
}
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
case ITEM_MODEL_SETUP_LABEL:
lcdDrawTextAlignedLeft(y, "Function Switches");
break;
@ -619,12 +622,14 @@ void menuModelSetup(event_t event)
case ITEM_MODEL_SETUP_SW2:
case ITEM_MODEL_SETUP_SW3:
case ITEM_MODEL_SETUP_SW4:
#if FUNCTION_SWITCHES >= 6
case ITEM_MODEL_SETUP_SW5:
case ITEM_MODEL_SETUP_SW6:
#endif
{
int index = k - ITEM_MODEL_SETUP_SW1;
int config = FSWITCH_CONFIG(index);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH + NUM_REGULAR_SWITCHES - MIXSRC_Rud + index + 1, menuHorizontalPosition < 0 ? attr : 0);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH + NUM_SWITCHES - MIXSRC_Rud + index + 1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_model.switchNames[index]) || (attr && s_editMode > 0 && menuHorizontalPosition == 0))
editName(35, y, g_model.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0);
else
@ -646,8 +651,8 @@ void menuModelSetup(event_t event)
uint8_t groupeAlwaysOn = IS_FSWITCH_GROUP_ON(config);
groupeAlwaysOn = editCheckBox(groupeAlwaysOn, 30 + 15 * FW, y, "", menuHorizontalPosition == 3 ? attr : 0, event);
if (attr && checkIncDec_Ret && menuHorizontalPosition == 3) {
swconfig_t mask = (swconfig_t) 0x01 << (2 * NUM_FUNCTIONS_SWITCHES + config);
g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * NUM_FUNCTIONS_SWITCHES + config));
swconfig_t mask = (swconfig_t) 0x01 << (2 * FUNCTION_SWITCHES + config);
g_model.functionSwitchGroup = (g_model.functionSwitchGroup & ~mask) | (groupeAlwaysOn << (2 * FUNCTION_SWITCHES + config));
}
}
else if (attr && menuHorizontalPosition == 3) { // Non visible checkbox
@ -660,7 +665,7 @@ void menuModelSetup(event_t event)
{
char c;
lcdDrawText(0, y, INDENT "Start", menuHorizontalPosition < 0 ? attr : 0);
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) {
for (uint8_t i = 0; i < FUNCTION_SWITCHES; i++) {
uint8_t startPos = (g_model.functionSwitchStartConfig >> 2 * i) & 0x03;
c = "\300\301="[(g_model.functionSwitchStartConfig >> 2 * i) & 0x03];
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN - (2 + FW) + i * 2 * FW, y, i + 1, 0);
@ -807,7 +812,7 @@ void menuModelSetup(event_t event)
}
int current = 0;
for (int i = 0; i < NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES; i++) {
for (int i = 0; i < NUM_SWITCHES - FUNCTION_SWITCHES; i++) {
if (SWITCH_WARNING_ALLOWED(i)) {
div_t qr = div(current, MAX_SWITCH_PER_LINE);
if (!READ_ONLY() && event==EVT_KEY_BREAK(KEY_ENTER) && attr && l_posHorz == current && old_posHorz >= 0) {

View file

@ -66,8 +66,8 @@ void menuRadioDiagKeys(event_t event)
drawSwitch(8*FW, y, i+1, 0);
displaySwitchState(11*FW+2, y, i);
}
#elif (NUM_SWITCHES > 6)
if (i < NUM_SWITCHES) {
#elif STORAGE_NUM_SWITCHES > 6
if (i < STORAGE_NUM_SWITCHES) {
if (SWITCH_EXISTS(i)) {
y = (i > 4) ? FH*(i-4) : MENU_HEADER_HEIGHT + FH*i;
getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
@ -76,9 +76,9 @@ void menuRadioDiagKeys(event_t event)
}
}
#else
if (i < NUM_SWITCHES) {
if (i < STORAGE_NUM_SWITCHES) {
if (SWITCH_EXISTS(i)) {
y = (NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES > 6 ? 0 : MENU_HEADER_HEIGHT) + FH*i;
y = (STORAGE_NUM_SWITCHES > 6 ? 0 : MENU_HEADER_HEIGHT) + FH*i;
getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
drawSwitch(8*FW+4, y, sw, 0);
@ -87,19 +87,13 @@ void menuRadioDiagKeys(event_t event)
#endif
}
#if defined(FUNCTION_SWITCHES) && defined(DEBUG)
lcdDrawText(LCD_W / 2 , LCD_H - 2 * FH, "Phys");
lcdDrawText(LCD_W / 2 , LCD_H - 1 * FH, "Log");
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) {
lcdDrawNumber(LCD_W / 2 + 20 + (i + 1) * FW , LCD_H - 2 * FH, getFSPhysicalState(i));
lcdDrawNumber(LCD_W / 2 + 20 + (i + 1) * FW , LCD_H - 1 * FH, getFSLogicalState(i));
}
#if defined(ROTARY_ENCODER_NAVIGATION)
lcdDrawText(0, LCD_H - FH + 1, STR_ROTARY_ENCODER);
lcdDrawNumber(5*FW+FWNUM+2, LCD_H - FH + 1, rotencValue / ROTARY_ENCODER_GRANULARITY, RIGHT);
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
coord_t y = LCD_H - FH - 1;
lcdDrawText(0, y, STR_ROTARY_ENCODER);
lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue / ROTARY_ENCODER_GRANULARITY, RIGHT);
#if FUNCTION_SWITCHES > 0
lcdDrawText(LCD_W / 2, LCD_H - FH + 1, "FS");
lcdDrawNumber(LCD_W / 2 + 2 * FW , LCD_H - FH + 1, getFunctionSwitchesStates());
#endif
}

View file

@ -42,10 +42,11 @@ enum AboutScreens {
#define ABOUT_X 2
#define ABOUT_INDENT 4
#if defined(KEYS_GPIO_REG_PAGEDN)
// TODO duplicated code here
#if defined(HARDWARE_KEY_PAGEUP)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
#elif defined(NAVIGATION_X7)
#elif defined(HARDWARE_KEY_PAGE)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#else

View file

@ -315,8 +315,8 @@ void displayVoltageOrAlarm()
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT
#define EVT_KEY_MODEL_MENU EVT_KEY_BREAK(KEY_MODEL)
#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_SYS)
#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_GENERAL_MENU EVT_KEY_BREAK(KEY_SYS)
#define EVT_KEY_TELEMETRY EVT_KEY_BREAK(KEY_TELE)
#elif defined(NAVIGATION_X7)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)

View file

@ -41,18 +41,16 @@ void menuStatisticsView(event_t event)
chainMenu(menuStatisticsDebug);
break;
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(KEYS_GPIO_REG_PAGEUP)
// TODO case EVT_KEY_PREVIOUS_VIEW:
#if defined(HARDWARE_KEY_PAGEUP)
case EVT_KEY_BREAK(KEY_PAGEUP):
killEvents(event);
chainMenu(menuStatisticsDebug2);
#elif defined(NAVIGATION_X7)
#elif defined(HARDWARE_KEY_PAGE)
case EVT_KEY_LONG(KEY_PAGE):
#else
case EVT_KEY_FIRST(KEY_DOWN):
#endif
killEvents(event);
chainMenu(menuStatisticsDebug2);
#else
chainMenu(menuStatisticsDebug);
#endif
break;
#if !defined(PCBTARANIS)
@ -153,11 +151,13 @@ void menuStatisticsDebug(event_t event)
break;
#endif
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(KEYS_GPIO_REG_PAGEUP)
// TODO case EVT_KEY_PREVIOUS_VIEW:
#if defined(HARDWARE_KEY_PAGEUP)
case EVT_KEY_BREAK(KEY_PAGEUP):
#elif defined(NAVIGATION_X7)
#elif defined(HARDWARE_KEY_PAGE)
case EVT_KEY_LONG(KEY_PAGE):
#else
case EVT_KEY_FIRST(KEY_DOWN):
#endif
killEvents(event);
disableVBatBridge();
@ -285,20 +285,23 @@ void menuStatisticsDebug2(event_t event)
telemetryErrors = 0;
break;
case EVT_KEY_FIRST(KEY_UP):
#if defined(KEYS_GPIO_REG_PAGEDN)
// TODO EVT_KEY_PREVIOUS_VIEW
#if defined(HARDWARE_KEY_PAGEDN)
case EVT_KEY_BREAK(KEY_PAGEDN):
#elif defined(NAVIGATION_X7)
#elif defined(HARDWARE_KEY_PAGE)
case EVT_KEY_BREAK(KEY_PAGE):
#else
case EVT_KEY_FIRST(KEY_UP):
#endif
chainMenu(menuStatisticsView);
return;
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(HARDWARE_KEY_PAGEUP)
case EVT_KEY_BREAK(KEY_PAGEUP):
#elif defined(NAVIGATION_X7)
#elif defined(HARDWARE_KEY_PAGE)
case EVT_KEY_LONG(KEY_PAGE):
#else
case EVT_KEY_FIRST(KEY_DOWN):
#endif
killEvents(event);
chainMenu(menuStatisticsDebug);

View file

@ -229,8 +229,6 @@ enum {
#if defined(PCBX9E)
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#elif defined(RADIO_TPRO)
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#elif defined(RADIO_T12)
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW
#elif NUM_SWITCHES == 9
@ -529,6 +527,14 @@ void menuRadioHardware(event_t event)
#endif
{
int index = k - ITEM_RADIO_HARDWARE_SA;
#if defined(STORAGE_SWITCH_E) && !defined(HARDWARE_SWITCH_E)
if (index >= SW_SE)
index++;
#endif
#if defined(STORAGE_SWITCH_G) && !defined(HARDWARE_SWITCH_G)
if (index >= SW_SG)
index++;
#endif
int config = SWITCH_CONFIG(index);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH - MIXSRC_Rud + index + 1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && s_editMode > 0 && menuHorizontalPosition == 0))

View file

@ -299,15 +299,15 @@ void menuRadioSdManager(event_t _event)
#endif
if (_event == EVT_ENTRY) {
f_chdir(ROOT_PATH);
f_chdir(ROOT_PATH);
#if LCD_W >= 212
lastPos = -1;
lastPos = -1;
#endif
}
if (_event == EVT_ENTRY || _event == EVT_ENTRY_UP) {
memclear(&reusableBuffer.sdManager, sizeof(reusableBuffer.sdManager));
REFRESH_FILES();
memclear(&reusableBuffer.sdManager, sizeof(reusableBuffer.sdManager));
REFRESH_FILES();
}
#if defined(PXX2)

View file

@ -21,10 +21,15 @@
#include "opentx.h"
#if defined(PCBTARANIS) || defined(PCBHORUS)
uint8_t switchToMix(uint8_t source)
uint8_t switchToMix(uint8_t swsrc)
{
div_t qr = div(source-1, 3);
return qr.quot+MIXSRC_FIRST_SWITCH;
#if FUNCTION_SWITCHES > 0
if (swsrc >= SWSRC_FIRST_FUNCTION_SWITCH) {
return MIXSRC_FIRST_FS_SWITCH + swsrc - SWSRC_FIRST_FUNCTION_SWITCH;
}
#endif
div_t qr = div(swsrc - 1, 3);
return MIXSRC_FIRST_SWITCH + qr.quot;
}
#else
uint8_t switchToMix(uint8_t source)
@ -317,10 +322,6 @@ bool isSwitchAvailable(int swtch, SwitchContext context)
return false;
}
if (IS_SWITCH_FS(swinfo.quot) && context == GeneralCustomFunctionsContext) {
return false; // FS are defined at model level, and cannot be in global functions
}
if (!IS_CONFIG_3POS(swinfo.quot)) {
if (negative) {
return false;

View file

@ -102,21 +102,21 @@ void onSourceLongEnterPress(const char * result)
#if defined(NAVIGATION_HORUS)
bool check_simple(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuTabSize, int rowcount)
{
return check(event, curr, menuTab, menuTabSize, NULL, 0, rowcount);
return check(event, curr, menuTab, menuTabSize, nullptr, 0, rowcount);
}
bool check_submenu_simple(event_t event, uint8_t rowcount)
{
return check_simple(event, 0, NULL, 0, rowcount);
return check_simple(event, 0, nullptr, 0, rowcount);
}
#else
void check_simple(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuTabSize, vertpos_t rowcount)
{
check(event, curr, menuTab, menuTabSize, nullptr, 0, rowcount);
}
void check_submenu_simple(event_t event, uint8_t rowcount)
{
check_simple(event, 0, nullptr, 0, rowcount);
}
void check_simple(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuTabSize, vertpos_t rowcount)
{
check(event, curr, menuTab, menuTabSize, 0, 0, rowcount);
}
#endif

View file

@ -20,9 +20,9 @@
#include "opentx.h"
int menuVerticalOffset;
int menuVerticalPosition;
int menuHorizontalPosition;
vertpos_t menuVerticalOffset;
vertpos_t menuVerticalPosition;
horzpos_t menuHorizontalPosition;
int8_t s_editMode;
uint8_t noHighlightCounter;
uint8_t menuCalibrationState; // TODO rename this variable
@ -303,23 +303,260 @@ int8_t navigate(event_t event, int count, int rows, int columns, bool loop)
return (prevPosHorz != menuHorizontalPosition || prevPosVert != menuVerticalPosition) ? result : 0;
}
#if 1
uint32_t menuEntryTime;
bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, const uint8_t * horTab, uint8_t horTabMax, int rowcount, uint8_t flags)
{
vertpos_t l_posVert = menuVerticalPosition;
horzpos_t l_posHorz = menuHorizontalPosition;
uint8_t maxcol = MAXCOL(l_posVert);
if (menuTab) {
int cc = curr;
switch (event) {
#if defined(HARDWARE_KEY_PAGEDN)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGE):
#endif
if (s_editMode>0)
break;
if (curr < (menuTabSize-1))
cc = curr + 1;
else
cc = 0;
break;
#if defined(HARDWARE_KEY_PAGEUP)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PAGE):
#endif
if (s_editMode>0)
break;
if (curr > 0)
cc = curr - 1;
else
cc = menuTabSize-1;
killEvents(event);
break;
}
if (!menuCalibrationState && cc != curr) {
chainMenu(menuTab[cc]);
}
drawScreenIndex(curr, menuTabSize, 0);
}
switch (event) {
case EVT_ENTRY:
menuEntryTime = get_tmr10ms();
s_editMode = EDIT_MODE_INIT;
l_posVert = MENU_FIRST_LINE_EDIT(horTab, horTabMax);
l_posHorz = POS_HORZ_INIT(l_posVert);
break;
case EVT_ENTRY_UP:
menuEntryTime = get_tmr10ms();
s_editMode = 0;
l_posHorz = POS_HORZ_INIT(l_posVert);
break;
case EVT_ROTARY_BREAK:
if (s_editMode > 1)
break;
if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) {
l_posHorz = 0;
AUDIO_KEY_PRESS();
}
else if (READ_ONLY_UNLOCKED()) {
s_editMode = (s_editMode<=0);
AUDIO_KEY_PRESS();
}
break;
case EVT_KEY_LONG(KEY_EXIT):
s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same
popMenu();
break;
case EVT_KEY_BREAK(KEY_EXIT):
if (s_editMode > 0) {
s_editMode = 0;
AUDIO_KEY_PRESS();
break;
}
if (l_posHorz >= 0 && (COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {
l_posHorz = -1;
AUDIO_KEY_PRESS();
}
else {
uint8_t posVertInit = MENU_FIRST_LINE_EDIT(horTab, horTabMax);
if (menuVerticalOffset != 0 || l_posVert != posVertInit) {
menuVerticalOffset = 0;
l_posVert = posVertInit;
l_posHorz = POS_HORZ_INIT(l_posVert);
AUDIO_KEY_PRESS();
}
else {
popMenu();
}
}
break;
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_RIGHT:
AUDIO_KEY_PRESS();
// no break
#else
case EVT_KEY_FIRST(KEY_DOWN):
case EVT_KEY_REPT(KEY_DOWN):
#endif
if (s_editMode > 0) break; // TODO it was !=
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {
if (l_posHorz >= 0) {
INC(l_posHorz, 0, maxcol);
break;
}
}
else {
if (l_posHorz < maxcol) {
l_posHorz++;
break;
}
else {
l_posHorz = 0;
}
}
do {
INC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount-1);
} while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert));
s_editMode = 0; // if we go down, we must be in this mode
l_posHorz = POS_HORZ_INIT(l_posVert);
break;
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LEFT:
AUDIO_KEY_PRESS();
// no break
#else
case EVT_KEY_FIRST(KEY_UP):
case EVT_KEY_REPT(KEY_UP):
#endif
if (s_editMode > 0) break; // TODO it was !=
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {
if (l_posHorz >= 0) {
DEC(l_posHorz, 0, maxcol);
break;
}
}
else if (l_posHorz > 0) {
l_posHorz--;
break;
}
else {
l_posHorz = 0xff;
}
do {
DEC(l_posVert, MENU_FIRST_LINE_EDIT(horTab, horTabMax), rowcount-1);
} while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert));
s_editMode = 0; // if we go up, we must be in this mode
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE))
l_posHorz = -1;
else
l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert));
break;
}
int linesCount = rowcount;
if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) {
menuVerticalOffset = 0;
if (horTab) {
linesCount = 0;
for (int i=0; i<rowcount; i++) {
if (i>horTabMax || horTab[i] != HIDDEN_ROW) {
linesCount++;
}
}
}
}
else if (horTab) {
if (rowcount > NUM_BODY_LINES) {
while (1) {
vertpos_t firstLine = 0;
for (int numLines=0; firstLine<rowcount && numLines<menuVerticalOffset; firstLine++) {
if (firstLine>=horTabMax || horTab[firstLine] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert < firstLine) {
menuVerticalOffset--;
}
else {
vertpos_t lastLine = firstLine;
for (int numLines=0; lastLine<rowcount && numLines<NUM_BODY_LINES; lastLine++) {
if (lastLine>=horTabMax || horTab[lastLine] != HIDDEN_ROW) {
numLines++;
}
}
if (l_posVert >= lastLine) {
menuVerticalOffset++;
}
else {
linesCount = menuVerticalOffset + NUM_BODY_LINES;
for (int i=lastLine; i<rowcount; i++) {
if (i>horTabMax || horTab[i] != HIDDEN_ROW) {
linesCount++;
}
}
break;
}
}
}
}
}
else {
if (l_posVert>=NUM_BODY_LINES+menuVerticalOffset) {
menuVerticalOffset = l_posVert-NUM_BODY_LINES+1;
}
else if (l_posVert<menuVerticalOffset) {
menuVerticalOffset = l_posVert;
}
}
menuVerticalPosition = l_posVert;
menuHorizontalPosition = l_posHorz;
return true;
}
#else
bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, const uint8_t * horTab, uint8_t horTabMax, int rowcount, uint8_t flags)
{
uint8_t maxcol = MAXCOL(menuVerticalPosition);
if (menuTab == menuTabModel && event == EVT_KEY_FIRST(KEY_MODEL)) {
killEvents(event);
pushMenu(menuTabMonitors[lastMonitorPage]);
// TODO pushMenu(menuTabMonitors[lastMonitorPage]);
return false;
}
if (menuTab && !menuCalibrationState) {
int cc = curr;
switch (event) {
#if defined(KEYS_GPIO_REG_PGUP)
case EVT_KEY_FIRST(KEY_PGDN):
#if defined(HARDWARE_KEY_PAGEDN)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PGDN):
case EVT_KEY_BREAK(KEY_PAGE):
#endif
if (s_editMode>0)
break;
@ -328,10 +565,10 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
cc = 0;
break;
#if defined(KEYS_GPIO_REG_PGUP)
case EVT_KEY_FIRST(KEY_PGUP):
#if defined(HARDWARE_KEY_PAGEUP)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PGDN):
case EVT_KEY_LONG(KEY_PAGE):
#endif
if (s_editMode>0)
break;
@ -364,7 +601,8 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
break;
case EVT_ROTARY_BREAK:
if (s_editMode > 1) break;
if (s_editMode > 1)
break;
if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) {
menuHorizontalPosition = 0;
AUDIO_KEY_PRESS();
@ -496,10 +734,13 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
numLines++;
}
}
#if defined(ORPHAN_ROW)
if (menuVerticalPosition >= lastLine || HORTAB(firstLine) == ORPHAN_ROW) {
menuVerticalOffset++;
}
else {
else
#endif
{
linesCount = menuVerticalOffset + linesDisplayed;
for (int i=lastLine; i<rowcount; i++) {
if (HORTAB(i) != HIDDEN_ROW) {
@ -523,3 +764,4 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
return true;
}
#endif

View file

@ -21,24 +21,19 @@
#include "opentx.h"
vertpos_t menuVerticalOffset;
vertpos_t menuVerticalPosition;
horzpos_t menuHorizontalPosition;
int8_t s_editMode;
uint8_t noHighlightCounter;
uint8_t menuCalibrationState;
vertpos_t menuVerticalPosition;
horzpos_t menuHorizontalPosition;
int8_t checkIncDec_Ret;
#define DBLKEYS_PRESSED_RGT_LFT(in) (false)
#define DBLKEYS_PRESSED_UP_DWN(in) (false)
#define DBLKEYS_PRESSED_RGT_UP(in) (false)
#define DBLKEYS_PRESSED_LFT_DWN(in) (false)
int8_t checkIncDec_Ret;
extern int checkIncDecSelection;
INIT_STOPS(stops100, 3, -100, 0, 100)
INIT_STOPS(stops1000, 3, -1000, 0, 1000)
INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), CATEGORY_END(-SWSRC_FIRST_TRIM), CATEGORY_END(-SWSRC_LAST_SWITCH+1), 0, CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM-1), CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH-1), SWSRC_LAST)
extern int checkIncDecSelection;
void onSwitchLongEnterPress(const char * result)
{
if (result == STR_MENU_SWITCHES)
@ -53,6 +48,11 @@ void onSwitchLongEnterPress(const char * result)
checkIncDecSelection = SWSRC_INVERT;
}
#define DBLKEYS_PRESSED_RGT_LFT(in) (false)
#define DBLKEYS_PRESSED_UP_DWN(in) (false)
#define DBLKEYS_PRESSED_RGT_UP(in) (false)
#define DBLKEYS_PRESSED_LFT_DWN(in) (false)
int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, const CheckIncDecStops &stops)
{
int newval = val;
@ -214,7 +214,6 @@ tmr10ms_t menuEntryTime;
#define MAXCOL_RAW(row) (horTab ? *(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0)
#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE)))
#define COLATTR(row) (MAXCOL_RAW(row) == (uint8_t)-1 ? (const uint8_t)0 : (const uint8_t)(MAXCOL_RAW(row) & NAVIGATION_LINE_BY_LINE))
#define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0)
void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, const uint8_t * horTab, uint8_t horTabMax, vertpos_t rowcount)
{
@ -226,7 +225,21 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
if (menuTab) {
int cc = curr;
switch (event) {
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(HARDWARE_KEY_PAGEDN)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGE):
#endif
if (s_editMode>0)
break;
if (curr < (menuTabSize-1))
cc = curr + 1;
else
cc = 0;
break;
#if defined(HARDWARE_KEY_PAGEUP)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PAGE):
@ -240,20 +253,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
cc = menuTabSize-1;
killEvents(event);
break;
#if defined(KEYS_GPIO_REG_PAGEDN)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGE):
#endif
if (s_editMode>0)
break;
if (curr < (menuTabSize-1))
cc = curr + 1;
else
cc = 0;
break;
}
if (!menuCalibrationState && cc != curr) {

View file

@ -2136,12 +2136,12 @@ const luaR_value_entry opentxConstants[] = {
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
#elif defined(NAVIGATION_HORUS)
#if defined(KEYS_GPIO_REG_PGUP)
#if defined(HARDWARE_KEY_PAGEUP)
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_BREAK(KEY_PGUP) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PGDN) },
#else
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PGDN) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PGDN) },
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) },
#endif
{ "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MODEL) },
{ "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MODEL) },

View file

@ -349,20 +349,6 @@ getvalue_t getValue(mixsrc_t i)
}
#if defined(PCBTARANIS) || defined(PCBHORUS)
#if defined(FUNCTION_SWITCHES)
else if (i >= MIXSRC_FIRST_SWITCH && i <= MIXSRC_LAST_REGULAR_SWITCH) {
mixsrc_t sw = i - MIXSRC_FIRST_SWITCH;
if (SWITCH_EXISTS(sw)) {
return (switchState(3*sw) ? -1024 : (IS_CONFIG_3POS(sw) && switchState(3*sw+1) ? 0 : 1024));
}
else {
return 0;
}
}
else if (i >= MIXSRC_FIRST_FS_SWITCH && i <= MIXSRC_LAST_SWITCH) {
return getFSLogicalState(i - MIXSRC_FIRST_SWITCH - NUM_REGULAR_SWITCHES) ? +1024 : -1024;
}
#else
else if (i >= MIXSRC_FIRST_SWITCH && i <= MIXSRC_LAST_SWITCH) {
mixsrc_t sw = i - MIXSRC_FIRST_SWITCH;
if (SWITCH_EXISTS(sw)) {
@ -372,7 +358,6 @@ getvalue_t getValue(mixsrc_t i)
return 0;
}
}
#endif
#else
else if (i == MIXSRC_3POS) {
return (getSwitch(SW_ID0+1) ? -1024 : (getSwitch(SW_ID1+1) ? 0 : 1024));
@ -383,6 +368,12 @@ getvalue_t getValue(mixsrc_t i)
}
#endif
#if FUNCTION_SWITCHES > 0
else if (i >= MIXSRC_FIRST_FS_SWITCH && i <= MIXSRC_LAST_FS_SWITCH) {
return getFSLogicalState(i - MIXSRC_FIRST_FS_SWITCH) ? +1024 : -1024;
}
#endif
else if (i <= MIXSRC_LAST_LOGICAL_SWITCH) {
return getSwitch(SWSRC_FIRST_LOGICAL_SWITCH + i - MIXSRC_FIRST_LOGICAL_SWITCH) ? 1024 : -1024;
}

View file

@ -78,23 +78,18 @@
#define MODEL_GVAR_MIN(idx) (CFN_GVAR_CST_MIN + g_model.gvars[idx].min)
#define MODEL_GVAR_MAX(idx) (CFN_GVAR_CST_MAX - g_model.gvars[idx].max)
#if defined(PCBTARANIS) || defined(PCBHORUS)
#define SWITCH_CONFIG(x) (bfGet<swconfig_t>(g_eeGeneral.switchConfig, 2*(x), 2))
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
#define FSWITCH_CONFIG(x) (bfGet<swconfig_t>(g_model.functionSwitchConfig, 2*(x), 2))
#define FSWITCH_GROUP(x) (bfGet<swconfig_t>(g_model.functionSwitchGroup, 2*(x), 2))
#define IS_FSWITCH_GROUP_ON(x) (bfGet<swconfig_t>(g_model.functionSwitchGroup, 2 * NUM_FUNCTIONS_SWITCHES + x, 1))
#define IS_SWITCH_FS(x) (x >= NUM_REGULAR_SWITCHES)
#define SWITCH_EXISTS(x) (IS_SWITCH_FS(x) ? true : (SWITCH_CONFIG(x) != SWITCH_NONE))
#define IS_CONFIG_3POS(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_3POS) : (SWITCH_CONFIG(x) == SWITCH_3POS))
#define IS_CONFIG_TOGGLE(x) (IS_SWITCH_FS(x) ? (FSWITCH_CONFIG(x - NUM_REGULAR_SWITCHES) == SWITCH_TOGGLE) : (SWITCH_CONFIG(x) == SWITCH_TOGGLE))
#else
#define IS_FSWITCH_GROUP_ON(x) (bfGet<swconfig_t>(g_model.functionSwitchGroup, 2 * FUNCTION_SWITCHES + x, 1))
#endif
#if defined(PCBTARANIS) || defined(PCBHORUS)
#define SWITCH_CONFIG(x) (bfGet<swconfig_t>(g_eeGeneral.switchConfig, 2*(x), 2))
#define SWITCH_EXISTS(x) (SWITCH_CONFIG(x) != SWITCH_NONE)
#define IS_CONFIG_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS)
#define IS_CONFIG_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE)
#define IS_SWITCH_FS(x) (false)
#endif
#define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !(IS_CONFIG_TOGGLE(x) || IS_SWITCH_FS(x)))
#define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !(IS_CONFIG_TOGGLE(x)))
#else
#define IS_CONFIG_3POS(x) IS_3POS(x)
#define IS_CONFIG_TOGGLE(x) IS_TOGGLE(x)

View file

@ -169,7 +169,7 @@ void per10ms()
readKeysAndTrims();
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
evalFunctionSwitches();
#endif
@ -436,7 +436,7 @@ void applyDefaultTemplate()
{
defaultInputs(); // calls storageDirty internally
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
g_model.functionSwitchConfig = DEFAULT_FS_CONFIG;
g_model.functionSwitchGroup = DEFAULT_FS_GROUPS;
g_model.functionSwitchStartConfig = DEFAULT_FS_STARTUP_CONFIG;
@ -765,17 +765,29 @@ ls_telemetry_value_t maxTelemValue(source_t channel)
bool inputsMoved()
{
uint8_t sum = 0;
for (uint8_t i=0; i<NUM_STICKS+NUM_POTS+NUM_SLIDERS; i++)
for (uint8_t i=0; i<NUM_STICKS+NUM_POTS+NUM_SLIDERS; i++) {
#if defined(RADIO_FAMILY_TBS)
sum += ((int16_t)anaIn(i) + 4096) >> INAC_STICKS_SHIFT;
#else
sum += anaIn(i) >> INAC_STICKS_SHIFT;
#endif
for (uint8_t i=0; i<NUM_SWITCHES; i++)
}
for (uint8_t i=0; i<STORAGE_NUM_SWITCHES; i++) {
sum += getValue(MIXSRC_FIRST_SWITCH+i) >> INAC_SWITCHES_SHIFT;
}
#if FUNCTION_SWITCHES > 0
for (uint8_t i=0; i<FUNCTION_SWITCHES; i++) {
sum += getValue(MIXSRC_FIRST_FS_SWITCH+i) >> INAC_SWITCHES_SHIFT;
}
#endif
#if defined(GYRO)
for (uint8_t i=0; i<2; i++)
for (uint8_t i=0; i<2; i++) {
sum += getValue(MIXSRC_GYRO1+i) >> INAC_STICKS_SHIFT;
}
#endif
if (abs((int8_t)(sum-inactivity.sum)) > 1) {
@ -1710,7 +1722,7 @@ void opentxStart(const uint8_t startOptions = OPENTX_START_DEFAULT_ARGS)
ALERT(STR_TEST_WARNING, TR_TEST_NOTSAFE, AU_ERROR);
#endif
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
if (!UNEXPECTED_SHUTDOWN()) {
setFSStartupPosition();
}

View file

@ -291,6 +291,13 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_BackSpace, KEY_EXIT,
KEY_Up, KEY_PLUS,
KEY_Down, KEY_MINUS,
#elif defined(RADIO_V10)
KEY_Page_Down, KEY_PAGE,
KEY_Return, KEY_ENTER,
KEY_Up, KEY_UP,
KEY_Down, KEY_DOWN,
KEY_Right, KEY_RIGHT,
KEY_Left, KEY_LEFT,
#elif defined(PCBTARANIS)
KEY_Page_Up, KEY_MENU,
#if defined(HARDWARE_KEY_PAGE)

View file

@ -260,6 +260,9 @@ bool eeLoadGeneral(bool allowFixes)
{
eeLoadGeneralSettingsData();
// to force default settings
// return false;
if (g_eeGeneral.version != EEPROM_VER) {
TRACE("EEPROM version %d instead of %d", g_eeGeneral.version, EEPROM_VER);
#if defined(PCBSKY9X)

View file

@ -767,6 +767,9 @@ bool eeLoadGeneral(bool allowFixes)
}
}
// to force default settings
// return false;
#if defined(PCBX7)
if (g_eeGeneral.variant == 0) {
TRACE("Pre release EEPROM detected, variant %d instead of %d for X7 radio. Loading anyway", g_eeGeneral.variant, EEPROM_VARIANT);

View file

@ -297,7 +297,7 @@ char * getSwitchName(char * dest, swsrc_t idx)
}
else
*dest++ = 'A' + swinfo.quot;
#elif defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_ZORRO) && !defined(RADIO_FAMILY_TBS) && !defined(RADIO_V10)
#elif defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_ZORRO) && !defined(RADIO_FAMILY_TBS)
if (swinfo.quot >= 5)
*dest++ = 'H' + swinfo.quot - 5;
else if (swinfo.quot == 4)
@ -348,6 +348,19 @@ char * getSwitchPositionName(char * dest, swsrc_t idx)
}
#endif // PCBSKY9X
#if FUNCTION_SWITCHES > 0
else if (idx <= SWSRC_LAST_FUNCTION_SWITCH) {
idx -= SWSRC_FIRST_FUNCTION_SWITCH;
if (ZEXIST(g_model.switchNames[idx])) {
zchar2str(dest, g_model.switchNames[idx], LEN_SWITCH_NAME);
dest[LEN_SWITCH_NAME] = '\0';
}
else {
getStringAtIndex(dest, STR_VSRCRAW, idx + MIXSRC_FIRST_FS_SWITCH - MIXSRC_Rud + 1);
}
}
#endif
#if NUM_XPOTS > 0
else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) {
div_t swinfo = div(int(idx - SWSRC_FIRST_MULTIPOS_SWITCH), XPOTS_MULTIPOS_COUNT);

View file

@ -67,7 +67,7 @@ uint8_t potsPos[NUM_XPOTS];
#define SWITCH_POSITION(sw) (switchesPos & ((MASK_CFN_TYPE)1<<(sw)))
#define POT_POSITION(sw) ((potsPos[(sw)/XPOTS_MULTIPOS_COUNT] & 0x0f) == ((sw) % XPOTS_MULTIPOS_COUNT))
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
// Non pushed : SWSRC_Sx0 = -1024 = Sx(up) = state 0
// Pushed : SWSRC_Sx2 = +1024 = Sx(down) = state 1
@ -75,7 +75,7 @@ uint8_t fsPreviousState = 0;
void setFSStartupPosition()
{
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) {
for (uint8_t i = 0; i < FUNCTION_SWITCHES; i++) {
uint8_t startPos = (g_model.functionSwitchStartConfig >> 2 * i) & 0x03;
switch(startPos) {
case FS_START_DOWN:
@ -99,27 +99,29 @@ uint8_t getFSLogicalState(uint8_t index)
return (uint8_t )(bfSingleBitGet(g_model.functionSwitchLogicalState, index) >> (index));
}
uint8_t getFSPhysicalState(uint8_t index)
{
return switchState(((index + NUM_REGULAR_SWITCHES) * 3) + 2) ? 1 : 0;
}
// uint8_t getFSPhysicalState(uint8_t index)
// {
// return switchState(((index + NUM_REGULAR_SWITCHES) * 3) + 2) ? 1 : 0;
// }
uint8_t getFSPreviousPhysicalState(uint8_t index)
bool getFSPreviousPhysicalState(uint8_t index)
{
return (uint8_t )(bfSingleBitGet(fsPreviousState, index) >> (index));
return bfSingleBitGet(fsPreviousState, index) >> index;
}
void evalFunctionSwitches()
{
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) {
uint8_t ledsMask = 0;
uint8_t keysStates = getFunctionSwitchesStates();
for (uint8_t i = 0; i < FUNCTION_SWITCHES; i++) {
if (FSWITCH_CONFIG(i) == SWITCH_NONE) {
fsLedOff(i);
continue;
}
uint8_t physicalState = getFSPhysicalState(i);
auto physicalState = bool(keysStates & (1 << i));
if (physicalState != getFSPreviousPhysicalState(i)) { // FS was moved
if ((FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState == 1) || (FSWITCH_CONFIG(i) == SWITCH_TOGGLE)) {
if ((FSWITCH_CONFIG(i) == SWITCH_2POS && physicalState) || (FSWITCH_CONFIG(i) == SWITCH_TOGGLE)) {
if (IS_FSWITCH_GROUP_ON(FSWITCH_GROUP(i)) != 0) { // In an always on group
g_model.functionSwitchLogicalState |= 1 << i; // Set bit
}
@ -129,7 +131,7 @@ void evalFunctionSwitches()
}
if (FSWITCH_GROUP(i) && physicalState == 1) { // switch is in a group, other in group need to be turned off
for (uint8_t j = 0; j < NUM_FUNCTIONS_SWITCHES; j++) {
for (uint8_t j = 0; j < FUNCTION_SWITCHES; j++) {
if (i == j)
continue;
if (FSWITCH_GROUP(j) == FSWITCH_GROUP(i)) {
@ -142,11 +144,12 @@ void evalFunctionSwitches()
storageDirty(EE_MODEL);
}
if (getFSLogicalState(i))
fsLedOn(i);
else
fsLedOff(i);
if (getFSLogicalState(i)) {
ledsMask |= 1 << i;
}
}
writeFunctionLeds(ledsMask);
}
#endif
@ -562,7 +565,7 @@ bool getSwitch(swsrc_t swtch, uint8_t flags)
result = latencyToggleSwitch;
}
#endif
else if (cs_idx <= (SWSRC_LAST_SWITCH - 3 * NUM_FUNCTIONS_SWITCHES)) {
else if (cs_idx <= SWSRC_LAST_SWITCH) {
#if defined(PCBTARANIS) || defined(PCBHORUS)
if (flags & GETSWITCH_MIDPOS_DELAY)
result = SWITCH_POSITION(cs_idx-SWSRC_FIRST_SWITCH);
@ -573,16 +576,14 @@ bool getSwitch(swsrc_t swtch, uint8_t flags)
#endif
}
#if defined(FUNCTION_SWITCHES)
else if (cs_idx <= SWSRC_LAST_SWITCH) {
div_t qr = div(cs_idx - 3 * NUM_FUNCTIONS_SWITCHES, 3);
auto value = getFSLogicalState(qr.quot + 1);
result = qr.rem == -2 ? 1 - value : value;
#if FUNCTION_SWITCHES > 0
else if (cs_idx <= SWSRC_LAST_FUNCTION_SWITCH) {
result = getFSLogicalState(cs_idx - SWSRC_FIRST_FUNCTION_SWITCH);
}
#endif
#if NUM_XPOTS > 0
else if (cs_idx <= SWSRC_LAST_MULTIPOS_SWITCH) {
result = POT_POSITION(cs_idx-SWSRC_FIRST_MULTIPOS_SWITCH);
result = POT_POSITION(cs_idx - SWSRC_FIRST_MULTIPOS_SWITCH);
}
#endif
else if (cs_idx <= SWSRC_LAST_TRIM) {
@ -647,26 +648,26 @@ swsrc_t getMovedSwitch()
#if defined(PCBTARANIS) || defined(PCBHORUS)
// Switches
for (int i = 0; i < NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES; i++) {
for (int i = 0; i < NUM_SWITCHES; i++) {
if (SWITCH_EXISTS(i)) {
swarnstate_t mask = ((swarnstate_t) 0x03 << (i * 2));
uint8_t prev = (switches_states & mask) >> (i * 2);
uint8_t next = (1024 + getValue(MIXSRC_SA + i)) / 1024;
if (prev != next) {
switches_states = (switches_states & (~mask)) | ((swarnstate_t) next << (i * 2));
result = 1 + (3 * i) + next;
result = SWSRC_FIRST_SWITCH + (3 * i) + next;
}
}
}
#if defined(FUNCTION_SWITCHES)
for (int i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) {
#if FUNCTION_SWITCHES > 0
for (int i = 0; i < FUNCTION_SWITCHES; i++) {
if (FSWITCH_CONFIG(i) != SWITCH_NONE) {
auto prev = (uint8_t )(bfSingleBitGet(fsswitches_states, i) >> (i));
auto prev = uint8_t(bfSingleBitGet(fsswitches_states, i)) >> i;
uint8_t next = getFSLogicalState(i);
if (prev != next) {
fsswitches_states ^= (-next ^ fsswitches_states) & (1 << i);
result = 2 + (3 * (i + NUM_REGULAR_SWITCHES)) + next;
fsswitches_states ^= (1 << i);
result = SWSRC_FIRST_FUNCTION_SWITCH + i;
}
}
}
@ -681,7 +682,7 @@ swsrc_t getMovedSwitch()
uint8_t prev = potsPos[i] & 0x0F;
uint8_t next = anaIn(POT1 + i) / (2 * RESX / calib->count);
if (prev != next) {
result = SWSRC_LAST_SWITCH + i * XPOTS_MULTIPOS_COUNT + next + 1;
result = SWSRC_FIRST_MULTIPOS_SWITCH + (i * XPOTS_MULTIPOS_COUNT) + next;
}
}
}
@ -768,7 +769,7 @@ void checkSwitches()
}
}
#elif defined(PCBTARANIS)
for (int i=0; i < (NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES); i++) {
for (int i=0; i < (NUM_SWITCHES - FUNCTION_SWITCHES); i++) {
if (SWITCH_WARNING_ALLOWED(i) && !(g_model.switchWarningEnable & (1<<i))) {
swarnstate_t mask = ((swarnstate_t)0x03 << (i*2));
if (!((states & mask) == (switches_states & mask))) {
@ -824,7 +825,7 @@ void checkSwitches()
lcdNextPos = SWITCH_WARNING_LIST_X;
#endif
int numWarnings = 0;
for (int i=0; i < (NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES); ++i) {
for (int i=0; i < (NUM_SWITCHES - FUNCTION_SWITCHES); ++i) {
#if defined(COLORLCD)
if (SWITCH_WARNING_ALLOWED(i)) {
unsigned int state = ((g_model.switchWarningState >> (3*i)) & 0x07);

View file

@ -277,16 +277,16 @@ uint32_t readTrims()
uint8_t getFunctionSwitchesStates()
{
//uint32_t value2 = inputValues[1];
uint32_t value1 = inputValues[0];
uint8_t result = 0;
/*if (!(value2 & (1 << INPUT2_FS_1)))
if (!(value1 & (1 << INPUT1_FS_1)))
result |= 1u << 0u;
if (!(value2 & (1 << INPUT2_FS_2)))
if (!(value1 & (1 << INPUT1_FS_2)))
result |= 1u << 1u;
if (!(value2 & (1 << INPUT2_FS_3)))
if (!(value1 & (1 << INPUT1_FS_3)))
result |= 1u << 2u;
if (!(value2 & (1 << INPUT2_FS_4)))
result |= 1u << 3u;*/
if (!(value1 & (1 << INPUT1_FS_4)))
result |= 1u << 3u;
return result;
}

View file

@ -292,10 +292,6 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3)
#if !defined(NUM_FUNCTIONS_SWITCHES)
#define NUM_FUNCTIONS_SWITCHES 0
#endif
void keysInit();
uint32_t switchState(uint8_t index);
uint32_t readKeys();

View file

@ -514,6 +514,10 @@ void boardInit()
{
}
void nca9555Read()
{
}
display_t simuLcdBackupBuf[DISPLAY_BUFFER_SIZE];
void lcdStoreBackupBuffer()
{
@ -782,6 +786,11 @@ void boardOff()
{
}
uint8_t getFunctionSwitchesStates()
{
return 0;
}
#if defined(RADIO_FAMILY_TBS)
void intmoduleStop()
{

View file

@ -54,10 +54,6 @@ void rotaryEncoderEnd();
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define NUM_SWITCHES_POSITIONS 9
#if !defined(NUM_FUNCTIONS_SWITCHES)
#define NUM_FUNCTIONS_SWITCHES 0
#endif
enum EnumKeys
{
KEY_MENU,

View file

@ -147,7 +147,7 @@ elseif(PCB STREQUAL X7)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(LUA_EXPORT lua_export_tpro)
add_definitions(-DFUNCTION_SWITCHES)
add_definitions(-DFUNCTION_SWITCHES=6)
add_definitions(-DRADIO_TPRO)
add_definitions(-DEEPROM_VARIANT=0x4005)
add_definitions(-DMANUFACTURER_JUMPER)
@ -247,7 +247,7 @@ elseif(PCB STREQUAL X7)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF)
option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON)
set(FLAVOUR v10)
set(NAVIGATION_TYPE x7)
set(NAVIGATION_TYPE horus)
set(CPU_TYPE STM32F4)
set(CPU_TYPE_FULL STM32F407xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld)
@ -264,6 +264,7 @@ elseif(PCB STREQUAL X7)
)
add_definitions(-DSTM32F40_41xxx)
add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT)
add_definitions(-DFUNCTION_SWITCHES=4)
set(PXX2 ON)
set(PXX_FREQUENCY "HIGH")
set(BLUETOOTH NO)
@ -516,9 +517,13 @@ set(TARGET_SRC
../common/arm/stm32/adc_driver.cpp
../common/arm/stm32/heartbeat_driver.cpp
../common/arm/stm32/mixer_scheduler_driver.cpp
../common/arm/stm32/sdio_sd.c
)
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
../common/arm/stm32/sdio_sd.c
)
if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
set(TARGET_SRC
${TARGET_SRC}

View file

@ -21,7 +21,6 @@
#ifndef _BOARD_H_
#define _BOARD_H_
#include <inttypes.h>
#include "definitions.h"
#include "opentx_constants.h"
#include "board_common.h"
@ -234,7 +233,7 @@ int sbusGetByte(uint8_t * byte);
// Keys driver
enum EnumKeys
{
#if defined(KEYS_GPIO_REG_SHIFT)
#if defined(HARDWARE_KEY_SHIFT)
KEY_SHIFT,
#endif
@ -242,19 +241,22 @@ enum EnumKeys
KEY_MENU,
#endif
#if defined(HARDWARE_KEY_EXIT)
KEY_EXIT,
KEY_ENTER,
#endif
#if defined(KEYS_GPIO_REG_DOWN)
#if defined(HARDWARE_KEY_DOWN)
KEY_DOWN,
KEY_UP,
#endif
#if defined(KEYS_GPIO_REG_RIGHT) || defined(RADIO_V10)
#if defined(HARDWARE_KEY_RIGHT)
KEY_RIGHT,
KEY_LEFT,
#endif
KEY_ENTER,
#if defined(HARDWARE_KEY_PAGE)
KEY_PAGE,
#endif
@ -322,6 +324,11 @@ enum EnumKeys
#define KEY_MENU KEY_ENTER
#define KEY_MINUS KEY_DOWN
#define KEY_PLUS KEY_UP
#elif defined(NAVIGATION_HORUS)
#define KEY_MODEL KEY_UP
#define KEY_SYS KEY_LEFT
#define KEY_TELE KEY_RIGHT
#define KEY_EXIT KEY_DOWN
#else
#define KEY_UP KEY_PLUS
#define KEY_DOWN KEY_MINUS
@ -347,9 +354,13 @@ enum EnumSwitches
SW_SB,
SW_SC,
SW_SD,
#if defined(STORAGE_SWITCH_E)
SW_SE,
#endif
SW_SF,
#if defined(STORAGE_SWITCH_G)
SW_SG,
#endif
SW_SH,
SW_SI,
SW_SJ,
@ -382,50 +393,37 @@ enum EnumSwitchesPositions
SW_SD0,
SW_SD1,
SW_SD2,
#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12) || defined(RADIO_ZORRO) || defined(RADIO_TPRO)
#if defined(STORAGE_SWITCH_E)
SW_SE0,
SW_SE1,
SW_SE2,
#endif
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_T8) || defined(RADIO_ZORRO) || defined(RADIO_TPRO)
#if defined(STORAGE_SWITCH_F)
SW_SF0,
SW_SF1,
SW_SF2,
#endif
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX9LITES) || defined(RADIO_ZORRO) || defined(RADIO_TPRO)
#if defined(STORAGE_SWITCH_G)
SW_SG0,
SW_SG1,
SW_SG2,
#endif
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12)) || defined(RADIO_T8) || defined(RADIO_ZORRO) || defined(RADIO_TPRO)
#if defined(STORAGE_SWITCH_H)
SW_SH0,
SW_SH1,
SW_SH2,
#endif
#if defined(RADIO_X9DP2019)
#if defined(STORAGE_SWITCH_I)
SW_SI0,
SW_SI1,
SW_SI2,
#endif
#if defined(RADIO_X7ACCESS)
SW_SI0,
SW_SI1,
SW_SI2,
#elif defined(PCBX7) && !defined(RADIO_ZORRO)
SW_SI0,
SW_SI1,
SW_SI2,
#if defined(STORAGE_SWITCH_J)
SW_SJ0,
SW_SJ1,
SW_SJ2,
#endif
#if defined(PCBX9E)
SW_SI0,
SW_SI1,
SW_SI2,
SW_SJ0,
SW_SJ1,
SW_SJ2,
SW_SK0,
SW_SK1,
SW_SK2,
@ -470,14 +468,13 @@ enum EnumSwitchesPositions
#define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#define DEFAULT_POTS_CONFIG (0)
#elif defined(RADIO_TPRO)
#define NUM_SWITCHES 10
#define NUM_FUNCTIONS_SWITCHES 6
#define NUM_REGULAR_SWITCHES (NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES)
#define STORAGE_NUM_SWITCHES 10
#define NUM_SWITCHES 4
#define FUNCTION_SWITCHES 6
#define STORAGE_NUM_SWITCHES 6
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 6) + (SWITCH_TOGGLE << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#define DEFAULT_FS_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_2POS << 2) + (SWITCH_2POS << 0)
#define DEFAULT_FS_GROUPS (1 << 10) + (1 << 8) + (1 << 6) + (1 << 4) + (1 << 2) + (1 << 0) // Set all FS to group 1 to act like a 6pos
#define DEFAULT_FS_STARTUP_CONFIG ((FS_START_PREVIOUS << 10) + (FS_START_PREVIOUS << 8) + (FS_START_PREVIOUS << 6) + (FS_START_PREVIOUS << 4) + (FS_START_PREVIOUS << 2) + FS_START_PREVIOUS << 0) // keep last state by default
#define DEFAULT_FS_STARTUP_CONFIG ((FS_START_PREVIOUS << 10) + (FS_START_PREVIOUS << 8) + (FS_START_PREVIOUS << 6) + (FS_START_PREVIOUS << 4) + (FS_START_PREVIOUS << 2) + (FS_START_PREVIOUS << 0)) // keep last state by default
#define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
#elif defined(RADIO_FAMILY_JUMPER_T12)
#define NUM_SWITCHES 8
@ -506,9 +503,13 @@ enum EnumSwitchesPositions
#define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITH_DETENT << 2) // S1 = pot without detent, S2 = pot with detent
#elif defined(RADIO_V10)
#define NUM_SWITCHES 8
#define STORAGE_NUM_SWITCHES 10
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 18) + (SWITCH_TOGGLE << 16) + (SWITCH_TOGGLE << 14) + (SWITCH_2POS << 10) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_TOGGLE << 12) + (SWITCH_TOGGLE << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 8) + (SLIDER_WITH_DETENT << 10) // S1 = pot with detent, S2 = pot with detent, LS & RS = sliders with detent
#define FUNCTION_SWITCHES 4
#define DEFAULT_FS_CONFIG (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_2POS << 2) + (SWITCH_2POS << 0)
#define DEFAULT_FS_GROUPS (1 << 6) + (1 << 4) + (1 << 2) + (1 << 0) // Set all FS to group 1 to act like a 6pos
#define DEFAULT_FS_STARTUP_CONFIG ((FS_START_PREVIOUS << 6) + (FS_START_PREVIOUS << 4) + (FS_START_PREVIOUS << 2) + (FS_START_PREVIOUS << 0)) // keep last state by default
#elif defined(PCBX7)
#define NUM_SWITCHES 8
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
@ -544,8 +545,8 @@ enum EnumSwitchesPositions
#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
#endif
#if !defined(NUM_FUNCTIONS_SWITCHES)
#define NUM_FUNCTIONS_SWITCHES 0
#if !defined(FUNCTION_SWITCHES)
#define FUNCTION_SWITCHES 0
#endif
#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3)
@ -574,8 +575,10 @@ static const uint8_t switchPosition[][2] = {{0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {
#endif
uint32_t readKeys();
uint32_t readTrims();
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
extern uint8_t fsPreviousState;
uint8_t getFunctionSwitchesStates();
void writeFunctionLeds(uint8_t mask);
void evalFunctionSwitches();
void setFSStartupPosition();
uint8_t getFSLogicalState(uint8_t index);
@ -1026,7 +1029,7 @@ void ledOff();
void ledRed();
void ledGreen();
void ledBlue();
#if defined(FUNCTION_SWITCHES)
#if FUNCTION_SWITCHES > 0
void fsLedOff(uint8_t);
void fsLedOn(uint8_t);
#endif

View file

@ -102,10 +102,10 @@
#elif defined(RADIO_V10)
// PAGE / MENU / EXIT moved to NCA9555
#define HARDWARE_KEY_PAGE
#define HARDWARE_KEY_SYS
#define HARDWARE_KEY_MODEL
#define HARDWARE_KEY_TELE
#define HARDWARE_KEY_EXIT
#define HARDWARE_KEY_UP
#define HARDWARE_KEY_DOWN
#define HARDWARE_KEY_RIGHT
#define HARDWARE_KEY_LEFT
#define KEYS_GPIO_REG_ENTER GPIOE->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10
#elif defined(PCBX7)
@ -640,7 +640,7 @@
#define SWITCHES_GPIO_REG_E GPIOG->IDR
#define SWITCHES_GPIO_PIN_E GPIO_Pin_7 // PG.07
#elif defined(RADIO_V10)
#define STORAGE_SWITCH_E
// #define STORAGE_SWITCH_E
// no SWE
#elif defined(PCBX7)
// no SWE
@ -734,7 +734,8 @@
#define SWITCHES_GPIO_REG_G GPIOG->IDR
#define SWITCHES_GPIO_PIN_G GPIO_Pin_5 // PG.05
#elif defined(RADIO_V10)
#define STORAGE_SWITCH_G
// #define STORAGE_SWITCH_G
// no SWG
#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8)
// no SWG
#else
@ -1433,19 +1434,21 @@
#endif
#if defined(RADIO_V10)
#define FUNCTION_LED1_GPIO GPIOC
#define FUNCTION_LED1_GPIO_PIN LL_GPIO_PIN_4 // PC.04
#define FUNCTION_LED2_GPIO GPIOA
#define FUNCTION_LED2_GPIO_PIN LL_GPIO_PIN_7 // PA.07
#define FUNCTION_LED3_GPIO GPIOE
#define FUNCTION_LED3_GPIO_PIN LL_GPIO_PIN_15 // PE.01
#define FUNCTION_LED4_GPIO GPIOA
#define FUNCTION_LED4_GPIO_PIN LL_GPIO_PIN_15 // PA.15
#define FUNCTION_LED4_GPIO GPIOC
#define FUNCTION_LED4_GPIO_PIN GPIO_Pin_4 // PC.04
#define FUNCTION_LED3_GPIO GPIOA
#define FUNCTION_LED3_GPIO_PIN GPIO_Pin_7 // PA.07
#define FUNCTION_LED2_GPIO GPIOE
#define FUNCTION_LED2_GPIO_PIN GPIO_Pin_1 // PE.01
#define FUNCTION_LED1_GPIO GPIOA
#define FUNCTION_LED1_GPIO_PIN GPIO_Pin_15 // PA.15
#define RESET_FUNCTION_LED(gpio, pin) GPIO_SetBits(gpio, pin)
#define SET_FUNCTION_LED(gpio, pin) GPIO_ResetBits(gpio, pin)
#elif defined(RADIO_TPRO)
#define FS_RCC_AHB1Periph RCC_AHB1Periph_GPIOF
#define GPIO_FSLED_GPIO_ON GPIO_SetBits
#define GPIO_FSLED_GPIO_OFF GPIO_ResetBits
#define FSLED_GPIO GPIOF
#define FS_RCC_AHB1Periph RCC_AHB1Periph_GPIOF
#define RESET_FUNCTION_LED(gpio, pin) GPIO_SetBits(gpio, pin)
#define SET_FUNCTION_LED(gpio, pin) GPIO_ResetBits(gpio, pin)
#define FSLED_GPIO GPIOF
#define FUNCTION_LED1_GPIO_PIN GPIO_Pin_5
#define FUNCTION_LED2_GPIO_PIN GPIO_Pin_4
#define FUNCTION_LED3_GPIO_PIN GPIO_Pin_3

View file

@ -52,6 +52,26 @@ uint32_t readKeys()
result |= 1 << KEY_SYS;
#endif
#if defined(HARDWARE_KEY_LEFT)
if (IS_KEY_PRESSED(LEFT))
result |= 1 << KEY_LEFT;
#endif
#if defined(HARDWARE_KEY_RIGHT)
if (IS_KEY_PRESSED(RIGHT))
result |= 1 << KEY_RIGHT;
#endif
#if defined(HARDWARE_KEY_UP)
if (IS_KEY_PRESSED(UP))
result |= 1 << KEY_UP;
#endif
#if defined(HARDWARE_KEY_DOWN)
if (IS_KEY_PRESSED(DOWN))
result |= 1 << KEY_DOWN;
#endif
#if defined(HARDWARE_KEY_MODEL)
if (IS_KEY_PRESSED(MODEL))
result |= 1 << KEY_MODEL;

View file

@ -43,28 +43,42 @@ void ledInit()
GPIO_Init(LED_BLUE_GPIO, &GPIO_InitStructure);
#endif
#if defined(FUNCTION_SWITCHES)
RCC_AHB1PeriphClockCmd(FS_RCC_AHB1Periph, ENABLE);
#if FUNCTION_SWITCHES > 0
// TODO RCC_AHB1PeriphClockCmd(FS_RCC_AHB1Periph, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = FUNCTION_LED1_GPIO_PIN | FUNCTION_LED2_GPIO_PIN | FUNCTION_LED3_GPIO_PIN | FUNCTION_LED4_GPIO_PIN | FUNCTION_LED5_GPIO_PIN | FUNCTION_LED6_GPIO_PIN;
GPIO_Init(FSLED_GPIO, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = FUNCTION_LED1_GPIO_PIN | FUNCTION_LED2_GPIO_PIN | FUNCTION_LED3_GPIO_PIN | FUNCTION_LED4_GPIO_PIN | FUNCTION_LED5_GPIO_PIN | FUNCTION_LED6_GPIO_PIN;
// GPIO_Init(FSLED_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FUNCTION_LED1_GPIO_PIN;
GPIO_Init(FUNCTION_LED1_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FUNCTION_LED2_GPIO_PIN;
GPIO_Init(FUNCTION_LED2_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FUNCTION_LED3_GPIO_PIN;
GPIO_Init(FUNCTION_LED3_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FUNCTION_LED4_GPIO_PIN;
GPIO_Init(FUNCTION_LED4_GPIO, &GPIO_InitStructure);
#endif
}
#if defined(FUNCTION_SWITCHES)
constexpr uint32_t fsLeds[] = {FUNCTION_LED1_GPIO_PIN, FUNCTION_LED2_GPIO_PIN, FUNCTION_LED3_GPIO_PIN, FUNCTION_LED4_GPIO_PIN, FUNCTION_LED5_GPIO_PIN, FUNCTION_LED6_GPIO_PIN};
#if FUNCTION_SWITCHES > 0
void writeFunctionLeds(uint8_t mask)
{
(mask & 0x01) ? SET_FUNCTION_LED(FUNCTION_LED1_GPIO, FUNCTION_LED1_GPIO_PIN) : RESET_FUNCTION_LED(FUNCTION_LED1_GPIO, FUNCTION_LED1_GPIO_PIN);
(mask & 0x02) ? SET_FUNCTION_LED(FUNCTION_LED2_GPIO, FUNCTION_LED2_GPIO_PIN) : RESET_FUNCTION_LED(FUNCTION_LED2_GPIO, FUNCTION_LED2_GPIO_PIN);
(mask & 0x04) ? SET_FUNCTION_LED(FUNCTION_LED3_GPIO, FUNCTION_LED3_GPIO_PIN) : RESET_FUNCTION_LED(FUNCTION_LED3_GPIO, FUNCTION_LED3_GPIO_PIN);
(mask & 0x08) ? SET_FUNCTION_LED(FUNCTION_LED4_GPIO, FUNCTION_LED4_GPIO_PIN) : RESET_FUNCTION_LED(FUNCTION_LED4_GPIO, FUNCTION_LED4_GPIO_PIN);
}
// constexpr uint32_t fsLeds[] = {FUNCTION_LED1_GPIO_PIN, FUNCTION_LED2_GPIO_PIN, FUNCTION_LED3_GPIO_PIN, FUNCTION_LED4_GPIO_PIN, FUNCTION_LED5_GPIO_PIN, FUNCTION_LED6_GPIO_PIN};
void fsLedOff(uint8_t index)
{
GPIO_FSLED_GPIO_OFF(FSLED_GPIO, fsLeds[index]);
}
void fsLedOn(uint8_t index)
{
GPIO_FSLED_GPIO_ON(FSLED_GPIO, fsLeds[index]);
}
#endif

View file

@ -332,10 +332,6 @@ enum Analogs {
#define STICKS_PWM_ENABLED() false
#endif
#if !defined(NUM_FUNCTIONS_SWITCHES)
#define NUM_FUNCTIONS_SWITCHES 0
#endif
PACK(typedef struct {
uint8_t pcbrev:4;
uint8_t sticksPwmDisabled:1;

View file

@ -313,6 +313,9 @@
#elif defined(RADIO_T8)
#define LEN_VKEYS "\005"
#define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(RADIO_V10)
#define LEN_VKEYS "\005"
#define TR_VKEYS "RTN\0 ""MDL\0 ""TELE\0""SYS\0 ""ENTER""PAGE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -61,7 +61,7 @@
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SI\0""\312SJ\0"
#elif defined(RADIO_V10)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310EX1""\310EX2""\311LS\0""\311RS\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0""\312SW1""\312SW2""\312SW3""\312SW4"
#elif defined(PCBX7)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0"