Demo program for setting up RTC via the touchscreen on the F746
Dependencies: BSP_DISCO_F746NG BUTTON_GROUP LCD_DISCO_F746NG LCDclockSet_F746 TS_DISCO_F746NG mbed
Revision 0:1200a8585607, committed 2016-03-04
- Comitter:
- loopsva
- Date:
- Fri Mar 04 00:31:32 2016 +0000
- Commit message:
- Demo program for setting up RTC via the touchscreen on the F746
Changed in this revision
diff -r 000000000000 -r 1200a8585607 BSP_DISCO_F746NG.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BSP_DISCO_F746NG.lib Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/BSP_DISCO_F746NG/#ee089790cdbb
diff -r 000000000000 -r 1200a8585607 BUTTON_GROUP.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BUTTON_GROUP.lib Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/MikamiUitOpen/code/BUTTON_GROUP/#af578b53ff0e
diff -r 000000000000 -r 1200a8585607 LCD_DISCO_F746NG.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCD_DISCO_F746NG.lib Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/LCD_DISCO_F746NG/#d44525b1de98
diff -r 000000000000 -r 1200a8585607 LCDclockSet_F746.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LCDclockSet_F746.lib Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/loopsva/code/LCDclockSet_F746/#c6da6fc05965
diff -r 000000000000 -r 1200a8585607 TS_DISCO_F746NG.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TS_DISCO_F746NG.lib Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/TS_DISCO_F746NG/#fe0cf5e2960f
diff -r 000000000000 -r 1200a8585607 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,262 @@ +#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(); + } +}
diff -r 000000000000 -r 1200a8585607 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Mar 04 00:31:32 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/87f2f5183dfb \ No newline at end of file