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

Revision:
2:80026d18fcf3
Child:
3:ecf7f1f8d749
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UI.cpp	Thu Oct 29 12:59:54 2015 +0000
@@ -0,0 +1,233 @@
+#include "WakeupLight.h"
+
+#define CLIENT_COLOR_BG         ((uint32_t)0xFF602020)
+#define CLIENT_COLOR_FG         ((uint32_t)0xFFD0D0D0)
+
+#define HEADER_HEIGHT           25
+#define HEADER_COLOR_BG         ((uint32_t)0xFF404040)
+#define HEADER_COLOR_FG         ((uint32_t)0xFFD3D3D3)
+
+#define CLOCK_COLOR_BG          ((uint32_t)0xFF000000)
+#define CLOCK_COLOR_FG          ((uint32_t)0xFF707070)
+
+#define COLOR_BG                ((uint32_t)0xFF000000)
+
+LCD_DISCO_F746NG                uiLcd;
+TS_DISCO_F746NG                 uiTs;
+int32_t                         uiCounter=0;
+UI_STRUCT                       *uiCurrent=NULL;
+
+//
+// helper function
+//
+void UI_ShowClearClientRect(void)
+{
+    uiLcd.SetTextColor(CLIENT_COLOR_BG);
+    uiLcd.FillRect(0,HEADER_HEIGHT,uiLcd.GetXSize()-1,uiLcd.GetYSize()-1);
+}
+
+//
+// box list
+//
+void UI_ShowBoxList(bool initial)
+{
+    if (initial==true)
+    {
+        // fill background
+        UI_ShowClearClientRect();
+    }
+}
+
+void UI_ClickBoxList(uint16_t x,uint16_t y)
+{
+    // detect at which block was clicked
+}
+
+//
+// message box
+//
+void UI_ShowMessageBox(bool initial)
+{
+    if (initial==true)
+    {
+        // fill background
+        UI_ShowClearClientRect();
+    }
+}
+
+void UI_ClickMessageBox(uint16_t x,uint16_t y)
+{
+    // detect at which button was clicked
+}
+
+//
+// clock
+//
+void UI_ShowClock(bool initial)
+{
+    char                        buffer[100];
+
+    if (initial==true)
+    {
+        // fill background
+        uiLcd.SetTextColor(CLOCK_COLOR_BG);
+        uiLcd.FillRect(0,0,uiLcd.GetXSize()-1,uiLcd.GetYSize()-1);
+    }
+
+    // show clock
+    uiLcd.SetFont(&display_font_12x22);
+    uiLcd.SetBackColor(CLOCK_COLOR_BG);
+    uiLcd.SetTextColor(CLOCK_COLOR_FG);
+    snprintf(buffer,sizeof(buffer),"ABC %u",uiCounter);
+    uiCounter++;
+    uiLcd.DisplayStringAt(0,100,(uint8_t *)buffer,CENTER_MODE);
+}
+
+void UI_ClickClock(uint16_t x,uint16_t y)
+{
+    // exit view
+}
+
+//
+// clock in words
+//
+void UI_ShowClockInWords(bool initial)
+{
+    if (initial==true)
+    {
+        // fill background
+        UI_ShowClearClientRect();
+    }
+
+    // show clock in words
+    uiLcd.SetFont(&display_font_12x22);
+    uiLcd.SetBackColor(CLIENT_COLOR_BG);
+    uiLcd.SetTextColor(CLIENT_COLOR_FG);
+    uiLcd.DisplayStringAt(5,30,(uint8_t *)"UM F\x9ANF ZEHN VIERTEL HALB",LEFT_MODE);
+    uiLcd.DisplayStringAt(5,60,(uint8_t *)"NACH VOR",LEFT_MODE);
+    uiLcd.DisplayStringAt(5,90,(uint8_t *)"EINS ZWEI DREI VIER",LEFT_MODE);
+    uiLcd.DisplayStringAt(5,120,(uint8_t *)"F\x9ANF SECHS SIEBEN ACHT",LEFT_MODE);
+    uiLcd.DisplayStringAt(5,150,(uint8_t *)"NEUN ZEHN ELF ZW\x99LF",LEFT_MODE);
+
+    // draw charset
+    /*
+    int x;
+    for (x=0x80;x<=0xFF;x++)
+    {
+        uiLcd.DisplayChar(1+(((x-0x80) % 16)*14),30+(((x-0x80)/16)*20),x);
+    }
+    */
+}
+
+void UI_ClickClockInWords(uint16_t x,uint16_t y)
+{
+    // exit view
+}
+
+//
+// timer adjust
+//
+void UI_ShowTimerAdjust(bool initial)
+{
+    if (initial==true)
+    {
+        // fill background
+        UI_ShowClearClientRect();
+    }
+}
+
+void UI_ClickTimerAdjust(uint16_t x,uint16_t y)
+{
+    // detect at which button was clicked
+}
+
+//
+// common
+//
+void UI_Init(void)
+{
+    uiCurrent=NULL;
+
+    uiLcd.Init();
+    uiLcd.Clear(COLOR_BG);
+
+    if (uiTs.Init(uiLcd.GetXSize(),uiLcd.GetYSize())==TS_OK)
+        DPrintf("UI_Init: Size: %ux%u.\r\n",uiLcd.GetXSize(),uiLcd.GetYSize());
+    else
+        DPrintf("UI_Init: Can't init touch screen.\r\n");
+}
+
+void UI_ShowChrome(bool initial)
+{
+    char                        buffer[100];
+
+    if (initial==true)
+    {
+        // fill background
+        uiLcd.SetTextColor(HEADER_COLOR_BG);
+        uiLcd.FillRect(0,0,uiLcd.GetXSize()-1,HEADER_HEIGHT);
+    }
+
+    // show clock
+    uiLcd.SetFont(&display_font_12x22);
+    uiLcd.SetBackColor(HEADER_COLOR_BG);
+    uiLcd.SetTextColor(HEADER_COLOR_FG);
+    snprintf(buffer,sizeof(buffer),"ABC %u",uiCounter);
+    uiCounter++;
+    uiLcd.DisplayStringAt(0,3,(uint8_t *)buffer,CENTER_MODE);
+
+    // show next alarm
+}
+
+void UI_Update(bool initial)
+{
+    if ((uiCurrent->flags & UI_FLAG_NEEDS_CHROME)!=0)
+        UI_ShowChrome(initial);
+
+    if ((uiCurrent->flags & UI_FLAG_TYPE_BOX_LIST)!=0)
+        UI_ShowBoxList(initial);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_MESSAGE_BOX)!=0)
+        UI_ShowMessageBox(initial);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_CLOCK)!=0)
+        UI_ShowClock(initial);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_CLOCK_IN_WORDS)!=0)
+        UI_ShowClockInWords(initial);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_TIMER_ADJUST)!=0)
+        UI_ShowTimerAdjust(initial);
+}
+
+void UI_Show(UI_STRUCT *ui)
+{
+    uiCurrent=ui;
+
+    UI_Update(true);
+}
+
+void UI_Click(uint16_t x,uint16_t y)
+{
+    if ((uiCurrent->flags & UI_FLAG_TYPE_BOX_LIST)!=0)
+        UI_ClickBoxList(x,y);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_MESSAGE_BOX)!=0)
+        UI_ClickMessageBox(x,y);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_CLOCK)!=0)
+        UI_ClickClock(x,y);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_CLOCK_IN_WORDS)!=0)
+        UI_ClickClockInWords(x,y);
+    else if ((uiCurrent->flags & UI_FLAG_TYPE_TIMER_ADJUST)!=0)
+        UI_ClickTimerAdjust(x,y);
+}
+
+void UI_Poll(void)
+{
+    TS_StateTypeDef             tsState;
+
+    uiTs.GetState(&tsState);
+    if (tsState.touchDetected>0)
+    {
+        DPrintf("UI_Poll: #%u - %ux%u.\r\n",tsState.touchDetected,tsState.touchX[0],tsState.touchY[0]);
+        UI_Click(tsState.touchX[0],tsState.touchY[0]);
+    }
+  
+    if (uiCurrent!=NULL)
+        UI_Update(false);
+}