Demo program for setting up RTC via the touchscreen on the F746 and touch screen demo. Hold push button on boot up to set time. Press button while drawing to clear screen.

Dependencies:   BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG LCDclockSet_F746 TS_DISCO_F746NG mbed

Fork of DISCO-F746NG-clockSet by Kevin Braun

main.cpp

Committer:
loopsva
Date:
2016-03-04
Revision:
0:1200a8585607
Child:
1:5e8986c83a89

File content as of revision 0:1200a8585607:

#include "mbed.h"
#include "button_group.hpp"
#include "LCDclockSet.h"                    //various display graphics for clock

#if defined(TARGET_DISCO_F746NG)
#endif

//------------------------
//hardware equates

LCD_DISCO_F746NG lcd;                       // Object for LCD display
TS_DISCO_F746NG ts;                         // Object for touch pannel
RawSerial pc(USBTX, USBRX);                 // terminal console
DigitalOut gled(LED1);

LCDclockSet ss("ss");                       //graphic display items

TS_StateTypeDef TS_State;

//------------------------
//LCD specific variables and constants

uint8_t lcd_text[30];

//------------------------
//RTC specific variables and constants

#define TBUFLEN                     10      //size of smaller ascii time buffers
time_t ctTime;                              //time structure
int DST = 1;                                //Daylight Saving Time (or as defined in .ini file)
int TZone = -8;                             //Time Zone from UTC (or as defined in .ini file)
char timebuf_s[4];
char timebuf_hm[TBUFLEN];                   //local time format buffer - 21:16
char timebuf_hms[TBUFLEN];                  //local time format buffer - 21:16:43
char timebuf_mdy[TBUFLEN];                  //local time format buffer - 04/01/14
char timebuf_dMyy[TBUFLEN + 4];             //local time format buffer - 01-Apr-2014
char timebuf_Myy[TBUFLEN];                  //local time format buffer - -Apr-2014
char timebuf_dow[1];                        //local time format buffer - 5

//--------------------------------------------------------------------------------------------------------------------------------------//
// Display clock on LCD

#define CLOCKX                  338
#define CLOCKLINE               21

void DispClockLCD() {
    sprintf((char*)lcd_text, "%s %s", timebuf_dMyy, timebuf_hms);
    uint32_t tc = lcd.GetTextColor();
    lcd.SetTextColor(LCD_COLOR_YELLOW);
    lcd.DisplayStringAt(CLOCKX, LINE(CLOCKLINE) + 8, (uint8_t *)&lcd_text, LEFT_MODE);
    lcd.SetTextColor(tc);
}

//--------------------------------------------------------------------------------------------------------------------------------------//
// Update time

void UpdateTimeRegs() {
    strftime(timebuf_s, 4, "%S", localtime(&ctTime));
    strftime(timebuf_mdy, TBUFLEN, "%m/%d/%y", localtime(&ctTime));
    strftime(timebuf_dMyy, TBUFLEN * 2, "%d-%b-%Y", localtime(&ctTime));
    strftime(timebuf_Myy, TBUFLEN, "-%b-%Y", localtime(&ctTime));
    strftime(timebuf_hm, TBUFLEN, "%H:%M", localtime(&ctTime));
    strftime(timebuf_hms, TBUFLEN, "%H:%M:%S", localtime(&ctTime));
    strftime(timebuf_dow, 1, "%u", localtime(&ctTime));
}

void UpdateTime() {
    ctTime = time(NULL) + ((TZone + DST) * 3600);   //timezone and dst offsets
    UpdateTimeRegs();
}

//--------------------------------------------------------------------------------------------------------------------------------------//
//Wait and get a touched character

int readTouch() {
    do{
        wait_ms(50);
        ts.GetState(&TS_State);
    } while(!(TS_State.touchDetected));
    int TouchData = 255;
    uint8_t idx;
    uint16_t x, y;
    do{
        wait_ms(50);
        for (idx = 0; idx < TS_State.touchDetected; idx++) {
            x = TS_State.touchX[idx];
            y = TS_State.touchY[idx];
            TouchData = ss.Touch12Block(x, y);
        }
        ts.GetState(&TS_State);
    } while(TS_State.touchDetected);
    return(TouchData);
}
    
//--------------------------------------------------------------------------------------------------------------------------------------//
//Get 6 decimal characters from the TFT / touchscreen - use for date and time setting

char dtArray[6];

