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:
14:2044ad5cd3fe
Parent:
13:811a5c5b3fd6
diff -r 811a5c5b3fd6 -r 2044ad5cd3fe UI.cpp
--- a/UI.cpp	Sun Jan 31 17:45:50 2016 +0000
+++ b/UI.cpp	Sun Feb 21 04:26:17 2016 +0000
@@ -9,66 +9,97 @@
 #include "Images/ic_equalizer_white_48dp_1x.h"
 #include "Images/ic_settings_white_48dp_1x.h"
 
-#define DEFAULT_FONT                    &lucidaSansUnicode_18ptFontInfo
+#define DEFAULT_FONT                            &calibri_36ptFontInfo
+
+#define CLIENT_COLOR_BG                         ((uint32_t)0xFF000000)
+#define CLIENT_COLOR_FG                         ((uint32_t)0xFFD0D0D0)
+#define CLIENT_FONT                             DEFAULT_FONT
 
-#define CLIENT_COLOR_BG                 ((uint32_t)0xFF000000)
-#define CLIENT_COLOR_FG                 ((uint32_t)0xFFD0D0D0)
-#define CLIENT_FONT                     DEFAULT_FONT
+#define HEADER_HEIGHT                           26
+#define HEADER_COLOR_BG                         ((uint32_t)0xFF000000)
+#define HEADER_LINE                             ((uint32_t)0xFF008ED8)
+#define HEADER_COLOR_FG                         ((uint32_t)0xFFD3D3D3)
+#define HEADER_FONT                             DEFAULT_FONT
 
-#define HEADER_HEIGHT                   25
-#define HEADER_COLOR_BG                 ((uint32_t)0xFF404040)
-#define HEADER_COLOR_FG                 ((uint32_t)0xFFD3D3D3)
-#define HEADER_FONT                     DEFAULT_FONT
+#define CLOCK_COLOR_BG                          ((uint32_t)0xFF000000)
+#define CLOCK_COLOR_FG                          ((uint32_t)0xFF7070A0)
+#define CLOCK_FONT                              &trebuchetMS_270ptFontInfo
+
+#define CLOCK_IN_WORDS_CELL_WIDTH               22
+#define CLOCK_IN_WORDS_CELL_HEIGHT              22
+#define CLOCK_IN_WORDS_COLOR_FG_ACTIVE          HEADER_COLOR_FG
+#define CLOCK_IN_WORDS_COLOR_FG_INACTIVE        ((uint32_t)0xFF202020)
 
-#define CLOCK_COLOR_BG                  ((uint32_t)0xFF000000)
-#define CLOCK_COLOR_FG                  ((uint32_t)0xFF707070)
-#define CLOCK_FONT                      DEFAULT_FONT
-
-#define SLIDESHOW_COLOR_BG              ((uint32_t)0xFF000000)
-#define SLIDESHOW_COLOR_FG              ((uint32_t)0xFF707070)
-#define SLIDESHOW_TRANSPARENCY          128
-#define SLIDESHOW_FADE_STEP             5
-#define SLIDESHOW_TIMEOUT               15
-#define SLIDESHOW_FONT                  DEFAULT_FONT
+#define CLOCK_IN_WORDS_TYPE_ES                  0x000001
+#define CLOCK_IN_WORDS_TYPE_IST                 0x000002
+#define CLOCK_IN_WORDS_TYPE_FUENF_1             0x000004
+#define CLOCK_IN_WORDS_TYPE_ZEHN_1              0x000008
+#define CLOCK_IN_WORDS_TYPE_ZWANZIG             0x000010
+#define CLOCK_IN_WORDS_TYPE_DREI_1              0x000020
+#define CLOCK_IN_WORDS_TYPE_VIERTEL             0x000040
+#define CLOCK_IN_WORDS_TYPE_VOR                 0x000080
+#define CLOCK_IN_WORDS_TYPE_NACH                0x000100
+#define CLOCK_IN_WORDS_TYPE_HALB                0x000200
+#define CLOCK_IN_WORDS_TYPE_ELF                 0x000400
+#define CLOCK_IN_WORDS_TYPE_FUENF_2             0x000800
+#define CLOCK_IN_WORDS_TYPE_EINS                0x001000
+#define CLOCK_IN_WORDS_TYPE_ZWEI                0x002000
+#define CLOCK_IN_WORDS_TYPE_DREI_2              0x004000
+#define CLOCK_IN_WORDS_TYPE_VIER                0x008000
+#define CLOCK_IN_WORDS_TYPE_SECHS               0x010000
+#define CLOCK_IN_WORDS_TYPE_ACHT                0x020000
+#define CLOCK_IN_WORDS_TYPE_SIEBEN              0x040000
+#define CLOCK_IN_WORDS_TYPE_ZWOELF              0x080000
+#define CLOCK_IN_WORDS_TYPE_ZEHN_2              0x100000
+#define CLOCK_IN_WORDS_TYPE_NEUN                0x200000
+#define CLOCK_IN_WORDS_TYPE_UHR                 0x400000
 
