diff --git a/CMakeLists.txt b/CMakeLists.txt index 007d2c231..a66dca88d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFI message(STATUS "OpenTX ${VERSION}") cmake_minimum_required(VERSION 2.8) +set(CMAKE_CXX_STANDARD 11) set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio) set(RADIO_SRC_DIRECTORY ${RADIO_DIRECTORY}/src) diff --git a/companion/src/firmwares/opentx/simulator/opentxsimulator.cpp b/companion/src/firmwares/opentx/simulator/opentxsimulator.cpp index a6dc7d9dd..07b23984c 100644 --- a/companion/src/firmwares/opentx/simulator/opentxsimulator.cpp +++ b/companion/src/firmwares/opentx/simulator/opentxsimulator.cpp @@ -538,12 +538,12 @@ void OpenTxSimulator::start(const char * filename, bool tests) StartEepromThread(filename); StartAudioThread(volumeGain); - StartMainThread(tests); + StartSimu(tests); } void OpenTxSimulator::stop() { - StopMainThread(); + StopSimu(); #if defined(CPUARM) StopAudioThread(); #endif diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 7d8071173..9b64283a4 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -338,6 +338,15 @@ void perMain() if (sticks_evt) evt = sticks_evt; #endif +#if defined(RAMBACKUP) + if (unexpectedShutdown) { + lcd->clear(); + lcdDrawText(LCD_W/2, LCD_H/2-20, "EMERGENCY MODE", DBLSIZE|CENTERED|TEXT_BGCOLOR); + lcdRefresh(); + return; + } +#endif + #if defined(USB_MASS_STORAGE) if (usbPlugged()) { // disable access to menus diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index b44816657..2626a1bb5 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2543,7 +2543,9 @@ void opentxInit(OPENTX_INIT_ARGS) TRACE("opentxInit()"); #if !defined(EEPROM) - sdInit(); + if (!UNEXPECTED_SHUTDOWN()) { + sdInit(); + } #endif #if defined(COLORLCD) @@ -2551,7 +2553,16 @@ void opentxInit(OPENTX_INIT_ARGS) luaInit(); #endif +#if defined(RAMBACKUP) + if (UNEXPECTED_SHUTDOWN()) { + rambackupRestore(); + } + else { + storageReadAll(); + } +#else storageReadAll(); +#endif #if defined(CPUARM) if (UNEXPECTED_SHUTDOWN()) { @@ -2635,10 +2646,20 @@ void opentxInit(OPENTX_INIT_ARGS) startPulses(); wdt_enable(WDTO_500MS); + +#if defined(GUI) + menuHandlers[0] = menuMainView; + #if MENUS_LOCK != 2/*no menus*/ + menuHandlers[1] = menuModelSelect; + #endif +#endif } -#if !defined(SIMU) -int main(void) +#if defined(SIMU) +void * simuMain(void *) +#else +int main() +#endif { // G: The WDT remains active after a WDT reset -- at maximum clock speed. So it's // important to disable it before commencing with system initialisation (or @@ -2663,13 +2684,8 @@ int main(void) lcdInit(); #endif +#if !defined(SIMU) stackPaint(); - -#if defined(GUI) - menuHandlers[0] = menuMainView; - #if MENUS_LOCK != 2/*no menus*/ - menuHandlers[1] = menuModelSelect; - #endif #endif #if defined(GUI) && !defined(PCBTARANIS) @@ -2710,19 +2726,16 @@ int main(void) init_rotary_sw(); #endif -#if !defined(CPUARM) - opentxInit(mcusr); -#endif - #if defined(CPUARM) tasksStart(); #else + opentxInit(mcusr); #if defined(CPUM2560) uint8_t shutdown_state = 0; #endif #if defined(PCBFLAMENCO) - menuEntryTime = get_tmr10ms() - 200; + // TODO not here it's an ARM board ... menuEntryTime = get_tmr10ms() - 200; #endif while (1) { @@ -2751,8 +2764,11 @@ int main(void) wdt_disable(); while(1); // never return from main() - there is no code to return back, if any delays occurs in physical power it does dead loop. #endif + +#if defined(SIMU) + return NULL; +#endif } -#endif // !SIMU #if defined(PWR_BUTTON_DELAY) diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index db2a904a6..e2064c7f6 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -117,7 +117,7 @@ Open9xSim::Open9xSim(FXApp* a): knobs[i]->setRange(-1024, 1024); knobs[i]->setValue(0); } - + bmf = new FXImageFrame(this,bmp); updateKeysAndSwitches(true); @@ -127,10 +127,10 @@ Open9xSim::Open9xSim(FXApp* a): Open9xSim::~Open9xSim() { - StopMainThread(); + StopSimu(); StopAudioThread(); StopEepromThread(); - + delete bmp; delete sliders[0]; delete sliders[1]; @@ -262,7 +262,7 @@ void Open9xSim::updateKeysAndSwitches(bool start) #ifdef __APPLE__ // gruvin: Can't use Function keys on the Mac -- too many other app conflicts. - // The ordering of these keys, Q/W,E/R,T/Y,U/I matches the on screen + // The ordering of these keys, Q/W,E/R,T/Y,U/I matches the on screen // order of trim sliders static FXuint trimKeys[] = { KEY_E, KEY_R, KEY_U, KEY_I, KEY_R, KEY_E, KEY_Y, KEY_T, KEY_Q, KEY_W }; #else @@ -356,7 +356,7 @@ long Open9xSim::onTimeout(FXObject*, FXSelector, void*) #else #define ROTENC_VALUE g_rotenc[0] #endif - + #if defined(ROTARY_ENCODER_NAVIGATION) || defined(PCBHORUS) static bool rotencAction = false; if (getApp()->getKeyState(KEY_X)) { @@ -410,7 +410,7 @@ long Open9xSim::onTimeout(FXObject*, FXSelector, void*) SWITCH_KEY(7, 6, 2); #endif } - + per10ms(); refreshDisplay(); getApp()->addTimeout(this, 2, 10); @@ -533,7 +533,7 @@ int main(int argc,char **argv) StartEepromThread(argc >= 2 ? argv[1] : "eeprom.bin"); StartAudioThread(); - StartMainThread(); + StartSimu(); return application.run(); } diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index 78e7922c3..55fbe59f6 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -44,7 +44,7 @@ class ModelCell buffer.drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR); } else { - char timer[LEN_TIMER_STRING];z + char timer[LEN_TIMER_STRING]; buffer.drawSizedText(5, 2, header.name, LEN_MODEL_NAME, ZCHAR|TEXT_COLOR); getTimerString(timer, 0); buffer.drawText(104, 41, timer, TEXT_COLOR); diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 70d4fa58f..a0dc3c5e7 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -40,6 +40,7 @@ #include #endif +uint8_t MCUCSR, MCUSR; volatile uint8_t pina=0xff, pinb=0xff, pinc=0xff, pind, pine=0xff, pinf=0xff, ping=0xff, pinh=0xff, pinj=0, pinl=0; uint8_t portb, portc, porth=0, dummyport; uint16_t dummyport16; @@ -47,6 +48,10 @@ const char *eepromFile = NULL; FILE *fp = NULL; int g_snapshot_idx = 0; +pthread_t main_thread_pid = 0; +uint8_t main_thread_running = 0; +char * main_thread_error = NULL; + #if defined(CPUSTM32) uint32_t Peri1_frequency, Peri2_frequency; GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; @@ -86,6 +91,10 @@ char simuSdDirectory[1024] = ""; uint8_t eeprom[EESIZE_SIMU]; sem_t *eeprom_write_sem; +void lcdInit() +{ +} + void simuInit() { for (int i = 0; i <= 17; i++) { @@ -314,110 +323,19 @@ void *eeprom_write_function(void *) } #endif -uint8_t main_thread_running = 0; -char * main_thread_error = NULL; -extern void opentxStart(); -void * main_thread(void *) -{ -#ifdef SIMU_EXCEPTIONS - signal(SIGFPE, sig); - signal(SIGSEGV, sig); - - try { -#endif - -#if defined(CPUARM) - stackPaint(); -#endif - - s_current_protocol[0] = 255; - - menuLevel = 0; - menuHandlers[0] = menuMainView; - menuHandlers[1] = menuModelSelect; - -#if defined(COLORLCD) - topbar = new Topbar(&g_model.topbarData); - luaInit(); - // TODO the theme is not initialized, in case of sdcard error, we should have something strange -#endif - - storageReadAll(); // load general setup and selected model - -#if defined(COLORLCD) - loadTheme(); -#endif - -#if defined(SIMU_DISKIO) - f_mount(&g_FATFS_Obj, "", 1); - // call sdGetFreeSectors() now because f_getfree() takes a long time first time it's called - sdGetFreeSectors(); -#endif - -#if defined(CPUARM) && defined(SDCARD) - referenceSystemAudioFiles(); -#endif - - if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on - - if (main_thread_running == 1) { - opentxStart(); - } - - s_current_protocol[0] = 0; - -#if defined(PCBFLAMENCO) - menuEntryTime = get_tmr10ms() - 200; -#endif - - while (main_thread_running) { -#if defined(CPUARM) - doMixerCalculations(); -#if defined(FRSKY) || defined(MAVLINK) - telemetryWakeup(); -#endif - checkTrims(); -#endif - perMain(); - sleep(10/*ms*/); - } - -#if defined(LUA) - luaClose(); -#endif - -#ifdef SIMU_EXCEPTIONS - } - catch (...) { - main_thread_running = 0; - } -#endif - -#if defined(SIMU_DISKIO) - if (diskImage) { - fclose(diskImage); - } -#endif - - return NULL; -} - #if defined WIN32 || !defined __GNUC__ #define chdir _chdir #define getcwd _getcwd #endif -pthread_t main_thread_pid; -void StartMainThread(bool tests) +void StartSimu(bool tests) { -#if defined(SDCARD) - if (strlen(simuSdDirectory) == 0) - getcwd(simuSdDirectory, 1024); -#endif + main_thread_running = (tests ? 1 : 2); -#if defined(CPUARM) - pthread_mutex_init(&mixerMutex, NULL); - pthread_mutex_init(&audioMutex, NULL); +#if defined(SDCARD) + if (strlen(simuSdDirectory) == 0) { + getcwd(simuSdDirectory, 1024); + } #endif /* @@ -439,14 +357,30 @@ void StartMainThread(bool tests) g_rtcTime = time(0); #endif - main_thread_running = (tests ? 1 : 2); - pthread_create(&main_thread_pid, NULL, &main_thread, NULL); +#if defined(SIMU_EXCEPTIONS) + signal(SIGFPE, sig); + signal(SIGSEGV, sig); + try { +#endif + +#if defined(CPUARM) + simuMain(); +#else + pthread_create(&main_thread_pid, NULL, &simuMain, NULL); +#endif + +#if defined(SIMU_EXCEPTIONS) + } + catch (...) { + } +#endif } -void StopMainThread() +void StopSimu() { main_thread_running = 0; - pthread_join(main_thread_pid, NULL); + if (main_thread_pid) + pthread_join(main_thread_pid, NULL); } #if defined(CPUARM) @@ -1330,7 +1264,7 @@ void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) { } void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) { } void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) { } void RCC_LSEConfig(uint8_t RCC_LSE) { } -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return RESET; } +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) { return SET; } ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; } void unlockFlash() { } void lockFlash() { } @@ -1362,3 +1296,17 @@ void serialPrintf(const char * format, ...) { } void serialCrlf() { } void serialPutc(char c) { } uint16_t stackSize() { return 0; } + +void * start_routine(void * attr) +{ + FUNCPtr task = (FUNCPtr)attr; + task(NULL); + return NULL; +} + +OS_TID CoCreateTask(FUNCPtr task, void *argv, uint32_t parameter, void * stk, uint32_t stksize) +{ + pthread_t tid; + pthread_create(&tid, NULL, start_routine, (void *)task); + return tid; +} diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index f3413cf1a..59212c8b4 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -349,8 +349,9 @@ void simuSetKey(uint8_t key, bool state); void simuSetTrim(uint8_t trim, bool state); void simuSetSwitch(uint8_t swtch, int8_t state); -void StartMainThread(bool tests=true); -void StopMainThread(); +void StartSimu(bool tests=true); +void StopSimu(); + void StartEepromThread(const char *filename="eeprom.bin"); void StopEepromThread(); #if defined(SIMU_AUDIO) && defined(CPUARM) @@ -364,6 +365,7 @@ void StopEepromThread(); extern const char * eepromFile; void eepromReadBlock (uint8_t * pointer_ram, uint32_t address, uint32_t size); +#define wdt_disable(...) sleep(1/*ms*/) #define wdt_enable(...) sleep(1/*ms*/) #define wdt_reset() sleep(1/*ms*/) #define boardInit() @@ -380,11 +382,23 @@ extern OS_MutexID audioMutex; #define E_OK 0 #define WDRF 0 +void * simuMain(void * args = NULL); +extern uint8_t MCUCSR, MCUSR; + +typedef unsigned int U32; +typedef unsigned long long U64; +typedef void (*FUNCPtr)(void*); + #define CoInitOS(...) #define CoStartOS(...) -#define CoCreateTask(...) 0 + +OS_TID CoCreateTask(FUNCPtr task, void *argv, uint32_t parameter, void * stk, uint32_t stksize); #define CoCreateTaskEx(...) 0 + #define CoCreateMutex(...) PTHREAD_MUTEX_INITIALIZER +#define CoEnterMutexSection(m) pthread_mutex_lock(&(m)) +#define CoLeaveMutexSection(m) pthread_mutex_unlock(&(m)) + #define CoSetFlag(...) #define CoClearFlag(...) #define CoSetTmrCnt(...) @@ -392,8 +406,6 @@ extern OS_MutexID audioMutex; #define CoExitISR(...) #define CoStartTmr(...) #define CoWaitForSingleFlag(...) 0 -#define CoEnterMutexSection(m) pthread_mutex_lock(&(m)) -#define CoLeaveMutexSection(m) pthread_mutex_unlock(&(m)) #define CoTickDelay(...) #define CoCreateFlag(...) 0 #define CoGetOSTime(...) 0 @@ -443,4 +455,6 @@ extern char simuSdDirectory[1024]; #define sd_card_ready() (true) #define sdMounted() (true) +inline void ledOff() { } + #endif // _SIMPGMSPACE_H_ diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index b34eabddc..a1603af99 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -91,8 +91,6 @@ uint16_t stackAvailable() } #endif -#if !defined(SIMU) - void mixerTask(void * pdata) { s_pulses_paused = true; @@ -146,7 +144,7 @@ void menusTask(void * pdata) perMain(); // TODO remove completely massstorage from sky9x firmware U32 runtime = (U32)(CoGetOSTime() - start); - // deduct the thread run-time from the wait, if run-time was more than + // deduct the thread run-time from the wait, if run-time was more than // desired period, then skip the wait all together if (runtime < MENU_TASK_PERIOD_TICKS) { CoTickDelay(MENU_TASK_PERIOD_TICKS - runtime); @@ -190,14 +188,12 @@ void tasksStart() mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack.stack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE); menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack.stack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE); - audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack.stack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE); - #if !defined(SIMU) + // TODO move the SIMU audio in this task + audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack.stack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE); +#endif audioMutex = CoCreateMutex(); mixerMutex = CoCreateMutex(); -#endif CoStartOS(); } - -#endif // !defined(SIMU)