diff --git a/inc/display.h b/inc/display.h --- a/inc/display.h +++ b/inc/display.h @@ -8,6 +8,7 @@ #endif void display_startup_screen(void); +void display_1hz(void); void display_process(void); #endif diff --git a/lib/ssd1306/ssd1306.c b/lib/ssd1306/ssd1306.c --- a/lib/ssd1306/ssd1306.c +++ b/lib/ssd1306/ssd1306.c @@ -208,25 +208,30 @@ static const char fontData[][5] = {0x00,0x00,0x7F,0x00,0x00}, // ( 92) | - 0x007C Vertical Line {0x00,0x41,0x36,0x08,0x00}, // ( 93) } - 0x007D Right Curly Bracket {0x02,0x01,0x02,0x04,0x02}, // ( 94) ~ - 0x007E Tilde - {0x08,0x14,0x2A,0x14,0x22}, // ( 95) << - 0x00AB Left-Pointing Double Angle Quotation Mark + {0x08,0x14,0x2A,0x14,0x22}, // ( 95) << - 0x00AB Left-Pointing Double Angle Quotation Mark {0x00,0x02,0x05,0x02,0x00}, // ( 96) - 0x00B0 Degree Sign -// {0x44,0x44,0x5F,0x44,0x44}, // ( 97) +- - 0x00B1 Plus-Minus Sign -// {0x7E,0x20,0x20,0x10,0x3E}, // ( 98) u - 0x00B5 Micro Sign -// {0x22,0x14,0x2A,0x14,0x08}, // ( 99) >> - 0x00BB Right-Pointing Double Angle Quotation Mark -// {0x30,0x48,0x45,0x40,0x20}, // (100) ? - 0x00BF Inverted Question Mark -// {0x22,0x14,0x08,0x14,0x22}, // (101) x - 0x00D7 Multiplcation Sign -// {0x08,0x08,0x2A,0x08,0x08}, // (102) + - 0x00F7 Division Sign -// {0x18,0x14,0x08,0x14,0x0C}, // (103) - 0x221E Infinity -// {0x44,0x4A,0x4A,0x51,0x51}, // (104) < - 0x2264 Less-Than or Equal to -// {0x51,0x51,0x4A,0x4A,0x44}, // (105) > - 0x2265 Greater-Than or Equal to -// {0x54,0x14,0x64,0x08,0x70}, // (106) .: - RF Symbol -// {0x70,0x7C,0x72,0x7C,0x70}, // (107) ^ - Lock symbol -// {0x70,0x5C,0x52,0x54,0x70}, // (108) / - Unlock symbol -// {0x0C,0x1E,0x3C,0x1E,0x0C}, // (109) <3 - Heart Symbol -// {0x18,0x22,0xFF,0x12,0x0C}, // (110) U - USB Symbol + {0x44,0x44,0x5F,0x44,0x44}, // ( 97) +- - 0x00B1 Plus-Minus Sign + {0x7E,0x20,0x20,0x10,0x3E}, // ( 98) u - 0x00B5 Micro Sign + {0x22,0x14,0x2A,0x14,0x08}, // ( 99) >> - 0x00BB Right-Pointing Double Angle Quotation Mark + {0x30,0x48,0x45,0x40,0x20}, // (100) ? - 0x00BF Inverted Question Mark + {0x22,0x14,0x08,0x14,0x22}, // (101) x - 0x00D7 Multiplication Sign + {0x08,0x08,0x2A,0x08,0x08}, // (102) + - 0x00F7 Division Sign + {0x18,0x14,0x08,0x14,0x0C}, // (103) - 0x221E Infinity + {0x44,0x4A,0x4A,0x51,0x51}, // (104) < - 0x2264 Less-Than or Equal to + {0x51,0x51,0x4A,0x4A,0x44}, // (105) > - 0x2265 Greater-Than or Equal to + {0x54,0x14,0x64,0x08,0x70}, // (106) .: - RF Symbol + {0x70,0x7C,0x72,0x7C,0x70}, // (107) ^ - Lock symbol + {0x70,0x5C,0x52,0x54,0x70}, // (108) / - Unlock symbol + {0x0C,0x1E,0x3C,0x1E,0x0C}, // (109) <3 - Heart Symbol + {0x18,0x22,0xFF,0x12,0x0C}, // (110) U - USB Symbol + {0x22,0x5d,0x22,0x00,0x00}, // (111) ez updown + {0x14,0x3e,0x14,0x00,0x00}, // (112) ez updown short }; +/* +*/ + // Set start page static void setStartPage(unsigned char d) { @@ -316,9 +321,9 @@ void ssd1306_drawlogo() // Print a single character -void ssd1306_drawchar(char ascii, unsigned char row, unsigned char xPos) +void ssd1306_drawchar(unsigned char ascii, unsigned char row, unsigned char xPos) { - const char *srcPointer = (char*)-1; + const unsigned char *srcPointer = (char*)-1; srcPointer = &fontData[(ascii-32)][0]; @@ -335,7 +340,7 @@ void ssd1306_drawchar(char ascii, unsign // Print a single large character -void ssd1306_drawcharbig(char ascii, unsigned char row, unsigned char xPos) +void ssd1306_drawcharbig(unsigned char ascii, unsigned char row, unsigned char xPos) { const char *srcPointer = (char*)-1; @@ -399,11 +404,11 @@ void ssd1306_drawcharbig(char ascii, uns // Print a string to the display -void ssd1306_drawstring(const char *dataPtr, unsigned char row, unsigned char xPos) +void ssd1306_drawstring(const unsigned char *dataPtr, unsigned char row, unsigned char xPos) { - char *srcPointer; + unsigned char *srcPointer; - srcPointer = (char*)dataPtr; + srcPointer = (unsigned char*)dataPtr; ssd1306_drawchar(' ',row,xPos); // NBSP must be written first before the string start while(1) @@ -417,7 +422,7 @@ void ssd1306_drawstring(const char *data // Print a string to the display, big font -void ssd1306_drawstringbig(const char *dataPtr, unsigned char row, unsigned char xPos) +void ssd1306_drawstringbig(const unsigned char *dataPtr, unsigned char row, unsigned char xPos) { char *srcPointer; diff --git a/lib/ssd1306/ssd1306.h b/lib/ssd1306/ssd1306.h --- a/lib/ssd1306/ssd1306.h +++ b/lib/ssd1306/ssd1306.h @@ -34,10 +34,10 @@ SPI_HandleTypeDef* spi_get(); void ssd1306_init(void); -void ssd1306_drawchar(char ascii, unsigned char row, unsigned char xPos); -void ssd1306_drawcharbig(char ascii, unsigned char row, unsigned char xPos); -void ssd1306_drawstring(const char *dataPtr, unsigned char row, unsigned char xPos); -void ssd1306_drawstringbig(const char *dataPtr, unsigned char row, unsigned char xPos); +void ssd1306_drawchar(unsigned char ascii, unsigned char row, unsigned char xPos); +void ssd1306_drawcharbig(unsigned char ascii, unsigned char row, unsigned char xPos); +void ssd1306_drawstring(const unsigned char *dataPtr, unsigned char row, unsigned char xPos); +void ssd1306_drawstringbig(const unsigned char *dataPtr, unsigned char row, unsigned char xPos); void ssd1306_drawlogo(); void ssd1306_clearscreen(); diff --git a/src/display.c b/src/display.c --- a/src/display.c +++ b/src/display.c @@ -36,7 +36,14 @@ static int16_t last_state = 123; static uint8_t goto_mode = MODE_HEAT; static uint8_t reset_mode = RESET_REBOOT; +static char* sensor_lookup[] = {"NTC", "K ", "E ", "N ", "R ", "S ", "T "}; +static uint8_t toggle = 0; + +void display_1hz(void) +{ + toggle = !toggle; +} // Display state machine void display_process(void) @@ -64,15 +71,15 @@ void display_process(void) { // Write text to OLED // [ therm :: idle ] - ssd1306_drawstring("therm :: idle ", 0, 40); + ssd1306_drawstring("therm \x87 idle ", 0, 40); status->pid_enabled = 0; if(temp_changed || state_changed) { - char tempstr[6]; -// itoa_fp(status->temp, status->temp_frac, tempstr); - ssd1306_drawstring("Temp: ", 3, 40); - ssd1306_drawstring(" ", 3, 72); - ssd1306_drawstring(tempstr, 3, 72); + char tempstr[16]; + snprintf(tempstr, 16, "Temp: %g", status->temp); + ssd1306_drawstring(" ", 3, 40); + + ssd1306_drawstring(tempstr, 3, 40); } if (state_changed) { @@ -83,26 +90,27 @@ void display_process(void) case MODE_HEAT: { - if(set->val.plant_type == PLANT_HEATER) - ssd1306_drawstring("-> heat ", 1, 40); - else - ssd1306_drawstring("-> cool ", 1, 40); + if(set->val.plant_type == PLANT_HEATER) + ssd1306_drawstring("\x83 heat ", 1, 40); + else + ssd1306_drawstring("\x83 cool ", 1, 40); + } break; case MODE_SETUP: { - ssd1306_drawstring("-> setup ", 1, 40); + ssd1306_drawstring("\x83 setup ", 1, 40); } break; case MODE_RESET: { - ssd1306_drawstring("-> reset ", 1, 40); + ssd1306_drawstring("\x83 reset ", 1, 40); } break; #ifdef BOOTLOADER_SHORTCUT case MODE_BOOTLOADER: { - ssd1306_drawstring("-> dfu ", 1, 40); + ssd1306_drawstring("\x83 dfu ", 1, 40); } #endif } @@ -157,8 +165,6 @@ void display_process(void) ssd1306_drawstring("Sensor Type", 0, 40); ssd1306_drawlogo(); - // change scope to global? - char* sensor_lookup[] = {"NTC", "K ", "E ", "N ", "R ", "S ", "T "}; ssd1306_drawstring(sensor_lookup[set->val.sensor_type], 1, 60); ssd1306_drawstring("Press to accept", 3, 40); @@ -168,7 +174,10 @@ void display_process(void) } else { - user_input((uint16_t*)&set->val.hysteresis); + user_input((uint16_t*)&set->val.sensor_type); + if(set->val.sensor_type > 6) + set->val.sensor_type = 6; + } // Event Handler // N/A @@ -502,7 +511,7 @@ void display_process(void) status->state = STATE_IDLE; } else { - user_input((uint16_t*)&set->val.setpoint_brew); + user_input_signed(&set->val.setpoint_brew); } // Event Handler @@ -532,7 +541,7 @@ void display_process(void) status->state = STATE_IDLE; } else { - user_input((uint16_t*)&set->val.setpoint_brew); + user_input_signed(&set->val.setpoint_brew); } // Event Handler @@ -690,20 +699,18 @@ static float setpoint_last = 10023.0; // Draw current setpoint on display static void draw_setpoint(therm_status_t* status) { // FIXME: need to do this when switching modes too -// if(status->temp != temp_last || trigger_drawsetpoint) { -// char tempstr[3]; -// itoa_fp(status->temp, status->temp_frac, tempstr); -// ssd1306_drawstringbig(" ", 3, 0); -// ssd1306_drawstringbig(tempstr, 3, 0); -// } + if(status->temp != temp_last || trigger_drawsetpoint) { + char tempstr[8]; + snprintf(tempstr, 8, "%g ", status->temp); + ssd1306_drawstringbig(tempstr, 3, 0); + } if(trigger_drawsetpoint) ssd1306_drawstringbig(">", 3, 74); if(status->setpoint != setpoint_last || trigger_drawsetpoint) { - char tempstr[3]; - itoa(status->setpoint, tempstr, 10); - ssd1306_drawstringbig(" ", 3, 90); + char tempstr[5]; + snprintf(tempstr, 5, "%g ", status->setpoint); ssd1306_drawstringbig(tempstr, 3, 90); } diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -49,23 +49,30 @@ int main(void) // Soft timers uint32_t last_pid = 0; uint32_t last_thermostat = 0; + uint32_t last_1hz = 0; while (1) { float duty = 0.0; + if(HAL_GetTick() - last_1hz > 750) + { + display_1hz(); + last_1hz = HAL_GetTick(); + } + if(flash_getsettings()->val.control_mode == MODE_PID && (HAL_GetTick() - last_pid > PID_PERIOD)) { - runtime_status()->temp = tempsense_readtemp(); - duty = pid_process(); +// runtime_status()->temp = tempsense_readtemp(); +// duty = pid_process(); last_pid = HAL_GetTick(); } // Thermostatic control if(flash_getsettings()->val.control_mode == MODE_THERMOSTAT && HAL_GetTick() - last_thermostat > SSR_PERIOD) { - runtime_status()->temp = tempsense_readtemp(); - duty = thermostat_process(); +// runtime_status()->temp = tempsense_readtemp(); +// duty = thermostat_process(); last_thermostat = HAL_GetTick(); }