-#define BUTTON_WIDTH                    100
-#define BUTTON_HEIGHT                   60
-#define BUTTON_SMALL_WIDTH              50
-#define BUTTON_SMALL_HEIGHT             40
-#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 BUTTON_COLOR_BG_START_INACTIVE  0x515151
-#define BUTTON_COLOR_BG_END_INACTIVE    0x333333
-#define BUTTON_FONT                     DEFAULT_FONT
+#define SLIDESHOW_COLOR_BG                      ((uint32_t)0xFF000000)
+#define SLIDESHOW_COLOR_FG                      ((uint32_t)0xFFAFAFAF)
+#define SLIDESHOW_TRANSPARENCY                  128
+#define SLIDESHOW_FADE_STEP                     5
+#define SLIDESHOW_TIMEOUT                       15
+#define SLIDESHOW_FONT                          &trebuchetMS_135ptFontInfo
 
-#define COLOR_BG                        ((uint32_t)0xFF000000)
+#define BUTTON_WIDTH                            100
+#define BUTTON_HEIGHT                           60
+#define BUTTON_SMALL_WIDTH                      50
+#define BUTTON_SMALL_HEIGHT                     40
+#define BUTTON_COLOR_BG                         ((uint32_t)0x00000000)
+#define BUTTON_COLOR_FG                         CLIENT_COLOR_FG
+#define BUTTON_COLOR_BG_START                   0x008ED8                    // 0x0C2696
+#define BUTTON_COLOR_BG_END                     0x004366                    // 0x07185E
+#define BUTTON_COLOR_BG_START_INACTIVE          0x515151
+#define BUTTON_COLOR_BG_END_INACTIVE            0x333333
+#define BUTTON_FONT                             DEFAULT_FONT
+
+#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                    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
-#define BOX_FONT                        DEFAULT_FONT
+#define MAX_BOXES_PER_LINE                      3
+#define BOX_SPACING                             10
+#define BOX_TEXT_SPACING                        10
+#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
+#define BOX_FONT                                DEFAULT_FONT
 
