diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 7ce61eafd..6dd46c3e0 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -476,7 +476,7 @@ void Setup::on_extendedLimits_toggled(bool checked) void Setup::on_throttleWarning_toggled(bool checked) { - model.disableThrottleWarning = checked; + model.disableThrottleWarning = !checked; emit modified(); } @@ -549,7 +549,7 @@ void Setup::update() ui->throttleReverse->setChecked(model.throttleReversed); populateTTraceCB(ui->throttleSource, model.thrTraceSrc); - ui->throttleWarning->setChecked(model.disableThrottleWarning); + ui->throttleWarning->setChecked(!model.disableThrottleWarning); //trim inc, thro trim, thro expo, instatrim ui->trimIncrement->setCurrentIndex(model.trimInc+2); diff --git a/radio/src/Makefile b/radio/src/Makefile index 79c36fcce..8380a747e 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -67,6 +67,14 @@ EXT = STD # Values = YES, NO, CHOICE FAI = NO +# the latests deliveries for Turnigy 9x transmitters (since 2 years now, 2014) do not stop sending if no pulses are generated. +# This fact totally breaks the nice throttle and switch warning concept, because even we prevent sending pulses the +# transmitter modul ignores this, and continous to send the last value or 0 at beginning. And 0 means in the middle of throttle -> 50%. +# To cope with this situation, we need a new concept how to handle throttle and switch warnings. +# if you have a 0 value (50% ) for throttle, while throttle warning is active, you should activate this switch +# Values = YES, NO +TURNIGY_TRANSMITTER_FIX = NO + # Enable heli menu # Values = YES, NO HELI = NO @@ -761,6 +769,14 @@ ifeq ($(NAVIGATION), ROTENC) CPPDEFS += -DROTARY_ENCODER_NAVIGATION endif +ifeq ($(TURNIGY_TRANSMITTER_FIX), YES) + ifeq ($(PCB), TARANIS) + $(warning TURNIGY_TRANSMITTER_FIX is not available on Taranis) + else + CPPDEFS += -DMODULE_ALWAYS_SEND_PULSES + endif +endif + ifeq ($(AUTOSWITCH), YES) CPPDEFS += -DAUTOSWITCH endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 4c94d9b71..f06f0e5c9 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -51,6 +51,9 @@ int24_t act [MAX_MIXERS] = {0}; SwOn swOn [MAX_MIXERS]; // TODO better name later... uint8_t mixWarning; +#if defined(MODULE_ALWAYS_SEND_PULSES) + uint8_t startupWarningState; +#endif #if defined(CPUARM) #define MENUS_STACK_SIZE 2000 @@ -1247,9 +1250,11 @@ getvalue_t getValue(uint8_t i) else if (i==MIXSRC_SH) return (switchState(SW_SH0) ? -1024 : 1024); else if (i<=MIXSRC_LAST_CSW) return getSwitch(SWSRC_FIRST_CSW+i-MIXSRC_FIRST_CSW) ? 1024 : -1024; #else - else if (i==MIXSRC_3POS) return (switchState(SW_ID0) ? -1024 : (switchState(SW_ID1) ? 0 : 1024)); + else if (i==MIXSRC_3POS) return (getSwitch(SW_ID0-SW_BASE+1) ? -1024 : (getSwitch(SW_ID1-SW_BASE+1) ? 0 : 1024)); + // don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning #if defined(EXTRA_3POS) - else if (i==MIXSRC_3POS2) return (switchState(SW_ID3) ? -1024 : (switchState(SW_ID4) ? 0 : 1024)); + else if (i==MIXSRC_3POS2) return (getSwitch(SW_ID3-SW_BASE+1) ? -1024 : (getSwitch(SW_ID4-SW_BASE+1) ? 0 : 1024)); + // don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning #endif else if (i<=MIXSRC_LAST_CSW) return getSwitch(SWSRC_THR+i-MIXSRC_THR) ? 1024 : -1024; #endif @@ -1382,6 +1387,10 @@ void getSwitchesPosition() int16_t csLastValue[NUM_CSW]; #define CS_LAST_VALUE_INIT -32768 +// param swtch may be (negativ sign ignored) +// 0 --> no source +// 1 .. 9 (or max switches) --> returns switch value including 3pos +// others internal switches etc. bool getSwitch(int8_t swtch) { bool result; @@ -1396,6 +1405,20 @@ bool getSwitch(int8_t swtch) } else if (cs_idx <= SWSRC_LAST_SWITCH) { result = SWITCH_POSITION(cs_idx-SWSRC_FIRST_SWITCH); +#if defined(MODULE_ALWAYS_SEND_PULSES) + if (startupWarningState < STARTUP_WARNING_DONE) { + // if throttle or switch warning is currently active, ignore actual stick position and use wanted values + if (cs_idx <= 3) { + if (!(g_model.nSwToWarn&1)) { // ID1 to ID3 is just one bit in nSwToWarn + result = (cs_idx)==((g_model.switchWarningStates&3)+1); // overwrite result with desired value + } + } + else if (!(g_model.nSwToWarn & (1<<(cs_idx-3)))) { + // current switch should not be ignored for warning + result = g_model.switchWarningStates & (1<<(cs_idx-2)); // overwrite result with desired value + } + } +#endif } #if defined(PCBTARANIS) else if (cs_idx <= SWSRC_P26) { @@ -1621,6 +1644,30 @@ int8_t getMovedSwitch() } } #else + // saves about 50 bytes flash + // return delivers 1 to 3 for ID1 to ID3 + // 4..8 for all other switches if changed to true + // -4..-8 for all other switches if changed to false + // 9 for Trainer switch if changed to true; Change to false is ignored + + swstate_t mask=0x80; + for (uint8_t i=NUM_PSWITCH; i>1; i--) { + bool prev; + // mask= (1<<(i-2)); + prev=(switches_states & mask); + // don't use getSwitch here to always get the proper value, even getSwitch manipulates + // bool next = getSwitch(i); + bool next = switchState((EnumKeys)(SW_BASE+i-1)); + if (prev!=next) { + if (((i3)) || next==true) + result = next ? i : -i; + if ((i<=3) && (result==0)) result=1; + switches_states ^= mask; + } + mask>>=1; + } //endfor + +/* for (uint8_t i=NUM_PSWITCH; i>0; i--) { bool prev; swstate_t mask = 0; @@ -1631,7 +1678,9 @@ int8_t getMovedSwitch() mask = (1<<(i-2)); prev = (switches_states & mask); } - bool next = getSwitch(i); + // don't use getSwitch here to always get the proper value, because getSwitch manipulates + // bool next = getSwitch(i); + bool next = switchState((EnumKeys)(SW_BASE+i-1)); if (prev != next) { if (i!=NUM_PSWITCH || next==true) result = next ? i : -i; @@ -1641,7 +1690,7 @@ int8_t getMovedSwitch() switches_states = (switches_states & 0xFC) | (i-1); } } - } + } //endfor */ #endif if ((tmr10ms_t)(get_tmr10ms() - s_move_last_time) > 10) @@ -2237,8 +2286,12 @@ void checkAll() checkLowEEPROM(); #endif +#if defined(MODULE_ALWAYS_SEND_PULSES) + startupWarningState = STARTUP_WARNING_THROTTLE; +#else checkTHR(); checkSwitches(); +#endif #if defined(PCBTARANIS) if (modelHasNotes() && g_model.displayText) { @@ -2252,6 +2305,18 @@ void checkAll() clearKeyEvents(); } +#if defined(MODULE_ALWAYS_SEND_PULSES) +void checkStartupWarnings() +{ + if (startupWarningState < STARTUP_WARNING_DONE) { + if (startupWarningState == STARTUP_WARNING_THROTTLE) + checkTHR(); + else + checkSwitches(); + } +} +#endif + #if !defined(PCBSKY9X) void checkLowEEPROM() { @@ -2264,41 +2329,45 @@ void checkLowEEPROM() void checkTHR() { - if (g_model.disableThrottleWarning) return; + uint8_t thrchn = ((g_model.thrTraceSrc==0) || (g_model.thrTraceSrc>NUM_POTS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1; + // throttle channel is either the stick according stick mode (already handled in evalInputs) + // or P1 to P3; + // in case an output channel is choosen as throttle source (thrTraceSrc>NUM_POTS) we assume the throttle stick is the input + // no other information available at the moment, and good enough to my option (otherwise too much exceptions...) - uint8_t thrchn = (2-(stickMode&1)); //stickMode=0123 -> thr=2121 - -#ifdef SIMU - int16_t lowLim = THRCHK_DEADBAND - 1024 ; +#if defined(MODULE_ALWAYS_SEND_PULSES) + int16_t v = calibratedStick[thrchn]; + if (v<=THRCHK_DEADBAND-1024 || g_model.disableThrottleWarning || pwrCheck()==e_power_off || keyDown()) { + startupWarningState = STARTUP_WARNING_THROTTLE+1; + } + else { + calibratedStick[thrchn] = -1024; +#if !defined(PCBTARANIS) + rawAnas[thrchn] = anas[thrchn] = calibratedStick[thrchn]; +#endif + MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT); + } #else - getADC(); // if thr is down - do not display warning at all - CalibData * calib = &g_eeGeneral.calib[thrchn]; - int16_t lowLim = calib->mid; - lowLim = (g_model.throttleReversed ? - lowLim - calib->spanPos : lowLim - calib->spanNeg); - lowLim += THRCHK_DEADBAND; -#endif - int16_t v = thrAnaIn(thrchn); - - if (v<=lowLim) return; - - // first - display warning - MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT); - - while (1) - { + if (g_model.disableThrottleWarning) return; + evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job + int16_t v = calibratedStick[thrchn]; + if (v<=(THRCHK_DEADBAND-1024)) return; // prevent warning if throttle input OK + // first - display warning; also deletes inputs if any have been before + MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT); + + while (1) { SIMU_SLEEP(1); - getADC(); - int16_t v = thrAnaIn(thrchn); - - if (pwrCheck()==e_power_off || keyDown() || v<=lowLim) + evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job + v = calibratedStick[thrchn]; + if (pwrCheck()==e_power_off || keyDown() || v<=(THRCHK_DEADBAND-1024)) break; - + checkBacklight(); - wdt_reset(); - } + }//endwhile +#endif } void checkAlarm() // added by Gohst @@ -2309,21 +2378,28 @@ void checkAlarm() // added by Gohst void checkSwitches() { +#if defined(MODULE_ALWAYS_SEND_PULSES) + static swstate_t last_bad_switches = 0xff; +#else swstate_t last_bad_switches = 0xff; +#endif swstate_t states = g_model.switchWarningStates; + #if defined(PCBTARANIS) uint8_t bad_pots = 0, last_bad_pots = 0xff; #endif +#if !defined(MODULE_ALWAYS_SEND_PULSES) while (1) { #if defined(TELEMETRY_MOD_14051) || defined(PCBTARANIS) getADC(); #endif +#endif // !defined(MODULE_ALWAYS_SEND_PULSES) getMovedSwitch(); - uint8_t warn = false; + bool warn = false; #if defined(PCBTARANIS) for (uint8_t i=0; i