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