main/manual.c

Sat, 06 Jun 2020 13:28:46 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 06 Jun 2020 13:28:46 +0200
changeset 77
66c77497d86d
parent 62
2e90ada37476
child 89
fa44bd094e01
permissions
-rw-r--r--

Changed the recipe database so that it is expandable, version 2. More mash fields and allow 16 steps. Allow 20 Additions. Removed separate mash steps from the state machine, the steps are moved to the runtime data. There is no fixed step number for mashout anymore. There is no fixed step for mash-in anymore, just use the first step and heat to the infusion temperature. After malt add, switch to the normal step temperature. Implemented decoction steps.

/**
 * @file manual.c
 * @brief Manual control functions.
 */

#include "config.h"

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

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