@@ -477,49 +477,56 @@ void display_process(therm_settings_t* s
draw_setpoint(status);
status->pid_enabled = 1;
status->setpoint = set->setpoint_steam;
// Button handler
if(SW_BTN_PRESSED) {
status->state = STATE_IDLE;
save_setpoints(); // TODO: Check for mod
}
else {
user_input(&set->setpoint_steam);
// Event Handler
// N/A
} break;
case STATE_TC_ERROR:
{
// Write text to OLED
// [ therm : ready to steam ]
// [ 30 => 120 C ]
ssd1306_DrawString("Error:", 0, 0);
ssd1306_DrawString("Connect thermocouple", 1, 0);
if(status->tc_errno == 1)
ssd1306_DrawString("#1, Check Sensor", 1, 0);
else if(status->tc_errno == 4)
ssd1306_DrawString("#4, Check Sensor", 1, 0);
else
ssd1306_DrawString("#?, Unknown Error", 1, 0);
ssd1306_DrawString("Press -> to ignore", 3, 0);
else if(SW_RIGHT_PRESSED) {
set->ignore_tc_error = 1;
// Maybe handle if TC is plugged in
// Something is terribly wrong
default:
status->pid_enabled = 0;
@@ -141,55 +141,57 @@ void SystemClock_Config(void)
void update_temp() {
// Assert CS
HAL_GPIO_WritePin(MAX_CS, 0);
uint8_t rxdatah[1] = {0x00};
uint8_t rxdatal[1] = {0x00};
HAL_SPI_Receive(&hspi1, rxdatah, 1, 100);
HAL_SPI_Receive(&hspi1, rxdatal, 1, 100);
// Release CS
HAL_GPIO_WritePin(MAX_CS, 1);
// Assemble data array into one var
uint16_t temp_pre = rxdatal[0] | (rxdatah[0]<<8);
if(temp_pre & 0b0000000000000010) {
ssd1306_clearscreen();
//ssd1306_DrawString("Fatal Error", 3, 35);
HAL_Delay(100);
HAL_Delay(100); // FIXME: remove?
status.tc_errno = 4;
status.state = STATE_TC_ERROR;
status.temp = 0;
status.temp_frac = 0;
else if(temp_pre & 0b0000000000000001 && !set.ignore_tc_error) {
status.tc_errno = 1;
status.state_resume = status.state;
if(status.state == STATE_TC_ERROR)
status.state = status.state_resume;
uint8_t sign = status.temp >> 15;// top bit is sign
temp_pre = temp_pre >> 2; // Drop 2 lowest bits
status.temp_frac = temp_pre & 0b11; // get fractional part
status.temp_frac *= 25; // each bit is .25 a degree, up to fixed point
temp_pre = temp_pre >> 2; // Drop 2 fractional bits
int8_t signint;
if(sign) {
signint = -1;
#ifndef STATES_H
#define STATES_H
typedef struct {
int32_t temp;
uint8_t temp_frac;
uint8_t state_resume;
uint8_t state;
int32_t setpoint;
uint8_t pid_enabled;
uint8_t tc_errno;
} therm_status_t;
uint8_t boottobrew;
uint8_t temp_units;
uint16_t windup_guard;
uint16_t k_p;
uint16_t k_i;
uint16_t k_d;
int16_t temp_offset;
uint8_t ignore_tc_error;
int16_t setpoint_brew;
int16_t setpoint_steam;
} therm_settings_t;
enum tempunits {
TEMP_UNITS_CELSIUS = 0,
TEMP_UNITS_FAHRENHEIT,
};
enum state {
STATE_IDLE = 0,
Status change: