1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-17 05:15:18 +03:00

Bsongis/x9d+ 2019 (#6588)

X9D+ 2019 added
This commit is contained in:
Bertrand Songis 2019-07-26 19:18:29 +02:00 committed by GitHub
parent 37e1e0ef33
commit 151827ada5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
44 changed files with 704 additions and 321 deletions

View file

@ -18,12 +18,13 @@
* GNU General Public License for more details.
*/
#include <stdlib.h>
#include <algorithm>
#include "boards.h"
#include "helpers.h"
#include "opentxeeprom.h"
#include "customdebug.h"
#include <stdlib.h>
#include <algorithm>
#include "opentxinterface.h"
using namespace Board;
@ -31,8 +32,17 @@ using namespace Board;
#define MAX_SLIDERS(board) (IS_HORUS_X10(board) ? 4 : (Boards::getCapability(board, Board::Sliders))) //TODO need to be remove when x10 eeprom gets fixed
#define MAX_MOUSE_ANALOGS(board) (IS_HORUS_X10(board) ? 2 : (Boards::getCapability(board, Board::MouseAnalogs))) //TODO need to be remove when x10 eeprom gets fixed
#define MAX_GYRO_ANALOGS(board, version) (version >= 219 ? Boards::getCapability(board, Board::GyroAnalogs) : 0)
#define MAX_SWITCHES(board, version) (version <= 218 && IS_TARANIS_X7(board) ? 6 : Boards::getCapability(board, Board::Switches))
#define MAX_SWITCH_SLOTS(board, version) (IS_TARANIS_X9E(board) ? 32 : 8) // bitsize of swconfig_t / 2 (see radio/src/datastructs.h)
inline int MAX_SWITCHES(Board::Type board, int version)
{
if (version <= 218 && IS_TARANIS_X7(board))
return 6;
if (version <= 218 && IS_TARANIS_X9D(board))
return 8;
return Boards::getCapability(board, Board::Switches);
}
#define MAX_SWITCH_SLOTS(board, version) (IS_TARANIS_X9E(board) ? 32 : (version >= 219 ? 16 : 8)) // bitsize of swconfig_t / 2 (see radio/src/datastructs.h)
#define MAX_SWITCHES_POSITION(board, version) (Boards::getCapability(board, Board::SwitchPositions))
#define MAX_ROTARY_ENCODERS(board) (IS_SKY9X(board) ? 1 : 0)
#define MAX_FLIGHT_MODES(board, version) 9

View file

@ -16,7 +16,7 @@ set_property(CACHE PPM_UNIT PROPERTY STRINGS US PERCENT_PREC1 PERCENT_PREC0)
set(DEFAULT_MODE "" CACHE STRING "Default sticks mode")
set(FONT "STD" CACHE STRING "Choose font : STD or SQT5")
set_property(CACHE FONT PROPERTY STRINGS SQT5)
set(POPUP_LEVEL 2 CACHE INT "Popup level")
set(POPUP_LEVEL 2 CACHE STRING "Popup level")
option(HELI "Heli menu" ON)
option(FLIGHT_MODES "Flight Modes" ON)

View file

@ -21,14 +21,14 @@
#include "opentx.h"
#include "io/frsky_firmware_update.h"
#if defined(PCBHORUS) || defined(PCBX7) || defined(PCBXLITE)
#define BLUETOOTH_COMMAND_NAME "AT+NAME"
#define BLUETOOTH_ANSWER_NAME "OK+"
#define BLUETOOTH_COMMAND_BAUD_115200 "AT+BAUD115200"
#else
#if defined(PCBX9E)
#define BLUETOOTH_COMMAND_NAME "TTM:REN-"
#define BLUETOOTH_ANSWER_NAME "TTM:REN"
#define BLUETOOTH_COMMAND_BAUD_115200 "TTM:BPS-115200"
#else
#define BLUETOOTH_COMMAND_NAME "AT+NAME"
#define BLUETOOTH_ANSWER_NAME "OK+"
#define BLUETOOTH_COMMAND_BAUD_115200 "AT+BAUD115200"
#endif
#if defined(_MSC_VER)

View file

@ -1016,6 +1016,9 @@ int cliDisplay(const char ** argv)
case 2:
tim = TIM2;
break;
case 8:
tim = TIM8;
break;
case 13:
tim = TIM13;
break;

View file

@ -498,16 +498,20 @@ PACK(struct ModelHeader {
});
#if defined(COLORLCD)
typedef uint16_t swconfig_t;
typedef uint32_t swconfig_t;
typedef uint32_t swarnstate_t;
#elif defined(PCBX9E)
typedef uint64_t swconfig_t;
typedef uint64_t swarnstate_t;
typedef uint32_t swarnenable_t;
#elif defined(PCBX9D) || defined(PCBX9DP)
typedef uint32_t swconfig_t;
typedef uint32_t swarnstate_t;
typedef uint16_t swarnenable_t; // TODO remove it in 2.4
#elif defined(PCBTARANIS)
typedef uint16_t swconfig_t;
typedef uint16_t swarnstate_t;
typedef uint8_t swarnenable_t;
typedef uint8_t swarnenable_t; // TODO remove it in 2.4
#else
typedef uint8_t swarnstate_t;
typedef uint8_t swarnenable_t;
@ -519,7 +523,7 @@ typedef uint8_t swarnenable_t;
#else
#define SWITCHES_WARNING_DATA \
swarnstate_t switchWarningState; \
swarnenable_t switchWarningEnable;
swarnenable_t switchWarningEnable; // TODO remove it in 2.4
#endif
#if defined(PCBHORUS)
@ -663,7 +667,7 @@ PACK(struct TrainerData {
#if defined(PCBHORUS)
#define EXTRA_GENERAL_FIELDS \
NOBACKUP(uint8_t auxSerialMode); \
uint32_t switchConfig; \
swconfig_t switchConfig; \
uint16_t potsConfig; /* two bits per pot */ \
uint8_t slidersConfig; /* 1 bit per slider */ \
NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]); \
@ -673,7 +677,7 @@ PACK(struct TrainerData {
NOBACKUP(uint8_t blOffBright:7); \
NOBACKUP(char bluetoothName[LEN_BLUETOOTH_NAME]);
#elif defined(PCBTARANIS)
#if defined(BLUETOOTH)
#if defined(STORAGE_BLUETOOTH)
#define BLUETOOTH_FIELDS \
uint8_t spare; \
char bluetoothName[LEN_BLUETOOTH_NAME];
@ -919,8 +923,8 @@ static inline void check_struct()
CHKSIZE(RadioData, 960);
CHKSIZE(ModelData, 6614);
#elif defined(PCBX9D) || defined(PCBX9DP)
CHKSIZE(RadioData, 880);
CHKSIZE(ModelData, 6601);
CHKSIZE(RadioData, 898);
CHKSIZE(ModelData, 6604);
#elif defined(PCBSKY9X)
CHKSIZE(RadioData, 735);
CHKSIZE(ModelData, 5301);

View file

@ -203,37 +203,30 @@ enum MenuModelSetupItems {
#define EXTRA_MODULE_ROWS
#endif
#define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (IS_BLUETOOTH_TRAINER() ? (uint8_t)0 : (uint8_t)1) : HIDDEN_ROW)
#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1)
#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL())
#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW)
#if defined(PCBX7) || defined(PCBX9LITE)
#define ANTENNA_ROW
#if defined(BLUETOOTH)
#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1)
#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL())
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)),
#define TRAINER_CHANNELS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)0 : HIDDEN_ROW))
#else
#define TRAINER_BLUETOOTH_ROW
#define TRAINER_CHANNELS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW)
#endif
#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_BLUETOOTH_ROW TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#elif defined(PCBXLITES)
#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)),
#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW)
#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1)
#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL())
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW))
#define TRAINER_CHANNELS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)0 : HIDDEN_ROW))
#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#elif defined(PCBXLITE)
#define ANTENNA_ROW IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(0)),
#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW)
#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1)
#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL())
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW))
#define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW)
#define TRAINER_PPM_PARAMS_ROW (HIDDEN_ROW) // xlite has only BT trainer, so never PPM
#define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW), TRAINER_PPM_PARAMS_ROW
#define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW), HIDDEN_ROW /* xlite has only BT trainer, so never PPM */
#else
#define TRAINER_ROWS
#endif
@ -981,7 +974,7 @@ void menuModelSetup(event_t event)
#if defined(BLUETOOTH)
if (checkIncDec_Ret) {
bluetooth.state = BLUETOOTH_STATE_OFF;
bluetooth.distantAddr[0] = 0;
bluetooth.distantAddr[0] = '\0';
}
#endif
}

View file

@ -548,13 +548,9 @@ void menuMainView(event_t event)
}
// And ! in case of unexpected shutdown
#if defined(LOG_TELEMETRY) || defined(WATCHDOG_DISABLED) || defined(DEBUG_LATENCY)
lcdDrawChar(REBOOT_X, 0*FH, '!', INVERS);
#else
if (unexpectedShutdown) {
lcdDrawChar(REBOOT_X, 0*FH, '!', INVERS);
if (isAsteriskDisplayed()) {
lcdDrawChar(REBOOT_X, 0 * FH, '!', INVERS);
}
#endif
#if defined(GVARS)
if (gvarDisplayTimer > 0) {

View file

@ -632,13 +632,14 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx+1, att);
}
else if (idx >= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) {
idx = idx-MIXSRC_FIRST_SWITCH;
idx = idx - MIXSRC_FIRST_SWITCH;
if (ZEXIST(g_eeGeneral.switchNames[idx])) {
lcdDrawChar(x, y, '\312', att); //switch symbol
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, ZCHAR|att);
}
else
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx+MIXSRC_FIRST_SWITCH-MIXSRC_Rud+1, att);
else {
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att);
}
}
else if (idx < MIXSRC_SW1)
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att);

View file

@ -118,8 +118,11 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_TRAINER_LABEL,
ITEM_MODEL_SETUP_TRAINER_MODE,
ITEM_MODEL_SETUP_TRAINER_LINE1,
ITEM_MODEL_SETUP_TRAINER_LINE2,
#if defined(BLUETOOTH)
ITEM_MODEL_SETUP_TRAINER_BLUETOOTH,
#endif
ITEM_MODEL_SETUP_TRAINER_CHANNELS,
ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS,
ITEM_MODEL_SETUP_LINES_COUNT
};
@ -229,8 +232,17 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
#define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 1))
#define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW)
#define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW)
#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW)
#define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1)
#define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL())
#define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW)
#define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW))
#if defined(BLUETOOTH)
#define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#else
#define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW
#endif
#define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0
@ -275,6 +287,21 @@ inline uint8_t EXTERNAL_MODULE_MODE_ROWS() {
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)
#define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1))
#if defined(BLUETOOTH)
void onBluetoothConnectMenu(const char * result)
{
if (result != STR_EXIT) {
uint8_t index = (result - reusableBuffer.moduleSetup.bt.devices[0]) / sizeof(reusableBuffer.moduleSetup.bt.devices[0]);
strncpy(bluetooth.distantAddr, reusableBuffer.moduleSetup.bt.devices[index], LEN_BLUETOOTH_ADDR);
bluetooth.state = BLUETOOTH_STATE_BIND_REQUESTED;
}
else {
reusableBuffer.moduleSetup.bt.devicesCount = 0;
bluetooth.state = BLUETOOTH_STATE_DISCOVER_END;
}
}
#endif
#include "common/stdlcd/model_setup_pxx1.cpp"
#if defined(PXX2)
@ -348,10 +375,7 @@ void menuModelSetup(event_t event)
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2
IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 3
LABEL(Trainer),
0,
TRAINER_LINE1_ROWS,
TRAINER_LINE2_ROWS
TRAINER_ROWS
});
MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_LINES_COUNT);
@ -775,14 +799,6 @@ void menuModelSetup(event_t event)
break;
}
case ITEM_MODEL_SETUP_TRAINER_MODE:
lcdDrawTextAlignedLeft(y, INDENT TR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr);
if (attr) {
g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable);
}
break;
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL:
lcdDrawTextAlignedLeft(y, STR_EXTERNALRF);
break;
@ -918,7 +934,71 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, STR_TRAINER);
break;
case ITEM_MODEL_SETUP_TRAINER_LINE1:
case ITEM_MODEL_SETUP_TRAINER_MODE:
lcdDrawTextAlignedLeft(y, INDENT TR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr);
if (attr) {
g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable);
#if defined(BLUETOOTH)
if (checkIncDec_Ret) {
bluetooth.state = BLUETOOTH_STATE_OFF;
bluetooth.distantAddr[0] = '\0';
}
#endif
}
break;
#if defined(BLUETOOTH)
case ITEM_MODEL_SETUP_TRAINER_BLUETOOTH:
if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) {
if (attr) {
s_editMode = 0;
}
if (bluetooth.distantAddr[0]) {
lcdDrawText(INDENT_WIDTH, y+1, bluetooth.distantAddr, TINSIZE);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_CLEAR), attr);
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
bluetooth.state = BLUETOOTH_STATE_CLEAR_REQUESTED;
memclear(bluetooth.distantAddr, sizeof(bluetooth.distantAddr));
}
}
else {
lcdDrawText(INDENT_WIDTH, y, "---");
if (bluetooth.state < BLUETOOTH_STATE_IDLE)
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_BUTTON_INIT, attr);
else
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, BUTTON(TR_DISCOVER), attr);
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
if (bluetooth.state < BLUETOOTH_STATE_IDLE) {
bluetooth.state = BLUETOOTH_STATE_OFF;
}
else {
reusableBuffer.moduleSetup.bt.devicesCount = 0;
bluetooth.state = BLUETOOTH_STATE_DISCOVER_REQUESTED;
}
}
if (bluetooth.state == BLUETOOTH_STATE_DISCOVER_START && reusableBuffer.moduleSetup.bt.devicesCount > 0) {
popupMenuItemsCount = min<uint8_t>(reusableBuffer.moduleSetup.bt.devicesCount, 6);
for (uint8_t i=0; i<popupMenuItemsCount; i++) {
popupMenuItems[i] = reusableBuffer.moduleSetup.bt.devices[i];
}
popupMenuTitle = STR_BT_SELECT_DEVICE;
POPUP_MENU_START(onBluetoothConnectMenu);
}
}
}
else {
if (bluetooth.distantAddr[0])
lcdDrawText(INDENT_WIDTH, y+1, bluetooth.distantAddr, TINSIZE);
else
lcdDrawText(INDENT_WIDTH, y, "---");
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, bluetooth.state == BLUETOOTH_STATE_CONNECTED ? STR_CONNECTED : STR_NOT_CONNECTED);
}
break;
#endif
case ITEM_MODEL_SETUP_TRAINER_CHANNELS:
lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE);
lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_CH, menuHorizontalPosition==0 ? attr : 0);
lcdDrawNumber(lcdLastRightPos, y, g_model.trainerData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0));
@ -958,11 +1038,11 @@ void menuModelSetup(event_t event)
case 1:
CHECK_INCDEC_MODELVAR(event, moduleData.channelsCount, -4, min<int8_t>(maxModuleChannels_M8(moduleIdx), 32-8-moduleData.channelsStart));
#if defined(INTERNAL_MODULE_PPM)
if ((k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_TRAINER_LINE1)) {
if ((k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_TRAINER_CHANNELS)) {
SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx);
}
#else
if ((k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_TRAINER_LINE1)) {
if ((k == ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) || (k == ITEM_MODEL_SETUP_TRAINER_CHANNELS)) {
SET_DEFAULT_PPM_FRAME_LENGTH(moduleIdx);
}
#endif
@ -973,7 +1053,7 @@ void menuModelSetup(event_t event)
break;
}
case ITEM_MODEL_SETUP_TRAINER_LINE2:
case ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS:
lcdDrawTextAlignedLeft(y, STR_PPMFRAME);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT);
lcdDrawText(lcdLastRightPos, y, STR_MS);

View file

View file

@ -249,15 +249,10 @@ void displayTopBar()
/* Notifs icons */
coord_t x = BAR_NOTIFS_X;
#if defined(LOG_TELEMETRY) || defined(WATCHDOG_DISABLED)
LCD_NOTIF_ICON(x, ICON_REBOOT);
x -= 12;
#else
if (unexpectedShutdown) {
if (isAsteriskDisplayed()) {
LCD_NOTIF_ICON(x, ICON_REBOOT);
x -= 12;
}
#endif
if (usbPlugged()) {
LCD_NOTIF_ICON(x, ICON_USB);

View file

@ -257,6 +257,15 @@ void memswap(void * a, void * b, uint8_t size)
}
}
#if defined(PXX2)
void setDefaultOwnerId()
{
for (uint8_t i = 0; i < PXX2_LEN_REGISTRATION_ID; i++) {
g_eeGeneral.ownerRegistrationID[i] = (cpu_uid[1 + i] & 0x3f) - 26;
}
}
#endif
void generalDefault()
{
memclear(&g_eeGeneral, sizeof(g_eeGeneral));
@ -326,9 +335,7 @@ void generalDefault()
#endif
#if defined(PXX2)
for (uint8_t i=0; i<PXX2_LEN_REGISTRATION_ID; i++) {
g_eeGeneral.ownerRegistrationID[i] = (cpu_uid[1 + i] & 0x3f) - 26;
}
setDefaultOwnerId();
#endif
g_eeGeneral.chkSum = 0xFFFF;

View file

@ -660,6 +660,7 @@ inline void resumeMixerCalculations()
}
#endif
void setDefaultOwnerId();
void generalDefault();
void modelDefault(uint8_t id);
@ -1372,4 +1373,13 @@ inline bool isSimu()
extern uint8_t latencyToggleSwitch;
#endif
inline bool isAsteriskDisplayed()
{
#if defined(LOG_TELEMETRY) || defined(WATCHDOG_DISABLED) || defined(DEBUG_LATENCY)
return true;
#endif
return unexpectedShutdown;
}
#endif // _OPENTX_H_

View file

@ -169,7 +169,7 @@ void enablePulsesExternalModule(uint8_t protocol)
break;
#endif
#if defined(PXX2)
#if defined(PXX2) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML)
case PROTOCOL_CHANNELS_PXX2_HIGHSPEED:
extmoduleInvertedSerialStart(PXX2_HIGHSPEED_BAUDRATE);
break;

