main/manual.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 136
89fc3c57282e
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 manual.c
 * @brief Manual control functions.
 */

#include "config.h"

bool 				_ManualHLT = false;		///< Use Hot Liquer Tank
bool				_ManualMLT = false;		///< Use Mash/Boil kettle

extern my_runtime_t		runtime;
extern my_equipment_t		equipment;

extern sButton                  Buttons[MAXBUTTONS];
extern int                      Main_Screen;
extern DS18B20_State            *ds18b20_state;
extern DRIVER_State             *driver_state;
extern SemaphoreHandle_t        xSemaphoreDS18B20;
extern SemaphoreHandle_t        xSemaphoreDriver;

#ifdef CONFIG_TEMP_SENSORS_SIMULATOR
extern float                    Fake_MLT;
extern float                    Fake_HLT;
#endif

static const char               *TAG = "manual";


/*
 * Manual init function that only runs once a new screen
 * is entered.
 */
bool Manual_Init(void)
{
    switch (Main_Screen) {
	case MAIN_MANUAL_INIT:
		log_msg(TAG, "Start manual mode");
		if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
		    driver_state->enable = true;
		    xSemaphoreGive(xSemaphoreDriver);
		}
		break;

	case MAIN_MANUAL_MAIN:
		TopMessage((char *)"Handbediening");
		Buttons_Add(  5, 200, 60, 40, (char *)"Stop", 0);
		Buttons[0].dark = true;
		uint8_t i = 1;
		if (_ManualMLT) {
		    MLT_info(71, 26, false);
		    Buttons_Add(  5,  26, 60, 40, (char *)"+sp"  , i++);
		    Buttons_Add(255,  26, 60, 40, (char *)"-sp"  , i++);
		    Buttons_Add(  5,  76, 60, 40, (char *)"Pomp" , i++);
		    Buttons_Add(255,  76, 60, 40, (char *)"Aan"  , i++);
		}
		if (_ManualHLT) {
		    HLT_info(71,150, false, false);
		    Buttons_Add(  5, 150, 60, 40, (char *)"+sp"  , i++);
		    Buttons_Add(255, 150, 60, 40, (char *)"-sp"  , i++);
		    Buttons_Add(255, 200, 60, 40, (char *)"Aan"  , i);
		}
		Buttons_Show();
		break;

	default:
		break;
    }

    return false;
}



/*
 * Manual loop screens, non-blocking.
 */
