A general demonstration color etch-a-sketch program using the QVGA TFT with HX8347D controller, Orange Board. Saves touchscreen calibaration data saved in tft.ini. Creates /local/tft.ini if missing. Also included is an Ethernet NTP client to update the RTC. Assumes all other Orange Board devices attached: Text LCD, SDHC Flash, Ethernet.
Dependencies: EthernetNetIf TextLCD mbed
main.cpp@0:e065ca40f28a, 2011-08-01 (annotated)
- Committer:
- loopsva
- Date:
- Mon Aug 01 16:29:58 2011 +0000
- Revision:
- 0:e065ca40f28a
Inititial Release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
loopsva | 0:e065ca40f28a | 1 | /* |
loopsva | 0:e065ca40f28a | 2 | Rev Date Changes: |
loopsva | 0:e065ca40f28a | 3 | ------------------------------------------------------------------------------------------------------------------------------------------ |
loopsva | 0:e065ca40f28a | 4 | 100 7/19/11 - initial offering |
loopsva | 0:e065ca40f28a | 5 | 101 7/25/11 - Adding RTC display-only functions. No provisions for setting the clock |
loopsva | 0:e065ca40f28a | 6 | - Added red "clear_drawing" box to TFT |
loopsva | 0:e065ca40f28a | 7 | - Added multi-color "change_pen_color" box |
loopsva | 0:e065ca40f28a | 8 | - Added blue, pen_fattness circle (1-8) |
loopsva | 0:e065ca40f28a | 9 | - Added "orange" color to pen_color selection |
loopsva | 0:e065ca40f28a | 10 | - Added hidden system_reset function w/pen touch near "TFT" text |
loopsva | 0:e065ca40f28a | 11 | 102 7/26/11 - Added EthernetNetIF and TinySNTP for updating RTC over Ethernet |
loopsva | 0:e065ca40f28a | 12 | - Added a color choice palette after reset. Palette goes away after clear_screen |
loopsva | 0:e065ca40f28a | 13 | 103 7/28/11 - Expqanded NTP service to two possible NTP servers. In and IP address, the other named |
loopsva | 0:e065ca40f28a | 14 | - Added tube symbol for display |
loopsva | 0:e065ca40f28a | 15 | - Modified the start-up splash screen |
loopsva | 0:e065ca40f28a | 16 | 104 7/28/11 - Made tube display indepentent of rotation |
loopsva | 0:e065ca40f28a | 17 | - Added more NTP server options |
loopsva | 0:e065ca40f28a | 18 | ------------------------------------------------------------------------------------------------------------------------------------------ |
loopsva | 0:e065ca40f28a | 19 | Known issues: |
loopsva | 0:e065ca40f28a | 20 | ------------------------------------------------------------------------------------------------------------------------------------------ |
loopsva | 0:e065ca40f28a | 21 | */ |
loopsva | 0:e065ca40f28a | 22 | int revision = 104; // revision of this code |
loopsva | 0:e065ca40f28a | 23 | #include "mbed.h" |
loopsva | 0:e065ca40f28a | 24 | #include "SDHCFileSystem.h" // MUST be before EthernetNetIf.h or compile error occurs!!!! |
loopsva | 0:e065ca40f28a | 25 | #include "adc.h" |
loopsva | 0:e065ca40f28a | 26 | #include "EthernetNetIf.h" |
loopsva | 0:e065ca40f28a | 27 | #include "TinySNTP.h" |
loopsva | 0:e065ca40f28a | 28 | #include "TextLCD.h" |
loopsva | 0:e065ca40f28a | 29 | #include "SPI_TFT.h" |
loopsva | 0:e065ca40f28a | 30 | #include "Arial12x12.h" |
loopsva | 0:e065ca40f28a | 31 | #include "Arial24x23.h" |
loopsva | 0:e065ca40f28a | 32 | #include "Arial28x28.h" |
loopsva | 0:e065ca40f28a | 33 | #include "font_big.h" |
loopsva | 0:e065ca40f28a | 34 | #include "Courier10x13-12B.h" // kb modified font created by GLCD_Font_Creator.1.20.exe |
loopsva | 0:e065ca40f28a | 35 | #include "Verdana22x21-16.h" // kb modified font created by GLCD_Font_Creator.1.20.exe |
loopsva | 0:e065ca40f28a | 36 | #include "BookAntiqua19x19-14.h" // kb modified font created by GLCD_Font_Creator.1.20.exe |
loopsva | 0:e065ca40f28a | 37 | #include "touch_tft.h" |
loopsva | 0:e065ca40f28a | 38 | |
loopsva | 0:e065ca40f28a | 39 | #define DEFAULTHOSTNAME "mbed-c3p1" |
loopsva | 0:e065ca40f28a | 40 | char *hostname = DEFAULTHOSTNAME; |
loopsva | 0:e065ca40f28a | 41 | |
loopsva | 0:e065ca40f28a | 42 | //#define RTCCOLOR "Red" |
loopsva | 0:e065ca40f28a | 43 | //char *JunkText = RTCCOLOR; |
loopsva | 0:e065ca40f28a | 44 | //char *RtcColor = RTCCOLOR; |
loopsva | 0:e065ca40f28a | 45 | |
loopsva | 0:e065ca40f28a | 46 | #define SAMPLE_RATE 150000 |
loopsva | 0:e065ca40f28a | 47 | #define CLS "\033[2J" |
loopsva | 0:e065ca40f28a | 48 | extern "C" void mbed_reset(); |
loopsva | 0:e065ca40f28a | 49 | #define Orange 0xF9E0 |
loopsva | 0:e065ca40f28a | 50 | |
loopsva | 0:e065ca40f28a | 51 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 52 | //I/O Pin Definitions |
loopsva | 0:e065ca40f28a | 53 | |
loopsva | 0:e065ca40f28a | 54 | LocalFileSystem local("local"); |
loopsva | 0:e065ca40f28a | 55 | PwmOut led1(LED1, "led1"); |
loopsva | 0:e065ca40f28a | 56 | DigitalOut led2(LED2, "led2"); |
loopsva | 0:e065ca40f28a | 57 | DigitalOut led3(LED3, "led3"); |
loopsva | 0:e065ca40f28a | 58 | DigitalOut led4(LED4, "led4"); |
loopsva | 0:e065ca40f28a | 59 | EthernetNetIf eth; |
loopsva | 0:e065ca40f28a | 60 | Serial pc(USBTX, USBRX); // Serial USB communications over mbed USB port |
loopsva | 0:e065ca40f28a | 61 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sclk, cs |
loopsva | 0:e065ca40f28a | 62 | touch_tft tt(p19, p15, p16, p17, p5, p6, p7, p9, p14,"TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs, reset |
loopsva | 0:e065ca40f28a | 63 | TextLCD lcdt(p24, /*p25, */p26, p27, p28, p29, p30, TextLCD::LCD16x2); // rs, rw, e, d0, d1, d2, d3 |
loopsva | 0:e065ca40f28a | 64 | DigitalOut LCDrw(p25, "LCDrw"); // new LCD code no longer requries R/W pin - tie low (J5 on Orange Board) |
loopsva | 0:e065ca40f28a | 65 | |
loopsva | 0:e065ca40f28a | 66 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 67 | // Global Variables |
loopsva | 0:e065ca40f28a | 68 | |
loopsva | 0:e065ca40f28a | 69 | int gDebug = 1; // display debog level (0 - 3) |
loopsva | 0:e065ca40f28a | 70 | int OldgDebug = gDebug; // copy of gDebug for updating tft.ini |
loopsva | 0:e065ca40f28a | 71 | ADC adc(SAMPLE_RATE, 1); |
loopsva | 0:e065ca40f28a | 72 | bool use_sd = false; // flag for using SDHC file system |
loopsva | 0:e065ca40f28a | 73 | bool ZeroMinFlag = false; // alignment to 00:00:00 flag |
loopsva | 0:e065ca40f28a | 74 | float Led1Pwm = 0.01; // LED1 brightness |
loopsva | 0:e065ca40f28a | 75 | bool Led1Up = true; // LED1 auto up-down |
loopsva | 0:e065ca40f28a | 76 | float gWait = 0.005; // Main loop wait timeout |
loopsva | 0:e065ca40f28a | 77 | float const DISP_SLOW(2.0); // Long wait for LCD display |
loopsva | 0:e065ca40f28a | 78 | float const DISP_FAST(0.5); // Faster wait for LCD |
loopsva | 0:e065ca40f28a | 79 | char timebuf[32]; // local time format buffer |
loopsva | 0:e065ca40f28a | 80 | char timebuf_d[32]; // local time format buffer - date only |
loopsva | 0:e065ca40f28a | 81 | char timebufUTC[32]; // UTC time format buffer |
loopsva | 0:e065ca40f28a | 82 | int DST = 0; // Daylight Saving Time (or as defined in tft.ini) |
loopsva | 0:e065ca40f28a | 83 | int OldDST = DST; // Copy of DST for updating tft.ini |
loopsva | 0:e065ca40f28a | 84 | int TZone = -8; // Time Zone from UTC (or as defined in tft.ini) |
loopsva | 0:e065ca40f28a | 85 | int OldTZone = TZone; // copy for updating tft.ini |
loopsva | 0:e065ca40f28a | 86 | time_t ctTime; // get time structure |
loopsva | 0:e065ca40f28a | 87 | int StartTime; // time we powered up |
loopsva | 0:e065ca40f28a | 88 | int SysUpTime; // time we've been alive |
loopsva | 0:e065ca40f28a | 89 | int RTCstep; // value for NTP update interval timer |
loopsva | 0:e065ca40f28a | 90 | int NTPUpdateValue = 86400; // update RTC every 24 hours (or as defined in tft.ini) |
loopsva | 0:e065ca40f28a | 91 | int TftCalib = 1; // TFT touchpad calibration, 1=yes (as defined in tft.ini) |
loopsva | 0:e065ca40f28a | 92 | unsigned int SerialNum[5] = {58,0,0,0,0}; // mbed serial number data |
loopsva | 0:e065ca40f28a | 93 | int TftDrawColor = 0; // pick pencil color |
loopsva | 0:e065ca40f28a | 94 | int PenColor = 0xFFFF; // color of pen |
loopsva | 0:e065ca40f28a | 95 | int PenWidth = 3; // fattness of pen |
loopsva | 0:e065ca40f28a | 96 | bool PenSizeUp = true; // fatter or skinnier |
loopsva | 0:e065ca40f28a | 97 | char pOnce = 0; // display the palette only once |
loopsva | 0:e065ca40f28a | 98 | int CurRot = 0; // object rotation 0-3 |
loopsva | 0:e065ca40f28a | 99 | int PosX = 120; // object X location |
loopsva | 0:e065ca40f28a | 100 | int PosY = 160; // object Y location |
loopsva | 0:e065ca40f28a | 101 | |
loopsva | 0:e065ca40f28a | 102 | int RTCupdate = 0; // parameter update timer |
loopsva | 0:e065ca40f28a | 103 | int const RTCUpdateValue = 60; // 600; // update values every minute |
loopsva | 0:e065ca40f28a | 104 | unsigned int Align1Min=0; // used to align sensor access to exactly every minute, on the minute |
loopsva | 0:e065ca40f28a | 105 | unsigned int Align10Min=0; // same as above for 10 minute (i.e. 0:00min, 10:00min, 20:00min, etc. |
loopsva | 0:e065ca40f28a | 106 | int minuteAvg = 0.0; // number of minutes between accesses to storage of data |
loopsva | 0:e065ca40f28a | 107 | |
loopsva | 0:e065ca40f28a | 108 | unsigned short pp_txm = 0; // tft touchscreen calibration values |
loopsva | 0:e065ca40f28a | 109 | unsigned short pp_tym = 0; |
loopsva | 0:e065ca40f28a | 110 | unsigned short pp_txoff = 0; |
loopsva | 0:e065ca40f28a | 111 | unsigned short pp_tyoff = 0; |
loopsva | 0:e065ca40f28a | 112 | |
loopsva | 0:e065ca40f28a | 113 | float Press0Ft = 102.4; // altimeter - assumed pressure at sea level |
loopsva | 0:e065ca40f28a | 114 | float Saved0Ft = Press0Ft; // saved for later comparison if changed by HTTP |
loopsva | 0:e065ca40f28a | 115 | float OldPress0Ft = Press0Ft; // another copy for updating tft.ini |
loopsva | 0:e065ca40f28a | 116 | |
loopsva | 0:e065ca40f28a | 117 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 118 | // initialize mbed "ini" configuration file if it doesn't already exist -or- updates the ini file if a change is made in s/w |
loopsva | 0:e065ca40f28a | 119 | |
loopsva | 0:e065ca40f28a | 120 | void InitIniFile() { |
loopsva | 0:e065ca40f28a | 121 | FILE *fp = fopen("/local/tft.ini", "w"); |
loopsva | 0:e065ca40f28a | 122 | if (fp == NULL) { |
loopsva | 0:e065ca40f28a | 123 | pc.printf("*** Cannot create tft.ini file!!!\n"); |
loopsva | 0:e065ca40f28a | 124 | } else { |
loopsva | 0:e065ca40f28a | 125 | // if(gDebug > 1) pc.printf("*** Updating/Creating tft.ini file...\n"); |
loopsva | 0:e065ca40f28a | 126 | fprintf(fp, "# mbed configuration file\r\n"); |
loopsva | 0:e065ca40f28a | 127 | fprintf(fp, "\r\n[NTP Servers]\r\n"); |
loopsva | 0:e065ca40f28a | 128 | // for (int i=0; i<sntp_num_servers; i++) { |
loopsva | 0:e065ca40f28a | 129 | // fprintf(f, "%s" CRLF, sntp_server_addresses[i]); |
loopsva | 0:e065ca40f28a | 130 | // } |
loopsva | 0:e065ca40f28a | 131 | fprintf(fp, "\r\n[Global]\r\n"); |
loopsva | 0:e065ca40f28a | 132 | char *hostname = DEFAULTHOSTNAME; |
loopsva | 0:e065ca40f28a | 133 | fprintf(fp, "xMyName=%s\r\n",hostname); //***MyName is broken*** |
loopsva | 0:e065ca40f28a | 134 | fprintf(fp, "TftCalib=%d\r\n", TftCalib); // 1= calibration required |
loopsva | 0:e065ca40f28a | 135 | fprintf(fp, "TftCalTxm=%d\r\n", pp_txm); |
loopsva | 0:e065ca40f28a | 136 | fprintf(fp, "TftCalTym=%d\r\n", pp_tym); |
loopsva | 0:e065ca40f28a | 137 | fprintf(fp, "TftCalTxOff=%d\r\n", pp_txoff); |
loopsva | 0:e065ca40f28a | 138 | fprintf(fp, "TftCalTyOff=%d\r\n", pp_tyoff); |
loopsva | 0:e065ca40f28a | 139 | // char *RtcColor = RTCCOLOR; |
loopsva | 0:e065ca40f28a | 140 | // char *JunkText = RTCCOLOR; |
loopsva | 0:e065ca40f28a | 141 | // fprintf(fp, "TftRtcColor=%s\r\n", RtcColor); |
loopsva | 0:e065ca40f28a | 142 | fprintf(fp, "Timezone(hrs)=%d\r\n", TZone); |
loopsva | 0:e065ca40f28a | 143 | fprintf(fp, "DstZone(hrs)=%d\r\n", DST); |
loopsva | 0:e065ca40f28a | 144 | fprintf(fp, "NTPRefresh(sec)=%d\r\n", NTPUpdateValue); |
loopsva | 0:e065ca40f28a | 145 | fprintf(fp, "PressureSeaLevel=%f\r\n", Press0Ft); |
loopsva | 0:e065ca40f28a | 146 | fprintf(fp, "gDebugLevel=%d\r\n", gDebug); |
loopsva | 0:e065ca40f28a | 147 | fprintf(fp, "\r\n##END\r\n"); |
loopsva | 0:e065ca40f28a | 148 | fclose(fp); |
loopsva | 0:e065ca40f28a | 149 | } |
loopsva | 0:e065ca40f28a | 150 | OldgDebug = gDebug; |
loopsva | 0:e065ca40f28a | 151 | OldDST = DST; |
loopsva | 0:e065ca40f28a | 152 | OldTZone = TZone; |
loopsva | 0:e065ca40f28a | 153 | OldPress0Ft = Press0Ft; |
loopsva | 0:e065ca40f28a | 154 | } |
loopsva | 0:e065ca40f28a | 155 | |
loopsva | 0:e065ca40f28a | 156 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 157 | // Trim whitespace/CRLFs from both ends of a given string |
loopsva | 0:e065ca40f28a | 158 | // for use with routine below |
loopsva | 0:e065ca40f28a | 159 | |
loopsva | 0:e065ca40f28a | 160 | char * str_cleanup(char *in) { |
loopsva | 0:e065ca40f28a | 161 | char * out = in; |
loopsva | 0:e065ca40f28a | 162 | // Trim leading spaces and CR/LF |
loopsva | 0:e065ca40f28a | 163 | while (*out == ' ' || *out == '\t' || *out == '\r' || *out == '\n') |
loopsva | 0:e065ca40f28a | 164 | out ++; |
loopsva | 0:e065ca40f28a | 165 | // Trim trailing spaces and CR/LF |
loopsva | 0:e065ca40f28a | 166 | int len = strlen(out)-1; |
loopsva | 0:e065ca40f28a | 167 | while (out[len] == ' ' || out[len] == '\t' || out[len] == '\r' || out[len] == '\n') { |
loopsva | 0:e065ca40f28a | 168 | out[len] = '\0'; |
loopsva | 0:e065ca40f28a | 169 | len--; |
loopsva | 0:e065ca40f28a | 170 | } |
loopsva | 0:e065ca40f28a | 171 | return out; |
loopsva | 0:e065ca40f28a | 172 | } |
loopsva | 0:e065ca40f28a | 173 | |
loopsva | 0:e065ca40f28a | 174 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 175 | // Simple ini file parser for SNTP configuration (Case-sensitive!) |
loopsva | 0:e065ca40f28a | 176 | // This function is intended to be called only before SNTPClientInit(). |
loopsva | 0:e065ca40f28a | 177 | // Returns: 0 if OK, errno otherwise |
loopsva | 0:e065ca40f28a | 178 | |
loopsva | 0:e065ca40f28a | 179 | enum { |
loopsva | 0:e065ca40f28a | 180 | SECT_NONE, |
loopsva | 0:e065ca40f28a | 181 | SECT_SERVERS, |
loopsva | 0:e065ca40f28a | 182 | SECT_GLOBAL, |
loopsva | 0:e065ca40f28a | 183 | }; |
loopsva | 0:e065ca40f28a | 184 | |
loopsva | 0:e065ca40f28a | 185 | //int _SNTPClrAddresses(); |
loopsva | 0:e065ca40f28a | 186 | |
loopsva | 0:e065ca40f28a | 187 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 188 | // This routine reads the "ini" file and sets the appropriate variables |
loopsva | 0:e065ca40f28a | 189 | |
loopsva | 0:e065ca40f28a | 190 | int SNTPReadIniFile(const char* filename) { |
loopsva | 0:e065ca40f28a | 191 | if (gDebug > 1) pc.printf("Before: tz:%d dst:%d ntpupd:%d baroZ:%.1f name:%s\n", TZone, DST, NTPUpdateValue, Press0Ft, hostname); |
loopsva | 0:e065ca40f28a | 192 | FILE *f; |
loopsva | 0:e065ca40f28a | 193 | char buf[512]; |
loopsva | 0:e065ca40f28a | 194 | // bool addresses_cleared = false; |
loopsva | 0:e065ca40f28a | 195 | bool hname = false; |
loopsva | 0:e065ca40f28a | 196 | f = fopen(filename, "r"); |
loopsva | 0:e065ca40f28a | 197 | if (!f) |
loopsva | 0:e065ca40f28a | 198 | return -1; // errno not used? |
loopsva | 0:e065ca40f28a | 199 | char *buf1, *buf2; |
loopsva | 0:e065ca40f28a | 200 | int section=SECT_NONE; |
loopsva | 0:e065ca40f28a | 201 | int line = 0; |
loopsva | 0:e065ca40f28a | 202 | while (fgets(buf, sizeof(buf)/sizeof(buf[0]), f)) { |
loopsva | 0:e065ca40f28a | 203 | line++; |
loopsva | 0:e065ca40f28a | 204 | buf1 = str_cleanup(buf); |
loopsva | 0:e065ca40f28a | 205 | if (*buf1 == '#' || *buf1 == '\0') |
loopsva | 0:e065ca40f28a | 206 | continue; // Comment line or empty line - skip |
loopsva | 0:e065ca40f28a | 207 | if (*buf1 == '[') { |
loopsva | 0:e065ca40f28a | 208 | // New section |
loopsva | 0:e065ca40f28a | 209 | if (0 == strncmp(buf1,"[NTP Servers]", sizeof("[NTP Servers]")-1)) { |
loopsva | 0:e065ca40f28a | 210 | section=SECT_SERVERS; |
loopsva | 0:e065ca40f28a | 211 | /* if (!addresses_cleared) { |
loopsva | 0:e065ca40f28a | 212 | // Clear addresses only once. |
loopsva | 0:e065ca40f28a | 213 | _SNTPClrAddresses(); |
loopsva | 0:e065ca40f28a | 214 | addresses_cleared = true; |
loopsva | 0:e065ca40f28a | 215 | } |
loopsva | 0:e065ca40f28a | 216 | */ } else if (0 == strncmp(buf1,"[Global]", sizeof("[Global]")-1)) { |
loopsva | 0:e065ca40f28a | 217 | section=SECT_GLOBAL; |
loopsva | 0:e065ca40f28a | 218 | } else { |
loopsva | 0:e065ca40f28a | 219 | section=SECT_NONE; |
loopsva | 0:e065ca40f28a | 220 | fprintf(stderr, "*** File \"%s\", line %d - section \"%s\" is not understood.\r\n", filename, line, buf1); |
loopsva | 0:e065ca40f28a | 221 | } |
loopsva | 0:e065ca40f28a | 222 | } else { |
loopsva | 0:e065ca40f28a | 223 | // Section values |
loopsva | 0:e065ca40f28a | 224 | switch (section) { |
loopsva | 0:e065ca40f28a | 225 | case SECT_SERVERS: |
loopsva | 0:e065ca40f28a | 226 | /* if (_SNTPAddAddress(buf1)) { |
loopsva | 0:e065ca40f28a | 227 | fprintf(stderr, "File \"%s\", line %d - cannot add server \"%s\" - exceeded allocated slots.\r\n", filename, line, buf1); |
loopsva | 0:e065ca40f28a | 228 | } |
loopsva | 0:e065ca40f28a | 229 | break; |
loopsva | 0:e065ca40f28a | 230 | */ case SECT_GLOBAL: |
loopsva | 0:e065ca40f28a | 231 | buf2 = strchr(buf1, '='); |
loopsva | 0:e065ca40f28a | 232 | if (buf2) { |
loopsva | 0:e065ca40f28a | 233 | *buf2++ = '\0'; // Now buf1 has variable name, buf2 has value |
loopsva | 0:e065ca40f28a | 234 | buf2 = str_cleanup(buf2); |
loopsva | 0:e065ca40f28a | 235 | if (0 == strncmp(buf1, "Timezone(hrs)", sizeof("Timezone(hrs)")-1)) { |
loopsva | 0:e065ca40f28a | 236 | TZone = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 237 | } else if (0 == strncmp(buf1, "NTPRefresh(sec)", sizeof("NTPRefresh(sec)")-1)) { |
loopsva | 0:e065ca40f28a | 238 | NTPUpdateValue = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 239 | } else if (0 == strncmp(buf1, "gDebugLevel", sizeof("gDebugLevel")-1)) { |
loopsva | 0:e065ca40f28a | 240 | gDebug = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 241 | } else if (0 == strncmp(buf1, "TftCalib", sizeof("TftCalib")-1)) { |
loopsva | 0:e065ca40f28a | 242 | TftCalib = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 243 | } else if (0 == strncmp(buf1, "TftCalTxm", sizeof("TftCalTxm")-1)) { |
loopsva | 0:e065ca40f28a | 244 | pp_txm = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 245 | } else if (0 == strncmp(buf1, "TftCalTym", sizeof("TftCalTym")-1)) { |
loopsva | 0:e065ca40f28a | 246 | pp_tym = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 247 | } else if (0 == strncmp(buf1, "TftCalTxOff", sizeof("TftCalTxOff")-1)) { |
loopsva | 0:e065ca40f28a | 248 | pp_txoff = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 249 | } else if (0 == strncmp(buf1, "TftCalTyOff", sizeof("TftCalTyOff")-1)) { |
loopsva | 0:e065ca40f28a | 250 | pp_tyoff = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 251 | // } else if (0 == strncmp(buf1, "TftRtcColor", sizeof("TftRtcColor")-1)) { |
loopsva | 0:e065ca40f28a | 252 | // JunkText = buf2; //pp_tyoff = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 253 | // RtcColor = JunkText; |
loopsva | 0:e065ca40f28a | 254 | // pc.printf("buf2 >> %s JunkText >> %s RtcColor >> %s\n", buf2, JunkText, RtcColor); |
loopsva | 0:e065ca40f28a | 255 | } else if (0 == strncmp(buf1, "MyName", sizeof("MyName")-1)) { |
loopsva | 0:e065ca40f28a | 256 | if (hname == false) { |
loopsva | 0:e065ca40f28a | 257 | hname = true; |
loopsva | 0:e065ca40f28a | 258 | hostname = buf2; |
loopsva | 0:e065ca40f28a | 259 | if (gDebug > 1) pc.printf("buf2:%s hn:%s\n", buf2, hostname); |
loopsva | 0:e065ca40f28a | 260 | } |
loopsva | 0:e065ca40f28a | 261 | } else if (0 == strncmp(buf1, "PressureSeaLevel", sizeof("PressureSeaLevel")-1)) { |
loopsva | 0:e065ca40f28a | 262 | Press0Ft = strtof(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 263 | //} else if (0 == strncmp(buf1, "RtcUtc", sizeof("RtcUtc")-1)) { |
loopsva | 0:e065ca40f28a | 264 | // gSntpRtcUtc = (bool)strtol(buf2, &buf2, 10); |
loopsva | 0:e065ca40f28a | 265 | } else if (0 == strncmp(buf1, "DstZone(hrs)", sizeof("DstZone(hrs)")-1)) { |
loopsva | 0:e065ca40f28a | 266 | DST = strtod(buf2, &buf2); |
loopsva | 0:e065ca40f28a | 267 | } else { |
loopsva | 0:e065ca40f28a | 268 | pc.printf("*** File \"%s\", line %d - unrecognized variable \"%s\" in section [Global]\r\n", filename, line, buf1); |
loopsva | 0:e065ca40f28a | 269 | } |
loopsva | 0:e065ca40f28a | 270 | } else { |
loopsva | 0:e065ca40f28a | 271 | pc.printf("*** File \"%s\", line %d - unrecognized statement in section [Global]: %s\r\n", filename, line, buf1); |
loopsva | 0:e065ca40f28a | 272 | } |
loopsva | 0:e065ca40f28a | 273 | break; |
loopsva | 0:e065ca40f28a | 274 | default: |
loopsva | 0:e065ca40f28a | 275 | pc.printf("*** File \"%s\", line %d - unrecognized statement / no section: %s\r\n", filename, line, buf1); |
loopsva | 0:e065ca40f28a | 276 | } |
loopsva | 0:e065ca40f28a | 277 | } |
loopsva | 0:e065ca40f28a | 278 | } |
loopsva | 0:e065ca40f28a | 279 | fclose(f); |
loopsva | 0:e065ca40f28a | 280 | pc.printf("mbed configuration read from \"%s\", %d lines.\r\n", filename, line); |
loopsva | 0:e065ca40f28a | 281 | pc.printf("- gDebug display level: %d\n", gDebug); |
loopsva | 0:e065ca40f28a | 282 | pc.printf("- Time Zone: %d hours\n", TZone); |
loopsva | 0:e065ca40f28a | 283 | if (DST == 0) { |
loopsva | 0:e065ca40f28a | 284 | pc.printf("- Standard Time\n"); |
loopsva | 0:e065ca40f28a | 285 | } else { |
loopsva | 0:e065ca40f28a | 286 | pc.printf("- Daylight Saving Time\n"); |
loopsva | 0:e065ca40f28a | 287 | } |
loopsva | 0:e065ca40f28a | 288 | pc.printf("- NTC update: %d seconds\n", NTPUpdateValue); |
loopsva | 0:e065ca40f28a | 289 | // pc.printf("- Pressure at Seal Level: %.1f kPa\n", Press0Ft); |
loopsva | 0:e065ca40f28a | 290 | if (TftCalib == 1) { |
loopsva | 0:e065ca40f28a | 291 | pc.printf("- TFT touchpad calibration required\n"); |
loopsva | 0:e065ca40f28a | 292 | } else { |
loopsva | 0:e065ca40f28a | 293 | pc.printf("- No TFT touchpad calibration needed\n"); |
loopsva | 0:e065ca40f28a | 294 | } |
loopsva | 0:e065ca40f28a | 295 | pc.printf("- Touch Cal X Base %d\n", pp_txm); |
loopsva | 0:e065ca40f28a | 296 | pc.printf("- Touch Cal Y Base %d\n", pp_tym); |
loopsva | 0:e065ca40f28a | 297 | pc.printf("- Touch Cal X Offset %d\n", pp_txoff); |
loopsva | 0:e065ca40f28a | 298 | pc.printf("- Touch Cal Y Offset %d\n", pp_tyoff); |
loopsva | 0:e065ca40f28a | 299 | // pc.printf("- RTC Color %s\n", RtcColor); |
loopsva | 0:e065ca40f28a | 300 | |
loopsva | 0:e065ca40f28a | 301 | if (gDebug > 1) pc.printf("After: tz:%d dst:%d ntpupd:%d baroZ:%.1f name:%s\n", TZone, DST, NTPUpdateValue, Press0Ft, hostname); |
loopsva | 0:e065ca40f28a | 302 | |
loopsva | 0:e065ca40f28a | 303 | OldgDebug = gDebug; |
loopsva | 0:e065ca40f28a | 304 | OldDST = DST; |
loopsva | 0:e065ca40f28a | 305 | OldTZone = TZone; |
loopsva | 0:e065ca40f28a | 306 | OldPress0Ft = Press0Ft; |
loopsva | 0:e065ca40f28a | 307 | return 0; |
loopsva | 0:e065ca40f28a | 308 | } |
loopsva | 0:e065ca40f28a | 309 | |
loopsva | 0:e065ca40f28a | 310 | |
loopsva | 0:e065ca40f28a | 311 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 312 | // This routine attempts to update the RTC via an Ethernet NTP server |
loopsva | 0:e065ca40f28a | 313 | |
loopsva | 0:e065ca40f28a | 314 | int SetEthTime() { |
loopsva | 0:e065ca40f28a | 315 | pc.printf("Getting Time from NTP Server\n- Old Time (UTC): %d %s", ctTime, ctime(&ctTime)); |
loopsva | 0:e065ca40f28a | 316 | int ntpFlag = 0; |
loopsva | 0:e065ca40f28a | 317 | if(gDebug) pc.printf("- Trying NTP Server: time-a.nist.gov... "); |
loopsva | 0:e065ca40f28a | 318 | ntpFlag = ntpdate("time-a.nist.gov", &ctTime); |
loopsva | 0:e065ca40f28a | 319 | if((gDebug) && (ntpFlag)) pc.printf("failed\n- Trying NTP Server: pool.ntp.org... "); |
loopsva | 0:e065ca40f28a | 320 | if(ntpFlag) { |
loopsva | 0:e065ca40f28a | 321 | ntpFlag = 0; |
loopsva | 0:e065ca40f28a | 322 | ntpFlag = ntpdate("pool.ntp.org", &ctTime); |
loopsva | 0:e065ca40f28a | 323 | if((gDebug) && (ntpFlag)) pc.printf("failed\n- Trying NTP Server: 10.77.127.1... "); |
loopsva | 0:e065ca40f28a | 324 | if(ntpFlag) { |
loopsva | 0:e065ca40f28a | 325 | ntpFlag = 0; |
loopsva | 0:e065ca40f28a | 326 | ntpFlag = ntpdate("10.77.127.1", &ctTime); |
loopsva | 0:e065ca40f28a | 327 | if((gDebug) && (ntpFlag)) pc.printf("failed\n"); |
loopsva | 0:e065ca40f28a | 328 | } |
loopsva | 0:e065ca40f28a | 329 | } |
loopsva | 0:e065ca40f28a | 330 | |
loopsva | 0:e065ca40f28a | 331 | |
loopsva | 0:e065ca40f28a | 332 | // pc.printf("ntpFlag: %d\n", ntpFlag); |
loopsva | 0:e065ca40f28a | 333 | /* |
loopsva | 0:e065ca40f28a | 334 | // |
loopsva | 0:e065ca40f28a | 335 | // Server selection code from HTTPS_618 |
loopsva | 0:e065ca40f28a | 336 | // |
loopsva | 0:e065ca40f28a | 337 | Host server(IpAddr(), 123, "time-a.nist.gov"); |
loopsva | 0:e065ca40f28a | 338 | if (gDebug > 1) pc.printf("NTP result 1 : %d time-a.nist.gov\n", ntp.setTime(server)); |
loopsva | 0:e065ca40f28a | 339 | if(ntp.setTime(server) == 4) { |
loopsva | 0:e065ca40f28a | 340 | server.setName("time-b.nist.gov"); |
loopsva | 0:e065ca40f28a | 341 | if (gDebug > 1) pc.printf("NTP result 2 : %d time-b.nist.gov\n", ntp.setTime(server)); |
loopsva | 0:e065ca40f28a | 342 | if(ntp.setTime(server) == 4) { |
loopsva | 0:e065ca40f28a | 343 | server.setName("pool.ntp.org"); |
loopsva | 0:e065ca40f28a | 344 | if (gDebug > 1) pc.printf("NTP result 3 : %d pool.ntp.org\n", ntp.setTime(server)); |
loopsva | 0:e065ca40f28a | 345 | if(ntp.setTime(server) == 4) { |
loopsva | 0:e065ca40f28a | 346 | server.setName("north-america.pool.ntp.org"); |
loopsva | 0:e065ca40f28a | 347 | if (gDebug > 1) pc.printf("NTP result 4 : %d north-america.pool.ntp.org\n", ntp.setTime(server)); |
loopsva | 0:e065ca40f28a | 348 | if(ntp.setTime(server) > 2) { |
loopsva | 0:e065ca40f28a | 349 | server.setName("10.77.127.1"); |
loopsva | 0:e065ca40f28a | 350 | if (gDebug > 1) pc.printf("NTP result 5 : %d 10.77.127.1\n", ntp.setTime(server)); |
loopsva | 0:e065ca40f28a | 351 | if(ntp.setTime(server) > 2) { |
loopsva | 0:e065ca40f28a | 352 | server.setName("74.218.141.2"); |
loopsva | 0:e065ca40f28a | 353 | if (gDebug > 1) pc.printf("NTP result 6 : %d 74.218.141.2\n", ntp.setTime(server)); |
loopsva | 0:e065ca40f28a | 354 | pc.printf(" No NTP Server found!!!\n"); |
loopsva | 0:e065ca40f28a | 355 | lcdt.locate(15,1); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 356 | lcdt.printf("x"); //set no NTP flag on LCD |
loopsva | 0:e065ca40f28a | 357 | } |
loopsva | 0:e065ca40f28a | 358 | } |
loopsva | 0:e065ca40f28a | 359 | } |
loopsva | 0:e065ca40f28a | 360 | } |
loopsva | 0:e065ca40f28a | 361 | } |
loopsva | 0:e065ca40f28a | 362 | */ |
loopsva | 0:e065ca40f28a | 363 | |
loopsva | 0:e065ca40f28a | 364 | |
loopsva | 0:e065ca40f28a | 365 | if(ntpFlag == 0) { |
loopsva | 0:e065ca40f28a | 366 | pc.printf("ok\nSuccessful Time Update\n"); |
loopsva | 0:e065ca40f28a | 367 | pc.printf("- Time post NTP (UTC): %d %s", ctTime, ctime(&ctTime)); |
loopsva | 0:e065ca40f28a | 368 | StartTime = ctTime; |
loopsva | 0:e065ca40f28a | 369 | set_time(ctTime); |
loopsva | 0:e065ca40f28a | 370 | ctTime = ctTime + ((TZone+DST)*3600); //timezone and dst offsets |
loopsva | 0:e065ca40f28a | 371 | pc.printf("- Time post NTP (local): %d %s", ctTime, ctime(&ctTime)); |
loopsva | 0:e065ca40f28a | 372 | RTCstep = ctTime + NTPUpdateValue; //next NTP update |
loopsva | 0:e065ca40f28a | 373 | ctTime = ctTime + NTPUpdateValue; //next NTP update |
loopsva | 0:e065ca40f28a | 374 | pc.printf("- Next Update (local): %d %s", ctTime, ctime(&ctTime)); |
loopsva | 0:e065ca40f28a | 375 | ctTime = ctTime - NTPUpdateValue; |
loopsva | 0:e065ca40f28a | 376 | return 0; |
loopsva | 0:e065ca40f28a | 377 | } else { |
loopsva | 0:e065ca40f28a | 378 | pc.printf("*** NTP Server not Found!!!\n"); |
loopsva | 0:e065ca40f28a | 379 | return -1; |
loopsva | 0:e065ca40f28a | 380 | } |
loopsva | 0:e065ca40f28a | 381 | } |
loopsva | 0:e065ca40f28a | 382 | |
loopsva | 0:e065ca40f28a | 383 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 384 | // This routine is used to align "display events" at exactly RTC 60 second and 10 minute intervals |
loopsva | 0:e065ca40f28a | 385 | |
loopsva | 0:e065ca40f28a | 386 | void align_access_time() { |
loopsva | 0:e065ca40f28a | 387 | ctTime = time(NULL); |
loopsva | 0:e065ca40f28a | 388 | ctTime = ctTime + ((TZone+DST)*3600); //timezone and dst offsets |
loopsva | 0:e065ca40f28a | 389 | float getMod = fmod(ctTime, 600.0); // modulus count for exact 10 minute adjustments |
loopsva | 0:e065ca40f28a | 390 | Align1Min = (ctTime + (600 - int(getMod))); // init 10 minute ticker |
loopsva | 0:e065ca40f28a | 391 | minuteAvg = 1 + (Align1Min - ctTime) / 60; // how many access minutes before 1st store |
loopsva | 0:e065ca40f28a | 392 | pc.printf("Align10min ct: %d gM: %3d tsA: %d mA: %d \n", |
loopsva | 0:e065ca40f28a | 393 | ctTime, int(getMod), Align1Min, minuteAvg); |
loopsva | 0:e065ca40f28a | 394 | getMod = fmod(ctTime,60.0); |
loopsva | 0:e065ca40f28a | 395 | Align10Min = (ctTime + (60 - int(getMod))); |
loopsva | 0:e065ca40f28a | 396 | RTCupdate = Align10Min; //Align1Min; |
loopsva | 0:e065ca40f28a | 397 | pc.printf("Align1min gM: %3d lts: %d\n", int(getMod), Align10Min); |
loopsva | 0:e065ca40f28a | 398 | } |
loopsva | 0:e065ca40f28a | 399 | |
loopsva | 0:e065ca40f28a | 400 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 401 | // This is the initial splash screen for the TEXT LCD |
loopsva | 0:e065ca40f28a | 402 | |
loopsva | 0:e065ca40f28a | 403 | void TextLCDTitle() { |
loopsva | 0:e065ca40f28a | 404 | lcdt.cls(); //init the LCD |
loopsva | 0:e065ca40f28a | 405 | lcdt.locate(0,0); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 406 | lcdt.printf("TFT Driver %d", revision); //print revision on LCD |
loopsva | 0:e065ca40f28a | 407 | lcdt.locate(0,1); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 408 | lcdt.printf("K Braun"); //print -me- on LCD |
loopsva | 0:e065ca40f28a | 409 | } |
loopsva | 0:e065ca40f28a | 410 | |
loopsva | 0:e065ca40f28a | 411 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 412 | // This is the initial TFT splash screen -and- the follow-on screen if the pen selects the "clear_screen" box |
loopsva | 0:e065ca40f28a | 413 | |
loopsva | 0:e065ca40f28a | 414 | void InitTft() { |
loopsva | 0:e065ca40f28a | 415 | int CurrentColor = PenColor; |
loopsva | 0:e065ca40f28a | 416 | int CurrentTft = TftDrawColor; |
loopsva | 0:e065ca40f28a | 417 | tt.foreground(Yellow); // set chars to white |
loopsva | 0:e065ca40f28a | 418 | tt.cls(); // clear the screen |
loopsva | 0:e065ca40f28a | 419 | tt.set_font((unsigned char*) Arial12x12); // select the font |
loopsva | 0:e065ca40f28a | 420 | // tt.set_font((unsigned char*) FONT8x8); |
loopsva | 0:e065ca40f28a | 421 | // tt.set_font((unsigned char*) Courier10x13); |
loopsva | 0:e065ca40f28a | 422 | // tt.set_font((unsigned char*) Verdana22x21); |
loopsva | 0:e065ca40f28a | 423 | // tt.set_font((unsigned char*) Book_Antiqua19x19); |
loopsva | 0:e065ca40f28a | 424 | // tt.cls(); |
loopsva | 0:e065ca40f28a | 425 | tt.foreground(Yellow); // set chars to white |
loopsva | 0:e065ca40f28a | 426 | tt.set_orientation(0); |
loopsva | 0:e065ca40f28a | 427 | tt.locate(0,0); |
loopsva | 0:e065ca40f28a | 428 | tt.printf(" TFT Touch Test"); |
loopsva | 0:e065ca40f28a | 429 | tt.locate(0,1); |
loopsva | 0:e065ca40f28a | 430 | tt.printf(" K. Braun"); |
loopsva | 0:e065ca40f28a | 431 | tt.locate(0,2); |
loopsva | 0:e065ca40f28a | 432 | tt.printf(" Rev: %d", revision); |
loopsva | 0:e065ca40f28a | 433 | tt.locate(13,1); |
loopsva | 0:e065ca40f28a | 434 | tt.printf("%d", PenWidth); |
loopsva | 0:e065ca40f28a | 435 | tt.foreground(White); // set chars to white |
loopsva | 0:e065ca40f28a | 436 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 437 | tt.rect(5,5,30,30,Red); |
loopsva | 0:e065ca40f28a | 438 | tt.fillrect(5,35,30,60,CurrentColor); |
loopsva | 0:e065ca40f28a | 439 | if(CurrentColor == Black) { |
loopsva | 0:e065ca40f28a | 440 | tt.rect(5,35,30,60,White); // if black, put on white frame |
loopsva | 0:e065ca40f28a | 441 | } |
loopsva | 0:e065ca40f28a | 442 | tt.circle(16,80,10, Blue); |
loopsva | 0:e065ca40f28a | 443 | // PenColor = 0xFFFF; // color of pen |
loopsva | 0:e065ca40f28a | 444 | // TftDrawColor = 0; // pick pencil color |
loopsva | 0:e065ca40f28a | 445 | |
loopsva | 0:e065ca40f28a | 446 | // The following draws that color palette, but only once after a reset |
loopsva | 0:e065ca40f28a | 447 | if((gDebug >> 0) && (pOnce == 0)) { |
loopsva | 0:e065ca40f28a | 448 | pOnce = 1; |
loopsva | 0:e065ca40f28a | 449 | tt.set_orientation(0); |
loopsva | 0:e065ca40f28a | 450 | tt.set_font((unsigned char*) Arial24x23); |
loopsva | 0:e065ca40f28a | 451 | tt.locate(3,3); |
loopsva | 0:e065ca40f28a | 452 | tt.printf("Palette"); |
loopsva | 0:e065ca40f28a | 453 | tt.set_font((unsigned char*) Arial12x12); |
loopsva | 0:e065ca40f28a | 454 | int tX = 17; |
loopsva | 0:e065ca40f28a | 455 | int tY = 90; |
loopsva | 0:e065ca40f28a | 456 | int tB = 25; |
loopsva | 0:e065ca40f28a | 457 | tt.fillrect(tX,tY,tX+tB,tY+tB,White); |
loopsva | 0:e065ca40f28a | 458 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 459 | tt.fillrect(tX,tY,tX+tB,tY+tB,Orange); |
loopsva | 0:e065ca40f28a | 460 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 461 | tt.fillrect(tX,tY,tX+tB,tY+tB,Yellow); |
loopsva | 0:e065ca40f28a | 462 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 463 | tt.fillrect(tX,tY,tX+tB,tY+tB,Magenta); |
loopsva | 0:e065ca40f28a | 464 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 465 | tt.fillrect(tX,tY,tX+tB,tY+tB,Red); |
loopsva | 0:e065ca40f28a | 466 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 467 | tt.fillrect(tX,tY,tX+tB,tY+tB,Cyan); |
loopsva | 0:e065ca40f28a | 468 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 469 | tt.fillrect(tX,tY,tX+tB,tY+tB,Green); |
loopsva | 0:e065ca40f28a | 470 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 471 | tt.fillrect(tX,tY,tX+tB,tY+tB,Blue); |
loopsva | 0:e065ca40f28a | 472 | tY = tY+tB+1; |
loopsva | 0:e065ca40f28a | 473 | tX = 17; |
loopsva | 0:e065ca40f28a | 474 | tt.fillrect(tX,tY,tX+tB,tY+tB,LightGrey); |
loopsva | 0:e065ca40f28a | 475 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 476 | tt.fillrect(tX,tY,tX+tB,tY+tB,DarkGrey); |
loopsva | 0:e065ca40f28a | 477 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 478 | tt.fillrect(tX,tY,tX+tB,tY+tB,Olive); |
loopsva | 0:e065ca40f28a | 479 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 480 | tt.fillrect(tX,tY,tX+tB,tY+tB,Purple); |
loopsva | 0:e065ca40f28a | 481 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 482 | tt.fillrect(tX,tY,tX+tB,tY+tB,Maroon); |
loopsva | 0:e065ca40f28a | 483 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 484 | tt.fillrect(tX,tY,tX+tB,tY+tB,DarkCyan); |
loopsva | 0:e065ca40f28a | 485 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 486 | tt.fillrect(tX,tY,tX+tB,tY+tB,DarkGreen); |
loopsva | 0:e065ca40f28a | 487 | tX = tX+tB+1; |
loopsva | 0:e065ca40f28a | 488 | tt.fillrect(tX,tY,tX+tB,tY+tB,Navy); |
loopsva | 0:e065ca40f28a | 489 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 490 | } |
loopsva | 0:e065ca40f28a | 491 | |
loopsva | 0:e065ca40f28a | 492 | PenColor = CurrentColor; |
loopsva | 0:e065ca40f28a | 493 | TftDrawColor = CurrentTft; |
loopsva | 0:e065ca40f28a | 494 | |
loopsva | 0:e065ca40f28a | 495 | //wait for no-touch |
loopsva | 0:e065ca40f28a | 496 | point p; |
loopsva | 0:e065ca40f28a | 497 | do { |
loopsva | 0:e065ca40f28a | 498 | p = tt.get_touch(); |
loopsva | 0:e065ca40f28a | 499 | tt.is_touched(p); |
loopsva | 0:e065ca40f28a | 500 | } |
loopsva | 0:e065ca40f28a | 501 | while (p.y > 0x2000 | p.x > 0x2000); // { // wait for no touch |
loopsva | 0:e065ca40f28a | 502 | } |
loopsva | 0:e065ca40f28a | 503 | |
loopsva | 0:e065ca40f28a | 504 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 505 | // The following draws an object of a triode tube. It's location is set by PosX and PosY and CurRot |
loopsva | 0:e065ca40f28a | 506 | |
loopsva | 0:e065ca40f28a | 507 | void DrawTubeX() { |
loopsva | 0:e065ca40f28a | 508 | int xx = PosX; |
loopsva | 0:e065ca40f28a | 509 | int yy = PosY; |
loopsva | 0:e065ca40f28a | 510 | if((CurRot == 0) || (CurRot == 2)) { |
loopsva | 0:e065ca40f28a | 511 | xx = PosX; |
loopsva | 0:e065ca40f28a | 512 | yy = PosY; |
loopsva | 0:e065ca40f28a | 513 | } else { |
loopsva | 0:e065ca40f28a | 514 | xx = PosY; |
loopsva | 0:e065ca40f28a | 515 | yy = PosX; |
loopsva | 0:e065ca40f28a | 516 | } |
loopsva | 0:e065ca40f28a | 517 | tt.set_orientation(CurRot); |
loopsva | 0:e065ca40f28a | 518 | tt.fillcircle(xx,yy,60,Orange); |
loopsva | 0:e065ca40f28a | 519 | tt.circle(xx,yy,60,Navy); |
loopsva | 0:e065ca40f28a | 520 | tt.circle(xx,yy,59,Blue); |
loopsva | 0:e065ca40f28a | 521 | tt.circle(xx,yy,58,Navy); |
loopsva | 0:e065ca40f28a | 522 | tt.fillrect(xx-2,yy+40,xx+2,yy+70,Purple); |
loopsva | 0:e065ca40f28a | 523 | tt.fillrect(xx-2,yy+10,xx+2,yy+30,Purple); |
loopsva | 0:e065ca40f28a | 524 | tt.fillrect(xx-2,yy-20,xx+2,yy+00,Purple); |
loopsva | 0:e065ca40f28a | 525 | tt.fillrect(xx-2,yy-50,xx+2,yy-30,Purple); |
loopsva | 0:e065ca40f28a | 526 | tt.fillrect(xx-80,yy-2,xx-30,yy+2,DarkGreen); |
loopsva | 0:e065ca40f28a | 527 | tt.fillrect(xx-30,yy-30,xx-25,yy+30,DarkGreen); |
loopsva | 0:e065ca40f28a | 528 | tt.fillrect(xx+25,yy-30,xx+30,yy+30,Maroon); |
loopsva | 0:e065ca40f28a | 529 | tt.fillrect(xx+25,yy-30,xx+40,yy-25,Maroon); |
loopsva | 0:e065ca40f28a | 530 | tt.fillrect(xx+25,yy+25,xx+75,yy+30,Maroon); |
loopsva | 0:e065ca40f28a | 531 | } |
loopsva | 0:e065ca40f28a | 532 | |
loopsva | 0:e065ca40f28a | 533 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 534 | // The following draws the tube object in all for rotations, based on CurRot |
loopsva | 0:e065ca40f28a | 535 | |
loopsva | 0:e065ca40f28a | 536 | void DrawTube() { |
loopsva | 0:e065ca40f28a | 537 | CurRot = 2; |
loopsva | 0:e065ca40f28a | 538 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 539 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 540 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 541 | for(CurRot = 0 ; CurRot < 4 ; CurRot++) { |
loopsva | 0:e065ca40f28a | 542 | tt.cls(); |
loopsva | 0:e065ca40f28a | 543 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 544 | wait(DISP_FAST); |
loopsva | 0:e065ca40f28a | 545 | // wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 546 | } |
loopsva | 0:e065ca40f28a | 547 | } |
loopsva | 0:e065ca40f28a | 548 | |
loopsva | 0:e065ca40f28a | 549 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 550 | // Routine used to change the pen's color palette on the TFT |
loopsva | 0:e065ca40f28a | 551 | |
loopsva | 0:e065ca40f28a | 552 | void TftNewColor() { |
loopsva | 0:e065ca40f28a | 553 | // point p; |
loopsva | 0:e065ca40f28a | 554 | TftDrawColor++; |
loopsva | 0:e065ca40f28a | 555 | if(TftDrawColor >= 17) { |
loopsva | 0:e065ca40f28a | 556 | TftDrawColor = 0; |
loopsva | 0:e065ca40f28a | 557 | } |
loopsva | 0:e065ca40f28a | 558 | switch (TftDrawColor) { |
loopsva | 0:e065ca40f28a | 559 | case 0: { |
loopsva | 0:e065ca40f28a | 560 | tt.fillrect(5,35,30,60,White); |
loopsva | 0:e065ca40f28a | 561 | PenColor = White; |
loopsva | 0:e065ca40f28a | 562 | } |
loopsva | 0:e065ca40f28a | 563 | break; |
loopsva | 0:e065ca40f28a | 564 | case 1: { |
loopsva | 0:e065ca40f28a | 565 | tt.fillrect(5,35,30,60,Orange); |
loopsva | 0:e065ca40f28a | 566 | PenColor = Orange; |
loopsva | 0:e065ca40f28a | 567 | } |
loopsva | 0:e065ca40f28a | 568 | break; |
loopsva | 0:e065ca40f28a | 569 | case 2: { |
loopsva | 0:e065ca40f28a | 570 | tt.fillrect(5,35,30,60,Yellow); |
loopsva | 0:e065ca40f28a | 571 | PenColor = Yellow; |
loopsva | 0:e065ca40f28a | 572 | } |
loopsva | 0:e065ca40f28a | 573 | break; |
loopsva | 0:e065ca40f28a | 574 | case 3: { |
loopsva | 0:e065ca40f28a | 575 | tt.fillrect(5,35,30,60,Magenta); |
loopsva | 0:e065ca40f28a | 576 | PenColor = 0xF81F; |
loopsva | 0:e065ca40f28a | 577 | } |
loopsva | 0:e065ca40f28a | 578 | break; |
loopsva | 0:e065ca40f28a | 579 | case 4: { |
loopsva | 0:e065ca40f28a | 580 | tt.fillrect(5,35,30,60,Red); |
loopsva | 0:e065ca40f28a | 581 | PenColor = 0xF800; |
loopsva | 0:e065ca40f28a | 582 | } |
loopsva | 0:e065ca40f28a | 583 | break; |
loopsva | 0:e065ca40f28a | 584 | case 5: { |
loopsva | 0:e065ca40f28a | 585 | tt.fillrect(5,35,30,60,Cyan); |
loopsva | 0:e065ca40f28a | 586 | PenColor = 0x07FF; |
loopsva | 0:e065ca40f28a | 587 | } |
loopsva | 0:e065ca40f28a | 588 | break; |
loopsva | 0:e065ca40f28a | 589 | case 6: { |
loopsva | 0:e065ca40f28a | 590 | tt.fillrect(5,35,30,60,Green); |
loopsva | 0:e065ca40f28a | 591 | PenColor = 0x07E0; |
loopsva | 0:e065ca40f28a | 592 | } |
loopsva | 0:e065ca40f28a | 593 | break; |
loopsva | 0:e065ca40f28a | 594 | case 7: { |
loopsva | 0:e065ca40f28a | 595 | tt.fillrect(5,35,30,60,Blue); |
loopsva | 0:e065ca40f28a | 596 | PenColor = 0x001F; |
loopsva | 0:e065ca40f28a | 597 | } |
loopsva | 0:e065ca40f28a | 598 | break; |
loopsva | 0:e065ca40f28a | 599 | case 8: { |
loopsva | 0:e065ca40f28a | 600 | tt.fillrect(5,35,30,60,LightGrey); |
loopsva | 0:e065ca40f28a | 601 | PenColor = 0x7BEF; |
loopsva | 0:e065ca40f28a | 602 | } |
loopsva | 0:e065ca40f28a | 603 | break; |
loopsva | 0:e065ca40f28a | 604 | case 9: { |
loopsva | 0:e065ca40f28a | 605 | tt.fillrect(5,35,30,60,DarkGrey); |
loopsva | 0:e065ca40f28a | 606 | PenColor = 0xC618; |
loopsva | 0:e065ca40f28a | 607 | } |
loopsva | 0:e065ca40f28a | 608 | break; |
loopsva | 0:e065ca40f28a | 609 | case 10: { |
loopsva | 0:e065ca40f28a | 610 | tt.fillrect(5,35,30,60,Olive); |
loopsva | 0:e065ca40f28a | 611 | PenColor = 0x7BE0; |
loopsva | 0:e065ca40f28a | 612 | } |
loopsva | 0:e065ca40f28a | 613 | break; |
loopsva | 0:e065ca40f28a | 614 | case 11: { |
loopsva | 0:e065ca40f28a | 615 | tt.fillrect(5,35,30,60,Purple); |
loopsva | 0:e065ca40f28a | 616 | PenColor = 0x780F; |
loopsva | 0:e065ca40f28a | 617 | } |
loopsva | 0:e065ca40f28a | 618 | break; |
loopsva | 0:e065ca40f28a | 619 | case 12: { |
loopsva | 0:e065ca40f28a | 620 | tt.fillrect(5,35,30,60,Maroon); |
loopsva | 0:e065ca40f28a | 621 | PenColor = 0x7800; |
loopsva | 0:e065ca40f28a | 622 | } |
loopsva | 0:e065ca40f28a | 623 | break; |
loopsva | 0:e065ca40f28a | 624 | case 13: { |
loopsva | 0:e065ca40f28a | 625 | tt.fillrect(5,35,30,60,DarkCyan); |
loopsva | 0:e065ca40f28a | 626 | PenColor = 0x03EF; |
loopsva | 0:e065ca40f28a | 627 | } |
loopsva | 0:e065ca40f28a | 628 | break; |
loopsva | 0:e065ca40f28a | 629 | case 14: { |
loopsva | 0:e065ca40f28a | 630 | tt.fillrect(5,35,30,60,DarkGreen); |
loopsva | 0:e065ca40f28a | 631 | PenColor = 0x03E0; |
loopsva | 0:e065ca40f28a | 632 | } |
loopsva | 0:e065ca40f28a | 633 | break; |
loopsva | 0:e065ca40f28a | 634 | case 15: { |
loopsva | 0:e065ca40f28a | 635 | tt.fillrect(5,35,30,60,Navy); |
loopsva | 0:e065ca40f28a | 636 | PenColor = 0x000F; |
loopsva | 0:e065ca40f28a | 637 | } |
loopsva | 0:e065ca40f28a | 638 | break; |
loopsva | 0:e065ca40f28a | 639 | case 16: { |
loopsva | 0:e065ca40f28a | 640 | tt.fillrect(5,35,30,60,Black); |
loopsva | 0:e065ca40f28a | 641 | tt.rect(5,35,30,60,White); |
loopsva | 0:e065ca40f28a | 642 | PenColor = 0x0000; |
loopsva | 0:e065ca40f28a | 643 | } |
loopsva | 0:e065ca40f28a | 644 | break; |
loopsva | 0:e065ca40f28a | 645 | |
loopsva | 0:e065ca40f28a | 646 | } // end of switch |
loopsva | 0:e065ca40f28a | 647 | |
loopsva | 0:e065ca40f28a | 648 | //wait for no-touch |
loopsva | 0:e065ca40f28a | 649 | point p; |
loopsva | 0:e065ca40f28a | 650 | do { |
loopsva | 0:e065ca40f28a | 651 | p = tt.get_touch(); |
loopsva | 0:e065ca40f28a | 652 | tt.is_touched(p); |
loopsva | 0:e065ca40f28a | 653 | // pc.printf("pr1: %d %d\n", p.x, p.y); |
loopsva | 0:e065ca40f28a | 654 | } |
loopsva | 0:e065ca40f28a | 655 | while (p.y > 0x2000 | p.x > 0x2000); // { // wait for no touch |
loopsva | 0:e065ca40f28a | 656 | } |
loopsva | 0:e065ca40f28a | 657 | |
loopsva | 0:e065ca40f28a | 658 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 659 | // Find the "secret spot" on the TFT, RESET the mbed |
loopsva | 0:e065ca40f28a | 660 | |
loopsva | 0:e065ca40f28a | 661 | void KillMbed() { |
loopsva | 0:e065ca40f28a | 662 | // text LCD |
loopsva | 0:e065ca40f28a | 663 | lcdt.cls(); // clear out text LCD |
loopsva | 0:e065ca40f28a | 664 | lcdt.locate(0,0); // column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 665 | lcdt.printf("Pen select\n"); |
loopsva | 0:e065ca40f28a | 666 | lcdt.printf("resetting mbed!!"); |
loopsva | 0:e065ca40f28a | 667 | // CRT |
loopsva | 0:e065ca40f28a | 668 | pc.printf("### Pen detected reset area. Resetting mbed!!!! ###\n"); |
loopsva | 0:e065ca40f28a | 669 | |
loopsva | 0:e065ca40f28a | 670 | //wait for no-touch |
loopsva | 0:e065ca40f28a | 671 | point p; |
loopsva | 0:e065ca40f28a | 672 | do { |
loopsva | 0:e065ca40f28a | 673 | p = tt.get_touch(); |
loopsva | 0:e065ca40f28a | 674 | tt.is_touched(p); |
loopsva | 0:e065ca40f28a | 675 | } |
loopsva | 0:e065ca40f28a | 676 | while (p.y > 0x2000 | p.x > 0x2000); // { // wait for no touch |
loopsva | 0:e065ca40f28a | 677 | |
loopsva | 0:e065ca40f28a | 678 | // TFT LCD |
loopsva | 0:e065ca40f28a | 679 | tt.cls(); |
loopsva | 0:e065ca40f28a | 680 | tt.foreground(Yellow); |
loopsva | 0:e065ca40f28a | 681 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 682 | tt.set_font((unsigned char*) Book_Antiqua19x19); |
loopsva | 0:e065ca40f28a | 683 | tt.locate(2,5); // x,y |
loopsva | 0:e065ca40f28a | 684 | tt.printf("### Reset mbed ###"); |
loopsva | 0:e065ca40f28a | 685 | |
loopsva | 0:e065ca40f28a | 686 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 687 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 688 | mbed_reset(); |
loopsva | 0:e065ca40f28a | 689 | } |
loopsva | 0:e065ca40f28a | 690 | |
loopsva | 0:e065ca40f28a | 691 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 692 | // This routing changes the "width" or "fatness" of the drawing pen on the TFT |
loopsva | 0:e065ca40f28a | 693 | |
loopsva | 0:e065ca40f28a | 694 | void TftNewPenSize() { |
loopsva | 0:e065ca40f28a | 695 | PenWidth++; |
loopsva | 0:e065ca40f28a | 696 | if(PenWidth > 8) { |
loopsva | 0:e065ca40f28a | 697 | PenWidth = 1; |
loopsva | 0:e065ca40f28a | 698 | } |
loopsva | 0:e065ca40f28a | 699 | tt.foreground(Yellow); // set chars to white |
loopsva | 0:e065ca40f28a | 700 | tt.set_orientation(0); |
loopsva | 0:e065ca40f28a | 701 | tt.locate(13,1); |
loopsva | 0:e065ca40f28a | 702 | tt.printf("%d", PenWidth); |
loopsva | 0:e065ca40f28a | 703 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 704 | tt.circle(16,80,10, Blue); |
loopsva | 0:e065ca40f28a | 705 | tt.foreground(PenColor); |
loopsva | 0:e065ca40f28a | 706 | |
loopsva | 0:e065ca40f28a | 707 | //wait for no-touch |
loopsva | 0:e065ca40f28a | 708 | point p; |
loopsva | 0:e065ca40f28a | 709 | do { |
loopsva | 0:e065ca40f28a | 710 | p = tt.get_touch(); |
loopsva | 0:e065ca40f28a | 711 | tt.is_touched(p); |
loopsva | 0:e065ca40f28a | 712 | // pc.printf("pr1: %d %d\n", p.x, p.y); |
loopsva | 0:e065ca40f28a | 713 | } |
loopsva | 0:e065ca40f28a | 714 | while (p.y > 0x2000 | p.x > 0x2000); // { // wait for no touch |
loopsva | 0:e065ca40f28a | 715 | } |
loopsva | 0:e065ca40f28a | 716 | |
loopsva | 0:e065ca40f28a | 717 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 718 | //A generic QUICK BROWN FOX routine to check out various fonts |
loopsva | 0:e065ca40f28a | 719 | |
loopsva | 0:e065ca40f28a | 720 | void QuickBrownFox() { |
loopsva | 0:e065ca40f28a | 721 | tt.foreground(Yellow); // set chars to white |
loopsva | 0:e065ca40f28a | 722 | tt.cls(); // clear the screen |
loopsva | 0:e065ca40f28a | 723 | // tt.set_font((unsigned char*) Arial12x12); // select the font |
loopsva | 0:e065ca40f28a | 724 | // tt.set_font((unsigned char*) Courier10x13); // select the font |
loopsva | 0:e065ca40f28a | 725 | // tt.set_font((unsigned char*) Verdana22x21); // select the font |
loopsva | 0:e065ca40f28a | 726 | // tt.set_font((unsigned char*) Book_Antiqua19x19); // select the font |
loopsva | 0:e065ca40f28a | 727 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 728 | tt.locate(0,0); |
loopsva | 0:e065ca40f28a | 729 | tt.printf("THE QUICK BROWN FOX"); |
loopsva | 0:e065ca40f28a | 730 | tt.locate(0,1); |
loopsva | 0:e065ca40f28a | 731 | tt.printf("JUMPED OVER THE LAZY"); |
loopsva | 0:e065ca40f28a | 732 | tt.locate(0,2); |
loopsva | 0:e065ca40f28a | 733 | tt.printf("DOG'S BACK 0123456789"); |
loopsva | 0:e065ca40f28a | 734 | tt.locate(0,3); |
loopsva | 0:e065ca40f28a | 735 | tt.printf("!@#$%^&*(){|}[\]:;<,./?>"); |
loopsva | 0:e065ca40f28a | 736 | tt.locate(0,5); |
loopsva | 0:e065ca40f28a | 737 | tt.printf("the quick brown fox"); |
loopsva | 0:e065ca40f28a | 738 | tt.locate(0,6); |
loopsva | 0:e065ca40f28a | 739 | tt.printf("jumped over the lazy "); |
loopsva | 0:e065ca40f28a | 740 | tt.locate(0,7); |
loopsva | 0:e065ca40f28a | 741 | tt.printf("dog's back \n"); |
loopsva | 0:e065ca40f28a | 742 | tt.foreground(White); // set chars to white |
loopsva | 0:e065ca40f28a | 743 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 744 | } |
loopsva | 0:e065ca40f28a | 745 | |
loopsva | 0:e065ca40f28a | 746 | /*--------------------------------------------------------------------------------------------------------------------------------------*/ |
loopsva | 0:e065ca40f28a | 747 | int main() { |
loopsva | 0:e065ca40f28a | 748 | pc.baud(921600); //set up USB serial speed |
loopsva | 0:e065ca40f28a | 749 | // time_t ctTime; |
loopsva | 0:e065ca40f28a | 750 | ctTime = time(NULL); |
loopsva | 0:e065ca40f28a | 751 | StartTime = ctTime; //get time we started up |
loopsva | 0:e065ca40f28a | 752 | ctTime = ctTime + ((TZone+DST)*3600); //timezone and dst offsets |
loopsva | 0:e065ca40f28a | 753 | RTCstep = ctTime; |
loopsva | 0:e065ca40f28a | 754 | |
loopsva | 0:e065ca40f28a | 755 | pc.printf("\n\n"); |
loopsva | 0:e065ca40f28a | 756 | pc.printf("-------------------------------------------------------------------\n"); |
loopsva | 0:e065ca40f28a | 757 | pc.printf("TFT and Touch Screen Test Routines Rev: %d K Braun\n", revision); |
loopsva | 0:e065ca40f28a | 758 | TextLCDTitle(); |
loopsva | 0:e065ca40f28a | 759 | pc.printf("Graphic elements/text displayed\n"); |
loopsva | 0:e065ca40f28a | 760 | // point p; |
loopsva | 0:e065ca40f28a | 761 | |
loopsva | 0:e065ca40f28a | 762 | // tt.claim(stdout); // send stdout to the TFT display |
loopsva | 0:e065ca40f28a | 763 | tt.background(Black); // set background to black |
loopsva | 0:e065ca40f28a | 764 | tt.foreground(Yellow); // set chars to white |
loopsva | 0:e065ca40f28a | 765 | tt.cls(); // clear the screen |
loopsva | 0:e065ca40f28a | 766 | tt.set_font((unsigned char*) Arial12x12); // select the font |
loopsva | 0:e065ca40f28a | 767 | tt.set_orientation(0); |
loopsva | 0:e065ca40f28a | 768 | tt.locate(0,0); |
loopsva | 0:e065ca40f28a | 769 | tt.printf(" Revision: %d", revision); |
loopsva | 0:e065ca40f28a | 770 | |
loopsva | 0:e065ca40f28a | 771 | tt.foreground(White); // set chars to white |
loopsva | 0:e065ca40f28a | 772 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 773 | |
loopsva | 0:e065ca40f28a | 774 | tt.set_font((unsigned char*) Arial24x23); |
loopsva | 0:e065ca40f28a | 775 | tt.locate(3,9); // x,y |
loopsva | 0:e065ca40f28a | 776 | tt.printf("Graphic Test"); |
loopsva | 0:e065ca40f28a | 777 | // some graphics |
loopsva | 0:e065ca40f28a | 778 | tt.line(0,0,100,200,Green); |
loopsva | 0:e065ca40f28a | 779 | tt.rect(20,40,70,90,Red); |
loopsva | 0:e065ca40f28a | 780 | tt.fillrect(240,25,260,70,Blue); |
loopsva | 0:e065ca40f28a | 781 | tt.fillrect(265,25,285,70,Blue); |
loopsva | 0:e065ca40f28a | 782 | tt.circle(30,180,10,Purple); |
loopsva | 0:e065ca40f28a | 783 | tt.circle(55,175,10,DarkGreen); |
loopsva | 0:e065ca40f28a | 784 | tt.circle(40,155,10,DarkCyan); |
loopsva | 0:e065ca40f28a | 785 | DrawTube(); |
loopsva | 0:e065ca40f28a | 786 | CurRot = 1; |
loopsva | 0:e065ca40f28a | 787 | tt.cls(); |
loopsva | 0:e065ca40f28a | 788 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 789 | PosX = 40; |
loopsva | 0:e065ca40f28a | 790 | PosY = 50; |
loopsva | 0:e065ca40f28a | 791 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 792 | PosX = 190; |
loopsva | 0:e065ca40f28a | 793 | PosY = 50; |
loopsva | 0:e065ca40f28a | 794 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 795 | PosX = 40; |
loopsva | 0:e065ca40f28a | 796 | PosY = 280; |
loopsva | 0:e065ca40f28a | 797 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 798 | PosX = 190; |
loopsva | 0:e065ca40f28a | 799 | PosY = 280; |
loopsva | 0:e065ca40f28a | 800 | DrawTubeX(); |
loopsva | 0:e065ca40f28a | 801 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 802 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 803 | |
loopsva | 0:e065ca40f28a | 804 | // Check if we can use modify the http name of the mbed |
loopsva | 0:e065ca40f28a | 805 | FILE *fp = fopen("/local/whoami.ini", "r"); |
loopsva | 0:e065ca40f28a | 806 | if (fp == NULL) { |
loopsva | 0:e065ca40f28a | 807 | pc.printf("*** No /local/whoami.ini file, defaulting to: %s\n",hostname); |
loopsva | 0:e065ca40f28a | 808 | } else { |
loopsva | 0:e065ca40f28a | 809 | char localbuf[64]; |
loopsva | 0:e065ca40f28a | 810 | hostname = fgets(localbuf, sizeof(localbuf)-1, fp); |
loopsva | 0:e065ca40f28a | 811 | pc.printf("Found /local/whoami.ini file. my name is: %s\n",hostname); |
loopsva | 0:e065ca40f28a | 812 | fclose(fp); |
loopsva | 0:e065ca40f28a | 813 | } |
loopsva | 0:e065ca40f28a | 814 | |
loopsva | 0:e065ca40f28a | 815 | // Check for main ini file, create if does not exist |
loopsva | 0:e065ca40f28a | 816 | FILE *fpi = fopen("/local/tft.ini", "r"); |
loopsva | 0:e065ca40f28a | 817 | if (fpi == NULL) { |
loopsva | 0:e065ca40f28a | 818 | InitIniFile(); |
loopsva | 0:e065ca40f28a | 819 | pc.printf("*** rebooting after file creation...."); |
loopsva | 0:e065ca40f28a | 820 | wait(2.0); |
loopsva | 0:e065ca40f28a | 821 | mbed_reset(); |
loopsva | 0:e065ca40f28a | 822 | } else { |
loopsva | 0:e065ca40f28a | 823 | pc.printf("Found /local/tft.ini file...\n"); |
loopsva | 0:e065ca40f28a | 824 | fclose(fpi); |
loopsva | 0:e065ca40f28a | 825 | SNTPReadIniFile("/local/tft.ini"); |
loopsva | 0:e065ca40f28a | 826 | } |
loopsva | 0:e065ca40f28a | 827 | |
loopsva | 0:e065ca40f28a | 828 | /*See if INDEX.HTM can be created on SD micro drive */ |
loopsva | 0:e065ca40f28a | 829 | // |
loopsva | 0:e065ca40f28a | 830 | //NOTE: mbed hangs if no SD card installed - need to fix!!!!!! |
loopsva | 0:e065ca40f28a | 831 | // |
loopsva | 0:e065ca40f28a | 832 | lcdt.cls(); //init the LCD |
loopsva | 0:e065ca40f28a | 833 | lcdt.locate(0,0); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 834 | lcdt.printf("SD Card Missing!"); //---in case SD drive hangs forever--- |
loopsva | 0:e065ca40f28a | 835 | |
loopsva | 0:e065ca40f28a | 836 | if (gDebug > 3) { |
loopsva | 0:e065ca40f28a | 837 | // char *WriteTest = "This is a Test!!!"; |
loopsva | 0:e065ca40f28a | 838 | fp = fopen("/sd/INDEX.HTM", "w+"); |
loopsva | 0:e065ca40f28a | 839 | if (fp == NULL) { |
loopsva | 0:e065ca40f28a | 840 | pc.printf("*** Cannot create INDEX.HTM file\n"); |
loopsva | 0:e065ca40f28a | 841 | } else { |
loopsva | 0:e065ca40f28a | 842 | // char localbuf[32]; |
loopsva | 0:e065ca40f28a | 843 | // localbuf = WriteTest; |
loopsva | 0:e065ca40f28a | 844 | fprintf(fp, "This is a Test!!!\n"); |
loopsva | 0:e065ca40f28a | 845 | pc.printf("Creating /sd/INDEX.HTM file\n"); |
loopsva | 0:e065ca40f28a | 846 | fclose(fp); |
loopsva | 0:e065ca40f28a | 847 | } |
loopsva | 0:e065ca40f28a | 848 | } |
loopsva | 0:e065ca40f28a | 849 | |
loopsva | 0:e065ca40f28a | 850 | fp = fopen("/sd/index.htm", "r"); |
loopsva | 0:e065ca40f28a | 851 | if (fp == NULL) { |
loopsva | 0:e065ca40f28a | 852 | use_sd = false; |
loopsva | 0:e065ca40f28a | 853 | if (gDebug) pc.printf("*** Found SD card, -no- INDEX.HTM file\n"); |
loopsva | 0:e065ca40f28a | 854 | } else { |
loopsva | 0:e065ca40f28a | 855 | use_sd = true; |
loopsva | 0:e065ca40f28a | 856 | fclose(fp); |
loopsva | 0:e065ca40f28a | 857 | if (gDebug) pc.printf("Found SD card with INDEX.HTM file\n"); |
loopsva | 0:e065ca40f28a | 858 | } |
loopsva | 0:e065ca40f28a | 859 | |
loopsva | 0:e065ca40f28a | 860 | lcdt.cls(); |
loopsva | 0:e065ca40f28a | 861 | |
loopsva | 0:e065ca40f28a | 862 | // if (0 != SNTPReadIniFile("/sd/sntp.ini") ) |
loopsva | 0:e065ca40f28a | 863 | // SNTPReadIniFile("/local/sntp.ini"); |
loopsva | 0:e065ca40f28a | 864 | // SNTPWriteIniFile(stdout); |
loopsva | 0:e065ca40f28a | 865 | // fclose(fpi); |
loopsva | 0:e065ca40f28a | 866 | // lcdt.cls(); //init the LCD |
loopsva | 0:e065ca40f28a | 867 | if ((use_sd == true) && (gDebug > 3)) pc.printf(" "); // to get rid of use_sd "never used" warning |
loopsva | 0:e065ca40f28a | 868 | |
loopsva | 0:e065ca40f28a | 869 | //Check RTC |
loopsva | 0:e065ca40f28a | 870 | ctTime = time(NULL); |
loopsva | 0:e065ca40f28a | 871 | ctTime = ctTime + ((TZone+DST)*3600); //timezone and dst offsets |
loopsva | 0:e065ca40f28a | 872 | if (RTCstep == ctTime) { |
loopsva | 0:e065ca40f28a | 873 | pc.printf("*** RTC stopped, initializing the RTC. !!CHECK BATTERY!!\n"); |
loopsva | 0:e065ca40f28a | 874 | pc.printf("*** Note: Time is incorrect, needs to be updated!!!\n"); |
loopsva | 0:e065ca40f28a | 875 | set_time(1296473737); |
loopsva | 0:e065ca40f28a | 876 | lcdt.cls(); //init the LCD |
loopsva | 0:e065ca40f28a | 877 | lcdt.locate(0,0); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 878 | lcdt.printf("RTC Stopped!!"); |
loopsva | 0:e065ca40f28a | 879 | wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 880 | |
loopsva | 0:e065ca40f28a | 881 | // strftime(timebuf, 32, "%H:%M\n", localtime(&ctTime)); |
loopsva | 0:e065ca40f28a | 882 | } else { |
loopsva | 0:e065ca40f28a | 883 | lcdt.cls(); //init the LCD |
loopsva | 0:e065ca40f28a | 884 | lcdt.locate(0,0); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 885 | lcdt.printf("RTC running"); |
loopsva | 0:e065ca40f28a | 886 | pc.printf("RTC running\n"); |
loopsva | 0:e065ca40f28a | 887 | } |
loopsva | 0:e065ca40f28a | 888 | tt.cls(); |
loopsva | 0:e065ca40f28a | 889 | if(TftCalib == 1) { |
loopsva | 0:e065ca40f28a | 890 | lcdt.locate(0,1); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 891 | lcdt.printf("Cal t-pad..."); |
loopsva | 0:e065ca40f28a | 892 | pc.printf("Calibrating touchpad....."); |
loopsva | 0:e065ca40f28a | 893 | tt.calibrate(); // calibrate the touch |
loopsva | 0:e065ca40f28a | 894 | pc.printf(" Updating /local/tft.ini file....."); |
loopsva | 0:e065ca40f28a | 895 | TftCalib = 0; //set -no cal reqd- flag |
loopsva | 0:e065ca40f28a | 896 | pp_txm = tt.getCalDataX(); //get calibration values |
loopsva | 0:e065ca40f28a | 897 | pp_tym = tt.getCalDataY(); |
loopsva | 0:e065ca40f28a | 898 | pp_txoff = tt.getCalOffX(); |
loopsva | 0:e065ca40f28a | 899 | pp_tyoff = tt.getCalOffY(); |
loopsva | 0:e065ca40f28a | 900 | InitIniFile(); //save in ini file |
loopsva | 0:e065ca40f28a | 901 | pc.printf(" done\n"); |
loopsva | 0:e065ca40f28a | 902 | pc.printf("New Touch Cal Values:\n- Touch Cal X Base %d\n- Touch Cal Y Base %d\n- Touch Cal X Offset %d\n- Touch Cal Y Offset %d\n" |
loopsva | 0:e065ca40f28a | 903 | , pp_txm, pp_tym, pp_txoff, pp_tyoff); |
loopsva | 0:e065ca40f28a | 904 | lcdt.cls(); |
loopsva | 0:e065ca40f28a | 905 | } else { |
loopsva | 0:e065ca40f28a | 906 | pc.printf("No touchpad cal needed\n"); |
loopsva | 0:e065ca40f28a | 907 | tt.setCalDataX(pp_txm); //set calibration values |
loopsva | 0:e065ca40f28a | 908 | tt.setCalDataY(pp_tym); |
loopsva | 0:e065ca40f28a | 909 | tt.setCalOffX(pp_txoff); |
loopsva | 0:e065ca40f28a | 910 | tt.setCalOffY(pp_tyoff); |
loopsva | 0:e065ca40f28a | 911 | } |
loopsva | 0:e065ca40f28a | 912 | |
loopsva | 0:e065ca40f28a | 913 | TextLCDTitle(); |
loopsva | 0:e065ca40f28a | 914 | |
loopsva | 0:e065ca40f28a | 915 | tt.cls(); |
loopsva | 0:e065ca40f28a | 916 | tt.foreground(Yellow); // set chars to white |
loopsva | 0:e065ca40f28a | 917 | // tt.cls(); // clear the screen |
loopsva | 0:e065ca40f28a | 918 | // tt.set_font((unsigned char*) Arial12x12); // select the font |
loopsva | 0:e065ca40f28a | 919 | tt.set_font((unsigned char*) Courier10x13); // select the font |
loopsva | 0:e065ca40f28a | 920 | // tt.set_font((unsigned char*) Verdana22x21); // select the font |
loopsva | 0:e065ca40f28a | 921 | // tt.set_font((unsigned char*) Book_Antiqua19x19); // select the font |
loopsva | 0:e065ca40f28a | 922 | pc.printf("Quick Brown Fox displayed\n"); |
loopsva | 0:e065ca40f28a | 923 | QuickBrownFox(); |
loopsva | 0:e065ca40f28a | 924 | // wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 925 | // wait(DISP_SLOW); |
loopsva | 0:e065ca40f28a | 926 | // pc.printf("(before) ctTime %d\n", ctTime); |
loopsva | 0:e065ca40f28a | 927 | |
loopsva | 0:e065ca40f28a | 928 | //Set up Ethernet |
loopsva | 0:e065ca40f28a | 929 | EthernetErr ethErr; |
loopsva | 0:e065ca40f28a | 930 | pc.printf("Starting Ethernet...\n"); |
loopsva | 0:e065ca40f28a | 931 | ethErr = eth.setup(); |
loopsva | 0:e065ca40f28a | 932 | if(ethErr) { |
loopsva | 0:e065ca40f28a | 933 | pc.printf("*** No Ethernet Link!!!\n"); |
loopsva | 0:e065ca40f28a | 934 | } else { |
loopsva | 0:e065ca40f28a | 935 | IpAddr ethIp = eth.getIp(); |
loopsva | 0:e065ca40f28a | 936 | pc.printf("IP address : %d.%d.%d.%d\n", ethIp[0], ethIp[1], ethIp[2], ethIp[3]); |
loopsva | 0:e065ca40f28a | 937 | lcdt.cls(); |
loopsva | 0:e065ca40f28a | 938 | lcdt.printf("%d.%d.%d.%d\n", ethIp[0], ethIp[1], ethIp[2], ethIp[3]); |
loopsva | 0:e065ca40f28a | 939 | lcdt.locate(0,1); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 940 | lcdt.printf("tft%d", revision); |
loopsva | 0:e065ca40f28a | 941 | SetEthTime(); |
loopsva | 0:e065ca40f28a | 942 | } |
loopsva | 0:e065ca40f28a | 943 | InitTft(); |
loopsva | 0:e065ca40f28a | 944 | point p; |
loopsva | 0:e065ca40f28a | 945 | int LedDelay = 0; |
loopsva | 0:e065ca40f28a | 946 | int xTime = ctTime; |
loopsva | 0:e065ca40f28a | 947 | // pc.printf("RtcColor %s\n", RtcColor); |
loopsva | 0:e065ca40f28a | 948 | pc.printf("Ready...\n"); |
loopsva | 0:e065ca40f28a | 949 | // pc.printf("(after) ctTime %d\ xTime %d\n", ctTime, xTime); |
loopsva | 0:e065ca40f28a | 950 | while (1) { |
loopsva | 0:e065ca40f28a | 951 | ctTime = time(NULL); |
loopsva | 0:e065ca40f28a | 952 | SysUpTime = ctTime - StartTime; //number of seconds we've been alive |
loopsva | 0:e065ca40f28a | 953 | // if(gDebug > 1) pc.printf("cT: %d sT: %d suT: %d\n", ctTime, StartTime, SysUpTime); |
loopsva | 0:e065ca40f28a | 954 | ctTime = ctTime + ((TZone + DST) * 3600); //timezone and dst offsets |
loopsva | 0:e065ca40f28a | 955 | strftime(timebuf, 32, "%H:%M:%S", localtime(&ctTime)); |
loopsva | 0:e065ca40f28a | 956 | if(xTime != ctTime) { |
loopsva | 0:e065ca40f28a | 957 | xTime = ctTime; |
loopsva | 0:e065ca40f28a | 958 | if(gDebug > 1) pc.printf("cT: %d sT: %d suT: %d\n", ctTime, StartTime, SysUpTime); |
loopsva | 0:e065ca40f28a | 959 | lcdt.locate(8,1); //column(0-15), row(0-1) |
loopsva | 0:e065ca40f28a | 960 | lcdt.printf("%s\n", timebuf); |
loopsva | 0:e065ca40f28a | 961 | lcdt.locate(15,1); |
loopsva | 0:e065ca40f28a | 962 | |
loopsva | 0:e065ca40f28a | 963 | tt.foreground (Cyan); |
loopsva | 0:e065ca40f28a | 964 | tt.set_orientation(0); |
loopsva | 0:e065ca40f28a | 965 | tt.locate(14,25); //25 |
loopsva | 0:e065ca40f28a | 966 | tt.printf("%s", timebuf ); |
loopsva | 0:e065ca40f28a | 967 | strftime(timebuf, 32, "%m/%d/%y", localtime(&ctTime)); |
loopsva | 0:e065ca40f28a | 968 | tt.locate(14,24); //24 |
loopsva | 0:e065ca40f28a | 969 | tt.printf("%s", timebuf ); |
loopsva | 0:e065ca40f28a | 970 | } |
loopsva | 0:e065ca40f28a | 971 | // Winking LED1 |
loopsva | 0:e065ca40f28a | 972 | LedDelay++; |
loopsva | 0:e065ca40f28a | 973 | if(LedDelay >= 24) { |
loopsva | 0:e065ca40f28a | 974 | LedDelay = 0; |
loopsva | 0:e065ca40f28a | 975 | if(Led1Up == true) { |
loopsva | 0:e065ca40f28a | 976 | Led1Pwm = Led1Pwm + 0.005; |
loopsva | 0:e065ca40f28a | 977 | led1 = Led1Pwm; |
loopsva | 0:e065ca40f28a | 978 | if(Led1Pwm >= 0.20) { |
loopsva | 0:e065ca40f28a | 979 | Led1Up = false; |
loopsva | 0:e065ca40f28a | 980 | } |
loopsva | 0:e065ca40f28a | 981 | } else { |
loopsva | 0:e065ca40f28a | 982 | Led1Pwm = Led1Pwm - 0.005; |
loopsva | 0:e065ca40f28a | 983 | led1 = Led1Pwm; |
loopsva | 0:e065ca40f28a | 984 | if(Led1Pwm <= 0.005) { |
loopsva | 0:e065ca40f28a | 985 | Led1Up = true; |
loopsva | 0:e065ca40f28a | 986 | } |
loopsva | 0:e065ca40f28a | 987 | } |
loopsva | 0:e065ca40f28a | 988 | } |
loopsva | 0:e065ca40f28a | 989 | tt.set_orientation(1); |
loopsva | 0:e065ca40f28a | 990 | p = tt.get_touch(); // read analog pos. |
loopsva | 0:e065ca40f28a | 991 | if (tt.is_touched(p)) { // test if touched |
loopsva | 0:e065ca40f28a | 992 | // pc.printf("p1: %d %d\n", p.x, p.y); |
loopsva | 0:e065ca40f28a | 993 | |
loopsva | 0:e065ca40f28a | 994 | // inside the red box tt.rect(5,5,30,30,Red); |
loopsva | 0:e065ca40f28a | 995 | if((p.x >= 10000) && (p.x <= 15500) && (p.y >= 10500) && (p.y <= 16300)) { // clear out TFT LCD red box |
loopsva | 0:e065ca40f28a | 996 | InitTft(); |
loopsva | 0:e065ca40f28a | 997 | } else if((p.x >= 10000) && (p.x <= 15500) && (p.y >= 16400) && (p.y <= 21300)) { // pen color select colored box |
loopsva | 0:e065ca40f28a | 998 | TftNewColor(); |
loopsva | 0:e065ca40f28a | 999 | } else if((p.x >= 10000) && (p.x <= 15500) && (p.y >= 21400) && (p.y <= 29000)) { // pen width select blue circle |
loopsva | 0:e065ca40f28a | 1000 | TftNewPenSize(); |
loopsva | 0:e065ca40f28a | 1001 | } else if((p.x >= 10000) && (p.x <= 12000) && (p.y >= 50000) && (p.y <= 55000)) { // hidden system-reboot near "TFT" text |
loopsva | 0:e065ca40f28a | 1002 | KillMbed(); |
loopsva | 0:e065ca40f28a | 1003 | } else { |
loopsva | 0:e065ca40f28a | 1004 | p = tt.to_pixel(p); // convert to pixel pos |
loopsva | 0:e065ca40f28a | 1005 | tt.fillcircle(p.x,p.y,PenWidth,PenColor); // print a blue dot on the screen |
loopsva | 0:e065ca40f28a | 1006 | } |
loopsva | 0:e065ca40f28a | 1007 | // pc.printf("p2: %d\n", p); |
loopsva | 0:e065ca40f28a | 1008 | } |
loopsva | 0:e065ca40f28a | 1009 | } |
loopsva | 0:e065ca40f28a | 1010 | } |
loopsva | 0:e065ca40f28a | 1011 |