View file

@ -45,16 +45,6 @@
#define INTMODULE_PXX1_SERIAL_PERIOD 9/*ms*/
#endif
#if defined(PXX_FREQUENCY_HIGH) && (!defined(INTMODULE_USART) || !defined(EXTMODULE_USART))
/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */
/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */
/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */
/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */
/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */
#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)"
#endif
// Used by the Sky9x family boards
class SerialPxxBitTransport: public DataBuffer<uint8_t, 64> {
protected:

View file

@ -67,7 +67,9 @@ enum PXX2ModuleModelID {
PXX2_MODULE_R9M,
PXX2_MODULE_R9M_LITE,
PXX2_MODULE_R9M_LITE_PRO,
PXX2_MODULE_ISRM_N
PXX2_MODULE_ISRM_N,
PXX2_MODULE_ISRM_S_X9,
PXX2_MODULE_ISRM_S_X10
};
static const char * const PXX2ModulesNames[] = {
@ -79,7 +81,9 @@ static const char * const PXX2ModulesNames[] = {
"R9M",
"R9MLite",
"R9MLite-PRO",
"ISRM-N"
"ISRM-N",
"ISRM-S-X9",
"ISRM-S-X10",
};
inline const char * getPXX2ModuleName(uint8_t modelId)
@ -117,6 +121,8 @@ static const uint8_t PXX2ModuleOptions[] = {
0b11110010, // R9MLite
0b11110110, // R9MLite-PRO
0b11110100, // ISRM-N
0b11110100, // ISRM-S-X9
0b11110100, // ISRM-S-X10
};
inline uint8_t getPXX2ModuleOptions(uint8_t modelId)

View file

@ -56,23 +56,24 @@ __SECTION_USED(".bootversiondata") const char boot_version[] = "opentx-" FLA
* Tries to find opentx version in the first 1024 byte of either firmware/bootloader (the one not running) or the buffer
* @param buffer If non-null find the firmware version in the buffer instead
*/
const char* getOtherVersion(char* buffer)
const char * getOtherVersion(char* buffer)
{
#if defined(BOOT)
const char* startother = (char*)(FIRMWARE_ADDRESS+BOOTLOADER_SIZE);
const char * startother = (char*)(FIRMWARE_ADDRESS+BOOTLOADER_SIZE);
#else
const char* startother = (char*)(FIRMWARE_ADDRESS);
const char * startother = (char*)(FIRMWARE_ADDRESS);
#endif
if (buffer != nullptr)
startother=buffer;
startother = buffer;
const char* other_str = nullptr;
for (int i=0; i< 1024;i++) {
if (memcmp(startother+i, "opentx-", 7)==0) {
const char * other_str = nullptr;
for (int i=0; i<1024;i++) {
if (memcmp(startother+i, "opentx-", 7) == 0) {
other_str = startother + i;
break;
}
}
if (other_str != nullptr)
return other_str;
else

View file

@ -35,12 +35,18 @@ typedef ModelData ModelData_v219;
int convertSource_218_to_219(int source)
{
// on X7: 2 additional switches
// on X9D / X9D+: 1 additional switch
#if defined(PCBX7)
if (source >= MIXSRC_SI)
source += 2;
#endif
#if defined(PCBX9D) || defined(PCBX9DP)
if (source >= MIXSRC_SI)
source += 1;
#endif
#if defined(PCBHORUS)
if (source >= MIXSRC_GMBL)
source += 2;
@ -52,8 +58,9 @@ int convertSource_218_to_219(int source)
int convertSwitch_218_to_219(int swtch)
{
// on X7: 2 additional switches
// on X9D / X9D+: 1 additional switch
#if defined(PCBX7) || defined(PCBHORUS)
#if defined(PCBX7) || defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP)
if (swtch < 0)
return -convertSwitch_218_to_219(-swtch);
#endif
@ -63,6 +70,11 @@ int convertSwitch_218_to_219(int swtch)
swtch += 2 * 3;
#endif
#if defined(PCBX9D) || defined(PCBX9DP)
if (swtch >= SWSRC_SI0)
swtch += 3;
#endif
#if defined(PCBHORUS)
if (swtch >= SWSRC_GMBL0)
swtch += 2 * 3;
@ -184,6 +196,15 @@ void convertModelData_218_to_219(ModelData &model)
newModel.moduleData[i].type += 1;
if (newModel.moduleData[i].type >= MODULE_TYPE_R9M_PXX2)
newModel.moduleData[i].type += 4;
if (newModel.moduleData[i].type == MODULE_TYPE_XJT_PXX1) {
newModel.moduleData[i].subType = newModel.moduleData[i].rfProtocol;
#if defined(PCBX9DP) && PCBREV >= 2019
if (i == INTERNAL_MODULE) {
newModel.moduleData[i].type = MODULE_TYPE_ISRM_PXX2;
newModel.moduleData[i].subType = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16;
}
#endif
}
}
#if defined(RADIO_T12)
@ -250,21 +271,18 @@ void convertModelData_218_to_219(ModelData &model)
#else
newModel.screensType = oldModel.frsky.screensType;
memmove(&newModel.screens, &oldModel.frsky.screens, sizeof(newModel.screens));
#endif
#if defined(PCBX7)
for (int i=0; i<MAX_TELEMETRY_SCREENS; i++) {
uint8_t screenType = (newModel.screensType >> (2*i)) & 0x03;
if (screenType == TELEMETRY_SCREEN_TYPE_VALUES) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < NUM_LINE_ITEMS; k++) {
newModel.screens[i].lines[j].sources[k] = convertSource_218_to_219(newModel.screens[i].lines[j].sources[k]);
newModel.screens[i].lines[j].sources[k] = convertSource_218_to_219(oldModel.frsky.screens[i].lines[j].sources[k]);
}
}
}
else if (screenType == TELEMETRY_SCREEN_TYPE_GAUGES) {
for (int j = 0; j < 4; j++) {
newModel.screens[i].bars[j].source = convertSource_218_to_219(newModel.screens[i].bars[j].source);
newModel.screens[i].bars[j].source = convertSource_218_to_219(oldModel.frsky.screens[i].bars[j].source);
}
}
}
@ -280,30 +298,67 @@ void convertRadioData_218_to_219(RadioData & settings)
settings.version = 219;
settings.variant = EEPROM_VARIANT;
#if defined(PCBHORUS)
RadioData_v218 settings_v218 = (RadioData_v218 &)settings;
#if defined(STM32)
RadioData_v218 * oldSettingsAllocated = (RadioData_v218 *)malloc(sizeof(RadioData_v218));
RadioData_v218 & oldSettings = *oldSettingsAllocated;
memcpy(&oldSettings, &settings, sizeof(RadioData_v218));
#endif
memcpy(&settings.chkSum, &settings_v218.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum));
memcpy(&settings.calib[NUM_STICKS + 5], &settings_v218.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS));
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX7)
for (uint8_t i=0; i<MAX_SPECIAL_FUNCTIONS_218; i++) {
CustomFunctionData & cf = settings.customFn[i];
cf.swtch = convertSwitch_218_to_219(cf.swtch);
}
#endif
#if defined(PCBX9D) || defined(PCBX9DP)
// no bluetooth before PCBREV 2019
settings.auxSerialMode = oldSettings.auxSerialMode;
settings.slidersConfig = oldSettings.slidersConfig;
settings.potsConfig = oldSettings.potsConfig;
settings.backlightColor = oldSettings.backlightColor;
settings.switchUnlockStates = oldSettings.switchUnlockStates;
settings.switchConfig = oldSettings.switchConfig;
#if defined(PCBX9DP) && PCBREV >= 2019
settings.switchConfig |= SWITCH_TOGGLE << 16;
#endif
memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME);
memclear(&settings.switchNames[8], LEN_SWITCH_NAME);
memcpy(&settings.anaNames[0], &oldSettings.anaNames[0], (NUM_STICKS+NUM_POTS+NUM_SLIDERS) * LEN_ANA_NAME);
#endif
#if defined(PCBHORUS)
memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum));
memcpy(&settings.calib[NUM_STICKS + 5], &oldSettings.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS));
memclear(&settings.calib[NUM_STICKS + 3], sizeof(CalibData) * 2);
settings.auxSerialMode = settings_v218.auxSerialMode;
settings.switchConfig = settings_v218.switchConfig;
settings.potsConfig = settings_v218.potsConfig;
settings.slidersConfig = settings_v218.slidersConfig;
settings.auxSerialMode = oldSettings.auxSerialMode;
settings.switchConfig = oldSettings.switchConfig;
settings.potsConfig = oldSettings.potsConfig;
settings.slidersConfig = oldSettings.slidersConfig;
memcpy(&settings.switchNames[0], &settings_v218.switchNames[0], 8 * LEN_SWITCH_NAME);
memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME);
memclear(&settings.switchNames[8], 2 * LEN_SWITCH_NAME);
memcpy(&settings.anaNames[0], &settings_v218.anaNames[0], (NUM_STICKS + 3) * LEN_ANA_NAME);
memcpy(&settings.anaNames[0], &oldSettings.anaNames[0], (NUM_STICKS + 3) * LEN_ANA_NAME);
memclear(&settings.anaNames[NUM_STICKS + 3], 2 * LEN_SWITCH_NAME);
memcpy(&settings.anaNames[NUM_STICKS + 5], &settings_v218.anaNames[NUM_STICKS + 3], STORAGE_NUM_SLIDERS * LEN_ANA_NAME);
memcpy(&settings.anaNames[NUM_STICKS + 5], &oldSettings.anaNames[NUM_STICKS + 3], STORAGE_NUM_SLIDERS * LEN_ANA_NAME);
memcpy(&settings.currModelFilename[0], &settings_v218.currModelFilename[0], sizeof(RadioData_v218) - offsetof(RadioData_v218, currModelFilename[0]));
memcpy(&settings.currModelFilename[0], &oldSettings.currModelFilename[0], sizeof(RadioData_v218) - offsetof(RadioData_v218, currModelFilename[0]));
#endif
#if defined(RADIO_T12)
g_eeGeneral.switchConfig = bfSet<uint32_t>(g_eeGeneral.switchConfig, SWITCH_2POS, 10, 2); // T12 comes with wrongly defined pot2
g_eeGeneral.potsConfig = bfSet<uint32_t>(g_eeGeneral.potsConfig, POT_WITHOUT_DETENT, 2, 2); // T12 comes with wrongly defined pot2
#endif
#if defined(PCBX9DP) && PCBREV >= 2019
// force re-calibration
settings.chkSum = 0xFFFF;
setDefaultOwnerId();
#endif
#if defined(STM32)
free(oldSettingsAllocated);
#endif
}

