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

UI.cpp

Committer:
the_sz
Date:
2015-10-29
Revision:
2:80026d18fcf3
Child:
3:ecf7f1f8d749

File content as of revision 2:80026d18fcf3:

#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);
}