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

X10 extra switches sticks (#6423)

[X10] 2 extra sticks switches + 2 extra pots
This commit is contained in:
Bertrand Songis 2019-05-17 20:42:41 +02:00 committed by GitHub
parent 11cb2ea29b
commit 794fe32006
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 390 additions and 166 deletions

View file

@ -28,47 +28,51 @@
// A set of bitfield handling macros
template <typename T>
inline T BF_BIT(uint8_t n)
inline T bfBit(uint8_t n)
{
return T(1) << n;
}
#define BF_BIT_GET(y, mask) ( y & (mask) )
#define BF_BIT_SET(y, mask) ( y |= (mask) )
#define BF_BIT_CLEAR(y, mask) ( y &= ~(mask) )
#define BF_BIT_FLIP(y, mask) ( y ^= (mask) )
#define BF_SINGLE_BIT_GET(y, i) BF_BIT_GET(y, BF_BIT(i))
#define BF_SINGLE_BIT_SET(y, i) BF_BIT_SET(y, BF_BIT(i))
#define BFBIT_GET(y, mask) ( y & (mask) )
#define BFBIT_SET(y, mask) ( y |= (mask) )
#define BFBIT_CLEAR(y, mask) ( y &= ~(mask) )
#define BFBIT_FLIP(y, mask) ( y ^= (mask) )
#define BF_SINGLE_BIT_GET(y, i) BFBIT_GET(y, bfBit(i))
#define BF_SINGLE_BIT_SET(y, i) BFBIT_SET(y, bfBit(i))
//! Create a bitmask of length 'len'.
template <typename T>
inline T BF_BITMASK(uint8_t len)
inline T bfBitmask(uint8_t len)
{
return BF_BIT<T>(len) - 1;
return bfBit<T>(len) - 1;
}
//! Create a bitfield mask of length 'len' starting at bit 'start'.
template <typename T>
inline T BF_MASK(uint8_t start, uint8_t len)
inline T bfMask(uint8_t start, uint8_t len)
{
return BF_BITMASK<T>(len) << start;
return bfBitmask<T>(len) << start;
}
//! Prepare a bitmask for insertion or combining.
template <typename T>
inline T BF_PREP(T x, uint8_t start, uint8_t len)
inline T bfPrep(T x, uint8_t start, uint8_t len)
{
return (x & BF_BITMASK<T>(len)) << start;
return (x & bfBitmask<T>(len)) << start;
}
//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'.
#define BF_GET(y, start, len) ( ((y)>>(start)) & BF_BITMASK(len) )
template <typename T>
inline T bfGet(T y, uint8_t start, uint8_t len)
{
return ((y)>>(start)) & bfBitmask<T>(len);
}
//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'.
template <class T>
inline T BF_SET(T to, T from, uint8_t start, uint8_t len)
inline T bfSet(T to, T from, uint8_t start, uint8_t len)
{
return (to & ~BF_MASK<T>(start, len)) | BF_PREP<T>(from, start, len);
return (to & ~bfMask<T>(start, len)) | bfPrep<T>(from, start, len);
}
#endif //BITFIELD_H

31
radio/src/chksize.h Normal file
View file

@ -0,0 +1,31 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* 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.
*/
#ifndef CHKSIZE_H
#define CHKSIZE_H
#include <inttypes.h>
template <typename ToCheck, size_t expectedSize, size_t realSize = sizeof(ToCheck)>
void check_size() {
static_assert(expectedSize == realSize, "struct size changed");
}
#endif

View file

@ -383,6 +383,7 @@ enum SwitchSources {
SWSRC_SD0,
SWSRC_SD1,
SWSRC_SD2,
#endif
#if defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBXLITES)
SWSRC_SE0,
SWSRC_SE1,
@ -443,8 +444,17 @@ enum SwitchSources {
SWSRC_SR1,
SWSRC_SR2,
#endif
SWSRC_LAST_SWITCH = SWSRC_FIRST_SWITCH + NUM_SWITCHES_POSITIONS - 1,
#else // neither Taranis nor Horus
#if defined(PCBHORUS)
SWSRC_GMBL0,
SWSRC_GMBL1,
SWSRC_GMBL2,
SWSRC_GMBR0,
SWSRC_GMBR1,
SWSRC_GMBR2,
#endif
#if defined(PCBSKY9X)
SWSRC_ID0 = SWSRC_FIRST_SWITCH,
SWSRC_ID1,
SWSRC_ID2,
@ -456,11 +466,13 @@ enum SwitchSources {
SWSRC_TRN,
SWSRC_TRAINER = SWSRC_TRN,
SWSRC_LAST_SWITCH = SWSRC_TRN,
#else
SWSRC_LAST_SWITCH = SWSRC_FIRST_SWITCH + NUM_SWITCHES_POSITIONS - 1,
#endif
#if NUM_XPOTS > 0
SWSRC_FIRST_MULTIPOS_SWITCH,
SWSRC_LAST_MULTIPOS_SWITCH = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS*XPOTS_MULTIPOS_COUNT) - 1,
SWSRC_LAST_MULTIPOS_SWITCH = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_POTS * XPOTS_MULTIPOS_COUNT) - 1,
#endif
SWSRC_FIRST_TRIM,
@ -468,12 +480,14 @@ enum SwitchSources {
SWSRC_TrimRudRight,
SWSRC_TrimEleDown,
SWSRC_TrimEleUp,
#if NUM_TRIMS > 2
SWSRC_TrimThrDown,
SWSRC_TrimThrUp,
SWSRC_TrimAilLeft,
SWSRC_TrimAilRight,
#endif
#if NUM_TRIMS > 4
SWSRC_TrimT5Down,
SWSRC_TrimT5Up,
@ -488,16 +502,7 @@ enum SwitchSources {
SWSRC_FIRST_LOGICAL_SWITCH,
SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH,
SWSRC_SW2,
SWSRC_SW3,
SWSRC_SW4,
SWSRC_SW5,
SWSRC_SW6,
SWSRC_SW7,
SWSRC_SW8,
SWSRC_SW9,
SWSRC_SWA,
SWSRC_SWB,
SWSRC_SWC,
// ...
SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1,
SWSRC_ON,
@ -559,9 +564,16 @@ enum MixSources {
MIXSRC_FIRST_SLIDER,
MIXSRC_S3 = MIXSRC_FIRST_SLIDER, LUA_EXPORT("s3", "Slider S3")
MIXSRC_S4, LUA_EXPORT("s4", "Slider S4")
#if defined(PCBX12S)
MIXSRC_LS, LUA_EXPORT("ls", "Left rear slider")
MIXSRC_RS, LUA_EXPORT("rs", "Right rear slider")
MIXSRC_LAST_POT = MIXSRC_RS,
#endif
#if defined(PCBX10)
MIXSRC_EXT1, LUA_EXPORT("ext1", "Ext 1")
MIXSRC_EXT2, LUA_EXPORT("ext2", "Ext 2")
MIXSRC_LAST_POT = MIXSRC_EXT2,
#endif
#elif defined(PCBX9E)
MIXSRC_POT1 = MIXSRC_FIRST_POT, LUA_EXPORT("s1", "Potentiometer 1")
MIXSRC_POT2, LUA_EXPORT("s2", "Potentiometer 2")
@ -632,6 +644,7 @@ enum MixSources {
MIXSRC_SB, LUA_EXPORT("sb", "Switch B")
MIXSRC_SC, LUA_EXPORT("sc", "Switch C")
MIXSRC_SD, LUA_EXPORT("sd", "Switch D")
#endif
#if defined(PCBHORUS) || defined(PCBX9) || defined(PCBXLITES)
MIXSRC_SE, LUA_EXPORT("se", "Switch E")
#endif
@ -660,7 +673,11 @@ enum MixSources {
MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q")
MIXSRC_SR, LUA_EXPORT("sr", "Switch R")
#endif
#else
#if defined(PCBHORUS)
MIXSRC_GMBL, LUA_EXPORT("gmbl", "Switch Left gimbal")
MIXSRC_GMBR, LUA_EXPORT("gmbr", "Switch right gimbal")
#endif
#if defined(PCBSKY9X)
MIXSRC_3POS = MIXSRC_FIRST_SWITCH,
MIXSRC_THR,
MIXSRC_RUD,

View file

@ -606,7 +606,7 @@ PACK(struct ModelData {
NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]);
NOBACKUP(uint8_t potsWarnEnabled);
NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS]);
NOBACKUP(int8_t potsWarnPosition[STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS]);
NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS];)
@ -661,12 +661,12 @@ PACK(struct TrainerData {
#if defined(PCBHORUS)
#define EXTRA_GENERAL_FIELDS \
NOBACKUP(uint8_t serial2Mode:4); \
uint8_t slidersConfig:4; \
NOBACKUP(uint8_t serial2Mode); \
uint32_t switchConfig; \
uint8_t potsConfig; /* two bits per pot */ \
NOBACKUP(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]); \
NOBACKUP(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME]); \
uint16_t potsConfig; /* two bits per pot */ \
uint8_t slidersConfig; /* 1 bit per slider */ \
NOBACKUP(char switchNames[STORAGE_NUM_SWITCHES][LEN_SWITCH_NAME]); \
NOBACKUP(char anaNames[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS][LEN_ANA_NAME]); \
NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \
NOBACKUP(uint8_t spare:1); \
NOBACKUP(uint8_t blOffBright:7); \
@ -724,7 +724,7 @@ PACK(struct TrainerData {
PACK(struct RadioData {
NOBACKUP(uint8_t version);
NOBACKUP(uint16_t variant);
CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS];
CalibData calib[NUM_STICKS + STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS];
NOBACKUP(uint16_t chkSum);
N_HORUS_FIELD(int8_t currModel);
N_HORUS_FIELD(uint8_t contrast);
@ -811,15 +811,13 @@ PACK(struct RadioData {
other than the CPU arch and board type so changes in other
defines also trigger the struct size changes */
template <typename ToCheck, size_t expectedSize, size_t realSize = sizeof(ToCheck)>
void check_size() {
static_assert(expectedSize == realSize, "struct size changed");
}
#include "chksize.h"
#define CHKSIZE(x, y) check_size<struct x, y>()
#define CHKTYPE(x, y) check_size<x, y>()
static inline void check_struct()
{
#define CHKSIZE(x, y) check_size<struct x, y>()
#define CHKTYPE(x, y) check_size<x, y>()
CHKSIZE(CurveRef, 2);
@ -926,11 +924,10 @@ static inline void check_struct()
CHKSIZE(RadioData, 735);
CHKSIZE(ModelData, 5301);
#elif defined(PCBHORUS)
CHKSIZE(RadioData, 855);
CHKSIZE(ModelData, 9734);
CHKSIZE(RadioData, 881);
CHKSIZE(ModelData, 9736);
#endif
#undef CHKSIZE
#undef CHKSIZEUNION
}
#endif /* BACKUP */

View file

@ -31,6 +31,10 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_POT1,
ITEM_RADIO_HARDWARE_POT2,
ITEM_RADIO_HARDWARE_POT3,
#if defined(PCBX10)
ITEM_RADIO_HARDWARE_EXT1,
ITEM_RADIO_HARDWARE_EXT2,
#endif
ITEM_RADIO_HARDWARE_LS,
ITEM_RADIO_HARDWARE_RS,
#if defined(PCBX12S)
@ -46,6 +50,8 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_SF,
ITEM_RADIO_HARDWARE_SG,
ITEM_RADIO_HARDWARE_SH,
ITEM_RADIO_HARDWARE_GMBL,
ITEM_RADIO_HARDWARE_GMBR,
ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE,
ITEM_RADIO_HARDWARE_BLUETOOTH_MODE,
ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE,
@ -59,14 +65,15 @@ enum MenuRadioHardwareItems {
};
#define HW_SETTINGS_COLUMN 150
#if defined(PCBX10)
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#else
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#endif
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode != BLUETOOTH_TELEMETRY ? HIDDEN_ROW : -1), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? -1 : 0)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
// TODO should be moved to the HAL
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw || MIXSRC_GMBL-MIXSRC_FIRST_SWITCH == sw || MIXSRC_GMBR-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
bool menuRadioHardware(event_t event)
{
@ -89,6 +96,7 @@ bool menuRadioHardware(event_t event)
pushMenu(menuRadioCalibration);
}
break;
case ITEM_RADIO_HARDWARE_LABEL_STICKS:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_STICKS);
break;
@ -128,24 +136,27 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_POT1:
case ITEM_RADIO_HARDWARE_POT2:
case ITEM_RADIO_HARDWARE_POT3:
#if defined(PCBX10)
case ITEM_RADIO_HARDWARE_EXT1:
case ITEM_RADIO_HARDWARE_EXT2:
#endif
{
int idx = k - ITEM_RADIO_HARDWARE_POT1;
uint8_t shift = (2*idx);
uint8_t mask = (0x03 << shift);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+idx]) || (attr && menuHorizontalPosition == 0))
editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
int index = k - ITEM_RADIO_HARDWARE_POT1;
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+index+1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+index]) || (attr && menuHorizontalPosition == 0))
editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+index], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
else
lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0);
uint8_t potType = (g_eeGeneral.potsConfig & mask) >> shift;
uint32_t potType = bfGet<uint32_t>(g_eeGeneral.potsConfig, 2*(index), 2);
potType = editChoice(HW_SETTINGS_COLUMN+50, y, STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
g_eeGeneral.potsConfig &= ~mask;
g_eeGeneral.potsConfig |= (potType << shift);
g_eeGeneral.potsConfig = bfSet<uint32_t>(g_eeGeneral.potsConfig, potType, 2*index, 2);
break;
}
case ITEM_RADIO_HARDWARE_LABEL_SWITCHES:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SWITCHES);
break;
case ITEM_RADIO_HARDWARE_SA:
case ITEM_RADIO_HARDWARE_SB:
case ITEM_RADIO_HARDWARE_SC:
@ -154,8 +165,10 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_SF:
case ITEM_RADIO_HARDWARE_SG:
case ITEM_RADIO_HARDWARE_SH:
case ITEM_RADIO_HARDWARE_GMBL:
case ITEM_RADIO_HARDWARE_GMBR:
{
int index = k-ITEM_RADIO_HARDWARE_SA;
int index = k - ITEM_RADIO_HARDWARE_SA;
int config = SWITCH_CONFIG(index);
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0);
if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && menuHorizontalPosition == 0))
@ -164,8 +177,7 @@ bool menuRadioHardware(event_t event)
lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0);
config = editChoice(HW_SETTINGS_COLUMN+50, y, STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event);
if (attr && checkIncDec_Ret) {
swconfig_t mask = (swconfig_t)0x03 << (2*index);
g_eeGeneral.switchConfig = (g_eeGeneral.switchConfig & ~mask) | ((swconfig_t(config) & 0x03) << (2*index));
g_eeGeneral.switchConfig = bfSet<uint32_t>(g_eeGeneral.switchConfig, config, 2*index, 2);
}
break;
}

