Sample code for the TrainInfoLib
Dependencies: NJE10XCtrlLib NTPClient_NetServices mbed IniFileLib NextTrainFileLib TrainInfoLib lwip
TrainInfoSample.cpp@1:93b052511e2c, 2010-11-19 (annotated)
- Committer:
- rinosh2
- Date:
- Fri Nov 19 21:07:11 2010 +0000
- Revision:
- 1:93b052511e2c
- Parent:
- 0:1a9fa43d77af
Add to the TextLCD for the status indication.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rinosh2 | 0:1a9fa43d77af | 1 | /////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 2 | // TrainInfo: sample code for the TrainInfo library by rinos 2010 |
rinosh2 | 0:1a9fa43d77af | 3 | /////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 4 | |
rinosh2 | 0:1a9fa43d77af | 5 | #include "TrainInfo.h" |
rinosh2 | 0:1a9fa43d77af | 6 | #include "NJE10XCtrl.h" |
rinosh2 | 0:1a9fa43d77af | 7 | #include <time.h> |
rinosh2 | 0:1a9fa43d77af | 8 | |
rinosh2 | 0:1a9fa43d77af | 9 | /////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 10 | |
rinosh2 | 0:1a9fa43d77af | 11 | LocalFileSystem local("local"); |
rinosh2 | 0:1a9fa43d77af | 12 | NJE10XCtrl gNJE(p9); |
rinosh2 | 0:1a9fa43d77af | 13 | |
rinosh2 | 0:1a9fa43d77af | 14 | // critical section |
rinosh2 | 0:1a9fa43d77af | 15 | #define TickerLock() (NVIC_DisableIRQ(TIMER3_IRQn)) |
rinosh2 | 0:1a9fa43d77af | 16 | #define TickerUnlock() (NVIC_EnableIRQ (TIMER3_IRQn)) |
rinosh2 | 0:1a9fa43d77af | 17 | |
rinosh2 | 0:1a9fa43d77af | 18 | // Config file |
rinosh2 | 0:1a9fa43d77af | 19 | #ifndef ROOTPATH |
rinosh2 | 0:1a9fa43d77af | 20 | #define ROOTPATH "/local/" |
rinosh2 | 0:1a9fa43d77af | 21 | #endif |
rinosh2 | 0:1a9fa43d77af | 22 | const char INI_FILE[] = ROOTPATH "TInfo.ini"; |
rinosh2 | 0:1a9fa43d77af | 23 | const int DEFAULT_GIVEUP_SEC = 30; // Giveup-seconds to take the next train |
rinosh2 | 0:1a9fa43d77af | 24 | int gGiveupSec = DEFAULT_GIVEUP_SEC; |
rinosh2 | 0:1a9fa43d77af | 25 | char gDelayMessage[TrainInfo::MAX_DELAY_MESSAGE]; |
rinosh2 | 0:1a9fa43d77af | 26 | int gDispMode = 0; |
rinosh2 | 0:1a9fa43d77af | 27 | int gTimeZone = 540; // +9h00m |
rinosh2 | 0:1a9fa43d77af | 28 | |
rinosh2 | 0:1a9fa43d77af | 29 | // Latest search cache |
rinosh2 | 0:1a9fa43d77af | 30 | time_t gSerchTime; |
rinosh2 | 0:1a9fa43d77af | 31 | NextTrainFile::NextInfo gNext[2]; |
rinosh2 | 0:1a9fa43d77af | 32 | int gDelayStatus = 0; |
rinosh2 | 0:1a9fa43d77af | 33 | const int S_INFO_OK = 0x01; |
rinosh2 | 0:1a9fa43d77af | 34 | const int S_DELAY = 0x10; |
rinosh2 | 0:1a9fa43d77af | 35 | |
rinosh2 | 0:1a9fa43d77af | 36 | |
rinosh2 | 0:1a9fa43d77af | 37 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 1:93b052511e2c | 38 | // LCD |
rinosh2 | 1:93b052511e2c | 39 | #include "TextLCD.h" |
rinosh2 | 1:93b052511e2c | 40 | void putLcd(const char* msg){ |
rinosh2 | 1:93b052511e2c | 41 | TextLCD lcd(p24, p25, p26, p27, p28, p29, p30); // rs, rw, e, d0, d1, d2, d3 |
rinosh2 | 1:93b052511e2c | 42 | lcd.cls(); |
rinosh2 | 1:93b052511e2c | 43 | lcd.printf("%s", msg); |
rinosh2 | 1:93b052511e2c | 44 | } |
rinosh2 | 1:93b052511e2c | 45 | |
rinosh2 | 1:93b052511e2c | 46 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 47 | // RTC Configuration |
rinosh2 | 0:1a9fa43d77af | 48 | |
rinosh2 | 0:1a9fa43d77af | 49 | //#define USE_NTPCLIENT 1 |
rinosh2 | 0:1a9fa43d77af | 50 | |
rinosh2 | 0:1a9fa43d77af | 51 | #ifdef USE_NTPCLIENT |
rinosh2 | 0:1a9fa43d77af | 52 | #include "EthernetNetIf.h" |
rinosh2 | 0:1a9fa43d77af | 53 | #include "NTPClient.h" |
rinosh2 | 0:1a9fa43d77af | 54 | |
rinosh2 | 0:1a9fa43d77af | 55 | int UpdateRTC(const char* ntp_server, int ntp_port, int timezone) { |
rinosh2 | 0:1a9fa43d77af | 56 | printf("UpdateRTC by NTPClient...\n"); |
rinosh2 | 0:1a9fa43d77af | 57 | |
rinosh2 | 0:1a9fa43d77af | 58 | EthernetNetIf eth; |
rinosh2 | 0:1a9fa43d77af | 59 | EthernetErr ethErr = eth.setup(); // default timeout: 15sec |
rinosh2 | 0:1a9fa43d77af | 60 | if (ethErr) { |
rinosh2 | 0:1a9fa43d77af | 61 | printf("eth.setup failed %d.\n", ethErr); |
rinosh2 | 0:1a9fa43d77af | 62 | return 1; |
rinosh2 | 0:1a9fa43d77af | 63 | } |
rinosh2 | 0:1a9fa43d77af | 64 | /* |
rinosh2 | 0:1a9fa43d77af | 65 | time_t now = time(0); |
rinosh2 | 0:1a9fa43d77af | 66 | if(now){ |
rinosh2 | 0:1a9fa43d77af | 67 | printf("Use current RTC: %d\n", now); |
rinosh2 | 0:1a9fa43d77af | 68 | return 0; |
rinosh2 | 0:1a9fa43d77af | 69 | } |
rinosh2 | 0:1a9fa43d77af | 70 | */ |
rinosh2 | 0:1a9fa43d77af | 71 | printf("Connect to the NTP server %s...\n", ntp_server); |
rinosh2 | 0:1a9fa43d77af | 72 | |
rinosh2 | 0:1a9fa43d77af | 73 | NTPResult ntpErr = NTPClient().setTime(Host(IpAddr(), ntp_port, ntp_server)); |
rinosh2 | 0:1a9fa43d77af | 74 | if(ntpErr){ |
rinosh2 | 0:1a9fa43d77af | 75 | printf("NTPClient::setTime failed %d.\n", ntpErr); |
rinosh2 | 0:1a9fa43d77af | 76 | return 2; |
rinosh2 | 0:1a9fa43d77af | 77 | } |
rinosh2 | 0:1a9fa43d77af | 78 | |
rinosh2 | 0:1a9fa43d77af | 79 | #else |
rinosh2 | 0:1a9fa43d77af | 80 | // I can't use NTPClient with LWIP HTTPClient... |
rinosh2 | 0:1a9fa43d77af | 81 | // So, I get the RTC via http-NTP server. |
rinosh2 | 0:1a9fa43d77af | 82 | |
rinosh2 | 0:1a9fa43d77af | 83 | #include "HTTPClient.h" |
rinosh2 | 0:1a9fa43d77af | 84 | #define NTP2POSIX 2208988800UL |
rinosh2 | 0:1a9fa43d77af | 85 | |
rinosh2 | 0:1a9fa43d77af | 86 | int UpdateRTC(const char* ntp_server, int ntp_port, int timezone) { |
rinosh2 | 0:1a9fa43d77af | 87 | printf("UpdateRTC by HTTP-NTP...\n"); |
rinosh2 | 0:1a9fa43d77af | 88 | |
rinosh2 | 0:1a9fa43d77af | 89 | char rbuf[80]; |
rinosh2 | 0:1a9fa43d77af | 90 | printf("Connect to the NTP server %s...\n", ntp_server); |
rinosh2 | 0:1a9fa43d77af | 91 | HTTPClient http; |
rinosh2 | 0:1a9fa43d77af | 92 | http.timeout(10); |
rinosh2 | 0:1a9fa43d77af | 93 | int len = http.get(ntp_server, rbuf, sizeof(rbuf) - 1); |
rinosh2 | 0:1a9fa43d77af | 94 | if(len){ |
rinosh2 | 0:1a9fa43d77af | 95 | rbuf[len] = '\0'; |
rinosh2 | 0:1a9fa43d77af | 96 | char* p = strstr(rbuf, "<BODY>"); |
rinosh2 | 0:1a9fa43d77af | 97 | if(p){ |
rinosh2 | 0:1a9fa43d77af | 98 | p += 7; |
rinosh2 | 0:1a9fa43d77af | 99 | time_t val = strtoul(p, 0, 10) - NTP2POSIX; |
rinosh2 | 0:1a9fa43d77af | 100 | set_time(val); |
rinosh2 | 0:1a9fa43d77af | 101 | printf("NTP set %d\n", val); |
rinosh2 | 0:1a9fa43d77af | 102 | } |
rinosh2 | 0:1a9fa43d77af | 103 | printf("HTTPClient download [%s]\n", rbuf); |
rinosh2 | 0:1a9fa43d77af | 104 | } |
rinosh2 | 0:1a9fa43d77af | 105 | |
rinosh2 | 0:1a9fa43d77af | 106 | #endif |
rinosh2 | 0:1a9fa43d77af | 107 | // Puts RTC (JST) |
rinosh2 | 0:1a9fa43d77af | 108 | time_t now = time(0) + timezone; |
rinosh2 | 0:1a9fa43d77af | 109 | printf("RTC(JST): %s\n", ctime(&now)); |
rinosh2 | 0:1a9fa43d77af | 110 | return 0; |
rinosh2 | 0:1a9fa43d77af | 111 | } |
rinosh2 | 0:1a9fa43d77af | 112 | |
rinosh2 | 0:1a9fa43d77af | 113 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 114 | // Display control |
rinosh2 | 0:1a9fa43d77af | 115 | |
rinosh2 | 0:1a9fa43d77af | 116 | #include "NJE10XCtrl.h" |
rinosh2 | 0:1a9fa43d77af | 117 | |
rinosh2 | 0:1a9fa43d77af | 118 | char gMsgNoTrain[100] = "NoTrain"; |
rinosh2 | 0:1a9fa43d77af | 119 | char gMsgLeft [ 20] = "Left"; |
rinosh2 | 0:1a9fa43d77af | 120 | char gMsgDir [ 20] = "To"; |
rinosh2 | 0:1a9fa43d77af | 121 | char gMsgSec [ 20] = "Sec"; |
rinosh2 | 0:1a9fa43d77af | 122 | int gMsgWarn = 60 * 3; // 3min |
rinosh2 | 0:1a9fa43d77af | 123 | |
rinosh2 | 0:1a9fa43d77af | 124 | void dispTime(){ |
rinosh2 | 0:1a9fa43d77af | 125 | char buf[100]; |
rinosh2 | 0:1a9fa43d77af | 126 | time_t t = time(0) + gTimeZone; |
rinosh2 | 0:1a9fa43d77af | 127 | struct tm* st = localtime(&t); |
rinosh2 | 0:1a9fa43d77af | 128 | t -= gSerchTime; |
rinosh2 | 0:1a9fa43d77af | 129 | |
rinosh2 | 0:1a9fa43d77af | 130 | gNJE.clear(); |
rinosh2 | 0:1a9fa43d77af | 131 | NextTrainFile::NextInfo* p = &gNext[0]; |
rinosh2 | 0:1a9fa43d77af | 132 | if(p->m_diff < 0){ |
rinosh2 | 0:1a9fa43d77af | 133 | printf("Now:%02d:%02d:%02d, %s\n", st->tm_hour, st->tm_min, st->tm_sec, gMsgNoTrain); // or error |
rinosh2 | 0:1a9fa43d77af | 134 | sprintf(buf, "%02d:%02d:%02d ", st->tm_hour, st->tm_min, st->tm_sec); |
rinosh2 | 0:1a9fa43d77af | 135 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 136 | gNJE.addAttr(NJE10XCtrl::ATTR_RED); |
rinosh2 | 0:1a9fa43d77af | 137 | gNJE.add(gMsgNoTrain); |
rinosh2 | 0:1a9fa43d77af | 138 | gNJE.setMessage(1); |
rinosh2 | 0:1a9fa43d77af | 139 | return; |
rinosh2 | 0:1a9fa43d77af | 140 | } |
rinosh2 | 0:1a9fa43d77af | 141 | |
rinosh2 | 0:1a9fa43d77af | 142 | // Check the difference (was gone?) |
rinosh2 | 0:1a9fa43d77af | 143 | int diff = p->m_diff - t; |
rinosh2 | 0:1a9fa43d77af | 144 | if(diff < gGiveupSec){ |
rinosh2 | 0:1a9fa43d77af | 145 | p = &gNext[1]; |
rinosh2 | 0:1a9fa43d77af | 146 | diff = p->m_diff - t; |
rinosh2 | 0:1a9fa43d77af | 147 | } |
rinosh2 | 0:1a9fa43d77af | 148 | |
rinosh2 | 0:1a9fa43d77af | 149 | // Show message to the NJE-105 |
rinosh2 | 0:1a9fa43d77af | 150 | NJE10XCtrl::Attr1 a1 = NJE10XCtrl::ATTR_GREEN; |
rinosh2 | 0:1a9fa43d77af | 151 | NJE10XCtrl::Attr2 a2 = NJE10XCtrl::ATTR_SCROLL_R; |
rinosh2 | 0:1a9fa43d77af | 152 | NJE10XCtrl::Attr3 a3 = NJE10XCtrl::ATTR_NORMAL; |
rinosh2 | 0:1a9fa43d77af | 153 | |
rinosh2 | 0:1a9fa43d77af | 154 | if(diff < 0){ |
rinosh2 | 0:1a9fa43d77af | 155 | printf("%02d:%02d Gone%2dsec ", p->m_hour, p->m_min, -diff); |
rinosh2 | 0:1a9fa43d77af | 156 | |
rinosh2 | 0:1a9fa43d77af | 157 | sprintf(buf, "%02d:%02d", p->m_hour, p->m_min); |
rinosh2 | 0:1a9fa43d77af | 158 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 159 | //gNJE.addAttr(NJE10XCtrl::ATTR_YELLOW, NJE10XCtrl::ATTR_SCROLL); |
rinosh2 | 0:1a9fa43d77af | 160 | gNJE.add(p->m_option); |
rinosh2 | 0:1a9fa43d77af | 161 | gNJE.add(gMsgDir); |
rinosh2 | 0:1a9fa43d77af | 162 | sprintf(buf, " Gone%ds", -diff); |
rinosh2 | 0:1a9fa43d77af | 163 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 164 | } else if(diff < 60) { |
rinosh2 | 0:1a9fa43d77af | 165 | // 123456789012345678901234 (NJE-105) |
rinosh2 | 0:1a9fa43d77af | 166 | // MM:HH Ê úgs c59b |
rinosh2 | 0:1a9fa43d77af | 167 | printf("%02d:%02d Left%2dsec %s\n", p->m_hour, p->m_min, diff, p->m_option); |
rinosh2 | 0:1a9fa43d77af | 168 | |
rinosh2 | 0:1a9fa43d77af | 169 | sprintf(buf, "%02d:%02d", p->m_hour, p->m_min); |
rinosh2 | 0:1a9fa43d77af | 170 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 171 | gNJE.addAttr(NJE10XCtrl::ATTR_YELLOW, NJE10XCtrl::ATTR_SCROLL_R); |
rinosh2 | 0:1a9fa43d77af | 172 | gNJE.add(p->m_option); |
rinosh2 | 0:1a9fa43d77af | 173 | gNJE.add(gMsgDir); |
rinosh2 | 0:1a9fa43d77af | 174 | gNJE.addAttr((diff<gMsgWarn)? NJE10XCtrl::ATTR_RED : NJE10XCtrl::ATTR_GREEN, NJE10XCtrl::ATTR_SCROLL_R); |
rinosh2 | 0:1a9fa43d77af | 175 | gNJE.add(' '); |
rinosh2 | 0:1a9fa43d77af | 176 | gNJE.add(gMsgLeft); |
rinosh2 | 0:1a9fa43d77af | 177 | sprintf(buf, "%2d%s", diff, gMsgSec); |
rinosh2 | 0:1a9fa43d77af | 178 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 179 | } else { |
rinosh2 | 0:1a9fa43d77af | 180 | // 123456789012345678901234 (NJE-105) |
rinosh2 | 0:1a9fa43d77af | 181 | // MM:HHÊ úgs c01:23 |
rinosh2 | 0:1a9fa43d77af | 182 | int diff_min = diff / 60; |
rinosh2 | 0:1a9fa43d77af | 183 | int diff_sec = diff % 60; |
rinosh2 | 0:1a9fa43d77af | 184 | printf("%02d:%02d Left%2d:%02d(%s)\n", p->m_hour, p->m_min, diff_min, diff_sec, p->m_option); |
rinosh2 | 0:1a9fa43d77af | 185 | |
rinosh2 | 0:1a9fa43d77af | 186 | sprintf(buf, "%02d:%02d", p->m_hour, p->m_min); |
rinosh2 | 0:1a9fa43d77af | 187 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 188 | gNJE.addAttr(NJE10XCtrl::ATTR_YELLOW, NJE10XCtrl::ATTR_SCROLL_R); |
rinosh2 | 0:1a9fa43d77af | 189 | gNJE.add(p->m_option); |
rinosh2 | 0:1a9fa43d77af | 190 | gNJE.add(gMsgDir); |
rinosh2 | 0:1a9fa43d77af | 191 | gNJE.addAttr((diff<gMsgWarn)? NJE10XCtrl::ATTR_RED : NJE10XCtrl::ATTR_GREEN, NJE10XCtrl::ATTR_SCROLL_R); |
rinosh2 | 0:1a9fa43d77af | 192 | gNJE.add(gMsgLeft); |
rinosh2 | 0:1a9fa43d77af | 193 | sprintf(buf, "%2d:%02d", diff_min, diff_sec); |
rinosh2 | 0:1a9fa43d77af | 194 | gNJE.add(buf); |
rinosh2 | 0:1a9fa43d77af | 195 | } |
rinosh2 | 0:1a9fa43d77af | 196 | |
rinosh2 | 0:1a9fa43d77af | 197 | // delay |
rinosh2 | 0:1a9fa43d77af | 198 | a1 = NJE10XCtrl::ATTR_GREEN; |
rinosh2 | 0:1a9fa43d77af | 199 | int delay = 0; |
rinosh2 | 0:1a9fa43d77af | 200 | if(gDelayStatus & S_DELAY){ |
rinosh2 | 0:1a9fa43d77af | 201 | delay = 1; |
rinosh2 | 0:1a9fa43d77af | 202 | a1 = NJE10XCtrl::ATTR_RED; |
rinosh2 | 0:1a9fa43d77af | 203 | } else if(*gDelayMessage){ |
rinosh2 | 0:1a9fa43d77af | 204 | if(diff % 60 < 3) delay = 1; |
rinosh2 | 0:1a9fa43d77af | 205 | } |
rinosh2 | 0:1a9fa43d77af | 206 | |
rinosh2 | 0:1a9fa43d77af | 207 | if(delay) gNJE.setMessage(2, gDelayMessage, a1); |
rinosh2 | 0:1a9fa43d77af | 208 | else gNJE.delMessage(2); |
rinosh2 | 0:1a9fa43d77af | 209 | gNJE.setMessage(1, 0, a1, a2, a3); |
rinosh2 | 0:1a9fa43d77af | 210 | |
rinosh2 | 0:1a9fa43d77af | 211 | // if(delay) gNJE.setMessage(1, gDelayMessage); |
rinosh2 | 0:1a9fa43d77af | 212 | // else gNJE.setMessage(1, 0, a1, a2, a3); |
rinosh2 | 0:1a9fa43d77af | 213 | } |
rinosh2 | 0:1a9fa43d77af | 214 | |
rinosh2 | 0:1a9fa43d77af | 215 | void dispDelay(){ |
rinosh2 | 0:1a9fa43d77af | 216 | if(++gDispMode > 10) gDispMode = 0; |
rinosh2 | 0:1a9fa43d77af | 217 | if(gDispMode != 1){ |
rinosh2 | 0:1a9fa43d77af | 218 | gNJE.delMessage(2); |
rinosh2 | 0:1a9fa43d77af | 219 | return; |
rinosh2 | 0:1a9fa43d77af | 220 | } |
rinosh2 | 0:1a9fa43d77af | 221 | printf("%s\n", gDelayMessage); |
rinosh2 | 0:1a9fa43d77af | 222 | gNJE.setMessage(2, gDelayMessage); |
rinosh2 | 0:1a9fa43d77af | 223 | } |
rinosh2 | 0:1a9fa43d77af | 224 | |
rinosh2 | 0:1a9fa43d77af | 225 | void dispWait(){ |
rinosh2 | 0:1a9fa43d77af | 226 | if(++gDispMode > 10) gDispMode = 0; |
rinosh2 | 0:1a9fa43d77af | 227 | if(gDispMode != 1){ |
rinosh2 | 0:1a9fa43d77af | 228 | return; |
rinosh2 | 0:1a9fa43d77af | 229 | } |
rinosh2 | 0:1a9fa43d77af | 230 | printf("Please wait...\n"); |
rinosh2 | 0:1a9fa43d77af | 231 | gNJE.setMessage(1, "Please wait..."); |
rinosh2 | 0:1a9fa43d77af | 232 | } |
rinosh2 | 0:1a9fa43d77af | 233 | |
rinosh2 | 0:1a9fa43d77af | 234 | void dispCB(){ |
rinosh2 | 0:1a9fa43d77af | 235 | // if(gDelayStatus & S_DELAY){ |
rinosh2 | 0:1a9fa43d77af | 236 | // dispDelay(); |
rinosh2 | 0:1a9fa43d77af | 237 | // } else { |
rinosh2 | 0:1a9fa43d77af | 238 | if(gDelayStatus & S_INFO_OK){ |
rinosh2 | 0:1a9fa43d77af | 239 | dispTime(); |
rinosh2 | 0:1a9fa43d77af | 240 | gDispMode = 0; |
rinosh2 | 0:1a9fa43d77af | 241 | } else { |
rinosh2 | 0:1a9fa43d77af | 242 | dispWait(); |
rinosh2 | 0:1a9fa43d77af | 243 | } |
rinosh2 | 0:1a9fa43d77af | 244 | // } |
rinosh2 | 0:1a9fa43d77af | 245 | } |
rinosh2 | 0:1a9fa43d77af | 246 | |
rinosh2 | 0:1a9fa43d77af | 247 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 248 | // NextTrain & Delay information control |
rinosh2 | 0:1a9fa43d77af | 249 | int updateNext(TrainInfo& train){ |
rinosh2 | 1:93b052511e2c | 250 | putLcd("Update NextTrain information..."); |
rinosh2 | 1:93b052511e2c | 251 | |
rinosh2 | 0:1a9fa43d77af | 252 | printf("UpdateTrain\n"); |
rinosh2 | 0:1a9fa43d77af | 253 | |
rinosh2 | 0:1a9fa43d77af | 254 | // Next (and 2nd Next) train check |
rinosh2 | 0:1a9fa43d77af | 255 | TickerLock(); |
rinosh2 | 0:1a9fa43d77af | 256 | time_t now = time(0) + gTimeZone; |
rinosh2 | 0:1a9fa43d77af | 257 | gSerchTime = now; |
rinosh2 | 0:1a9fa43d77af | 258 | struct tm* st = localtime(&now); |
rinosh2 | 0:1a9fa43d77af | 259 | for(int index = 0, offset = 0 ; index < 2; ++offset){ |
rinosh2 | 0:1a9fa43d77af | 260 | NextTrainFile::Status ret = train.search(now, offset); |
rinosh2 | 0:1a9fa43d77af | 261 | switch(ret){ |
rinosh2 | 0:1a9fa43d77af | 262 | case NextTrainFile::S_SUCCESS: |
rinosh2 | 0:1a9fa43d77af | 263 | if(train.next()->m_diff > gGiveupSec){ |
rinosh2 | 0:1a9fa43d77af | 264 | gNext[index++] = *train.next(); |
rinosh2 | 0:1a9fa43d77af | 265 | } |
rinosh2 | 0:1a9fa43d77af | 266 | break; |
rinosh2 | 0:1a9fa43d77af | 267 | |
rinosh2 | 0:1a9fa43d77af | 268 | case NextTrainFile::S_NO_TRAIN: |
rinosh2 | 0:1a9fa43d77af | 269 | gNext[index++].m_diff = -1; |
rinosh2 | 0:1a9fa43d77af | 270 | break; |
rinosh2 | 0:1a9fa43d77af | 271 | |
rinosh2 | 0:1a9fa43d77af | 272 | default: |
rinosh2 | 0:1a9fa43d77af | 273 | gNext[index++].m_diff = -2; |
rinosh2 | 0:1a9fa43d77af | 274 | break; |
rinosh2 | 0:1a9fa43d77af | 275 | } |
rinosh2 | 0:1a9fa43d77af | 276 | } |
rinosh2 | 0:1a9fa43d77af | 277 | gDelayStatus |= S_INFO_OK; |
rinosh2 | 0:1a9fa43d77af | 278 | TickerUnlock(); |
rinosh2 | 0:1a9fa43d77af | 279 | return 0; |
rinosh2 | 0:1a9fa43d77af | 280 | } |
rinosh2 | 0:1a9fa43d77af | 281 | |
rinosh2 | 0:1a9fa43d77af | 282 | int updateDelay(TrainInfo& train){ |
rinosh2 | 1:93b052511e2c | 283 | putLcd("Update Delay Information..."); |
rinosh2 | 1:93b052511e2c | 284 | |
rinosh2 | 0:1a9fa43d77af | 285 | // Delay check |
rinosh2 | 0:1a9fa43d77af | 286 | TrainInfo::Status ret = train.checkDelay(); |
rinosh2 | 0:1a9fa43d77af | 287 | if(ret == TrainInfo::S_DELAY_DETECTED){ |
rinosh2 | 0:1a9fa43d77af | 288 | TickerLock(); |
rinosh2 | 0:1a9fa43d77af | 289 | train.getDelayMessage(gDelayMessage, sizeof(gDelayMessage)); |
rinosh2 | 0:1a9fa43d77af | 290 | gDelayStatus |= S_DELAY; |
rinosh2 | 0:1a9fa43d77af | 291 | TickerUnlock(); |
rinosh2 | 0:1a9fa43d77af | 292 | } else { |
rinosh2 | 0:1a9fa43d77af | 293 | TickerLock(); |
rinosh2 | 0:1a9fa43d77af | 294 | train.getDelayMessage(gDelayMessage, sizeof(gDelayMessage)); // copy for testing... |
rinosh2 | 0:1a9fa43d77af | 295 | gDelayStatus &= ~S_DELAY; |
rinosh2 | 0:1a9fa43d77af | 296 | TickerUnlock(); |
rinosh2 | 0:1a9fa43d77af | 297 | } |
rinosh2 | 0:1a9fa43d77af | 298 | return 0; |
rinosh2 | 0:1a9fa43d77af | 299 | } |
rinosh2 | 0:1a9fa43d77af | 300 | |
rinosh2 | 0:1a9fa43d77af | 301 | int updateAll(){ |
rinosh2 | 0:1a9fa43d77af | 302 | TrainInfo train; |
rinosh2 | 0:1a9fa43d77af | 303 | |
rinosh2 | 0:1a9fa43d77af | 304 | if(train.open(INI_FILE)){ |
rinosh2 | 0:1a9fa43d77af | 305 | printf("Can't open INI file '%s'\n", INI_FILE); |
rinosh2 | 0:1a9fa43d77af | 306 | return 1; |
rinosh2 | 0:1a9fa43d77af | 307 | } |
rinosh2 | 0:1a9fa43d77af | 308 | updateNext (train); |
rinosh2 | 0:1a9fa43d77af | 309 | updateDelay(train); |
rinosh2 | 0:1a9fa43d77af | 310 | return 0; |
rinosh2 | 0:1a9fa43d77af | 311 | } |
rinosh2 | 0:1a9fa43d77af | 312 | |
rinosh2 | 0:1a9fa43d77af | 313 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:1a9fa43d77af | 314 | // Configuration and Startup |
rinosh2 | 0:1a9fa43d77af | 315 | int setupParams(const char* inifile){ |
rinosh2 | 0:1a9fa43d77af | 316 | char ntpserver[100] = "ntp.jst.mfeed.ad.jp"; |
rinosh2 | 0:1a9fa43d77af | 317 | int ntpport = 123; |
rinosh2 | 0:1a9fa43d77af | 318 | |
rinosh2 | 0:1a9fa43d77af | 319 | const IniFile::IniList INI_PARAM_LIST[] = { |
rinosh2 | 0:1a9fa43d77af | 320 | INIFILE_INT("GiveupSec", gGiveupSec), |
rinosh2 | 0:1a9fa43d77af | 321 | INIFILE_STR("NTPServer", ntpserver, sizeof(ntpserver)), |
rinosh2 | 0:1a9fa43d77af | 322 | INIFILE_INT("NTPPort", ntpport), |
rinosh2 | 0:1a9fa43d77af | 323 | INIFILE_INT("TimeZone", gTimeZone), |
rinosh2 | 0:1a9fa43d77af | 324 | |
rinosh2 | 0:1a9fa43d77af | 325 | INIFILE_STR("MsgNoTrain", gMsgNoTrain, sizeof(gMsgNoTrain)), |
rinosh2 | 0:1a9fa43d77af | 326 | INIFILE_STR("MsgLeft", gMsgLeft, sizeof(gMsgLeft)), |
rinosh2 | 0:1a9fa43d77af | 327 | INIFILE_STR("MsgDir", gMsgDir, sizeof(gMsgDir)), |
rinosh2 | 0:1a9fa43d77af | 328 | INIFILE_STR("MsgSec", gMsgSec, sizeof(gMsgSec)), |
rinosh2 | 0:1a9fa43d77af | 329 | |
rinosh2 | 0:1a9fa43d77af | 330 | INIFILE_INT("MsgWarn", gMsgWarn), |
rinosh2 | 0:1a9fa43d77af | 331 | |
rinosh2 | 0:1a9fa43d77af | 332 | INIFILE_END, |
rinosh2 | 0:1a9fa43d77af | 333 | }; |
rinosh2 | 0:1a9fa43d77af | 334 | |
rinosh2 | 0:1a9fa43d77af | 335 | IniFile::getval(inifile, INI_PARAM_LIST); |
rinosh2 | 0:1a9fa43d77af | 336 | gTimeZone *= 60; |
rinosh2 | 0:1a9fa43d77af | 337 | |
rinosh2 | 0:1a9fa43d77af | 338 | // Init NJE |
rinosh2 | 0:1a9fa43d77af | 339 | gNJE.setScrollSpeed(NJE10XCtrl::ScrollSpeed(NJE10XCtrl::SCROLL_FAST)); |
rinosh2 | 0:1a9fa43d77af | 340 | //gNJE.setBlinkSpeed(NJE10XCtrl::BlinkSpeed(NJE10XCtrl::BLINK_FAST)); |
rinosh2 | 0:1a9fa43d77af | 341 | gNJE.setStopTime(1); |
rinosh2 | 0:1a9fa43d77af | 342 | gNJE.setMessage(1, "Please wait..."); |
rinosh2 | 0:1a9fa43d77af | 343 | |
rinosh2 | 0:1a9fa43d77af | 344 | |
rinosh2 | 0:1a9fa43d77af | 345 | // Init RTC |
rinosh2 | 1:93b052511e2c | 346 | putLcd("Connect to the NTP server..."); |
rinosh2 | 0:1a9fa43d77af | 347 | UpdateRTC(ntpserver, ntpport, gTimeZone); |
rinosh2 | 0:1a9fa43d77af | 348 | return 0; |
rinosh2 | 0:1a9fa43d77af | 349 | } |
rinosh2 | 0:1a9fa43d77af | 350 | |
rinosh2 | 0:1a9fa43d77af | 351 | int main(){ |
rinosh2 | 1:93b052511e2c | 352 | putLcd("Start TrainInfo!"); |
rinosh2 | 1:93b052511e2c | 353 | |
rinosh2 | 0:1a9fa43d77af | 354 | setupParams(INI_FILE); |
rinosh2 | 0:1a9fa43d77af | 355 | Ticker dispTicker; |
rinosh2 | 0:1a9fa43d77af | 356 | dispTicker.attach(dispCB, 1); // 1 update per sec |
rinosh2 | 0:1a9fa43d77af | 357 | |
rinosh2 | 0:1a9fa43d77af | 358 | for(;;){ |
rinosh2 | 0:1a9fa43d77af | 359 | printf("Update information\n"); |
rinosh2 | 0:1a9fa43d77af | 360 | if(updateAll()) break; |
rinosh2 | 0:1a9fa43d77af | 361 | |
rinosh2 | 0:1a9fa43d77af | 362 | // Free LocalFileSystem before waiting. |
rinosh2 | 0:1a9fa43d77af | 363 | // (For access file via USB) |
rinosh2 | 1:93b052511e2c | 364 | putLcd("Wait for the next update event"); |
rinosh2 | 0:1a9fa43d77af | 365 | wait(60); |
rinosh2 | 0:1a9fa43d77af | 366 | } |
rinosh2 | 0:1a9fa43d77af | 367 | dispTicker.detach(); |
rinosh2 | 0:1a9fa43d77af | 368 | printf("Program end\n"); |
rinosh2 | 0:1a9fa43d77af | 369 | return 0; |
rinosh2 | 0:1a9fa43d77af | 370 | } |