void eeLoadModel(uint8_t id) { if (id<MAX_MODELS) { #if defined(SDCARD) closeLogs(); #endif if (pulsesStarted()) { pausePulses(); } pauseMixerCalculations(); uint32_t size = loadModel(id); #if defined(SIMU) if (sizeof(uint16_t) + sizeof(g_model) > EEPROM_ZONE_SIZE) TRACE("Model data size can't exceed %d bytes (%d bytes)", int(EEPROM_ZONE_SIZE-sizeof(uint16_t)), (int)sizeof(g_model)); if (size > 0 && size != sizeof(g_model)) TRACE("Model data read=%d bytes vs %d bytes\n", size, (int)sizeof(ModelData)); #endif if (size < EEPROM_BUFFER_SIZE) { // if not loaded a fair amount modelDefault(id) ; eeCheck(true); } AUDIO_FLUSH(); flightReset(); logicalSwitchesReset(); if (pulsesStarted()) { checkAll(); resumePulses(); } customFunctionsReset(); restoreTimers(); resumeMixerCalculations(); // TODO pulses should be started after mixer calculations ... #if defined(FRSKY) frskySendAlarms(); #endif #if defined(SDCARD) referenceModelAudioFiles(); #endif LOAD_MODEL_BITMAP(); SEND_FAILSAFE_1S(); PLAY_MODEL_NAME(); } }
void eeLoadModel(uint8_t id) { if (id<MAX_MODELS) { #if defined(SDCARD) closeLogs(); #endif if (pulsesStarted()) { pausePulses(); } pauseMixerCalculations(); uint16_t size = File_system[id+1].size ; memset(&g_model, 0, sizeof(g_model)); #if defined(SIMU) if (sizeof(struct t_eeprom_header) + sizeof(g_model) > 4096) TRACE("Model data size can't exceed %d bytes (%d bytes)", int(4096-sizeof(struct t_eeprom_header)), (int)sizeof(g_model)); else if (size > 0 && size != sizeof(g_model)) TRACE("Model data read=%d bytes vs %d bytes\n", size, (int)sizeof(ModelData)); #endif if (size > sizeof(g_model)) { size = sizeof(g_model) ; } if(size < 256) { // if not loaded a fair amount modelDefault(id) ; eeCheck(true); } else { read32_eeprom_data((File_system[id+1].block_no << 12) + sizeof(struct t_eeprom_header), (uint8_t *)&g_model, size) ; } AUDIO_FLUSH(); flightReset(); logicalSwitchesReset(); if (pulsesStarted()) { checkAll(); resumePulses(); } activeFnSwitches = 0; activeFunctions = 0; memclear(lastFunctionTime, sizeof(lastFunctionTime)); restoreTimers(); resumeMixerCalculations(); // TODO pulses should be started after mixer calculations ... #if defined(FRSKY) frskySendAlarms(); #endif #if defined(CPUARM) && defined(SDCARD) referenceModelAudioFiles(); #endif LOAD_MODEL_BITMAP(); SEND_FAILSAFE_1S(); } }
/** * execute_fopen() * * refactor the fopen code for execute into this routine */ URL_FILE * url_execute_fopen(char *url, bool forwrite, extvar_t *ev, CopyState pstate) { URL_EXECUTE_FILE *file; int save_errno; struct itimers savetimers; pqsigfunc save_SIGPIPE; char *cmd; /* Execute command */ Assert(strncmp(url, EXEC_URL_PREFIX, strlen(EXEC_URL_PREFIX)) == 0); cmd = url + strlen(EXEC_URL_PREFIX); file = palloc0(sizeof(URL_EXECUTE_FILE)); file->common.type = CFTYPE_EXEC; /* marked as a EXEC */ file->common.url = pstrdup(url); file->shexec = make_command(cmd, ev); /* Execute command */ /* Clear process interval timers */ resetTimers(&savetimers); if (!execute_resowner_callback_registered) { RegisterResourceReleaseCallback(execute_abort_callback, NULL); execute_resowner_callback_registered = true; } file->handle = create_execute_handle(); /* * Preserve the SIGPIPE handler and set to default handling. This * allows "normal" SIGPIPE handling in the command pipeline. Normal * for PG is to *ignore* SIGPIPE. */ save_SIGPIPE = pqsignal(SIGPIPE, SIG_DFL); /* execute the user command */ file->handle->pid = popen_with_stderr(file->handle->pipes, file->shexec, forwrite); save_errno = errno; /* Restore the SIGPIPE handler */ pqsignal(SIGPIPE, save_SIGPIPE); /* Restore process interval timers */ restoreTimers(&savetimers); if (file->handle->pid == -1) { errno = save_errno; pfree(file->common.url); pfree(file); ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), errmsg("cannot start external table command: %m"), errdetail("Command: %s", cmd))); } return (URL_FILE *) file; }