View file

@ -172,8 +172,10 @@ bool menuStatsAnalogs(event_t event)
#else
if (i < NUM_STICKS+NUM_POTS+NUM_SLIDERS)
lcdDrawNumber(x+100, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256);
#if NUM_MOUSE_ANALOGS > 0
else if (i >= MOUSE1)
lcdDrawNumber(x+100, y, (int16_t)calibratedAnalogs[CALIBRATED_MOUSE1+i-MOUSE1]*25/256);
#endif
#endif
}

View file

@ -22,6 +22,7 @@
#define _MYEEPROM_H_
#include "datastructs.h"
#include "bitfield.h"
#define EEPROM_VER 219
#define FIRST_CONV_EEPROM_VER 216
@ -95,7 +96,7 @@
SLIDER_NONE,
SLIDER_WITH_DETENT,
};
#define SWITCH_CONFIG(x) ((g_eeGeneral.switchConfig >> (2*(x))) & 0x03)
#define SWITCH_CONFIG(x) (bfGet<uint32_t>(g_eeGeneral.switchConfig, 2*(x), 2))
#define SWITCH_EXISTS(x) (SWITCH_CONFIG(x) != SWITCH_NONE)
#define IS_CONFIG_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS)
#define IS_CONFIG_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE)
@ -113,8 +114,6 @@
#include "layout.h"
#include "theme.h"
#include "topbar.h"
#else
#define THEME_DATA
#endif
#define SWITCHES_DELAY() uint8_t(15+g_eeGeneral.switchesDelay)

