void ConfigSD_StoreSettings() {
  if(!IS_SD_INSERTED || card.isFileOpen() || card.sdprinting) return;

  set_sd_dot();
  card.setroot(true);
  card.startWrite((char *)CFG_SD_FILE, false);
  char buff[CFG_SD_MAX_VALUE_LEN];
  ltoa(print_job_counter.data.completePrints, buff, 10);
  card.unparseKeyLine(cfgSD_KEY[SD_CFG_CPR], buff);
  ltoa(print_job_counter.data.filamentUsed, buff, 10);
  card.unparseKeyLine(cfgSD_KEY[SD_CFG_FIL], buff);
  ltoa(print_job_counter.data.numberPrints, buff, 10);
  card.unparseKeyLine(cfgSD_KEY[SD_CFG_NPR], buff);
  #if HAS(POWER_CONSUMPTION_SENSOR)
    ltoa(power_consumption_hour, buff, 10);
    card.unparseKeyLine(cfgSD_KEY[SD_CFG_PWR], buff);
  #endif
  ltoa(print_job_counter.data.printer_usage_seconds, buff, 10);
  card.unparseKeyLine(cfgSD_KEY[SD_CFG_TME], buff);
  ltoa(print_job_counter.data.printTime, buff, 10);
  card.unparseKeyLine(cfgSD_KEY[SD_CFG_TPR], buff);

  card.closeFile();
  card.setlast();
  unset_sd_dot();
}
  void ConfigSD_StoreSettings() {
    if(!IS_SD_INSERTED || card.isFileOpen() || card.sdprinting) return;
    set_sd_dot();
    card.setroot(true);
    card.startWrite((char *)CFG_SD_FILE, false);
    char buff[CFG_SD_MAX_VALUE_LEN];
    #if HAS(POWER_CONSUMPTION_SENSOR)
      ltoa(power_consumption_hour, buff, 10);
      card.unparseKeyLine(cfgSD_KEY[SD_CFG_PWR], buff);
    #endif
    ltoa(printer_usage_seconds, buff, 10);
    card.unparseKeyLine(cfgSD_KEY[SD_CFG_TME], buff);
    ltoa(printer_usage_filament, buff, 10);
    card.unparseKeyLine(cfgSD_KEY[SD_CFG_FIL], buff);

    card.closeFile();
    card.setlast();
    config_last_update = millis();
    unset_sd_dot();
  }
 void ConfigSD_RetrieveSettings(bool addValue) {
   if(!IS_SD_INSERTED || card.isFileOpen() || card.sdprinting || !card.cardOK) return;
   set_sd_dot();
   char key[CFG_SD_MAX_KEY_LEN], value[CFG_SD_MAX_VALUE_LEN];
   int k_idx;
   int k_len, v_len;
   card.setroot(true);
   card.selectFile((char *)CFG_SD_FILE);
   while(true) {
     k_len = CFG_SD_MAX_KEY_LEN;
     v_len = CFG_SD_MAX_VALUE_LEN;
     card.parseKeyLine(key, value, k_len, v_len);
     if(k_len == 0 || v_len == 0) break; // no valid key or value founded
     k_idx = ConfigSD_KeyIndex(key);
     if(k_idx == -1) continue;    // unknow key ignore it
     switch(k_idx) {
       #if HAS(POWER_CONSUMPTION_SENSOR)
       case SD_CFG_PWR: {
         if(addValue) power_consumption_hour += (unsigned long)atol(value);
         else power_consumption_hour = (unsigned long)atol(value);
       }
       break;
       #endif
       case SD_CFG_TME: {
         if(addValue) printer_usage_seconds += (unsigned long)atol(value);
         else printer_usage_seconds = (unsigned long)atol(value);
       }
       break;
       case SD_CFG_FIL: {
         if(addValue) printer_usage_filament += (unsigned long)atol(value);
         else printer_usage_filament = (unsigned long)atol(value);
       }
       break;
     }
   }
   card.closeFile();
   card.setlast();
   config_readed = true;
   unset_sd_dot();
 }