Fri, 28 Jun 2024 15:33:24 +0200
Fixed changing runtime datarecord size during switching between IDF 4.2 and 5.1. Fixed wiping the /spiffs filesystem. The directory listing from the SD card doesn't overwrite parts of the screen anymore. Solved the slow speed issue with the SD card. Try to force the SD card to operate at 20 MHz. More project settings changed to improve performance and memory usage.
/** * @file setup.c * @brief Setup functions. */ #include "config.h" extern my_config_t config; extern my_equipment_hdr_t equipment_hdr; extern my_equipment_t equipment; extern my_runtime_t runtime; extern sButton Buttons[MAXBUTTONS]; extern int Main_Screen; bool UpdateRec = false; ///< Update record flag int CurrentRec = 1; ///< Current record int Records = 1; ///< Total records. static const char *TAG = "setup"; /* * Setup init function that only runs once a new screen * is entered. */ void Setup_Init(void) { FILE *f; size_t bytes; uint8_t *dst; switch (Main_Screen) { case MAIN_TOOLS_SETUP: TopMessage((char *)"Setup menu"); Buttons_Add( 20, 40,120, 40, (char *)"Config", 0); Buttons_Add(180, 40,120, 40, (char *)"Apparatuur", 1); Buttons_Add( 20,120,120, 40, (char *)"WiFi", 2); Buttons_Add(180,120,120, 40, (char *)"Calibratie", 3); Buttons_Add(130, 200, 60, 40, (char *)"Ok", 4); Buttons[4].dark = true; Buttons_Show(); break; case MAIN_TOOLS_SETUP_CONFIG: _bg = TFT_BLACK; TopMessage((char *)"Configuratie"); TFT_setFont(DEFAULT_FONT, NULL); ShowFloat(2, 28, (char *)"Kook temp.", (char *)"C", config.BoilTemperature, 2); ShowBool(2, 44, (char *)"Vraag mout storten", config.AskAdd); ShowBool(2, 60, (char *)"Vraag mout verwijderen", config.AskRemove); ShowBool(2, 76, (char *)"Vraag Jodium proef", config.AskIodine); ShowInteger(2, 92, (char *)"Jodiumtest wachttijd", (char *)" min.", config.IodineTime); ShowText(2, 108, (char *)"Hostnaam", config.hostname); ShowText(2, 124, (char *)"NTP server", config.ntp_server); Buttons_Clear(); Buttons_Add( 0, 210, 45, 30, (char *)"Ok" , 0); Buttons_Add(276, 210, 45, 30, (char *)"Ed" , 1); Buttons[0].dark = true; Buttons_Show(); break; case MAIN_TOOLS_SETUP_CO_EDIT: break; case MAIN_TOOLS_SETUP_EQUIPMENT: TopMessage((char *)"Apparatuur"); f = fopen("/spiffs/etc/equipments.conf", "r"); fseek(f, equipment_hdr.hdrsize, SEEK_SET); dst = (uint8_t*)&equipment; Records = 0; while ((bytes = fread(dst, 1, equipment_hdr.recsize, f))) { Records++; } fclose(f); // Load the default record. CurrentRec = config.EquipmentRec; UpdateRec = true; break; case MAIN_TOOLS_SETUP_EQ_EDIT: break; case MAIN_TOOLS_SETUP_CALIBRATION: Calibration_Init(); break; default: break; } } /* * Setup loop screens, non-blocking. */ void Setup_Loop(void) { uint32_t crc1, crc2; uint8_t *dst; switch (Main_Screen) { case MAIN_TOOLS_SETUP: switch (Buttons_Scan()) { case 0: Main_Screen = MAIN_TOOLS_SETUP_CONFIG; break; case 1: Main_Screen = MAIN_TOOLS_SETUP_EQUIPMENT; break; case 2: Main_Screen = MAIN_TOOLS_SETUP_WIFI; break; case 3: Main_Screen = MAIN_TOOLS_SETUP_CALIBRATION; break; case 4: Main_Screen = MAIN_TOOLS; break; default: break; } break; case MAIN_TOOLS_SETUP_CONFIG: switch (Buttons_Scan()) { case 0: Main_Screen = MAIN_TOOLS_SETUP; break; case 1: Main_Screen = MAIN_TOOLS_SETUP_CO_EDIT; break; default: break; } break; case MAIN_TOOLS_SETUP_CO_EDIT: dst = (uint8_t*)&config; crc1 = crc32_le(0, dst, sizeof(config)); EditFloat((char *)"Kook temperatuur", &config.BoilTemperature, 80, 105, 2); // Round to 0.25 degrees config.BoilTemperature = ((int)(config.BoilTemperature * 4)) / 4.0; EditBool((char *)"Vraag mout storten", &config.AskAdd); EditBool((char *)"Vraag mout verwijderen", &config.AskRemove); EditBool((char *)"Vraag Jodium proef", &config.AskIodine); EditUint8((char *)"Jodium test wachttijd", &config.IodineTime, 0, 120); EditText((char *)"DHCP hostnaam", config.hostname, 31); EditText((char *)"Voorkeur NTP server", config.ntp_server, 31); crc2 = crc32_le(0, dst, sizeof(config)); if ((crc1 != crc2) && Confirm((char *)"Gewijzigd, opslaan?", (char *)"Ja", (char *)"Nee")) { write_config(); } else { read_config(); } Main_Screen = MAIN_TOOLS_SETUP_CONFIG; break; case MAIN_TOOLS_SETUP_EQUIPMENT: if (UpdateRec) { _bg = TFT_BLACK; TFT_fillScreen(_bg); TFT_resetclipwin(); TopMessage((char *)"Apparatuur"); UpdateRec = false; read_equipment(CurrentRec); TFT_setFont(DEFAULT_FONT, NULL); ShowText(2, 28, (char *)"Naam", equipment.Name); ShowFloat(2, 44, (char *)"Spoelwater", NULL, equipment.TempHLT, 2); Show2Integer(161, 44, (char *)"Pomp cyclus", (char *)"m", equipment.PumpCycle, equipment.PumpRest); ShowBool( 2, 60, (char *)"Pomp opwarmen", equipment.PumpPreMash); ShowBool(161, 60, (char *)"Pomp maischen", equipment.PumpOnMash); ShowBool( 2, 76, (char *)"Pomp uitmaischen", equipment.PumpMashOut); ShowBool(161, 76, (char *)"Pomp bij koken", equipment.PumpOnBoil); ShowInteger(2, 92, (char *)"Pomp maxtemp.", (char *)"C", equipment.PumpMaxTemp); ShowBool(161, 92, (char *)"PID bij mout weg", equipment.PIDPipe); ShowSSR2(2, 108, equipment.SSR2); ShowInteger(161, 108, (char *)"Max watt", NULL, equipment.Max_watt); ShowInteger(2, 124, (char *)"MLT watt", NULL, equipment.MLT_watt); ShowInteger(161, 124, (char *)"HLT watt", NULL, equipment.HLT_watt); ShowInteger(2, 140, (char *)"Kook vermogen", (char *)"%", equipment.BoilPower); ShowInteger(161, 140, (char *)"Naar kook verm", (char *)"%", equipment.RampPower); ShowInteger(2, 156, (char *)"PID vermogen", (char *)"%", equipment.MashPower); ShowBool(161, 156, (char *)"Hendi PWM", equipment.Hendi); ShowInteger(2, 172, (char *)"Sample tijd", (char *)"mS", equipment.SampleTime); /* 161, 172 free space */ char tmp[32]; ShowLabel(2, 188, (char *)"PID P"); sprintf(tmp, "%.3f", equipment.PID_kP); TFT_print(tmp, LASTX, LASTY); ShowLabel(LASTX, LASTY, (char *)" I"); sprintf(tmp, "%.3f", equipment.PID_kI); TFT_print(tmp, LASTX, LASTY); ShowLabel(LASTX, LASTY, (char *)" D"); sprintf(tmp, "%.3f", equipment.PID_kD); TFT_print(tmp, LASTX, LASTY); Buttons_Clear(); Buttons_Add( 0, 210, 45, 30, (char *)"Ok" , 0); Buttons_Add( 46, 210, 45, 30, (char *)"+" , 1); if (CurrentRec != config.EquipmentRec) Buttons_Add( 92, 210, 45, 30, (char *)"-", 2); else Buttons_Add( 92, 210, 45, 30, (char *)"" , 2); if (CurrentRec > 1) Buttons_Add(138, 210, 45, 30, (char *)"<", 3); else Buttons_Add(138, 210, 45, 30, (char *)"", 3); if (CurrentRec < Records) Buttons_Add(184, 210, 45, 30, (char *)">", 4); else Buttons_Add(184, 210, 45, 30, (char *)"", 4); if (CurrentRec != config.EquipmentRec) Buttons_Add(230, 210, 45, 30, (char *)"Std", 5); else Buttons_Add(230, 210, 45, 30, (char *)"", 5); Buttons_Add(276, 210, 45, 30, (char *)"Ed" , 6); Buttons[0].dark = true; Buttons_Show(); } switch (Buttons_Scan()) { case 0: Main_Screen = MAIN_TOOLS_SETUP; break; case 1: memset(&equipment, 0, sizeof(equipment)); equipment.MLT_watt = 2000; equipment.HLT_watt = 2000; equipment.Max_watt = 2750; sprintf(equipment.Name, "new eq %d", Records + 1); equipment.BoilPower = 80; equipment.RampPower = 100; equipment.MashPower = 100; equipment.PumpCycle = 8; equipment.PumpRest = 2; equipment.PumpPreMash = true; equipment.PumpOnMash = true; equipment.PumpMashOut = true; equipment.PumpOnBoil = false; equipment.PumpMaxTemp = 80; equipment.PIDPipe = true; equipment.SSR2 = 0; equipment.Hendi = false; equipment.TempHLT = 85.0; equipment.PID_kP = 200.0; equipment.PID_kI = 2.0; equipment.PID_kD = 1.5; equipment.SampleTime = 3000; append_equipment(); Records++; CurrentRec = Records; config.EquipmentRec = CurrentRec; UpdateRec = true; ESP_LOGI(TAG, "New equipment record %d", CurrentRec); write_config(); break; case 2: if ((CurrentRec != config.EquipmentRec) && (Records > 1)) { _bg = TFT_BLACK; TFT_fillScreen(_bg); TFT_resetclipwin(); TopMessage((char *)"Apparatuur verwijderen"); delete_equipment(CurrentRec); Records--; if (CurrentRec >= Records) CurrentRec = Records; UpdateRec = true; } break; case 3: if (CurrentRec > 1) { CurrentRec--; UpdateRec = true; } break; case 4: if (CurrentRec < Records) { CurrentRec++; UpdateRec = true; } break; case 5: if (CurrentRec != config.EquipmentRec) { config.EquipmentRec = CurrentRec; write_config(); UpdateRec = true; ESP_LOGI(TAG, "Equipment %d `%s' set as default", CurrentRec, equipment.Name); } break; case 6: Main_Screen = MAIN_TOOLS_SETUP_EQ_EDIT; break; default: break; } break; case MAIN_TOOLS_SETUP_EQ_EDIT: dst = (uint8_t*)&equipment; crc1 = crc32_le(0, dst, sizeof(equipment)); EditText((char *)"Naam", equipment.Name, 31); EditFloat((char *)"Spoelwater temp", &equipment.TempHLT, 75, 98, 2); // Round to 0.25 values. equipment.TempHLT = ((int)(equipment.TempHLT * 4)) / 4.0; EditInt((char *)"Pomp cyclus minuten", &equipment.PumpCycle, 5, 15); EditInt((char *)"Pomp rust minuten", &equipment.PumpRest, 0, 5); EditBool((char *)"Pomp bij opwarmen", &equipment.PumpPreMash); EditBool((char *)"Pomp bij maischen", &equipment.PumpOnMash); EditBool((char *)"Pomp bij uitmaischen", &equipment.PumpMashOut); EditBool((char *)"Pomp tijdens koken", &equipment.PumpOnBoil); EditInt((char *)"Pomp max. temperatuur", &equipment.PumpMaxTemp, 60, 105); EditBool((char *)"PID by mout verwijderen", &equipment.PIDPipe); EditSSR2(&equipment.SSR2); EditInt((char *)"Max watt", &equipment.Max_watt, 100, 45000); EditInt((char *)"MLT watt", &equipment.MLT_watt, 100, 45000); EditInt((char *)"HLT watt", &equipment.HLT_watt, 100, 45000); EditInt((char *)"Kook vermogen in %", &equipment.BoilPower, 0, 100); EditInt((char *)"Naar kook vermogen in %", &equipment.RampPower, 0, 100); EditInt((char *)"PID Maisch vermogen in %", &equipment.MashPower, 0, 100); EditBool((char *)"Hendi PWM", &equipment.Hendi); EditInt((char *)"Sample tijd in mS", &equipment.SampleTime, 1000, 20000); // Round to 250 mSec units. equipment.SampleTime = ((int)(equipment.SampleTime / 250)) * 250; EditDouble((char *)"PID P", &equipment.PID_kP, 20, 2000, 3); EditDouble((char *)"PID I", &equipment.PID_kI, 0, 100, 3); EditDouble((char *)"PID D", &equipment.PID_kD, 0, 50000, 3); crc2 = crc32_le(0, dst, sizeof(equipment)); if ((crc1 != crc2) && Confirm((char *)"Gewijzigd, opslaan?", (char *)"Ja", (char *)"Nee")) { write_equipment(CurrentRec); } Main_Screen = MAIN_TOOLS_SETUP_EQUIPMENT; break; case MAIN_TOOLS_SETUP_WIFI: break; case MAIN_TOOLS_SETUP_CALIBRATION: Calibration_Loop(); Main_Screen = MAIN_TOOLS_SETUP; break; default: break; } }