View file

@ -24,12 +24,6 @@
#define MAX_TIMERS_218 3
#define MAX_GVARS_218 9
#if defined(BUZZER)
#define BUZZER_FIELD_218 int8_t buzzerMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all (only used on AVR radios without audio hardware)
#else
#define BUZZER_FIELD_218 int8_t spareRadio:2;
#endif
#if defined(PCBHORUS)
#define NUM_SWITCHES_218 8
#elif defined(PCBXLITE)
@ -130,6 +124,21 @@
#define MAX_TELEMETRY_SENSORS_218 32
#endif
#if defined(COLORLCD)
typedef uint32_t swarnstate218_t;
#elif defined(PCBX9E)
typedef uint64_t swconfig218_t;
typedef uint64_t swarnstate218_t;
typedef uint32_t swarnenable218_t;
#elif defined(PCBTARANIS)
typedef uint16_t swconfig218_t;
typedef uint16_t swarnstate218_t;
typedef uint8_t swarnenable218_t;
#else
typedef uint8_t swarnstate218_t;
typedef uint8_t swarnenable218_t;
#endif
PACK(typedef struct {
uint8_t type:4;
int8_t rfProtocol:4;
@ -416,7 +425,7 @@ PACK(struct ModelHeader_v218 {
#if defined(COLORLCD)
#define SWITCH_WARNING_DATA_218
#else
#define SWITCH_WARNING_DATA_218 swarnenable_t switchWarningEnable;
#define SWITCH_WARNING_DATA_218 swarnenable218_t switchWarningEnable;
#endif
PACK(struct ModelData_v218 {
@ -448,7 +457,7 @@ PACK(struct ModelData_v218 {
uint8_t thrTraceSrc;
swarnstate_t switchWarningState;
swarnstate218_t switchWarningState;
SWITCH_WARNING_DATA_218
@ -467,45 +476,8 @@ PACK(struct ModelData_v218 {
VIEW_DATA
});
#include "chksize.h"
#define CHKSIZE(x, y) check_size<struct x, y>()
static inline void check_struct_218()
{
#if defined(PCBHORUS)
CHKSIZE(ModelData_v218, 9380);
#elif defined(PCBX9E)
CHKSIZE(ModelData_v218, 6520);
#endif
}
#undef CHKSIZE
#define EXTRA_GENERAL_FIELDS_GENERAL_218 \
uint8_t backlightBright; \
uint32_t globalTimer; \
uint8_t bluetoothBaudrate:4; \
uint8_t bluetoothMode:4; \
uint8_t countryCode; \
uint8_t imperial:1; \
uint8_t jitterFilter:1; /* 0 - active */\
uint8_t disableRssiPoweroffAlarm:1; \
uint8_t USBMode:2; \
uint8_t spareExtraArm:3; \
char ttsLanguage[2]; \
int8_t beepVolume:4; \
int8_t wavVolume:4; \
int8_t varioVolume:4; \
int8_t backgroundVolume:4; \
int8_t varioPitch; \
int8_t varioRange; \
int8_t varioRepeat; \
CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS_218];
#if defined(PCBHORUS)
#define EXTRA_GENERAL_FIELDS_218 \
EXTRA_GENERAL_FIELDS_GENERAL_218 \
uint8_t auxSerialMode:4; \
uint8_t slidersConfig:4; \
uint32_t switchConfig; \
@ -517,27 +489,25 @@ static inline void check_struct_218()
uint8_t blOffBright:7; \
char bluetoothName[LEN_BLUETOOTH_NAME_218];
#elif defined(PCBTARANIS)
#if defined(BLUETOOTH)
#define BLUETOOTH_FIELDS_218 \
#if defined(STORAGE_BLUETOOTH) && !defined(PCBX9D) && !defined(PCBX9DP)
#define BLUETOOTH_FIELDS_218 \
uint8_t spare; \
char bluetoothName[LEN_BLUETOOTH_NAME_218];
#else
#define BLUETOOTH_FIELDS
#endif
#define EXTRA_GENERAL_FIELDS_218 \
EXTRA_GENERAL_FIELDS_GENERAL_218 \
#else
#define BLUETOOTH_FIELDS_218
#endif
#define EXTRA_GENERAL_FIELDS_218 \
uint8_t auxSerialMode:4; \
uint8_t slidersConfig:4; \
uint8_t potsConfig; /* two bits per pot */\
uint8_t backlightColor; \
swarnstate_t switchUnlockStates; \
swconfig_t switchConfig; \
swarnstate218_t switchUnlockStates; \
swconfig218_t switchConfig; \
char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \
char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218]; \
BLUETOOTH_FIELDS
BLUETOOTH_FIELDS_218
#elif defined(PCBSKY9X)
#define EXTRA_GENERAL_FIELDS_218 \
EXTRA_GENERAL_FIELDS_GENERAL_218 \
#define EXTRA_GENERAL_FIELDS_218 \
int8_t txCurrentCalibration; \
int8_t temperatureWarn; \
uint8_t mAhWarn; \
@ -548,18 +518,10 @@ static inline void check_struct_218()
uint8_t rotarySteps; \
char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \
char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME_218];
#else
#else
#define EXTRA_GENERAL_FIELDS_218 EXTRA_GENERAL_FIELDS_GENERAL_218
#endif
#if defined(PCBHORUS)
#define SPLASH_MODE_218 uint8_t splashSpares:3
#elif defined(FSPLASH)
#define SPLASH_MODE_218 uint8_t splashMode:3
#else
#define SPLASH_MODE_218 int8_t splashMode:3
#endif
#if defined(COLORLCD)
#include "gui/480x272/theme.h"
#define THEME_NAME_LEN 8
@ -570,7 +532,7 @@ static inline void check_struct_218()
#define THEME_DATA
#endif
PACK(typedef struct {
PACK(struct RadioData_v218 {
uint8_t version;
uint16_t variant;
CalibData calib[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS];
@ -582,7 +544,7 @@ PACK(typedef struct {
int8_t backlightMode;
TrainerData_v218 trainer;
uint8_t view; // index of view in main screen
BUZZER_FIELD_218
int8_t buzzerMode:2;
uint8_t fai:1;
int8_t beepMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all
uint8_t alarmsFlash:1;
@ -592,8 +554,10 @@ PACK(typedef struct {
int8_t timezone:5;
uint8_t adjustRTC:1;
uint8_t inactivityTimer;
SPLASH_MODE_218; /* 3bits */
int8_t hapticMode:2; // -2=quiet, -1=only alarms, 0=no keys, 1=all
int8_t splashMode:3;
int8_t hapticMode:2;
int8_t spare2:3;
int8_t switchesDelay;
uint8_t lightAutoOff;
uint8_t templateSetup; // RETA order for receiver channels
int8_t PPM_Multiplier;
@ -609,9 +573,47 @@ PACK(typedef struct {
int8_t vBatMin;
int8_t vBatMax;
uint8_t backlightBright;
uint32_t globalTimer;
uint8_t bluetoothBaudrate:4;
uint8_t bluetoothMode:4;
uint8_t countryCode;
uint8_t imperial:1;
uint8_t jitterFilter:1; /* 0 - active */
uint8_t disableRssiPoweroffAlarm:1;
uint8_t USBMode:2;
uint8_t spareExtraArm:3;
char ttsLanguage[2];
int8_t beepVolume:4;
int8_t wavVolume:4;
int8_t varioVolume:4;
int8_t backgroundVolume:4;
int8_t varioPitch;
int8_t varioRange;
int8_t varioRepeat;
CustomFunctionData_v218 customFn[MAX_SPECIAL_FUNCTIONS_218];
EXTRA_GENERAL_FIELDS_218
THEME_DATA
}) RadioData_v218;
});
#include "chksize.h"
#define CHKSIZE(x, y) check_size<struct x, y>()
static inline void check_struct_218()
{
#if defined(PCBHORUS)
CHKSIZE(ModelData_v218, 9380);
#elif defined(PCBX9E)
CHKSIZE(ModelData_v218, 6520);
#elif defined(PCBX9D)
CHKSIZE(RadioData_v218, 872);
#endif
}
#undef CHKSIZE
#endif //OPENTX_DATASTRUCTS_218_H

View file

@ -2,7 +2,7 @@
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
if(PCB STREQUAL X12S OR PCB STREQUAL X10)
if(CPU_TYPE_FULL STREQUAL STM32F429xI)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../f4/system_stm32f4xx.c
@ -19,7 +19,7 @@ if(PCB STREQUAL X12S OR PCB STREQUAL X10)
../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_sdio.c
../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/misc.c
)
elseif(PCB STREQUAL X9E)
elseif(CPU_TYPE_FULL STREQUAL STM32F407xE)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../f4/system_stm32f4xx.c
@ -85,7 +85,7 @@ set(BOOTLOADER_SRC
bin_files.cpp
)
if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/rotary_encoder_driver.cpp
@ -97,9 +97,7 @@ if(NOT (PCB STREQUAL X10 OR PCB STREQUAL X12S))
${BOOTLOADER_SRC}
../../../../../targets/${TARGET_DIR}/i2c_driver.cpp
)
remove_definitions(-DDEBUG)
else()
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
@ -131,7 +129,6 @@ set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -nostartfiles -lm -T${RADIO_SRC
# use smaller nano libc
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs")
add_executable(bootloader ${BOOTLOADER_SRC})
add_dependencies(bootloader ${BITMAPS_TARGET} firmware_translations)

View file

@ -591,7 +591,6 @@
#endif
// External Module
#define EXTMODULE_PULSES
#define EXTMODULE_PWR_GPIO GPIOB
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03
#if defined(PCBX10) || PCBREV >= 13
@ -679,6 +678,7 @@
#define TIMER_2MHz_TIMER TIM7
// Bluetooth
#define STORAGE_BLUETOOTH
#define BT_RCC_APB2Periph RCC_APB2Periph_USART6
#define BT_USART USART6
#define BT_GPIO_AF GPIO_AF_USART6

View file

@ -12,10 +12,11 @@ if(PCB STREQUAL X9E)
set(CPU_TYPE STM32F4)
set(CPU_TYPE_FULL STM32F407xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld)
add_definitions(-DSTM32F40_41xxx)
set(HAPTIC YES)
set(LUA_EXPORT lua_export_x9e)
set(FLAVOUR x9e)
add_definitions(-DSTM32F40_41xxx -DPCBX9E -DPCBX9)
add_definitions(-DPCBX9E -DPCBX9)
add_definitions(-DEEPROM_VARIANT=0x8000)
add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
set(FIRMWARE_TARGET_SRC
@ -35,9 +36,6 @@ if(PCB STREQUAL X9E)
set(GVAR_SCREEN model_gvars.cpp)
set(STATUS_LEDS NO)
elseif(PCB STREQUAL X9D+)
set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(HAPTIC YES)
set(LUA_EXPORT lua_export_x9d)
set(FLAVOUR x9d+)
@ -48,9 +46,30 @@ elseif(PCB STREQUAL X9D+)
set(BITMAPS_TARGET taranis_bitmaps)
set(FONTS_TARGET taranis_fonts)
set(LCD_DRIVER lcd_driver_spi.cpp)
set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp)
set(GVAR_SCREEN model_gvars.cpp)
set(PCBREV 2014 CACHE STRING "PCB Revision")
add_definitions(-DPCBREV=${PCBREV})
if (${PCBREV} STREQUAL 2019)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
set(CPU_TYPE STM32F4)
set(CPU_TYPE_FULL STM32F407xE) # for size report
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
startup_stm32f40_41xxx.s
)
set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld)
add_definitions(-DSTM32F40_41xxx)
add_definitions(-DSOFTWARE_VOLUME -DPWR_BUTTON_${PWR_BUTTON} -DHARDWARE_POWER_MANAGEMENT_UNIT)
set(STATUS_LEDS YES)
set(PXX2 ON)
set(PXX_FREQUENCY "HIGH")
else()
set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp)
set(STATUS_LEDS NO)
endif()
elseif(PCB STREQUAL X9D)
set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
@ -169,7 +188,7 @@ if(PCB STREQUAL XLITES)
)
endif()
if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE)
if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019))
add_definitions(-DINTERNAL_MODULE_SERIAL)
if(PXX_FREQUENCY STREQUAL HIGH)
add_definitions(-DPXX_FREQUENCY_HIGH)
@ -185,14 +204,14 @@ elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12))
)
endif()
if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
if(PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/rotary_encoder_driver.cpp
)
endif()
if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019))
add_definitions(-DBLUETOOTH)
set(TARGET_SRC
${TARGET_SRC}

View file

@ -44,15 +44,16 @@ void watchdogInit(unsigned int duration)
#if defined(PWR_BUTTON_PRESS)
#define PWR_PRESS_DURATION_MIN 100 // 1s
#define PWR_PRESS_DURATION_MAX 500 // 5s
#endif
#if (defined(PCBX9E) && !defined(SIMU))
const unsigned char bmp_startup[] = {
#if LCD_DEPTH > 1
const unsigned char bmp_startup[] = {
#include "startup.lbm"
};
const unsigned char bmp_lock[] = {
};
const unsigned char bmp_lock[] = {
#include "lock.lbm"
};
};
#endif
#endif
#if defined(SPORT_UPDATE_PWR_GPIO)

View file

@ -133,11 +133,12 @@ void extmoduleSendNextFrame();
// Trainer driver
#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE)
#if defined(PCBX9E)
#define TRAINER_CONNECTED() (true)
#elif defined(PCBX7) || defined(PCBX9LITE)
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET)
#if defined(PCBX9D) || (defined(PCBX9DP) && PCBREV < 2019)
// Trainer detect is a switch on the jack
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET)
#elif defined(PCBXLITES)
// Trainer is on the same connector than Headphones
enum JackState
{
SPEAKER_ACTIVE,
@ -147,10 +148,13 @@ void extmoduleSendNextFrame();
extern uint8_t jackState;
#define TRAINER_CONNECTED() (jackState == TRAINER_ACTIVE)
#elif defined(PCBXLITE)
#define TRAINER_CONNECTED() false // there is no Trainer jack on Taranis X-Lite
// No Tainer jack on Taranis X-Lite
#define TRAINER_CONNECTED() false
#else
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET)
// Trainer detect catches PPM, detection would use more CPU
#define TRAINER_CONNECTED() true
#endif
#if defined(TRAINER_GPIO)
void init_trainer_ppm();
void stop_trainer_ppm();
@ -323,6 +327,11 @@ enum EnumSwitchesPositions
SW_SH1,
SW_SH2,
#endif
#if defined(PCBX9DP) && PCBREV >= 2019
SW_SI0,
SW_SI1,
SW_SI2,
#endif
#if defined(PCBX7)
SW_SI0,
SW_SI1,
@ -397,9 +406,15 @@ enum EnumSwitchesPositions
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
#else
#define NUM_SWITCHES 8
#elif defined(PCBX9DP) && PCBREV >= 2019
#define NUM_SWITCHES 9
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 16) + (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
#elif defined(PCBX9D) || defined(PCBX9DP)
#define NUM_SWITCHES 8
#define STORAGE_NUM_SWITCHES 9
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
@ -407,10 +422,10 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3)
void keysInit(void);
void keysInit();
uint32_t switchState(uint8_t index);
uint32_t readKeys(void);
uint32_t readTrims(void);
uint32_t readKeys();
uint32_t readTrims();
#define TRIMS_PRESSED() (readTrims())
#define KEYS_PRESSED() (readKeys())
@ -484,8 +499,6 @@ enum Analogs {
#define STORAGE_NUM_SLIDERS 2
#endif
#define NUM_XPOTS NUM_POTS
#define NUM_XPOTS NUM_POTS
#define NUM_TRIMS 4
#define NUM_MOUSE_ANALOGS 0
@ -575,6 +588,8 @@ extern uint16_t adcValues[NUM_ANALOGS];
#define BATT_SCALE 123
#elif defined(PCBX9LITE)
#define BATT_SCALE 117
#elif defined(PCBX9DP) && PCBREV >= 2019
#define BATT_SCALE 117
#else
#define BATT_SCALE 150
#endif
@ -649,11 +664,11 @@ void telemetryClearFifo();
extern uint32_t telemetryErrors;
// PCBREV driver
#if defined(PCBXLITE) || defined(PCBX9LITE)
#define HAS_SPORT_UPDATE_CONNECTOR() true
#elif defined(PCBX7)
#if defined(PCBX7)
#define IS_PCBREV_40() (GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) == Bit_SET)
#define HAS_SPORT_UPDATE_CONNECTOR() IS_PCBREV_40()
#elif defined(SPORT_UPDATE_PWR_GPIO)
#define HAS_SPORT_UPDATE_CONNECTOR() true
#else
#define HAS_SPORT_UPDATE_CONNECTOR() false
#endif
@ -766,7 +781,6 @@ void ledBlue(void);
#define LCD_W 212
#define LCD_H 64
#define LCD_DEPTH 4
#define IS_LCD_RESET_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE())
#define LCD_CONTRAST_MIN 0
#define LCD_CONTRAST_MAX 45
#define LCD_CONTRAST_DEFAULT 25
@ -779,6 +793,13 @@ void ledBlue(void);
#define LCD_CONTRAST_MAX 30
#define LCD_CONTRAST_DEFAULT 20
#endif
#if defined(PCBX9D) || defined(PCBX9E) || (defined(PCBX9DP) && PCBREV < 2019)
#define IS_LCD_RESET_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE())
#else
#define IS_LCD_RESET_NEEDED() true
#endif
void lcdInit(void);
void lcdInitFinish(void);
void lcdOff(void);

View file

@ -25,8 +25,8 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str)
if (st == ST_START) {
lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware");
lcdDrawTextAlignedLeft(3 * FH, "\010Restore EEPROM");
lcdDrawTextAlignedLeft(4 * FH, "\010Exit");
lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM");
lcdDrawTextAlignedLeft(4*FH, "\010Exit");
#if LCD_W >= 212
lcdDrawTextAlignedLeft(6*FH, "\001Curr FW:");
@ -58,20 +58,21 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str)
}
else if (st == ST_FLASH_CHECK) {
if (opt == FC_ERROR) {
if (memoryType == MEM_FLASH)
bootloaderDrawMsg(0, STR_INVALID_FIRMWARE, 2, false);
else
bootloaderDrawMsg(0, STR_INVALID_EEPROM, 2, false);
}
else if (opt == FC_OK) {
const char *vers = getOtherVersion((char *) Block_buffer);
if (memoryType == MEM_FLASH) {
const char * vers = getOtherVersion((char *) Block_buffer);
#if LCD_W < 212
// Remove opentx- from string
if (strstr(vers, "opentx-"))
vers = vers + 7;
#endif
bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false);
}
bootloaderDrawMsg(0, STR_HOLD_ENTER_TO_START, 2, false);
}
}

View file

@ -77,6 +77,15 @@
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_9 // PE.09
#define KEYS_GPIO_REG_ENTER GPIOE->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11
#elif defined(PCBX9DP) && PCBREV >= 2019
#define KEYS_GPIO_REG_MENU GPIOD->IDR
#define KEYS_GPIO_PIN_MENU GPIO_Pin_2 // PD.02
#define KEYS_GPIO_REG_EXIT GPIOD->IDR
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_7 // PD.07
#define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03
#define KEYS_GPIO_REG_ENTER GPIOE->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_12 // PE.12
#else
#define KEYS_GPIO_REG_MENU GPIOD->IDR
#define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07
@ -106,6 +115,19 @@
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOD
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource12
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource13
#elif defined(PCBX9DP) && PCBREV >= 2019
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_10 // PE.10
#define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_11 // PE.11
#define ROTARY_ENCODER_POSITION() (((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x02) + ((ROTARY_ENCODER_GPIO->IDR >> 11) & 0x01))
#define ROTARY_ENCODER_EXTI_LINE1 EXTI_Line10
#define ROTARY_ENCODER_EXTI_LINE2 EXTI_Line11
#define ROTARY_ENCODER_EXTI_IRQn1 EXTI15_10_IRQn
#define ROTARY_ENCODER_EXTI_IRQHandler1 EXTI15_10_IRQHandler
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource11
#elif defined(RADIO_X7)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
@ -205,6 +227,23 @@
#define TRIMS_GPIO_PIN_RVD GPIO_Pin_14 // PE.14
#define TRIMS_GPIO_REG_RHL GPIOD->IDR
#define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09
#elif defined(PCBX9DP) && PCBREV >= 2019
#define TRIMS_GPIO_REG_LHL GPIOE->IDR
#define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PE.03
#define TRIMS_GPIO_REG_LHR GPIOE->IDR
#define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PE.04
#define TRIMS_GPIO_REG_LVD GPIOE->IDR
#define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06
#define TRIMS_GPIO_REG_LVU GPIOE->IDR
#define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05
#define TRIMS_GPIO_REG_RVD GPIOC->IDR
#define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03
#define TRIMS_GPIO_REG_RVU GPIOC->IDR
#define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02
#define TRIMS_GPIO_REG_RHL GPIOC->IDR
#define TRIMS_GPIO_PIN_RHL GPIO_Pin_13 // PC.13
#define TRIMS_GPIO_REG_RHR GPIOC->IDR
#define TRIMS_GPIO_PIN_RHR GPIO_Pin_1 // PC.01
#else
#define TRIMS_GPIO_REG_LHL GPIOE->IDR
#define TRIMS_GPIO_PIN_LHL GPIO_Pin_4 // PE.04
@ -465,6 +504,15 @@
#define SWITCHES_GPIO_PIN_H GPIO_Pin_13 // PE.13
#endif
#if defined(PCBX9DP) && PCBREV >= 2019
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
#define SWITCHES_GPIO_REG_I GPIOD->IDR
#define SWITCHES_GPIO_PIN_I GPIO_Pin_10 // PD.10
#elif defined(PCBX9D) || defined(PCBX9DP)
#define STORAGE_SWITCH_I
#endif
// X7 P400 P401 headers additionnal momentary switches
#if defined(PCBX7)
#define STORAGE_SWITCH_I
@ -549,6 +597,13 @@
#define KEYS_GPIOE_PINS (TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_LVD | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L| SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_E_L | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_I_L | SWITCHES_GPIO_PIN_L_H | SWITCHES_GPIO_PIN_L_L | SWITCHES_GPIO_PIN_M_H | SWITCHES_GPIO_PIN_O_L | SWITCHES_GPIO_PIN_R_L)
#define KEYS_GPIOF_PINS (KEYS_GPIO_PIN_ENTER | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | SWITCHES_GPIO_PIN_I_H | SWITCHES_GPIO_PIN_O_H | SWITCHES_GPIO_PIN_P_H | SWITCHES_GPIO_PIN_P_L | SWITCHES_GPIO_PIN_Q_H | SWITCHES_GPIO_PIN_Q_L)
#define KEYS_GPIOG_PINS (TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR| SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_J_H | SWITCHES_GPIO_PIN_J_L | SWITCHES_GPIO_PIN_K_H | SWITCHES_GPIO_PIN_K_L)
#elif defined(PCBX9DP) && PCBREV >= 2019
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS (GPIO_Pin_5)
#define KEYS_GPIOB_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5)
#define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_13)
#define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_10 | GPIO_Pin_14)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
#elif defined(PCBX9DP)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS (SWITCHES_GPIO_PIN_C_L)
@ -666,20 +721,26 @@
#define ADC_CHANNEL_STICK_LV ADC_Channel_3 // ADC1_IN3
#define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06
#define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00
#if PCBREV < 2019
#define ADC_GPIO_PIN_POT3 GPIO_Pin_1 // PB.01
#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3)
#define ADC_CHANNEL_POT3 ADC_Channel_9
#define ADC_VREF_PREC2 330
#else
#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2)
#define ADC_CHANNEL_POT3 0
#define ADC_VREF_PREC2 300
#endif
#define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_4 // PC.04
#define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_5 // PC.05
#define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1)
#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_POT3)
#define ADC_GPIOC_PINS (ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT)
#define ADC_CHANNEL_POT1 ADC_Channel_6
#define ADC_CHANNEL_POT2 ADC_Channel_8
#define ADC_CHANNEL_POT3 ADC_Channel_9
#define ADC_CHANNEL_SLIDER1 ADC_Channel_14
#define ADC_CHANNEL_SLIDER2 ADC_Channel_15
#define ADC_CHANNEL_BATT ADC_Channel_10
#define ADC_VREF_PREC2 330
#elif defined(PCBXLITE)
#define HARDWARE_POT1
#define HARDWARE_POT2
@ -804,7 +865,13 @@
#define PWR_ON_GPIO_PIN GPIO_Pin_0 // PD.00
#endif
#if defined(PCBXLITE)
#if defined(PCBX9DP) && PCBREV >= 2019
#define STATUS_LEDS
#define GPIO_LED_GPIO_ON GPIO_SetBits
#define GPIO_LED_GPIO_OFF GPIO_ResetBits
#define LED_GREEN_GPIO GPIOA
#define LED_GREEN_GPIO_PIN GPIO_Pin_13 // PA.13
#elif defined(PCBXLITE)
#define STATUS_LEDS
#define GPIO_LED_GPIO_ON GPIO_ResetBits
#define GPIO_LED_GPIO_OFF GPIO_SetBits
@ -840,9 +907,10 @@
#if !defined(RADIO_T12)
#define HARDWARE_INTERNAL_MODULE
#endif
#if !defined(PCBXLITES) && !defined(PCBX9LITE)
#if !defined(PCBXLITES) && !defined(PCBX9LITE) && !(defined(PCBX9DP) && PCBREV >= 2019)
#define INTERNAL_MODULE_PXX1
#endif
#define INTMODULE_FLASH_BAUDRATE 57600
#if defined(PCBXLITE) || defined(PCBX9LITE)
#define INTMODULE_RCC_APB1Periph 0
#define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1
@ -873,7 +941,26 @@
#define INTMODULE_BOOTCMD_GPIO GPIOC
#define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08
#endif
#define INTMODULE_FLASH_BAUDRATE 57600
#elif defined(PCBX9DP) && PCBREV >= 2019
#define INTMODULE_RCC_APB1Periph 0
#define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
#define INTMODULE_PWR_GPIO GPIOA
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_7 // PA.07
#define INTMODULE_GPIO GPIOB
#define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06
#define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07
#define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6
#define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7
#define INTMODULE_USART USART1
#define INTMODULE_GPIO_AF GPIO_AF_USART1
#define INTMODULE_USART_IRQHandler USART1_IRQHandler
#define INTMODULE_USART_IRQn USART1_IRQn
#define INTMODULE_DMA_STREAM DMA2_Stream7
#define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#define INTMODULE_DMA_CHANNEL DMA_Channel_4
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
@ -938,16 +1025,19 @@
#endif
// External Module
#define EXTMODULE_PULSES
#if defined(PCBXLITE) || defined(PCBX9LITE)
#define HARDWARE_EXTERNAL_MODULE_SIZE_SML
#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019)
#define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6)
#if defined(PCBX9LITE)
#if defined(PCBX9DP) && PCBREV >= 2019
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
#elif defined(PCBX9LITE)
#define HARDWARE_EXTERNAL_MODULE_SIZE_SML
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define EXTMODULE_PWR_GPIO GPIOA
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PA.08
#else
#define HARDWARE_EXTERNAL_MODULE_SIZE_SML
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_11 // PD.11
@ -1005,8 +1095,30 @@
#define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1NE
#define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1NP
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#elif defined(PCBX9DP) && PCBREV >= 2019
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6)
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
#define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define EXTMODULE_TX_GPIO GPIOC
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // PC.07
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7
#define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH2
#define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
#define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1
#define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC2E
#define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC2NP
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else
#define EXTMODULE_PULSES
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8
#define EXTMODULE_PWR_GPIO GPIOD
@ -1021,8 +1133,8 @@
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
#define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
#define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1
@ -1105,7 +1217,7 @@
#endif
// Serial Port
#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE)
#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019)
#define AUX_SERIAL_RCC_AHB1Periph 0
#define AUX_SERIAL_RCC_APB1Periph 0
#else
@ -1130,7 +1242,7 @@
#define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2
#define TELEMETRY_DIR_GPIO GPIOD
#define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04
#if defined(PCBXLITE) || defined(PCBX9LITE)
#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019)
#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
#else
@ -1183,6 +1295,13 @@
#define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15
#define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits
#define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits
#elif defined(PCBX9DP) && PCBREV >= 2019
#define SPORT_MAX_BAUDRATE 400000
#define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define SPORT_UPDATE_PWR_GPIO GPIOA
#define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_14 // PA.14
#define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits
#define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits
#else
#define SPORT_MAX_BAUDRATE 400000
#define SPORT_UPDATE_RCC_AHB1Periph 0
@ -1202,14 +1321,14 @@
#define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI15_10_IRQHandler
#elif defined(PCBX9LITE)
// #define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph 0 // RCC_AHB1Periph_GPIOC
// #define INTMODULE_HEARTBEAT_GPIO GPIOC
// #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_9
#define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOC
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource9
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn
#define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler
// #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOC
// #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource9
// #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9
// #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn
// #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler
#elif defined(RADIO_X7)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER
@ -1220,6 +1339,16 @@
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn
#elif defined(PCBX9DP) && PCBREV >= 2019
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define INTMODULE_HEARTBEAT_GPIO GPIOB
#define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_1 // PB.01
#define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOB
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource1
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line1
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI1_IRQn
#define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI1_IRQHandler
#else
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@ -1474,6 +1603,15 @@
#define I2C_WP_GPIO_PIN GPIO_Pin_7 // PD.07
#define I2C_SCL_GPIO_PinSource GPIO_PinSource8
#define I2C_SDA_GPIO_PinSource GPIO_PinSource9
#elif defined(PCBX9DP) && PCBREV >= 2019
#define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF)
#define I2C_SPI_GPIO GPIOB
#define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09
#define I2C_SCL_GPIO_PIN GPIO_Pin_8 // PB.08
#define I2C_WP_GPIO GPIOF
#define I2C_WP_GPIO_PIN GPIO_Pin_0 // PF.00
#define I2C_SCL_GPIO_PinSource GPIO_PinSource8
#define I2C_SDA_GPIO_PinSource GPIO_PinSource9
#else
#define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define I2C_SPI_GPIO GPIOB
@ -1483,10 +1621,10 @@
#define I2C_WP_GPIO_PIN GPIO_Pin_9 // PB.09
#define I2C_SCL_GPIO_PinSource GPIO_PinSource6
#define I2C_SDA_GPIO_PinSource GPIO_PinSource7
#define I2C_ADDRESS_VOLUME 0x5C
#endif
#define I2C_SPEED 400000
#define I2C_ADDRESS_EEPROM 0xA2
#define I2C_ADDRESS_VOLUME 0x5C
#define I2C_FLASH_PAGESIZE 64
// Second I2C Bus: IMU
@ -1578,6 +1716,20 @@
#define HAPTIC_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2
#define HAPTIC_CCER TIM_CCER_CC2E
#define BACKLIGHT_BDTR TIM_BDTR_MOE
#elif defined(PCBX9DP) && PCBREV >= 2019
#define HAPTIC_PWM
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define HAPTIC_RCC_APB2Periph RCC_APB2Periph_TIM1
#define HAPTIC_RCC_APB1Periph 0
#define HAPTIC_GPIO_PinSource GPIO_PinSource10
#define HAPTIC_GPIO GPIOA
#define HAPTIC_GPIO_PIN GPIO_Pin_10 // PA.10
#define HAPTIC_GPIO_AF GPIO_AF_TIM1
#define HAPTIC_TIMER TIM1 // Timer1 Channel3
#define HAPTIC_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define HAPTIC_COUNTER_REGISTER HAPTIC_TIMER->CCR3
#define HAPTIC_CCMR2 TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2
#define HAPTIC_CCER TIM_CCER_CC3E
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7)
#define HAPTIC_PWM
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
@ -1613,6 +1765,7 @@
// Bluetooth
#if defined(PCBX9E)
#define STORAGE_BLUETOOTH
#define BT_USART USART6
#define BT_GPIO_AF GPIO_AF_USART6
#define BT_USART_IRQn USART6_IRQn
@ -1631,14 +1784,21 @@
#define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9
#define BT_USART_IRQHandler USART6_IRQHandler
#elif defined(PCBX7) || defined(PCBXLITE)
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1
#elif defined(PCBX7) || defined(PCBXLITE) || (defined(PCBX9DP) && PCBREV >= 2019)
#define STORAGE_BLUETOOTH
#define BT_RCC_APB1Periph RCC_APB1Periph_USART3
#define BT_RCC_APB2Periph 0
#if defined(PCBX9DP)
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB) // RCC_AHB1Periph_DMA1
#define BT_EN_GPIO GPIOB
#define BT_EN_GPIO_PIN GPIO_Pin_2 // PB.02
#elif defined(PCBXLITE)
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1
#define BT_EN_GPIO GPIOE
#if defined(PCBXLITE)
#define BT_EN_GPIO_PIN GPIO_Pin_15 // PE.15
#else
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE) // RCC_AHB1Periph_DMA1
#define BT_EN_GPIO GPIOE
#define BT_EN_GPIO_PIN GPIO_Pin_12 // PE.12
#endif
#define BT_USART_GPIO GPIOB
@ -1652,6 +1812,11 @@
#define BT_USART_IRQn USART3_IRQn
// #define BT_DMA_Stream_RX DMA1_Stream1
// #define BT_DMA_Channel_RX DMA_Channel_4
#elif defined(PCBX9D) || defined(PCBX9DP)
#define STORAGE_BLUETOOTH
#define BT_RCC_AHB1Periph 0
#define BT_RCC_APB1Periph 0
#define BT_RCC_APB2Periph 0
#else
#define BT_RCC_AHB1Periph 0
#define BT_RCC_APB1Periph 0

