예제 #1
0
파일: pers.cpp 프로젝트: Gummibaer/th9x
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();
}
예제 #2
0
파일: pers.cpp 프로젝트: RasmusKS/er9x
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


}