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:
rickd25
Date:
Wed Jun 15 01:37:52 2016 +0000
Revision:
1:5e8986c83a89
Parent:
0:1200a8585607
initial

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