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
main.cpp@0:1200a8585607, 2016-03-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |