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

Committer:
loopsva
Date:
Fri Mar 04 00:31:32 2016 +0000
Revision:
0:1200a8585607
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 }