main/manual.c

Thu, 11 Jun 2020 20:40:19 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 11 Jun 2020 20:40:19 +0200
changeset 89
fa44bd094e01
parent 62
2e90ada37476
permissions
-rw-r--r--

Added power usage counters to manual mode.

/**
 * @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);
		}
		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