From 2060cd1233ffe4f296edfa294b2b43da29e50bf1 Mon Sep 17 00:00:00 2001 From: Charlez Kwan Date: Thu, 6 Feb 2020 13:29:37 +0100 Subject: [PATCH] First working prototype --- Inc/main.h | 2 + Src/main.c | 130 ++++++++++++++++++++++++++++++--------- User/e-Paper/EPD_1in54.c | 2 +- 3 files changed, 104 insertions(+), 30 deletions(-) diff --git a/Inc/main.h b/Inc/main.h index 1789065..33bc934 100644 --- a/Inc/main.h +++ b/Inc/main.h @@ -86,6 +86,8 @@ void Error_Handler(void); #define BUSY_GPIO_Port GPIOA #define SPI_CS_Pin GPIO_PIN_4 #define SPI_CS_GPIO_Port GPIOA +#define TimerControl_Pin GPIO_PIN_10 +#define TimerControl_GPIO_Port GPIOB #define ButtonLeft_Pin GPIO_PIN_12 #define ButtonLeft_GPIO_Port GPIOB #define ButtonPress_Pin GPIO_PIN_13 diff --git a/Src/main.c b/Src/main.c index 654acf2..c2c4f5b 100644 --- a/Src/main.c +++ b/Src/main.c @@ -47,6 +47,7 @@ #include "DEV_Config.h" #include "GUI_Paint.h" #include "ImageData.h" +#include "eeprom.h" #include #include /* USER CODE END Includes */ @@ -95,7 +96,7 @@ const uint8_t WeekLetter[7][2]={ enum Mode{Running, Choose, Set, Offscreen}; uint8_t system_mode = Running; uint8_t setWeekday,weekday,hour,minsec; -uint8_t selector_pos; +uint8_t selector_pos = 0; //Create a new image cache UBYTE *BlackImage; UWORD Imagesize = ((EPD_WIDTH % 8 == 0) ? (EPD_WIDTH / 8) : (EPD_WIDTH / 8 + 1)) * EPD_HEIGHT; @@ -113,6 +114,8 @@ void Paint_DrawArray(void); void Paint_DrawCurrent(void); void Paint_Drawonoff(bool); void Paint_Selector(bool, uint8_t,uint8_t); +void System_bjt_output(bool); +void System_screenfullupdate(bool); bool System_fire(void); bool System_CustomHeartbeat(uint8_t); void ButtonLeft_Pressed(void); @@ -124,6 +127,8 @@ void Change_selectorpos(bool); void Change_time(uint8_t,bool); void Read_intosettime(void); void Write_intostime(void); +void Eeprom_loadsettings(void); +void Eeprom_savesettings(void); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ @@ -186,33 +191,35 @@ int main(void) printf("e-Paper init failed\r\n"); } Paint_SelectImage(BlackImage); + Eeprom_loadsettings(); - selector_pos = 0; for (;;){ HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); // Get Time HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); // Get Date sPaint_time.Hour = sTime.Hours; sPaint_time.Min = sTime.Minutes; sPaint_time.Sec = sTime.Seconds; -// printf("hour %i :",sPaint_time.Hour); -// printf("min %i :",sPaint_time.Min); if(system_mode!=Offscreen){ - +// System_screenfullupdate(System_CustomHeartbeat(1)); + Paint_SelectImage(BlackImage); Paint_Clear(WHITE); Paint_DrawArray(); Paint_DrawCurrent(); Paint_Selector(System_CustomHeartbeat(2),selector_pos, system_mode); - }else{ - Paint_Clear(WHITE); - Paint_DrawString_EN(0,0,"You can remove the monitor",&Font16,WHITE,BLACK); + Paint_Drawonoff(System_fire()); + EPD_Display(BlackImage); + DEV_Delay_ms(50); //Analog clock 1s + } - Paint_Drawonoff(System_fire()); -// printf("sTime hour:", sTime.Hours); -// printf(" : sTime min :", sTime.Minutes); -// printf("\r\n"); - EPD_Display(BlackImage); - DEV_Delay_ms(50); //Analog clock 1s + System_bjt_output(System_fire()); +// else{ +// Paint_Clear(WHITE); +// Paint_DrawString_EN(0,0,"You can remove the monitor",&Font16,WHITE,BLACK); +// EPD_Display(BlackImage); +// DEV_Delay_ms(50); //Analog clock 1s +// EPD_Sleep(); +// } // printf("500ms..\r\n"); if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)){ ButtonLeft_Pressed(); @@ -224,11 +231,31 @@ int main(void) ButtonRight_Pressed(); } if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)){ - if(system_mode == Running){ - system_mode = Offscreen; - }else{ - system_mode = Running; - } + HAL_Delay(100); + if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)){ + if(system_mode == Running){ + for(uint8_t i = 0 ; i<3 ;i++){ + system_mode = Offscreen; + Paint_Clear(WHITE); + Paint_DrawString_EN(0,0,"You can remove the monitor",&Font16,WHITE,BLACK); + EPD_Display(BlackImage); + DEV_Delay_ms(200); //Analog clock 1s + } + EPD_Sleep(); + + }else{ +// for(uint8_t i = 0 ; i<2 ;i++){ + //Partial refresh, example shows time + if (EPD_Init(lut_partial_update) != 0){ + printf("e-Paper init failed\r\n"); + } + Paint_SelectImage(BlackImage); + EPD_Display(BlackImage); + DEV_Delay_ms(200); +// } + system_mode = Running; + } + } } } @@ -437,7 +464,7 @@ static void MX_GPIO_Init(void) HAL_GPIO_WritePin(GPIOA, RST_Pin|DC_Pin|BUSY_Pin|SPI_CS_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, TimerControl_Pin|LED_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : RST_Pin DC_Pin BUSY_Pin SPI_CS_Pin */ GPIO_InitStruct.Pin = RST_Pin|DC_Pin|BUSY_Pin|SPI_CS_Pin; @@ -446,19 +473,19 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /*Configure GPIO pins : TimerControl_Pin LED_Pin */ + GPIO_InitStruct.Pin = TimerControl_Pin|LED_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /*Configure GPIO pins : ButtonLeft_Pin ButtonPress_Pin ButtonRight_Pin system_mode_Pin */ GPIO_InitStruct.Pin = ButtonLeft_Pin|ButtonPress_Pin|ButtonRight_Pin|system_mode_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pin : LED_Pin */ - GPIO_InitStruct.Pin = LED_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); - } /* USER CODE BEGIN 4 */ @@ -514,6 +541,11 @@ void Paint_DrawCurrent(){ // Paint_DrawTime(50,175, &sPaint_time, &Font24, WHITE, BLACK); Paint_DrawChar(140,175,WeekLetter[weekday][0],&Font20,WHITE,BLACK); Paint_DrawChar(152,175,WeekLetter[weekday][1],&Font20,WHITE,BLACK); + + //debug + Paint_DrawChar(0 , 175, value[sPaint_time.Sec / 10] , &Font24, WHITE, BLACK); + Paint_DrawChar(15 , 175, value[sPaint_time.Sec % 10] , &Font24, WHITE, BLACK); + } void Paint_Drawonoff(bool draw_yes){ @@ -548,7 +580,27 @@ void Paint_Selector(bool heartbeat,uint8_t pos, uint8_t runningmode){ } -bool System_fire(){ // TODO the comparison is still wrong( same start hour but different end hour doesnt work) +void System_bjt_output(bool on){ + if(on){ + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET); + }else{ + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET); + } +} + +void System_screenfullupdate(bool heartbeat){ + if(heartbeat){ + if (EPD_Init(lut_full_update) != 0){ + printf("e-Paper init failed\r\n"); + } + }else{ + if (EPD_Init(lut_partial_update) != 0){ + printf("e-Paper init failed\r\n"); + } + } +} + +bool System_fire(){ uint16_t Activetime_length_min=0, Currenttime_length_min=0; @@ -645,7 +697,9 @@ void ButtonPress_Pressed(void){ } } } - + if(system_mode == Set){ + Eeprom_savesettings(); + } Change_systemmode(); }; //keep it short, executed in ISR @@ -758,6 +812,24 @@ void Write_intostime(){ sDate.Date = setWeekday + 2; //date hack because the RTC auto detect the weekday from the date } +void Eeprom_loadsettings(){ + for(uint8_t i=0 ; i < 7 ; i++){ + sSetStart[i].Hours = (uint8_t) (readEEPROMHalfWord(2*i) >> 8); + sSetStart[i].Minutes = (uint8_t) readEEPROMHalfWord(2*i); + sSetEnd[i].Hours = (uint8_t) (readEEPROMHalfWord(2*i + 14) >> 8); + sSetEnd[i].Minutes = (uint8_t) readEEPROMHalfWord(2*i + 14); + } +} + +void Eeprom_savesettings(){ + enableEEPROMWriting(); + for(uint8_t i = 0; i < 7; i++){ + writeEEPROMHalfWord(2*i,sSetStart[i].Hours << 8 | sSetStart[i].Minutes); + writeEEPROMHalfWord(2*i + 14,sSetEnd[i].Hours << 8 | sSetEnd[i].Minutes); + } + disableEEPROMWriting(); +} + int __io_putchar(int ch){ uint8_t c[1]; c[0] = ch & 0x00FF; diff --git a/User/e-Paper/EPD_1in54.c b/User/e-Paper/EPD_1in54.c index 0d8e2cd..0bbea39 100644 --- a/User/e-Paper/EPD_1in54.c +++ b/User/e-Paper/EPD_1in54.c @@ -236,5 +236,5 @@ void EPD_Sleep(void) { EPD_SendCommand(DEEP_SLEEP_MODE); EPD_SendData(0x01); - // EPD_WaitUntilIdle(); + EPD_WaitUntilIdle(); }