feat: support for RadioMaster GX12 (#5703)

Co-authored-by: raphaelcoeffic <1050031+raphaelcoeffic@users.noreply.github.com>
Co-authored-by: philmoz <phil.a.mitchell@gmail.com>
Co-authored-by: Peter Feerick <peter.feerick@gmail.com>
This commit is contained in:
3djc
2024-12-13 12:41:38 +10:00
committed by GitHub
co-authored by raphaelcoeffic philmoz Peter Feerick
parent 0f86cd9a95
commit 36cdd93a1a
95 changed files with 2287 additions and 605 deletions
+1
View File
@@ -107,6 +107,7 @@ body:
- Jumper T-Pro
- Jumper T-Pro V2
- RadioMaster Boxer
- RadioMaster GX12
- RadioMaster MT12
- RadioMaster Pocket
- RadioMaster T8
+3 -2
View File
@@ -70,6 +70,7 @@ jobs:
- xlite
- xlites
- mt12
- gx12
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
@@ -103,7 +104,7 @@ jobs:
- t8;zorro;pocket;mt12;commando8
- tlite;tpro;tprov2;tpros;bumblebee;lr3pro
- t20;t20v2;t14
- tx12;tx12mk2;boxer
- tx12;tx12mk2;boxer;gx12
- tx16s
- f16
- v16
@@ -114,7 +115,7 @@ jobs:
- x9e;x9e-hall
- x9lite;x9lites
- xlite;xlites
- mt12
- mt12;gx12
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
+2 -1
View File
@@ -23,7 +23,7 @@ jobs:
- t8;zorro;pocket;mt12;commando8
- tlite;tpro;tprov2;tpros;bumblebee;lr3pro
- t20;t20v2;t14
- tx12;tx12mk2;boxer
- tx12;tx12mk2;boxer;gx12
- tx16s
- f16
- v16
@@ -35,6 +35,7 @@ jobs:
- x9lite;x9lites
- xlite;xlites
- mt12
- gx12
container:
image: ghcr.io/edgetx/edgetx-dev:latest
volumes:
+2
View File
@@ -321,6 +321,8 @@ elseif(PCB STREQUAL X7 AND PCBREV STREQUAL ZORRO)
set(FLAVOUR zorro)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL BOXER)
set(FLAVOUR boxer)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL GX12)
set(FLAVOUR gx12)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL POCKET)
set(FLAVOUR pocket)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL LR3PRO)
+6
View File
@@ -201,6 +201,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_RADIOMASTER_BOXER:
case BOARD_RADIOMASTER_POCKET:
case BOARD_RADIOMASTER_MT12:
case BOARD_RADIOMASTER_GX12:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@@ -260,6 +261,7 @@ int Boards::getFlashSize(Type board)
case BOARD_RADIOMASTER_T8:
case BOARD_RADIOMASTER_POCKET:
case BOARD_RADIOMASTER_MT12:
case BOARD_RADIOMASTER_GX12:
return FSIZE_TARANIS;
case BOARD_HORUS_X12S:
case BOARD_X10:
@@ -620,6 +622,8 @@ QString Boards::getBoardName(Board::Type board)
return "Radiomaster TX16S";
case BOARD_RADIOMASTER_ZORRO:
return "Radiomaster Zorro";
case BOARD_RADIOMASTER_GX12:
return "Radiomaster GX12";
case BOARD_FLYSKY_NV14:
return "FlySky NV14";
case BOARD_FLYSKY_EL18:
@@ -744,6 +748,7 @@ int Boards::getDefaultInternalModules(Board::Type board)
case BOARD_RADIOMASTER_BOXER:
case BOARD_RADIOMASTER_MT12:
case BOARD_RADIOMASTER_POCKET:
case BOARD_RADIOMASTER_GX12:
case BOARD_RADIOMASTER_TX12_MK2:
case BOARD_IFLIGHT_COMMANDO8:
case BOARD_JUMPER_T12MAX:
@@ -786,6 +791,7 @@ void Boards::getBattRange(Board::Type board, int& vmin, int& vmax, unsigned int&
case BOARD_RADIOMASTER_POCKET:
case BOARD_RADIOMASTER_ZORRO:
case BOARD_RADIOMASTER_MT12:
case BOARD_RADIOMASTER_GX12:
case BOARD_JUMPER_T12:
case BOARD_JUMPER_T14:
case BOARD_JUMPER_TPRO:
+7
View File
@@ -72,6 +72,7 @@ namespace Board {
BOARD_RADIOMASTER_TX12,
BOARD_RADIOMASTER_TX12_MK2,
BOARD_RADIOMASTER_BOXER,
BOARD_RADIOMASTER_GX12,
BOARD_RADIOMASTER_T8,
BOARD_JUMPER_TLITE,
BOARD_JUMPER_TLITE_F4,
@@ -590,6 +591,11 @@ inline bool IS_RADIOMASTER_POCKET(Board::Type board)
return board == Board::BOARD_RADIOMASTER_POCKET;
}
inline bool IS_RADIOMASTER_GX12(Board::Type board)
{
return board == Board::BOARD_RADIOMASTER_GX12;
}
inline bool IS_RADIOMASTER_T8(Board::Type board)
{
return board == Board::BOARD_RADIOMASTER_T8;
@@ -629,6 +635,7 @@ inline bool IS_FAMILY_T12(Board::Type board)
board == Board::BOARD_RADIOMASTER_BOXER ||
board == Board::BOARD_RADIOMASTER_MT12 ||
board == Board::BOARD_RADIOMASTER_POCKET ||
board == Board::BOARD_RADIOMASTER_GX12 ||
board == Board::BOARD_RADIOMASTER_T8 ||
board == Board::BOARD_BETAFPV_LR3PRO ||
board == Board::BOARD_IFLIGHT_COMMANDO8;
@@ -781,6 +781,13 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
/* Radiomaster GX12 board */
firmware = new OpenTxFirmware(FIRMWAREID("gx12"), QCoreApplication::translate("Firmware", "Radiomaster GX12"), BOARD_RADIOMASTER_GX12);
addOpenTxCommonOptions(firmware);
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
/* Radiomaster TX16S board */
firmware = new OpenTxFirmware(FIRMWAREID("tx16s"), Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S);
addOpenTxFrskyOptions(firmware);
@@ -144,6 +144,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_RADIOMASTER_MT12:
radioUiWidget = new SimulatedUIWidgetMT12(simulator, this);
break;
case Board::BOARD_RADIOMASTER_GX12:
radioUiWidget = new SimulatedUIWidgetGeneric(simulator, this);
break;
case Board::BOARD_RADIOMASTER_T8:
radioUiWidget = new SimulatedUIWidgetT8(simulator, this);
break;
+2 -1
View File
@@ -44,7 +44,8 @@
["RadioMaster TX12", "tx12-"],
["RadioMaster TX12MK2", "tx12mk2-"],
["RadioMaster TX16S", "tx16s-"],
["RadioMaster Zorro","zorro-"]
["RadioMaster Zorro","zorro-"],
["RadioMaster GX12", "gx12-"]
],
"changelog": "- Major initial bug fixes"
}
@@ -50,6 +50,16 @@ void rgbSetLedColor(uint8_t led, uint8_t r, uint8_t g, uint8_t b)
#endif
}
uint32_t rgbGetLedColor(uint8_t led)
{
return ws2812_get_color(led);
}
bool rgbGetState(uint8_t led)
{
return ws2812_get_state(led);
}
void rgbLedColorApply()
{
ws2812_update(&_led_timer);;
@@ -24,4 +24,6 @@
void rgbLedStart();
void rgbLedStop();
void rgbSetLedColor(unsigned char, unsigned char, unsigned char, unsigned char);
uint32_t rgbGetLedColor(uint8_t led);
bool rgbGetState(unsigned char);
void rgbLedColorApply();
+2 -2
View File
@@ -31,12 +31,12 @@
#include <stdlib.h>
void boardInitSwitches()
__weak void boardInitSwitches()
{
_init_switches();
}
SwitchHwPos boardSwitchGetPosition(uint8_t cat, uint8_t idx)
__weak SwitchHwPos boardSwitchGetPosition(uint8_t cat, uint8_t idx)
{
return stm32_switch_get_position(&_switch_offsets[cat][idx]);
}
+147 -102
View File
@@ -22,6 +22,7 @@
#include <FreeRTOS/include/FreeRTOS.h>
#include <FreeRTOS/include/stream_buffer.h>
#include "hal/serial_driver.h"
#include "edgetx.h"
#include "timers_driver.h"
#include "hal/watchdog_driver.h"
@@ -1045,28 +1046,77 @@ int cliSet(const char **argv)
}
#if defined(ENABLE_SERIAL_PASSTHROUGH)
#if defined(HARDWARE_INTERNAL_MODULE)
static etx_module_state_t *spInternalModuleState = nullptr;
static void spInternalModuleTx(uint8_t* buf, uint32_t len)
static const etx_serial_driver_t* _sp_drv = nullptr;
static void* _sp_ctx = nullptr;
static void _sp_Tx(uint8_t* buf, uint32_t len)
{
auto drv = modulePortGetSerialDrv(spInternalModuleState->tx);
auto ctx = modulePortGetCtx(spInternalModuleState->tx);
while (len > 0) {
drv->sendByte(ctx, *(buf++));
_sp_drv->sendByte(_sp_ctx, *(buf++));
len--;
}
}
static const etx_serial_init spIntmoduleSerialInitParams = {
.baudrate = 0,
.encoding = ETX_Encoding_8N1,
.direction = ETX_Dir_TX_RX,
.polarity = ETX_Pol_Normal,
};
#if defined(HARDWARE_INTERNAL_MODULE) || defined(HARDWARE_EXTERNAL_MODULE)
static etx_module_state_t *spModuleState = nullptr;
static void spModuleInit(int port_n, int baudrate)
{
etx_serial_init params = {
.baudrate = (uint32_t)baudrate,
.encoding = ETX_Encoding_8N1,
.direction = ETX_Dir_TX_RX,
.polarity = ETX_Pol_Normal,
};
spModuleState =
modulePortInitSerial(port_n, ETX_MOD_PORT_UART, &params, false);
_sp_drv = modulePortGetSerialDrv(spModuleState->rx);
_sp_ctx = modulePortGetCtx(spModuleState->rx);
}
static void spModuleDeInit(int port_n)
{
// and stop module
modulePortDeInit(spModuleState);
spModuleState = nullptr;
// power off the module and wait for a bit
modulePortSetPower(port_n, false);
delay_ms(200);
}
#endif // HARDWARE_INTERNAL_MODULE
#if defined(FLYSKY_GIMBAL)
#include "flysky_gimbal_driver.h"
static void spGimbalInit(int port_n, int baudrate)
{
etx_serial_init params = {
.baudrate = (uint32_t)baudrate,
.encoding = ETX_Encoding_8N1,
.direction = ETX_Dir_TX_RX,
.polarity = ETX_Pol_Normal,
};
(void)port_n;
flysky_gimbal_deinit();
auto port = flysky_gimbal_get_port();
_sp_drv = port->uart;
_sp_ctx = _sp_drv->init(port->hw_def, &params);
}
static void spGimbalDeInit(int port_n)
{
(void)port_n;
_sp_drv->deinit(_sp_ctx);
flysky_gimbal_init();
}
#endif
// TODO: use proper method instead
extern bool cdcConnected;
extern uint32_t usbSerialBaudRate(void*);
@@ -1074,121 +1124,116 @@ extern uint32_t usbSerialBaudRate(void*);
int cliSerialPassthrough(const char **argv)
{
const char* port_type = argv[1];
const char* port_num = argv[2];
// 3rd argument (baudrate is optional)
if (!port_type || !port_num) {
if (!port_type) {
cliSerialPrint("%s: missing argument", argv[0]);
return -1;
}
int baudrate = 0;
void (*initCB)(int, int) = nullptr;
void (*deinitCB)(int) = nullptr;
int port_n = 0;
int err = toInt(argv, 2, &port_n);
if (err == -1) return err;
if (err == 0) {
cliSerialPrint("%s: missing port #", argv[0]);
if (!strcmp("rfmod", port_type)) {
// parse port number
if (toInt(argv, 2, &port_n) <= 0) {
cliSerialPrint("%s: invalid or missing port number", argv[0]);
return -1;
}
// 3rd argument (baudrate is optional)
if (toInt(argv, 3, &baudrate) <= 0) {
baudrate = 0;
}
switch(port_n) {
#if defined(HARDWARE_INTERNAL_MODULE)
case INTERNAL_MODULE:
initCB = spModuleInit;
deinitCB = spModuleDeInit;
break;
#endif
// TODO:
// - external module (S.PORT?)
default:
cliSerialPrint("%s: invalid port # '%i'", port_n);
return -1;
}
} else if (!strcmp("gimbals", port_type)) {
#if defined(FLYSKY_GIMBAL)
// 2nd argument (baudrate is optional)
if (toInt(argv, 2, &baudrate) <= 0) {
baudrate = 0;
}
initCB = spGimbalInit;
deinitCB = spGimbalDeInit;
#else
cliSerialPrint("%s: serial gimbals not supported");
return -1;
#endif
} else {
cliSerialPrint("%s: invalid port type '%s'", port_type);
return -1;
}
int baudrate = 0;
err = toInt(argv, 3, &baudrate);
if (err <= 0) {
// stop pulses
watchdogSuspend(200/*2s*/);
pulsesStop();
// suspend RTOS scheduler
vTaskSuspendAll();
if (baudrate <= 0) {
// use current baudrate
baudrate = cliGetBaudRate();
if (!baudrate) {
// default to 115200
baudrate = 115200;
cliSerialPrint("%s: baudrate is 0, default to 115200", argv[0]);
}
}
if (!strcmp("rfmod", port_type)) {
if (initCB) initCB(port_n, baudrate);
if (port_n >= NUM_MODULES
// only internal module supported for now
&& port_n != INTERNAL_MODULE) {
cliSerialPrint("%s: invalid port # '%s'", port_num);
return -1;
}
// stop pulses
watchdogSuspend(200/*2s*/);
pulsesStop();
if (_sp_drv != nullptr) {
auto backupCB = cliReceiveCallBack;
cliReceiveCallBack = _sp_Tx;
// suspend RTOS scheduler
vTaskSuspendAll();
// loop until cable disconnected
while (usbPlugged()) {
#if defined(HARDWARE_INTERNAL_MODULE)
if (port_n == INTERNAL_MODULE) {
// setup serial com
// TODO: '8n1' param
etx_serial_init params(spIntmoduleSerialInitParams);
params.baudrate = baudrate;
spInternalModuleState = modulePortInitSerial(port_n, ETX_MOD_PORT_UART,
&params, false);
auto drv = modulePortGetSerialDrv(spInternalModuleState->rx);
auto ctx = modulePortGetCtx(spInternalModuleState->rx);
// backup and swap CLI input
auto backupCB = cliReceiveCallBack;
cliReceiveCallBack = spInternalModuleTx;
// loop until cable disconnected
while (usbPlugged()) {
uint32_t cli_br = cliGetBaudRate();
if (cli_br && (cli_br != (uint32_t)baudrate)) {
baudrate = cli_br;
drv->setBaudrate(ctx, baudrate);
}
uint8_t data;
if (drv->getByte(ctx, &data) > 0) {
uint8_t timeout = 10; // 10 ms
while(!usbSerialFreeSpace() && (timeout > 0)) {
delay_ms(1);
timeout--;
}
cliSerialPutc(data);
}
// keep us up & running
WDG_RESET();
uint32_t cli_br = cliGetBaudRate();
if (cli_br && (cli_br != (uint32_t)baudrate)) {
baudrate = cli_br;
_sp_drv->setBaudrate(_sp_ctx, baudrate);
}
// restore callsbacks
cliReceiveCallBack = backupCB;
uint8_t data;
if (_sp_drv->getByte(_sp_ctx, &data) > 0) {
uint8_t timeout = 10; // 10 ms
while(!usbSerialFreeSpace() && (timeout > 0)) {
delay_ms(1);
timeout--;
}
// and stop module
modulePortDeInit(spInternalModuleState);
spInternalModuleState = nullptr;
cliSerialPutc(data);
}
// power off the module and wait for a bit
modulePortSetPower(port_n, false);
delay_ms(200);
// keep us up & running
WDG_RESET();
}
#endif
// TODO:
// - external module (S.PORT?)
watchdogSuspend(200/*2s*/);
pulsesStart();
// suspend RTOS scheduler
xTaskResumeAll();
} else {
cliSerialPrint("%s: invalid port type '%s'", port_type);
return -1;
// restore callsbacks
cliReceiveCallBack = backupCB;
if (deinitCB != nullptr) deinitCB(port_n);
}
watchdogSuspend(200/*2s*/);
pulsesStart();
// suspend RTOS scheduler
xTaskResumeAll();
return 0;
}
#endif
@@ -1626,7 +1671,7 @@ const CliCommand cliCommands[] = {
{ "reboot", cliReboot, "[wdt]" },
{ "set", cliSet, "<what> <value>" },
#if defined(ENABLE_SERIAL_PASSTHROUGH)
{ "serialpassthrough", cliSerialPassthrough, "<port type> <port number>"},
{ "serialpassthrough", cliSerialPassthrough, "<port type> [<port number>] [<baudrate>]"},
#endif
#if defined(DEBUG)
{ "print", cliDisplay, "<address> [<size>] | <what>" },
+2
View File
@@ -96,6 +96,8 @@ static inline void check_struct()
CHKSIZE(ModelData, 6329);
#elif defined(RADIO_FAMILY_T20)
CHKSIZE(ModelData, 6390);
#elif defined(RADIO_GX12)
CHKSIZE(ModelData, 6390);
#elif defined(PCBX9E)
CHKSIZE(ModelData, 6771);
#elif defined(PCBX9D) || defined(PCBX9DP)
+27 -2
View File
@@ -31,6 +31,7 @@
#include "serial.h"
#include "usb_joystick.h"
#include "input_mapping.h"
#include "debug.h"
#if defined(PCBTARANIS)
#define N_TARANIS_FIELD(x)
@@ -626,13 +627,37 @@ PACK(struct CustomScreenData {
#define SCRIPT_DATA
#endif
struct RGBLedColor {
uint8_t r;
uint8_t g;
uint8_t b;
uint32_t getColor() {
return ((r << 16) + (g << 8) + b);
}
void setColor(uint32_t color) {
r = color >> 16;
g = color >> 8;
b = color;
}
};
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
#define FUNCTION_SWITCHS_RGB_LEDS_FIELDS \
RGBLedColor functionSwitchLedONColor[NUM_FUNCTIONS_SWITCHES]; \
RGBLedColor functionSwitchLedOFFColor[NUM_FUNCTIONS_SWITCHES];
#else
#define FUNCTION_SWITCHS_RGB_LEDS_FIELDS
#endif
#if defined(FUNCTION_SWITCHES)
#define FUNCTION_SWITCHS_FIELDS \
uint16_t functionSwitchConfig; \
uint16_t functionSwitchGroup; \
uint16_t functionSwitchStartConfig; \
uint8_t functionSwitchLogicalState; \
char switchNames[NUM_FUNCTIONS_SWITCHES][LEN_SWITCH_NAME];
uint8_t functionSwitchLogicalState; \
char switchNames[NUM_FUNCTIONS_SWITCHES][LEN_SWITCH_NAME]; \
FUNCTION_SWITCHS_RGB_LEDS_FIELDS
#else
#define FUNCTION_SWITCHS_FIELDS
#endif
-2
View File
@@ -1365,8 +1365,6 @@ void edgeTxInit()
menuHandlers[1] = menuModelSelect;
#endif
switchInit();
#if defined(GUI) && !defined(COLORLCD)
lcdRefreshWait();
lcdClear();
+90 -4
View File
@@ -24,6 +24,7 @@
#include "hal/adc_driver.h"
#include "hal/switch_driver.h"
#include "hal/module_port.h"
#include "hal/rgbleds.h"
#include "switches.h"
#if defined(USBJ_EX)
@@ -70,7 +71,30 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_TIMER3_PERSISTENT,
ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP,
ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP,
#if defined(FUNCTION_SWITCHES)
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
ITEM_MODEL_SETUP_LABEL,
ITEM_MODEL_SETUP_SW1,
ITEM_MODEL_SETUP_SW1_COLOR,
ITEM_MODEL_SETUP_SW2,
ITEM_MODEL_SETUP_SW2_COLOR,
ITEM_MODEL_SETUP_SW3,
ITEM_MODEL_SETUP_SW3_COLOR,
ITEM_MODEL_SETUP_SW4,
ITEM_MODEL_SETUP_SW4_COLOR,
ITEM_MODEL_SETUP_SW5,
ITEM_MODEL_SETUP_SW5_COLOR,
ITEM_MODEL_SETUP_SW6,
ITEM_MODEL_SETUP_SW6_COLOR,
ITEM_MODEL_SETUP_GROUP1_LABEL,
ITEM_MODEL_SETUP_GROUP1_ALWAYS_ON,
ITEM_MODEL_SETUP_GROUP1_START,
ITEM_MODEL_SETUP_GROUP2_LABEL,
ITEM_MODEL_SETUP_GROUP2_ALWAYS_ON,
ITEM_MODEL_SETUP_GROUP2_START,
ITEM_MODEL_SETUP_GROUP3_LABEL,
ITEM_MODEL_SETUP_GROUP3_ALWAYS_ON,
ITEM_MODEL_SETUP_GROUP3_START,
#elif defined(FUNCTION_SWITCHES)
ITEM_MODEL_SETUP_LABEL,
ITEM_MODEL_SETUP_SW1,
ITEM_MODEL_SETUP_SW2,
@@ -354,7 +378,30 @@ inline uint8_t TIMER_ROW(uint8_t timer, uint8_t value)
#define EXTRA_MODULE_ROWS
#if defined(FUNCTION_SWITCHES)
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
#define FUNCTION_SWITCHES_ROWS 1, \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(1), \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(1), \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(1), \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(1), \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(1), \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(1), \
FS_ROW(G1_ROW(LABEL())), \
FS_ROW(G1_ROW(0)), \
FS_ROW(G1_ROW(0)), \
FS_ROW(G2_ROW(LABEL())), \
FS_ROW(G2_ROW(0)), \
FS_ROW(G2_ROW(0)), \
FS_ROW(G3_ROW(LABEL())), \
FS_ROW(G3_ROW(0)), \
FS_ROW(G3_ROW(0)),
#elif defined(FUNCTION_SWITCHES)
#define FUNCTION_SWITCHES_ROWS 1, \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
FS_ROW(NAVIGATION_LINE_BY_LINE|3), \
@@ -838,9 +885,15 @@ void menuModelSetup(event_t event)
case ITEM_MODEL_SETUP_SW5:
case ITEM_MODEL_SETUP_SW6:
{
int index = k - ITEM_MODEL_SETUP_SW1;
int index = (k - ITEM_MODEL_SETUP_SW1) / 2;
lcdDrawSizedText(INDENT_WIDTH, y, STR_CHAR_SWITCH, 2, menuHorizontalPosition < 0 ? attr : 0);
lcdDrawText(lcdNextPos, y, switchGetName(index+switchGetMaxSwitches()), menuHorizontalPosition < 0 ? attr : 0);
// TODO: restore following line when switchGetName(index+switchGetMaxSwitches()) doesn't crash anymore
//lcdDrawText(lcdNextPos, y, switchGetName(index+switchGetMaxSwitches()), menuHorizontalPosition < 0 ? attr : 0);
// TODO : delete next 2 lines when switchGetName(index+switchGetMaxSwitches()) doesn't crash anymore
lcdDrawText(lcdNextPos, y, "SW", menuHorizontalPosition < 0 ? attr : 0);
lcdDrawChar(lcdNextPos, y, '1' + index, 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, 0, old_editMode);
@@ -892,6 +945,39 @@ void menuModelSetup(event_t event)
break;
}
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
case ITEM_MODEL_SETUP_SW1_COLOR:
case ITEM_MODEL_SETUP_SW2_COLOR:
case ITEM_MODEL_SETUP_SW3_COLOR:
case ITEM_MODEL_SETUP_SW4_COLOR:
case ITEM_MODEL_SETUP_SW5_COLOR:
case ITEM_MODEL_SETUP_SW6_COLOR:
{
int index = (k - ITEM_MODEL_SETUP_SW1_COLOR) / 2;
uint8_t selectedColor = 0;
// ON
selectedColor = getRGBColorIndex(g_model.functionSwitchLedONColor[index].getColor());
selectedColor = editChoice(INDENT_WIDTH + getTextWidth(STR_FS_ON_COLOR) + 2, y, STR_FS_ON_COLOR, \
STR_FS_COLOR_LIST, selectedColor, 0, (sizeof(colorTable) / sizeof(colorTable[0])) - 1, menuHorizontalPosition == 0 ? attr : 0, event, INDENT_WIDTH);
if (attr && menuHorizontalPosition == 0 && checkIncDec_Ret) {
g_model.functionSwitchLedONColor[index].setColor(colorTable[selectedColor]);
storageDirty(EE_MODEL);
}
// OFF
selectedColor = getRGBColorIndex(g_model.functionSwitchLedOFFColor[index].getColor());
selectedColor = editChoice((30 + 5*FW) + getTextWidth(STR_FS_OFF_COLOR) + 2, y, STR_FS_OFF_COLOR, \
STR_FS_COLOR_LIST, selectedColor, 0, (sizeof(colorTable) / sizeof(colorTable[0])) - 1, menuHorizontalPosition == 1 ? attr : 0, event, 30 + 5*FW);
if (attr && menuHorizontalPosition == 1 && checkIncDec_Ret) {
g_model.functionSwitchLedOFFColor[index].setColor(colorTable[selectedColor]);
storageDirty(EE_MODEL);
}
break;
}
#endif
case ITEM_MODEL_SETUP_GROUP1_LABEL:
case ITEM_MODEL_SETUP_GROUP2_LABEL:
case ITEM_MODEL_SETUP_GROUP3_LABEL:
+12 -1
View File
@@ -24,6 +24,7 @@
#include "hal/switch_driver.h"
#include "hal/key_driver.h"
#include "switches.h"
#include "boards/generic_stm32/rgb_leds.h"
void displayKeyState(uint8_t x, uint8_t y, uint8_t key)
{
@@ -54,9 +55,15 @@ static EnumKeys get_ith_key(uint8_t i)
#if defined(FUNCTION_SWITCHES)
void menuRadioDiagFS(event_t event)
{
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
constexpr coord_t FS_1ST_COLUMN = 32;
constexpr coord_t FS_2ND_COLUMN = 60;
constexpr coord_t FS_3RD_COLUMN = 80;
#else
constexpr coord_t FS_1ST_COLUMN = 40;
constexpr coord_t FS_2ND_COLUMN = 70;
constexpr coord_t FS_3RD_COLUMN = 100;
#endif
SIMPLE_SUBMENU(STR_MENU_FSWITCH, 1);
lcdDrawText(FS_1ST_COLUMN, MENU_HEADER_HEIGHT + 1, "Phys");
lcdDrawText(FS_2ND_COLUMN, MENU_HEADER_HEIGHT + 1, "Log");
@@ -68,7 +75,11 @@ void menuRadioDiagFS(event_t event)
lcdDrawText(lcdNextPos, y, switchGetName(i+switchGetMaxSwitches()), 0);
lcdDrawText(FS_1ST_COLUMN + 7, y, getFSPhysicalState(i) ? STR_CHAR_DOWN : STR_CHAR_UP);
lcdDrawText(FS_2ND_COLUMN + 5, y, getFSLogicalState(i) ? STR_CHAR_DOWN : STR_CHAR_UP);
lcdDrawText(FS_3RD_COLUMN, y, STR_OFFON[getFSLedState(i)]);
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
lcdDrawText(FS_3RD_COLUMN, y, STR_FS_COLOR_LIST[getRGBColorIndex(rgbGetLedColor(i))], 0);
#else
lcdDrawText(FS_3RD_COLUMN, y, STR_OFFON[fsLedState(i)]);
#endif
}
}
#endif
+13 -6
View File
@@ -20,6 +20,8 @@
*/
#include "edgetx.h"
#include "hal/rgbleds.h"
#include "boards/generic_stm32/rgb_leds.h"
#define SLEEP_BITMAP_WIDTH 42
@@ -52,9 +54,14 @@ void drawStartupAnimation(uint32_t duration, uint32_t totalDuration)
for (uint8_t j = 0; j < steps; j++) {
if (index2 > j) {
fsLedOn(j);
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
fsLedRGB(j, 0xFFFFFF);
rgbLedColorApply();
#else
setFSLedON(j);
#endif
#if defined(RADIO_FAMILY_T20)
fsLedOn(j + steps);
setFSLedON(j + steps);
#endif
}
}
@@ -88,14 +95,14 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration,
steps);
for (uint8_t j = 0; j < steps; j++) {
fsLedOff(j);
setFSLedOFF(j);
#if defined(RADIO_FAMILY_T20)
fsLedOff(j + steps);
setFSLedOFF(j + steps);
#endif
if (steps - index2 > j) {
fsLedOn(j);
setFSLedON(j);
#if defined(RADIO_FAMILY_T20)
fsLedOn(j + steps);
setFSLedON(j + steps);
#endif
}
}
@@ -26,6 +26,13 @@
#include "edgetx.h"
#include "strhelpers.h"
#include "switches.h"
#include "color_picker.h"
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
static constexpr coord_t LH = 72;
#else
static constexpr coord_t LH = 36;
#endif
#define SET_DIRTY() storageDirty(EE_MODEL)
@@ -116,6 +123,37 @@ class FunctionSwitch : public Window
SET_DIRTY();
});
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
new StaticText(this, {8 , 6 + 36, SW_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_FS_OFF_COLOR, COLOR_THEME_PRIMARY1);
auto offcolor = new ColorPicker(
this, rect_t{},
[=]() -> int { // getValue
return g_model.functionSwitchLedOFFColor[switchIndex];
},
[=](int newValue) { // setValue
g_model.functionSwitchLedOFFColor[switchIndex] =
(uint32_t)newValue;
TRACE("Color: %x", g_model.functionSwitchLedOFFColor[switchIndex]);
SET_DIRTY();
});
offcolor->setPos(NM_X, 36);
new StaticText(this, {TP_X, 6 + 36, SW_W, EdgeTxStyles::PAGE_LINE_HEIGHT}, STR_FS_ON_COLOR, COLOR_THEME_PRIMARY1);
auto oncolor = new ColorPicker(
this, rect_t{},
[=]() -> int { // getValue
return g_model.functionSwitchLedONColor[switchIndex];
},
[=](int newValue) { // setValue
g_model.functionSwitchLedONColor[switchIndex] =
(uint32_t)newValue;
SET_DIRTY();
});
oncolor->setPos(GR_X, 36);
#endif //FUNCTION_SWITCHES_RGB_LEDS
setState();
}
@@ -23,6 +23,7 @@
#include "radio_diagcustswitches.h"
#include "hal/rgbleds.h"
#include "board.h"
#include "libopenui.h"
#include "edgetx.h"
+6
View File
@@ -13,6 +13,12 @@ set(SRC ${SRC}
hal/switch_driver.cpp
)
if(FUNCTION_SWITCHES)
set(SRC ${SRC}
hal/rgbleds.cpp
)
endif()
if (FLEXSW)
# define the number of allowed flexible adc entries used as switch
add_definitions(-DMAX_FLEX_SWITCHES=${FLEXSW})
+3
View File
@@ -46,3 +46,6 @@ uint32_t abnormalRebootGetCause();
#define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() \
(abnormalRebootGetCause() != ARC_None)
#define WAS_RESET_BY_SOFTWARE() \
(abnormalRebootGetCause() == ARC_Software)
+52
View File
@@ -0,0 +1,52 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "edgetx.h"
#include "rgbleds.h"
#include "boards/generic_stm32/rgb_leds.h"
#include "definitions.h"
#include "dataconstants.h"
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
void setFSLedOFF(uint8_t index) {
fsLedRGB(index, g_model.functionSwitchLedOFFColor[index].getColor());
}
void setFSLedON(uint8_t index) {
fsLedRGB(index, g_model.functionSwitchLedONColor[index].getColor());
}
bool getFSLedState(uint8_t index) {
return rgbGetLedColor(index) == g_model.functionSwitchLedONColor[index].getColor();
}
#else
void setFSLedOFF(uint8_t index) {
fsLedOff(index);
}
void setFSLedON(uint8_t index) {
fsLedOn(index);
}
bool getFSLedState(uint8_t index) {
return fsLedState(index);
}
#endif
+30
View File
@@ -0,0 +1,30 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#pragma once
#include <stdint.h>
// MUST match TR_FS_COLOR_LIST ( "White", "Red", "Green", "Yellow", "Orange", "Blue", "Pink", "Off", Custom gets display when none previous match
constexpr uint32_t colorTable[] = {0xF8F8F8, 0xF80000, 0x00F800, 0xF8F800, 0xF84000, 0x0000F8, 0xF800F8, 0x000000};
void setFSLedOFF(uint8_t index);
void setFSLedON(uint8_t index);
bool getFSLedState(uint8_t index);
+6
View File
@@ -114,6 +114,12 @@ void applyDefaultTemplate()
g_model.functionSwitchGroup = DEFAULT_FS_GROUPS;
g_model.functionSwitchStartConfig = DEFAULT_FS_STARTUP_CONFIG;
g_model.functionSwitchLogicalState = 0;
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
for (uint8_t i = 0; i < NUM_FUNCTIONS_SWITCHES; i++) {
g_model.functionSwitchLedOFFColor[i].setColor(0);
g_model.functionSwitchLedONColor[i].setColor(0xFFFFFF);
}
#endif
#endif
#if defined(COLORLCD)
+1 -1
View File
@@ -365,7 +365,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_Left, KEY_LEFT,
KEY_Up, KEY_UP,
KEY_Down, KEY_DOWN,
#elif defined(RADIO_TX12) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_ZORRO) || defined(RADIO_MT12) || defined(RADIO_POCKET)
#elif defined(NAVIGATION_X7_TX12)
KEY_Page_Up, KEY_PAGEUP,
KEY_Page_Down, KEY_PAGEDN,
KEY_Return, KEY_ENTER,
+2
View File
@@ -31,6 +31,8 @@ elseif(PCB STREQUAL X7)
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tpro.cpp)
elseif((PCBREV STREQUAL T20) OR (PCBREV STREQUAL T20V2))
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_t20.cpp)
elseif(PCBREV STREQUAL GX12)
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_gx12.cpp)
elseif((PCBREV STREQUAL COMMANDO8) OR (PCBREV STREQUAL LR3PRO) OR (PCBREV STREQUAL T8) OR (PCBREV STREQUAL T12) OR (PCBREV STREQUAL TLITE))
set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_xlite.cpp)
else()
@@ -45,6 +45,8 @@
#include "yaml_datastructs_tpro.cpp"
#elif defined(RADIO_FAMILY_T20)
#include "yaml_datastructs_t20.cpp"
#elif defined(RADIO_GX12)
#include "yaml_datastructs_gx12.cpp"
#elif defined(RADIO_COMMANDO8) || defined(RADIO_LR3PRO) || defined(RADIO_T8) || defined(RADIO_T12) || defined(RADIO_TLITE)
#include "yaml_datastructs_xlite.cpp"
#else
@@ -605,7 +605,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -633,7 +633,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -0,0 +1,898 @@
// generated by generate_yaml.py
//
// Enums first
//
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
{ e_backlight_mode_sticks, "backlight_mode_sticks" },
{ e_backlight_mode_all, "backlight_mode_all" },
{ e_backlight_mode_on, "backlight_mode_on" },
{ 0, NULL }
};
const struct YamlIdStr enum_AntennaModes[] = {
{ ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" },
{ ANTENNA_MODE_ASK, "MODE_ASK" },
{ ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" },
{ ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_ModuleType[] = {
{ MODULE_TYPE_NONE, "TYPE_NONE" },
{ MODULE_TYPE_PPM, "TYPE_PPM" },
{ MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" },
{ MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" },
{ MODULE_TYPE_DSM2, "TYPE_DSM2" },
{ MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" },
{ MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" },
{ MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" },
{ MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" },
{ MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" },
{ MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" },
{ MODULE_TYPE_GHOST, "TYPE_GHOST" },
{ MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" },
{ MODULE_TYPE_SBUS, "TYPE_SBUS" },
{ MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" },
{ MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" },
{ MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" },
{ MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" },
{ 0, NULL }
};
const struct YamlIdStr enum_TrainerMultiplex[] = {
{ TRAINER_OFF, "OFF" },
{ TRAINER_ADD, "ADD" },
{ TRAINER_REPL, "REPL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BeeperMode[] = {
{ e_mode_quiet, "mode_quiet" },
{ e_mode_alarms, "mode_alarms" },
{ e_mode_nokeys, "mode_nokeys" },
{ e_mode_all, "mode_all" },
{ 0, NULL }
};
const struct YamlIdStr enum_BluetoothModes[] = {
{ BLUETOOTH_OFF, "OFF" },
{ BLUETOOTH_TELEMETRY, "TELEMETRY" },
{ BLUETOOTH_TRAINER, "TRAINER" },
{ 0, NULL }
};
const struct YamlIdStr enum_Functions[] = {
{ FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" },
{ FUNC_TRAINER, "TRAINER" },
{ FUNC_INSTANT_TRIM, "INSTANT_TRIM" },
{ FUNC_RESET, "RESET" },
{ FUNC_SET_TIMER, "SET_TIMER" },
{ FUNC_ADJUST_GVAR, "ADJUST_GVAR" },
{ FUNC_VOLUME, "VOLUME" },
{ FUNC_SET_FAILSAFE, "SET_FAILSAFE" },
{ FUNC_RANGECHECK, "RANGECHECK" },
{ FUNC_BIND, "BIND" },
{ FUNC_PLAY_SOUND, "PLAY_SOUND" },
{ FUNC_PLAY_TRACK, "PLAY_TRACK" },
{ FUNC_PLAY_VALUE, "PLAY_VALUE" },
{ FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" },
{ FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" },
{ FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" },
{ FUNC_VARIO, "VARIO" },
{ FUNC_HAPTIC, "HAPTIC" },
{ FUNC_LOGS, "LOGS" },
{ FUNC_BACKLIGHT, "BACKLIGHT" },
{ FUNC_SCREENSHOT, "SCREENSHOT" },
{ FUNC_RACING_MODE, "RACING_MODE" },
{ FUNC_SET_SCREEN, "SET_SCREEN" },
{ FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" },
{ FUNC_RGB_LED, "RGB_LED" },
{ FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" },
{ FUNC_TEST, "TEST" },
{ 0, NULL }
};
const struct YamlIdStr enum_TimerModes[] = {
{ TMRMODE_OFF, "OFF" },
{ TMRMODE_ON, "ON" },
{ TMRMODE_START, "START" },
{ TMRMODE_THR, "THR" },
{ TMRMODE_THR_REL, "THR_REL" },
{ TMRMODE_THR_START, "THR_START" },
{ 0, NULL }
};
const struct YamlIdStr enum_MixerMultiplex[] = {
{ MLTPX_ADD, "ADD" },
{ MLTPX_MUL, "MUL" },
{ MLTPX_REPL, "REPL" },
{ 0, NULL }
};
const struct YamlIdStr enum_MixSources[] = {
{ MIXSRC_NONE, "NONE" },
{ MIXSRC_MIN, "MIN" },
{ MIXSRC_MAX, "MAX" },
{ MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" },
{ MIXSRC_TX_TIME, "TX_TIME" },
{ MIXSRC_TX_GPS, "TX_GPS" },
{ 0, NULL }
};
const struct YamlIdStr enum_LogicalSwitchesFunctions[] = {
{ LS_FUNC_NONE, "FUNC_NONE" },
{ LS_FUNC_VEQUAL, "FUNC_VEQUAL" },
{ LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" },
{ LS_FUNC_VPOS, "FUNC_VPOS" },
{ LS_FUNC_VNEG, "FUNC_VNEG" },
{ LS_FUNC_APOS, "FUNC_APOS" },
{ LS_FUNC_ANEG, "FUNC_ANEG" },
{ LS_FUNC_AND, "FUNC_AND" },
{ LS_FUNC_OR, "FUNC_OR" },
{ LS_FUNC_XOR, "FUNC_XOR" },
{ LS_FUNC_EDGE, "FUNC_EDGE" },
{ LS_FUNC_EQUAL, "FUNC_EQUAL" },
{ LS_FUNC_GREATER, "FUNC_GREATER" },
{ LS_FUNC_LESS, "FUNC_LESS" },
{ LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" },
{ LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" },
{ LS_FUNC_TIMER, "FUNC_TIMER" },
{ LS_FUNC_STICKY, "FUNC_STICKY" },
{ 0, NULL }
};
const struct YamlIdStr enum_SwashType[] = {
{ SWASH_TYPE_NONE, "TYPE_NONE" },
{ SWASH_TYPE_120, "TYPE_120" },
{ SWASH_TYPE_120X, "TYPE_120X" },
{ SWASH_TYPE_140, "TYPE_140" },
{ SWASH_TYPE_90, "TYPE_90" },
{ 0, NULL }
};
const struct YamlIdStr enum_SwitchSources[] = {
{ SWSRC_NONE, "NONE" },
{ SWSRC_ON, "ON" },
{ SWSRC_ONE, "ONE" },
{ SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" },
{ SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" },
{ SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" },
{ SWSRC_OFF, "OFF" },
{ 0, NULL }
};
const struct YamlIdStr enum_PotsWarnMode[] = {
{ POTS_WARN_OFF, "WARN_OFF" },
{ POTS_WARN_MANUAL, "WARN_MANUAL" },
{ POTS_WARN_AUTO, "WARN_AUTO" },
{ 0, NULL }
};
const struct YamlIdStr enum_ModelOverridableEnable[] = {
{ OVERRIDE_GLOBAL, "GLOBAL" },
{ OVERRIDE_OFF, "OFF" },
{ OVERRIDE_ON, "ON" },
{ 0, NULL }
};
const struct YamlIdStr enum_FailsafeModes[] = {
{ FAILSAFE_NOT_SET, "NOT_SET" },
{ FAILSAFE_HOLD, "HOLD" },
{ FAILSAFE_CUSTOM, "CUSTOM" },
{ FAILSAFE_NOPULSES, "NOPULSES" },
{ FAILSAFE_RECEIVER, "RECEIVER" },
{ 0, NULL }
};
const struct YamlIdStr enum_TelemetrySensorFormula[] = {
{ TELEM_FORMULA_ADD, "FORMULA_ADD" },
{ TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" },
{ TELEM_FORMULA_MIN, "FORMULA_MIN" },
{ TELEM_FORMULA_MAX, "FORMULA_MAX" },
{ TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" },
{ TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" },
{ TELEM_FORMULA_CELL, "FORMULA_CELL" },
{ TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" },
{ TELEM_FORMULA_DIST, "FORMULA_DIST" },
{ 0, NULL }
};
const struct YamlIdStr enum_TelemetrySensorType[] = {
{ TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" },
{ TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" },
{ 0, NULL }
};
const struct YamlIdStr enum_USBJoystickIfMode[] = {
{ USBJOYS_JOYSTICK, "JOYSTICK" },
{ USBJOYS_GAMEPAD, "GAMEPAD" },
{ USBJOYS_MULTIAXIS, "MULTIAXIS" },
{ 0, NULL }
};
const struct YamlIdStr enum_USBJoystickCh[] = {
{ USBJOYS_CH_NONE, "CH_NONE" },
{ USBJOYS_CH_BUTTON, "CH_BUTTON" },
{ USBJOYS_CH_AXIS, "CH_AXIS" },
{ USBJOYS_CH_SIM, "CH_SIM" },
{ 0, NULL }
};
//
// Structs last
//
static const struct YamlNode struct_CalibData[] = {
YAML_IDX_CUST("calib",r_calib,w_calib),
YAML_SIGNED( "mid", 16 ),
YAML_SIGNED( "spanNeg", 16 ),
YAML_SIGNED( "spanPos", 16 ),
YAML_END
};
static const struct YamlNode struct_signed_16[] = {
YAML_IDX,
YAML_SIGNED( "val", 16 ),
YAML_END
};
static const struct YamlNode struct_TrainerMix[] = {
YAML_IDX,
YAML_UNSIGNED( "srcChn", 6 ),
YAML_ENUM("mode", 2, enum_TrainerMultiplex),
YAML_SIGNED( "studWeight", 8 ),
YAML_END
};
static const struct YamlNode struct_TrainerData[] = {
YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL),
YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL),
YAML_END
};
static const struct YamlNode struct_anonymous_1[] = {
YAML_STRING("name", 8),
YAML_END
};
static const struct YamlNode struct_anonymous_2[] = {
YAML_SIGNED( "val", 16 ),
YAML_UNSIGNED( "mode", 8 ),
YAML_UNSIGNED( "param", 8 ),
YAML_SIGNED( "val2", 32 ),
YAML_END
};
static const struct YamlNode struct_anonymous_3[] = {
YAML_SIGNED( "val1", 32 ),
YAML_SIGNED( "val2", 32 ),
YAML_END
};
static const struct YamlNode union_anonymous_0_elmts[] = {
YAML_STRUCT("play", 64, struct_anonymous_1, NULL),
YAML_STRUCT("all", 64, struct_anonymous_2, NULL),
YAML_STRUCT("clear", 64, struct_anonymous_3, NULL),
YAML_END
};
static const struct YamlNode struct_CustomFunctionData[] = {
YAML_IDX,
YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
YAML_ENUM("func", 6, enum_Functions),
YAML_CUSTOM("def",r_customFn,w_customFn),
YAML_PADDING( 64 ),
YAML_PADDING( 1 ),
YAML_PADDING( 7 ),
YAML_END
};
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_UNSIGNED( "ppmunit", 2 ),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
YAML_PADDING( 16 ),
YAML_SIGNED( "currModel", 8 ),
YAML_UNSIGNED( "contrast", 8 ),
YAML_UNSIGNED( "vBatWarn", 8 ),
YAML_SIGNED( "txVoltageCalibration", 8 ),
YAML_ENUM("backlightMode", 3, enum_BacklightMode),
YAML_ENUM("antennaMode", 2, enum_AntennaModes),
YAML_UNSIGNED( "disableRtcWarning", 1 ),
YAML_UNSIGNED( "keysBacklight", 1 ),
YAML_UNSIGNED( "dontPlayHello", 1 ),
YAML_ENUM("internalModule", 8, enum_ModuleType),
YAML_STRUCT("trainer", 128, struct_TrainerData, NULL),
YAML_UNSIGNED( "view", 8 ),
YAML_PADDING( 2 ),
YAML_UNSIGNED( "fai", 1 ),
YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ),
YAML_UNSIGNED( "alarmsFlash", 1 ),
YAML_UNSIGNED( "disableMemoryWarning", 1 ),
YAML_UNSIGNED( "disableAlarmWarning", 1 ),
YAML_UNSIGNED( "stickMode", 2 ),
YAML_SIGNED( "timezone", 5 ),
YAML_UNSIGNED( "adjustRTC", 1 ),
YAML_UNSIGNED( "inactivityTimer", 8 ),
YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr),
YAML_UNSIGNED( "internalModuleBaudrate", 3 ),
YAML_SIGNED( "splashMode", 3 ),
YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ),
YAML_SIGNED( "switchesDelay", 8 ),
YAML_UNSIGNED( "lightAutoOff", 8 ),
YAML_UNSIGNED( "templateSetup", 8 ),
YAML_SIGNED( "PPM_Multiplier", 8 ),
YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ),
YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ),
YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ),
YAML_UNSIGNED( "gpsFormat", 1 ),
YAML_UNSIGNED( "audioMuteEnable", 1 ),
YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ),
YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ),
YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ),
YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ),
YAML_UNSIGNED( "backlightBright", 8 ),
YAML_UNSIGNED( "globalTimer", 32 ),
YAML_UNSIGNED( "bluetoothBaudrate", 4 ),
YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes),
YAML_UNSIGNED( "countryCode", 2 ),
YAML_SIGNED( "pwrOnSpeed", 3 ),
YAML_SIGNED( "pwrOffSpeed", 3 ),
YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr),
YAML_UNSIGNED( "noJitterFilter", 1 ),
YAML_UNSIGNED( "imperial", 1 ),
YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ),
YAML_UNSIGNED( "USBMode", 2 ),
YAML_UNSIGNED( "jackMode", 2 ),
YAML_PADDING( 1 ),
YAML_STRING("ttsLanguage", 2),
YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ),
YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ),
YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ),
YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ),
YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ),
YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ),
YAML_SIGNED( "varioRepeat", 8 ),
YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active),
YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr),
YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr),
YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr),
YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid),
YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr),
YAML_ARRAY("potsConfig", 4, 8, struct_potConfig, nullptr),
YAML_ARRAY("switchConfig", 2, 32, struct_switchConfig, nullptr),
YAML_ARRAY("flexSwitches", 0, MAX_FLEX_SWITCHES, struct_flexSwitch, flex_sw_valid),
YAML_UNSIGNED( "backlightColor", 8 ),
YAML_STRING("bluetoothName", 10),
YAML_STRING("ownerRegistrationID", 8),
YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr),
YAML_UNSIGNED( "rotEncMode", 3 ),
YAML_SIGNED( "uartSampleMode", 2 ),
YAML_PADDING( 3 ),
YAML_UNSIGNED( "radioGFDisabled", 1 ),
YAML_UNSIGNED( "radioTrainerDisabled", 1 ),
YAML_UNSIGNED( "modelHeliDisabled", 1 ),
YAML_UNSIGNED( "modelFMDisabled", 1 ),
YAML_UNSIGNED( "modelCurvesDisabled", 1 ),
YAML_UNSIGNED( "modelGVDisabled", 1 ),
YAML_UNSIGNED( "modelLSDisabled", 1 ),
YAML_UNSIGNED( "modelSFDisabled", 1 ),
YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ),
YAML_UNSIGNED( "modelTelemetryDisabled", 1 ),
YAML_UNSIGNED( "disableTrainerPoweroffAlarm", 1 ),
YAML_UNSIGNED( "disablePwrOnOffHaptic", 1 ),
YAML_UNSIGNED( "invertLCD", 1 ),
YAML_PADDING( 3 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
YAML_IDX,
YAML_UNSIGNED( "val", 8 ),
YAML_END
};
static const struct YamlNode struct_ModelHeader[] = {
YAML_STRING("name", 10),
YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL),
YAML_END
};
static const struct YamlNode struct_TimerData[] = {
YAML_IDX,
YAML_UNSIGNED( "start", 22 ),
YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
YAML_SIGNED( "value", 22 ),
YAML_ENUM("mode", 3, enum_TimerModes),
YAML_UNSIGNED( "countdownBeep", 2 ),
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_UNSIGNED( "extraHaptic", 1 ),
YAML_PADDING( 6 ),
YAML_STRING("name", 3),
YAML_END
};
static const struct YamlNode struct_CurveRef[] = {
YAML_UNSIGNED( "type", 5 ),
YAML_SIGNED_CUST( "value", 11, r_sourceNumVal, w_sourceNumVal ),
YAML_END
};
static const struct YamlNode struct_MixData[] = {
YAML_UNSIGNED( "destCh", 5 ),
YAML_SIGNED_CUST( "srcRaw", 10, r_mixSrcRawEx, w_mixSrcRawEx ),
YAML_UNSIGNED( "carryTrim", 1 ),
YAML_UNSIGNED( "mixWarn", 2 ),
YAML_ENUM("mltpx", 2, enum_MixerMultiplex),
YAML_UNSIGNED( "delayPrec", 1 ),
YAML_UNSIGNED( "speedPrec", 1 ),
YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ),
YAML_PADDING( 1 ),
YAML_UNSIGNED_CUST( "weight", 11, r_sourceNumVal, w_sourceNumVal ),
YAML_UNSIGNED_CUST( "offset", 11, r_sourceNumVal, w_sourceNumVal ),
YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
YAML_STRUCT("curve", 16, struct_CurveRef, NULL),
YAML_UNSIGNED( "delayUp", 8 ),
YAML_UNSIGNED( "delayDown", 8 ),
YAML_UNSIGNED( "speedUp", 8 ),
YAML_UNSIGNED( "speedDown", 8 ),
YAML_STRING("name", 6),
YAML_END
};
static const struct YamlNode struct_LimitData[] = {
YAML_IDX,
YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ),
YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ),
YAML_SIGNED( "ppmCenter", 10 ),
YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ),
YAML_UNSIGNED( "symetrical", 1 ),
YAML_UNSIGNED( "revert", 1 ),
YAML_PADDING( 3 ),
YAML_SIGNED( "curve", 8 ),
YAML_STRING("name", 4),
YAML_END
};
static const struct YamlNode struct_ExpoData[] = {
YAML_UNSIGNED( "mode", 2 ),
YAML_UNSIGNED( "scale", 14 ),
YAML_CUSTOM("carryTrim",r_carryTrim,nullptr),
YAML_SIGNED( "trimSource", 6 ),
YAML_SIGNED_CUST( "srcRaw", 10, r_mixSrcRawEx, w_mixSrcRawEx ),
YAML_UNSIGNED_CUST( "weight", 11, r_sourceNumVal, w_sourceNumVal ),
YAML_UNSIGNED_CUST( "offset", 11, r_sourceNumVal, w_sourceNumVal ),
YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
YAML_STRUCT("curve", 16, struct_CurveRef, NULL),
YAML_UNSIGNED( "chn", 5 ),
YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ),
YAML_PADDING( 2 ),
YAML_STRING("name", 6),
YAML_END
};
static const struct YamlNode struct_CurveHeader[] = {
YAML_IDX,
YAML_UNSIGNED( "type", 1 ),
YAML_UNSIGNED( "smooth", 1 ),
YAML_SIGNED( "points", 6 ),
YAML_STRING("name", 3),
YAML_END
};
static const struct YamlNode struct_signed_8[] = {
YAML_IDX,
YAML_SIGNED( "val", 8 ),
YAML_END
};
static const struct YamlNode struct_LogicalSwitchData[] = {
YAML_IDX,
YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions),
YAML_CUSTOM("def",r_logicSw,w_logicSw),
YAML_PADDING( 10 ),
YAML_PADDING( 10 ),
YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ),
YAML_UNSIGNED( "lsPersist", 1 ),
YAML_UNSIGNED( "lsState", 1 ),
YAML_PADDING( 16 ),
YAML_UNSIGNED( "delay", 8 ),
YAML_UNSIGNED( "duration", 8 ),
YAML_END
};
static const struct YamlNode struct_SwashRingData[] = {
YAML_ENUM("type", 8, enum_SwashType),
YAML_UNSIGNED( "value", 8 ),
YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ),
YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ),
YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ),
YAML_SIGNED( "collectiveWeight", 8 ),
YAML_SIGNED( "aileronWeight", 8 ),
YAML_SIGNED( "elevatorWeight", 8 ),
YAML_END
};
static const struct YamlNode struct_trim_t[] = {
YAML_IDX,
YAML_SIGNED( "value", 11 ),
YAML_UNSIGNED( "mode", 5 ),
YAML_END
};
static const struct YamlNode struct_FlightModeData[] = {
YAML_IDX,
YAML_ARRAY("trim", 16, 6, struct_trim_t, NULL),
YAML_STRING("name", 6),
YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_UNSIGNED( "fadeIn", 8 ),
YAML_UNSIGNED( "fadeOut", 8 ),
YAML_ARRAY("gvars", 16, 9, struct_signed_16, gvar_is_active),
YAML_END
};
static const struct YamlNode struct_GVarData[] = {
YAML_IDX,
YAML_STRING("name", 3),
YAML_UNSIGNED( "min", 12 ),
YAML_UNSIGNED( "max", 12 ),
YAML_UNSIGNED( "popup", 1 ),
YAML_UNSIGNED( "prec", 1 ),
YAML_UNSIGNED( "unit", 2 ),
YAML_PADDING( 4 ),
YAML_END
};
static const struct YamlNode struct_VarioData[] = {
YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ),
YAML_UNSIGNED( "centerSilent", 1 ),
YAML_SIGNED( "centerMax", 8 ),
YAML_SIGNED( "centerMin", 8 ),
YAML_SIGNED( "min", 8 ),
YAML_SIGNED( "max", 8 ),
YAML_END
};
static const struct YamlNode struct_RssiAlarmData[] = {
YAML_CUSTOM("disabled",r_rssiDisabled,nullptr),
YAML_CUSTOM("warning",r_rssiWarning,nullptr),
YAML_CUSTOM("critical",r_rssiCritical,nullptr),
YAML_END
};
static const struct YamlNode struct_RFAlarmData[] = {
YAML_SIGNED( "warning", 8 ),
YAML_SIGNED( "critical", 8 ),
YAML_END
};
static const struct YamlNode struct_PpmModule[] = {
YAML_SIGNED( "delay", 6 ),
YAML_UNSIGNED( "pulsePol", 1 ),
YAML_UNSIGNED( "outputType", 1 ),
YAML_SIGNED( "frameLength", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_5[] = {
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_UNSIGNED( "power", 2 ),
YAML_PADDING( 2 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_SIGNED( "antennaMode", 2 ),
YAML_PADDING( 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
YAML_PADDING( 6 ),
YAML_UNSIGNED( "noninverted", 1 ),
YAML_PADDING( 1 ),
YAML_SIGNED( "refreshRate", 8 ),
YAML_END
};
static const struct YamlNode struct_string_64[] = {
YAML_IDX,
YAML_STRING("val", 8),
YAML_END
};
static const struct YamlNode struct_anonymous_8[] = {
YAML_UNSIGNED( "receivers", 7 ),
YAML_UNSIGNED( "racingMode", 1 ),
YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL),
YAML_END
};
static const struct YamlNode struct_anonymous_9[] = {
YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL),
YAML_UNSIGNED( "mode", 3 ),
YAML_UNSIGNED( "rfPower", 1 ),
YAML_UNSIGNED( "reserved", 4 ),
YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL),
YAML_END
};
static const struct YamlNode struct_anonymous_10[] = {
YAML_UNSIGNED( "emi", 2 ),
YAML_UNSIGNED( "telemetry", 1 ),
YAML_UNSIGNED( "phyMode", 3 ),
YAML_UNSIGNED( "reserved", 2 ),
YAML_UNSIGNED( "rfPower", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_11[] = {
YAML_UNSIGNED( "raw12bits", 1 ),
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
YAML_PADDING( 4 ),
YAML_END
};
static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "telemetryBaudrate", 3 ),
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
YAML_UNSIGNED( "flags", 8 ),
YAML_END
};
static const struct YamlNode union_anonymous_4_elmts[] = {
YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL),
YAML_STRUCT("ppm", 16, struct_PpmModule, NULL),
YAML_STRUCT("multi", 24, struct_anonymous_5, NULL),
YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL),
YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL),
YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL),
YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL),
YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL),
YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL),
YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL),
YAML_STRUCT("dsmp", 8, struct_anonymous_13, NULL),
YAML_END
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
static const struct YamlNode struct_TrainerModuleData[] = {
YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED( "channelsCount", 8 ),
YAML_SIGNED( "frameLength", 8 ),
YAML_SIGNED( "delay", 6 ),
YAML_UNSIGNED( "pulsePol", 1 ),
YAML_PADDING( 1 ),
YAML_END
};
static const struct YamlNode union_ScriptDataInput_elmts[] = {
YAML_SIGNED( "value", 16 ),
YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ),
YAML_END
};
static const struct YamlNode union_ScriptDataInput[] = {
YAML_IDX,
YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input),
YAML_END
};
static const struct YamlNode struct_ScriptData[] = {
YAML_IDX,
YAML_STRING("file", 6),
YAML_STRING("name", 6),
YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL),
YAML_END
};
static const struct YamlNode struct_string_24[] = {
YAML_IDX,
YAML_STRING("val", 3),
YAML_END
};
static const struct YamlNode union_anonymous_14_elmts[] = {
YAML_UNSIGNED( "id", 16 ),
YAML_UNSIGNED( "persistentValue", 16 ),
YAML_END
};
static const struct YamlNode struct_anonymous_16[] = {
YAML_UNSIGNED( "physID", 5 ),
YAML_UNSIGNED( "rxIndex", 3 ),
YAML_END
};
static const struct YamlNode union_anonymous_15_elmts[] = {
YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL),
YAML_UNSIGNED( "instance", 8 ),
YAML_ENUM("formula", 8, enum_TelemetrySensorFormula),
YAML_END
};
static const struct YamlNode struct_anonymous_18[] = {
YAML_UNSIGNED( "ratio", 16 ),
YAML_SIGNED( "offset", 16 ),
YAML_END
};
static const struct YamlNode struct_anonymous_19[] = {
YAML_UNSIGNED( "source", 8 ),
YAML_UNSIGNED( "index", 8 ),
YAML_PADDING( 16 ),
YAML_END
};
static const struct YamlNode struct_anonymous_20[] = {
YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL),
YAML_END
};
static const struct YamlNode struct_anonymous_21[] = {
YAML_UNSIGNED( "source", 8 ),
YAML_PADDING( 24 ),
YAML_END
};
static const struct YamlNode struct_anonymous_22[] = {
YAML_UNSIGNED( "gps", 8 ),
YAML_UNSIGNED( "alt", 8 ),
YAML_PADDING( 16 ),
YAML_END
};
static const struct YamlNode union_anonymous_17_elmts[] = {
YAML_STRUCT("custom", 32, struct_anonymous_18, NULL),
YAML_STRUCT("cell", 32, struct_anonymous_19, NULL),
YAML_STRUCT("calc", 32, struct_anonymous_20, NULL),
YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL),
YAML_STRUCT("dist", 32, struct_anonymous_22, NULL),
YAML_UNSIGNED( "param", 32 ),
YAML_END
};
static const struct YamlNode struct_TelemetrySensor[] = {
YAML_IDX,
YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1),
YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2),
YAML_STRING("label", 4),
YAML_UNSIGNED( "subId", 8 ),
YAML_ENUM("type", 1, enum_TelemetrySensorType),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "unit", 6 ),
YAML_UNSIGNED( "prec", 2 ),
YAML_UNSIGNED( "autoOffset", 1 ),
YAML_UNSIGNED( "filter", 1 ),
YAML_UNSIGNED( "logs", 1 ),
YAML_UNSIGNED( "persistent", 1 ),
YAML_UNSIGNED( "onlyPositive", 1 ),
YAML_PADDING( 1 ),
YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg),
YAML_END
};
static const struct YamlNode struct_FrSkyBarData[] = {
YAML_IDX,
YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ),
YAML_SIGNED( "barMin", 16 ),
YAML_SIGNED( "barMax", 16 ),
YAML_END
};
static const struct YamlNode struct_LineDataSource[] = {
YAML_IDX,
YAML_UNSIGNED_CUST( "val", 16, r_mixSrcRaw, w_mixSrcRaw ),
YAML_END
};
static const struct YamlNode struct_FrSkyLineData[] = {
YAML_IDX,
YAML_ARRAY("sources", 16, 2, struct_LineDataSource, NULL),
YAML_END
};
static const struct YamlNode struct_TelemetryScriptData[] = {
YAML_STRING("file", 6),
YAML_ARRAY("inputs", 16, 8, struct_signed_16, NULL),
YAML_END
};
static const struct YamlNode union_TelemetryScreenData_u_elmts[] = {
YAML_ARRAY("bars", 48, 4, struct_FrSkyBarData, NULL),
YAML_ARRAY("lines", 32, 4, struct_FrSkyLineData, NULL),
YAML_STRUCT("script", 176, struct_TelemetryScriptData, NULL),
YAML_END
};
static const struct YamlNode struct_TelemetryScreenData[] = {
YAML_IDX,
YAML_CUSTOM("type",r_tele_screen_type,w_tele_screen_type),
YAML_UNION("u", 192, union_TelemetryScreenData_u_elmts, select_tele_screen_data),
YAML_END
};
static const struct YamlNode struct_RGBLedColor[] = {
YAML_IDX,
YAML_UNSIGNED( "r", 8 ),
YAML_UNSIGNED( "g", 8 ),
YAML_UNSIGNED( "b", 8 ),
YAML_END
};
static const struct YamlNode struct_USBJoystickChData[] = {
YAML_IDX,
YAML_ENUM("mode", 3, enum_USBJoystickCh),
YAML_UNSIGNED( "inversion", 1 ),
YAML_UNSIGNED( "param", 4 ),
YAML_UNSIGNED( "btn_num", 5 ),
YAML_UNSIGNED( "switch_npos", 3 ),
YAML_END
};
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
YAML_UNSIGNED( "displayTrims", 2 ),
YAML_UNSIGNED( "ignoreSensorIds", 1 ),
YAML_SIGNED( "trimInc", 3 ),
YAML_UNSIGNED( "disableThrottleWarning", 1 ),
YAML_UNSIGNED( "displayChecklist", 1 ),
YAML_UNSIGNED( "extendedLimits", 1 ),
YAML_UNSIGNED( "extendedTrims", 1 ),
YAML_UNSIGNED( "throttleReversed", 1 ),
YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ),
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
YAML_ARRAY("limitData", 88, 32, struct_LimitData, NULL),
YAML_ARRAY("expoData", 144, 64, struct_ExpoData, NULL),
YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL),
YAML_ARRAY("points", 8, 512, struct_signed_8, NULL),
YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL),
YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active),
YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active),
YAML_ARRAY("flightModeData", 320, 9, struct_FlightModeData, fmd_is_active),
YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ),
YAML_CUSTOM("switchWarningState",r_swtchWarn,nullptr),
YAML_ARRAY("switchWarning", 3, 21, struct_swtchWarn, nullptr),
YAML_PADDING(1),
YAML_ARRAY("gvars", 56, 9, struct_GVarData, NULL),
YAML_STRUCT("varioData", 40, struct_VarioData, NULL),
YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ),
YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL),
YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL),
YAML_UNSIGNED( "thrTrimSw", 3 ),
YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode),
YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable),
YAML_PADDING( 1 ),
YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL),
YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL),
YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL),
YAML_ARRAY("scriptsData", 192, 7, struct_ScriptData, NULL),
YAML_ARRAY("inputNames", 24, 32, struct_string_24, NULL),
YAML_UNSIGNED( "potsWarnEnabled", 8 ),
YAML_ARRAY("potsWarnPosition", 8, 8, struct_signed_8, NULL),
YAML_ARRAY("telemetrySensors", 112, 40, struct_TelemetrySensor, NULL),
YAML_PADDING( 8 ),
YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL),
YAML_UNSIGNED( "view", 8 ),
YAML_STRING("modelRegistrationID", 8),
YAML_UNSIGNED( "functionSwitchConfig", 16 ),
YAML_UNSIGNED( "functionSwitchGroup", 16 ),
YAML_UNSIGNED( "functionSwitchStartConfig", 16 ),
YAML_UNSIGNED( "functionSwitchLogicalState", 8 ),
YAML_ARRAY("switchNames", 24, 6, struct_string_24, NULL),
YAML_ARRAY("functionSwitchLedONColor", 24, 6, struct_RGBLedColor, NULL),
YAML_ARRAY("functionSwitchLedOFFColor", 24, 6, struct_RGBLedColor, NULL),
YAML_UNSIGNED( "usbJoystickExtMode", 1 ),
YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode),
YAML_UNSIGNED( "usbJoystickCircularCut", 4 ),
YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL),
YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable),
YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable),
YAML_END
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29
static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData );
const YamlNode* get_radiodata_nodes()
{
return &__RadioData_root_node;
}
static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData );
const YamlNode* get_modeldata_nodes()
{
return &__ModelData_root_node;
}
static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel );
const YamlNode* get_partialmodel_nodes()
{
return &__PartialModel_root_node;
}
@@ -630,7 +630,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -630,7 +630,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -633,7 +633,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -606,7 +606,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -606,7 +606,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -632,7 +632,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -604,7 +604,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -605,7 +605,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -605,7 +605,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -604,7 +604,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
@@ -608,7 +608,7 @@ static const struct YamlNode struct_anonymous_12[] = {
YAML_UNSIGNED( "crsfArmingMode", 1 ),
YAML_PADDING( 4 ),
YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ),
YAML_PADDING( 6 ),
YAML_SIGNED( "spare3", 6 ),
YAML_END
};
static const struct YamlNode struct_anonymous_13[] = {
+4 -3
View File
@@ -21,6 +21,7 @@
#include "hal/switch_driver.h"
#include "hal/adc_driver.h"
#include "hal/rgbleds.h"
#include "myeeprom.h"
#include "edgetx.h"
@@ -168,7 +169,7 @@ void evalFunctionSwitches()
uint8_t fct_switches = switchGetMaxFctSwitches();
for (uint8_t i = 0; i < fct_switches; i++) {
if (FSWITCH_CONFIG(i) == SWITCH_NONE) {
fsLedOff(i);
setFSLedOFF(i);
continue;
}
@@ -202,9 +203,9 @@ void evalFunctionSwitches()
if (!pwrPressed()) {
if (getFSLogicalState(i))
fsLedOn(i);
setFSLedON(i);
else
fsLedOff(i);
setFSLedOFF(i);
}
}
}
+3 -1
View File
@@ -106,5 +106,7 @@ extern uint8_t functionSwitchFunctionState;
//led_driver.cpp
void fsLedOff(uint8_t);
void fsLedOn(uint8_t);
bool getFSLedState(uint8_t index);
bool fsLedState(uint8_t index);
void fsLedRGB(uint8_t, uint32_t color);
uint8_t getRGBColorIndex(uint32_t color);
#endif
@@ -35,10 +35,10 @@
static const stm32_usart_t fsUSART = {
.USARTx = FLYSKY_HALL_SERIAL_USART,
.txGPIO = GPIO_UNDEF,
.txGPIO = FLYSKY_HALL_SERIAL_TX_GPIO,
.rxGPIO = FLYSKY_HALL_SERIAL_RX_GPIO,
.IRQn = FLYSKY_HALL_SERIAL_USART_IRQn,
.IRQ_Prio = 6,
.IRQ_Prio = 4,
.txDMA = nullptr,
.txDMA_Stream = 0,
.txDMA_Channel = 0,
@@ -49,6 +49,13 @@ static const stm32_usart_t fsUSART = {
DEFINE_STM32_SERIAL_PORT(FSGimbal, fsUSART, HALLSTICK_BUFF_SIZE, 0);
static const etx_serial_port_t _fs_gimbal_serial_port = {
.name = "gimbals",
.uart = &STM32SerialDriver,
.hw_def = REF_STM32_SERIAL_PORT(FSGimbal),
.set_pwr = nullptr,
};
static STRUCT_HALL HallProtocol = { 0 };
static void* _fs_usart_ctx = nullptr;
@@ -150,7 +157,7 @@ static void flysky_gimbal_loop(void*)
}
}
static void flysky_gimbal_deinit()
void flysky_gimbal_deinit()
{
STM32SerialDriver.deinit(_fs_usart_ctx);
}
@@ -181,3 +188,8 @@ bool flysky_gimbal_init()
flysky_gimbal_deinit();
return false;
}
const etx_serial_port_t* flysky_gimbal_get_port()
{
return &_fs_gimbal_serial_port;
}
@@ -18,6 +18,10 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#pragma once
#include "hal/serial_port.h"
#define HALLSTICK_BUFF_SIZE ( 512 )
#define FLYSKY_HALL_BAUDRATE ( 921600 )
@@ -124,3 +128,5 @@ extern unsigned short hall_adc_values[FLYSKY_HALL_CHANNEL_COUNT];
// returns true if the gimbals were detected properly
bool flysky_gimbal_init();
void flysky_gimbal_deinit();
const etx_serial_port_t* flysky_gimbal_get_port();
@@ -27,7 +27,7 @@
#define GPIO_UNDEF (0xffffffff)
// #define GPIO_PIN(x, y) ((GPIOA_BASE + (x << 10)) | y)
#define GPIO_PIN(x, y) ((intptr_t)x | y)
#define GPIO_PIN(x, y) ((uintptr_t)x | y)
// Generate GPIO mode bitfields
//
@@ -231,6 +231,22 @@ void ws2812_set_color(uint8_t led, uint8_t r, uint8_t g, uint8_t b)
pixel[_b_offset] = b;
}
uint32_t ws2812_get_color(uint8_t led)
{
if (led >= _led_strip_len) return 0;
uint8_t* pixel = &_led_colors[led * WS2812_BYTES_PER_LED];
return (pixel[1] << 16) + (pixel[0] << 8) + pixel[2];
}
bool ws2812_get_state(uint8_t led)
{
if (led >= _led_strip_len) return false;
uint8_t* pixel = &_led_colors[led * WS2812_BYTES_PER_LED];
return pixel[0] || pixel[1] || pixel[2];
}
void ws2812_update(const stm32_pulse_timer_t* tim)
{
WS2812_DBG_HIGH;
@@ -42,6 +42,8 @@
void ws2812_init(const stm32_pulse_timer_t* timer, uint8_t strip_len, uint8_t type);
void ws2812_update(const stm32_pulse_timer_t* timer);
bool ws2812_get_state(uint8_t led);
void ws2812_dma_isr(const stm32_pulse_timer_t* timer);
void ws2812_set_color(uint8_t led, uint8_t r, uint8_t g, uint8_t b);
uint32_t ws2812_get_color(uint8_t led);
+2 -1
View File
@@ -30,6 +30,7 @@
#include "hal/rotary_encoder.h"
#include "hal/usb_driver.h"
#include "hal/gpio.h"
#include "hal/rgbleds.h"
#include "board.h"
#include "boards/generic_stm32/module_ports.h"
@@ -127,7 +128,7 @@ void boardInit()
board_set_bor_level();
#endif
#if defined(FUNCTION_SWITCHES) && !defined(DEBUG)
#if defined(MANUFACTURER_JUMPER) && defined(FUNCTION_SWITCHES) && !defined(DEBUG)
// This is needed to prevent radio from starting when usb is plugged to charge
usbInit();
// prime debounce state...
+21 -4
View File
@@ -21,8 +21,9 @@
#include "hal/gpio.h"
#include "stm32_gpio.h"
#include "boards/generic_stm32/rgb_leds.h"
#include "board.h"
#include "colors.h"
void ledInit()
{
@@ -39,7 +40,7 @@ void ledInit()
gpio_init(LED_BLUE_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW);
#endif
#if defined(FUNCTION_SWITCHES)
#if defined(FUNCTION_SWITCHES) && !defined(FUNCTION_SWITCHES_RGB_LEDS)
gpio_init(FSLED_GPIO_1, GPIO_OUT, GPIO_PIN_SPEED_LOW);
gpio_init(FSLED_GPIO_2, GPIO_OUT, GPIO_PIN_SPEED_LOW);
gpio_init(FSLED_GPIO_3, GPIO_OUT, GPIO_PIN_SPEED_LOW);
@@ -50,7 +51,23 @@ void ledInit()
}
#if defined(FUNCTION_SWITCHES)
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
// used to map switch number to led number in the rgbled chain
uint8_t ledMapping[] = {1, 2, 3, 4, 5, 6};
void fsLedOff(uint8_t index, uint32_t color)
{
rgbSetLedColor(ledMapping[index], GET_RED(color), \
GET_GREEN(color),GET_BLUE(color));
}
void fsLedOn(uint8_t index, uint32_t color)
{
rgbSetLedColor(ledMapping[index], GET_RED(color), \
GET_GREEN(color),GET_BLUE(color));
}
#elif defined(FUNCTION_SWITCHES)
gpio_t fsLeds[] = {FSLED_GPIO_1, FSLED_GPIO_2,
FSLED_GPIO_3, FSLED_GPIO_4,
FSLED_GPIO_5, FSLED_GPIO_6};
@@ -65,7 +82,7 @@ void fsLedOn(uint8_t index)
gpio_set(fsLeds[index]);
}
bool getFSLedState(uint8_t index)
bool fsLedState(uint8_t index)
{
return (gpio_read(fsLeds[index]));
}
+29 -1
View File
@@ -20,6 +20,7 @@
*/
#include <stdint.h>
#include "hal/rgbleds.h"
bool usbChargerLed() { return true; }
void ledRed() {}
@@ -28,6 +29,33 @@ void ledBlue() {}
void ledOff() {}
void fsLedOn(uint8_t) {}
void fsLedOff(uint8_t) {}
bool getFSLedState(uint8_t) { return false;}
void fsLedRGB(uint8_t, uint32_t) {}
bool fsLedState(uint8_t) { return false;}
void rgbSetLedColor(unsigned char, unsigned char, unsigned char, unsigned char) {}
void rgbLedColorApply() {}
uint8_t getRGBColorIndex(uint32_t color)
{
for (uint8_t i = 0; i < (sizeof(colorTable) / sizeof(colorTable[0])); i++) {
if (color == colorTable[i])
return(i);
}
return 5; // Custom value set with Companion
}
// RGB
#define WS2812_BYTES_PER_LED 3
// Maximum number of supported LEDs
#if !defined(WS2812_MAX_LEDS)
# define WS2812_MAX_LEDS 48
#endif
// Pixel values
static uint8_t _led_colors[WS2812_BYTES_PER_LED * WS2812_MAX_LEDS];
uint32_t rgbGetLedColor(uint8_t led)
{
uint8_t* pixel = &_led_colors[led * WS2812_BYTES_PER_LED];
return (pixel[1] << 16) + (pixel[0] << 8) + pixel[2];
}
+45 -5
View File
@@ -7,6 +7,7 @@ option(INTERNAL_MODULE_PPM "Support for PPM internal module" OFF)
option(AUTOUPDATE "Auto update internal chips from SD" OFF)
option(BIND_KEY "Enable bind button" OFF)
option(BLUETOOTH "FrSky BT module support" OFF)
option(RGBLEDS "WS2812 addressable LED support" OFF)
set(USE_RTC_CLOCK YES)
set(HARDWARE_EXTERNAL_MODULE YES)
@@ -122,7 +123,7 @@ elseif(PCB STREQUAL X7)
set(FLAVOUR tpro)
set(ROTARY_ENCODER YES)
set(CPU_TYPE_FULL STM32F205xE)
add_definitions(-DFUNCTION_SWITCHES)
set(FUNCTION_SWITCHES ON)
add_definitions(-DRADIO_TPRO)
add_definitions(-DMANUFACTURER_JUMPER)
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
@@ -133,7 +134,7 @@ elseif(PCB STREQUAL X7)
set(FLAVOUR tprov2)
set(CPU_TYPE_FULL STM32F407xE)
set(ROTARY_ENCODER YES)
add_definitions(-DFUNCTION_SWITCHES)
set(FUNCTION_SWITCHES ON)
add_definitions(-DRADIO_TPROV2)
add_definitions(-DMANUFACTURER_JUMPER)
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
@@ -156,7 +157,7 @@ elseif(PCB STREQUAL X7)
set(NAVIGATION_TYPE x7)
set(CPU_TYPE_FULL STM32F407xG)
set(ROTARY_ENCODER YES)
add_definitions(-DFUNCTION_SWITCHES)
set(FUNCTION_SWITCHES YES)
add_definitions(-DRADIO_BUMBLEBEE)
add_definitions(-DMANUFACTURER_JUMPER)
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
@@ -192,7 +193,7 @@ elseif(PCB STREQUAL X7)
set(ROTARY_ENCODER YES)
set(CPU_TYPE_FULL STM32F407xE)
set(FLYSKY_GIMBAL ON)
add_definitions(-DFUNCTION_SWITCHES)
set(FUNCTION_SWITCHES ON)
add_definitions(-DRADIO_T20)
add_definitions(-DRADIO_FAMILY_T20)
add_definitions(-DMANUFACTURER_JUMPER)
@@ -206,7 +207,7 @@ elseif(PCB STREQUAL X7)
set(CPU_TYPE_FULL STM32F407xG)
set(FLYSKY_GIMBAL ON)
set(PXX2 ON)
add_definitions(-DFUNCTION_SWITCHES)
set(FUNCTION_SWITCHES ON)
add_definitions(-DRADIO_T20V2)
add_definitions(-DRADIO_FAMILY_T20)
add_definitions(-DMANUFACTURER_JUMPER)
@@ -285,6 +286,7 @@ elseif(PCB STREQUAL X7)
if (NOT BLUETOOTH)
set(AUX_SERIAL ON)
endif()
set(RGBLEDS YES)
elseif(PCBREV STREQUAL BOXER)
set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module")
set(INTERNAL_MODULE_SERIAL YES)
@@ -301,6 +303,24 @@ elseif(PCB STREQUAL X7)
if (NOT BLUETOOTH)
set(AUX_SERIAL ON)
endif()
elseif(PCBREV STREQUAL GX12)
set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module")
set(INTERNAL_MODULE_SERIAL YES)
set(MODULE_SIZE_SML YES)
set(FLAVOUR gx12)
set(NAVIGATION_TYPE x7)
set(CPU_TYPE_FULL STM32F407xG)
set(ROTARY_ENCODER YES)
set(USB_CHARGER YES)
add_definitions(-DRADIO_GX12)
add_definitions(-DMANUFACTURER_RADIOMASTER)
set(PXX2 ON)
set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough")
set(FLYSKY_GIMBAL TES)
set(AUX_SERIAL ON)
set(AUX2_SERIAL OFF)
set(RGBLEDS YES)
set(FUNCTION_SWITCHES_WITH_RGB YES)
elseif(PCBREV STREQUAL ZORRO)
set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module")
set(INTERNAL_MODULE_SERIAL YES)
@@ -533,6 +553,15 @@ else()
message(FATAL_ERROR "Unknown CPU_TYPE_FULL" )
endif()
if(FUNCTION_SWITCHES)
add_definitions(-DFUNCTION_SWITCHES)
endif()
if(FUNCTION_SWITCHES_WITH_RGB)
set(FUNCTION_SWITCHES YES)
add_definitions(-DFUNCTION_SWITCHES)
add_definitions(-DFUNCTION_SWITCHES_RGB_LEDS)
endif()
if(ENABLE_SERIAL_PASSTHROUGH)
set(CLI ON "Enable CLI")
@@ -644,6 +673,17 @@ if(USE_RTC_CLOCK)
add_definitions(-DRTCLOCK)
endif()
if(RGBLEDS)
add_definitions(-DRGBLEDS)
endif()
if(FLAVOUR STREQUAL gx12)
target_sources(board PRIVATE
drivers/pca95xx.cpp
${TARGET_SRC_DIR}/gx12/bsp_io.cpp
)
target_include_directories(board PRIVATE ${TARGET_SRC_DIR}/gx12)
endif()
set(SRC ${SRC}
io/frsky_firmware_update.cpp
+15 -9
View File
@@ -30,6 +30,7 @@
#include "hal/abnormal_reboot.h"
#include "hal/usb_driver.h"
#include "hal/gpio.h"
#include "hal/rgbleds.h"
#include "board.h"
#include "boards/generic_stm32/module_ports.h"
@@ -198,12 +199,12 @@ void boardInit()
delay_ms(20);
#if defined(FUNCTION_SWITCHES)
// Support for FS Led to indicate battery charge level
if (getBatteryVoltage() >= 660) fsLedOn(0);
if (getBatteryVoltage() >= 700) fsLedOn(1);
if (getBatteryVoltage() >= 740) fsLedOn(2);
if (getBatteryVoltage() >= 780) fsLedOn(3);
if (getBatteryVoltage() >= 820) fsLedOn(4);
if (getBatteryVoltage() >= 842) fsLedOn(5);
if (getBatteryVoltage() >= 660) setFSLedON(0);
if (getBatteryVoltage() >= 700) setFSLedON(1);
if (getBatteryVoltage() >= 740) setFSLedON(2);
if (getBatteryVoltage() >= 780) setFSLedON(3);
if (getBatteryVoltage() >= 820) setFSLedON(4);
if (getBatteryVoltage() >= 842) setFSLedON(5);
#elif defined(STATUS_LEDS)
// Use Status LED to indicate battery charge level instead
if (getBatteryVoltage() <= 660) ledRed(); // low discharge
@@ -216,6 +217,9 @@ void boardInit()
}
#endif
delaysInit();
__enable_irq();
keysInit();
switchInit();
@@ -223,9 +227,6 @@ void boardInit()
rotaryEncoderInit();
#endif
delaysInit();
__enable_irq();
#if defined(PWM_STICKS)
sticksPwmDetect();
#endif
@@ -296,6 +297,11 @@ void boardInit()
#if defined(GUI)
lcdSetContrast(true);
#endif
#if defined(RADIO_GX12)
gpio_init(HALL_SYNC, GPIO_OUT, GPIO_PIN_SPEED_LOW);
#endif
}
#endif
+227
View File
@@ -0,0 +1,227 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "bsp_io.h"
#include "hal/switch_driver.h"
#include "drivers/pca95xx.h"
#include "stm32_i2c_driver.h"
#include "timers_driver.h"
#include "boards/generic_stm32/rgb_leds.h"
#include <FreeRTOS/include/FreeRTOS.h>
#include <FreeRTOS/include/timers.h>
#include "myeeprom.h"
#include "bitfield.h"
struct bsp_io_expander {
pca95xx_t exp;
uint32_t mask;
uint32_t state;
};
static bsp_io_expander _io_switches;
static bsp_io_expander _io_fs_switches;
static void _init_io_expander(bsp_io_expander* io, uint32_t mask)
{
io->mask = mask;
io->state = 0;
}
static uint32_t _read_io_expander(bsp_io_expander* io)
{
uint16_t value = 0;
if (pca95xx_read(&io->exp, io->mask, &value) == 0) {
io->state = value;
}
return io->state;
}
static void _poll_switches(void *pvParameter1, uint32_t ulParameter2)
{
(void)ulParameter2;
bsp_io_expander* io = (bsp_io_expander*)pvParameter1;
_read_io_expander(io);
}
static void _io_int_handler(bsp_io_expander* io)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
xTimerPendFunctionCallFromISR(_poll_switches, (void*)io, 0,
&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
} else {
_read_io_expander(io);
}
}
static void _io_int_handler() {
_io_int_handler(&_io_switches);
_io_int_handler(&_io_fs_switches);
}
int bsp_io_init()
{
timersInit();
if (i2c_init(I2C_Bus_2) < 0) {
return -1;
}
// configure expander 1
_init_io_expander(&_io_switches, 0xFC3F);
if (pca95xx_init(&_io_switches.exp, I2C_Bus_2, 0x74) < 0) {
return -1;
}
// configure expander 2
_init_io_expander(&_io_fs_switches, 0x3F);
if (pca95xx_init(&_io_fs_switches.exp, I2C_Bus_2, 0x75) < 0) {
return -1;
}
// setup expanders pin change interrupt
gpio_init_int(IO_INT_GPIO, GPIO_IN, GPIO_FALLING, _io_int_handler);
// setup expanders reset pin
gpio_init(IO_RESET_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW);
gpio_set(IO_RESET_GPIO);
bsp_io_read_switches();
bsp_io_read_fs_switches();
return 0;
}
uint32_t bsp_io_read_switches()
{
return _read_io_expander(&_io_switches);
}
uint32_t bsp_io_read_fs_switches()
{
return _read_io_expander(&_io_fs_switches);
}
void boardInitSwitches()
{
bsp_io_init();
}
struct bsp_io_sw_def {
uint32_t pin_high;
uint32_t pin_low;
};
static constexpr uint32_t RGB_OFFSET = (1 << 16); // first after bspio pins
static uint16_t soft2POSLogicalState = 0xFFFF;
static const bsp_io_sw_def _switch_defs[] = {
{ SWITCH_A, RGB_OFFSET + 7 },
{ SWITCH_B_H, SWITCH_B_L },
{ SWITCH_C_H, SWITCH_C_L },
{ SWITCH_D, RGB_OFFSET + 6 },
{ SWITCH_E_H, SWITCH_E_L },
{ SWITCH_F_H, SWITCH_F_L },
{ SWITCH_G, 0 },
{ SWITCH_H, 0 },
};
static SwitchHwPos _get_switch_pos(uint8_t idx)
{
static uint32_t oldState = 0;
SwitchHwPos pos = SWITCH_HW_UP;
const bsp_io_sw_def* def = &_switch_defs[idx];
uint32_t state = _io_switches.state;
if (def->pin_low > RGB_OFFSET) {
// Potential soft 2pos
if ((SWITCH_CONFIG(idx) == SWITCH_TOGGLE)) {
if ((state & def->pin_high) == 0) {
pos = SWITCH_HW_DOWN;
}
}
else {
if (((state & def->pin_high) == 0) && ((state & def->pin_high) != (oldState & def->pin_high))) {
soft2POSLogicalState ^= def->pin_high;
}
if ((soft2POSLogicalState & def->pin_high) == 0) {
pos = SWITCH_HW_DOWN;
}
else {
pos = SWITCH_HW_UP;
}
}
if(pos == SWITCH_HW_UP) {
rgbSetLedColor(def->pin_low - RGB_OFFSET, 0x0, 0x0, 0x0);
}
else {
rgbSetLedColor(def->pin_low - RGB_OFFSET, 0xFF, 0xFF, 0xFF);
}
}
else if (!def->pin_low) {
// 2POS switch
if ((state & def->pin_high) == 0) {
pos = SWITCH_HW_DOWN;
}
} else {
bool hi = state & def->pin_high;
bool lo = state & def->pin_low;
if (hi && lo) {
pos = SWITCH_HW_MID;
} else if (!hi && lo) {
pos = SWITCH_HW_DOWN;
}
}
if (idx == switchGetMaxSwitches() - 1)
oldState = state;
return pos;
}
static SwitchHwPos _get_fs_switch_pos(uint8_t idx)
{
uint32_t state = _io_fs_switches.state;
if ((state & (1 << idx)) == 0) {
return SWITCH_HW_DOWN;
} else {
return SWITCH_HW_UP;
}
}
SwitchHwPos boardSwitchGetPosition(uint8_t cat, uint8_t idx)
{
if (cat == SWITCH_PHYSICAL) {
return _get_switch_pos(idx);
} else if (cat == SWITCH_FUNCTION){
return _get_fs_switch_pos(idx);
}
return SWITCH_HW_UP;
}
+59
View File
@@ -0,0 +1,59 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#pragma once
#include "drivers/pca95xx.h"
// Port expander 1 (0x74)
#define SWITCH_H PCA95XX_PIN_0
#define SWITCH_D PCA95XX_PIN_1
#define SWITCH_F_H PCA95XX_PIN_3
#define SWITCH_F_L PCA95XX_PIN_2
#define SWITCH_C_L PCA95XX_PIN_4
#define SWITCH_C_H PCA95XX_PIN_5
#define SWITCH_B_H PCA95XX_PIN_10
#define SWITCH_B_L PCA95XX_PIN_11
#define SWITCH_E_H PCA95XX_PIN_12
#define SWITCH_E_L PCA95XX_PIN_13
#define SWITCH_A PCA95XX_PIN_14
#define SWITCH_G PCA95XX_PIN_15
#define IO_INT_GPIO GPIO_PIN(GPIOE, 14)
#define IO_RESET_GPIO GPIO_PIN(GPIOE, 15)
// Port expander 1 (0x75)
#define FSSWITCH_1 PCA95XX_PIN_0
#define FSSWITCH_2 PCA95XX_PIN_1
#define FSSWITCH_3 PCA95XX_PIN_2
#define FSSWITCH_4 PCA95XX_PIN_3
#define FSSWITCH_5 PCA95XX_PIN_4
#define FSSWITCH_6 PCA95XX_PIN_5
int bsp_io_init();
uint32_t bsp_io_read_switches();
uint32_t bsp_io_read_fs_switches();
File diff suppressed because it is too large Load Diff
@@ -106,6 +106,14 @@ void lcdHardwareInit()
NVIC_SetPriority(LCD_DMA_Stream_IRQn, 7);
NVIC_EnableIRQ(LCD_DMA_Stream_IRQn);
#if defined(OLED_VCC_CS)
gpio_init(OLED_VCC_CS, GPIO_OUT, GPIO_PIN_SPEED_LOW);
// Coming from bootloader or EM, screen is already on
if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE())
gpio_set(OLED_VCC_CS);
#endif
}
#if defined(SSD1309_LCD)
@@ -145,6 +153,10 @@ void lcdStart()
lcdWriteCommand(0xA4); // Disable Entire Display On
lcdWriteCommand(0xA6); // Set Normal Display (not inverted)
lcdWriteCommand(0x2E); // Deactivate scroll
#if defined(OLED_VCC_CS)
delay_ms(100);
gpio_set(OLED_VCC_CS);
#endif
#else
#if defined(LCD_VERTICAL_INVERT)
// T12 and TX12 have the screen inverted.
@@ -353,7 +365,12 @@ void lcdOff()
to re-init LCD without any delay
*/
lcdWriteCommand(0xAE); // LCD sleep
#if defined(OLED_VCC_CS)
gpio_clear(OLED_VCC_CS);
delay_ms(100);
#else
delay_ms(3); // Wait for caps to drain
#endif
}
void lcdReset()
+31 -5
View File
@@ -20,11 +20,19 @@
*/
#include "hal/gpio.h"
#include "hal/rgbleds.h"
#include "stm32_gpio.h"
#include "boards/generic_stm32/rgb_leds.h"
#include "board.h"
#if defined(LED_STRIP_GPIO)
#include "boards/generic_stm32/rgb_leds.h"
#endif
#if defined(FUNCTION_SWITCHES)
#define GET_RED(color) (((color) & 0xF80000) >>16)
#define GET_GREEN(color) (((color) & 0x000F800) >> 8)
#define GET_BLUE(color) (((color) & 0xF8))
#if defined(FUNCTION_SWITCHES) && !defined(FUNCTION_SWITCHES_RGB_LEDS)
static const uint32_t fsLeds[] = {FSLED_GPIO_PIN_1, FSLED_GPIO_PIN_2,
FSLED_GPIO_PIN_3, FSLED_GPIO_PIN_4,
FSLED_GPIO_PIN_5, FSLED_GPIO_PIN_6};
@@ -44,14 +52,32 @@ void ledInit()
gpio_init(LED_BLUE_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW);
#endif
#if defined(FUNCTION_SWITCHES)
#if defined(FUNCTION_SWITCHES) && !defined(FUNCTION_SWITCHES_RGB_LEDS)
for (size_t i = 0; i < DIM(fsLeds); i++) {
gpio_init(fsLeds[i], GPIO_OUT, GPIO_PIN_SPEED_LOW);
}
#endif
}
#if defined(FUNCTION_SWITCHES)
#if defined(FUNCTION_SWITCHES_RGB_LEDS)
// used to map switch number to led number in the rgbled chain
uint8_t ledMapping[] = {0, 1, 2, 3, 4, 5, 6};
void fsLedRGB(uint8_t index, uint32_t color)
{
rgbSetLedColor(ledMapping[index], GET_RED(color), \
GET_GREEN(color),GET_BLUE(color));
}
uint8_t getRGBColorIndex(uint32_t color)
{
for (uint8_t i = 0; i < (sizeof(colorTable) / sizeof(colorTable[0])); i++) {
if (color == colorTable[i])
return(i);
}
return 5; // Custom value set with Companion
}
#elif defined(FUNCTION_SWITCHES)
void fsLedOff(uint8_t index)
{
gpio_clear(fsLeds[index]);
@@ -62,7 +88,7 @@ void fsLedOn(uint8_t index)
gpio_set(fsLeds[index]);
}
bool getFSLedState(uint8_t index)
bool fsLedState(uint8_t index)
{
return gpio_read(fsLeds[index]) ? true : false;
}
@@ -37,6 +37,10 @@
#define USB_NAME "Radiomaster MT12"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'R', 'M', ' ', 'M', 'T', '1', '2', ' ' /* 8 Bytes */
#elif defined(RADIO_GX12)
#define USB_NAME "Radiomaster GX12"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'R', 'M', ' ', 'G', 'X', '1', '2', ' ' /* 8 Bytes */
#elif defined(RADIO_POCKET)
#define USB_NAME "Radiomaster Pocket"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
+12
View File
@@ -28,6 +28,10 @@
#include "hal/usb_driver.h"
#include "hal/watchdog_driver.h"
#if defined(HALL_SYNC) && !defined(SIMU)
#include "stm32_gpio.h"
#include "hal/gpio.h"
#endif
RTOS_TASK_HANDLE mixerTaskId;
RTOS_DEFINE_STACK(mixerTaskId, mixerStack, MIXER_STACK_SIZE);
@@ -224,6 +228,10 @@ void doMixerCalculations()
tmr10ms_t tmr10ms = get_tmr10ms();
#if defined(HALL_SYNC) && !defined(SIMU)
gpio_set(HALL_SYNC);
#endif
#if defined(DEBUG_LATENCY_MIXER_RF) || defined(DEBUG_LATENCY_RF_ONLY)
static tmr10ms_t lastLatencyToggle = 0;
if (tmr10ms - lastLatencyToggle >= 10) {
@@ -249,4 +257,8 @@ void doMixerCalculations()
DEBUG_TIMER_START(debugTimerEvalMixes);
evalMixes(tick10ms);
DEBUG_TIMER_STOP(debugTimerEvalMixes);
#if defined(HALL_SYNC) && !defined(SIMU)
gpio_clear(HALL_SYNC);
#endif
}
+3
View File
@@ -104,6 +104,7 @@ ISTR(PREFLIGHT_POTSLIDER_CHECK);
ISTR(PPMUNIT);
#if defined(FUNCTION_SWITCHES)
ISTR(FUNCTION_SWITCH_GROUPS);
ISTR(FS_COLOR_LIST);
#endif
#if defined(HELI)
@@ -167,6 +168,8 @@ const char STR_MS[] = TR_MS;
const char STR_SWITCH[] = TR_SWITCH;
#if defined(FUNCTION_SWITCHES)
const char STR_GROUPS[] = TR_GROUPS;
const char STR_FS_ON_COLOR[] = TR_FS_ON_COLOR;
const char STR_FS_OFF_COLOR[] = TR_FS_OFF_COLOR;
const char STR_LAST[] = TR_LAST;
const char STR_MORE_INFO[] = TR_MORE_INFO;
const char STR_SWITCH_TYPE[] = TR_SWITCH_TYPE;
+3
View File
@@ -290,6 +290,9 @@ extern const char STR_MS[];
extern const char STR_SWITCH[];
extern const char STR_FUNCTION_SWITCHES[];
extern const char STR_GROUP[];
extern const char STR_FS_ON_COLOR[];
extern const char STR_FS_OFF_COLOR[];
extern const char* const STR_FS_COLOR_LIST[];
extern const char STR_GROUP_ALWAYS_ON[];
extern const char STR_GROUPS[];
extern const char STR_LAST[];
+1 -2
View File
@@ -284,8 +284,7 @@
#define TR_MS "ms"
#define TR_SWITCH "开关"
#define TR_FUNCTION_SWITCHES "可自定义开关"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -298,8 +298,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Spínač"
#define TR_FUNCTION_SWITCHES "Nastavitelné přepínače"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+6 -7
View File
@@ -291,13 +291,12 @@
#define TR_MS "ms"
#define TR_SWITCH "Kontakt"
#define TR_FUNCTION_SWITCHES "Kontakter der kan tilpasses"
#define TR_GROUP "Gruppe"
#define TR_GROUP_ALWAYS_ON "Altid til"
#define TR_GROUP "Gruppe"
#define TR_GROUP_ALWAYS_ON "Altid til"
#define TR_GROUPS "Altid til gruppe"
#define TR_LAST "Sidste"
#define TR_MORE_INFO "Mere info"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
#define TR_LAST "Last"
#define TR_MORE_INFO "More info"
#define TR_SWITCH_TYPE "Type"
#define TR_SWITCH_STARTUP "Start"
#define TR_SWITCH_GROUP "Gruppe"
+3 -2
View File
@@ -289,10 +289,11 @@
#define TR_MS "ms"
#define TR_SWITCH TR("Schalt.", "Schalter")
#define TR_FUNCTION_SWITCHES "Anpassbare Schalter"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_ON_COLOR TR("ON:","ON Color")
#define TR_FS_OFF_COLOR TR("OFF:","OFF Color")
#define TR_GROUPS "Always on groups"
#define TR_LAST "Last"
#define TR_MORE_INFO "More info"
+3
View File
@@ -288,8 +288,11 @@
#define TR_MS "ms"
#define TR_SWITCH "Switch"
#define TR_FUNCTION_SWITCHES "Customizable Switches"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_ON_COLOR TR("ON:","ON Color")
#define TR_FS_OFF_COLOR TR("OFF:","OFF Color")
#define TR_GROUPS "Always on groups"
#define TR_LAST "Last"
#define TR_MORE_INFO "More info"
+1 -2
View File
@@ -286,8 +286,7 @@
#define TR_MS "ms"
#define TR_SWITCH TR("Interr.", "Interruptor")
#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -299,8 +299,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Switch"
#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1
View File
@@ -294,6 +294,7 @@
#define TR_MS "ms"
#define TR_SWITCH TR("Inter", "Interrupteur")
#define TR_FUNCTION_SWITCHES "Inters paramétrables"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -292,8 +292,7 @@
#define TR_MS "ms"
#define TR_SWITCH "מתג"
#define TR_FUNCTION_SWITCHES "מפסקים בהתאמה אישית"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -288,8 +288,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Inter."
#define TR_FUNCTION_SWITCHES "Interruttori personalizzabili"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -287,8 +287,7 @@
#define TR_MS "ms"
#define TR_SWITCH "スイッチ"
#define TR_FUNCTION_SWITCHES "カスタマイズ スイッチ"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -285,8 +285,7 @@
#define TR_MS "ms"
#define TR_SWITCH TR("Schak.", "Schakelaar")
#define TR_FUNCTION_SWITCHES "Customizable switches"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -3
View File
@@ -285,9 +285,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Przełą"
#define TR_FUNCTION_SWITCHES "Ustawiane przełączniki"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUP "Group"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
#define TR_LAST "Last"
+1 -2
View File
@@ -291,8 +291,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Chave"
#define TR_FUNCTION_SWITCHES "Chaves customizáveis"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -290,8 +290,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Тумблер"
#define TR_FUNCTION_SWITCHES "Настр тумблеры"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1
View File
@@ -300,6 +300,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Brytare"
#define TR_FUNCTION_SWITCHES "Anpassningsbara brytare"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Grupp"
#define TR_GROUP_ALWAYS_ON "Alltid på"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -289,8 +289,7 @@
#define TR_MS "ms"
#define TR_SWITCH "開關"
#define TR_FUNCTION_SWITCHES "可自定義開關"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+1 -2
View File
@@ -290,8 +290,7 @@
#define TR_MS "ms"
#define TR_SWITCH "Перемикач"
#define TR_FUNCTION_SWITCHES "Користувацькі перемикачі"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_FS_COLOR_LIST "White","Red","Green","Yellow","Orange","Blue","Pink","Off","Custom"
#define TR_GROUP "Group"
#define TR_GROUP_ALWAYS_ON "Always on"
#define TR_GROUPS "Always on groups"
+5
View File
@@ -164,6 +164,11 @@ def main():
cmake_options["PCBREV"] = "MT12"
firmware_options = options_radiomaster_mt12
maxsize = 65536 * 8 * 2
elif board_name == "gx12":
cmake_options["PCB"] = "X7"
cmake_options["PCBREV"] = "GX12"
firmware_options = options_radiomaster_gx12
maxsize = 65536 * 8 * 2
elif board_name == "t8":
cmake_options["PCB"] = "X7"
cmake_options["PCBREV"] = "T8"
+12
View File
@@ -259,6 +259,18 @@ options_radiomaster_boxer = {
"internalelrs": ("INTERNAL_MODULE_ELRS", "YES", "NO"),
}
options_radiomaster_gx12 = {
"noheli": ("HELI", "NO", "YES"),
"lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"),
"nogvars": ("GVARS", "NO", "YES"),
"faimode": ("FAI", "YES", None),
"faichoice": ("FAI", "CHOICE", None),
"nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"),
"flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None),
"afhds3": ("AFHDS3", "YES", "NO"),
"internalelrs": ("INTERNAL_MODULE_ELRS", "YES", "NO"),
}
options_radiomaster_pocket = {
"noheli": ("HELI", "NO", "YES"),
"lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"),
+57 -29
View File
@@ -1,22 +1,27 @@
from switch_config import switch_cfg_by_target
class Switch:
TYPE_2POS = '2POS'
TYPE_3POS = '3POS'
TYPE_ADC = 'ADC'
class Switch:
TYPE_2POS = "2POS"
TYPE_3POS = "3POS"
TYPE_ADC = "ADC"
def __init__(self, name, sw_type, flags):
self.name = name
self.type = sw_type
self.flags = flags
self.inverted = False
self.default = None
self.display = []
class Switch2POS(Switch):
def __init__(self, name, gpio, pin, flags=0):
super(Switch2POS, self).__init__(name, Switch.TYPE_2POS, flags)
self.gpio = gpio
self.pin = pin
class Switch3POS(Switch):
def __init__(self, name, gpio_high, pin_high, gpio_low, pin_low, flags=0):
super(Switch3POS, self).__init__(name, Switch.TYPE_3POS, flags)
@@ -25,22 +30,38 @@ class Switch3POS(Switch):
self.gpio_low = gpio_low
self.pin_low = pin_low
class SwitchADC(Switch):
def __init__(self, name, adc_input, flags=0):
super(SwitchADC, self).__init__(name, Switch.TYPE_ADC, flags)
self.adc_input = adc_input
class SwitchCustom(Switch):
def __init__(self, name, type, flags=0):
super(SwitchCustom, self).__init__(name, type, flags)
def AZ_seq():
return [chr(i) for i in range(ord('A'), ord('Z') + 1)]
return [chr(i) for i in range(ord("A"), ord("Z") + 1)]
def eprint(*args, **kwargs):
from sys import stderr
print(*args, file=stderr, **kwargs)
def prefixsearch(dictionary, prefix):
for k in dictionary.keys():
if k.startswith(prefix):
return k[len(prefix) :]
return None
# switches from A to Z
def parse_switches(target, hw_defs, adc_parser):
switches = []
def find_switch(name):
@@ -48,22 +69,22 @@ def parse_switches(target, hw_defs, adc_parser):
if name == sw.name:
return sw
return None
for s in AZ_seq():
name = f"S{s}"
name = f'S{s}'
reg = f"SWITCHES_GPIO_REG_{s}"
reg_high = f"{reg}_H"
reg_low = f"{reg}_L"
reg = f'SWITCHES_GPIO_REG_{s}'
reg_high = f'{reg}_H'
reg_low = f'{reg}_L'
pin = f"SWITCHES_GPIO_PIN_{s}"
pin_high = f"{pin}_H"
pin_low = f"{pin}_L"
pin = f'SWITCHES_GPIO_PIN_{s}'
pin_high = f'{pin}_H'
pin_low = f'{pin}_L'
inverted = f"SWITCHES_{s}_INVERTED"
inverted = f'SWITCHES_{s}_INVERTED'
adc_input_name = f'SW{s}'
adc_input_name = f"SW{s}"
custom = f"SWITCHES_{s}_"
switch = None
if reg in hw_defs:
@@ -78,10 +99,13 @@ def parse_switches(target, hw_defs, adc_parser):
reg_low = hw_defs[reg_low]
pin_low = hw_defs[pin_low]
switch = Switch3POS(name, reg_high, pin_high, reg_low, pin_low)
else:
elif adc_parser.find_input(adc_input_name):
# ADC switch
if adc_parser.find_input(adc_input_name):
switch = SwitchADC(name, adc_input_name)
switch = SwitchADC(name, adc_input_name)
else:
type = prefixsearch(hw_defs, custom)
if type is not None:
switch = SwitchCustom(name, type)
if switch:
if inverted in hw_defs:
@@ -89,18 +113,22 @@ def parse_switches(target, hw_defs, adc_parser):
cfg = switch_cfg_by_target(target, name)
if cfg:
switch.default = cfg.get('default')
switch.display = cfg.get('display')
#eprint(switch.default)
switch.default = cfg.get("default")
switch.display = cfg.get("display")
# eprint(switch.default)
switches.append(switch)
for i in range(1, 6 + 1):
f_sw_marker = f'FUNCTION_SWITCH_{i}'
f_sw_marker = f"FUNCTION_SWITCH_{i}"
if f_sw_marker in hw_defs:
switch = find_switch(hw_defs[f_sw_marker])
if switch:
switch.type = 'FSWITCH'
switch.name = f'SW{i}'
switch.type = "FSWITCH"
switch.name = f"SW{i}"
else:
switch = SwitchCustom(f"SW{i}", Switch.TYPE_2POS)
switch.type = "FSWITCH"
switches.append(switch)
return switches
+33 -32
View File
@@ -1,34 +1,32 @@
#
# These methods are used to build helper indexes on JSON structures
#
def build_adc_index(adc_inputs):
i = 0
index = {}
for adc_input in adc_inputs['inputs']:
name = adc_input['name']
for adc_input in adc_inputs["inputs"]:
name = adc_input["name"]
index[name] = i
i = i + 1
return index
def append_to_index(d, key, val):
if key not in d:
d[key] = []
d[key].append(val)
def build_adc_gpio_port_index(adc_inputs):
def build_adc_gpio_port_index(adc_inputs):
i = 0
gpios = {}
for adc_input in adc_inputs['inputs']:
if adc_input['adc'] == 'SPI':
for adc_input in adc_inputs["inputs"]:
if adc_input["adc"] == "SPI":
continue
gpio = adc_input['gpio']
gpio = adc_input["gpio"]
if gpio is None:
i = i + 1
continue
@@ -36,57 +34,60 @@ def build_adc_gpio_port_index(adc_inputs):
if gpio not in gpios:
gpios[gpio] = []
pin = {
'pin': adc_input['pin'],
'idx': i
}
pin = {"pin": adc_input["pin"], "idx": i}
gpios[gpio].append(pin)
i = i + 1
return gpios
def build_switch_gpio_port_index(switches):
i = 0
def build_switch_gpio_port_index(switches):
gpios = {}
for switch in switches:
sw_type = switch['type']
sw_type = switch["type"]
if sw_type == '2POS' or sw_type == 'FSWITCH':
append_to_index(gpios, switch['gpio'], switch['pin'])
if sw_type == "2POS" or sw_type == "FSWITCH":
gpio = switch.get("gpio")
pin = switch.get("pin")
if gpio is not None and pin is not None:
append_to_index(gpios, gpio, pin)
elif sw_type == '3POS':
elif sw_type == "3POS":
gpio_high = switch.get("gpio_high")
pin_high = switch.get("pin_high")
if gpio_high is not None and pin_high is not None:
append_to_index(gpios, gpio_high, pin_high)
append_to_index(gpios, switch['gpio_high'], switch['pin_high'])
append_to_index(gpios, switch['gpio_low'], switch['pin_low'])
gpio_low = switch.get("gpio_low")
pin_low = switch.get("pin_low")
if gpio_low is not None and pin_low is not None:
append_to_index(gpios, gpio_low, pin_low)
return gpios
def build_trim_gpio_port_index(trims):
def index_contact(gpios, contact):
gpio = contact['gpio']
pin = contact['pin']
gpio = contact["gpio"]
pin = contact["pin"]
if gpio and pin:
append_to_index(gpios, contact['gpio'], contact['pin'])
append_to_index(gpios, contact["gpio"], contact["pin"])
i = 0
gpios = {}
for trim in trims:
dec = trim.get('dec')
inc = trim.get('inc')
dec = trim.get("dec")
inc = trim.get("inc")
if dec and inc:
index_contact(gpios, dec)
index_contact(gpios, inc)
return gpios
def build_key_gpio_port_index(keys):
i = 0
def build_key_gpio_port_index(keys):
gpios = {}
for key in keys:
append_to_index(gpios, key['gpio'], key['pin'])
append_to_index(gpios, key["gpio"], key["pin"])
return gpios
+53
View File
@@ -343,6 +343,59 @@ LEGACY_NAMES = [
}
}
},
{
"targets": {"gx12"},
"inputs": {
"LH": {
"yaml": "Rud",
"lua": "rud",
"description": "Rudder"
},
"LV": {
"yaml": "Ele",
"lua": "ele",
"description": "Elevator"
},
"RV": {
"yaml": "Thr",
"lua": "thr",
"description": "Throttle"
},
"RH": {
"yaml": "Ail",
"lua": "ail",
"description": "Aileron"
},
"P1": {
"yaml": "POT1",
"lua": "p1",
"label": "P1",
"short_label": "1",
"description": "Potentiometer 1"
},
"P2": {
"yaml": "POT2",
"lua": "p2",
"label": "P2",
"short_label": "2",
"description": "Potentiometer 2"
},
"SL1": {
"yaml": "SLIDER1",
"lua": "s1",
"label": "S1",
"short_label": "S1",
"description": "Left slider"
},
"SL2": {
"yaml": "SLIDER2",
"lua": "s2",
"label": "S2",
"short_label": "S2",
"description": "Right slider"
}
}
},
{
"targets": {"mt12"},
"inputs": {
+8 -1
View File
@@ -4,7 +4,14 @@ POT_CONFIG = {
"boxer": {
"P1": {"default": "POT_CENTER"},
"P2": {"default": "POT_CENTER"},
"P3": {"default": "MULTIPOS"}
"S1": {"default": "SLIDER"},
"S2": {"default": "SLIDER"}
},
"gx12": {
"P1": {"default": "POT_CENTER"},
"P2": {"default": "POT_CENTER"},
"SL1": {"default": "SLIDER"},
"SL2": {"default": "SLIDER"}
},
"el18": {
"P1": {"default": "POT_CENTER"},
+8 -4
View File
@@ -11,15 +11,18 @@ static const stm32_switch_t _switch_defs[] = {
{% if switch.type == '2POS' %}
{
"{{ switch.name }}",
{{ switch.gpio }}, {{ switch.pin }},
{{ switch.gpio or "nullptr" }},
{{ switch.pin or 0 }},
nullptr, 0,
SWITCH_HW_2POS, {{ 'SWITCH_HW_INVERTED' if switch.inverted else 0 }}
},
{% elif switch.type == '3POS' %}
{
"{{ switch.name }}",
{{ switch.gpio_high }}, {{ switch.pin_high }},
{{ switch.gpio_low }}, {{ switch.pin_low }},
{{ switch.gpio_high or "nullptr" }},
{{ switch.pin_high or 0 }},
{{ switch.gpio_low or "nullptr" }},
{{ switch.pin_low or 0 }},
SWITCH_HW_3POS, {{ 'SWITCH_HW_INVERTED' if switch.inverted else 0 }}
},
{% elif switch.type == 'ADC' %}
@@ -34,7 +37,8 @@ static const stm32_switch_t _switch_defs[] = {
{% for switch in function_switches %}
{
"{{ switch.name }}",
{{ switch.gpio }}, {{ switch.pin }},
{{ switch.gpio or "nullptr" }},
{{ switch.pin or 0 }},
nullptr, 0,
SWITCH_HW_2POS, {{ 'SWITCH_HW_INVERTED' if switch.inverted else 0 }}
},
+15 -1
View File
@@ -5,11 +5,25 @@ SWITCH_CONFIG = {
# left side
"SA": {"default": "2POS", "display": [0, 0]},
"SB": {"default": "3POS", "display": [0, 1]},
"SE": {"default": "2POS", "display": [0, 2]},
"SE": {"default": "3POS", "display": [0, 2]},
"SG": {"default": "2POS", "display": [0, 3]},
# right side
"SC": {"default": "3POS", "display": [1, 0]},
"SD": {"default": "2POS", "display": [1, 1]},
"SF": {"default": "TOGGLE", "display": [1, 2]},
"SH": {"default": "2POS", "display": [1, 3]},
},
"gx12": {
# left side
"SA": {"default": "TOGGLE", "display": [0, 0]},
"SB": {"default": "3POS", "display": [0, 1]},
"SE": {"default": "3POS", "display": [0, 2]},
"SG": {"default": "TOGGLE", "display": [0, 3]},
# right side
"SC": {"default": "3POS", "display": [1, 1]},
"SD": {"default": "TOGGLE", "display": [1, 0]},
"SF": {"default": "3POS", "display": [1, 2]},
"SH": {"default": "TOGGLE", "display": [1, 3]},
},
"commando8": {
# left side
+3
View File
@@ -23,6 +23,9 @@ get_target_build_options() {
tx12mk2)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=TX12MK2"
;;
gx12)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=GX12"
;;
boxer)
BUILD_OPTIONS+="-DPCB=X7 -DPCBREV=BOXER"
;;
+1 -1
View File
@@ -69,7 +69,7 @@ cd build
declare -a simulator_plugins=(x9lite x9lites
x7 x7access
t8 t12 t12max tx12 tx12mk2
zorro commando8 boxer pocket mt12
zorro commando8 boxer pocket mt12 gx12
tlite tpro tprov2 tpros bumblebee lr3pro t14
x9d x9dp x9dp2019 x9e
xlite xlites
+2 -2
View File
@@ -5,11 +5,11 @@ set -e
# set -x
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
. "$SCRIPT_DIR/build-common.sh"
. "$SCRIPT_DIR/build-common.sh"
: "${SRCDIR:=$(dirname "$(pwd)/$0")/..}"
: ${FLAVOR:="nv14;el18;t12;t12max;t15;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;tx12;tx12mk2;boxer;tx16s;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12"}
: ${FLAVOR:="nv14;el18;t12;t12max;t15;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12"}
: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}
# wipe build directory clean
+2 -2
View File
@@ -4,14 +4,14 @@
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
. "$SCRIPT_DIR/build-common.sh"
. "$SCRIPT_DIR/build-common.sh"
# Add GCC_ARM to PATH
if [[ -n ${GCC_ARM} ]] ; then
export PATH=${GCC_ARM}:$PATH
fi
: ${FLAVOR:="t15;tx16s;nv14;pl18;x9d;x9dp2019;x9e;xlite;xlites;x7;tpro;t20;f16"}
: ${FLAVOR:="t15;tx16s;nv14;pl18;x9d;x9dp2019;x9e;xlite;xlites;x7;tpro;t20;f16;gx12"}
: ${SRCDIR:=$(dirname "$(pwd)/$0")/..}
: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DDISABLE_COMPANION=YES -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}
+4 -1
View File
@@ -9,7 +9,7 @@
# -----------------------------------------------------------------------------
export BRANCH_NAME="main" # main|2.9|...
export RADIO_TYPE="tx16s" # tx16s|x10|x10express|x12s|x9d|x9dp|x9lite|x9lites|x7|x7access|t12|t12max|tx12|tx12mk2|mt12|boxer|t8|zorro|pocket|tlite|tpro|t20|t20v2|t14|lr3pro|xlite|xlites|x9dp2019|x9e|x9e-hall|t15|t16|t18|nv14|commando8
export RADIO_TYPE="tx16s" # tx16s|x10|x10express|x12s|x9d|x9dp|x9lite|x9lites|x7|x7access|t12|t12max|tx12|tx12mk2|mt12|gx12|boxer|t8|zorro|pocket|tlite|tpro|t20|t20v2|t14|lr3pro|xlite|xlites|x9dp2019|x9e|x9e-hall|t15|t16|t18|nv14|commando8
export BUILD_OPTIONS="-DDEFAULT_MODE=2 -DGVARS=YES"
@@ -33,6 +33,9 @@ case $RADIO_TYPE in
mt12)
BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=MT12 -DINTERNAL_MODULE_MULTI=ON"
;;
gx12)
BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=GX12 -DINTERNAL_MODULE_MULTI=ON"
;;
tx12)
BUILD_OPTIONS+=" -DPCB=X7 -DPCBREV=TX12"
;;