View file

@ -22,7 +22,7 @@
#if defined(HAPTIC_PWM)
// TODO test Haptic on X7 (I added PWM support)
void hapticOff(void)
void hapticOff()
{
HAPTIC_COUNTER_REGISTER = 0;
}
@ -35,7 +35,7 @@ void hapticOn(uint32_t pwmPercent)
HAPTIC_COUNTER_REGISTER = pwmPercent;
}
void hapticInit(void)
void hapticInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = HAPTIC_GPIO_PIN;
@ -55,6 +55,7 @@ void hapticInit(void)
HAPTIC_TIMER->CCMR2 = HAPTIC_CCMR2; // PWM
#endif
HAPTIC_TIMER->CCER = HAPTIC_CCER;
HAPTIC_TIMER->BDTR = TIM_BDTR_MOE; // Enable output
HAPTIC_COUNTER_REGISTER = 0;
HAPTIC_TIMER->EGR = 0;
HAPTIC_TIMER->CR1 = TIM_CR1_CEN; // Counter enable
@ -63,7 +64,7 @@ void hapticInit(void)
#else
// No PWM before X9D+
void hapticInit(void)
void hapticInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = HAPTIC_GPIO_PIN;
@ -74,7 +75,7 @@ void hapticInit(void)
GPIO_Init(HAPTIC_GPIO, &GPIO_InitStructure);
}
void hapticOff(void)
void hapticOff()
{
GPIO_ResetBits(HAPTIC_GPIO, HAPTIC_GPIO_PIN);
}