-LCD_DISCO_F746NG                        uiLcd;
-TS_DISCO_F746NG                         uiTs;
-uint16_t                                uiLastTouchX;
-uint16_t                                uiLastTouchY;
-int                                     lastSlideshowTick=0;
-UI_STRUCT                               *uiCurrent=NULL;
-UI_STRUCT                               uiClock;
-UI_STRUCT                               uiClockInWords;
-UI_STRUCT                               uiColorTest;
-UI_STRUCT                               uiWakeup;
-UI_STRUCT                               uiSlideshow;
-UI_STRUCT                               uiMain;
-static UI_BOX_LIST_ITEM_STRUCT          uiMainItems[]=
+LCD_DISCO_F746NG                                uiLcd;
+TS_DISCO_F746NG                                 uiTs;
+uint16_t                                        uiLastTouchX;
+uint16_t                                        uiLastTouchY;
+int                                             lastSlideshowTick=0;
+struct tm                                       lastClockUpdateTime;
+UI_STRUCT                                       *uiCurrent=NULL;
+UI_STRUCT                                       uiClock;
+UI_STRUCT                                       uiClockInWords;
+UI_STRUCT                                       uiColorTest;
+UI_STRUCT                                       uiWakeup;
+UI_STRUCT                                       uiSlideshow;
+UI_STRUCT                                       uiMain;
+static UI_BOX_LIST_ITEM_STRUCT                  uiMainItems[]=
 {
-    { "Clock", ic_query_builder_white_48dp_1x }, { "Clock\nWith Words", ic_query_builder_white_48dp_1x }, { "Slideshow", ic_slideshow_white_48dp_1x }, { "Adjust\nTimers", ic_notifications_none_white_48dp_1x }, { "Adjust\nClock", ic_settings_white_48dp_1x }, { "Lights\nOn", ic_visibility_white_48dp_1x }, { "Lights\nOff", ic_visibility_off_white_48dp_1x }, { "My Color", ic_equalizer_white_48dp_1x }
+    { "Clock", ic_query_builder_white_48dp_1x }, { "Clock\nIn Words", ic_query_builder_white_48dp_1x }, { "Slideshow", ic_slideshow_white_48dp_1x }, { "Adjust\nTimers", ic_notifications_none_white_48dp_1x }, { "Settings", ic_settings_white_48dp_1x }, { "Lights\nOn", ic_visibility_white_48dp_1x }, { "Lights\nOff", ic_visibility_off_white_48dp_1x }, { "My Color", ic_equalizer_white_48dp_1x }
 };
 
 //
@@ -329,18 +360,24 @@
     char                        buffer[100];
     struct tm                   *tmStruct;
 
-    if (initial==true)
+    RTC_Get(&tmStruct);
+
+    if ((initial==true) || (tmStruct->tm_hour!=lastClockUpdateTime.tm_hour) || (tmStruct->tm_min!=lastClockUpdateTime.tm_min))
     {
         // fill background
         uiLcd.SetTextColor(CLOCK_COLOR_BG);
         uiLcd.FillRect(0,0,uiLcd.GetXSize(),uiLcd.GetYSize());
-    }
+    
+        // show clock
+        if (tmStruct->tm_hour>=10)
+            snprintf(buffer,sizeof(buffer),"%u    %u    :    %u    %u",tmStruct->tm_hour / 10,tmStruct->tm_hour % 10,tmStruct->tm_min / 10,tmStruct->tm_min % 10);
+        else
+            snprintf(buffer,sizeof(buffer),"%u    :    %u    %u",tmStruct->tm_hour,tmStruct->tm_min / 10,tmStruct->tm_min % 10);
+    
+        UI_ShowDisplayTextCenter(0,0,uiLcd.GetXSize(),uiLcd.GetYSize(),buffer,CLOCK_FONT,CLOCK_COLOR_FG,CLOCK_COLOR_BG);
 
-    // show clock
-    RTC_Get(&tmStruct);
-    snprintf(buffer,sizeof(buffer),"   %u:%02u:%02u   ",tmStruct->tm_hour,tmStruct->tm_min,tmStruct->tm_sec);
-
-    UI_ShowDisplayTextCenter(0,100,uiLcd.GetXSize(),-1,buffer,CLOCK_FONT,CLOCK_COLOR_FG,CLOCK_COLOR_BG);
+        lastClockUpdateTime=*tmStruct;
+    }
 }
 
 void UI_ClickClock(uint16_t x,uint16_t y)
@@ -352,27 +389,172 @@
 //
 // clock in words
 //