View file

@ -11,7 +11,7 @@ if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL X9E)
endif()
if(PCB STREQUAL X12S OR PCB STREQUAL X10)
# TODO set(EEPROM_CONVERSIONS 218)
set(EEPROM_CONVERSIONS 218)
endif()
if(EEPROM_CONVERSIONS)

View file

@ -21,10 +21,8 @@
#include "opentx.h"
#include "conversions.h"
void convertModelData(int id, int version)
void convertModelData(int version)
{
eeLoadModelData(id);
#if EEPROM_CONVERSIONS < 217
if (version == 216) {
version = 217;
@ -45,7 +43,13 @@ void convertModelData(int id, int version)
convertModelData_218_to_219(g_model);
}
#endif
}
#if defined(EEPROM)
void eeConvertModel(int id, int version)
{
eeLoadModelData(id);
convertModelData(version);
uint8_t currModel = g_eeGeneral.currModel;
g_eeGeneral.currModel = id;
storageDirty(EE_MODEL);
@ -106,8 +110,7 @@ bool eeConvert()
#if EEPROM_CONVERSIONS < 219
if (version == 218) {
version = 219;
g_eeGeneral.version = 219;
// no conversion needed for now
convertRadioData_218_to_219(g_eeGeneral);
}
#endif
@ -131,9 +134,10 @@ bool eeConvert()
#endif
lcdRefresh();
if (eeModelExists(id)) {
convertModelData(id, conversionVersionStart);
eeConvertModel(id, conversionVersionStart);
}
}
return true;
}
#endif

