The SZ / WakeupLight

Dependencies:   BSP_DISCO_F746NG_patch_fixed LCD_DISCO_F746NG TS_DISCO_F746NG FATFileSystem TinyJpgDec_interwork mbed-src

Files at this revision

API Documentation at this revision

Comitter:
the_sz
Date:
Thu Nov 12 21:21:48 2015 +0000
Parent:
6:aa51cc3b9f90
Child:
8:51e0f01d5c74
Commit message:
f746 patch used

Changed in this revision

BSP_DISCO_F746NG.lib Show diff for this revision Revisions of this file
BSP_DISCO_F746NG_patch.lib Show annotated file Show diff for this revision Revisions of this file
Config.cpp Show annotated file Show diff for this revision Revisions of this file
Config.h Show annotated file Show diff for this revision Revisions of this file
Images/ic_alarm_white_48dp_1x.h Show annotated file Show diff for this revision Revisions of this file
Images/ic_navigate_before_white_24dp_1x.h Show annotated file Show diff for this revision Revisions of this file
Images/ic_notifications_none_white_48dp_1x.h Show annotated file Show diff for this revision Revisions of this file
Images/ic_query_builder_white_48dp_1x.h Show annotated file Show diff for this revision Revisions of this file
UI.cpp Show annotated file Show diff for this revision Revisions of this file
UI.h Show annotated file Show diff for this revision Revisions of this file
UI_ColorTest.cpp Show annotated file Show diff for this revision Revisions of this file
UI_Main.cpp Show annotated file Show diff for this revision Revisions of this file
UI_Wakup.cpp Show annotated file Show diff for this revision Revisions of this file
WakeupLight.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/BSP_DISCO_F746NG.lib	Tue Nov 10 22:39:50 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/teams/ST/code/BSP_DISCO_F746NG/#1dacf9397f42
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BSP_DISCO_F746NG_patch.lib	Thu Nov 12 21:21:48 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/NirT/code/BSP_DISCO_F746NG_patch/#bf157336ad2b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Config.cpp	Thu Nov 12 21:21:48 2015 +0000
@@ -0,0 +1,82 @@
+#include "WakeupLight.h"
+
+//#define USE_RTC
+
+#define CT_MAGIC_VALUE              0x546865DF      // 'Theß'
+
+#ifdef USE_RTC
+    uint32_t                        *rtcBackupRegisters;
+#else
+    uint32_t                        configSpace[CT_MAX];
+#endif
+
+void Config_Init(void)
+{
+    uint32_t                index;
+
+    #ifdef USE_RTC
+
+        RTC_TypeDef             *rtc;
+    
+        rtc=(RTC_TypeDef *)RTC_BASE;
+        rtcBackupRegisters=(uint32_t *)&rtc->BKP0R;
+    
+        if (rtcBackupRegisters[CT_MAGIC]!=CT_MAGIC_VALUE)
+        {
+            DPrintf("Config_Init: Reset config because of 0x%08X.\r\n",rtcBackupRegisters[CT_MAGIC]);
+    
+            for (index=0;index<=CT_MAX;index++)
+                rtcBackupRegisters[index]=0;
+    
+            rtcBackupRegisters[CT_MAGIC]=CT_MAGIC_VALUE;
+        }
+
+    #else
+
+        for (index=0;index<=CT_MAX;index++)
+            configSpace[index]=0;
+
+        configSpace[CT_MAGIC]=CT_MAGIC_VALUE;
+
+    #endif
+}
+
+uint32_t Config_Get(CONFIG_TYPE_ENUM type)
+{
+    if (type>CT_MAX)
+        return 0;
+
+    DPrintf_("Config_Get: %u -> 0x%X.\r\n",type,configSpace[type]);
+
+    #ifdef USE_RTC
+        return rtcBackupRegisters[type];
+    #else
+        return configSpace[type];
+    #endif
+}
+
+void Config_Set(CONFIG_TYPE_ENUM type,uint32_t value)
+{
+    if (type>CT_MAX)
+        return;
+
+    DPrintf_("Config_Set: %u -> 0x%X.\r\n",type,value);
+
+    #ifdef USE_RTC
+
+        RTC_TypeDef             *rtc;
+
+        rtc=(RTC_TypeDef *)RTC_BASE;
+        rtc->WPR=0xCA;
+        rtc->WPR=0x53;
+
+        rtcBackupRegisters[type]=value;
+
+        rtc->WPR=0xFF;
+
+    #else
+
+        configSpace[type]=value;
+
+    #endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Config.h	Thu Nov 12 21:21:48 2015 +0000
@@ -0,0 +1,43 @@
+#ifndef __Config_h
+#define __Config_h
+
+#define CONFIG_ALARM_MASK_MONDAY            0x0001
+#define CONFIG_ALARM_MASK_TUESDAY           0x0002
+#define CONFIG_ALARM_MASK_WEDNESDAY         0x0004
+#define CONFIG_ALARM_MASK_THURSDAY          0x0008
+#define CONFIG_ALARM_MASK_FRIDAY            0x0010
+#define CONFIG_ALARM_MASK_SATURDAY          0x0020
+#define CONFIG_ALARM_MASK_SUNDAY            0x0040
+#define CONFIG_ALARM_MASK_DAYS              (CONFIG_ALARM_MASK_MONDAY | CONFIG_ALARM_MASK_TUESDAY | CONFIG_ALARM_MASK_WEDNESDAY | CONFIG_ALARM_MASK_THURSDAY | CONFIG_ALARM_MASK_FRIDAY | CONFIG_ALARM_MASK_SATURDAY | CONFIG_ALARM_MASK_SUNDAY)
+
+typedef enum
+{
+    CT_MAGIC,
+
+    CT_ALARM_1_TIME,
+    CT_ALARM_1_MASK,
+
+    CT_ALARM_2_TIME,
+    CT_ALARM_2_MASK,
+
+    CT_ALARM_3_TIME,
+    CT_ALARM_3_MASK,
+
+    CT_ALARM_4_TIME,
+    CT_ALARM_4_MASK,
+
+    CT_ALARM_5_TIME,
+    CT_ALARM_5_MASK,
+
+    CT_ALARM_6_TIME,
+    CT_ALARM_6_MASK,
+
+    CT_MAX=RTC_BKP_DR31
+
+} CONFIG_TYPE_ENUM;
+
+void Config_Init(void);
+uint32_t Config_Get(CONFIG_TYPE_ENUM type);
+void Config_Set(CONFIG_TYPE_ENUM type,uint32_t value);
+
+#endif
--- a/Images/ic_alarm_white_48dp_1x.h	Tue Nov 10 22:39:50 2015 +0000
+++ b/Images/ic_alarm_white_48dp_1x.h	Thu Nov 12 21:21:48 2015 +0000
@@ -3,6 +3,7 @@
 
 // generated by BIN 2 Header
 
+// alarm clock
 BYTE ic_alarm_white_48dp_1x[]=
 {
     0x42, 0x4D, 0x8A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C, 0x00, 
--- a/Images/ic_navigate_before_white_24dp_1x.h	Tue Nov 10 22:39:50 2015 +0000
+++ b/Images/ic_navigate_before_white_24dp_1x.h	Thu Nov 12 21:21:48 2015 +0000
@@ -3,6 +3,7 @@
 
 // generated by BIN 2 Header
 
+// back
 BYTE ic_navigate_before_white_24dp_1x[]=
 {
     0x42, 0x4D, 0x8A, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C, 0x00, 
--- a/Images/ic_notifications_none_white_48dp_1x.h	Tue Nov 10 22:39:50 2015 +0000
+++ b/Images/ic_notifications_none_white_48dp_1x.h	Thu Nov 12 21:21:48 2015 +0000
@@ -3,6 +3,7 @@
 
 // generated by BIN 2 Header
 
+// bell
 BYTE ic_notifications_none_white_48dp_1x[]=
 {
     0x42, 0x4D, 0x8A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C, 0x00, 
--- a/Images/ic_query_builder_white_48dp_1x.h	Tue Nov 10 22:39:50 2015 +0000
+++ b/Images/ic_query_builder_white_48dp_1x.h	Thu Nov 12 21:21:48 2015 +0000
@@ -3,6 +3,7 @@
 
 // generated by BIN 2 Header
 
+// clock
 BYTE ic_query_builder_white_48dp_1x[]=
 {
     0x42, 0x4D, 0x8A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C, 0x00, 
--- a/UI.cpp	Tue Nov 10 22:39:50 2015 +0000
+++ b/UI.cpp	Thu Nov 12 21:21:48 2015 +0000
@@ -1,48 +1,51 @@
 #include "WakeupLight.h"
 
-#include "Images/ic_alarm_white_48dp_1x.h"
 #include "Images/ic_navigate_before_white_24dp_1x.h"
 #include "Images/ic_notifications_none_white_48dp_1x.h"
 #include "Images/ic_query_builder_white_48dp_1x.h"
 
-#define CLIENT_COLOR_BG         ((uint32_t)0xFF000000)
-#define CLIENT_COLOR_FG         ((uint32_t)0xFFD0D0D0)
+#define CLIENT_COLOR_BG                 ((uint32_t)0xFF000000)
+#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 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 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 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 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 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
 
-LCD_DISCO_F746NG                uiLcd;
-TS_DISCO_F746NG                 uiTs;
-uint16_t                        uiLastTouchX;
-uint16_t                        uiLastTouchY;
-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[]=
+LCD_DISCO_F746NG                        uiLcd;
+TS_DISCO_F746NG                         uiTs;
+uint16_t                                uiLastTouchX;
+uint16_t                                uiLastTouchY;
+UI_STRUCT                               *uiCurrent=NULL;
+UI_STRUCT                               uiClock;
+UI_STRUCT                               uiClockInWords;
+UI_STRUCT                               uiColorTest;
+UI_STRUCT                               uiWakeup;
+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 }, { "Adjust\nTimers", ic_notifications_none_white_48dp_1x }, { "Lights On", NULL }, { "Lights Off", NULL }, { "Color Test", NULL }
 };
@@ -92,7 +95,7 @@
     charWidth=uiLcd.GetFont()->Width;
 
     x+=((width-(strlen(text)*charWidth))/2);
-    y+=((height-charHeight)/2);
+    y+=(((height-charHeight)/2)+3);                 // +3 to have it more centered
 
     while ((*text)!='\0')
     {
@@ -138,17 +141,25 @@
     }
 }
 
-void UI_ShowDrawButton(uint16_t x,uint16_t y,char *text)
+void UI_ShowDrawButtonEx(uint16_t x,uint16_t y,uint16_t width,uint16_t height,char *text,bool active)
 {
     // paint button background
-    UI_ShowDrawGradientButton(x,y,BUTTON_WIDTH,BUTTON_HEIGHT,BUTTON_COLOR_BG_START,BUTTON_COLOR_BG_END);
+    if (active==true)
+        UI_ShowDrawGradientButton(x,y,width,height,BUTTON_COLOR_BG_START,BUTTON_COLOR_BG_END);
+    else
+        UI_ShowDrawGradientButton(x,y,width,height,BUTTON_COLOR_BG_START_INACTIVE,BUTTON_COLOR_BG_END_INACTIVE);
 
     // 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);
+    UI_ShowDisplayTextCenter(x,y,width,height,text);
+}
+
+void UI_ShowDrawButton(uint16_t x,uint16_t y,uint16_t width,uint16_t height,char *text)
+{
+    UI_ShowDrawButtonEx(x,y,width,height,text,true);
 }
 
 void UI_DrawBitmapWithAlpha(uint32_t Xpos,uint32_t Ypos,uint8_t *pbmp)
@@ -272,8 +283,6 @@
             // draw icon
             if (uiCurrent->data.boxList.items[box].image!=NULL)
                 UI_DrawBitmapWithAlpha(startX+width-BOX_SPACING-48,startY+height-BOX_SPACING-48,uiCurrent->data.boxList.items[box].image);
-//                uiLcd.DrawBitmap(0,0,uiCurrent->data.boxList.items[box].image);
-//                uiLcd.DrawBitmap(startX+width-BOX_SPACING-48,startY+height-BOX_SPACING-48,uiCurrent->data.boxList.items[box].image);
         }
     }
 }
