main/files.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 56
756d1a63d129
child 87
47253f294a9f
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 files.c
 * @brief Files management.
 */

#include "config.h"


extern sButton                  Buttons[MAXBUTTONS];
extern int                      Main_Screen;

static const char		*TAG = "files";


/**
 * @brief Show files directory
 * @param path The path from which to list
 */
void Files_Dir(char *path)
{
    char		filename[272], tmp[42];
    uint16_t		y = 28;
    DIR			*dir;
    struct dirent	*de;
    struct stat		st;

    _bg = TFT_BLACK;
    TFT_fillScreen(_bg);
    TopMessage(path);
    _fg = TFT_WHITE;
    TFT_setFont(DEFAULT_FONT, NULL);

    if ((dir = opendir(path))) {
	de = readdir(dir);
	while (de) {
	    TFT_print(de->d_name, 2, y);
	    sprintf(filename, "%s/%s", path, de->d_name);
	    if (stat(filename, &st) == 0) {
		sprintf(tmp, "%ld", st.st_size);
		TFT_print(tmp, RIGHT, y);
	    }
	    de = readdir(dir);
	    y += 16;
	}
	closedir(dir);
    }

    Buttons_Add(130, 200, 60, 40, (char *)"Ok", 0);
    Buttons[0].dark = true;
    Buttons_Show();

    while (true) {
	if (Buttons_Scan() == 0) {
	    Buttons_Clear();
	    return;
	}
	vTaskDelay(50 / portTICK_PERIOD_MS);
    }
}



/**
 * @brief File copier.
 * @param fdir From directory
 * @param tdir To directory
 * @param fn Filename
 */
void FCopy(char *fdir, char *tdir, char *filename)
{
    char	fn[33], tn[33], msg[33];
    int		rc;

    snprintf(msg, 32, "Copy %s\r\n", filename);
    TFT_print(msg, 0, LASTY);
    snprintf(fn, 32, "%s%s", fdir, filename);
    snprintf(tn, 32, "%s%s", tdir, filename);
    rc = FileCopy(fn, tn);
    ESP_LOGI(TAG, "Copy %s to %s rc=%d", fn, tn, rc);
}



/*
 * Files init function, only runs once a new screen is entered.
 */