View file

@ -18,8 +18,10 @@
* GNU General Public License for more details.
*/
void convertModelData(int version);
bool eeConvert();
void convertModelData(int id, int version);
void eeConvertModel(int id, int version);
// Conversions 216 to 217
void convertModelData_216_to_217(ModelData &model);

View file

@ -614,7 +614,7 @@ PACK(typedef struct {
}) GVarData_v217;
PACK(typedef struct {
ModelHeader header;
ModelHeader_v218 header;
TimerData_v217 timers[MAX_TIMERS_218];
uint8_t telemetryProtocol:3;
uint8_t thrTrim:1; // Enable Throttle Trim

View file

@ -41,6 +41,11 @@ int convertSource_218_to_219(int source)
source += 2;
#endif
#if defined(PCBHORUS)
if (source >= MIXSRC_GMBL)
source += 2;
#endif
return source;
}
@ -48,12 +53,21 @@ int convertSwitch_218_to_219(int swtch)
{
// on X7: 2 additional switches
#if defined(PCBX7)
#if defined(PCBX7) || defined(PCBHORUS)
if (swtch < 0)
return -convertSwitch_218_to_219(-swtch);
#endif
#if defined(PCBX7)
if (swtch >= SWSRC_SI0)
return swtch + 2 * 3;
swtch += 2 * 3;
#endif
#if defined(PCBHORUS)
if (swtch >= SWSRC_GMBL0)
swtch += 2 * 3;
if (swtch >= SWSRC_FIRST_MULTIPOS_SWITCH + 3 * XPOTS_MULTIPOS_COUNT)
swtch += 2 * XPOTS_MULTIPOS_COUNT;
#endif
return swtch;
@ -63,8 +77,14 @@ void convertModelData_218_to_219(ModelData &model)
{
static_assert(sizeof(ModelData_v218) <= sizeof(ModelData), "ModelData size has been reduced");
#if defined(STM32)
ModelData_v218 * oldModelAllocated = (ModelData_v218 *)malloc(sizeof(ModelData_v218));
ModelData_v218 &oldModel = *oldModelAllocated;
#else
ModelData_v218 oldModel;
memcpy(&oldModel, &model, sizeof(oldModel));
#endif
memcpy(&oldModel, &model, sizeof(ModelData_v218));
ModelData_v219 & newModel = (ModelData_v219 &) model;
memclear(newModel.mixData, sizeof(ModelData_v219) - offsetof(ModelData_v219, mixData));
@ -215,13 +235,14 @@ void convertModelData_218_to_219(ModelData &model)
#endif
#if defined(PCBHORUS)
memcpy(newModel.screenData, oldModel.screenData,
sizeof(newModel.screenData) +
sizeof(newModel.topbarData))
#endif
// memcpy(newModel.screenData, oldModel.screenData,
// sizeof(newModel.screenData) +
// sizeof(newModel.topbarData))
#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;
@ -239,4 +260,35 @@ void convertModelData_218_to_219(ModelData &model)
}
}
#endif
#if defined(PCBHORUS)
free(oldModelAllocated);
#endif
}
void convertRadioData_218_to_219(RadioData & settings)
{
settings.version = 219;
#if defined(PCBHORUS)
RadioData_v218 settings_v218 = (RadioData_v218 &)settings;
memcpy(&settings.chkSum, &settings_v218.chkSum, offsetof(RadioData, serial2Mode) - offsetof(RadioData, chkSum));
memcpy(&settings.calib[NUM_STICKS + 5], &settings_v218.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS));
memclear(&settings.calib[NUM_STICKS + 3], sizeof(CalibData) * 2);
settings.serial2Mode = settings_v218.serial2Mode;
settings.switchConfig = settings_v218.switchConfig;
settings.potsConfig = settings_v218.potsConfig;
settings.slidersConfig = settings_v218.slidersConfig;
memcpy(&settings.switchNames[0], &settings_v218.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);
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.currModelFilename[0], &settings_v218.currModelFilename[0], sizeof(RadioData_v218) - offsetof(RadioData_v218, currModelFilename[0]));
#endif
}

View file

@ -18,7 +18,6 @@
* GNU General Public License for more details.
*/
#ifndef OPENTX_DATASTRUCTS_218_H
#define OPENTX_DATASTRUCTS_218_H
@ -192,7 +191,7 @@ PACK(typedef struct {
#endif
PACK(typedef struct {
trim_t trim[NUM_STICKS];
trim_t trim[NUM_TRIMS];
char name[LEN_FLIGHT_MODE_NAME_218];
int16_t swtch:9; // swtch of phase[0] is not used
int16_t spare:7;
@ -289,7 +288,7 @@ PACK(typedef struct {
uint8_t active;
}) CustomFunctionData_v218;
PACK(typedef struct {
PACK(struct GVarData_v218 {
char name[LEN_GVAR_NAME_218];
uint32_t min:12;
uint32_t max:12;
@ -297,7 +296,7 @@ PACK(typedef struct {
uint32_t prec:1;
uint32_t unit:2;
uint32_t spare:4;
}) GVarData_v218;
});
#if defined(COLORLCD)
PACK(struct FrSkyTelemetryData_v217 {
@ -330,16 +329,12 @@ PACK(struct FrSkyTelemetryData_v217 {
});
#endif
#if defined(PCBX12S)
#define MODELDATA_EXTRA_218 uint8_t spare:3;uint8_t trainerMode:3;uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;
#elif defined(PCBX10)
#define MODELDATA_EXTRA_218 uint8_t spare:3;;uint8_t trainerMode:3;;uint8_t potsWarnMode:2;; ModuleData_v218 moduleData[NUM_MODULES+1];ScriptData scriptsData[MAX_SCRIPTS_218];;char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218];;uint8_t potsWarnEnabled;;int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];;uint8_t potsWarnSpares[NUM_DUMMY_ANAS];;
#if defined(PCBHORUS)
#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[3 + 4];
#elif defined(PCBTARANIS)
#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];
#define MODELDATA_EXTRA_218 uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS_218]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS];
#elif defined(PCBSKY9X)
#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2];
#else
#define MODELDATA_EXTRA_218
#define MODELDATA_EXTRA_218 uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData_v218 moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS_218][LEN_INPUT_NAME_218]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[STORAGE_NUM_POTS + STORAGE_NUM_SLIDERS]; uint8_t rxBattAlarms[2];
#endif
PACK(struct TelemetrySensor_218 {
@ -391,14 +386,35 @@ PACK(struct TelemetrySensor_218 {
};
});
#if defined(PCBTARANIS)
#if defined(PCBHORUS)
PACK(struct CustomScreenData_v218 {
char layoutName[10];
Layout::PersistentData layoutData;
});
#define VIEW_DATA \
CustomScreenData screenData[MAX_CUSTOM_SCREENS]; \
Topbar::PersistentData topbarData; \
uint8_t view;
#elif defined(PCBTARANIS)
#define VIEW_DATA uint8_t view;
#else
#define VIEW_DATA
#endif
PACK(typedef struct {
ModelHeader header;
#if LEN_BITMAP_NAME > 0
#define MODEL_HEADER_BITMAP_FIELD_218 char bitmap[10];
#else
#define MODEL_HEADER_BITMAP_FIELD_218
#endif
PACK(struct ModelHeader_v218 {
char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName
uint8_t modelId[NUM_MODULES];
MODEL_HEADER_BITMAP_FIELD_218
});
PACK(struct ModelData_v218 {
ModelHeader_v218 header;
TimerData_v218 timers[MAX_TIMERS_218];
uint8_t telemetryProtocol:3;
uint8_t thrTrim:1; // Enable Throttle Trim
@ -427,7 +443,10 @@ PACK(typedef struct {
uint8_t thrTraceSrc;
swarnstate_t switchWarningState;
#if !defined(COLORLCD)
swarnenable_t switchWarningEnable;
#endif
GVarData_v218 gvars[MAX_GVARS_218];
@ -442,19 +461,22 @@ PACK(typedef struct {
// TODO conversion for custom screens?
VIEW_DATA
}) ModelData_v218;
});
#include "chksize.h"
#define CHKSIZE(x, y) check_size<struct x, y>()
static inline void check_struct_218()
{
#if defined(PCBHORUS)
static_assert(sizeof(ModelData_v218) == 9380, "ModelData size changed");
CHKSIZE(ModelData_v218, 9380);
#elif defined(PCBX9E)
static_assert(sizeof(ModelData_v218) == 6520, "ModelData size changed");
#elif defined(PCBX9D)
static_assert(sizeof(ModelData_v218) == 6507, "ModelData size changed");
#elif defined(PCBXLITE) || defined(PCBX7)
static_assert(sizeof(ModelData_v218) == 6025, "ModelData size changed");
#elif defined(PCBSKY9X)
static_assert(sizeof(ModelData_v218) == 5188, "ModelData size changed");
CHKSIZE(ModelData_v218, 6520);
#endif
}
#undef CHKSIZE
#define EXTRA_GENERAL_FIELDS_GENERAL_218 \
uint8_t backlightBright; \
@ -485,7 +507,7 @@ static_assert(sizeof(ModelData_v218) == 5188, "ModelData size changed");
uint32_t switchConfig; \
uint8_t potsConfig; /* two bits per pot */ \
char switchNames[NUM_SWITCHES_218][LEN_SWITCH_NAME_218]; \
char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME_218]; \
char anaNames[NUM_STICKS+3+4][LEN_ANA_NAME_218]; \
char currModelFilename[LEN_MODEL_FILENAME_218+1]; \
uint8_t spare:1; \
uint8_t blOffBright:7; \
@ -534,10 +556,20 @@ static_assert(sizeof(ModelData_v218) == 5188, "ModelData size changed");
#define SPLASH_MODE_218 int8_t splashMode:3
#endif
#if defined(COLORLCD)
#include "gui/480x272/theme.h"
#define THEME_NAME_LEN 8
#define THEME_DATA \
char themeName[THEME_NAME_LEN]; \
Theme::PersistentData themeData;
#else
#define THEME_DATA
#endif
PACK(typedef struct {
uint8_t version;
uint16_t variant;
CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS];
CalibData calib[NUM_STICKS+STORAGE_NUM_POTS+STORAGE_NUM_SLIDERS+STORAGE_NUM_MOUSE_ANALOGS];
uint16_t chkSum;
N_HORUS_FIELD(int8_t currModel);
N_HORUS_FIELD(uint8_t contrast);

View file

@ -585,7 +585,7 @@ const char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
#if defined(EEPROM_CONVERSIONS)
if (version < EEPROM_VER) {
convertModelData(i_fileDst, version);
eeConvertModel(i_fileDst, version);
eeLoadModel(g_eeGeneral.currModel);
}
#endif

View file

@ -599,7 +599,7 @@ const char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
#if defined(EEPROM_CONVERSIONS)
if (version < EEPROM_VER) {
storageCheck(true);
convertModelData(i_fileDst, version);
eeConvertModel(i_fileDst, version);
eeLoadModel(g_eeGeneral.currModel);
}
#endif

View file

@ -164,14 +164,14 @@ bool ModelCell::fetchRfData()
getModelPath(buf, modelFilename);
FIL file;
uint16_t file_size;
uint16_t size;
uint8_t version;
const char* err = openFile(buf,&file,&file_size);
if (err) return false;
const char * err = openFile(buf, &file, &size, &version);
if (err || version != EEPROM_VER) return false;
FSIZE_t start_offset = f_tell(&file);
UINT read;
if ((f_read(&file, buf, LEN_MODEL_NAME, &read) != FR_OK) || (read != LEN_MODEL_NAME))
goto error;

View file

@ -20,6 +20,7 @@
#include "opentx.h"
#include "modelslist.h"
#include "conversions/conversions.h"
void getModelPath(char * path, const char * filename)
{
@ -69,7 +70,7 @@ const char * writeModel()
return writeFile(path, (uint8_t *)&g_model, sizeof(g_model));
}
const char * openFile(const char * fullpath, FIL* file, uint16_t* size)
const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version)
{
FRESULT result = f_open(file, fullpath, FA_OPEN_EXISTING | FA_READ);
if (result != FR_OK) {
@ -90,14 +91,14 @@ const char * openFile(const char * fullpath, FIL* file, uint16_t* size)
return SDCARD_ERROR(result);
}
uint8_t version = (uint8_t)buf[4];
if ((*(uint32_t*)&buf[0] != OTX_FOURCC && *(uint32_t*)&buf[0] != O9X_FOURCC) || version < FIRST_CONV_EEPROM_VER || version > EEPROM_VER || buf[5] != 'M') {
*version = (uint8_t)buf[4];
if ((*(uint32_t*)&buf[0] != OTX_FOURCC && *(uint32_t*)&buf[0] != O9X_FOURCC) || *version < FIRST_CONV_EEPROM_VER || *version > EEPROM_VER || buf[5] != 'M') {
f_close(file);
return STR_INCOMPATIBLE;
}
*size = *(uint16_t*)&buf[6];
return NULL;
return nullptr;
}
const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize)
@ -105,11 +106,13 @@ const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize)
FIL file;
UINT read;
uint16_t size;
uint8_t version;
TRACE("loadFile(%s)", fullpath);
const char* err = openFile(fullpath, &file, &size);
if (err) return err;
const char * err = openFile(fullpath, &file, &size, &version);
if (err)
return err;
size = min<uint16_t>(maxsize, size);
FRESULT result = f_read(&file, data, size, &read);
@ -118,8 +121,12 @@ const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize)
return SDCARD_ERROR(result);
}
if (version < EEPROM_VER) {
convertModelData(version);
}
f_close(&file);
return NULL;
return nullptr;
}
const char * readModel(const char * filename, uint8_t * buffer, uint32_t size)

View file

@ -27,7 +27,7 @@
#define DEFAULT_MODEL_FILENAME "model1.bin"
// opens radio.bin or model file
const char * openFile(const char * fullpath, FIL* file, uint16_t* size);
const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version);
void getModelPath(char * path, const char * filename);

View file

@ -107,14 +107,6 @@ extern uint16_t sessionTimer;
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET)
#endif
#if defined(PCBX10)
#define NUM_SLIDERS 2
#define NUM_PWMSTICKS 4
#else
#define NUM_SLIDERS 4
#define NUM_PWMSTICKS 0
#endif
// Board driver
void boardPreInit(void);
void boardInit(void);
@ -142,19 +134,6 @@ void delay_ms(uint32_t ms);
#define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (!IS_HORUS_PROD())
#endif
#if NUM_PWMSTICKS > 0
PACK(typedef struct {
uint8_t sticksPwmDisabled : 1;
uint8_t pxx2Enabled : 1;
}) HardwareOptions;
#else
PACK(typedef struct {
uint8_t pxx2Enabled : 1;
}) HardwareOptions;
#endif
extern HardwareOptions hardwareOptions;
// SD driver
#define BLOCK_SIZE 512 /* Block Size in Bytes */
#if !defined(SIMU) || defined(SIMU_DISKIO)
@ -300,8 +279,12 @@ enum EnumSwitches
SW_SF,
SW_SG,
SW_SH,
SW_GMBL,
SW_GMBR,
NUM_SWITCHES
};
#define STORAGE_NUM_SWITCHES 10
#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
enum EnumSwitchesPositions
@ -330,8 +313,20 @@ enum EnumSwitchesPositions
SW_SH0,
SW_SH1,
SW_SH2,
SW_SGMBL0,
SW_SGMBL1,
SW_SGMBL2,
SW_SGMBR0,
SW_SGMBR1,
SW_SGMBR2,
NUM_SWITCHES_POSITIONS
};
#if defined(__cplusplus)
static_assert(NUM_SWITCHES_POSITIONS == NUM_SWITCHES * 3, "Wrong switches positions count");
#endif
void keysInit(void);
uint8_t keyState(uint8_t index);
uint32_t switchState(uint8_t index);
@ -384,8 +379,26 @@ void watchdogInit(unsigned int duration);
#endif
// ADC driver
#if defined(PCBX10)
#define NUM_POTS 5
#else
#define NUM_POTS 3
#endif
#define NUM_XPOTS NUM_POTS
#define STORAGE_NUM_POTS 5
#if defined(PCBX10)
#define NUM_SLIDERS 2
#define NUM_PWMSTICKS 4
#else
#define NUM_SLIDERS 4
#define NUM_PWMSTICKS 0
#endif
#define STORAGE_NUM_SLIDERS 4
enum Analogs {
STICK1,
STICK2,
@ -395,7 +408,10 @@ enum Analogs {
POT1 = POT_FIRST,
POT2,
POT3,
POT_LAST = POT3,
#if defined(PCBX10)
EXT1,
EXT2,
#endif
SLIDER_FIRST,
SLIDER1 = SLIDER_FIRST,
SLIDER2,
@ -410,12 +426,16 @@ enum Analogs {
#endif
SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1,
TX_VOLTAGE,
#if defined(PCBX12S)
MOUSE1, // TODO why after voltage?
MOUSE2,
#endif
NUM_ANALOGS,
TX_RTC = NUM_ANALOGS
};
#define POT_LAST (SLIDER_FIRST - 1)
enum CalibratedAnalogs {
CALIBRATED_STICK1,
CALIBRATED_STICK2,
@ -445,12 +465,13 @@ void adcInit(void);
void adcRead(void);
uint16_t getRTCBattVoltage();
uint16_t getAnalogValue(uint8_t index);
#define NUM_MOUSE_ANALOGS 2
#if defined(PCBX10)
#define NUM_DUMMY_ANAS 2
#if defined(PCBX12S)
#define NUM_MOUSE_ANALOGS 2
#else
#define NUM_DUMMY_ANAS 0
#define NUM_MOUSE_ANALOGS 0
#endif
#define STORAGE_NUM_MOUSE_ANALOGS 2
#if NUM_PWMSTICKS > 0
#define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled)
@ -636,4 +657,17 @@ extern DMAFifo<512> telemetryFifo;
extern DMAFifo<32> serial2RxFifo;
#endif
#if NUM_PWMSTICKS > 0
PACK(typedef struct {
uint8_t sticksPwmDisabled : 1;
uint8_t pxx2Enabled : 1;
}) HardwareOptions;
#else
PACK(typedef struct {
uint8_t pxx2Enabled : 1;
}) HardwareOptions;
#endif
extern HardwareOptions hardwareOptions;
#endif // _BOARD_HORUS_H_

View file

@ -39,10 +39,6 @@
#define KEYS_GPIO_REG_RIGHT GPIOC->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_4 // PC.04
#elif defined(PCBX10)
// #define KEYS_GPIO_REG_UNUSED GPIOH->IDR
// #define KEYS_GPIO_PIN_UNUSED GPIO_Pin_14 // PH.14
// #define KEYS_GPIO_REG_UNUSED GPIOH->IDR
// #define KEYS_GPIO_PIN_UNUSED GPIO_Pin_15 // PH.15
#define KEYS_GPIO_REG_ENTER GPIOI->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08
#define KEYS_GPIO_REG_PGDN GPIOI->IDR
@ -176,7 +172,7 @@
#define KEYS_GPIOD_PINS (SWITCHES_GPIO_PIN_C_H | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_LSD)
#define KEYS_GPIOE_PINS (SWITCHES_GPIO_PIN_E_L)
#define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD)
#define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12) // | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOI_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15)
#define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LSU)
#endif
@ -229,7 +225,7 @@
#define PWM_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#define ADC_GPIOA_PINS (STICKS_PWM_ENABLED() ? 0 : (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3))
#define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#define ADC_GPIOF_PINS (GPIO_Pin_6 | GPIO_Pin_7) // | GPIO_Pin_8 | GPIO_Pin_9)
#define ADC_GPIOF_PINS (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9)
#define ADC_CHANNEL_STICK_LH ADC_Channel_0 // ADC3_IN0
#define ADC_CHANNEL_STICK_LV ADC_Channel_1 // ADC3_IN1
#define ADC_CHANNEL_STICK_RH ADC_Channel_2 // ADC3_IN2
@ -255,7 +251,6 @@
// Power
#define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ
#define PWR_GPIO GPIOJ
#define PWR_SWITCH_GPIO_REG PWR_GPIO->IDR
#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00
#define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01

View file

@ -187,6 +187,8 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(F);
ADD_3POS_CASE(G, 6);
ADD_2POS_CASE(H);
ADD_2POS_CASE(GMBL);
ADD_2POS_CASE(GMBR);
#endif
default:
break;

View file

@ -301,8 +301,11 @@ extern "C" {
// ADC driver
#define NUM_POTS 3
#define STORAGE_NUM_POTS 3
#define NUM_SLIDERS 0
#define STORAGE_NUM_SLIDERS 0
#define NUM_XPOTS 0
#define STORAGE_NUM_MOUSE_ANALOGS 0
enum Analogs {
STICK1,
STICK2,
@ -339,7 +342,6 @@ void adcRead(void);
uint16_t getAnalogValue(uint8_t index);
void setSticksGain(uint8_t gains);
#define NUM_MOUSE_ANALOGS 0
#define NUM_DUMMY_ANAS 0
// Battery driver
uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps

View file

@ -493,10 +493,12 @@ enum Analogs {
#define NUM_POTS (POT_LAST-POT_FIRST+1)
#define NUM_XPOTS NUM_POTS
#define STORAGE_NUM_POTS NUM_POTS
#define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1)
#define STORAGE_NUM_SLIDERS NUM_SLIDERS
#define NUM_TRIMS 4
#define NUM_MOUSE_ANALOGS 0
#define NUM_DUMMY_ANAS 0
#define STORAGE_NUM_MOUSE_ANALOGS 0
#if defined(STICKS_PWM)
#define NUM_PWMSTICKS 4

View file

@ -8,6 +8,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND)
target_include_directories(gtests-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR})
add_definitions(-DSIMU)
add_definitions(-DGTESTS)
remove_definitions(-DCLI)
set(TESTS_PATH ${RADIO_SRC_DIRECTORY})
configure_file(${RADIO_SRC_DIRECTORY}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY)
include_directories(${CMAKE_CURRENT_BINARY_DIR})

Binary file not shown.

View file

@ -31,12 +31,12 @@ void loadEEPROMFile(const char * filename)
#endif
#if defined(PCBX9DP)
TEST(Eeprom, ConversionX9DPFrom22)
TEST(Conversions, ConversionX9DPFrom22)
{
loadEEPROMFile(TESTS_PATH "/tests/eeprom_22_x9d+.bin");
eepromOpen();
convertModelData(0, 218);
eeConvertModel(0, 218);
eeLoadModel(0);
EXPECT_ZSTREQ("Test", g_model.header.name);
@ -57,12 +57,12 @@ TEST(Eeprom, ConversionX9DPFrom22)
#endif
#if defined(PCBX7)
TEST(Eeprom, ConversionX7From22)
TEST(Conversions, ConversionX7From22)
{
loadEEPROMFile(TESTS_PATH "/tests/eeprom_22_x7.bin");
eepromOpen();
convertModelData(0, 218);
eeConvertModel(0, 218);
eeLoadModel(0);
EXPECT_ZSTREQ("Test", g_model.header.name);
@ -91,3 +91,32 @@ TEST(Eeprom, ConversionX7From22)
EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.screens[0].lines[0].sources[0]);
}
#endif
#if defined(PCBX10)
TEST(Conversions, ConversionHorusFrom22)
{
simuFatfsSetPaths(TESTS_PATH "/tests/", TESTS_PATH "/tests/");
loadModel("model_22_horus.bin");
EXPECT_ZSTREQ("Test", g_model.header.name);
EXPECT_EQ(80, g_model.mixData[0].weight);
EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.mixData[4].srcRaw);
EXPECT_EQ(SWSRC_TELEMETRY_STREAMING, g_model.mixData[4].swtch);
EXPECT_EQ(-100, g_model.limitData[0].max);
EXPECT_EQ(80, g_model.expoData[0].weight);
EXPECT_EQ(LS_FUNC_VPOS, g_model.logicalSw[0].func);
EXPECT_EQ(MIXSRC_FIRST_TRAINER, g_model.logicalSw[0].v1);
EXPECT_EQ(0, g_model.logicalSw[0].v2);
EXPECT_EQ(SWASH_TYPE_120X, g_model.swashR.type);
EXPECT_ZSTREQ("Tes", g_model.flightModeData[0].name);
EXPECT_EQ(10, g_model.flightModeData[0].gvars[0]);
EXPECT_ZSTREQ("Tes", g_model.gvars[0].name);
EXPECT_EQ(MODULE_TYPE_PXX_R9M, g_model.moduleData[EXTERNAL_MODULE].type);
EXPECT_EQ(MODULE_SUBTYPE_R9M_EU, g_model.moduleData[EXTERNAL_MODULE].subType);
EXPECT_ZSTREQ("Rud", g_model.inputNames[0]);
EXPECT_ZSTREQ("Tes", g_model.telemetrySensors[0].label);
EXPECT_EQ(10, g_model.telemetrySensors[0].id);
EXPECT_EQ(10, g_model.telemetrySensors[0].frskyInstance.physID);
}
#endif

View file

@ -31,10 +31,10 @@
#if defined(PCBX12S)
#define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\313L1\0""\313L2\0""\311LS\0""\311RS\0""\310JSx""\310JSy"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312GML""\312GMR"
#elif defined(PCBX10)
#define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311LS\0""\311RS\0""None""None""\310EX1""\310EX2"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0"
#define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\310EX1""\310EX2""\311LS\0""\311RS\0""\313L1\0""\313L2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312GML""\312GMR"
#elif defined(PCBX9E)
#define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\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""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0"