diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index f4e9e8db1..84eb6d70f 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -497,16 +497,13 @@ void audioTask(void * pdata) setSampleRate(AUDIO_SAMPLE_RATE); -#if !defined(EEPROM) - AUDIO_HELLO(); -#elif defined(SDCARD) + while (!sdMounted()) { + CoTickDelay(10); + } + if (!unexpectedShutdown) { -#if defined(EEPROM) - sdInit(); -#endif AUDIO_HELLO(); } -#endif while (1) { audioQueue.wakeup(); diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 4d945935d..724cb73c6 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -54,6 +54,9 @@ void handleUsbConnection() } if (usbStarted && !usbPlugged()) { usbStarted = false; +#if defined(USB_MASS_STORAGE) && !defined(EEPROM) + opentxResume(); +#endif } #if defined(USB_JOYSTICK) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index e5660658d..2d3fda029 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1912,19 +1912,28 @@ uint8_t calcStickScroll( uint8_t index ) } #endif -void opentxStart() -{ - TRACE("opentxStart()"); - -#if defined(SIMU) - if (main_thread_running == 2) - return; +#if defined(CPUARM) + #define OPENTX_START_ARGS uint8_t splash=true + #define OPENTX_START_SPLASH_NEEDED() (splash) +#else + #define OPENTX_START_ARGS + #define OPENTX_START_SPLASH_NEEDED() true #endif - bool display_alerts = (g_eeGeneral.chkSum == evalChkSum()); +void opentxStart(OPENTX_START_ARGS) +{ + TRACE("opentxStart"); + +#if defined(SIMU) + if (main_thread_running == 2) { + return; + } +#endif + + uint8_t calibration_needed = (g_eeGeneral.chkSum != evalChkSum()); #if defined(GUI) - if (display_alerts) { + if (!calibration_needed && OPENTX_START_SPLASH_NEEDED()) { doSplash(); } #endif @@ -1940,12 +1949,12 @@ void opentxStart() #endif #if defined(GUI) - if (display_alerts) { - checkAlarm(); - checkAll(); + if (calibration_needed) { + chainMenu(menuFirstCalib); } else { - chainMenu(menuFirstCalib); + checkAlarm(); + checkAll(); } #endif } @@ -1953,7 +1962,7 @@ void opentxStart() #if defined(CPUARM) || defined(CPUM2560) void opentxClose(uint8_t shutdown) { - TRACE("opentxClose()"); + TRACE("opentxClose"); if (shutdown) { #if defined(CPUARM) @@ -2030,6 +2039,33 @@ void opentxClose(uint8_t shutdown) } #endif +#if defined(USB_MASS_STORAGE) +void opentxResume() +{ + TRACE("opentxResume"); + + menuHandlers[0] = menuMainView; + + sdMount(); + + storageReadAll(); + +#if defined(PCBHORUS) + loadTheme(); + loadFontCache(); +#endif + + opentxStart(false); + +#if defined(CPUARM) || defined(CPUM2560) + if (!g_eeGeneral.unexpectedShutdown) { + g_eeGeneral.unexpectedShutdown = 1; + storageDirty(EE_GENERAL); + } +#endif +} +#endif + #if defined(NAVIGATION_STICKS) uint8_t getSticksNavigationEvent() { @@ -2477,7 +2513,7 @@ void opentxInit(OPENTX_INIT_ARGS) // CoTickDelay(5000); // 10s #endif - TRACE("opentxInit()"); + TRACE("opentxInit"); #if defined(GUI) menuHandlers[0] = menuMainView; @@ -2490,11 +2526,14 @@ void opentxInit(OPENTX_INIT_ARGS) rtcInit(); // RTC must be initialized before rambackupRestore() is called #endif -#if !defined(EEPROM) - if (!UNEXPECTED_SHUTDOWN()) { - sdInit(); + if (UNEXPECTED_SHUTDOWN()) { + unexpectedShutdown = 1; } + else { +#if defined(SDCARD) && !defined(PCBMEGA2560) + sdInit(); #endif + } #if defined(PCBHORUS) topbar = new Topbar(&g_model.topbarData); @@ -2512,12 +2551,6 @@ void opentxInit(OPENTX_INIT_ARGS) storageReadAll(); #endif -#if defined(CPUARM) - if (UNEXPECTED_SHUTDOWN()) { - unexpectedShutdown = 1; - } -#endif - #if defined(PCBTARANIS) BACKLIGHT_ON(); #endif @@ -2554,13 +2587,7 @@ void opentxInit(OPENTX_INIT_ARGS) if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on - if (UNEXPECTED_SHUTDOWN()) { -#if !defined(CPUARM) - // is done above on ARM - unexpectedShutdown = 1; -#endif - } - else { + if (!UNEXPECTED_SHUTDOWN()) { opentxStart(); } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 857ac0b2a..3a34506ec 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1426,6 +1426,7 @@ extern uint8_t requestScreenshot; void checkBattery(); void opentxClose(uint8_t shutdown=true); void opentxInit(); +void opentxResume(); #if defined(PCBHORUS) && !defined(SIMU) #define LED_ERROR_BEGIN() ledRed() @@ -1704,7 +1705,7 @@ FORCEINLINE void convertUnit(getvalue_t & val, uint8_t & unit) #endif #if defined(USB_MASS_STORAGE) - extern void usbPluggedIn(); +void usbPluggedIn(); #endif #include "lua/lua_api.h" diff --git a/radio/src/storage/eeprom_common.cpp b/radio/src/storage/eeprom_common.cpp index 2d58a9e60..8dd249caf 100644 --- a/radio/src/storage/eeprom_common.cpp +++ b/radio/src/storage/eeprom_common.cpp @@ -44,14 +44,14 @@ void eeLoadModel(uint8_t index) } #endif - bool newModel = false; + bool alarms = true; if (size < EEPROM_MIN_MODEL_SIZE) { // if not loaded a fair amount modelDefault(index) ; storageCheck(true); - newModel = true; + alarms = false; } - postModelLoad(newModel); + postModelLoad(alarms); } } diff --git a/radio/src/storage/eeprom_rlc.h b/radio/src/storage/eeprom_rlc.h index c1b55d910..628341af6 100644 --- a/radio/src/storage/eeprom_rlc.h +++ b/radio/src/storage/eeprom_rlc.h @@ -234,7 +234,7 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name); // For conversions #if defined(CPUARM) void loadGeneralSettings(); -void loadModel(int index); +void loadModel(int index, bool alarms=true); #endif bool eepromOpen(); diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index 3941b96cf..5a6a51b6e 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -29,6 +29,8 @@ void getModelPath(char * path, const char * filename) const char * writeFile(const char * filename, const uint8_t * data, uint16_t size) { + TRACE("writeFile(%s)", filename); + FIL file; char buf[8]; UINT written; @@ -68,6 +70,8 @@ const char * writeModel() const char * loadFile(const char * filename, uint8_t * data, uint16_t maxsize) { + TRACE("loadFile(%s)", filename); + FIL file; char buf[8]; UINT read; @@ -112,7 +116,7 @@ const char * readModel(const char * filename, uint8_t * buffer, uint32_t size) return loadFile(path, buffer, size); } -const char * loadModel(const char * filename) +const char * loadModel(const char * filename, bool alarms) { preModelLoad(); @@ -120,15 +124,14 @@ const char * loadModel(const char * filename) if (error) { TRACE("loadModel error=%s", error); } - - bool newModel = false; + if (error) { modelDefault(0) ; storageCheck(true); - newModel = true; + alarms = false; } - postModelLoad(newModel); + postModelLoad(alarms); return error; } @@ -171,8 +174,8 @@ void storageCheck(bool immediately) void storageReadAll() { - sdInit(); - + TRACE("storageReadAll"); + if (loadGeneralSettings() != NULL) { storageEraseAll(true); } @@ -186,7 +189,7 @@ void storageReadAll() } #endif - loadModel(g_eeGeneral.currModelFilename); + loadModel(g_eeGeneral.currModelFilename, false); } void storageCreateModelsList() @@ -223,14 +226,14 @@ const char * createModel() storageDirty(EE_MODEL); storageCheck(true); } - postModelLoad(true); + postModelLoad(false); return g_eeGeneral.currModelFilename; } void storageEraseAll(bool warn) { - TRACE("storageEraseAll()"); + TRACE("storageEraseAll"); #if defined(COLORLCD) // the theme has not been loaded before diff --git a/radio/src/storage/sdcard_raw.h b/radio/src/storage/sdcard_raw.h index 0043a2970..628b53eff 100644 --- a/radio/src/storage/sdcard_raw.h +++ b/radio/src/storage/sdcard_raw.h @@ -27,7 +27,7 @@ #define DEFAULT_MODEL_FILENAME "model01.bin" const char * readModel(const char * filename, uint8_t * buffer, uint32_t size); -const char * loadModel(const char * filename); +const char * loadModel(const char * filename, bool alarms=true); const char * createModel(); PACK(struct RamBackup { diff --git a/radio/src/storage/storage.h b/radio/src/storage/storage.h index a6edc533f..ccc5966ca 100644 --- a/radio/src/storage/storage.h +++ b/radio/src/storage/storage.h @@ -52,7 +52,7 @@ void storageDirty(uint8_t msk); void storageCheck(bool immediately); void preModelLoad(); -void postModelLoad(bool newModel); +void postModelLoad(bool alarms); #if defined(EEPROM_RLC) #include "eeprom_common.h" diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index a0beb637e..c9ecb2ddf 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -56,14 +56,14 @@ void preModelLoad() pauseMixerCalculations(); } -void postModelLoad(bool newModel) +void postModelLoad(bool alarms) { AUDIO_FLUSH(); flightReset(false); if (pulsesStarted()) { #if defined(GUI) - if (!newModel) { + if (alarms) { checkAll(); } #endif diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 531e94e2a..426b9142a 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -149,7 +149,7 @@ void boardInit() __enable_irq(); - TRACE("Horus started :)"); + TRACE("\nHorus board started :)"); keysInit(); adcInit(); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 0d1169afb..e5e514bb5 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -109,6 +109,7 @@ uint32_t sdGetSpeed(void); #define SD_GET_FREE_BLOCKNR() (sdGetFreeSectors()) #define SD_CARD_PRESENT() (~SD_PRESENT_GPIO->IDR & SD_PRESENT_GPIO_PIN) void sdInit(void); +void sdMount(void); void sdDone(void); #define sdPoll10ms() #define sdMountPoll() diff --git a/radio/src/targets/horus/diskio.cpp b/radio/src/targets/horus/diskio.cpp index 37d16829a..fe931ab06 100644 --- a/radio/src/targets/horus/diskio.cpp +++ b/radio/src/targets/horus/diskio.cpp @@ -292,14 +292,22 @@ FATFS g_FATFS_Obj __DMA; FIL g_telemetryFile = {0}; #endif -void sdInit(void) +void sdInit() { + TRACE("sdInit"); + ioMutex = CoCreateMutex(); - if (ioMutex >= CFG_MAX_MUTEX ) { + if (ioMutex >= CFG_MAX_MUTEX) { // sd error return; } + sdMount(); +} +void sdMount() +{ + TRACE("sdMount"); + if (f_mount(&g_FATFS_Obj, "", 1) == FR_OK) { // call sdGetFreeSectors() now because f_getfree() takes a long time first time it's called sdGetFreeSectors(); @@ -320,6 +328,8 @@ void sdInit(void) void sdDone() { + TRACE("sdDone"); + if (sdMounted()) { audioQueue.stopSD(); #if defined(LOG_TELEMETRY) diff --git a/radio/src/targets/sky9x/diskio.cpp b/radio/src/targets/sky9x/diskio.cpp index 0a590eaad..ecc52bdbe 100644 --- a/radio/src/targets/sky9x/diskio.cpp +++ b/radio/src/targets/sky9x/diskio.cpp @@ -843,6 +843,8 @@ const char * sdEnum() void sdInit() { + TRACE("sdInit"); + const char * result; uint8_t i; diff --git a/radio/src/targets/taranis/bootloader/boot.cpp b/radio/src/targets/taranis/bootloader/boot.cpp index 96ed2d3bd..0e795f563 100644 --- a/radio/src/targets/taranis/bootloader/boot.cpp +++ b/radio/src/targets/taranis/bootloader/boot.cpp @@ -151,9 +151,9 @@ uint32_t unlocked = 0; extern uint32_t EepromBlocked; -extern void init_spi(void); -extern void writeBlock(void); -extern void usbPluggedIn(); +void init_spi(void); +void writeBlock(void); +void usbPluggedIn(); #if defined(PCBX9E) typedef int32_t rotenc_t; diff --git a/radio/src/targets/taranis/diskio.cpp b/radio/src/targets/taranis/diskio.cpp index 004f2d12e..b5b9aadfc 100644 --- a/radio/src/targets/taranis/diskio.cpp +++ b/radio/src/targets/taranis/diskio.cpp @@ -992,6 +992,8 @@ void sdInit(void) // TODO shouldn't be there! void sdInit(void) { + TRACE("sdInit"); + ioMutex = CoCreateMutex(); if (ioMutex >= CFG_MAX_MUTEX ) { //sd error