+void UI_ShowClockInWordsText(int16_t x,int16_t y,char *text,uint32_t type,uint32_t flags)
+{
+    char                        buffer[2];
+    uint32_t                    colorText;
+
+    if ((flags & type)!=0)
+        colorText=CLOCK_IN_WORDS_COLOR_FG_ACTIVE;
+    else
+        colorText=CLOCK_IN_WORDS_COLOR_FG_INACTIVE;
+
+    while ((*text)!='\0')
+    {
+        buffer[0]=*text;
+        buffer[1]='\0';
+
+        UI_ShowDisplayTextCenter(x+119,y+43,CLOCK_IN_WORDS_CELL_WIDTH,CLOCK_IN_WORDS_CELL_HEIGHT,buffer,CLIENT_FONT,colorText,CLOCK_COLOR_BG);
+
+        text++;
+        x+=CLOCK_IN_WORDS_CELL_WIDTH;
+    }
+}
+
 void UI_ShowClockInWords(bool initial)
 {
-    if (initial==true)
+    struct tm                   *tmStruct;
+    uint32_t                    flags;
+    int8_t                      minutes;
+    int8_t                      hour;
+
+    RTC_Get(&tmStruct);
+
+    if ((initial==true) || (tmStruct->tm_hour!=lastClockUpdateTime.tm_hour) || (tmStruct->tm_min!=lastClockUpdateTime.tm_min))
     {
         // fill background
         UI_ShowClearClientRect();
-    }
+    
+        // show clock
+
+        /*
+            ES K IST A FÜNF
+            ZEHN ZWANZIG
+            DREI VIERTEL
+            VOR FUNK NACH
+            HALB A ELFÜNF
+            EINS XAM ZWEI
+            DREI PMJ VIER
+            SECHS NL ACHT
+            SIEBEN ZWÖLF
+            ZEHNEUN K UHR
+        */
+
+        flags=0;
+
+        minutes=tmStruct->tm_min;
+        hour=tmStruct->tm_hour;
+
+        minutes=((minutes+2)/5)*5;
+        if (minutes==5)
+            flags|=CLOCK_IN_WORDS_TYPE_FUENF_1 | CLOCK_IN_WORDS_TYPE_NACH;
+        else if (minutes==10)
+            flags|=CLOCK_IN_WORDS_TYPE_ZEHN_1 | CLOCK_IN_WORDS_TYPE_NACH;
+        else if (minutes==15)
+            flags|=CLOCK_IN_WORDS_TYPE_VIERTEL | CLOCK_IN_WORDS_TYPE_NACH;
+        else if (minutes==20)
+            flags|=CLOCK_IN_WORDS_TYPE_ZWANZIG | CLOCK_IN_WORDS_TYPE_NACH;
+        else if (minutes==25)
+            flags|=CLOCK_IN_WORDS_TYPE_ZWANZIG | CLOCK_IN_WORDS_TYPE_NACH;
+        else if (minutes==30)
+            flags|=CLOCK_IN_WORDS_TYPE_HALB;
+        else if (minutes==35)
+            flags|=CLOCK_IN_WORDS_TYPE_HALB;
+        else if (minutes==40)
+        {
+            flags|=CLOCK_IN_WORDS_TYPE_ZWANZIG | CLOCK_IN_WORDS_TYPE_VOR;
+            hour++;
+        }
+        else if (minutes==45)
+        {
+            flags|=CLOCK_IN_WORDS_TYPE_VIERTEL | CLOCK_IN_WORDS_TYPE_VOR;
+            hour++;
+        }
+        else if (minutes==50)
+        {
+            flags|=CLOCK_IN_WORDS_TYPE_ZEHN_1 | CLOCK_IN_WORDS_TYPE_VOR;
+            hour++;
+        }
+        else if (minutes==55)
+        {
+            flags|=CLOCK_IN_WORDS_TYPE_FUENF_1 | CLOCK_IN_WORDS_TYPE_VOR;
+            hour++;
+        }
 
-    // show clock in words
-    UI_ShowDisplayText(5,30,"UM F\x9ANF ZEHN VIERTEL HALB",CLIENT_FONT,CLIENT_COLOR_FG,CLIENT_COLOR_BG);
-    UI_ShowDisplayText(5,60,"NACH VOR",CLIENT_FONT,CLIENT_COLOR_FG,CLIENT_COLOR_BG);
-    UI_ShowDisplayText(5,90,"EINS ZWEI DREI VIER",CLIENT_FONT,CLIENT_COLOR_FG,CLIENT_COLOR_BG);
-    UI_ShowDisplayText(5,120,"F\x9ANF SECHS SIEBEN ACHT",CLIENT_FONT,CLIENT_COLOR_FG,CLIENT_COLOR_BG);
-    UI_ShowDisplayText(5,150,"NEUN ZEHN ELF ZW\x99LF",CLIENT_FONT,CLIENT_COLOR_FG,CLIENT_COLOR_BG);
+        hour=hour%12;
+        if (hour==0)
+            flags|=CLOCK_IN_WORDS_TYPE_ZWOELF;
+        else if (hour==1)
+            flags|=CLOCK_IN_WORDS_TYPE_EINS;
+        else if (hour==2)
+            flags|=CLOCK_IN_WORDS_TYPE_ZWEI;
+        else if (hour==3)
+            flags|=CLOCK_IN_WORDS_TYPE_DREI_2;
+        else if (hour==4)
+            flags|=CLOCK_IN_WORDS_TYPE_VIER;
+        else if (hour==5)
+            flags|=CLOCK_IN_WORDS_TYPE_FUENF_2;
+        else if (hour==6)
+            flags|=CLOCK_IN_WORDS_TYPE_SECHS;
+        else if (hour==7)
+            flags|=CLOCK_IN_WORDS_TYPE_SIEBEN;
+        else if (hour==8)
+            flags|=CLOCK_IN_WORDS_TYPE_ACHT;
+        else if (hour==9)
+            flags|=CLOCK_IN_WORDS_TYPE_NEUN;
+        else if (hour==10)
+            flags|=CLOCK_IN_WORDS_TYPE_ZEHN_2;
+        else if (hour==11)
+            flags|=CLOCK_IN_WORDS_TYPE_ELF;
+
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*0,"ES",1,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*2,CLOCK_IN_WORDS_CELL_HEIGHT*0,"K",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*3,CLOCK_IN_WORDS_CELL_HEIGHT*0,"IST",1,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*6,CLOCK_IN_WORDS_CELL_HEIGHT*0,"A",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*0,"F\xDCNF",CLOCK_IN_WORDS_TYPE_FUENF_1,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*1,"ZEHN",CLOCK_IN_WORDS_TYPE_ZEHN_1,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*4,CLOCK_IN_WORDS_CELL_HEIGHT*1,"ZWANZIG",CLOCK_IN_WORDS_TYPE_ZWANZIG,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*2,"DREI",CLOCK_IN_WORDS_TYPE_DREI_1,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*4,CLOCK_IN_WORDS_CELL_HEIGHT*2,"VIERTEL",CLOCK_IN_WORDS_TYPE_VIERTEL,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*3,"VOR",CLOCK_IN_WORDS_TYPE_VOR,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*3,CLOCK_IN_WORDS_CELL_HEIGHT*3,"FUNK",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*3,"NACH",CLOCK_IN_WORDS_TYPE_NACH,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*4,"HALB",CLOCK_IN_WORDS_TYPE_HALB,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*4,CLOCK_IN_WORDS_CELL_HEIGHT*4,"A",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*5,CLOCK_IN_WORDS_CELL_HEIGHT*4,"EL",CLOCK_IN_WORDS_TYPE_ELF,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*4,"F",CLOCK_IN_WORDS_TYPE_ELF | CLOCK_IN_WORDS_TYPE_FUENF_2,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*8,CLOCK_IN_WORDS_CELL_HEIGHT*4,"\xDCNF",CLOCK_IN_WORDS_TYPE_FUENF_2,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*5,"EINS",CLOCK_IN_WORDS_TYPE_EINS,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*4,CLOCK_IN_WORDS_CELL_HEIGHT*5,"XAM",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*5,"ZWEI",CLOCK_IN_WORDS_TYPE_ZWEI,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*6,"DREI",CLOCK_IN_WORDS_TYPE_DREI_2,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*4,CLOCK_IN_WORDS_CELL_HEIGHT*6,"PMJ",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*6,"VIER",CLOCK_IN_WORDS_TYPE_VIER,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*7,"SECHS",CLOCK_IN_WORDS_TYPE_SECHS,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*5,CLOCK_IN_WORDS_CELL_HEIGHT*7,"NL",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*7,"ACHT",CLOCK_IN_WORDS_TYPE_ACHT,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*8,"SIEBEN",CLOCK_IN_WORDS_TYPE_SIEBEN,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*6,CLOCK_IN_WORDS_CELL_HEIGHT*8,"ZW\xD6LF",CLOCK_IN_WORDS_TYPE_ZWOELF,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*0,CLOCK_IN_WORDS_CELL_HEIGHT*9,"ZEH",CLOCK_IN_WORDS_TYPE_ZEHN_2,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*3,CLOCK_IN_WORDS_CELL_HEIGHT*9,"N",CLOCK_IN_WORDS_TYPE_ZEHN_2 | CLOCK_IN_WORDS_TYPE_NEUN,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*4,CLOCK_IN_WORDS_CELL_HEIGHT*9,"EUN",CLOCK_IN_WORDS_TYPE_NEUN,flags);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*7,CLOCK_IN_WORDS_CELL_HEIGHT*9,"K",0,1);
+        UI_ShowClockInWordsText(CLOCK_IN_WORDS_CELL_WIDTH*8,CLOCK_IN_WORDS_CELL_HEIGHT*9,"UHR",1,1);
+
+        lastClockUpdateTime=*tmStruct;
+    }
 
     /*
     // draw charset
     int x;
-    for (x=0x0;x<=0x7f;x++)
+    for (x=0x80;x<=0xff;x++)
     {
-        FontX_DisplayChar(1+(((x-0x0) % 16)*14),30+(((x-0x0)/16)*20),x,CLIENT_FONT,CLIENT_COLOR_FG,CLIENT_COLOR_BG);
+        FontX_DisplayChar(  1+(((x-0x80) % 16)*14),
+                            30+(((x-0x80)/16)*20),
+                            x,
+                            CLIENT_FONT,
+                            CLIENT_COLOR_FG,
+                            CLIENT_COLOR_BG);
     }
     */
 }
