1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-15 20:35:17 +03:00

[Horus] Emergency mode + some simu refactoring to avoid duplicated code

This commit is contained in:
Bertrand Songis 2016-03-09 19:20:10 +01:00
parent 10d0c56b08
commit 473e69b3c3
9 changed files with 127 additions and 143 deletions

View file

@ -9,6 +9,7 @@ set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFI
message(STATUS "OpenTX ${VERSION}") message(STATUS "OpenTX ${VERSION}")
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_STANDARD 11)
set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio) set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio)
set(RADIO_SRC_DIRECTORY ${RADIO_DIRECTORY}/src) set(RADIO_SRC_DIRECTORY ${RADIO_DIRECTORY}/src)

View file

@ -538,12 +538,12 @@ void OpenTxSimulator::start(const char * filename, bool tests)
StartEepromThread(filename); StartEepromThread(filename);
StartAudioThread(volumeGain); StartAudioThread(volumeGain);
StartMainThread(tests); StartSimu(tests);
} }
void OpenTxSimulator::stop() void OpenTxSimulator::stop()
{ {
StopMainThread(); StopSimu();
#if defined(CPUARM) #if defined(CPUARM)
StopAudioThread(); StopAudioThread();
#endif #endif

View file

@ -338,6 +338,15 @@ void perMain()
if (sticks_evt) evt = sticks_evt; if (sticks_evt) evt = sticks_evt;
#endif #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 defined(USB_MASS_STORAGE)
if (usbPlugged()) { if (usbPlugged()) {
// disable access to menus // disable access to menus

View file

@ -2543,7 +2543,9 @@ void opentxInit(OPENTX_INIT_ARGS)
TRACE("opentxInit()"); TRACE("opentxInit()");
#if !defined(EEPROM) #if !defined(EEPROM)
sdInit(); if (!UNEXPECTED_SHUTDOWN()) {
sdInit();
}
#endif #endif
#if defined(COLORLCD) #if defined(COLORLCD)
@ -2551,7 +2553,16 @@ void opentxInit(OPENTX_INIT_ARGS)
luaInit(); luaInit();
#endif #endif
#if defined(RAMBACKUP)
if (UNEXPECTED_SHUTDOWN()) {
rambackupRestore();
}
else {
storageReadAll();
}
#else
storageReadAll(); storageReadAll();
#endif
#if defined(CPUARM) #if defined(CPUARM)
if (UNEXPECTED_SHUTDOWN()) { if (UNEXPECTED_SHUTDOWN()) {
@ -2635,10 +2646,20 @@ void opentxInit(OPENTX_INIT_ARGS)
startPulses(); startPulses();
wdt_enable(WDTO_500MS); wdt_enable(WDTO_500MS);
#if defined(GUI)
menuHandlers[0] = menuMainView;
#if MENUS_LOCK != 2/*no menus*/
menuHandlers[1] = menuModelSelect;
#endif
#endif
} }
#if !defined(SIMU) #if defined(SIMU)
int main(void) void * simuMain(void *)
#else
int main()
#endif
{ {
// G: The WDT remains active after a WDT reset -- at maximum clock speed. So it's // 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 // important to disable it before commencing with system initialisation (or
@ -2663,13 +2684,8 @@ int main(void)
lcdInit(); lcdInit();
#endif #endif
#if !defined(SIMU)
stackPaint(); stackPaint();
#if defined(GUI)
menuHandlers[0] = menuMainView;
#if MENUS_LOCK != 2/*no menus*/
menuHandlers[1] = menuModelSelect;
#endif
#endif #endif
#if defined(GUI) && !defined(PCBTARANIS) #if defined(GUI) && !defined(PCBTARANIS)
@ -2710,19 +2726,16 @@ int main(void)
init_rotary_sw(); init_rotary_sw();
#endif #endif
#if !defined(CPUARM)
opentxInit(mcusr);
#endif
#if defined(CPUARM) #if defined(CPUARM)
tasksStart(); tasksStart();
#else #else
opentxInit(mcusr);
#if defined(CPUM2560) #if defined(CPUM2560)
uint8_t shutdown_state = 0; uint8_t shutdown_state = 0;
#endif #endif
#if defined(PCBFLAMENCO) #if defined(PCBFLAMENCO)
menuEntryTime = get_tmr10ms() - 200; // TODO not here it's an ARM board ... menuEntryTime = get_tmr10ms() - 200;
#endif #endif
while (1) { while (1) {
@ -2751,8 +2764,11 @@ int main(void)
wdt_disable(); 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. 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 #endif
#if defined(SIMU)
return NULL;
#endif
} }
#endif // !SIMU
#if defined(PWR_BUTTON_DELAY) #if defined(PWR_BUTTON_DELAY)

View file

@ -127,7 +127,7 @@ Open9xSim::Open9xSim(FXApp* a):
Open9xSim::~Open9xSim() Open9xSim::~Open9xSim()
{ {
StopMainThread(); StopSimu();
StopAudioThread(); StopAudioThread();
StopEepromThread(); StopEepromThread();
@ -533,7 +533,7 @@ int main(int argc,char **argv)
StartEepromThread(argc >= 2 ? argv[1] : "eeprom.bin"); StartEepromThread(argc >= 2 ? argv[1] : "eeprom.bin");
StartAudioThread(); StartAudioThread();
StartMainThread(); StartSimu();
return application.run(); return application.run();
} }

View file

@ -44,7 +44,7 @@ class ModelCell
buffer.drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR); buffer.drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
} }
else { else {
char timer[LEN_TIMER_STRING];z char timer[LEN_TIMER_STRING];
buffer.drawSizedText(5, 2, header.name, LEN_MODEL_NAME, ZCHAR|TEXT_COLOR); buffer.drawSizedText(5, 2, header.name, LEN_MODEL_NAME, ZCHAR|TEXT_COLOR);
getTimerString(timer, 0); getTimerString(timer, 0);
buffer.drawText(104, 41, timer, TEXT_COLOR); buffer.drawText(104, 41, timer, TEXT_COLOR);

View file

@ -40,6 +40,7 @@
#include <SDL.h> #include <SDL.h>
#endif #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; 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; uint8_t portb, portc, porth=0, dummyport;
uint16_t dummyport16; uint16_t dummyport16;
@ -47,6 +48,10 @@ const char *eepromFile = NULL;
FILE *fp = NULL; FILE *fp = NULL;
int g_snapshot_idx = 0; 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) #if defined(CPUSTM32)
uint32_t Peri1_frequency, Peri2_frequency; uint32_t Peri1_frequency, Peri2_frequency;
GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj;
@ -86,6 +91,10 @@ char simuSdDirectory[1024] = "";
uint8_t eeprom[EESIZE_SIMU]; uint8_t eeprom[EESIZE_SIMU];
sem_t *eeprom_write_sem; sem_t *eeprom_write_sem;
void lcdInit()
{
}
void simuInit() void simuInit()
{ {
for (int i = 0; i <= 17; i++) { for (int i = 0; i <= 17; i++) {
@ -314,110 +323,19 @@ void *eeprom_write_function(void *)
} }
#endif #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__ #if defined WIN32 || !defined __GNUC__
#define chdir _chdir #define chdir _chdir
#define getcwd _getcwd #define getcwd _getcwd
#endif #endif
pthread_t main_thread_pid; void StartSimu(bool tests)
void StartMainThread(bool tests)
{ {
#if defined(SDCARD) main_thread_running = (tests ? 1 : 2);
if (strlen(simuSdDirectory) == 0)
getcwd(simuSdDirectory, 1024);
#endif
#if defined(CPUARM) #if defined(SDCARD)
pthread_mutex_init(&mixerMutex, NULL); if (strlen(simuSdDirectory) == 0) {
pthread_mutex_init(&audioMutex, NULL); getcwd(simuSdDirectory, 1024);
}
#endif #endif
/* /*
@ -439,14 +357,30 @@ void StartMainThread(bool tests)
g_rtcTime = time(0); g_rtcTime = time(0);
#endif #endif
main_thread_running = (tests ? 1 : 2); #if defined(SIMU_EXCEPTIONS)
pthread_create(&main_thread_pid, NULL, &main_thread, NULL); 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; main_thread_running = 0;
pthread_join(main_thread_pid, NULL); if (main_thread_pid)
pthread_join(main_thread_pid, NULL);
} }
#if defined(CPUARM) #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 I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) { }
void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) { } void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) { }
void RCC_LSEConfig(uint8_t RCC_LSE) { } 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; } ErrorStatus RTC_WaitForSynchro(void) { return SUCCESS; }
void unlockFlash() { } void unlockFlash() { }
void lockFlash() { } void lockFlash() { }
@ -1362,3 +1296,17 @@ void serialPrintf(const char * format, ...) { }
void serialCrlf() { } void serialCrlf() { }
void serialPutc(char c) { } void serialPutc(char c) { }
uint16_t stackSize() { return 0; } 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;
}

View file

@ -349,8 +349,9 @@ void simuSetKey(uint8_t key, bool state);
void simuSetTrim(uint8_t trim, bool state); void simuSetTrim(uint8_t trim, bool state);
void simuSetSwitch(uint8_t swtch, int8_t state); void simuSetSwitch(uint8_t swtch, int8_t state);
void StartMainThread(bool tests=true); void StartSimu(bool tests=true);
void StopMainThread(); void StopSimu();
void StartEepromThread(const char *filename="eeprom.bin"); void StartEepromThread(const char *filename="eeprom.bin");
void StopEepromThread(); void StopEepromThread();
#if defined(SIMU_AUDIO) && defined(CPUARM) #if defined(SIMU_AUDIO) && defined(CPUARM)
@ -364,6 +365,7 @@ void StopEepromThread();
extern const char * eepromFile; extern const char * eepromFile;
void eepromReadBlock (uint8_t * pointer_ram, uint32_t address, uint32_t size); 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_enable(...) sleep(1/*ms*/)
#define wdt_reset() sleep(1/*ms*/) #define wdt_reset() sleep(1/*ms*/)
#define boardInit() #define boardInit()
@ -380,11 +382,23 @@ extern OS_MutexID audioMutex;
#define E_OK 0 #define E_OK 0
#define WDRF 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 CoInitOS(...)
#define CoStartOS(...) #define CoStartOS(...)
#define CoCreateTask(...) 0
OS_TID CoCreateTask(FUNCPtr task, void *argv, uint32_t parameter, void * stk, uint32_t stksize);
#define CoCreateTaskEx(...) 0 #define CoCreateTaskEx(...) 0
#define CoCreateMutex(...) PTHREAD_MUTEX_INITIALIZER #define CoCreateMutex(...) PTHREAD_MUTEX_INITIALIZER
#define CoEnterMutexSection(m) pthread_mutex_lock(&(m))
#define CoLeaveMutexSection(m) pthread_mutex_unlock(&(m))
#define CoSetFlag(...) #define CoSetFlag(...)
#define CoClearFlag(...) #define CoClearFlag(...)
#define CoSetTmrCnt(...) #define CoSetTmrCnt(...)
@ -392,8 +406,6 @@ extern OS_MutexID audioMutex;
#define CoExitISR(...) #define CoExitISR(...)
#define CoStartTmr(...) #define CoStartTmr(...)
#define CoWaitForSingleFlag(...) 0 #define CoWaitForSingleFlag(...) 0
#define CoEnterMutexSection(m) pthread_mutex_lock(&(m))
#define CoLeaveMutexSection(m) pthread_mutex_unlock(&(m))
#define CoTickDelay(...) #define CoTickDelay(...)
#define CoCreateFlag(...) 0 #define CoCreateFlag(...) 0
#define CoGetOSTime(...) 0 #define CoGetOSTime(...) 0
@ -443,4 +455,6 @@ extern char simuSdDirectory[1024];
#define sd_card_ready() (true) #define sd_card_ready() (true)
#define sdMounted() (true) #define sdMounted() (true)
inline void ledOff() { }
#endif // _SIMPGMSPACE_H_ #endif // _SIMPGMSPACE_H_

View file

@ -91,8 +91,6 @@ uint16_t stackAvailable()
} }
#endif #endif
#if !defined(SIMU)
void mixerTask(void * pdata) void mixerTask(void * pdata)
{ {
s_pulses_paused = true; s_pulses_paused = true;
@ -190,14 +188,12 @@ void tasksStart()
mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack.stack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE); 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); 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) #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(); audioMutex = CoCreateMutex();
mixerMutex = CoCreateMutex(); mixerMutex = CoCreateMutex();
#endif
CoStartOS(); CoStartOS();
} }
#endif // !defined(SIMU)