@@ -145,48 +145,51 @@ int main(void)
int32_t temp = 0;
uint8_t temp_frac = 0;
void update_temp() {
// Assert CS
GPIO_ResetBits(MAX_CS);
delay(1);
// This may not clock at all... might need to send 16 bits first
SPI_I2S_SendData(SPI2, 0xAAAA); // send dummy data
//SPI_I2S_SendData(SPI2, 0xAA); // send dummy data
uint16_t temp_pre = SPI_I2S_ReceiveData(SPI2);
if(temp_pre & 0b0000000000000010) {
ssd1306_DrawString("Fatal Error", 3, 35);
state = STATE_TC_ERROR;
}
else if(temp_pre & 0b0000000000000001 && !ignore_tc_error) {
temp = 0;
temp_frac = 0;
else
{
if(state == STATE_TC_ERROR)
state = STATE_IDLE;
uint8_t sign = temp >> 15;// top bit is sign
temp_pre = temp_pre >> 2; // Drop 2 lowest bits
temp_frac = temp_pre & 0b11; // get fractional part
temp_frac *= 25; // each bit is .25 a degree, up to fixed point
temp_pre = temp_pre >> 2; // Drop 2 fractional bits
if(sign) {
temp = -temp_pre;
else {
temp = temp_pre;
if(temp_units == TEMP_UNITS_FAHRENHEIT) {
temp *= 9; // fixed point mul by 1.8
temp /= 5;
temp += 32;
temp_frac *= 9;
temp_frac /= 5;
temp_frac += 32;
temp += temp_frac/100; // add overflow to above
temp_frac %= 100;
@@ -416,49 +419,49 @@ void machine()
switch(state)
// Idle state
case STATE_IDLE:
// Write text to OLED
// [ therm :: idle ]
ssd1306_DrawString("therm :: idle ", 0, 40);
pid_enabled = 0;
if(temp_changed) {
char tempstr[6];
itoa_fp(temp, temp_frac, tempstr);
ssd1306_DrawString("Temp: ", 3, 40);
ssd1306_DrawString(" ", 3, 72);
ssd1306_DrawString(tempstr, 3, 72);
ssd1306_drawlogo();
switch(goto_mode) {
case 2:
ssd1306_DrawString("-> brew ", 1, 40);
ssd1306_DrawString("-> heat ", 1, 40);
} break;
case 1:
ssd1306_DrawString("-> setup ", 1, 40);
case 0:
ssd1306_DrawString("-> reset ", 1, 40);
// Button handler
if(SW_BTN_PRESSED) {
state = STATE_PREHEAT_BREW;
break;
state = STATE_SETP;
@@ -619,52 +622,52 @@ void machine()
ssd1306_DrawString("G=", 1, 45);
ssd1306_DrawString(" ", 1, 57);
ssd1306_DrawString(tempstr, 1, 57);
ssd1306_DrawString("Press to accept", 3, 40);
state = STATE_SETBOOTTOBREW;
user_input(&windup_guard);
// Event Handler
// N/A
case STATE_SETBOOTTOBREW:
// [ therm :: set windup ]
// [ g = 12 ]
ssd1306_DrawString("Boot to Brew", 0, 40);
ssd1306_DrawString("Start on Boot", 0, 40);
ssd1306_DrawString("btb=", 1, 45);
ssd1306_DrawString("sob=", 1, 45);
if(boottobrew)
ssd1306_DrawString("Enabled ", 1, 70);
ssd1306_DrawString("Disabled", 1, 70);
state = STATE_SETUNITS;
else if(!GPIO_ReadInputDataBit(SW_UP)) {
boottobrew = 1;
else if(!GPIO_ReadInputDataBit(SW_DOWN)) {
boottobrew = 0;
Status change: