1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-16 21:05:26 +03:00

FrSky Single stick radio

This commit is contained in:
Bertrand Songis 2017-04-23 13:40:22 +02:00
parent 2670b3121d
commit 3530e68e3d
9 changed files with 73 additions and 56 deletions

View file

@ -20,16 +20,6 @@
#include "opentx.h" #include "opentx.h"
bool isThrottleOutput(uint8_t ch)
{
for (uint8_t i=0; i<MAX_MIXERS; i++) {
MixData *mix = mixAddress(i);
if (mix->destCh==ch && mix->srcRaw==MIXSRC_Thr)
return true;
}
return false;
}
enum MenuModelOutputsItems { enum MenuModelOutputsItems {
ITEM_OUTPUTS_OFFSET, ITEM_OUTPUTS_OFFSET,
ITEM_OUTPUTS_MIN, ITEM_OUTPUTS_MIN,
@ -43,9 +33,9 @@ enum MenuModelOutputsItems {
#define LIMITS_OFFSET_POS 11*FW #define LIMITS_OFFSET_POS 11*FW
#define LIMITS_MIN_POS 15*FW #define LIMITS_MIN_POS 15*FW
#define LIMITS_MAX_POS 18*FW #define LIMITS_MAX_POS 18*FW
#define LIMITS_REVERT_POS 19*FW #define LIMITS_REVERT_POS 19*FW-1
#define LIMITS_MIN_MAX_OFFSET 100 #define LIMITS_MIN_MAX_OFFSET 1000
#define CONVERT_US_MIN_MAX(x) ((int16_t(x)*128)/25) #define CONVERT_US_MIN_MAX(x) ((int16_t(x)*128)/25)
#define MIN_MAX_ATTR attr #define MIN_MAX_ATTR attr
@ -100,14 +90,14 @@ void menuModelLimits(event_t event)
break; break;
case ITEM_OUTPUTS_MIN: case ITEM_OUTPUTS_MIN:
lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT); lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT|PREC1);
if (active) { if (active) {
ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL); ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL);
} }
break; break;
case ITEM_OUTPUTS_MAX: case ITEM_OUTPUTS_MAX:
lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT); lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT|PREC1);
if (active) { if (active) {
ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL); ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL);
} }
@ -122,13 +112,7 @@ void menuModelLimits(event_t event)
lcdDrawTextAtIndex(LIMITS_REVERT_POS, y, STR_MMMINV, revert, attr); lcdDrawTextAtIndex(LIMITS_REVERT_POS, y, STR_MMMINV, revert, attr);
#endif #endif
if (active) { if (active) {
uint8_t revert_new = checkIncDecModel(event, revert, 0, 1); ld->revert = checkIncDecModel(event, revert, 0, 1);
if (checkIncDec_Ret && isThrottleOutput(k)) {
POPUP_CONFIRMATION(STR_INVERT_THR);
}
else {
ld->revert = revert_new;
}
} }
break; break;
} }

View file