void Files_Init(void)
{
    bool	_loop;
    DIR		*dir;

    switch (Main_Screen) {
	case MAIN_TOOLS_FILES:
			TopMessage((char *)"Bestanden menu");
			Buttons_Add( 20, 40,120, 40, (char *)"Restore", 0);
			Buttons_Add(180, 40,120, 40, (char *)"Backup", 1);
			Buttons_Add( 20,120,120, 40, (char *)"Directory", 2);
			Buttons_Add(130, 200, 60, 40, (char *)"Ok", 3);
			Buttons[3].dark = true;
			Buttons_Show();
			break;

	case MAIN_TOOLS_FILES_DIR:
			break;

	case MAIN_TOOLS_FILES_RESTORE:
	case MAIN_TOOLS_FILES_BACKUP:
			if (Main_Screen == MAIN_TOOLS_FILES_RESTORE)
			    TopMessage((char *)"Restore database");
			else
			    TopMessage((char *)"Backup database");
			Buttons_Add( 40, 100, 80, 40, (char *)"Start", 0);
			Buttons_Add(200, 100, 80, 40, (char *)"Stop",  1);
			Buttons[1].dark = true;
			Buttons_Show();
			SoundPlay(SOUND_Prompt);
			_loop = true;
			while (_loop) {
			    switch (Buttons_Scan()) {
				case 0:
				    	_loop = false;
					break;
				case 1:
					_loop = false;
					Main_Screen = MAIN_TOOLS_FILES;
					break;
				default:
					break;
			    }
			    vTaskDelay(50 / portTICK_PERIOD_MS);
			}
			Buttons_Clear();
			if (Main_Screen == MAIN_TOOLS_FILES)
			    break;

			_fg = TFT_YELLOW;
			TFT_setFont(DEJAVU24_FONT, NULL);
			if (Main_Screen == MAIN_TOOLS_FILES_RESTORE) {
			    ESP_LOGI(TAG, "Restore database");
			    TFT_setFont(DEJAVU18_FONT, NULL);
			    TFT_print((char *)"Backup:\r\n", 0, 30);
			    _fg = TFT_CYAN;
			    FCopy((char *)"/sdcard/etc/", (char *)"/spiffs/etc/", (char *)"config.conf");
			    FCopy((char *)"/sdcard/etc/", (char *)"/spiffs/etc/", (char *)"recipe.conf");
			    FCopy((char *)"/sdcard/etc/", (char *)"/spiffs/etc/", (char *)"equipments.conf");
			    FCopy((char *)"/sdcard/etc/", (char *)"/spiffs/etc/", (char *)"stations.conf");
			    FCopy((char *)"/sdcard/etc/", (char *)"/spiffs/etc/", (char *)"runtime.conf");
			    _fg = TFT_YELLOW;
			    TFT_setFont(DEJAVU24_FONT, NULL);
			    TFT_print((char *)"Restore gereed, reset!", CENTER, LASTY + 12);
			    vTaskDelay(2000 / portTICK_PERIOD_MS);
			    esp_restart();
			} else {
			    dir = opendir("/sdcard/etc");
			    if (dir == NULL) {
				mkdir("/sdcard/etc",  0755);
				dir = opendir("/sdcard/etc");
			    }
			    if (dir == NULL) {
				TFT_print((char *)"SD kaart fout", CENTER, CENTER);
			    } else {
				closedir(dir);
				ESP_LOGI(TAG, "Backup database");
				TFT_setFont(DEJAVU18_FONT, NULL);
				TFT_print((char *)"Backup:\r\n", 0, 30);
				_fg = TFT_CYAN;
				FCopy((char *)"/spiffs/etc/", (char *)"/sdcard/etc/", (char *)"config.conf");
				FCopy((char *)"/spiffs/etc/", (char *)"/sdcard/etc/", (char *)"recipe.conf");
				FCopy((char *)"/spiffs/etc/", (char *)"/sdcard/etc/", (char *)"equipments.conf");
				FCopy((char *)"/spiffs/etc/", (char *)"/sdcard/etc/", (char *)"stations.conf");
				FCopy((char *)"/spiffs/etc/", (char *)"/sdcard/etc/", (char *)"runtime.conf");
				_fg = TFT_YELLOW;
				TFT_setFont(DEJAVU24_FONT, NULL);
			    	TFT_print((char *)"Backup gereed.", CENTER, LASTY + 12);
			    }
			}

			Buttons_Add(130, 200, 60, 40, (char *)"Ok", 0);
			Buttons[0].dark = true;
			Buttons_Show();
			break;

	default:	break;
    }
}



/*
 * Recipes management loop, non-blocking.
 */
void Files_Loop(void)
{
    switch (Main_Screen) {

	case MAIN_TOOLS_FILES:
			switch (Buttons_Scan()) {
			    case 0:	Main_Screen = MAIN_TOOLS_FILES_RESTORE;
					break;

			    case 1:	Main_Screen = MAIN_TOOLS_FILES_BACKUP;
					break;

			    case 2:	Main_Screen = MAIN_TOOLS_FILES_DIR;
					break;

			    case 3:	Main_Screen = MAIN_TOOLS;
					break;
			}
			break;

	case MAIN_TOOLS_FILES_DIR:
			Files_Dir((char *)"/sdcard/recipe");
			Files_Dir((char *)"/sdcard/w/log");
			Main_Screen = MAIN_TOOLS_FILES;
			break;

	case MAIN_TOOLS_FILES_RESTORE:
	case MAIN_TOOLS_FILES_BACKUP:
			if (Buttons_Scan() == 0)
			    Main_Screen = MAIN_TOOLS_FILES;
			break;

	default:	break;
    }
}

mercurial