diff --git a/radio/src/buzzer.h b/radio/src/buzzer.h index aa13746f8..f0c545d5e 100644 --- a/radio/src/buzzer.h +++ b/radio/src/buzzer.h @@ -22,8 +22,6 @@ #define _BUZZER_H_ #if defined(BUZZER) -extern uint8_t g_beepCnt; -extern uint8_t beepAgain; extern uint8_t beepAgainOrig; extern uint8_t beepOn; extern bool warble; diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 7a2454034..413c5efcd 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -26,6 +26,7 @@ #include "dataconstants.h" #include "definitions.h" #include "bitfield.h" +#include "globals.h" #if defined(PCBTARANIS) #define N_TARANIS_FIELD(x) @@ -483,8 +484,6 @@ PACK(struct ModuleData { * Model structure */ -typedef uint16_t BeepANACenter; - #if LEN_BITMAP_NAME > 0 #define MODEL_HEADER_BITMAP_FIELD NOBACKUP(char bitmap[LEN_BITMAP_NAME]); #else diff --git a/radio/src/globals.h b/radio/src/globals.h new file mode 100644 index 000000000..cf67dbc4a --- /dev/null +++ b/radio/src/globals.h @@ -0,0 +1,97 @@ +/* + * 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 _GLOBALS_H_ +#define _GLOBALS_H_ + +#include "definitions.h" +#include "dataconstants.h" + +PACK(struct GlobalData { + uint8_t unexpectedShutdown:1; + uint8_t externalAntennaEnabled:1; + uint8_t authenticationCount:2; + uint8_t upgradeModulePopup:1; + uint8_t internalModuleVersionChecked:1; + uint8_t spare:2; +}); + +extern GlobalData globalData; + +extern uint16_t sessionTimer; +extern uint16_t s_timeCumThr; +extern uint16_t s_timeCum16ThrP; + +#if defined(OVERRIDE_CHANNEL_FUNCTION) +#define OVERRIDE_CHANNEL_UNDEFINED -4096 +extern safetych_t safetyCh[MAX_OUTPUT_CHANNELS]; +#endif + +extern uint8_t trimsCheckTimer; +extern uint8_t trimsDisplayTimer; +extern uint8_t trimsDisplayMask; +extern uint16_t maxMixerDuration; + +extern uint8_t requiredSpeakerVolume; + +enum MainRequest { + REQUEST_SCREENSHOT, + REQUEST_FLIGHT_RESET, +}; + +extern uint8_t mainRequestFlags; + +#define DELAY_POS_MARGIN 3 +typedef int16_t delayval_t; +PACK(struct SwOn { + uint16_t delay:14; // max = 2550 + uint8_t activeMix:1; + uint8_t activeExpo:1; + int16_t now; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + int16_t prev; +}); + +extern SwOn swOn[MAX_MIXERS]; +extern int32_t act[MAX_MIXERS]; + +// static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack +// It's also easier to initialize them here. +extern int8_t virtualInputsTrims[MAX_INPUTS]; + +extern int16_t anas [MAX_INPUTS]; +extern int16_t trims[NUM_TRIMS]; +extern int32_t chans[MAX_OUTPUT_CHANNELS]; +extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain +extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS]; + +typedef uint16_t BeepANACenter; +extern BeepANACenter bpanaCenter; + +extern uint8_t s_mixer_first_run_done; + +extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS]; + +extern uint8_t g_beepCnt; +extern uint8_t beepAgain; +extern uint16_t lightOffCounter; +extern uint8_t flashCounter; +extern uint8_t mixWarning; + +#endif diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index b8c01cbaa..3cd369ddb 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1018,10 +1018,6 @@ bool menuModelSetup(event_t event) uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); if (checkIncDec_Ret) { setModuleType(INTERNAL_MODULE, moduleType); -#if defined(ACCESS_LIB) - // the module will reset on mode switch, we need to reset the authentication counter - globalData.authenticationCount = 0; -#endif } } else if (isModuleXJT(INTERNAL_MODULE)) { @@ -1034,6 +1030,7 @@ bool menuModelSetup(event_t event) } else if (isModulePXX2(INTERNAL_MODULE)) { g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL); + resetAccessAuthenticationCount(); } } break; diff --git a/radio/src/gui/480x272/radio_power_meter.cpp b/radio/src/gui/480x272/radio_power_meter.cpp index f49eeb93c..c1f6ac316 100644 --- a/radio/src/gui/480x272/radio_power_meter.cpp +++ b/radio/src/gui/480x272/radio_power_meter.cpp @@ -50,10 +50,7 @@ bool menuRadioPowerMeter(event_t event) lcdDrawCenteredText(LCD_H/2, STR_STOPPING); lcdRefresh(); moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); -#if defined(ACCESS_LIB) - // the module will reset on mode switch, we need to reset the authentication counter - globalData.authenticationCount = 0; -#endif + resetAccessAuthenticationCount(); /* wait 1s to resume normal operation before leaving */ watchdogSuspend(500 /*5s*/); RTOS_WAIT_MS(1000); diff --git a/radio/src/gui/480x272/radio_spectrum_analyser.cpp b/radio/src/gui/480x272/radio_spectrum_analyser.cpp index 39ff66e02..95e40e9db 100644 --- a/radio/src/gui/480x272/radio_spectrum_analyser.cpp +++ b/radio/src/gui/480x272/radio_spectrum_analyser.cpp @@ -58,10 +58,7 @@ bool menuRadioSpectrumAnalyser(event_t event) lcdRefresh(); if (isModulePXX2(g_moduleIdx)) { moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); -#if defined(ACCESS_LIB) - // the module will reset on mode switch, we need to reset the authentication counter - globalData.authenticationCount = 0; -#endif + resetAccessAuthenticationCount(); } else if (isModuleMultimodule(g_moduleIdx)) { if (reusableBuffer.spectrumAnalyser.moduleOFF) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index a8100da22..d361ac479 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -901,9 +901,7 @@ void evalMixes(uint8_t tick10ms) static uint16_t fp_act[MAX_FLIGHT_MODES] = {0}; static uint16_t delta = 0; - static ACTIVE_PHASES_TYPE flightModesFade = 0; - - LS_RECURSIVE_EVALUATION_RESET(); + static uint16_t flightModesFade = 0; uint8_t fm = getFlightMode(); @@ -915,7 +913,7 @@ void evalMixes(uint8_t tick10ms) } else { uint8_t fadeTime = max(g_model.flightModeData[lastFlightMode].fadeOut, g_model.flightModeData[fm].fadeIn); - ACTIVE_PHASES_TYPE transitionMask = ((ACTIVE_PHASES_TYPE)1 << lastFlightMode) + ((ACTIVE_PHASES_TYPE)1 << fm); + uint16_t transitionMask = (0x01u << lastFlightMode) + (0x01u << fm); if (fadeTime) { flightModesFade |= transitionMask; delta = (MAX_ACT / 10) / fadeTime; @@ -945,15 +943,13 @@ void evalMixes(uint8_t tick10ms) if (flightModesFade) { memclear(sum_chans512, sizeof(sum_chans512)); for (uint8_t p=0; p> 4) * fp_act[p]; weight += fp_act[p]; } - LS_RECURSIVE_EVALUATION_RESET(); } assert(weight); mixerCurrentFlightMode = fm; @@ -994,7 +990,7 @@ void evalMixes(uint8_t tick10ms) if (tick10ms && flightModesFade) { uint16_t tick_delta = delta * tick10ms; for (uint8_t p=0; p tick_delta) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index cd9ac3a58..7ca6a1db6 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -21,14 +21,12 @@ #ifndef _OPENTX_H_ #define _OPENTX_H_ -#include -#include -#include #include -#include #include "definitions.h" #include "opentx_types.h" #include "debounce.h" +#include "globals.h" +#include "opentx_helpers.h" #if defined(SIMU) #include "targets/simu/simpgmspace.h" @@ -502,7 +500,6 @@ void logicalSwitchesReset(); void evalLogicalSwitches(bool isCurrentFlightmode=true); void logicalSwitchesCopyState(uint8_t src, uint8_t dst); -#define LS_RECURSIVE_EVALUATION_RESET() #if defined(PCBTARANIS) || defined(PCBHORUS) void getSwitchesPosition(bool startup); @@ -547,34 +544,8 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim); #include "gvars.h" -extern uint16_t sessionTimer; -extern uint16_t s_timeCumThr; -extern uint16_t s_timeCum16ThrP; - -#if defined(OVERRIDE_CHANNEL_FUNCTION) -#define OVERRIDE_CHANNEL_UNDEFINED -4096 -extern safetych_t safetyCh[MAX_OUTPUT_CHANNELS]; -#endif - -extern uint8_t trimsCheckTimer; -extern uint8_t trimsDisplayTimer; -extern uint8_t trimsDisplayMask; - void flightReset(uint8_t check=true); -PACK(struct GlobalData { - uint8_t unexpectedShutdown:1; - uint8_t externalAntennaEnabled:1; - uint8_t authenticationCount:2; - uint8_t upgradeModulePopup:1; - uint8_t internalModuleVersionChecked:1; - uint8_t spare:2; -}); - -extern GlobalData globalData; - -extern uint16_t maxMixerDuration; - #define DURATION_MS_PREC2(x) ((x)/20) #if defined(THRTRACE) @@ -723,14 +694,9 @@ extern const char vers_stamp[]; const char * getOtherVersion(char * buffer); #define g_blinkTmr10ms (*(uint8_t*)&g_tmr10ms) -extern uint8_t g_beepCnt; #include "trainer.h" -extern int32_t chans[MAX_OUTPUT_CHANNELS]; -extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain -extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS]; - int expo(int x, int k); inline void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0) @@ -829,33 +795,15 @@ int16_t applyLimits(uint8_t channel, int32_t value); void evalInputs(uint8_t mode); uint16_t anaIn(uint8_t chan); -extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS]; - #define FLASH_DURATION 20 /*200ms*/ -extern uint8_t beepAgain; -extern uint16_t lightOffCounter; -extern uint8_t flashCounter; -extern uint8_t mixWarning; - FlightModeData * flightModeAddress(uint8_t idx); ExpoData * expoAddress(uint8_t idx); MixData * mixAddress(uint8_t idx); LimitData * limitAddress(uint8_t idx); LogicalSwitchData * lswAddress(uint8_t idx); -// static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack -// It's also easier to initialize them here. -extern int8_t virtualInputsTrims[MAX_INPUTS]; - -extern int16_t anas [MAX_INPUTS]; -extern int16_t trims[NUM_TRIMS]; -extern BeepANACenter bpanaCenter; - -extern uint8_t s_mixer_first_run_done; - void applyDefaultTemplate(); - void instantTrim(); void evalTrims(); void copyTrimsToOffset(uint8_t ch); @@ -863,20 +811,6 @@ void copySticksToOffset(uint8_t ch); void copyMinMaxToOutputs(uint8_t ch); void moveTrimsToOffsets(); -typedef uint16_t ACTIVE_PHASES_TYPE; -#define DELAY_POS_MARGIN 3 -typedef int16_t delayval_t; -PACK(struct SwOn { - uint16_t delay:14; // max = 2550 - uint8_t activeMix:1; - uint8_t activeExpo:1; - int16_t now; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw - int16_t prev; -}); - -extern SwOn swOn[MAX_MIXERS]; -extern int32_t act[MAX_MIXERS]; - #if defined(BOLD_FONT) inline bool isExpoActive(uint8_t expo) { @@ -1050,15 +984,6 @@ void setMFP(); void clearMFP(); #endif -extern uint8_t requiredSpeakerVolume; - -enum MainRequest { - REQUEST_SCREENSHOT, - REQUEST_FLIGHT_RESET, -}; - -extern uint8_t mainRequestFlags; - void checkBattery(); void opentxClose(uint8_t shutdown=true); void opentxInit(); diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index a1e3cee65..5327938d2 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -26,6 +26,7 @@ #include "opentx_helpers.h" #include "telemetry/telemetry.h" #include "storage/storage.h" +#include "globals.h" #if defined(MULTIMODULE) #include "telemetry/multi.h" @@ -534,6 +535,14 @@ inline void setDefaultPpmFrameLength(uint8_t moduleIdx) g_model.moduleData[moduleIdx].ppm.frameLength = 4 * max(0, g_model.moduleData[moduleIdx].channelsCount); } +inline void resetAccessAuthenticationCount() +{ +#if defined(ACCESS_LIB) + // the module will reset on mode switch, we need to reset the authentication counter + globalData.authenticationCount = 0; +#endif +} + inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) { ModuleData & moduleData = g_model.moduleData[moduleIdx]; @@ -544,6 +553,8 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) moduleData.sbus.refreshRate = -31; else if (moduleData.type == MODULE_TYPE_PPM) setDefaultPpmFrameLength(moduleIdx); + else + resetAccessAuthenticationCount(); } extern bool isExternalAntennaEnabled(); diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 42f04fb26..afcbaa061 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -308,9 +308,7 @@ static void enablePulsesInternalModule(uint8_t protocol) #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: intmoduleSerialStart(PXX2_HIGHSPEED_BAUDRATE, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b); -#if defined(HARDWARE_INTERNAL_MODULE) && defined(INTERNAL_MODULE_PXX2) && defined(ACCESS_LIB) - globalData.authenticationCount = 0; -#endif + resetAccessAuthenticationCount(); break; #endif