void eeWriteGeneral() { alertx(PSTR(STR_BAD_EEPROM), true); message(PSTR(STR_EE_FORMAT)); EeFsFormat(); //alert(PSTR("format ok")); // alert(PSTR("default ok")); uint16_t sz = theFile.writeRlc(FILE_GENERAL,FILE_TYP_GENERAL,(uint8_t*)&g_eeGeneral,sizeof(EEGeneral),200); if(sz!=sizeof(EEGeneral)) alert(PSTR(STR_GENWR_ERROR)); modelDefaultWrite(0); //alert(PSTR("modef ok")); //alert(PSTR("modwrite ok")); }
void modelDefaultWrite(uint8_t id) { memset(&g_model, 0, sizeof(ModelData)); setNameP(g_model.name,PSTR(STR_MODEL)); // strncpy_P(g_model.name,PSTR(STR_MODEL), 10); div_t qr ; qr = div( id+1, 10 ) ; g_model.name[5]='0'+qr.quot; g_model.name[6]='0'+qr.rem; #ifdef VERSION3 g_model.modelVersion = 3 ; #else g_model.modelVersion = 2 ; #endif g_model.trimInc = 2 ; #ifdef NO_TEMPLATES applyTemplate(); //default 4 channel template #else applyTemplate(0); //default 4 channel template #endif theFile.writeRlc(FILE_MODEL(id),FILE_TYP_MODEL,(uint8_t*)&g_model,sizeof(g_model),200); }
void eeCheck(bool immediately) { EepromActive = 0 ; uint8_t msk = s_eeDirtyMsk; if(!msk) return; EepromActive = '1' + s_eeLongTimer ; if( !immediately ) { if ( ( get_tmr10ms() - s_eeDirtyTime10ms) < WRITE_DELAY_10MS) return ; if ( s_eeLongTimer ) { if ( --s_eeLongTimer ) { s_eeDirtyTime10ms = get_tmr10ms() ; return ; } } } s_eeLongTimer = 0 ; if ( Ee_lock ) return ; Ee_lock = EE_LOCK ; // Lock eeprom writing from recursion if ( msk & EE_TRIM ) { Ee_lock |= EE_TRIM_LOCK ; // So the lower levels know what is happening } if(msk & EE_GENERAL) { EepromActive = '2' ; s_eeDirtyMsk &= ~EE_GENERAL ; if(theWriteFile.writeRlc(FILE_TMP, FILE_TYP_GENERAL, (uint8_t*)&g_eeGeneral, sizeof(EEGeneral),20) == sizeof(EEGeneral)) { EFile::swap(FILE_GENERAL,FILE_TMP); }else{ if(theWriteFile.write_errno()==ERR_TMO){ s_eeDirtyMsk |= EE_GENERAL; //try again s_eeDirtyTime10ms = get_tmr10ms() - WRITE_DELAY_10MS; if(heartbeat == 0x3) { wdt_reset(); heartbeat = 0; } }else{ alert(Str_EEPROM_Overflow); } } //first finish GENERAL, then MODEL !!avoid Toggle effect } else if(msk & EE_MODEL) { EepromActive = '3' ; s_eeDirtyMsk &= ~(EE_MODEL | EE_TRIM) ; if(theWriteFile.writeRlc(FILE_TMP, FILE_TYP_MODEL, (uint8_t*)&g_model, sizeof(g_model),20) == sizeof(g_model)) { EFile::swap(FILE_MODEL(g_eeGeneral.currModel),FILE_TMP); }else{ if(theWriteFile.write_errno()==ERR_TMO){ s_eeDirtyMsk |= EE_MODEL; //try again if ( msk & EE_TRIM ) { s_eeDirtyMsk |= EE_TRIM; //try again } s_eeDirtyTime10ms = get_tmr10ms() - WRITE_DELAY_10MS; if(heartbeat == 0x3) { wdt_reset(); heartbeat = 0; } }else{ if ( ( msk & EE_TRIM ) == 0 ) // Don't stop if trim adjust { alert(Str_EEPROM_Overflow); } } } } Ee_lock = 0 ; // UnLock eeprom writing }