@@ -418,24 +427,82 @@
         // fill background
         UI_ShowClearClientRect();
 
-        if (uiCurrent->data.valueAdjust.count==4)
+        if (uiCurrent->data.valueAdjust.count==10)
         {
-            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(60+(0*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+            UI_ShowDrawButton(205+(0*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+            UI_ShowDrawButton(205+(1*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+
+            UI_ShowDisplayTextCenter(132,92,BUTTON_WIDTH,BUTTON_HEIGHT,":");
 
-            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,"-");
+            UI_ShowDrawButton(60+(0*(BUTTON_WIDTH+15)),140,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
+            UI_ShowDrawButton(205+(0*(BUTTON_WIDTH+15)),140,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
+            UI_ShowDrawButton(205+(1*(BUTTON_WIDTH+15)),140,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
+        }
+        else if (uiCurrent->data.valueAdjust.count==4)
+        {
+            UI_ShowDrawButton(17+(0*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+            UI_ShowDrawButton(17+(1*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+            UI_ShowDrawButton(17+(2*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+            UI_ShowDrawButton(17+(3*(BUTTON_WIDTH+15)),40,BUTTON_WIDTH,BUTTON_HEIGHT,"+");
+
+            UI_ShowDrawButton(17+(0*(BUTTON_WIDTH+15)),205,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
+            UI_ShowDrawButton(17+(1*(BUTTON_WIDTH+15)),205,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
+            UI_ShowDrawButton(17+(2*(BUTTON_WIDTH+15)),205,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
+            UI_ShowDrawButton(17+(3*(BUTTON_WIDTH+15)),205,BUTTON_WIDTH,BUTTON_HEIGHT,"-");
         }
     }
 
     uiLcd.SetBackColor(CLIENT_COLOR_BG);
     uiLcd.SetTextColor(CLIENT_COLOR_FG);
 
-    if (uiCurrent->data.valueAdjust.count==4)
+    if (uiCurrent->data.valueAdjust.count==10)
+    {
+        snprintf(buffer,sizeof(buffer),"% 2u",uiCurrent->data.valueAdjust.values[0]);
+        UI_ShowDisplayTextCenter(60+(0*(BUTTON_WIDTH+15)),92,BUTTON_WIDTH,BUTTON_HEIGHT,buffer);
+
+        snprintf(buffer,sizeof(buffer),"%u",uiCurrent->data.valueAdjust.values[1]);
+        UI_ShowDisplayTextCenter(205+(0*(BUTTON_WIDTH+15)),92,BUTTON_WIDTH,BUTTON_HEIGHT,buffer);
+
+        snprintf(buffer,sizeof(buffer),"%u",uiCurrent->data.valueAdjust.values[2]);
+        UI_ShowDisplayTextCenter(205+(1*(BUTTON_WIDTH+15)),92,BUTTON_WIDTH,BUTTON_HEIGHT,buffer);
+
+        if (uiCurrent->data.valueAdjust.values[3]==1)
+            UI_ShowDrawButton(17+(0*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Mo");
+        else
+            UI_ShowDrawButtonEx(17+(0*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Mo",false);
+
+        if (uiCurrent->data.valueAdjust.values[4]==1)
+            UI_ShowDrawButton(17+(1*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Di");
+        else
+            UI_ShowDrawButtonEx(17+(1*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Di",false);
+
+        if (uiCurrent->data.valueAdjust.values[5]==1)
+            UI_ShowDrawButton(17+(2*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Mi");
+        else
+            UI_ShowDrawButtonEx(17+(2*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Mi",false);
+
+        if (uiCurrent->data.valueAdjust.values[6]==1)
+            UI_ShowDrawButton(17+(3*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Do");
+        else
+            UI_ShowDrawButtonEx(17+(3*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Do",false);
+
+        if (uiCurrent->data.valueAdjust.values[7]==1)
+            UI_ShowDrawButton(17+(4*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Fr");
+        else
+            UI_ShowDrawButtonEx(17+(4*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Fr",false);
+
+        if (uiCurrent->data.valueAdjust.values[8]==1)
+            UI_ShowDrawButton(17+(5*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Sa");
+        else
+            UI_ShowDrawButtonEx(17+(5*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"Sa",false);
+
+        if (uiCurrent->data.valueAdjust.values[9]==1)
+            UI_ShowDrawButton(17+(6*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"So");
+        else
+            UI_ShowDrawButtonEx(17+(6*(BUTTON_SMALL_WIDTH+15)),215,BUTTON_SMALL_WIDTH,BUTTON_SMALL_HEIGHT,"So",false);
+    }
+    else 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);
@@ -458,7 +525,45 @@
     // detect at which button was clicked
     index=-1;
 
-    if (uiCurrent->data.valueAdjust.count==4)
+    if (uiCurrent->data.valueAdjust.count==10)
+    {
+        if ((y>=40) && (y<(40+BUTTON_HEIGHT)))
+        {
+            if ((x>=(60+(0*(BUTTON_WIDTH+15)))) && (x<(17+(0*(BUTTON_WIDTH+15))+BUTTON_WIDTH)))
+                index=0;
+            else if ((x>=(205+(0*(BUTTON_WIDTH+15)))) && (x<(205+(0*(BUTTON_WIDTH+15))+BUTTON_WIDTH)))
+                index=1;
+            else if ((x>=(205+(1*(BUTTON_WIDTH+15)))) && (x<(205+(1*(BUTTON_WIDTH+15))+BUTTON_WIDTH)))
+                index=2;
+        }
+        else if ((y>=140) && (y<(140+BUTTON_HEIGHT)))
+        {
+            if ((x>=(60+(0*(BUTTON_WIDTH+15)))) && (x<(60+(0*(BUTTON_WIDTH+15))+BUTTON_WIDTH)))
+                index=3;
+            else if ((x>=(205+(0*(BUTTON_WIDTH+15)))) && (x<(205+(0*(BUTTON_WIDTH+15))+BUTTON_WIDTH)))
+                index=4;
+            else if ((x>=(205+(1*(BUTTON_WIDTH+15)))) && (x<(205+(1*(BUTTON_WIDTH+15))+BUTTON_WIDTH)))
+                index=5;
+        }
+        else if ((y>=215) && (y<(215+BUTTON_SMALL_HEIGHT)))
+        {
+            if ((x>=(17+(0*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(0*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=6;
+            else if ((x>=(17+(1*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(1*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=7;
+            else if ((x>=(17+(2*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(2*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=8;
+            else if ((x>=(17+(3*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(3*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=9;
+            else if ((x>=(17+(4*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(4*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=10;
+            else if ((x>=(17+(5*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(5*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=11;
+            else if ((x>=(17+(6*(BUTTON_SMALL_WIDTH+15)))) && (x<(17+(6*(BUTTON_SMALL_WIDTH+15))+BUTTON_SMALL_WIDTH)))
+                index=12;
+        }
+    }
+    else if (uiCurrent->data.valueAdjust.count==4)
     {
         if ((y>=40) && (y<(40+BUTTON_HEIGHT)))
         {
@@ -513,9 +618,6 @@
     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;
--- a/UI.h	Tue Nov 10 22:39:50 2015 +0000
+++ b/UI.h	Thu Nov 12 21:21:48 2015 +0000
@@ -48,7 +48,7 @@
         struct
         {
             uint8_t                     count;
-            uint32_t                    values[4];
+            int32_t                     values[10];
 
         } valueAdjust;
 
@@ -69,6 +69,8 @@
 void UI_MainHandler(UI_REASON_ENUM reason,int32_t index,UI_STRUCT *ui);
 
 void UI_WakeupHandler(UI_REASON_ENUM reason,int32_t index,UI_STRUCT *ui);
+void UI_WakeupShow(void);
+
 void UI_ColorTestHandler(UI_REASON_ENUM reason,int32_t index,UI_STRUCT *ui);
 
 #endif
--- a/UI_ColorTest.cpp	Tue Nov 10 22:39:50 2015 +0000
+++ b/UI_ColorTest.cpp	Thu Nov 12 21:21:48 2015 +0000
@@ -10,11 +10,9 @@
             DPrintf_("UI_ColorTestHandler: %u.\r\n",index);
             if (index==-1)
             {
+                LED_SetColor(0x00000000);
                 UI_Show(&uiMain);
-                uiColorTest.data.valueAdjust.values[0]=0;
-                uiColorTest.data.valueAdjust.values[1]=0;
-                uiColorTest.data.valueAdjust.values[2]=0;
-                uiColorTest.data.valueAdjust.values[3]=0;
+                break;
             }
             else if (index==0)
                 uiColorTest.data.valueAdjust.values[0]=(uiColorTest.data.valueAdjust.values[0]+0x10) & 0xFF;
@@ -32,12 +30,14 @@
                 uiColorTest.data.valueAdjust.values[2]=(uiColorTest.data.valueAdjust.values[2]-0x10) & 0xFF;
             else if (index==7)
                 uiColorTest.data.valueAdjust.values[3]=(uiColorTest.data.valueAdjust.values[3]-0x10) & 0xFF;
-            // fall through
-
-        case UR_SHOW:
             color=COLOR_CREATE(uiColorTest.data.valueAdjust.values[0],uiColorTest.data.valueAdjust.values[1],uiColorTest.data.valueAdjust.values[2],uiColorTest.data.valueAdjust.values[3]);
             DPrintf_("UI_ColorTestHandler: Color: 0x%08X.\r\n",color);
             LED_SetColor(color);
             break;
+
+        case UR_SHOW:
+            color=COLOR_CREATE(uiColorTest.data.valueAdjust.values[0],uiColorTest.data.valueAdjust.values[1],uiColorTest.data.valueAdjust.values[2],uiColorTest.data.valueAdjust.values[3]);
+            LED_SetColor(color);
+            break;
     }
 }
--- a/UI_Main.cpp	Tue Nov 10 22:39:50 2015 +0000
+++ b/UI_Main.cpp	Thu Nov 12 21:21:48 2015 +0000
@@ -1,6 +1,14 @@
 #include "WakeupLight.h"
 
+typedef enum
+{
+    LUS_CLOCK,
+    LUS_CLOCK_IN_WORDS,
+
+} LAST_USED_SCREENSAVER_ENUM;
+    
 int32_t                         timeOut;
+LAST_USED_SCREENSAVER_ENUM      lastUsedScreensaver=LUS_CLOCK;
 
 void UI_MainHandler(UI_REASON_ENUM reason,int32_t index,UI_STRUCT *ui)
 {
@@ -8,11 +16,17 @@
     {
         case UR_CLICK:
             if (index==0)
+            {
+                lastUsedScreensaver=LUS_CLOCK;
                 UI_Show(&uiClock);
+            }
             else if (index==1)
+            {
+                lastUsedScreensaver=LUS_CLOCK_IN_WORDS;
                 UI_Show(&uiClockInWords);
+            }
             else if (index==2)
-                UI_Show(&uiWakeup);
+                UI_WakeupShow();
             else if (index==3)
                 LED_StartAnimation(LAE_WAKEUP);
             else if (index==4)
@@ -23,7 +37,13 @@
 
         case UR_TIMER:
             if ((time(NULL)-timeOut)>10)
-                UI_Show(&uiClock);
+            {
+                switch (lastUsedScreensaver)
+                {
+                    case LUS_CLOCK:                 UI_Show(&uiClock);          break;
+                    case LUS_CLOCK_IN_WORDS:        UI_Show(&uiClockInWords);   break;
+                }
+            }
             break;
             
         case UR_SHOW:
--- a/UI_Wakup.cpp	Tue Nov 10 22:39:50 2015 +0000
+++ b/UI_Wakup.cpp	Thu Nov 12 21:21:48 2015 +0000
@@ -1,13 +1,207 @@
 #include "WakeupLight.h"
 
+#include "Images/ic_alarm_white_48dp_1x.h"
+
+#define ALARM_NAME_LENGTH       20
+
+char                            alarm1[ALARM_NAME_LENGTH];
+char                            alarm2[ALARM_NAME_LENGTH];
+char                            alarm3[ALARM_NAME_LENGTH];
+char                            alarm4[ALARM_NAME_LENGTH];
+char                            alarm5[ALARM_NAME_LENGTH];
+char                            alarm6[ALARM_NAME_LENGTH];
+CONFIG_TYPE_ENUM                currentConfigTime;
+CONFIG_TYPE_ENUM                currentConfigMask;
+UI_STRUCT                       uiWakeupAdjust;
+UI_BOX_LIST_ITEM_STRUCT         uiWakeupItems[]=
+{
+    { alarm1, NULL }, { alarm2, NULL }, { alarm3, NULL }, { alarm4, NULL }, { alarm5, NULL }, { alarm6, NULL }
+};
+
+void UI_WakeupAdjustHandler(UI_REASON_ENUM reason,int32_t index,UI_STRUCT *ui)
+{
+    switch (reason)
+    {
+        case UR_CLICK:
+            DPrintf_("UI_WakeupAdjustHandler: %u.\r\n",index);
+            if (index==-1)
+            {
+                uint32_t                    value;
+
+                Config_Set(currentConfigTime,((uiWakeupAdjust.data.valueAdjust.values[0] << 8) | ((uiWakeupAdjust.data.valueAdjust.values[1] * 10) + uiWakeupAdjust.data.valueAdjust.values[2])));
+
+                value=0;
+                if (uiWakeupAdjust.data.valueAdjust.values[3]!=0)
+                    value|=CONFIG_ALARM_MASK_MONDAY;
+                if (uiWakeupAdjust.data.valueAdjust.values[4]!=0)
+                    value|=CONFIG_ALARM_MASK_TUESDAY;
+                if (uiWakeupAdjust.data.valueAdjust.values[5]!=0)
+                    value|=CONFIG_ALARM_MASK_WEDNESDAY;
+                if (uiWakeupAdjust.data.valueAdjust.values[6]!=0)
+                    value|=CONFIG_ALARM_MASK_THURSDAY;
+                if (uiWakeupAdjust.data.valueAdjust.values[7]!=0)
+                    value|=CONFIG_ALARM_MASK_FRIDAY;
+                if (uiWakeupAdjust.data.valueAdjust.values[8]!=0)
+                    value|=CONFIG_ALARM_MASK_SATURDAY;
+                if (uiWakeupAdjust.data.valueAdjust.values[9]!=0)
+                    value|=CONFIG_ALARM_MASK_SUNDAY;
+                Config_Set(currentConfigMask,value);
+
+                UI_WakeupShow();
+                break;
+            }
+            else if (index==0)
+            {
+                uiWakeupAdjust.data.valueAdjust.values[0]++;
+                if (uiWakeupAdjust.data.valueAdjust.values[0]>=23)
+                    uiWakeupAdjust.data.valueAdjust.values[0]=0;
+            }   
+            else if (index==1)
+            {
+                uiWakeupAdjust.data.valueAdjust.values[1]++;
+                if (uiWakeupAdjust.data.valueAdjust.values[1]>=6)
+                    uiWakeupAdjust.data.valueAdjust.values[1]=0;
+            }
+            else if (index==2)
+            {
+                uiWakeupAdjust.data.valueAdjust.values[2]++;
+                if (uiWakeupAdjust.data.valueAdjust.values[2]>=10)
+                    uiWakeupAdjust.data.valueAdjust.values[2]=0;
+            }
+            else if (index==3)
+            {
+                uiWakeupAdjust.data.valueAdjust.values[0]--;
+                if (uiWakeupAdjust.data.valueAdjust.values[0]<0)
+                    uiWakeupAdjust.data.valueAdjust.values[0]=23;
+            }
+            else if (index==4)
+            {
+                uiWakeupAdjust.data.valueAdjust.values[1]--;
+                if (uiWakeupAdjust.data.valueAdjust.values[1]<0)
+                    uiWakeupAdjust.data.valueAdjust.values[1]=5;
+            }
+            else if (index==5)
+            {
+                uiWakeupAdjust.data.valueAdjust.values[2]--;
+                if (uiWakeupAdjust.data.valueAdjust.values[2]<0)
+                    uiWakeupAdjust.data.valueAdjust.values[2]=9;
+            }
+            else if ((index>=6) && (index<=12))
+            {
+                if (uiWakeupAdjust.data.valueAdjust.values[index-3]==0)
+                    uiWakeupAdjust.data.valueAdjust.values[index-3]=1;
+                else
+                    uiWakeupAdjust.data.valueAdjust.values[index-3]=0;
+            }
+            break;
+
+        case UR_SHOW:
+            break;
+    }
+}
+
 void UI_WakeupHandler(UI_REASON_ENUM reason,int32_t index,UI_STRUCT *ui)
 {
     switch (reason)
     {
         case UR_CLICK:
+            if (index==-1)
+            {
+                // back button
+                UI_Show(&uiMain);
+            }
+            else
+            {
+                // adjust timer
+                uint32_t                value;
+
+                switch (index)
+                {
+                    case 0:             currentConfigTime=CT_ALARM_1_TIME;      currentConfigMask=CT_ALARM_1_MASK;          break;
+                    case 1:             currentConfigTime=CT_ALARM_2_TIME;      currentConfigMask=CT_ALARM_2_MASK;          break;
+                    case 2:             currentConfigTime=CT_ALARM_3_TIME;      currentConfigMask=CT_ALARM_3_MASK;          break;
+                    case 3:             currentConfigTime=CT_ALARM_4_TIME;      currentConfigMask=CT_ALARM_4_MASK;          break;
+                    case 4:             currentConfigTime=CT_ALARM_5_TIME;      currentConfigMask=CT_ALARM_5_MASK;          break;
+                    case 5:             currentConfigTime=CT_ALARM_6_TIME;      currentConfigMask=CT_ALARM_6_MASK;          break;
+                }
+
+                memset(&uiWakeupAdjust,0,sizeof(uiWakeupAdjust));
+                uiWakeupAdjust.flags=UI_FLAG_TYPE_VALUE_ADJUST;
+                uiWakeupAdjust.handler=UI_WakeupAdjustHandler;
+                uiWakeupAdjust.data.valueAdjust.count=10;
+
+                value=Config_Get(currentConfigTime);
+                uiWakeupAdjust.data.valueAdjust.values[0]=((value >> 8) & 0xFF);
+                uiWakeupAdjust.data.valueAdjust.values[1]=((value & 0xFF) / 10);
+                uiWakeupAdjust.data.valueAdjust.values[2]=((value & 0xFF) % 10);
+
+                value=Config_Get(currentConfigMask);
+                if (value==0)
+                    value=CONFIG_ALARM_MASK_MONDAY | CONFIG_ALARM_MASK_TUESDAY | CONFIG_ALARM_MASK_WEDNESDAY | CONFIG_ALARM_MASK_THURSDAY | CONFIG_ALARM_MASK_FRIDAY;
+                if ((value & CONFIG_ALARM_MASK_MONDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[3]=1;
+                if ((value & CONFIG_ALARM_MASK_TUESDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[4]=1;
+                if ((value & CONFIG_ALARM_MASK_WEDNESDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[5]=1;
+                if ((value & CONFIG_ALARM_MASK_THURSDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[6]=1;
+                if ((value & CONFIG_ALARM_MASK_FRIDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[7]=1;
+                if ((value & CONFIG_ALARM_MASK_SATURDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[8]=1;
+                if ((value & CONFIG_ALARM_MASK_SUNDAY)!=0)
+                    uiWakeupAdjust.data.valueAdjust.values[9]=1;
+
+                UI_Show(&uiWakeupAdjust);
+            }
             break;
 
         case UR_TIMER:
             break;
     }
 }
+
+void UI_WakeupAddAlarm(uint32_t index,CONFIG_TYPE_ENUM configTime,CONFIG_TYPE_ENUM configMask,bool *addAdded)
+{
+    uint32_t                    alarmTime;
+
+    if ((Config_Get(configMask) & CONFIG_ALARM_MASK_DAYS)!=0)
+    {
+        // alarm enabled
+        alarmTime=Config_Get(configTime);
+        snprintf(uiWakeupItems[index].name,ALARM_NAME_LENGTH,"%u:%02u",((alarmTime >> 8) & 0xFF),(alarmTime & 0xFF));
+        uiWakeup.data.boxList.count++;
+    }
+    else
+    {
+        // alarm disabled
+        if ((*addAdded)==false)
+        {
+            snprintf(uiWakeupItems[index].name,ALARM_NAME_LENGTH,"New");
+            uiWakeupItems[index].image=ic_alarm_white_48dp_1x;
+            uiWakeup.data.boxList.count++;
+            (*addAdded)=true;
+        }
+    }
+}
+
+void UI_WakeupShow(void)
+{
+    bool                addAdded;
+
+    uiWakeup.flags=UI_FLAG_TYPE_BOX_LIST | UI_FLAG_HAS_BACK_BUTTON;
+    uiWakeup.handler=UI_WakeupHandler;
+    uiWakeup.data.boxList.items=uiWakeupItems;
+    uiWakeup.data.boxList.count=0;
+
+    addAdded=false;
+    UI_WakeupAddAlarm(0,CT_ALARM_1_TIME,CT_ALARM_1_MASK,&addAdded);
+    UI_WakeupAddAlarm(1,CT_ALARM_2_TIME,CT_ALARM_2_MASK,&addAdded);
+    UI_WakeupAddAlarm(2,CT_ALARM_3_TIME,CT_ALARM_3_MASK,&addAdded);
+    UI_WakeupAddAlarm(3,CT_ALARM_4_TIME,CT_ALARM_4_MASK,&addAdded);
+    UI_WakeupAddAlarm(4,CT_ALARM_5_TIME,CT_ALARM_5_MASK,&addAdded);
+    UI_WakeupAddAlarm(5,CT_ALARM_6_TIME,CT_ALARM_6_MASK,&addAdded);
+
+    UI_Show(&uiWakeup);
+}
--- a/WakeupLight.h	Tue Nov 10 22:39:50 2015 +0000
+++ b/WakeupLight.h	Thu Nov 12 21:21:48 2015 +0000
@@ -16,6 +16,7 @@
 #include "OnBoardLED.h"
 #include "LED.h"
 #include "UI.h"
+#include "Config.h"
 #include "Fonts/display_fonts.h"
 #include "debug.h"
 
--- a/main.cpp	Tue Nov 10 22:39:50 2015 +0000
+++ b/main.cpp	Thu Nov 12 21:21:48 2015 +0000
@@ -1,5 +1,68 @@
 #include "WakeupLight.h"
 
+int                             lastCheckedMinute=-1;
+
+void checkForAlarmSpecified(struct tm *tmStruct,CONFIG_TYPE_ENUM typeTime,CONFIG_TYPE_ENUM typeFlags)
+{
+    uint32_t                    value;
+    bool                        checkTime;
+
+    value=Config_Get(typeFlags);
+    if (value!=0)
+    {
+        checkTime=false;
+
+        DPrintf("checkForAlarmSpecified: %u.\r\n",tmStruct->tm_wday);
+
+        if (((value & CONFIG_ALARM_MASK_MONDAY)!=0) && (tmStruct->tm_wday==1))
+            checkTime=true;
+        if (((value & CONFIG_ALARM_MASK_TUESDAY)!=0) && (tmStruct->tm_wday==2))
+            checkTime=true;
+        if (((value & CONFIG_ALARM_MASK_WEDNESDAY)!=0) && (tmStruct->tm_wday==3))
+            checkTime=true;
+        if (((value & CONFIG_ALARM_MASK_THURSDAY)!=0) && (tmStruct->tm_wday==4))
+            checkTime=true;
+        if (((value & CONFIG_ALARM_MASK_FRIDAY)!=0) && (tmStruct->tm_wday==5))
+            checkTime=true;
+        if (((value & CONFIG_ALARM_MASK_SATURDAY)!=0) && (tmStruct->tm_wday==6))
+            checkTime=true;
+        if (((value & CONFIG_ALARM_MASK_SUNDAY)!=0) && (tmStruct->tm_wday==0))
+            checkTime=true;
+            
+        if (checkTime==true)
+        {
+            value=Config_Get(typeTime);
+            if (value==((tmStruct->tm_hour << 8) | (tmStruct->tm_min)))
+            {
+                DPrintf("checkForAlarmSpecified: Alarm detecetd.\r\n");
+                LED_StartAnimation(LAE_WAKEUP);
+            }
+        }
+    }
+}
+    
+void checkForAlarm(void)
+{
+    struct tm                   *tmStruct;
+    time_t                      timeValue;
+
+    timeValue=time(NULL);
+    tmStruct=localtime(&timeValue);
+    
+    if (tmStruct->tm_min!=lastCheckedMinute)
+    {
+        lastCheckedMinute=tmStruct->tm_min;
+        
+        // check all alarm against current time
+        checkForAlarmSpecified(tmStruct,CT_ALARM_1_TIME,CT_ALARM_1_MASK);
+        checkForAlarmSpecified(tmStruct,CT_ALARM_2_TIME,CT_ALARM_2_MASK);
+        checkForAlarmSpecified(tmStruct,CT_ALARM_3_TIME,CT_ALARM_3_MASK);
+        checkForAlarmSpecified(tmStruct,CT_ALARM_4_TIME,CT_ALARM_4_MASK);
+        checkForAlarmSpecified(tmStruct,CT_ALARM_5_TIME,CT_ALARM_5_MASK);
+        checkForAlarmSpecified(tmStruct,CT_ALARM_6_TIME,CT_ALARM_6_MASK);
+    }
+}
+
 int main()
 {
     debug_Init();
@@ -12,6 +75,9 @@
 
     UI_Init();
 
+    Config_Init();
+
+//BSP_AUDIO_OUT_Play(NULL,28); 
 /*
 #include "SDFileSystem.h"
 SDFileSystem sd(PD_2, PC_8, PC_12, PC_11, "sd"); // MOSI, MISO, SCLK, SSEL
@@ -24,6 +90,8 @@
 
     for (;;)
     {
+        checkForAlarm();
+
         UI_Poll();
     }
 }