void Get6() {
    while(1) {
        int rt = 255;
        int b = 1;
        bool isNumb = false;
        while(1) {
            do{
                wait_ms(100);
                rt = readTouch();
            } while(rt == 255);
            
            if(rt < 10) {
                ss.TouchClockBlock(b, rt, false);
                isNumb = true;
                dtArray[b - 1] = rt;
                if(b < 6) b++;
            }
            if(rt == '<') {
                ss.TouchClockBlock(b, NULL, true);
                if(b > 1) {
                    b--;
                    ss.TouchClockBlock(b, NULL, true);
                }
                isNumb = false;
            }
            if((rt == '#') && (b == 6) && (isNumb == true)) {
                isNumb = false;
                return;
            }
            if(rt == '#') {
                isNumb = false;
                wait_ms(100);
            }
            if(b > 6) b = 6;
            if(b < 1) b = 1;
            rt = 255;
            wait_ms(300);
        }
    }
}

//--------------------------------------------------------------------------------------------------------------------------------------//
//Manually set the date and time

char DateTime[12]; 

void SetRTClcd() {
    ss.Draw12Block(1, LCD_COLOR_DARKGREEN, LCD_COLOR_YELLOW);  
    ss.DrawClockBlock('/'); 
    Get6();
    for(int i = 0; i < 6; i++) {
        DateTime[i] = dtArray[i];
    }
    ss.Draw12Block(1, LCD_COLOR_DARKGREEN, LCD_COLOR_YELLOW); 
    ss.DrawClockBlock(':'); 
    Get6();
    for(int i = 0; i < 6; i++) {
        DateTime[i + 6] = dtArray[i];
    }

    struct tm t;
    t.tm_year = (2000 + (DateTime[4] * 10) + DateTime[5]);
    t.tm_mon = ((DateTime[0] * 10) + DateTime[1]);
    t.tm_mday = ((DateTime[2] * 10) + DateTime[3]);
    t.tm_hour = ((DateTime[6] * 10) + DateTime[7]);
    t.tm_min = ((DateTime[8] * 10) + DateTime[9]);
    t.tm_sec = ((DateTime[10] * 10) + DateTime[11]);
    
    // adjust for tm structure required values
    t.tm_year = t.tm_year - 1900;
    t.tm_mon = t.tm_mon - 1;    
    // set the time
    time_t ctTime = mktime(&t);
    ctTime = ctTime - (TZone + DST) * 3600;     //take out local time
    set_time(ctTime);
    UpdateTime();
}

//--------------------------------------------------------------------------------------------------------------------------------------//
//main

int main()
{
    //TS_StateTypeDef TS_State;
    uint16_t x, y;
    uint8_t status;
    uint8_t idx;
    uint8_t cleared = 0;
    uint8_t prev_nb_touches = 0;
    
    gled = 1;
    
    pc.baud(230400);
    
    // Setting of button group
    lcd.Clear(LCD_COLOR_BLACK);
    lcd.SetBackColor(LCD_COLOR_BLACK);
    lcd.SetTextColor(LCD_COLOR_CYAN);
    lcd.SetFont(&Font20);
    lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Set Clock Via LCD Demo", CENTER_MODE);
    wait(3.0);
    
    status = ts.Init(lcd.GetXSize(), lcd.GetYSize());
    if (status != TS_OK) {
        lcd.Clear(LCD_COLOR_RED);
        lcd.SetBackColor(LCD_COLOR_RED);
        lcd.SetTextColor(LCD_COLOR_WHITE);
        lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
    } else {
        lcd.Clear(LCD_COLOR_GREEN);
        lcd.SetBackColor(LCD_COLOR_GREEN);
        lcd.SetTextColor(LCD_COLOR_WHITE);
        lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
    }

    wait(1.5);
    
    //go set the RTC via the LCD
    SetRTClcd();

    lcd.SetFont(&Font12);
    lcd.Clear(LCD_COLOR_BLUE);
    lcd.SetBackColor(LCD_COLOR_BLUE);
    lcd.SetTextColor(LCD_COLOR_WHITE);

    //the touchscreen demo with RTC in the lower-right corner
    while (true) {
        ts.GetState(&TS_State);
        if (TS_State.touchDetected) {
            // Clear lines corresponding to old touches coordinates
            if (TS_State.touchDetected < prev_nb_touches) {
                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
                    lcd.ClearStringLine(idx);
                }
            }
            prev_nb_touches = TS_State.touchDetected;

            cleared = 0;

            sprintf((char*)lcd_text, "Touched: %d", TS_State.touchDetected);
            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&lcd_text, LEFT_MODE);

            for (idx = 0; idx < TS_State.touchDetected; idx++) {
                x = TS_State.touchX[idx];
                y = TS_State.touchY[idx];
                sprintf((char*)lcd_text, "Touch %d: x=%d y=%d    ", idx+1, x, y);
                lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&lcd_text, LEFT_MODE);
            }
            lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
        } else {
            if (!cleared) {
                lcd.Clear(LCD_COLOR_BLUE);
                sprintf((char*)lcd_text, "Touches: 0");
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&lcd_text, LEFT_MODE);
                cleared = 1;
            }
        }
        gled = !gled;
        wait_ms(200);
        UpdateTime();
        DispClockLCD();
    }
}