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

Committer:
loopsva
Date:
Fri Mar 04 00:31:32 2016 +0000
Revision:
0:1200a8585607
Child:
1:5e8986c83a89
Demo program for setting up RTC via the touchscreen on the F746

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:1200a8585607 1 #include "mbed.h"
loopsva 0:1200a8585607 2 #include "button_group.hpp"
loopsva 0:1200a8585607 3 #include "LCDclockSet.h" //various display graphics for clock
loopsva 0:1200a8585607 4
loopsva 0:1200a8585607 5 #if defined(TARGET_DISCO_F746NG)
loopsva 0:1200a8585607 6 #endif
loopsva 0:1200a8585607 7
loopsva 0:1200a8585607 8 //------------------------
loopsva 0:1200a8585607 9 //hardware equates
loopsva 0:1200a8585607 10
loopsva 0:1200a8585607 11 LCD_DISCO_F746NG lcd; // Object for LCD display
loopsva 0:1200a8585607 12 TS_DISCO_F746NG ts; // Object for touch pannel
loopsva 0:1200a8585607 13 RawSerial pc(USBTX, USBRX); // terminal console
loopsva 0:1200a8585607 14 DigitalOut gled(LED1);
loopsva 0:1200a8585607 15
loopsva 0:1200a8585607 16 LCDclockSet ss("ss"); //graphic display items
loopsva 0:1200a8585607 17
loopsva 0:1200a8585607 18 TS_StateTypeDef TS_State;
loopsva 0:1200a8585607 19
loopsva 0:1200a8585607 20 //------------------------
loopsva 0:1200a8585607 21 //LCD specific variables and constants
loopsva 0:1200a8585607 22
loopsva 0:1200a8585607 23 uint8_t lcd_text[30];
loopsva 0:1200a8585607 24
loopsva 0:1200a8585607 25 //------------------------
loopsva 0:1200a8585607 26 //RTC specific variables and constants
loopsva 0:1200a8585607 27
loopsva 0:1200a8585607 28 #define TBUFLEN 10 //size of smaller ascii time buffers
loopsva 0:1200a8585607 29 time_t ctTime; //time structure
loopsva 0:1200a8585607 30 int DST = 1; //Daylight Saving Time (or as defined in .ini file)
loopsva 0:1200a8585607 31 int TZone = -8; //Time Zone from UTC (or as defined in .ini file)
loopsva 0:1200a8585607 32 char timebuf_s[4];
loopsva 0:1200a8585607 33 char timebuf_hm[TBUFLEN]; //local time format buffer - 21:16
loopsva 0:1200a8585607 34 char timebuf_hms[TBUFLEN]; //local time format buffer - 21:16:43
loopsva 0:1200a8585607 35 char timebuf_mdy[TBUFLEN]; //local time format buffer - 04/01/14
loopsva 0:1200a8585607 36 char timebuf_dMyy[TBUFLEN + 4]; //local time format buffer - 01-Apr-2014
loopsva 0:1200a8585607 37 char timebuf_Myy[TBUFLEN]; //local time format buffer - -Apr-2014
loopsva 0:1200a8585607 38 char timebuf_dow[1]; //local time format buffer - 5
loopsva 0:1200a8585607 39
loopsva 0:1200a8585607 40 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:1200a8585607 41 // Display clock on LCD
loopsva 0:1200a8585607 42
loopsva 0:1200a8585607 43 #define CLOCKX 338
loopsva 0:1200a8585607 44 #define CLOCKLINE 21
loopsva 0:1200a8585607 45
loopsva 0:1200a8585607 46 void DispClockLCD() {
loopsva 0:1200a8585607 47 sprintf((char*)lcd_text, "%s %s", timebuf_dMyy, timebuf_hms);
loopsva 0:1200a8585607 48 uint32_t tc = lcd.GetTextColor();
loopsva 0:1200a8585607 49 lcd.SetTextColor(LCD_COLOR_YELLOW);
loopsva 0:1200a8585607 50 lcd.DisplayStringAt(CLOCKX, LINE(CLOCKLINE) + 8, (uint8_t *)&lcd_text, LEFT_MODE);
loopsva 0:1200a8585607 51 lcd.SetTextColor(tc);
loopsva 0:1200a8585607 52 }
loopsva 0:1200a8585607 53
loopsva 0:1200a8585607 54 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:1200a8585607 55 // Update time
loopsva 0:1200a8585607 56
loopsva 0:1200a8585607 57 void UpdateTimeRegs() {
loopsva 0:1200a8585607 58 strftime(timebuf_s, 4, "%S", localtime(&ctTime));
loopsva 0:1200a8585607 59 strftime(timebuf_mdy, TBUFLEN, "%m/%d/%y", localtime(&ctTime));
loopsva 0:1200a8585607 60 strftime(timebuf_dMyy, TBUFLEN * 2, "%d-%b-%Y", localtime(&ctTime));
loopsva 0:1200a8585607 61 strftime(timebuf_Myy, TBUFLEN, "-%b-%Y", localtime(&ctTime));
loopsva 0:1200a8585607 62 strftime(timebuf_hm, TBUFLEN, "%H:%M", localtime(&ctTime));
loopsva 0:1200a8585607 63 strftime(timebuf_hms, TBUFLEN, "%H:%M:%S", localtime(&ctTime));
loopsva 0:1200a8585607 64 strftime(timebuf_dow, 1, "%u", localtime(&ctTime));
loopsva 0:1200a8585607 65 }
loopsva 0:1200a8585607 66
loopsva 0:1200a8585607 67 void UpdateTime() {
loopsva 0:1200a8585607 68 ctTime = time(NULL) + ((TZone + DST) * 3600); //timezone and dst offsets
loopsva 0:1200a8585607 69 UpdateTimeRegs();
loopsva 0:1200a8585607 70 }
loopsva 0:1200a8585607 71
loopsva 0:1200a8585607 72 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:1200a8585607 73 //Wait and get a touched character
loopsva 0:1200a8585607 74
loopsva 0:1200a8585607 75 int readTouch() {
loopsva 0:1200a8585607 76 do{
loopsva 0:1200a8585607 77 wait_ms(50);
loopsva 0:1200a8585607 78 ts.GetState(&TS_State);
loopsva 0:1200a8585607 79 } while(!(TS_State.touchDetected));
loopsva 0:1200a8585607 80 int TouchData = 255;
loopsva 0:1200a8585607 81 uint8_t idx;
loopsva 0:1200a8585607 82 uint16_t x, y;
loopsva 0:1200a8585607 83 do{
loopsva 0:1200a8585607 84 wait_ms(50);
loopsva 0:1200a8585607 85 for (idx = 0; idx < TS_State.touchDetected; idx++) {
loopsva 0:1200a8585607 86 x = TS_State.touchX[idx];
loopsva 0:1200a8585607 87 y = TS_State.touchY[idx];
loopsva 0:1200a8585607 88 TouchData = ss.Touch12Block(x, y);
loopsva 0:1200a8585607 89 }
loopsva 0:1200a8585607 90 ts.GetState(&TS_State);
loopsva 0:1200a8585607 91 } while(TS_State.touchDetected);
loopsva 0:1200a8585607 92 return(TouchData);
loopsva 0:1200a8585607 93 }
loopsva 0:1200a8585607 94
loopsva 0:1200a8585607 95 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:1200a8585607 96 //Get 6 decimal characters from the TFT / touchscreen - use for date and time setting
loopsva 0:1200a8585607 97
loopsva 0:1200a8585607 98 char dtArray[6];
loopsva 0:1200a8585607 99
loopsva 0:1200a8585607 100 void Get6() {
loopsva 0:1200a8585607 101 while(1) {
loopsva 0:1200a8585607 102 int rt = 255;
loopsva 0:1200a8585607 103 int b = 1;
loopsva 0:1200a8585607 104 bool isNumb = false;
loopsva 0:1200a8585607 105 while(1) {
loopsva 0:1200a8585607 106 do{
loopsva 0:1200a8585607 107 wait_ms(100);
loopsva 0:1200a8585607 108 rt = readTouch();
loopsva 0:1200a8585607 109 } while(rt == 255);
loopsva 0:1200a8585607 110
loopsva 0:1200a8585607 111 if(rt < 10) {
loopsva 0:1200a8585607 112 ss.TouchClockBlock(b, rt, false);
loopsva 0:1200a8585607 113 isNumb = true;
loopsva 0:1200a8585607 114 dtArray[b - 1] = rt;
loopsva 0:1200a8585607 115 if(b < 6) b++;
loopsva 0:1200a8585607 116 }
loopsva 0:1200a8585607 117 if(rt == '<') {
loopsva 0:1200a8585607 118 ss.TouchClockBlock(b, NULL, true);
loopsva 0:1200a8585607 119 if(b > 1) {
loopsva 0:1200a8585607 120 b--;
loopsva 0:1200a8585607 121 ss.TouchClockBlock(b, NULL, true);
loopsva 0:1200a8585607 122 }
loopsva 0:1200a8585607 123 isNumb = false;
loopsva 0:1200a8585607 124 }
loopsva 0:1200a8585607 125 if((rt == '#') && (b == 6) && (isNumb == true)) {
loopsva 0:1200a8585607 126 isNumb = false;
loopsva 0:1200a8585607 127 return;
loopsva 0:1200a8585607 128 }
loopsva 0:1200a8585607 129 if(rt == '#') {
loopsva 0:1200a8585607 130 isNumb = false;
loopsva 0:1200a8585607 131 wait_ms(100);
loopsva 0:1200a8585607 132 }
loopsva 0:1200a8585607 133 if(b > 6) b = 6;
loopsva 0:1200a8585607 134 if(b < 1) b = 1;
loopsva 0:1200a8585607 135 rt = 255;
loopsva 0:1200a8585607 136 wait_ms(300);
loopsva 0:1200a8585607 137 }
loopsva 0:1200a8585607 138 }
loopsva 0:1200a8585607 139 }
loopsva 0:1200a8585607 140
loopsva 0:1200a8585607 141 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:1200a8585607 142 //Manually set the date and time
loopsva 0:1200a8585607 143
loopsva 0:1200a8585607 144 char DateTime[12];
loopsva 0:1200a8585607 145
loopsva 0:1200a8585607 146 void SetRTClcd() {
loopsva 0:1200a8585607 147 ss.Draw12Block(1, LCD_COLOR_DARKGREEN, LCD_COLOR_YELLOW);
loopsva 0:1200a8585607 148 ss.DrawClockBlock('/');
loopsva 0:1200a8585607 149 Get6();
loopsva 0:1200a8585607 150 for(int i = 0; i < 6; i++) {
loopsva 0:1200a8585607 151 DateTime[i] = dtArray[i];
loopsva 0:1200a8585607 152 }
loopsva 0:1200a8585607 153 ss.Draw12Block(1, LCD_COLOR_DARKGREEN, LCD_COLOR_YELLOW);
loopsva 0:1200a8585607 154 ss.DrawClockBlock(':');
loopsva 0:1200a8585607 155 Get6();
loopsva 0:1200a8585607 156 for(int i = 0; i < 6; i++) {
loopsva 0:1200a8585607 157 DateTime[i + 6] = dtArray[i];
loopsva 0:1200a8585607 158 }
loopsva 0:1200a8585607 159
loopsva 0:1200a8585607 160 struct tm t;
loopsva 0:1200a8585607 161 t.tm_year = (2000 + (DateTime[4] * 10) + DateTime[5]);
loopsva 0:1200a8585607 162 t.tm_mon = ((DateTime[0] * 10) + DateTime[1]);
loopsva 0:1200a8585607 163 t.tm_mday = ((DateTime[2] * 10) + DateTime[3]);
loopsva 0:1200a8585607 164 t.tm_hour = ((DateTime[6] * 10) + DateTime[7]);
loopsva 0:1200a8585607 165 t.tm_min = ((DateTime[8] * 10) + DateTime[9]);
loopsva 0:1200a8585607 166 t.tm_sec = ((DateTime[10] * 10) + DateTime[11]);
loopsva 0:1200a8585607 167
loopsva 0:1200a8585607 168 // adjust for tm structure required values
loopsva 0:1200a8585607 169 t.tm_year = t.tm_year - 1900;
loopsva 0:1200a8585607 170 t.tm_mon = t.tm_mon - 1;
loopsva 0:1200a8585607 171 // set the time
loopsva 0:1200a8585607 172 time_t ctTime = mktime(&t);
loopsva 0:1200a8585607 173 ctTime = ctTime - (TZone + DST) * 3600; //take out local time
loopsva 0:1200a8585607 174 set_time(ctTime);
loopsva 0:1200a8585607 175 UpdateTime();
loopsva 0:1200a8585607 176 }
loopsva 0:1200a8585607 177
loopsva 0:1200a8585607 178 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:1200a8585607 179 //main
loopsva 0:1200a8585607 180
loopsva 0:1200a8585607 181 int main()
loopsva 0:1200a8585607 182 {
loopsva 0:1200a8585607 183 //TS_StateTypeDef TS_State;
loopsva 0:1200a8585607 184 uint16_t x, y;
loopsva 0:1200a8585607 185 uint8_t status;
loopsva 0:1200a8585607 186 uint8_t idx;
loopsva 0:1200a8585607 187 uint8_t cleared = 0;
loopsva 0:1200a8585607 188 uint8_t prev_nb_touches = 0;
loopsva 0:1200a8585607 189
loopsva 0:1200a8585607 190 gled = 1;
loopsva 0:1200a8585607 191
loopsva 0:1200a8585607 192 pc.baud(230400);
loopsva 0:1200a8585607 193
loopsva 0:1200a8585607 194 // Setting of button group
loopsva 0:1200a8585607 195 lcd.Clear(LCD_COLOR_BLACK);
loopsva 0:1200a8585607 196 lcd.SetBackColor(LCD_COLOR_BLACK);
loopsva 0:1200a8585607 197 lcd.SetTextColor(LCD_COLOR_CYAN);
loopsva 0:1200a8585607 198 lcd.SetFont(&Font20);
loopsva 0:1200a8585607 199 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"Set Clock Via LCD Demo", CENTER_MODE);
loopsva 0:1200a8585607 200 wait(3.0);
loopsva 0:1200a8585607 201
loopsva 0:1200a8585607 202 status = ts.Init(lcd.GetXSize(), lcd.GetYSize());
loopsva 0:1200a8585607 203 if (status != TS_OK) {
loopsva 0:1200a8585607 204 lcd.Clear(LCD_COLOR_RED);
loopsva 0:1200a8585607 205 lcd.SetBackColor(LCD_COLOR_RED);
loopsva 0:1200a8585607 206 lcd.SetTextColor(LCD_COLOR_WHITE);
loopsva 0:1200a8585607 207 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE);
loopsva 0:1200a8585607 208 } else {
loopsva 0:1200a8585607 209 lcd.Clear(LCD_COLOR_GREEN);
loopsva 0:1200a8585607 210 lcd.SetBackColor(LCD_COLOR_GREEN);
loopsva 0:1200a8585607 211 lcd.SetTextColor(LCD_COLOR_WHITE);
loopsva 0:1200a8585607 212 lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE);
loopsva 0:1200a8585607 213 }
loopsva 0:1200a8585607 214
loopsva 0:1200a8585607 215 wait(1.5);
loopsva 0:1200a8585607 216
loopsva 0:1200a8585607 217 //go set the RTC via the LCD
loopsva 0:1200a8585607 218 SetRTClcd();
loopsva 0:1200a8585607 219
loopsva 0:1200a8585607 220 lcd.SetFont(&Font12);
loopsva 0:1200a8585607 221 lcd.Clear(LCD_COLOR_BLUE);
loopsva 0:1200a8585607 222 lcd.SetBackColor(LCD_COLOR_BLUE);
loopsva 0:1200a8585607 223 lcd.SetTextColor(LCD_COLOR_WHITE);
loopsva 0:1200a8585607 224
loopsva 0:1200a8585607 225 //the touchscreen demo with RTC in the lower-right corner
loopsva 0:1200a8585607 226 while (true) {
loopsva 0:1200a8585607 227 ts.GetState(&TS_State);
loopsva 0:1200a8585607 228 if (TS_State.touchDetected) {
loopsva 0:1200a8585607 229 // Clear lines corresponding to old touches coordinates
loopsva 0:1200a8585607 230 if (TS_State.touchDetected < prev_nb_touches) {
loopsva 0:1200a8585607 231 for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
loopsva 0:1200a8585607 232 lcd.ClearStringLine(idx);
loopsva 0:1200a8585607 233 }
loopsva 0:1200a8585607 234 }
loopsva 0:1200a8585607 235 prev_nb_touches = TS_State.touchDetected;
loopsva 0:1200a8585607 236
loopsva 0:1200a8585607 237 cleared = 0;
loopsva 0:1200a8585607 238
loopsva 0:1200a8585607 239 sprintf((char*)lcd_text, "Touched: %d", TS_State.touchDetected);
loopsva 0:1200a8585607 240 lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&lcd_text, LEFT_MODE);
loopsva 0:1200a8585607 241
loopsva 0:1200a8585607 242 for (idx = 0; idx < TS_State.touchDetected; idx++) {
loopsva 0:1200a8585607 243 x = TS_State.touchX[idx];
loopsva 0:1200a8585607 244 y = TS_State.touchY[idx];
loopsva 0:1200a8585607 245 sprintf((char*)lcd_text, "Touch %d: x=%d y=%d ", idx+1, x, y);
loopsva 0:1200a8585607 246 lcd.DisplayStringAt(0, LINE(idx+1), (uint8_t *)&lcd_text, LEFT_MODE);
loopsva 0:1200a8585607 247 }
loopsva 0:1200a8585607 248 lcd.DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE);
loopsva 0:1200a8585607 249 } else {
loopsva 0:1200a8585607 250 if (!cleared) {
loopsva 0:1200a8585607 251 lcd.Clear(LCD_COLOR_BLUE);
loopsva 0:1200a8585607 252 sprintf((char*)lcd_text, "Touches: 0");
loopsva 0:1200a8585607 253 lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&lcd_text, LEFT_MODE);
loopsva 0:1200a8585607 254 cleared = 1;
loopsva 0:1200a8585607 255 }
loopsva 0:1200a8585607 256 }
loopsva 0:1200a8585607 257 gled = !gled;
loopsva 0:1200a8585607 258 wait_ms(200);
loopsva 0:1200a8585607 259 UpdateTime();
loopsva 0:1200a8585607 260 DispClockLCD();
loopsva 0:1200a8585607 261 }
loopsva 0:1200a8585607 262 }