main/setup.c

Fri, 28 Jun 2024 15:33:24 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Fri, 28 Jun 2024 15:33:24 +0200
branch
idf 5.1
changeset 137
e0f50087c909
parent 129
31f9d3e4a85f
permissions
-rw-r--r--

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;
    }
}

mercurial