Sun, 27 Dec 2015 17:52:26 +0100
Renamed Mash-in step to Prepare on the display. Don't run the pump when the mash is added. When preparing the mash, first heat the HLT, and then the MLT so that both have the chance to reach their target temperatures.
#ifndef _BREWCO_H #define _BREWCO_H #define TRUE 1 #define FALSE 0 #include "../config.h" #include "pid.h" #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <stdarg.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/time.h> #include <time.h> #include <utime.h> #include <fcntl.h> #include <syslog.h> #include <unistd.h> #include <errno.h> #include <signal.h> #include <getopt.h> #include <limits.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netdb.h> #include <poll.h> #include <dirent.h> #include <uuid/uuid.h> #include <math.h> #include <zlib.h> #ifndef HAVE_WIRINGPI_H #include <pthread.h> #endif #include <libxml/xmlmemory.h> #include <libxml/parser.h> #include <libxml/encoding.h> #include <libxml/xmlwriter.h> #ifdef HAVE_WIRINGPI_H /* wiringPi */ #include <wiringPi.h> #include <pcf8574.h> #include <lcd.h> /* * Thread locks */ #define LOCK_DEVICES 0 #define LOCK_LCD 1 #define LOCK_MENU 2 #define LOCK_SPARE2 3 #endif /* * 1-Wire devices */ #define W1_FAMILY_DEFAULT 0 #define W1_FAMILY_SMEM_01 0x01 #define W1_FAMILY_SMEM_81 0x81 #define W1_THERM_DS18S20 0x10 #define W1_FAMILY_DS28E04 0x1C #define W1_COUNTER_DS2423 0x1D #define W1_THERM_DS1822 0x22 #define W1_EEPROM_DS2433 0x23 #define W1_THERM_DS18B20 0x28 #define W1_FAMILY_DS2408 0x29 #define W1_EEPROM_DS2431 0x2D #define W1_FAMILY_DS2760 0x30 #define W1_FAMILY_DS2780 0x32 #define W1_FAMILY_DS2413 0x3A #define W1_THERM_DS1825 0x3B #define W1_FAMILY_DS2781 0x3D #define W1_THERM_DS28EA00 0x42 #define MBSE_SS(x) (x)?(x):"(null)" /* * Sensor strcuture */ typedef struct _sensor_var { char *uuid; /* sensor uuid */ int state; /* sensor state */ int value; /* sensor value */ } sensor_var; /* * Switch structure */ typedef struct _switch_var { char *uuid; /* switch uuid */ int value; /* switch value (0..100) */ int delay; /* switch delay */ } switch_var; /* * Brewing units. The sensors of the units are connected via the 1-wire bus. * The heaters, pumps (or mixer) are connected on the Pi GPIO. The hardware * is configured in the devices lists. */ typedef struct _units_list { struct _units_list *next; int version; /* Record version */ char *uuid; /* uuid code */ char *name; /* Unit name */ int number; /* Unit number */ int active; /* 0/1 active unit */ sensor_var hlt_sensor; /* HLT sensor */ switch_var hlt_heater; /* HLT heater */ int hlt_heater_mltfirst; /* HLT heater MLT high priority */ sensor_var mlt_sensor; /* MLT sensor */ switch_var mlt_heater; /* MLT heater */ switch_var mlt_pump; /* MLT pump */ int pump_cycle; /* 5..15 minutes */ int pump_rest; /* 1..5 minutes */ int pump_premash; /* 0/1 */ int pump_onmash; /* 0/1 */ int pump_mashout; /* 0/1 */ int pump_onboil; /* 0/1 pump during boiling */ float pump_stop; /* 80..105 C */ int skip_add; /* 0/1 skip Add phase */ int skip_remove; /* 0/1 skip Remove phase */ int skip_iodine; /* 0/1 skip Iodine test */ int iodine_time; /* 0..90 minutes */ int whirlpool; /* off/cold/hot */ pid_var *PID_hlt; /* HLT PID */ pid_var *PID_mlt; /* MLT PID */ } units_list; /* * External devices like sensors, relays, SSR. */ typedef struct _dev_list { struct _dev_list *next; int version; /* Version 1 */ char *uuid; /* UUID of this device */ int type; /* Device type */ int direction; /* Device direction */ int value; /* Device value */ int offset; /* Device offset value */ int present; /* Device present */ char *address; /* Device address */ int subdevice; /* Device sub address */ int gpiopin; /* Device GPIO pin or -1 */ char *description; /* Device description */ int inuse; /* In use counter */ char *comment; /* What we think it is */ time_t timestamp; /* Last updated */ } devices_list; #define DEVTYPE_NA 0 /* Unknown device type */ #define DEVTYPE_W1 1 /* 1-Wire bus */ #define DEVTYPE_GPIO 2 /* GPIO I/O device */ #define DEVTYPE_I2C 3 /* I2C bus device */ #define DEVTYPE_SPI 4 /* SPI bus device */ #ifdef USE_SIMULATOR #define DEVTYPE_SIM 5 /* Simulated device */ #endif #define DEVPRESENT_UNDEF 0 /* Precence not testable */ #define DEVPRESENT_NO 1 /* Device is missing */ #define DEVPRESENT_YES 2 /* Device is detected */ #define DEVPRESENT_ERROR 3 /* Device is in error */ #define DEVDIR_UNDEF 0 /* Undefined */ #define DEVDIR_IN_BIN 1 /* Binary input */ #define DEVDIR_OUT_BIN 2 /* Binary output */ #define DEVDIR_IN_ANALOG 3 /* Temperature input etc. */ #define DEVDIR_OUT_ANALOG 4 /* Analog steering */ #define DEVDIR_OUT_PWM 5 /* PWM outout */ #define DEVDIR_INTERN 6 /* Internal function */ /* * Recipes. */ typedef struct _mash_step { char *name; /* Step name */ int min; /* Minimum temperature */ int max; /* Maximum temperature */ int canskip; /* 0/1 can we skip this step */ float setpoint; /* Temperature setpoint */ int skip; /* Skip this step */ int duration; /* Step duration */ } mash_step; typedef struct _hop_stand { char *name; /* Hop stand name */ int min; /* Minimum temperature */ int max; /* Maximum temperature */ int hold; /* Hold temperature at */ float setpoint; /* Hold temperature setpoint */ int skip; /* Skip this one */ int duration; /* Hold time */ } hop_stand; typedef struct _hop_addition { char *name; /* Hop name */ int skip; /* Skip addition */ int boiltime; /* -1=fwh, 0..boiltime */ } hop_addition; typedef struct _a_recipe { struct _a_recipe *next; char *uuid; /* Recipe uuid */ char *code; /* Recipe code */ char *name; /* Recipe name */ int boiltime; /* 1..240 minutes */ float coolto; /* Cooling target */ time_t starttime; /* Start time */ time_t endtime; /* Ending time */ mash_step mash[8]; /* 8 mash steps */ hop_addition hops[10]; /* 10 hop additions */ hop_stand hopstand[3]; /* 3 hopstand slots */ } a_recipe; #ifdef USE_SIMULATOR /* * Simulate a HLT and MLT. */ typedef struct _simulator { double room_temperature; /* Simulated envionment temp */ double hlt_temperature; /* Simulated HLT temperature */ double hlt_heater_temp; /* Maximum heater temp */ int hlt_heater_volume; /* Water volume */ int hlt_heater_power; /* Power of the heater */ int hlt_heater_state; /* Heater status */ double mlt_temperature; /* Simulated MLT temperature */ double mlt_heater_temp; /* Maximum heater temp */ int mlt_heater_volume; /* Water volume */ int mlt_heater_power; /* Power of the heater */ int mlt_heater_state; /* Heater status */ } simulator_var; #endif typedef struct _sys_config { char *name; /* Configuration name */ int my_port; /* my client/server port */ unsigned char tempFormat; /* Temperature format, C or F */ sensor_var *roomtemp; /* Environment temperature */ int lcd_cols; /* LCD display columns */ int lcd_rows; /* LCD display rows */ int lcd_address; /* LCD display i2c address */ units_list *units; /* Brewing units */ devices_list *devices; /* Sensors and switches */ #ifdef USE_SIMULATOR simulator_var *simulator; /* Simulator */ #endif } sys_config; /* * Brewing state file ~/.brewco/var/brewing.xml * If present a brew session is running */ #define STEP_NA 0 /* Not in any step yet */ #define STEP_BREWINIT 1 /* Initialize brew */ #define STEP_WATERCHECK 2 /* Water added? */ #define STEP_PUMPPRIME 3 /* Pump Prime */ #define STEP_WAITSTART 4 /* Wait for starttime */ #define STEP_PREMASH 5 /* Pre-mash */ #define STEP_MASHING 6 /* Mash steps */ #define STEP_MASHREMOVE 7 /* Remove mash */ #define STEP_PREBOIL 8 /* Heating before boil */ #define STEP_BOILING 9 /* Boil */ #define STEP_BOILDONE 10 /* Boil done, hopstand */ #define STEP_COOLING 11 /* Cooling */ #define STEP_HOPSTAND 12 /* Hopstand */ #define STEP_WHIRLPOOL 13 /* Final whirlpool */ #define STEP_CLEANUP 14 /* Cleanup */ #define STEP_BREWDONE 15 /* Final step */ #define MASH_NA 0 /* Not in any state yet */ #define MASH_PROMPT 1 /* Prompt for mash */ #define MASH_IODINE 2 /* Prompt for iodine test */ #define MASH_HEATING 3 /* Heating phase */ #define MASH_REST 4 /* Rest phase */ #define MASH_DONE 5 /* This step is done */ typedef struct _brew_session { char *uuid_recipe; /* Brewing this recipe */ char *uuid_unit; /* Brewing unit */ char *name; /* Session name */ int brewstep; /* Main steps */ int mashstep; /* Mash step */ int timeout; /* Generic time downcouner */ int boiltimer; /* Boiling downcount */ time_t starttime; /* Start of brew */ time_t endtime; /* End of brew */ } brew_session; #endif