@@ -436,8 +618,11 @@
         uiLcd.FillRect(0,0,uiLcd.GetXSize(),uiLcd.GetYSize());
 
         // show clock
-        snprintf(buffer,sizeof(buffer),"%u:%02u",tmStruct->tm_hour,tmStruct->tm_min);
-        FontX_DisplayStringAt(30,220,uiLcd.GetXSize(),buffer,ALIGN_RIGHT,SLIDESHOW_FONT,SLIDESHOW_COLOR_FG,0x00000000);
+        if (tmStruct->tm_hour>=10)
+            snprintf(buffer,sizeof(buffer),"%u   %u   :   %u   %u",tmStruct->tm_hour / 10,tmStruct->tm_hour % 10,tmStruct->tm_min / 10,tmStruct->tm_min % 10);
+        else
+            snprintf(buffer,sizeof(buffer),"%u   :   %u   %u",tmStruct->tm_hour,tmStruct->tm_min / 10,tmStruct->tm_min % 10);
+        FontX_DisplayStringAt(30,180,uiLcd.GetXSize(),buffer,ALIGN_RIGHT,SLIDESHOW_FONT,SLIDESHOW_COLOR_FG,0x00000001);
 
         // hide picture layer
         if (initial==true)
@@ -797,14 +982,18 @@
         uiLcd.SetTextColor(HEADER_COLOR_BG);
         uiLcd.FillRect(0,0,uiLcd.GetXSize(),HEADER_HEIGHT);
 
+        // draw line
+        uiLcd.SetTextColor(HEADER_LINE);
+        uiLcd.DrawHLine(10,HEADER_HEIGHT-1,uiLcd.GetXSize()-20);
+
         if ((uiCurrent->flags & UI_FLAG_HAS_BACK_BUTTON)!=0)
-            UI_DrawBitmapWithAlpha(0,1,ic_navigate_before_white_24dp_1x);
+            UI_DrawBitmapWithAlpha(5,1,ic_navigate_before_white_24dp_1x);
     }
 
     // show clock
     RTC_Get(&tmStruct);
     snprintf(buffer,sizeof(buffer),"  %u:%02u  ",tmStruct->tm_hour,tmStruct->tm_min);
-    UI_ShowDisplayTextCenter(0,0,uiLcd.GetXSize(),-1,buffer,HEADER_FONT,HEADER_COLOR_FG,HEADER_COLOR_BG);
+    UI_ShowDisplayTextCenter(0,2,uiLcd.GetXSize(),-1,buffer,HEADER_FONT,HEADER_COLOR_FG,HEADER_COLOR_BG);
 
     // show next alarm
     //XXX