diff --git a/my_src/main2.c b/my_src/main2.c index 1828892..39b80a1 100644 --- a/my_src/main2.c +++ b/my_src/main2.c @@ -22,18 +22,94 @@ #include "oled.h" +typedef enum { + IDLE = 0, + STARTED = 1, + RUNNING = 2, + OVERRUN = 3 +} tTimerState; +typedef struct { + uint8_t toggle; + uint8_t setModeTemperature; + uint8_t setModeTime; + tTimerState timerState; + uint32_t targetTemperature; + uint32_t currentTemperature; + uint32_t targetTime; + uint32_t currentTime; + uint32_t overrunTime; +} tDisplay; + + +tDisplay display = { + .toggle = 0, .setModeTemperature = 0, .setModeTime = 0, + .timerState = IDLE, + .targetTemperature = 80, .currentTemperature = 75, + .targetTime = 180, .currentTime = 175, + .overrunTime = 0 +}; + + +void updateDisplay(void *handle) { + tDisplay *lDisplay = (tDisplay*) handle; + lDisplay->toggle ^= 0x01; + char buf[32]; + + sprintf(buf, "ThermometerTeaTimer"); + LED_P6x8Str(0, 0, buf); + + if (lDisplay->setModeTemperature && lDisplay->toggle) { + sprintf(buf, " %3d'C", lDisplay->currentTemperature); + } else { + sprintf(buf, "%3d'C %3d'C", lDisplay->targetTemperature, lDisplay->currentTemperature); + } + LED_P8x16Str(0, 2, buf); + + if (lDisplay->setModeTime && lDisplay->toggle) { + sprintf(buf, " %3ds", lDisplay->currentTime); + } else { + sprintf(buf, "%3ds %3ds", lDisplay->targetTime, lDisplay->currentTime); + } + LED_P8x16Str(0, 4, buf); + + sprintf(buf, " %5ds", lDisplay->overrunTime); + LED_P8x16Str(0, 6, buf); +} + +void secondTick(void *handle) { + tDisplay *lDisplay = (tDisplay*) handle; + + switch (lDisplay->timerState) { + case STARTED: + lDisplay->currentTime = lDisplay->targetTime; + lDisplay->timerState = RUNNING; + break; + case RUNNING: + lDisplay->currentTime -= 1; + if (lDisplay->currentTime == 0) { + lDisplay->timerState = OVERRUN; + } + break; + case OVERRUN: + lDisplay->overrunTime += 1; + break; + default: + ; + } +} void blink(void *handle) { - static uint32_t i = 0; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); - LED_PrintValueI(0, 1, i); - i++; } void my_setup_1() { schInit(); schAdd(blink, NULL, 0, 100); + schAdd(updateDisplay, &display, 0, 250); + schAdd(secondTick, &display, 0, 1000); + + display.timerState = STARTED; } void my_loop() { diff --git a/my_src/oled.c b/my_src/oled.c index cbfeb19..f8bf5e7 100644 --- a/my_src/oled.c +++ b/my_src/oled.c @@ -356,142 +356,144 @@ void LED_PrintBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned ch } } -void LED_PrintValueC(unsigned char x, unsigned char y, char data) -{ - unsigned char i,j,k; - if(data < 0) - { - LED_P6x8Char(x,y,'-'); - data = - data; - } - else - { - LED_P6x8Char(x,y,'+'); - } - i = data/100; - j = (data%100)/10; - k = data%10; - LED_P6x8Char(x+6,y,i+48); - LED_P6x8Char(x+12,y,j+48); - LED_P6x8Char(x+18,y,k+48); -} - - -void LED_PrintValueI(unsigned char x, unsigned char y, int data) -{ - unsigned char i,j,k,l,m; - if(data < 0) - { - LED_P6x8Char(x,y,'-'); - data = - data; - } - else - { - LED_P6x8Char(x,y,'+'); - } - - l = data/10000; - m= (data%10000)/1000; - i = (data%1000)/100; - j = (data%100)/10; - k = data%10; - LED_P6x8Char(x+6,y,l+48); - LED_P6x8Char(x+12,y,m+48); - LED_P6x8Char(x+18,y,i+48); - LED_P6x8Char(x+24,y,j+48); - LED_P6x8Char(x+30,y,k+48); -} - -void LED_PrintValueFP(unsigned char x, unsigned char y, unsigned int data, unsigned char num) -{ - unsigned char m,i,j,k; - LED_P6x8Char(x, y, '.'); - m= data/1000; - i = (data%1000)/100; - j = (data%100)/10; - k = data%10; - switch(num) - { - case 1: LED_P6x8Char(x+6,y,k+48); - break; - case 2: LED_P6x8Char(x+6,y,j+48); - LED_P6x8Char(x+12,y,k+48); - break; - case 3: LED_P6x8Char(x+6,y,i+48); - LED_P6x8Char(x+12,y,j+48); - LED_P6x8Char(x+18,y,k+48); - break; - case 4: LED_P6x8Char(x+6,y,m+48); - LED_P6x8Char(x+12,y,i+48); - LED_P6x8Char(x+18,y,j+48); - LED_P6x8Char(x+24,y,k+48); - break; - } -} - - -void LED_PrintValueF(unsigned char x, unsigned char y, float data, unsigned char num) -{ - unsigned char l,m,i,j,k; - unsigned char databiti = 6; - unsigned int tempdataui = 0; - int tempdataii = (int)data; - long int tempdatalp = (long int)((data - (int)data)*10000); - - - if(data < 0.0000001) LED_P6x8Char(x, y,'-'); - else LED_P6x8Char(x, y,'+'); - if(tempdataii < 0)tempdataii = - tempdataii; - tempdataui = tempdataii; - l = tempdataui/10000; - m= (tempdataui%10000)/1000; - i = (tempdataui%1000)/100; - j = (tempdataui%100)/10; - k = tempdataui%10; - if (l != 0) - { - LED_P6x8Char(x+6,y,l+48); - LED_P6x8Char(x+12,y,m+48); - LED_P6x8Char(x+18,y,i+48); - LED_P6x8Char(x+24,y,j+48); - LED_P6x8Char(x+30,y,k+48); - } - else if(m != 0) - { - databiti = 5; - LED_P6x8Char(x+6,y,m+48); - LED_P6x8Char(x+12,y,i+48); - LED_P6x8Char(x+18,y,j+48); - LED_P6x8Char(x+24,y,k+48); - } - else if(i != 0) - { - databiti = 4; - LED_P6x8Char(x+6,y,i+48); - LED_P6x8Char(x+12,y,j+48); - LED_P6x8Char(x+18,y,k+48); - } - else if(j != 0) - { - databiti = 3; - LED_P6x8Char(x+6,y,j+48); - LED_P6x8Char(x+12,y,k+48); - } - else - { - databiti = 2; - LED_P6x8Char(x+6,y,k+48); - } - if(tempdatalp < 0)tempdatalp = - tempdatalp; - switch(num) - { - case 0: break; - case 1: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp / 1000),num);break; - case 2: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp / 100),num);break; - case 3: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp / 10),num);break; - case 4: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp),num);break; - } -} +//void LED_PrintValueC(unsigned char x, unsigned char y, char data) +//{ +// unsigned char i,j,k; +// if(data < 0) +// { +// LED_P6x8Char(x,y,'-'); +// data = - data; +// } +// else +// { +// LED_P6x8Char(x,y,'+'); +// } +// i = data/100; +// j = (data%100)/10; +// k = data%10; +// LED_P6x8Char(x+6,y,i+48); +// LED_P6x8Char(x+12,y,j+48); +// LED_P6x8Char(x+18,y,k+48); +//} +// +// +//void LED_PrintValueI(unsigned char x, unsigned char y, int data) +//{ +// unsigned char i,j,k,l,m; +// if(data < 0) +// { +// LED_P6x8Char(x,y,'-'); +// data = - data; +// } +//// else +//// { +//// LED_P6x8Char(x,y,'+'); +//// } +// +// l = data/10000; +// m= (data%10000)/1000; +// i = (data%1000)/100; +// j = (data%100)/10; +// k = data%10; +// +// unsigned char c; +// c = (l == 0) ? ' ' : (l + 48); LED_P6x8Char(x+6,y,c); +// c = (m == 0 && l == 0) ? ' ' : (m + 48); LED_P6x8Char(x+12,y,c); +// c = (i == 0 && m == 0 && l == 0) ? ' ' : (i + 48); LED_P6x8Char(x+18,y,c); +// c = (j == 0 && i == 0 && m == 0 && l == 0) ? ' ' : (j + 48); LED_P6x8Char(x+24,y,c); +// LED_P6x8Char(x+30,y,k+48); +//} +// +//void LED_PrintValueFP(unsigned char x, unsigned char y, unsigned int data, unsigned char num) +//{ +// unsigned char m,i,j,k; +// LED_P6x8Char(x, y, '.'); +// m= data/1000; +// i = (data%1000)/100; +// j = (data%100)/10; +// k = data%10; +// switch(num) +// { +// case 1: LED_P6x8Char(x+6,y,k+48); +// break; +// case 2: LED_P6x8Char(x+6,y,j+48); +// LED_P6x8Char(x+12,y,k+48); +// break; +// case 3: LED_P6x8Char(x+6,y,i+48); +// LED_P6x8Char(x+12,y,j+48); +// LED_P6x8Char(x+18,y,k+48); +// break; +// case 4: LED_P6x8Char(x+6,y,m+48); +// LED_P6x8Char(x+12,y,i+48); +// LED_P6x8Char(x+18,y,j+48); +// LED_P6x8Char(x+24,y,k+48); +// break; +// } +//} +// +// +//void LED_PrintValueF(unsigned char x, unsigned char y, float data, unsigned char num) +//{ +// unsigned char l,m,i,j,k; +// unsigned char databiti = 6; +// unsigned int tempdataui = 0; +// int tempdataii = (int)data; +// long int tempdatalp = (long int)((data - (int)data)*10000); +// +// +// if(data < 0.0000001) LED_P6x8Char(x, y,'-'); +// else LED_P6x8Char(x, y,'+'); +// if(tempdataii < 0)tempdataii = - tempdataii; +// tempdataui = tempdataii; +// l = tempdataui/10000; +// m= (tempdataui%10000)/1000; +// i = (tempdataui%1000)/100; +// j = (tempdataui%100)/10; +// k = tempdataui%10; +// if (l != 0) +// { +// LED_P6x8Char(x+6,y,l+48); +// LED_P6x8Char(x+12,y,m+48); +// LED_P6x8Char(x+18,y,i+48); +// LED_P6x8Char(x+24,y,j+48); +// LED_P6x8Char(x+30,y,k+48); +// } +// else if(m != 0) +// { +// databiti = 5; +// LED_P6x8Char(x+6,y,m+48); +// LED_P6x8Char(x+12,y,i+48); +// LED_P6x8Char(x+18,y,j+48); +// LED_P6x8Char(x+24,y,k+48); +// } +// else if(i != 0) +// { +// databiti = 4; +// LED_P6x8Char(x+6,y,i+48); +// LED_P6x8Char(x+12,y,j+48); +// LED_P6x8Char(x+18,y,k+48); +// } +// else if(j != 0) +// { +// databiti = 3; +// LED_P6x8Char(x+6,y,j+48); +// LED_P6x8Char(x+12,y,k+48); +// } +// else +// { +// databiti = 2; +// LED_P6x8Char(x+6,y,k+48); +// } +// if(tempdatalp < 0)tempdatalp = - tempdatalp; +// switch(num) +// { +// case 0: break; +// case 1: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp / 1000),num);break; +// case 2: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp / 100),num);break; +// case 3: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp / 10),num);break; +// case 4: LED_PrintValueFP(x + databiti * 6, y, (unsigned int)(tempdatalp),num);break; +// } +//} void LED_Cursor(unsigned char cursor_column, unsigned char cursor_row) { diff --git a/my_src/oled.h b/my_src/oled.h index d74f035..23d2ad3 100644 --- a/my_src/oled.h +++ b/my_src/oled.h @@ -15,6 +15,7 @@ * Adapted from Arduino to STM32 HAL by wollud1969 */ +void LED_Init(void); void LED_CLS(void); void LED_Set_Pos(unsigned char x,unsigned char y);//Set the coordinate @@ -25,9 +26,9 @@ void LED_P8x16Str(unsigned char x,unsigned char y,char ch[]); void LED_PrintBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bmp[]); void LED_Fill(unsigned char dat); -void LED_PrintValueC(unsigned char x, unsigned char y,char data); -void LED_PrintValueI(unsigned char x, unsigned char y, int data); -void LED_PrintValueF(unsigned char x, unsigned char y, float data, unsigned char num); +//void LED_PrintValueC(unsigned char x, unsigned char y,char data); +//void LED_PrintValueI(unsigned char x, unsigned char y, int data); +//void LED_PrintValueF(unsigned char x, unsigned char y, float data, unsigned char num); void LED_PrintEdge(void); void LED_Cursor(unsigned char cursor_column, unsigned char cursor_row); void LED_PrintLine(void);