From 5c8e8ebbe5c280588023901467b555834720622e Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Fri, 5 Dec 2014 22:21:29 +0100 Subject: [PATCH] Separated perMain() for ARM and other platforms --- radio/src/eeprom_common.h | 2 + radio/src/opentx.cpp | 442 ++++++-------------- radio/src/opentx.h | 5 + radio/src/targets/simu/simpgmspace.cpp | 6 + radio/src/targets/simu/simpgmspace.h | 1 - radio/src/targets/taranis/board_taranis.cpp | 89 +++- radio/src/targets/taranis/board_taranis.h | 5 + radio/src/tasks_arm.cpp | 137 +++++- 8 files changed, 378 insertions(+), 309 deletions(-) diff --git a/radio/src/eeprom_common.h b/radio/src/eeprom_common.h index 1997c930e..463c1fd65 100644 --- a/radio/src/eeprom_common.h +++ b/radio/src/eeprom_common.h @@ -46,6 +46,8 @@ #define WRITE_DELAY_10MS 200 #endif +#define TIME_TO_WRITE() (s_eeDirtyMsk && (tmr10ms_t)(get_tmr10ms() - s_eeDirtyTime10ms) >= (tmr10ms_t)WRITE_DELAY_10MS) + extern uint8_t s_eeDirtyMsk; extern tmr10ms_t s_eeDirtyTime10ms; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 86c99c6f4..c539e5780 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -87,56 +87,6 @@ uint8_t g_tmr1Latency_min; uint16_t lastMixerDuration; #endif -#if defined(PCBTARANIS) -uint8_t currentTrainerMode = 0xff; - -void checkTrainerSettings() -{ - uint8_t requiredTrainerMode = g_model.trainerMode; - if (requiredTrainerMode != currentTrainerMode) { - switch (currentTrainerMode) { - case TRAINER_MODE_MASTER: - stop_trainer_capture(); - break; - case TRAINER_MODE_SLAVE: - stop_trainer_ppm(); - break; - case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: - stop_cppm_on_heartbeat_capture() ; - break; - case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: - stop_sbus_on_heartbeat_capture() ; - break; - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: - uart3Stop(); - } - - currentTrainerMode = requiredTrainerMode; - switch (requiredTrainerMode) { - case TRAINER_MODE_SLAVE: - init_trainer_ppm(); - break; - case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: - init_cppm_on_heartbeat_capture() ; - break; - case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: - init_sbus_on_heartbeat_capture() ; - break; - case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: - if (g_eeGeneral.uart3Mode == UART_MODE_SBUS_TRAINER) { - uart3SbusInit(); - break; - } - // no break - default: - // master is default - init_trainer_capture(); - break; - } - } -} -#endif - uint8_t unexpectedShutdown = 0; /* AVR: mixer duration in 1/16ms */ @@ -209,7 +159,6 @@ void per10ms() watchdogTimeout -= 1; wdt_reset(); // Retrigger hardware watchdog } - Tenms |= 1 ; // 10 mS has passed #endif if (lightOffCounter) lightOffCounter--; @@ -1699,10 +1648,6 @@ uint8_t mSwitchDuration[1+NUM_ROTARY_ENCODERS] = { 0 }; #define CFN_PRESSLONG_DURATION 100 #endif -#if defined(CPUARM) -uint8_t currentSpeakerVolume = 255; -uint8_t requiredSpeakerVolume; -#endif uint8_t s_mixer_first_run_done = false; @@ -1995,7 +1940,6 @@ void doMixerCalculations() s_mixer_first_run_done = true; } -#define TIME_TO_WRITE() (s_eeDirtyMsk && (tmr10ms_t)(get_tmr10ms() - s_eeDirtyTime10ms) >= (tmr10ms_t)WRITE_DELAY_10MS) #if defined(NAVIGATION_STICKS) @@ -2129,205 +2073,11 @@ void opentxClose() #endif -#if defined(USB_JOYSTICK) && defined(PCBTARANIS) && !defined(SIMU) -extern USB_OTG_CORE_HANDLE USB_OTG_dev; - -/* - Prepare and send new USB data packet - - The format of HID_Buffer is defined by - USB endpoint description can be found in - file usb_hid_joystick.c, variable HID_JOYSTICK_ReportDesc -*/ -void usbJoystickUpdate(void) -{ - static uint8_t HID_Buffer[HID_IN_PACKET]; - - //buttons - HID_Buffer[0] = 0; //buttons - for (int i = 0; i < 8; ++i) { - if ( channelOutputs[i+8] > 0 ) { - HID_Buffer[0] |= (1 << i); - } - } - - //analog values - //uint8_t * p = HID_Buffer + 1; - for (int i = 0; i < 8; ++i) { - int16_t value = channelOutputs[i] / 8; - if ( value > 127 ) value = 127; - else if ( value < -127 ) value = -127; - HID_Buffer[i+1] = static_cast(value); - } - - USBD_HID_SendReport (&USB_OTG_dev, HID_Buffer, HID_IN_PACKET ); -} - -#endif //#if defined(USB_JOYSTICK) && defined(PCBTARANIS) && !defined(SIMU) - - -void perMain() -{ -#if defined(SIMU) - doMixerCalculations(); -#elif !defined(CPUARM) - uint16_t t0 = getTmr16KHz(); - int16_t delta = (nextMixerEndTime - lastMixerDuration) - t0; - if (delta > 0 && delta < MAX_MIXER_DELTA) { -#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) - rotencPoll(); -#endif - - // @@@ open.20.fsguruh - // SLEEP(); // wouldn't that make sense? should save a lot of battery power!!! -/* for future use; currently very very beta... */ -#if defined(POWER_SAVE) - ADCSRA&=0x7F; // disable ADC for power saving - ACSR&=0xF7; // disable ACIE Interrupts - ACSR|=0x80; // disable Analog Comparator - // maybe we disable here a lot more hardware components in future to save even more power - - - - MCUCR|=0x20; // enable Sleep (bit5) - // MCUCR|=0x28; // enable Sleep (bit5) enable ADC Noise Reduction (bit3) - // first tests showed: simple sleep would reduce cpu current from 40.5mA to 32.0mA - // noise reduction sleep would reduce it down to 28.5mA; However this would break pulses in theory - // however with standard module, it will need about 95mA. Therefore the drop to 88mA is not much noticable - do { - asm volatile(" sleep \n\t"); // if _SLEEP() is not defined use this - t0=getTmr16KHz(); - delta= (nextMixerEndTime - lastMixerDuration) - t0; - } while ((delta>0) && (delta maxMixerDuration) maxMixerDuration = t0; -#endif - -// TODO same code here + integrate the timer which could be common -#if defined(CPUARM) - if (!Tenms) return; - Tenms = 0 ; -#endif - -#if defined(PCBSKY9X) - Current_accumulator += Current_analogue ; - static uint32_t OneSecTimer; - if (++OneSecTimer >= 100) { - OneSecTimer -= 100 ; - Current_used += Current_accumulator / 100 ; // milliAmpSeconds (but scaled) - Current_accumulator = 0 ; - } -#endif - -#if defined(CPUARM) - if (currentSpeakerVolume != requiredSpeakerVolume) { - currentSpeakerVolume = requiredSpeakerVolume; - setVolume(currentSpeakerVolume); - } -#endif - -#if defined(MODULE_ALWAYS_SEND_PULSES) - if (startupWarningState < STARTUP_WARNING_DONE) { - // don't do menu's until throttle and switch warnings are handled - return; - } -#endif - - if (!usbPlugged()) { - // TODO merge these 2 branches -#if defined(PCBSKY9X) - if (Eeprom32_process_state != E32_IDLE) - ee32_process(); - else if (TIME_TO_WRITE()) - eeCheck(false); -#elif defined(CPUARM) - if (theFile.isWriting()) - theFile.nextWriteStep(); - else if (TIME_TO_WRITE()) - eeCheck(false); -#else - if (!eeprom_buffer_size) { - if (theFile.isWriting()) - theFile.nextWriteStep(); - else if (TIME_TO_WRITE()) - eeCheck(false); - } -#endif - } - -#if defined(SDCARD) - sdMountPoll(); - writeLogs(); -#endif - -#if defined(CPUARM) && defined(SIMU) - checkTrims(); -#endif - -#if defined(CPUARM) - uint8_t evt = getEvent(false); -#else - uint8_t evt = getEvent(); - evt = checkTrim(evt); -#endif - - if (evt && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) backlightOn(); // on keypress turn the light on - - checkBacklight(); - -#if !defined(CPUARM) && (defined(FRSKY) || defined(MAVLINK)) - telemetryWakeup(); -#endif - -#if defined(PCBTARANIS) - checkTrainerSettings(); -#endif - -#if defined(PCBTARANIS) && !defined(SIMU) - static bool usbStarted = false; - if (!usbStarted && usbPlugged()) { -#if defined(USB_MASS_STORAGE) - opentxClose(); -#endif - usbStart(); -#if defined(USB_MASS_STORAGE) - usbPluggedIn(); -#endif - usbStarted = true; - } - -#if defined(USB_JOYSTICK) - if (usbStarted) { - if (!usbPlugged()) { - //disable USB - usbStop(); - usbStarted = false; - } - else { - usbJoystickUpdate(); - } - } -#endif - -#endif //#if defined(PCBTARANIS) && !defined(SIMU) #if defined(NAVIGATION_STICKS) +uint8_t getSticksNavigationEvent() +{ + uint8_t evt = 0; if (StickScrollAllowed) { if ( StickScrollTimer ) { static uint8_t repeater; @@ -2389,60 +2139,12 @@ void perMain() StickScrollTimer = 0; // Seconds } StickScrollAllowed = 1 ; + return evt; +} #endif -#if defined(USB_MASS_STORAGE) - if (usbPlugged()) { - lcd_clear(); - menuMainView(0); - } - else -#endif - { - const char *warn = s_warning; - uint8_t menu = s_menu_count; - - if (!LUA_STANDALONE_SCRIPT_RUNNING()) { - lcd_clear(); - if (menuEvent) { - m_posVert = menuEvent == EVT_ENTRY_UP ? g_menuPos[g_menuStackPtr] : 0; - m_posHorz = 0; - evt = menuEvent; - menuEvent = 0; - AUDIO_MENUS(); - } - g_menuStack[g_menuStackPtr]((warn || menu) ? 0 : evt); - } - -#if defined(LUA) - luaTask(evt); -#endif - - if (!LUA_STANDALONE_SCRIPT_RUNNING()) { - if (warn) DISPLAY_WARNING(evt); -#if defined(NAVIGATION_MENUS) - if (menu) { - const char * result = displayMenu(evt); - if (result) { - menuHandler(result); - putEvent(EVT_MENU_UP); - } - } -#endif - } - } - - drawStatusLine(); - - lcdRefresh(LCD_REFRESH_DONT_WAIT); - - if (SLAVE_MODE()) { - JACK_PPM_OUT(); - } - else { - JACK_PPM_IN(); - } - +void batteryCheck() +{ static uint8_t counter = 0; if (g_menuStack[g_menuStackPtr] == menuGeneralDiagAna) { g_vbat100mV = 0; @@ -2506,8 +2208,138 @@ void perMain() #endif } } + } +#if !defined(CPUARM) +void perMain() +{ +#if defined(SIMU) + doMixerCalculations(); +#endif + uint16_t t0 = getTmr16KHz(); + int16_t delta = (nextMixerEndTime - lastMixerDuration) - t0; + if (delta > 0 && delta < MAX_MIXER_DELTA) { +#if defined(PCBSTD) && defined(ROTARY_ENCODER_NAVIGATION) + rotencPoll(); +#endif + + // @@@ open.20.fsguruh + // SLEEP(); // wouldn't that make sense? should save a lot of battery power!!! +/* for future use; currently very very beta... */ +#if defined(POWER_SAVE) + ADCSRA&=0x7F; // disable ADC for power saving + ACSR&=0xF7; // disable ACIE Interrupts + ACSR|=0x80; // disable Analog Comparator + // maybe we disable here a lot more hardware components in future to save even more power + + + + MCUCR|=0x20; // enable Sleep (bit5) + // MCUCR|=0x28; // enable Sleep (bit5) enable ADC Noise Reduction (bit3) + // first tests showed: simple sleep would reduce cpu current from 40.5mA to 32.0mA + // noise reduction sleep would reduce it down to 28.5mA; However this would break pulses in theory + // however with standard module, it will need about 95mA. Therefore the drop to 88mA is not much noticable + do { + asm volatile(" sleep \n\t"); // if _SLEEP() is not defined use this + t0=getTmr16KHz(); + delta= (nextMixerEndTime - lastMixerDuration) - t0; + } while ((delta>0) && (delta maxMixerDuration) maxMixerDuration = t0; + +#if defined(MODULE_ALWAYS_SEND_PULSES) + if (startupWarningState < STARTUP_WARNING_DONE) { + // don't do menu's until throttle and switch warnings are handled + return; + } +#endif + + if (!eeprom_buffer_size) { + if (theFile.isWriting()) + theFile.nextWriteStep(); + else if (TIME_TO_WRITE()) + eeCheck(false); + } + +#if defined(SDCARD) + sdMountPoll(); + writeLogs(); +#endif + + uint8_t evt = getEvent(); + evt = checkTrim(evt); + + if (evt && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) backlightOn(); // on keypress turn the light on + checkBacklight(); + +#if (defined(FRSKY) || defined(MAVLINK)) + telemetryWakeup(); +#endif + +#if defined(NAVIGATION_STICKS) + uint8_t sticks_evt = getSticksNavigationEvent(); + if (sticks_evt) evt = sticks_evt; +#endif + + const char *warn = s_warning; + uint8_t menu = s_menu_count; + + lcd_clear(); + if (menuEvent) { + m_posVert = menuEvent == EVT_ENTRY_UP ? g_menuPos[g_menuStackPtr] : 0; + m_posHorz = 0; + evt = menuEvent; + menuEvent = 0; + AUDIO_MENUS(); + } + g_menuStack[g_menuStackPtr]((warn || menu) ? 0 : evt); + + + if (warn) DISPLAY_WARNING(evt); +#if defined(NAVIGATION_MENUS) + if (menu) { + const char * result = displayMenu(evt); + if (result) { + menuHandler(result); + putEvent(EVT_MENU_UP); + } + } +#endif + + drawStatusLine(); + + lcdRefresh(); + + if (SLAVE_MODE()) { + JACK_PPM_OUT(); + } + else { + JACK_PPM_IN(); + } + + batteryCheck(); +} +#endif // #if !defined(CPUARM) + + + int16_t g_ppmIns[NUM_TRAINER]; uint8_t ppmInState = 0; // 0=unsync 1..8= wait for value i-1 uint8_t ppmInValid = 0; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 84394dd05..3ae32273d 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -726,7 +726,12 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms); void evalMixes(uint8_t tick10ms); void doMixerCalculations(); +#if defined(CPUARM) +void perMainArm(); +void checkTrims(); +#else void perMain(); +#endif NOINLINE void per10ms(); getvalue_t getValue(mixsrc_t i); diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 71142b53c..487f661f6 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -339,7 +339,13 @@ void *main_thread(void *) s_current_protocol[0] = 0; while (main_thread_running) { +#if defined(CPUARM) + doMixerCalculations(); + checkTrims(); + perMainArm(); +#else perMain(); +#endif sleep(10/*ms*/); } diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 1c7e00585..b6a1be62e 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -336,7 +336,6 @@ extern void rxPdcUsart( void (*pChProcess)(uint8_t x) ); #define asm(x) #if defined(CPUARM) -extern volatile uint32_t Tenms; extern uint32_t Master_frequency; #define NVIC_EnableIRQ(x) #define NVIC_DisableIRQ(x) diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index d162e7a83..3ef899069 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -46,8 +46,6 @@ extern "C" { } #endif -volatile uint32_t Tenms ; // TODO to remove everywhere / use a #define - void watchdogInit(unsigned int duration) { IWDG->KR = 0x5555 ; // Unlock registers @@ -150,3 +148,90 @@ void boardInit() } #endif + + +#if defined(USB_JOYSTICK) && !defined(SIMU) +extern USB_OTG_CORE_HANDLE USB_OTG_dev; + +/* + Prepare and send new USB data packet + + The format of HID_Buffer is defined by + USB endpoint description can be found in + file usb_hid_joystick.c, variable HID_JOYSTICK_ReportDesc +*/ +void usbJoystickUpdate(void) +{ + static uint8_t HID_Buffer[HID_IN_PACKET]; + + //buttons + HID_Buffer[0] = 0; //buttons + for (int i = 0; i < 8; ++i) { + if ( channelOutputs[i+8] > 0 ) { + HID_Buffer[0] |= (1 << i); + } + } + + //analog values + //uint8_t * p = HID_Buffer + 1; + for (int i = 0; i < 8; ++i) { + int16_t value = channelOutputs[i] / 8; + if ( value > 127 ) value = 127; + else if ( value < -127 ) value = -127; + HID_Buffer[i+1] = static_cast(value); + } + + USBD_HID_SendReport (&USB_OTG_dev, HID_Buffer, HID_IN_PACKET ); +} + +#endif //#if defined(USB_JOYSTICK) && defined(PCBTARANIS) && !defined(SIMU) + + +uint8_t currentTrainerMode = 0xff; + +void checkTrainerSettings() +{ + uint8_t requiredTrainerMode = g_model.trainerMode; + if (requiredTrainerMode != currentTrainerMode) { + switch (currentTrainerMode) { + case TRAINER_MODE_MASTER: + stop_trainer_capture(); + break; + case TRAINER_MODE_SLAVE: + stop_trainer_ppm(); + break; + case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: + stop_cppm_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: + stop_sbus_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: + uart3Stop(); + } + + currentTrainerMode = requiredTrainerMode; + switch (requiredTrainerMode) { + case TRAINER_MODE_SLAVE: + init_trainer_ppm(); + break; + case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE: + init_cppm_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: + init_sbus_on_heartbeat_capture() ; + break; + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: + if (g_eeGeneral.uart3Mode == UART_MODE_SBUS_TRAINER) { + uart3SbusInit(); + break; + } + // no break + default: + // master is default + init_trainer_capture(); + break; + } + } +} + diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index d09e81782..b8d4719b4 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -277,5 +277,10 @@ void uart3Stop(void); #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) +#if defined(USB_JOYSTICK) && !defined(SIMU) +void usbJoystickUpdate(void); +#endif + +void checkTrainerSettings(); #endif diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index 8472ac56f..10f1871c5 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -36,6 +36,140 @@ #include "opentx.h" + +static uint8_t currentSpeakerVolume = 255; +uint8_t requiredSpeakerVolume; + +extern void batteryCheck(); + +void perMainArm() +{ +#if defined(PCBSKY9X) + Current_accumulator += Current_analogue ; + static uint32_t OneSecTimer; + if (++OneSecTimer >= 100) { + OneSecTimer -= 100 ; + Current_used += Current_accumulator / 100 ; // milliAmpSeconds (but scaled) + Current_accumulator = 0 ; + } +#endif + + if (currentSpeakerVolume != requiredSpeakerVolume) { + currentSpeakerVolume = requiredSpeakerVolume; + setVolume(currentSpeakerVolume); + } + + if (!usbPlugged()) { + // TODO merge these 2 branches +#if defined(PCBSKY9X) + if (Eeprom32_process_state != E32_IDLE) + ee32_process(); + else if (TIME_TO_WRITE()) + eeCheck(false); +#else + if (theFile.isWriting()) + theFile.nextWriteStep(); + else if (TIME_TO_WRITE()) + eeCheck(false); +#endif + } + + sdMountPoll(); + writeLogs(); + + uint8_t evt = getEvent(false); + if (evt && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) backlightOn(); // on keypress turn the light on + checkBacklight(); + +#if defined(PCBTARANIS) + checkTrainerSettings(); +#endif + +#if defined(PCBTARANIS) && !defined(SIMU) + static bool usbStarted = false; + if (!usbStarted && usbPlugged()) { +#if defined(USB_MASS_STORAGE) + opentxClose(); +#endif + usbStart(); +#if defined(USB_MASS_STORAGE) + usbPluggedIn(); +#endif + usbStarted = true; + } + +#if defined(USB_JOYSTICK) + if (usbStarted) { + if (!usbPlugged()) { + //disable USB + usbStop(); + usbStarted = false; + } + else { + usbJoystickUpdate(); + } + } +#endif +#endif //#if defined(PCBTARANIS) && !defined(SIMU) + +#if defined(NAVIGATION_STICKS) + uint8_t sticks_evt = getSticksNavigationEvent(); + if (sticks_evt) evt = sticks_evt; +#endif + +#if defined(USB_MASS_STORAGE) + if (usbPlugged()) { + lcd_clear(); + menuMainView(0); + } + else +#endif + { + const char *warn = s_warning; + uint8_t menu = s_menu_count; + + if (!LUA_STANDALONE_SCRIPT_RUNNING()) { + lcd_clear(); + if (menuEvent) { + m_posVert = menuEvent == EVT_ENTRY_UP ? g_menuPos[g_menuStackPtr] : 0; + m_posHorz = 0; + evt = menuEvent; + menuEvent = 0; + AUDIO_MENUS(); + } + g_menuStack[g_menuStackPtr]((warn || menu) ? 0 : evt); + } + +#if defined(LUA) + luaTask(evt); +#endif + + if (!LUA_STANDALONE_SCRIPT_RUNNING()) { + if (warn) DISPLAY_WARNING(evt); + if (menu) { + const char * result = displayMenu(evt); + if (result) { + menuHandler(result); + putEvent(EVT_MENU_UP); + } + } + } + } + + drawStatusLine(); + + lcdRefresh(); + + if (SLAVE_MODE()) { + JACK_PPM_OUT(); + } + else { + JACK_PPM_IN(); + } + + batteryCheck(); +} + #define MENUS_STACK_SIZE 2000 #define MIXER_STACK_SIZE 500 #define AUDIO_STACK_SIZE 500 @@ -153,13 +287,14 @@ void mixerTask(void * pdata) extern void opentxClose(); extern void opentxInit(); + void menusTask(void * pdata) { opentxInit(); while (pwrCheck() != e_power_off) { U64 start = CoGetOSTime(); - perMain(); + perMainArm(); // TODO remove completely massstorage from sky9x firmware U32 runtime = (U32)(CoGetOSTime() - start); if (runtime >= MENU_TASK_PERIOD_TICKS) {