From da23a624dc68621c28e71fa01b1dc301b8d2080d Mon Sep 17 00:00:00 2001 From: openfsguruh Date: Mon, 10 Feb 2014 20:51:25 +0100 Subject: [PATCH] merged changes from Issue020_ThrottleWarning based on current next branch, includes all changes from old ThrottleWarning branch. Solves issue 020: Throttle warning if P1-P3 is selected as Thr source. Adds Turnigy TransmitterFix option code savings: 120 bytes without Transmitter fix 4 bytes but 1 more data if Transmitter Fix is activated. Added make option TURNIGY_TRANSMITTER_FIX for this purpose TURNIGY_TRANSMITTER_FIX = NO is default set to YES for new Turnigy9x transmitter which transmits even no pulses are generated. --- radio/src/Makefile | 16 ++++ radio/src/opentx.cpp | 195 ++++++++++++++++++++++++++++++++++--------- radio/src/opentx.h | 16 +++- 3 files changed, 188 insertions(+), 39 deletions(-) diff --git a/radio/src/Makefile b/radio/src/Makefile index 12fb145b1..053b0371d 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 @@ -671,6 +679,10 @@ ifeq ($(PCB), TARANIS) CPPSRC += protocols/hubsan.cpp CPPSRC += targets/taranis/a7105_driver.cpp endif + + ifeq ($(TURNIGY_TRANSMITTER_FIX), YES) + $(error TURNIGY_TRANSMITTER_FIX is not yet implemented for Taranis. If this is actually needed, getSwitch() needs to be modified) + endif endif CC = $(TRGT)gcc @@ -743,6 +755,10 @@ ifeq ($(NAVIGATION), ROTENC) CPPDEFS += -DROTARY_ENCODER_NAVIGATION endif +ifeq ($(TURNIGY_TRANSMITTER_FIX), YES) + CPPDEFS += -DINPUT_WARNINGS_GENERATE_SIM_DATA +endif + ifeq ($(AUTOSWITCH), YES) CPPDEFS += -DAUTOSWITCH endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index f1ac3e785..a73224d1e 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; +#ifdef INPUT_WARNINGS_GENERATE_SIM_DATA + uint8_t checkWarningState; +#endif #if defined(CPUARM) #define MENUS_STACK_SIZE 2000 @@ -1246,9 +1249,11 @@ getvalue_t getValue(uint8_t i) else if (i==MIXSRC_SG) return (switchState(SW_SG0) ? -1024 : (switchState(SW_SG1) ? 0 : 1024)); 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)); + 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 #endif @@ -1380,6 +1385,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; @@ -1394,6 +1403,19 @@ bool getSwitch(int8_t swtch) } else if (cs_idx <= SWSRC_LAST_SWITCH) { result = SWITCH_POSITION(cs_idx-SWSRC_FIRST_SWITCH); +#ifdef INPUT_WARNINGS_GENERATE_SIM_DATA + if (checkWarningState1; 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; @@ -1628,7 +1674,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; @@ -1638,7 +1686,7 @@ int8_t getMovedSwitch() switches_states = (switches_states & 0xFC) | (i-1); } } - } + } //endfor */ #endif if ((tmr10ms_t)(get_tmr10ms() - s_move_last_time) > 10) @@ -2228,14 +2276,35 @@ void doSplash() #define doSplash() #endif + +// #define INPUT_WARNINGS_GENERATE_SIM_DATA +// the latests deliveries from 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. +// My solution is, not to stop pulses at all. In warning situation the input of the appropriate channels are ignored and +// replaced with a value which wouldn't generate the warning, e.g. for throttle -100% +// Because this new concept is also compatible with the better (older) transmitter we can enable it by default and let the user choose if +// he want's the old handling or new one. + +#if defined(PCBTARANIS) && defined(INPUT_WARNINGS_GENERATE_SIM_DATA) +// #error "INPUT_WARNINGS_GENERATE_SIM_DATA is not yet implemented for Taranis build." +// according current transmitters, this shouldn't be necessary as well +// but if wanted the switch simulation part needs to be simulated the same way as for stock +#endif + void checkAll() { #if !defined(PCBSKY9X) checkLowEEPROM(); #endif +#ifdef INPUT_WARNINGS_GENERATE_SIM_DATA + checkWarningState=e_InWarnBegin; +#else checkTHR(); checkSwitches(); +#endif #if defined(PCBTARANIS) if (modelHasNotes() && g_model.displayText) { @@ -2249,6 +2318,16 @@ void checkAll() clearKeyEvents(); } +#ifdef INPUT_WARNINGS_GENERATE_SIM_DATA +void checkInMix() +{ + if (checkWarningState>=e_InWarnFinished) return; // no more checks + + if (checkWarningStateNUM_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 avaialbe 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 ; +#ifdef INPUT_WARNINGS_GENERATE_SIM_DATA + int16_t v = calibratedStick[thrchn]; + if ((v<=(THRCHK_DEADBAND-1024)) || g_model.disableThrottleWarning) { + checkWarningState=e_InWarnStartSwitchWarn; + // checkWarningState=e_InWarnFinished; + } else { + calibratedStick[thrchn]=-1024; +#if !defined(PCBTARANIS) + rawAnas[thrchn]=anas[thrchn]=calibratedStick[thrchn]; +#endif + if (checkWarningState disable warning + checkWarningState=e_InWarnStartSwitchWarn; + // checkWarningState=e_InWarnFinished; + } + } #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 @@ -2306,21 +2399,28 @@ void checkAlarm() // added by Gohst void checkSwitches() { +#ifdef INPUT_WARNINGS_GENERATE_SIM_DATA + 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 +#ifndef INPUT_WARNINGS_GENERATE_SIM_DATA while (1) { #if defined(TELEMETRY_MOD_14051) || defined(PCBTARANIS) getADC(); #endif +#endif //INPUT_WARNINGS_GENERATE_SIM_DATA getMovedSwitch(); - uint8_t warn = false; + bool warn = false; #if defined(PCBTARANIS) for (uint8_t i=0; i