View file

@ -141,7 +141,7 @@ void readKeysAndTrims()
break; \
case SW_S ## x ## 0: \
xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
break;
break
#else
#define ADD_2POS_CASE(x) \
case SW_S ## x ## 0: \
@ -149,9 +149,10 @@ void readKeysAndTrims()
break; \
case SW_S ## x ## 2: \
xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
break;
break
#endif
#define ADD_3POS_CASE(x, i) \
#define ADD_3POS_CASE(x, i) \
case SW_S ## x ## 0: \
xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
if (IS_CONFIG_3POS(i)) { \
@ -201,6 +202,10 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(H);
#endif
#if defined(PCBX9DP) && PCBREV >= 2019
ADD_2POS_CASE(I);
#endif
#if defined(PCBX9E)
ADD_3POS_CASE(I, 8);
ADD_3POS_CASE(J, 9);

View file

@ -310,6 +310,13 @@ void lcdInit()
Finishes LCD initialization. It is called auto-magically when first LCD command is
issued by the other parts of the code.
*/
#if defined(PCBX9DP) && PCBREV >= 2019
#define LCD_DELAY_NEEDED() true
#else
#define LCD_DELAY_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE())
#endif
void lcdInitFinish()
{
lcdInitFinished = true;
@ -331,9 +338,9 @@ void lcdInitFinish()
initialization (without reset) is also recommended by the data sheet.
*/
if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) {
if (LCD_DELAY_NEEDED()) {
#if !defined(BOOT)
while (g_tmr10ms < (RESET_WAIT_DELAY_MS/10)); // wait measured from the power-on
while (g_tmr10ms < (RESET_WAIT_DELAY_MS / 10)); // wait measured from the power-on
#else
delay_ms(RESET_WAIT_DELAY_MS);
#endif

View file

@ -224,20 +224,20 @@ void processSpectrumAnalyserFrame(uint8_t module, uint8_t * frame)
return;
}
uint32_t * frequency = (uint32_t *)&frame[4];
int8_t * power = (int8_t *)&frame[8];
uint32_t frequency = *((uint32_t *)&frame[4]);
int8_t power = *((int8_t *)&frame[8]);
// center = 2440000000; // 2440MHz
// span = 40000000; // 40MHz
// left = 2440000000 - 20000000
// step = 10000
// TRACE("Fq=%u, Pw=%d, X=%d, Y=%d", *frequency, int32_t(*power), D * 128 / 40000000, int32_t(127 + *power));
int32_t offset = frequency - (reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2);
TRACE("Fq=%u => %d, Pw=%d", frequency, offset, int32_t(power));
int32_t position = *frequency - (reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2);
uint32_t x = (position * LCD_W / 8) / (reusableBuffer.spectrumAnalyser.span / 8);
uint32_t x = offset / reusableBuffer.spectrumAnalyser.step;
if (x < LCD_W) {
reusableBuffer.spectrumAnalyser.bars[x] = 0x80 + *power;
reusableBuffer.spectrumAnalyser.bars[x] = 0x80 + power;
}
}

View file

@ -89,6 +89,7 @@ TEST(Conversions, ConversionX7From22)
EXPECT_EQ(TELEMETRY_SCREEN_TYPE_VALUES, g_model.screensType & 0x03);
EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]);
EXPECT_EQ(MIXSRC_TIMER3, g_model.screens[0].lines[0].sources[1]);
}
#endif