@ -57,6 +57,7 @@ void menuCommonCalib(event_t event)
switch (event) { switch (event) {
case EVT_ENTRY: case EVT_ENTRY:
case EVT_KEY_BREAK(KEY_EXIT):
#if defined(PCBACAIR) #if defined(PCBACAIR)
ENABLE_FACTORY_MODE(); ENABLE_FACTORY_MODE();
ENABLE_KEYS(); ENABLE_KEYS();
@ -128,13 +129,11 @@ void menuCommonCalib(event_t event)
void menuRadioCalibration(event_t event) void menuRadioCalibration(event_t event)
{ {
check_simple(event, MENU_RADIO_CALIBRATION, menuTabModel, DIM(menuTabModel), 0); check_simple(event, MENU_RADIO_CALIBRATION, menuTabModel, DIM(menuTabModel), 0);
TITLE(STR_MENUCALIBRATION);
menuCommonCalib(READ_ONLY() ? 0 : event);
if (menuEvent) { if (menuEvent) {
menuCalibrationState = CALIB_START; menuCalibrationState = CALIB_START;
} }
TITLE(STR_MENUCALIBRATION);
menuCommonCalib(READ_ONLY() ? 0 : event);
} }
void menuFirstCalib(event_t event) void menuFirstCalib(event_t event)

View file

@ -26,6 +26,7 @@
enum MenuRadioSetupItems { enum MenuRadioSetupItems {
ITEM_SETUP_SWITCH_SA, ITEM_SETUP_SWITCH_SA,
ITEM_SETUP_SWITCH_SB, ITEM_SETUP_SWITCH_SB,
ITEM_SETUP_SWITCH_SC,
ITEM_SETUP_BATT_RANGE, ITEM_SETUP_BATT_RANGE,
ITEM_SETUP_BATTERY_WARNING, ITEM_SETUP_BATTERY_WARNING,
ITEM_SETUP_CONTRAST, ITEM_SETUP_CONTRAST,
@ -41,6 +42,7 @@ void menuRadioSetup(event_t event)
HEADER_LINE_COLUMNS HEADER_LINE_COLUMNS
0, 0,
0, 0,
0,
1, 1,
0, 0,
0, 0,
@ -61,7 +63,9 @@ void menuRadioSetup(event_t event)
switch (k) { switch (k) {
case ITEM_SETUP_SWITCH_SA: case ITEM_SETUP_SWITCH_SA:
case ITEM_SETUP_SWITCH_SB: { case ITEM_SETUP_SWITCH_SB:
case ITEM_SETUP_SWITCH_SC:
{
int index = k - ITEM_SETUP_SWITCH_SA; int index = k - ITEM_SETUP_SWITCH_SA;
int config = SWITCH_CONFIG(index); int config = SWITCH_CONFIG(index);
lcdDrawTextAtIndex(0, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH - MIXSRC_Rud + index + 1, lcdDrawTextAtIndex(0, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH - MIXSRC_Rud + index + 1,

View file

@ -812,7 +812,11 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms)
MixData * md = mixAddress(i); MixData * md = mixAddress(i);
#if defined(PCBACAIR)
if (md->srcRaw == 0) continue;
#else
if (md->srcRaw == 0) break; if (md->srcRaw == 0) break;
#endif
mixsrc_t stickIndex = md->srcRaw - MIXSRC_FIRST_STICK; mixsrc_t stickIndex = md->srcRaw - MIXSRC_FIRST_STICK;

View file

@ -260,17 +260,20 @@ void generalDefault()
g_eeGeneral.slidersConfig = 0x03; // LS and RS = sliders with detent g_eeGeneral.slidersConfig = 0x03; // LS and RS = sliders with detent
#endif #endif
#if defined(PCBX7) #if defined(PCBACAIR)
g_eeGeneral.switchConfig = 0x0000002b;
#elif defined(PCBX7)
g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE
#elif defined(PCBTARANIS) || defined(PCBHORUS) #elif defined(PCBTARANIS) || defined(PCBHORUS)
g_eeGeneral.switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE g_eeGeneral.switchConfig = 0x00007bff; // 6x3POS, 1x2POS, 1xTOGGLE
#endif #endif
#if defined(PCBX9E) #if defined(PCBACAIR)
// NI-MH 9.6V g_eeGeneral.switchConfig = 0x0000002b;
g_eeGeneral.vBatWarn = 87; #elif defined(PCBX9E)
g_eeGeneral.vBatMin = -5; g_eeGeneral.vBatWarn = 65;
g_eeGeneral.vBatMax = -5; g_eeGeneral.vBatMin = -30;
g_eeGeneral.vBatMax = -30;
#elif defined(PCBTARANIS) #elif defined(PCBTARANIS)
// NI-MH 7.2V // NI-MH 7.2V
g_eeGeneral.vBatWarn = 65; g_eeGeneral.vBatWarn = 65;
@ -292,6 +295,10 @@ void generalDefault()
#if defined(PCBFLAMENCO) #if defined(PCBFLAMENCO)
g_eeGeneral.inactivityTimer = 50; g_eeGeneral.inactivityTimer = 50;
#elif defined(PCBACAIR)
g_eeGeneral.backlightMode = e_backlight_mode_all;
g_eeGeneral.lightAutoOff = 2;
g_eeGeneral.inactivityTimer = 5;
#elif !defined(CPUM64) #elif !defined(CPUM64)
g_eeGeneral.backlightMode = e_backlight_mode_all; g_eeGeneral.backlightMode = e_backlight_mode_all;
g_eeGeneral.lightAutoOff = 2; g_eeGeneral.lightAutoOff = 2;
@ -383,7 +390,7 @@ inline void applyDefaultTemplate()
void applyDefaultTemplate() void applyDefaultTemplate()
{ {
g_model.extendedLimits = true; g_model.extendedLimits = true;
g_model.switchWarningEnable = 0b11; g_model.switchWarningEnable = 0;
memcpy(g_model.header.name, "\001\003\000\001\367\356", 6); memcpy(g_model.header.name, "\001\003\000\001\367\356", 6);
g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_CUSTOM; g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_CUSTOM;
@ -402,6 +409,8 @@ void applyDefaultTemplate()
} }
// 3 dual rates for Rud and Thr // 3 dual rates for Rud and Thr
const uint8_t RUD_WEIGHT[] = {40, 20, 10};
const uint8_t THR_WEIGHT[] = {80, 40, 20};
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
// Rud // Rud
ExpoData * expo = expoAddress(i); ExpoData * expo = expoAddress(i);
@ -409,17 +418,17 @@ void applyDefaultTemplate()
expo->srcRaw = MIXSRC_Rud; expo->srcRaw = MIXSRC_Rud;
expo->swtch = SWSRC_SA0 + i; expo->swtch = SWSRC_SA0 + i;
expo->curve.type = CURVE_REF_EXPO; expo->curve.type = CURVE_REF_EXPO;
expo->curve.value = 40; expo->curve.value = 0;
expo->weight = 100 - i * 20; expo->weight = RUD_WEIGHT[i];
expo->mode = 3; expo->mode = 3; // TODO constant
// Thr // Thr
expo = expoAddress(3 + i); expo = expoAddress(3 + i);
expo->chn = 1; expo->chn = 1;
expo->srcRaw = MIXSRC_Thr; expo->srcRaw = MIXSRC_Thr;
expo->swtch = SWSRC_SA0 + i; expo->swtch = SWSRC_SA0 + i;
expo->curve.type = CURVE_REF_EXPO; expo->curve.type = CURVE_REF_EXPO;
expo->curve.value = 20; expo->curve.value = 0;
expo->weight = 100 - i * 20; expo->weight = THR_WEIGHT[i];
expo->mode = 3; // TODO constant expo->mode = 3; // TODO constant
} }
@ -445,17 +454,31 @@ void applyDefaultTemplate()
++mix; ++mix;
mix->destCh = 2; mix->destCh = 2;
mix->weight = 100; mix->weight = 100;
mix->srcRaw = MIXSRC_SB; mix->srcRaw = MIXSRC_NONE;
++mix; ++mix;
mix->destCh = 3; mix->destCh = 3;
mix->weight = 100; mix->weight = 100;
mix->srcRaw = MIXSRC_SC; mix->srcRaw = MIXSRC_NONE;
for (int i=4; i<8; i++) {
++mix; ++mix;
mix->destCh = i; mix->destCh = 4;
mix->weight = 100;
mix->srcRaw = MIXSRC_SC;
++mix;
mix->destCh = 5;
mix->weight = 100;
mix->srcRaw = MIXSRC_SB;
++mix;
mix->destCh = 6;
mix->weight = 100; mix->weight = 100;
mix->srcRaw = MIXSRC_NONE; mix->srcRaw = MIXSRC_NONE;
}
// The outputs
LimitData * ch2 = limitAddress(1);
ch2->revert = 1;
LimitData * ch5 = limitAddress(4);
ch5->offset = +100; // 10.0%
LimitData * ch6 = limitAddress(5);
ch6->min = +100; // 0%
storageDirty(EE_MODEL); storageDirty(EE_MODEL);
} }

View file

@ -145,7 +145,7 @@ void simuInit()
simuSetSwitch(i, 0); simuSetSwitch(i, 0);
simuSetKey(i, false); // a little dirty, but setting keys that don't exist is perfectly OK here simuSetKey(i, false); // a little dirty, but setting keys that don't exist is perfectly OK here
} }
for (int i=0; i < (NUM_STICKS+NUM_AUX_TRIMS)*2; i++) for (int i=0; i < NUM_TRIMS*2; i++)
simuSetTrim(i, false); simuSetTrim(i, false);
#if defined(ROTARY_ENCODERS) || defined(ROTARY_ENCODER_NAVIGATION) #if defined(ROTARY_ENCODERS) || defined(ROTARY_ENCODER_NAVIGATION)

View file

@ -90,7 +90,7 @@ set(TARGET_DIR taranis)
# set(PPM_LIMITS_SYMETRICAL YES) # set(PPM_LIMITS_SYMETRICAL YES)
if(SPLASH STREQUAL OFF) if(SPLASH STREQUAL OFF)
message(FATAL_ERROR "Option SPLASH=OFF not supported on Taranis") # message(FATAL_ERROR "Option SPLASH=OFF not supported on Taranis")
endif() endif()
add_definitions(-DPCBTARANIS -DPPM_PIN_TIMER) add_definitions(-DPCBTARANIS -DPPM_PIN_TIMER)

View file

@ -145,6 +145,7 @@ void readKeysAndTrims()
in = readKeys(); in = readKeys();
if (FACTORY_MODE_ENABLED()) { if (FACTORY_MODE_ENABLED()) {
TRACE("FACTORY 0x%x", in);
if (in == ((1 << KEY_MENU) | (1 << KEY_ENTER))) { if (in == ((1 << KEY_MENU) | (1 << KEY_ENTER))) {
ENABLE_KEYS(); ENABLE_KEYS();
} }
@ -201,6 +202,7 @@ void readKeysAndTrims()
xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \ xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
break; break;
#endif #endif
#if !defined(PCBACAIR)
#define ADD_3POS_CASE(x, i) \ #define ADD_3POS_CASE(x, i) \
case SW_S ## x ## 0: \ case SW_S ## x ## 0: \
xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
@ -217,6 +219,7 @@ void readKeysAndTrims()
xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
} \ } \
break break
#endif
uint8_t keyState(uint8_t index) uint8_t keyState(uint8_t index)
{ {