bool Manual_Loop(void)
{
    bool	loop;

    switch (Main_Screen) {
	case MAIN_MANUAL_INIT:
		_ManualHLT = _ManualMLT = false;
		Buttons_Add( 40, 100, 80, 40, (char *)"Ja", 0);
		Buttons_Add(200, 100, 80, 40, (char *)"Nee",  1);
		Buttons_Show();

		if ((equipment.SSR2 == SSR2_HLT_SHARE) || (equipment.SSR2 == SSR2_HLT_IND)) {
		    TopMessage((char *)"Spoelwater ketel?");
		    SoundPlay(SOUND_Prompt);
		    loop = true;
		    while (loop) {
		    	switch (Buttons_Scan()) {
			    case 0:     loop = false;
					_ManualHLT = true;
					break;

			    case 1:     loop = false;
					_ManualHLT = false;
					break;

			    default:    break;
		    	}
		        vTaskDelay(20 / portTICK_PERIOD_MS);
		    }
		}

		TopMessage((char *)"Maisch/Kook ketel?");
		SoundPlay(SOUND_Prompt);
		loop = true;
		while (loop) {
		    switch (Buttons_Scan()) {
			case 0:         loop = false;
					_ManualMLT = true;
					break;

			case 1:         loop = false;
					_ManualMLT = false;
					break;

			default:        break;
		    }
		    vTaskDelay(20 / portTICK_PERIOD_MS);
		}
		Buttons_Clear();

		if (! _ManualHLT && ! _ManualMLT) {
		    log_msg(TAG, "End manual mode");
		    Main_Screen = MAIN_MODE_FREE;
		    break;
		}
		if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
		    /* Set them all, even if not in use now. */
		    driver_state->hlt_sp = runtime.ManualHLT;
		    driver_state->mlt_sp = runtime.ManualMLT;
		    xSemaphoreGive(xSemaphoreDriver);
		}
		runtime.MLT_usage = 0;
		runtime.HLT_usage = 0;
		write_runtime();

		if (_ManualHLT) {
		    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
			driver_state->hlt_mode = HLT_MODE_OFF;
			xSemaphoreGive(xSemaphoreDriver);
		    }
		}
		if (_ManualMLT) {
		    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
			driver_state->mlt_mode = MLT_MODE_OFF;
			xSemaphoreGive(xSemaphoreDriver);
		    }
		}
		log_msg(TAG, "HLT:%s MLT:%s", (_ManualHLT)?"true":"false", (_ManualMLT)?"true":"false");
		Main_Screen = MAIN_MANUAL_MAIN;
		break;

	case MAIN_MANUAL_MAIN:
		if (_ManualMLT) {
		    MLT_info(71, 26, true);
		}
		if (_ManualHLT) {
		    HLT_info(71, 150, true, false);
		}
		switch (Buttons_Scan()) {
		    case 0:	Main_Screen = MAIN_MODE_FREE;
				log_msg(TAG, "End manual mode");
				if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    runtime.ManualHLT = driver_state->hlt_sp;
				    runtime.ManualMLT = driver_state->mlt_sp;
				    driver_state->enable = false;
				    driver_state->mlt_mode = MLT_MODE_NONE;
				    driver_state->mlt_sp = 0.0;
				    driver_state->hlt_mode = HLT_MODE_NONE;
				    driver_state->hlt_sp = 0.0;
				    driver_state->pump_run = 0;
				    xSemaphoreGive(xSemaphoreDriver);
				}
				double mwu = (runtime.MLT_usage / 1000.0 / 60.0 / 60.0) * equipment.MLT_watt / 1000.0;
                		double hwu = (runtime.HLT_usage / 1000.0 / 60.0 / 60.0) * equipment.HLT_watt / 1000.0;
                		log_msg(TAG, "MLT usage %.3f KWh, HLT usage %.3f KWh, total %.3f KWh", mwu, hwu, mwu + hwu);
				write_runtime();
				break;

		    case 1:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    if (_ManualMLT) {
				    	driver_state->mlt_sp += 0.25;
					log_msg(TAG, "MLT sp %.2f", driver_state->mlt_sp);
				    } else {
					driver_state->hlt_sp += 0.25;
					log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
				    }
				    xSemaphoreGive(xSemaphoreDriver);
				}
				break;

		    case 2:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    if (_ManualMLT) {
					driver_state->mlt_sp -= 0.25;
					log_msg(TAG, "MLT sp %.2f", driver_state->mlt_sp);
				    } else {
					driver_state->hlt_sp -= 0.25;
					log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
				    }
				    xSemaphoreGive(xSemaphoreDriver);
				}
				break;

		    case 3:	if (_ManualMLT) {
				    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
					if (driver_state->pump_run)
					    driver_state->pump_run = 0;
					else
					    driver_state->pump_run = 1;
					xSemaphoreGive(xSemaphoreDriver);
				    }
				    log_msg(TAG, "Pump turned %s", driver_state->pump_run?"on":"off");
				} else {
				    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
					if (driver_state->hlt_mode == HLT_MODE_BANG) {
					    driver_state->hlt_mode = HLT_MODE_OFF;
					    Buttons_Add(255, 200, 60, 40, (char *)"Aan"  , 3);
					    log_msg(TAG, "HLT turned off");
					} else {
					    driver_state->hlt_mode = HLT_MODE_BANG;
					    Buttons_Add(255, 200, 60, 40, (char *)"Uit"  , 3);
					    log_msg(TAG, "HLT turned on sp %.2f", driver_state->hlt_sp);
					}
					xSemaphoreGive(xSemaphoreDriver);
				    }
				    Buttons_Show();
				}
				break;

		    case 4:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    if (driver_state->mlt_mode == MLT_MODE_PID) {
					driver_state->mlt_mode = MLT_MODE_OFF;
					Buttons_Add(255,  76, 60, 40, (char *)"Aan"  , 4);
					log_msg(TAG, "MLT turned off");
				    } else {
					driver_state->mlt_mode = MLT_MODE_PID;
					Buttons_Add(255,  76, 60, 40, (char *)"Uit"  , 4);
					log_msg(TAG, "MLT turned on sp %.2f", driver_state->mlt_sp);
				    }
				    xSemaphoreGive(xSemaphoreDriver);
				}
				Buttons_Show();
				break;

		    case 5:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    driver_state->hlt_sp += 0.25;
				    xSemaphoreGive(xSemaphoreDriver);
				}
				log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
				break;

		    case 6:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    driver_state->hlt_sp -= 0.25;
				    xSemaphoreGive(xSemaphoreDriver);
				}
				log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
				break;

		    case 7:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
				    if (driver_state->hlt_mode == HLT_MODE_BANG) {
					driver_state->hlt_mode = HLT_MODE_OFF;
					Buttons_Add(255, 200, 60, 40, (char *)"Aan"  , 7);
					log_msg(TAG, "HLT turned off");
				    } else {
					driver_state->hlt_mode = HLT_MODE_BANG;
					Buttons_Add(255, 200, 60, 40, (char *)"Uit"  , 7);
					log_msg(TAG, "HLT turned on %.2f", driver_state->hlt_sp);
				    }
				    xSemaphoreGive(xSemaphoreDriver);
				}
				Buttons_Show();
				break;

		    default:	break;
		}
		break;

	default:
		break;
    }

    return false;
}

mercurial