void eeCheck(bool immediately) { if(!s_eeDirtyMsk) return; if( !immediately && ((g_tmr10ms - s_eeDirtyTime10ms) < WRITE_DELAY_10MS)) return; if(s_eeDirtyMsk & EE_GENERAL){ s_eeDirtyMsk &= ~EE_GENERAL; //not int safe if(theFile.writeRlc2(FILE_TMP, FILE_TYP_GENERAL, (uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral),20) == sizeof(g_eeGeneral)) { EFile::swap(FILE_GENERAL,FILE_TMP); }else{ if(theFile.write_errno()==ERR_TMO){ s_eeDirtyMsk |= EE_GENERAL; //try again s_eeDirtyTime10ms = g_tmr10ms - WRITE_DELAY_10MS; printf("writing aborted GENERAL\n"); }else{ alert(PSTR("EEPROM overflow")); } } //first finish GENERAL, then MODEL !!avoid Toggle effect } else if(s_eeDirtyMsk & EE_MODEL){ s_eeDirtyMsk &= ~EE_MODEL;//not int safe g_model.mdVers = MDVERS_TOP; if(theFile.writeRlc2(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(theFile.write_errno()==ERR_TMO){ s_eeDirtyMsk |= EE_MODEL; //try again s_eeDirtyTime10ms = g_tmr10ms - WRITE_DELAY_10MS; printf("writing aborted MODEL\n"); }else{ alert(PSTR("EEPROM overflow")); } } } beepStore(); }
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 }