[all] Change in Mixer sources order (will allow the EXTRA_3POS option later)

[all] Change in Switches order (to match the Mixer sources order and save some flash)
[all] New menu in MODELSEL when a ROTARY_ENCODER_NAVIGATION enabled
[all] Add REs (short) and REl (long) in Custom Functions screen. Will be needed later to reset the Rotary Encoder (for example)
This commit is contained in:
bsongis
2013-02-18 18:52:11 +00:00
parent 9d8bfea60a
commit 9fb1eb665f
18 changed files with 1033 additions and 881 deletions
+216 -211
View File
@@ -72,9 +72,7 @@ char modelNames[MAX_MODELS][sizeof(g_model.name)];
#if defined(SPLASH)
const pm_uchar splashdata[] PROGMEM = { 'S','P','S',0,
#if defined(PCBACT)
#include "splash_ACT.lbm"
#elif defined(PCBX9D)
#if defined(PCBX9D)
#include "splash_X9D.lbm"
#else
#include "splash_9x.lbm"
@@ -660,6 +658,10 @@ int16_t ex_chans[NUM_CHNOUT] = {0}; // Outputs (before LIMITS) of the last perMa
int16_t cyc_anas[3] = {0};
#endif
// TODO same naming convention than the putsMixerSource
bool __getSwitch(int8_t swtch);
int16_t getValue(uint8_t i)
{
/*srcRaw is shifted +1!*/
@@ -668,9 +670,15 @@ int16_t getValue(uint8_t i)
#if defined(PCBGRUVIN9X) || defined(PCBSKY9X)
else if (i<NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS) return getRotaryEncoder(i-(NUM_STICKS+NUM_POTS));
#endif
else if (i<MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_perout_flight_phase, i-(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS)));
else if (i<MIXSRC_MAX) return 1024;
#if defined(PCBX9D) || defined(PCBACT)
else if (i<MIXSRC_CYC3)
#if defined(HELI)
return cyc_anas[i-MIXSRC_MAX];
#else
return 0;
#endif
else if (i<MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_perout_flight_phase, i-MIXSRC_CYC3));
#if defined(PCBX9D)
else if (i<MIXSRC_SA) return (switchState(SW_SA0) ? -1024 : (switchState(SW_SA1) ? 0 : 1024));
else if (i<MIXSRC_SB) return (switchState(SW_SB0) ? -1024 : (switchState(SW_SB1) ? 0 : 1024));
else if (i<MIXSRC_SC) return (switchState(SW_SC0) ? -1024 : (switchState(SW_SC1) ? 0 : 1024));
@@ -681,47 +689,44 @@ int16_t getValue(uint8_t i)
else if (i<MIXSRC_SH) return (switchState(SW_SH0) ? -1024 : 1024);
#else
else if (i<MIXSRC_3POS) return (switchState(SW_ID0) ? -1024 : (switchState(SW_ID1) ? 0 : 1024));
// here the switches are skipped
else if (i<MIXSRC_3POS+3)
#if defined(HELI)
return cyc_anas[i-MIXSRC_3POS];
#else
return 0;
#if defined(EXTRA_3POS)
else if (i<MIXSRC_3POS2) return (switchState(SW_ID3) ? -1024 : (switchState(SW_ID4) ? 0 : 1024));
#endif
else if (i<MIXSRC_LAST_CSW) return __getSwitch(SWSRC_THR+i-MIXSRC_3POS) ? 1024 : -1024;
#endif
else if(i<CSW_PPM_BASE+NUM_CAL_PPM) return (g_ppmIns[i-CSW_PPM_BASE] - g_eeGeneral.trainer.calib[i-CSW_PPM_BASE])*2;
else if(i<CSW_PPM_BASE+NUM_PPM) return g_ppmIns[i-CSW_PPM_BASE]*2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT) return ex_chans[i-CSW_CHOUT_BASE];
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_TM2) return s_timerVal[i-CSW_CHOUT_BASE-NUM_CHNOUT];
else if (i<MIXSRC_PPM1+NUM_CAL_PPM) return (g_ppmIns[i-MIXSRC_LAST_CSW] - g_eeGeneral.trainer.calib[i-MIXSRC_LAST_CSW])*2;
else if (i<MIXSRC_LAST_PPM) return g_ppmIns[i-MIXSRC_LAST_CSW]*2;
else if (i<MIXSRC_LAST_CH) return ex_chans[i-MIXSRC_LAST_PPM];
else if (i<MIXSRC_LAST_CH+TELEM_TM2) return s_timerVal[i-MIXSRC_LAST_CH];
#if defined(FRSKY)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_A2) return frskyData.analog[i-CSW_CHOUT_BASE-NUM_CHNOUT-4].value;
else if (i<MIXSRC_LAST_CH+TELEM_RSSI_TX) return frskyData.rssi[1].value;
else if(i<MIXSRC_LAST_CH+TELEM_RSSI_RX) return frskyData.rssi[0].value;
else if(i<MIXSRC_LAST_CH+TELEM_A2) return frskyData.analog[i-MIXSRC_LAST_CH-TELEM_RSSI_RX].value;
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ALT) return frskyData.hub.baroAltitude_bp;
else if(i<MIXSRC_LAST_CH+TELEM_ALT) return frskyData.hub.baroAltitude_bp;
#endif
#if defined(FRSKY_HUB)
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_RPM) return frskyData.hub.rpm;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_FUEL) return frskyData.hub.fuelLevel;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T1) return frskyData.hub.temperature1;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_T2) return frskyData.hub.temperature2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_SPEED) return frskyData.hub.gpsSpeed_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_DIST) return frskyData.hub.gpsDistance;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_GPSALT) return frskyData.hub.gpsAltitude_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VFAS) return (int16_t)frskyData.hub.vfas;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CURRENT) return (int16_t)frskyData.hub.current;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_POWER) return frskyData.power;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCx) return frskyData.hub.accelX;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCy) return frskyData.hub.accelY;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_ACCz) return frskyData.hub.accelZ;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A1) return frskyData.analog[0].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_A2) return frskyData.analog[1].min;
else if(i<CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(CSW_CHOUT_BASE+NUM_CHNOUT+TELEM_MIN_ALT-1));
else if (i<MIXSRC_LAST_CH+TELEM_RPM) return frskyData.hub.rpm;
else if (i<MIXSRC_LAST_CH+TELEM_FUEL) return frskyData.hub.fuelLevel;
else if (i<MIXSRC_LAST_CH+TELEM_T1) return frskyData.hub.temperature1;
else if (i<MIXSRC_LAST_CH+TELEM_T2) return frskyData.hub.temperature2;
else if (i<MIXSRC_LAST_CH+TELEM_SPEED) return frskyData.hub.gpsSpeed_bp;
else if (i<MIXSRC_LAST_CH+TELEM_DIST) return frskyData.hub.gpsDistance;
else if (i<MIXSRC_LAST_CH+TELEM_GPSALT) return frskyData.hub.gpsAltitude_bp;
else if (i<MIXSRC_LAST_CH+TELEM_CELL) return (int16_t)frskyData.hub.minCellVolts * 2;
else if (i<MIXSRC_LAST_CH+TELEM_CELLS_SUM) return (int16_t)frskyData.hub.cellsSum;
else if (i<MIXSRC_LAST_CH+TELEM_VFAS) return (int16_t)frskyData.hub.vfas;
else if (i<MIXSRC_LAST_CH+TELEM_CURRENT) return (int16_t)frskyData.hub.current;
else if (i<MIXSRC_LAST_CH+TELEM_CONSUMPTION) return frskyData.currentConsumption;
else if (i<MIXSRC_LAST_CH+TELEM_POWER) return frskyData.power;
else if (i<MIXSRC_LAST_CH+TELEM_ACCx) return frskyData.hub.accelX;
else if (i<MIXSRC_LAST_CH+TELEM_ACCy) return frskyData.hub.accelY;
else if (i<MIXSRC_LAST_CH+TELEM_ACCz) return frskyData.hub.accelZ;
else if (i<MIXSRC_LAST_CH+TELEM_HDG) return frskyData.hub.gpsCourse_bp;
else if (i<MIXSRC_LAST_CH+TELEM_VSPD) return frskyData.hub.varioSpeed;
else if (i<MIXSRC_LAST_CH+TELEM_MIN_A1) return frskyData.analog[0].min;
else if (i<MIXSRC_LAST_CH+TELEM_MIN_A2) return frskyData.analog[1].min;
else if (i<MIXSRC_LAST_CH+TELEM_MAX_CURRENT) return *(((int16_t*)(&frskyData.hub.minAltitude))+i-(MIXSRC_LAST_CH+TELEM_MAX_CURRENT-1));
#endif
#endif
else return 0;
@@ -759,7 +764,7 @@ bool __getSwitch(int8_t swtch)
uint8_t cs_idx = abs(swtch);
if (cs_idx == SWITCH_ON) {
if (cs_idx == SWSRC_ON) {
result = true;
}
else if (cs_idx <= MAX_PSWITCH) {
@@ -767,17 +772,21 @@ bool __getSwitch(int8_t swtch)
}
else {
cs_idx -= MAX_PSWITCH+1;
CustomSwData * cs = cswaddress(cs_idx);
if (cs->func == CS_OFF) return false;
uint8_t s = CS_STATE(cs->func);
if (s == CS_VBOOL) {
GETSWITCH_RECURSIVE_TYPE mask = ((GETSWITCH_RECURSIVE_TYPE)1 << cs_idx);
if (s_last_switch_used & mask) {
result = (s_last_switch_value & mask);
GETSWITCH_RECURSIVE_TYPE mask = ((GETSWITCH_RECURSIVE_TYPE)1 << cs_idx);
if (s_last_switch_used & mask) {
result = (s_last_switch_value & mask);
}
else {
s_last_switch_used |= mask;
CustomSwData * cs = cswaddress(cs_idx);
uint8_t s = cs->andsw;
// TODO why? if (s > 8) s += 1;
if (cs->func == CS_OFF || (s && !__getSwitch(s))) {
result = false;
}
else {
s_last_switch_used |= mask;
else if ((s=CS_STATE(cs->func)) == CS_VBOOL) {
bool res1 = __getSwitch(cs->v1);
bool res2 = __getSwitch(cs->v2);
switch (cs->func) {
@@ -793,127 +802,114 @@ bool __getSwitch(int8_t swtch)
break;
}
}
#if !defined(CPUARM)
if (result)
s_last_switch_value |= ((GETSWITCH_RECURSIVE_TYPE)1<<cs_idx);
#endif
}
else {
int16_t x = getValue(cs->v1-1);
int16_t y;
if (s == CS_VCOMP) {
y = getValue(cs->v2-1);
switch (cs->func) {
case CS_EQUAL:
result = (x==y);
break;
case CS_NEQUAL:
result = (x!=y);
break;
case CS_GREATER:
result = (x>y);
break;
case CS_LESS:
result = (x<y);
break;
case CS_EGREATER:
result = (x>=y);
break;
// case CS_ELESS:
default:
result = (x<=y);
break;
}
}
else {
#if defined(FRSKY)
// Telemetry
if (cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT) {
if (frskyStreaming <= 0 && cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS)
return swtch > 0 ? false : true;
int16_t x = getValue(cs->v1-1);
int16_t y;
if (s == CS_VCOMP) {
y = getValue(cs->v2-1);
y = convertCswTelemValue(cs);
switch (cs->func) {
case CS_EQUAL:
result = (x==y);
break;
case CS_GREATER:
result = (x>y);
break;
default:
result = (x<y);
break;
}
}
else {
#if defined(FRSKY)
// Telemetry
if (cs->v1 > MIXSRC_LAST_CH) {
if (frskyStreaming <= 0 && cs->v1 > MIXSRC_LAST_CH+MAX_TIMERS)
return swtch > 0 ? false : true;
y = convertCswTelemValue(cs);
#if defined(FRSKY_HUB)
if (s == CS_VOFS) {
uint8_t idx = cs->v1-CSW_CHOUT_BASE-NUM_CHNOUT-TELEM_ALT;
if (idx < THLD_MAX) {
// Fill the threshold array
barsThresholds[idx] = 128 + cs->v2;
if (s == CS_VOFS) {
uint8_t idx = cs->v1-MIXSRC_LAST_CH-TELEM_ALT;
if (idx < THLD_MAX) {
// Fill the threshold array
barsThresholds[idx] = 128 + cs->v2;
}
}
#endif
}
else {
y = calc100toRESX(cs->v2);
}
#else
if (cs->v1 > MIXSRC_LAST_CH) {
y = cs->v2; // it's a timer
}
else {
y = calc100toRESX(cs->v2);
}
#endif
switch (cs->func) {
case CS_VEQUAL:
result = (x==y);
break;
case CS_VPOS:
result = (x>y);
break;
case CS_VNEG:
result = (x<y);
break;
case CS_APOS:
result = (abs(x)>y);
break;
case CS_ANEG:
result = (abs(x)<y);
break;
default:
{
if (csLastValue[cs_idx] == -32668)
csLastValue[cs_idx] = x;
int16_t diff = x - csLastValue[cs_idx];
if (cs->func == CS_DIFFEGREATER)
result = (y >= 0 ? (diff >= y) : (diff <= y));
else
result = (abs(diff) >= y);
if (result)
csLastValue[cs_idx] = x;
break;
}
}
#endif
}
else {
y = calc100toRESX(cs->v2);
}
#else
if (cs->v1 > CSW_CHOUT_BASE+NUM_CHNOUT) {
y = cs->v2; // it's a timer
}
else {
y = calc100toRESX(cs->v2);
}
#endif
switch (cs->func) {
case CS_VPOS:
result = (x>y);
break;
case CS_VNEG:
result = (x<y);
break;
case CS_APOS:
result = (abs(x)>y);
break;
case CS_ANEG:
result = (abs(x)<y);
break;
default:
{
if (csLastValue[cs_idx] == -32668)
csLastValue[cs_idx] = x;
int16_t diff = x - csLastValue[cs_idx];
if (cs->func == CS_DIFFEGREATER)
result = (y >= 0 ? (diff >= y) : (diff <= y));
else
result = (abs(diff) >= y);
if (result)
csLastValue[cs_idx] = x;
break;
}
}
}
}
#if defined(CPUARM)
if (cs->delay) {
if (result) {
if (cswDelays[cs_idx] > get_tmr10ms())
result = false;
if (cs->delay) {
if (result) {
if (cswDelays[cs_idx] > get_tmr10ms())
result = false;
}
else {
cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
}
}
else {
cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
if (cs->duration) {
if (result && !cswStates[cs_idx])
cswDurations[cs_idx] = get_tmr10ms() + (cs->duration*50);
cswStates[cs_idx] = result;
if (cswDurations[cs_idx] > get_tmr10ms()) {
result = true;
if (cs->delay) cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
}
}
}
if (cs->duration) {
if (result && !cswStates[cs_idx])
cswDurations[cs_idx] = get_tmr10ms() + (cs->duration*50);
cswStates[cs_idx] = result;
if (cswDurations[cs_idx] > get_tmr10ms()) {
result = true;
if (cs->delay) cswDelays[cs_idx] = get_tmr10ms() + (cs->delay*50);
}
}
if (result)
s_last_switch_value |= ((GETSWITCH_RECURSIVE_TYPE)1<<cs_idx);
#endif
if (result)
s_last_switch_value |= ((GETSWITCH_RECURSIVE_TYPE)1<<cs_idx);
}
}
return swtch > 0 ? result : !result;
@@ -961,11 +957,7 @@ int8_t getMovedSwitch()
bool prev;
swstate_t mask = 0;
if (i <= 3) {
mask = (1<<(i-1));
prev = (switches_states & mask);
}
else if (i <= 6) {
prev = ((switches_states & 0x18) == ((i-4) << 3));
prev = ((switches_states & 0x03) == (i-1));
}
else {
mask = (1<<(i-2));
@@ -977,8 +969,9 @@ int8_t getMovedSwitch()
result = next ? i : -i;
if (mask)
switches_states ^= mask;
else
switches_states = (switches_states & 0xE7) | ((i-4) << 3);
else {
switches_states = (switches_states & 0x8C) | (i-1);
}
}
}
#endif
@@ -1413,9 +1406,9 @@ void checkSwitches()
uint8_t x = 2;
for (uint8_t i=1; i<8; i++) {
uint8_t attr = (states & (1 << i)) == (switches_states & (1 << i)) ? 0 : INVERS;
putsSwitches(x, 5*FH, (i>5?(i+1):(i>=4?(4+((states>>4)&0x3)):i)), attr);
if (i == 4 && attr) i++;
if (i != 4) x += 3*FW+FW/2;
putsSwitches(x, 5*FH, (i>2?(i+1):1+((states>>4)&0x3)), attr);
if (i == 1 && attr) i++;
if (i != 1) x += 3*FW+FW/2;
}
#endif
lcdRefresh();
@@ -1946,23 +1939,26 @@ tmr10ms_t lastFunctionTime[NUM_CFN] = { 0 };
PLAY_FUNCTION(playValue, uint8_t idx)
{
int16_t val = getValue(idx);
// TODO add the MIXSRC_TELEM_TM1 and so on.
switch (idx) {
case NUM_XCHNRAW+TELEM_TM1-1:
case NUM_XCHNRAW+TELEM_TM2-1:
case MIXSRC_LAST_CH+TELEM_TM1-1:
case MIXSRC_LAST_CH+TELEM_TM2-1:
PLAY_DURATION(val);
break;
#if defined(FRSKY)
case NUM_XCHNRAW+TELEM_RSSI_TX-1:
case NUM_XCHNRAW+TELEM_RSSI_RX-1:
case MIXSRC_LAST_CH+TELEM_RSSI_TX-1:
case MIXSRC_LAST_CH+TELEM_RSSI_RX-1:
PLAY_NUMBER(val, 1+UNIT_DBM, 0);
break;
case NUM_XCHNRAW+TELEM_MIN_A1-1:
case NUM_XCHNRAW+TELEM_MIN_A2-1:
case MIXSRC_LAST_CH+TELEM_MIN_A1-1:
case MIXSRC_LAST_CH+TELEM_MIN_A2-1:
idx -= TELEM_MIN_A1-TELEM_A1;
// no break
case NUM_XCHNRAW+TELEM_A1-1:
case NUM_XCHNRAW+TELEM_A2-1:
idx -= (NUM_XCHNRAW+TELEM_A1-1);
case MIXSRC_LAST_CH+TELEM_A1-1:
case MIXSRC_LAST_CH+TELEM_A2-1:
idx -= (MIXSRC_LAST_CH+TELEM_A1-1);
// A1 and A2
{
uint8_t att = 0;
@@ -1974,41 +1970,41 @@ PLAY_FUNCTION(playValue, uint8_t idx)
break;
}
case NUM_XCHNRAW+TELEM_CELL-1:
case MIXSRC_LAST_CH+TELEM_CELL-1:
PLAY_NUMBER(val/10, 1+UNIT_VOLTS, PREC1);
break;
case NUM_XCHNRAW+TELEM_VFAS-1:
case NUM_XCHNRAW+TELEM_CELLS_SUM-1:
case MIXSRC_LAST_CH+TELEM_VFAS-1:
case MIXSRC_LAST_CH+TELEM_CELLS_SUM-1:
PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1);
break;
case NUM_XCHNRAW+TELEM_CURRENT-1:
case NUM_XCHNRAW+TELEM_MAX_CURRENT-1:
case MIXSRC_LAST_CH+TELEM_CURRENT-1:
case MIXSRC_LAST_CH+TELEM_MAX_CURRENT-1:
PLAY_NUMBER(val, 1+UNIT_AMPS, PREC1);
break;
case NUM_XCHNRAW+TELEM_ACCx-1:
case NUM_XCHNRAW+TELEM_ACCy-1:
case NUM_XCHNRAW+TELEM_ACCz-1:
case MIXSRC_LAST_CH+TELEM_ACCx-1:
case MIXSRC_LAST_CH+TELEM_ACCy-1:
case MIXSRC_LAST_CH+TELEM_ACCz-1:
PLAY_NUMBER(val/10, 1+UNIT_G, PREC1);
break;
case NUM_XCHNRAW+TELEM_VSPD-1:
case MIXSRC_LAST_CH+TELEM_VSPD-1:
PLAY_NUMBER(val/10, 1+UNIT_METERS_PER_SECOND, PREC1);
break;
case NUM_XCHNRAW+TELEM_CONSUMPTION-1:
case MIXSRC_LAST_CH+TELEM_CONSUMPTION-1:
PLAY_NUMBER(val, 1+UNIT_MAH, 0);
break;
case NUM_XCHNRAW+TELEM_POWER-1:
case MIXSRC_LAST_CH+TELEM_POWER-1:
PLAY_NUMBER(val, 1+UNIT_WATTS, 0);
break;
case NUM_XCHNRAW+TELEM_ALT-1:
case NUM_XCHNRAW+TELEM_MIN_ALT-1:
case NUM_XCHNRAW+TELEM_MAX_ALT-1:
case MIXSRC_LAST_CH+TELEM_ALT-1:
case MIXSRC_LAST_CH+TELEM_MIN_ALT-1:
case MIXSRC_LAST_CH+TELEM_MAX_ALT-1:
#if defined(IMPERIAL_UNITS)
if (g_model.frsky.usrProto == USR_PROTO_WS_HOW_HIGH)
PLAY_NUMBER(val, 1+UNIT_FEET, 0);
@@ -2017,24 +2013,24 @@ PLAY_FUNCTION(playValue, uint8_t idx)
PLAY_NUMBER(val, 1+UNIT_METERS, 0);
break;
case NUM_XCHNRAW+TELEM_RPM-1:
case NUM_XCHNRAW+TELEM_MAX_RPM-1:
case MIXSRC_LAST_CH+TELEM_RPM-1:
case MIXSRC_LAST_CH+TELEM_MAX_RPM-1:
PLAY_NUMBER(val, 1+UNIT_RPMS, 0);
break;
case NUM_XCHNRAW+TELEM_HDG-1:
case MIXSRC_LAST_CH+TELEM_HDG-1:
PLAY_NUMBER(val, 1+UNIT_DEGREES, 0);
break;
default:
{
uint8_t unit = 1;
if (idx < NUM_XCHNRAW+TELEM_TM1-1)
if (idx < MIXSRC_LAST_CH+TELEM_TM1-1)
val = (val * 25) / 256;
if (idx >= NUM_XCHNRAW+TELEM_ALT-1 && idx <= NUM_XCHNRAW+TELEM_GPSALT-1)
unit = idx - (NUM_XCHNRAW+TELEM_ALT-1);
else if (idx >= NUM_XCHNRAW+TELEM_MAX_T1-1 && idx <= NUM_XCHNRAW+TELEM_MAX_DIST-1)
unit = 3 + idx - (NUM_XCHNRAW+TELEM_MAX_T1-1);
if (idx >= MIXSRC_LAST_CH+TELEM_ALT-1 && idx <= MIXSRC_LAST_CH+TELEM_GPSALT-1)
unit = idx - (MIXSRC_LAST_CH+TELEM_ALT-1);
else if (idx >= MIXSRC_LAST_CH+TELEM_MAX_T1-1 && idx <= MIXSRC_LAST_CH+TELEM_MAX_DIST-1)
unit = 3 + idx - (MIXSRC_LAST_CH+TELEM_MAX_T1-1);
unit = pgm_read_byte(bchunit_ar+unit);
#if !defined(IMPERIAL_UNITS)
@@ -2208,17 +2204,25 @@ void evalFunctions()
if (sd->func == FUNC_RESET) {
switch (CFN_PARAM(sd)) {
case 0:
case 1:
case FUNC_RESET_TIMER1:
case FUNC_RESET_TIMER2:
resetTimer(CFN_PARAM(sd));
break;
case 2:
case FUNC_RESET_ALL:
resetAll();
break;
#if defined(FRSKY)
case 3:
case FUNC_RESET_TELEMETRY:
resetTelemetry();
break;
#endif
#if ROTARY_ENCODERS > 0
case FUNC_RESET_ROTENC1:
#if ROTARY_ENCODERS > 1
case FUNC_RESET_ROTENC2:
#endif
g_rotenc[CFN_PARAM(sd)-FUNC_RESET_ROTENC1] = 0;
break;
#endif
}
}
@@ -2447,11 +2451,13 @@ void perOut(uint8_t mode, uint8_t tick10ms)
else {
if (k < NUM_STICKS)
v = md->noExpo ? rawAnas[k] : anas[k]; //Switch is on. MAX=FULL=512 or value.
#if defined(PCBX9D) || defined(PCBACT)
#if defined(PCBX9D)
else {
v = getValue(k);
// TODO switches: if (v < 0 && !md->swtch) sw = false;
if (k>=MIXSRC_CH1-1 && k<=MIXSRC_CHMAX-1 && md->destCh != k-MIXSRC_CH1+1) {
if (k >= MIXSRC_SA-1 && k <= MIXSRC_LAST_CSW-1) {
if (v < 0 && !md->swtch) sw = false;
}
if (k>=MIXSRC_CH1-1 && k<=MIXSRC_LAST_CH-1 && md->destCh != k-MIXSRC_CH1+1) {
if (dirtyChannels & ((bitfield_channels_t)1 << (k-MIXSRC_CH1+1)) & (passDirtyChannels|~(((bitfield_channels_t) 1 << md->destCh)-1)))
passDirtyChannels |= (bitfield_channels_t) 1 << md->destCh;
if (k-MIXSRC_CH1+1 < md->destCh || pass > 0)
@@ -2459,13 +2465,12 @@ void perOut(uint8_t mode, uint8_t tick10ms)
}
}
#else
else if (k >= MIXSRC_THR-1 && k <= MIXSRC_SWC-1) {
v = getSwitch(k-MIXSRC_THR+1+1, 0) ? +1024 : -1024;
if (v < 0 && !md->swtch) sw = false;
}
else {
v = getValue(k<=MIXSRC_3POS ? k : k-MAX_SWITCH);
if (k>=MIXSRC_CH1-1 && k<=MIXSRC_CHMAX-1 && md->destCh != k-MIXSRC_CH1+1) {
v = getValue(k);
if (k >= MIXSRC_THR-1 && k <= MIXSRC_LAST_CSW-1) {
if (v < 0 && !md->swtch) sw = false;
}
else if (k>=MIXSRC_CH1-1 && k<=MIXSRC_LAST_CH-1 && md->destCh != k-MIXSRC_CH1+1) {
if (dirtyChannels & ((bitfield_channels_t)1 << (k-MIXSRC_CH1+1)) & (passDirtyChannels|~(((bitfield_channels_t) 1 << md->destCh)-1)))
passDirtyChannels |= (bitfield_channels_t) 1 << md->destCh;
if (k-MIXSRC_CH1+1 < md->destCh || pass > 0)