Binary file not shown.

View file

@ -863,7 +863,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -893,7 +893,7 @@
#define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät")
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE TR("Flash int. XJT","Flash internes XJT-Modul")
#define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash extern module")
@ -911,7 +911,7 @@
#define TR_EXTERNALRF "Externes HF-Modul"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Mode")
#define TR_FAILSAFESET "Failsafe setzen"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -854,7 +854,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -884,7 +884,7 @@
#define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Port", "Flash S.Port device")
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Curr Vers: ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE TR("Flash int. module", "Flash internal module")
#define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. module", "Flash external module")
@ -902,7 +902,7 @@
#define TR_EXTERNALRF "External RF"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe mode")
#define TR_FAILSAFESET "FAILSAFE SETTINGS"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -878,7 +878,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -908,7 +908,7 @@
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -926,7 +926,7 @@
#define TR_EXTERNALRF "Externa RF"
#define TR_FAILSAFE INDENT"Modo sgdad."
#define TR_FAILSAFESET "AJUSTES SGDAD."
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -871,7 +871,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -901,7 +901,7 @@
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -919,7 +919,7 @@
#define TR_EXTERNALRF "External RF"
#define TR_FAILSAFE INDENT "Failsafe mode"
#define TR_FAILSAFESET "FAILSAFE SETTINGS"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -873,7 +873,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "Baudrate BT"
#define LEN_BLUETOOTH_MODES "\012"
#if defined(PCBX9E)
@ -903,7 +903,7 @@
#define TR_FLASH_EXTERNAL_DEVICE TR("Flasher S.Port", "Flasher S.Port externe")
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION "Version courante :"
#define TR_FLASH_INTERNAL_MODULE TR("Flasher module int.", "Flasher module interne")
#define TR_FLASH_EXTERNAL_MODULE TR("Flasher module ext.", "Flasher module externe")

View file

@ -872,7 +872,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -902,7 +902,7 @@
#define TR_FLASH_EXTERNAL_DEVICE "Progr. Dispositivo Esterno"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Progr. Modulo Interno"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -920,7 +920,7 @@
#define TR_EXTERNALRF "Modulo esterno"
#define TR_FAILSAFE "Modo failsafe"
#define TR_FAILSAFESET TR("FAILSAFE","IMPOSTAZIONI FAILSAFE")
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -861,7 +861,7 @@ TR_GYR_VSRCRAW
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -891,7 +891,7 @@ TR_GYR_VSRCRAW
#define TR_FLASH_EXTERNAL_DEVICE "Flash extern Apparaat"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Flash interne XJT-Module"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -909,7 +909,7 @@ TR_GYR_VSRCRAW
#define TR_EXTERNALRF "Externe RF"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafe Modus")
#define TR_FAILSAFESET "Failsafe instellen"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -872,7 +872,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "Prędkość BT"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -902,7 +902,7 @@
#define TR_FLASH_EXTERNAL_DEVICE "Sflashuj Moduł Zewnętrzny"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Sflashuj Moduł Wewnętrzny"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -920,7 +920,7 @@
#define TR_EXTERNALRF "Zewn.Moduł RF"
#define TR_FAILSAFE TR(INDENT"Failsafe",INDENT"Tryb Failsafe")
#define TR_FAILSAFESET "USTAWIENIE FAILSAFE"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -862,7 +862,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -892,7 +892,7 @@
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -910,7 +910,7 @@
#define TR_EXTERNALRF "External RF"
#define TR_FAILSAFE "Failsafe mode"
#define TR_FAILSAFESET "FAILSAFE SETTINGS"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -872,7 +872,7 @@
#define TR_BLUETOOTH_INIT "Init"
#define TR_BLUETOOTH_DIST_ADDR INDENT "Dist addr"
#define TR_BLUETOOTH_LOCAL_ADDR INDENT "Local addr"
#define TR_BLUETOOTH_PIN_CODE TR(INDENT "PIN code", "PIN code")
#define TR_BLUETOOTH_PIN_CODE "PIN code"
#define TR_BAUDRATE "BT Baudrate"
#define LEN_BLUETOOTH_MODES "\011"
#if defined(PCBX9E)
@ -902,7 +902,7 @@
#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device"
#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA"
#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module")
#define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit")
#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit"
#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ")
#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module"
#define TR_FLASH_EXTERNAL_MODULE "Flash external module"
@ -920,7 +920,7 @@
#define TR_EXTERNALRF "Extern Radiomodul"
#define TR_FAILSAFE TR(INDENT "Failsafe", INDENT "Failsafeläge")
#define TR_FAILSAFESET "FailsafeInställning"
#define TR_REG_ID TR("Reg. ID", "Registration ID")
#define TR_REG_ID "Reg. ID"
#define TR_OWNER_ID "Owner ID"
#define TR_PINMAPSET "PINMAP"
#define TR_HOLD "Hold"

View file

@ -53,6 +53,9 @@
#elif defined(PCBX9LITE)
#define TR_POTS_VSRCRAW "\310S1\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0"
#elif defined(PCBX9DP) && PCBREV >= 2019
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0"
#elif defined(PCBTARANIS)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0"

View file

@ -33,6 +33,15 @@ options = {
"CROSSFIRE": "NO",
"SBUS": "NO",
"DEFAULT_MODE": "2",
},
"X9D+": {
"PCBREV": "2019",
"LUA": "NO_MODEL_SCRIPTS",
"GVARS": "YES",
"AUTOUPDATE": "YES",
"PXX1": "YES",
"CROSSFIRE": "NO",
"DEFAULT_MODE": "2",
}
}