Wakeup Light with touch user interface, anti-aliased Font, SD card access and RTC usage on STM32F746NG-DISCO board
Dependencies: BSP_DISCO_F746NG_patch_fixed LCD_DISCO_F746NG TS_DISCO_F746NG FATFileSystem TinyJpgDec_interwork mbed-src
Diff: UI.cpp
- Revision:
- 5:13c70bcde7f6
- Parent:
- 3:ecf7f1f8d749
- Child:
- 6:aa51cc3b9f90
--- a/UI.cpp Thu Oct 29 19:02:38 2015 +0000 +++ b/UI.cpp Mon Nov 09 17:53:22 2015 +0000 @@ -10,13 +10,22 @@ #define CLOCK_COLOR_BG ((uint32_t)0xFF000000) #define CLOCK_COLOR_FG ((uint32_t)0xFF707070) +#define BUTTON_WIDTH 100 +#define BUTTON_HEIGHT 60 +#define BUTTON_COLOR_BG ((uint32_t)0x00000000) +#define BUTTON_COLOR_FG CLIENT_COLOR_FG +#define BUTTON_COLOR_BG_START 0x0C2696 +#define BUTTON_COLOR_BG_END 0x07185E + #define COLOR_BG ((uint32_t)0xFF000000) #define MAX_BOXES_PER_LINE 3 #define BOX_SPACING 10 #define BOX_TEXT_SPACING 10 -#define BOX_COLOR_BG ((uint32_t)0xFF808080) +#define BOX_COLOR_BG BUTTON_COLOR_BG #define BOX_COLOR_FG CLIENT_COLOR_FG +#define BOX_COLOR_BG_START BUTTON_COLOR_BG_START +#define BOX_COLOR_BG_END BUTTON_COLOR_BG_END LCD_DISCO_F746NG uiLcd; TS_DISCO_F746NG uiTs; @@ -25,11 +34,12 @@ UI_STRUCT *uiCurrent=NULL; UI_STRUCT uiClock; UI_STRUCT uiClockInWords; +UI_STRUCT uiColorTest; UI_STRUCT uiWakeup; UI_STRUCT uiMain; UI_BOX_LIST_ITEM_STRUCT uiMainItems[]= { - { "Clock" }, { "Clock\nWith Words" }, { "Adjust\nTimers" }, { "Lights On" }, { "Lights Off" } + { "Clock" }, { "Clock\nWith Words" }, { "Adjust\nTimers" }, { "Lights On" }, { "Lights Off" }, { "Color Test" } }; // @@ -38,7 +48,7 @@ void UI_ShowClearClientRect(void) { uiLcd.SetTextColor(CLIENT_COLOR_BG); - uiLcd.FillRect(0,HEADER_HEIGHT,uiLcd.GetXSize()-1,uiLcd.GetYSize()-1); + uiLcd.FillRect(0,HEADER_HEIGHT,uiLcd.GetXSize(),uiLcd.GetYSize()-HEADER_HEIGHT); } void UI_ShowDisplayText(int16_t x,int16_t y,char *text) @@ -67,7 +77,75 @@ text++; } } - + +void UI_ShowDisplayTextCenter(int16_t x,int16_t y,int16_t width,int16_t height,char *text) +{ + int16_t charWidth; + int16_t charHeight; + + charHeight=uiLcd.GetFont()->Height+3; + charWidth=uiLcd.GetFont()->Width; + + x+=((width-(strlen(text)*charWidth))/2); + y+=((height-charHeight)/2); + + while ((*text)!='\0') + { + uiLcd.DisplayChar(x,y,*text); + x+=charWidth; + + text++; + } +} + +void UI_ShowDrawGradientButton(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint32_t colorStart,uint32_t colorEnd) +{ + float deltaRed; + float deltaGreen; + float deltaBlue; + float red; + float green; + float blue; + uint16_t offset; + uint32_t color; + + deltaRed=(float)((int32_t)(colorEnd & 0xFF) - (int32_t)(colorStart & 0xFF))/height; + deltaGreen=(float)((int32_t)((colorEnd >> 8) & 0xFF) - (int32_t)((colorStart >> 8)& 0xFF))/height; + deltaBlue=(float)((int32_t)((colorEnd >> 16) & 0xFF) - (int32_t)((colorStart >> 16)& 0xFF))/height; + + red=colorStart & 0xFF; + green=((colorStart >> 8)& 0xFF); + blue=((colorStart >> 16)& 0xFF); + + for (offset=0;offset<height;offset++) + { + color=(uint8_t)red | (((uint8_t)green)<<8) | (((uint8_t)blue)<<16) | (((uint32_t)0xFF)<<24); + uiLcd.SetTextColor(color); + + if ((offset==0) || (offset==(height-1))) + uiLcd.DrawHLine(x+1,y+offset,width-2); + else + uiLcd.DrawHLine(x,y+offset,width); + + red+=deltaRed; + green+=deltaGreen; + blue+=deltaBlue; + } +} + +void UI_ShowDrawButton(uint16_t x,uint16_t y,char *text) +{ + // paint button background + UI_ShowDrawGradientButton(x,y,BUTTON_WIDTH,BUTTON_HEIGHT,BUTTON_COLOR_BG_START,BUTTON_COLOR_BG_END); + + // paint button text + uiLcd.SetFont(&display_font_12x22); + uiLcd.SetBackColor(BUTTON_COLOR_BG); + uiLcd.SetTextColor(BUTTON_COLOR_FG); + + UI_ShowDisplayTextCenter(x,y,BUTTON_WIDTH,BUTTON_HEIGHT,text); +} + // // box list // @@ -103,16 +181,15 @@ startY=HEADER_HEIGHT+BOX_SPACING+(height*(box/columns)); // paint box background - uiLcd.SetTextColor(BOX_COLOR_BG); - uiLcd.FillRect(startX,startY,width-BOX_SPACING,height-BOX_SPACING); - + UI_ShowDrawGradientButton(startX,startY,width-BOX_SPACING,height-BOX_SPACING,BOX_COLOR_BG_START,BOX_COLOR_BG_END); + // paint box text uiLcd.SetFont(&display_font_12x22); uiLcd.SetBackColor(BOX_COLOR_BG); uiLcd.SetTextColor(BOX_COLOR_FG); UI_ShowDisplayText(startX+BOX_TEXT_SPACING,startY+BOX_TEXT_SPACING,uiCurrent->data.boxList.items[box].name); } - } + } } void UI_ClickBoxList(uint16_t x,uint16_t y) @@ -187,7 +264,7 @@ { // fill background uiLcd.SetTextColor(CLOCK_COLOR_BG); - uiLcd.FillRect(0,0,uiLcd.GetXSize()-1,uiLcd.GetYSize()-1); + uiLcd.FillRect(0,0,uiLcd.GetXSize(),uiLcd.GetYSize()); } // show clock @@ -244,25 +321,85 @@ } // -// timer adjust +// value adjust // -void UI_ShowTimerAdjust(bool initial) +void UI_ShowValueAdjust(bool initial) { + char buffer[20]; + if (initial==true) { // fill background UI_ShowClearClientRect(); + + if (uiCurrent->data.valueAdjust.count==4) + { + UI_ShowDrawButton(17+(0*(BUTTON_WIDTH+15)),40,"+"); + UI_ShowDrawButton(17+(1*(BUTTON_WIDTH+15)),40,"+"); + UI_ShowDrawButton(17+(2*(BUTTON_WIDTH+15)),40,"+"); + UI_ShowDrawButton(17+(3*(BUTTON_WIDTH+15)),40,"+"); + + UI_ShowDrawButton(17+(0*(BUTTON_WIDTH+15)),205,"-"); + UI_ShowDrawButton(17+(1*(BUTTON_WIDTH+15)),205,"-"); + UI_ShowDrawButton(17+(2*(BUTTON_WIDTH+15)),205,"-"); + UI_ShowDrawButton(17+(3*(BUTTON_WIDTH+15)),205,"-"); + } + } + + uiLcd.SetBackColor(CLIENT_COLOR_BG); + uiLcd.SetTextColor(CLIENT_COLOR_FG); + + if (uiCurrent->data.valueAdjust.count==4) + { + snprintf(buffer,sizeof(buffer),"0x%02X",uiCurrent->data.valueAdjust.values[0]); + UI_ShowDisplayTextCenter(17+(0*(BUTTON_WIDTH+15)),125,BUTTON_WIDTH,BUTTON_HEIGHT,buffer); + + snprintf(buffer,sizeof(buffer),"0x%02X",uiCurrent->data.valueAdjust.values[1]); + UI_ShowDisplayTextCenter(17+(1*(BUTTON_WIDTH+15)),125,BUTTON_WIDTH,BUTTON_HEIGHT,buffer); + + snprintf(buffer,sizeof(buffer),"0x%02X",uiCurrent->data.valueAdjust.values[2]); + UI_ShowDisplayTextCenter(17+(2*(BUTTON_WIDTH+15)),125,BUTTON_WIDTH,BUTTON_HEIGHT,buffer); + + snprintf(buffer,sizeof(buffer),"0x%02X",uiCurrent->data.valueAdjust.values[3]); + UI_ShowDisplayTextCenter(17+(3*(BUTTON_WIDTH+15)),125,BUTTON_WIDTH,BUTTON_HEIGHT,buffer); } } -void UI_ClickTimerAdjust(uint16_t x,uint16_t y) +void UI_ClickValueAdjust(uint16_t x,uint16_t y) { - uint32_t index; + int32_t index; // detect at which button was clicked - index=0; + index=-1; - uiCurrent->handler(UR_CLICK,index,uiCurrent); + if (uiCurrent->data.valueAdjust.count==4) + { + if ((y>=40) && (y<(40+BUTTON_HEIGHT))) + { + if ((x>=(17+(0*(BUTTON_WIDTH+15)))) && (x<(17+(0*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=0; + else if ((x>=(17+(1*(BUTTON_WIDTH+15)))) && (x<(17+(1*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=1; + else if ((x>=(17+(2*(BUTTON_WIDTH+15)))) && (x<(17+(2*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=2; + else if ((x>=(17+(3*(BUTTON_WIDTH+15)))) && (x<(17+(3*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=3; + } + else if ((y>=205) && (y<(205+BUTTON_HEIGHT))) + { + if ((x>=(17+(0*(BUTTON_WIDTH+15)))) && (x<(17+(0*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=4; + else if ((x>=(17+(1*(BUTTON_WIDTH+15)))) && (x<(17+(1*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=5; + else if ((x>=(17+(2*(BUTTON_WIDTH+15)))) && (x<(17+(2*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=6; + else if ((x>=(17+(3*(BUTTON_WIDTH+15)))) && (x<(17+(3*(BUTTON_WIDTH+15))+BUTTON_WIDTH))) + index=7; + } + } + + if (index!=-1) + uiCurrent->handler(UR_CLICK,index,uiCurrent); } // @@ -286,10 +423,21 @@ // setup ui structs uiClock.flags=UI_FLAG_TYPE_CLOCK; uiClock.handler=NULL; + uiClockInWords.flags=UI_FLAG_TYPE_CLOCK_IN_WORDS; uiClockInWords.handler=NULL; + uiWakeup.flags=UI_FLAG_TYPE_BOX_LIST; uiWakeup.handler=UI_WakeupHandler; + + uiColorTest.flags=UI_FLAG_TYPE_VALUE_ADJUST; + uiColorTest.handler=UI_ColorTestHandler; + uiColorTest.data.valueAdjust.count=4; + uiColorTest.data.valueAdjust.values[0]=0x80; + uiColorTest.data.valueAdjust.values[1]=0x80; + uiColorTest.data.valueAdjust.values[2]=0x80; + uiColorTest.data.valueAdjust.values[3]=0x80; + uiMain.flags=UI_FLAG_TYPE_BOX_LIST; uiMain.handler=UI_MainHandler; uiMain.data.boxList.items=uiMainItems; @@ -308,7 +456,13 @@ { // fill background uiLcd.SetTextColor(HEADER_COLOR_BG); - uiLcd.FillRect(0,0,uiLcd.GetXSize()-1,HEADER_HEIGHT); + uiLcd.FillRect(0,0,uiLcd.GetXSize(),HEADER_HEIGHT); + + uiLcd.SetFont(&display_font_12x22); + uiLcd.SetBackColor(HEADER_COLOR_BG); + uiLcd.SetTextColor(HEADER_COLOR_FG); + if ((uiCurrent->flags & UI_FLAG_HAS_BACK_BUTTON)!=0) + uiLcd.DisplayStringAt(5,2,(uint8_t *)"<-",LEFT_MODE); } // show clock @@ -331,7 +485,7 @@ if ((uiCurrent->flags & UI_FLAG_NEEDS_CHROME)!=0) UI_ShowChrome(initial); - typeFlag=uiCurrent->flags & ~UI_FLAG_NEEDS_CHROME; + typeFlag=uiCurrent->flags & ~(UI_FLAG_NEEDS_CHROME | UI_FLAG_HAS_BACK_BUTTON); if ((typeFlag & UI_FLAG_TYPE_BOX_LIST)!=0) UI_ShowBoxList(initial); else if ((typeFlag & UI_FLAG_TYPE_MESSAGE_BOX)!=0) @@ -340,13 +494,13 @@ UI_ShowClock(initial); else if ((typeFlag & UI_FLAG_TYPE_CLOCK_IN_WORDS)!=0) UI_ShowClockInWords(initial); - else if ((typeFlag & UI_FLAG_TYPE_TIMER_ADJUST)!=0) - UI_ShowTimerAdjust(initial); + else if ((typeFlag & UI_FLAG_TYPE_VALUE_ADJUST)!=0) + UI_ShowValueAdjust(initial); } void UI_Show(UI_STRUCT *ui) { - DPrintf("UI_Show: 0x%X.\r\n",ui->flags); + DPrintf_("UI_Show: 0x%X.\r\n",ui->flags); uiCurrent=ui; @@ -360,7 +514,21 @@ { uint8_t typeFlag; - typeFlag=uiCurrent->flags & ~UI_FLAG_NEEDS_CHROME; + DPrintf_("UI_Click: %u x %u.\r\n",x,y); + + if ((uiCurrent->flags & UI_FLAG_HAS_BACK_BUTTON)!=0) + { + if ((y<40) && (x<40)) + { + if (uiCurrent->handler!=NULL) + { + uiCurrent->handler(UR_CLICK,-1,uiCurrent); + return; + } + } + } + + typeFlag=uiCurrent->flags & ~(UI_FLAG_NEEDS_CHROME | UI_FLAG_HAS_BACK_BUTTON); if ((typeFlag & UI_FLAG_TYPE_BOX_LIST)!=0) UI_ClickBoxList(x,y); else if ((typeFlag & UI_FLAG_TYPE_MESSAGE_BOX)!=0) @@ -369,8 +537,8 @@ UI_ClickClock(x,y); else if ((typeFlag & UI_FLAG_TYPE_CLOCK_IN_WORDS)!=0) UI_ClickClockInWords(x,y); - else if ((typeFlag & UI_FLAG_TYPE_TIMER_ADJUST)!=0) - UI_ClickTimerAdjust(x,y); + else if ((typeFlag & UI_FLAG_TYPE_VALUE_ADJUST)!=0) + UI_ClickValueAdjust(x,y); } void UI_Poll(void) @@ -385,7 +553,7 @@ (ABS(uiLastTouchY-tsState.touchY[0])>4) ) { - DPrintf("UI_Poll: #%u - %ux%u.\r\n",tsState.touchDetected,tsState.touchX[0],tsState.touchY[0]); + DPrintf_("UI_Poll: #%u - %ux%u.\r\n",tsState.touchDetected,tsState.touchX[0],tsState.touchY[0]); uiLastTouchX=tsState.touchX[0]; uiLastTouchY=tsState.touchY[0]; @@ -394,6 +562,11 @@ UI_Click(tsState.touchX[0],tsState.touchY[0]); } } + else + { + uiLastTouchX=0; + uiLastTouchY=0; + } if (uiCurrent!=NULL) {