Smart Clock
Dependencies: AlarmClock DigitalClock EthernetInterface FourDigitLED HTTPClient NTPClient SDFileSystem TrainStat WeatherInfo XML_aide mbed-rtos mbed picojson wolfSSL
main.txt@5:e4891827f7b1, 2015-10-23 (annotated)
- Committer:
- takashikojo
- Date:
- Fri Oct 23 05:52:37 2015 +0000
- Revision:
- 5:e4891827f7b1
Initial public version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takashikojo | 5:e4891827f7b1 | 1 | #include "mbed.h" |
takashikojo | 5:e4891827f7b1 | 2 | #include <ctype.h> |
takashikojo | 5:e4891827f7b1 | 3 | |
takashikojo | 5:e4891827f7b1 | 4 | #include "EthernetInterface.h" |
takashikojo | 5:e4891827f7b1 | 5 | #include "HTTPClient.h" |
takashikojo | 5:e4891827f7b1 | 6 | #include "NTPClient.h" |
takashikojo | 5:e4891827f7b1 | 7 | #include "AlarmClock.h" |
takashikojo | 5:e4891827f7b1 | 8 | #include "TrainStat.h" |
takashikojo | 5:e4891827f7b1 | 9 | #include "WeatherInfo.h" |
takashikojo | 5:e4891827f7b1 | 10 | #include "matchLine.h" |
takashikojo | 5:e4891827f7b1 | 11 | |
takashikojo | 5:e4891827f7b1 | 12 | #if 0 |
takashikojo | 5:e4891827f7b1 | 13 | //Enable debug |
takashikojo | 5:e4891827f7b1 | 14 | #define DBG(x, ...) std::printf("[Main : DBG]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 5:e4891827f7b1 | 15 | #define WARN(x, ...) std::printf("[Main : WARN]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 5:e4891827f7b1 | 16 | #else |
takashikojo | 5:e4891827f7b1 | 17 | //Disable debug |
takashikojo | 5:e4891827f7b1 | 18 | #define DBG(x, ...) |
takashikojo | 5:e4891827f7b1 | 19 | #define WARN(x, ...) |
takashikojo | 5:e4891827f7b1 | 20 | #endif |
takashikojo | 5:e4891827f7b1 | 21 | |
takashikojo | 5:e4891827f7b1 | 22 | #define ERR(x, ...) std::printf("[Main : ERR]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 5:e4891827f7b1 | 23 | |
takashikojo | 5:e4891827f7b1 | 24 | AlarmClock alarmclock ( |
takashikojo | 5:e4891827f7b1 | 25 | /* Segment 0 - 6, Dot */ D11,D6, D3, D1, D0, D10,D4, D2 , |
takashikojo | 5:e4891827f7b1 | 26 | /* Digit 1 - 4 */ D5, D7, D9, D12, |
takashikojo | 5:e4891827f7b1 | 27 | /* Alarm, Hour, Min, Tone */D13, D14, D15, PTC11 |
takashikojo | 5:e4891827f7b1 | 28 | ) ; |
takashikojo | 5:e4891827f7b1 | 29 | |
takashikojo | 5:e4891827f7b1 | 30 | TrainStat trainstat(TOKYO_METRO /*YAHOO_TRAIN*/) ; |
takashikojo | 5:e4891827f7b1 | 31 | WeatherInfo weatherinfo(WEATHER_HACKS) ; |
takashikojo | 5:e4891827f7b1 | 32 | HTTPClient httpClient; |
takashikojo | 5:e4891827f7b1 | 33 | matchLine watchList ; |
takashikojo | 5:e4891827f7b1 | 34 | |
takashikojo | 5:e4891827f7b1 | 35 | static void ntp(char *site) |
takashikojo | 5:e4891827f7b1 | 36 | { |
takashikojo | 5:e4891827f7b1 | 37 | NTPClient ntp; |
takashikojo | 5:e4891827f7b1 | 38 | |
takashikojo | 5:e4891827f7b1 | 39 | alarmclock.setLED(33, 33) ; |
takashikojo | 5:e4891827f7b1 | 40 | if (ntp.setTime(site) == 0) { |
takashikojo | 5:e4891827f7b1 | 41 | alarmclock.flashLED() ; |
takashikojo | 5:e4891827f7b1 | 42 | } else { |
takashikojo | 5:e4891827f7b1 | 43 | alarmclock.setLED(0, 0) ; |
takashikojo | 5:e4891827f7b1 | 44 | wait(30.0) ; |
takashikojo | 5:e4891827f7b1 | 45 | return ; |
takashikojo | 5:e4891827f7b1 | 46 | } |
takashikojo | 5:e4891827f7b1 | 47 | } |
takashikojo | 5:e4891827f7b1 | 48 | |
takashikojo | 5:e4891827f7b1 | 49 | void clock_main(void const *av) |
takashikojo | 5:e4891827f7b1 | 50 | { |
takashikojo | 5:e4891827f7b1 | 51 | |
takashikojo | 5:e4891827f7b1 | 52 | alarmclock.start() ; |
takashikojo | 5:e4891827f7b1 | 53 | while(1){ |
takashikojo | 5:e4891827f7b1 | 54 | alarmclock.poll() ; |
takashikojo | 5:e4891827f7b1 | 55 | Thread::wait(100); |
takashikojo | 5:e4891827f7b1 | 56 | } |
takashikojo | 5:e4891827f7b1 | 57 | } |
takashikojo | 5:e4891827f7b1 | 58 | |
takashikojo | 5:e4891827f7b1 | 59 | #define FRONT0 0x06 |
takashikojo | 5:e4891827f7b1 | 60 | #define FRONT1 0x79 |
takashikojo | 5:e4891827f7b1 | 61 | #define FRONT2 0x49 |
takashikojo | 5:e4891827f7b1 | 62 | #define MIDDLE 0x49 |
takashikojo | 5:e4891827f7b1 | 63 | #define TAIL0 0x49 |
takashikojo | 5:e4891827f7b1 | 64 | #define TAIL1 0x4f |
takashikojo | 5:e4891827f7b1 | 65 | #define TAIL2 0x30 |
takashikojo | 5:e4891827f7b1 | 66 | #define ROCK 0x5c |
takashikojo | 5:e4891827f7b1 | 67 | #define BLANK 0x00 |
takashikojo | 5:e4891827f7b1 | 68 | |
takashikojo | 5:e4891827f7b1 | 69 | static unsigned int delayPtn[14][4] = { |
takashikojo | 5:e4891827f7b1 | 70 | { BLANK, BLANK, BLANK, BLANK } , |
takashikojo | 5:e4891827f7b1 | 71 | { FRONT1, BLANK, BLANK, ROCK } , |
takashikojo | 5:e4891827f7b1 | 72 | { FRONT2, FRONT0,BLANK, ROCK } , |
takashikojo | 5:e4891827f7b1 | 73 | { TAIL0, FRONT1,BLANK, ROCK } , |
takashikojo | 5:e4891827f7b1 | 74 | { TAIL1, FRONT2, FRONT0,ROCK } , |
takashikojo | 5:e4891827f7b1 | 75 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 76 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 77 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 78 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 79 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 80 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 81 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 82 | { TAIL2, MIDDLE, FRONT1,ROCK } , |
takashikojo | 5:e4891827f7b1 | 83 | { BLANK, BLANK, BLANK, BLANK } |
takashikojo | 5:e4891827f7b1 | 84 | } ; |
takashikojo | 5:e4891827f7b1 | 85 | |
takashikojo | 5:e4891827f7b1 | 86 | static unsigned int noDelayPtn[14][4] = { |
takashikojo | 5:e4891827f7b1 | 87 | |
takashikojo | 5:e4891827f7b1 | 88 | // { MIDDLE, FRONT1,BLANK, BLANK } , |
takashikojo | 5:e4891827f7b1 | 89 | // { MIDDLE, FRONT2,FRONT0, BLANK } , |
takashikojo | 5:e4891827f7b1 | 90 | { BLANK, BLANK, BLANK, BLANK } , |
takashikojo | 5:e4891827f7b1 | 91 | { MIDDLE, FRONT1,BLANK, BLANK } , |
takashikojo | 5:e4891827f7b1 | 92 | { TAIL0, FRONT2,FRONT0, BLANK } , |
takashikojo | 5:e4891827f7b1 | 93 | { TAIL1, MIDDLE,FRONT1, BLANK } , |
takashikojo | 5:e4891827f7b1 | 94 | { TAIL2, TAIL0, FRONT2, FRONT0 } , |
takashikojo | 5:e4891827f7b1 | 95 | { BLANK, TAIL1, MIDDLE, FRONT1 } , |
takashikojo | 5:e4891827f7b1 | 96 | { BLANK, TAIL2, TAIL0, FRONT2 } , |
takashikojo | 5:e4891827f7b1 | 97 | { BLANK, BLANK, TAIL1, MIDDLE } , |
takashikojo | 5:e4891827f7b1 | 98 | { BLANK, BLANK, TAIL2, TAIL0 } , |
takashikojo | 5:e4891827f7b1 | 99 | { BLANK, BLANK, BLANK, TAIL1 } , |
takashikojo | 5:e4891827f7b1 | 100 | { BLANK, BLANK, BLANK, TAIL2 } , |
takashikojo | 5:e4891827f7b1 | 101 | { BLANK, BLANK, BLANK, BLANK } , |
takashikojo | 5:e4891827f7b1 | 102 | { BLANK, BLANK, BLANK, BLANK } , |
takashikojo | 5:e4891827f7b1 | 103 | { BLANK, BLANK, BLANK, BLANK } |
takashikojo | 5:e4891827f7b1 | 104 | } ; |
takashikojo | 5:e4891827f7b1 | 105 | |
takashikojo | 5:e4891827f7b1 | 106 | static void setLED_Tdelay(bool delay) |
takashikojo | 5:e4891827f7b1 | 107 | { |
takashikojo | 5:e4891827f7b1 | 108 | /* Delay/No Delay */ |
takashikojo | 5:e4891827f7b1 | 109 | // const unsigned int d[4] = { 0x6e, 0x77, 0x38, 0x5e} ; |
takashikojo | 5:e4891827f7b1 | 110 | // const unsigned int n[4] = { 0x5c, 0x37, 0x38, 0x5e,} ; |
takashikojo | 5:e4891827f7b1 | 111 | /*const unsigned int n[4] = { 0x09, 0x09, 0x29, 0x58} ; |
takashikojo | 5:e4891827f7b1 | 112 | const unsigned int d[4] = { 0x09, 0x29, 0x58, 0x14} ; |
takashikojo | 5:e4891827f7b1 | 113 | int index ; |
takashikojo | 5:e4891827f7b1 | 114 | |
takashikojo | 5:e4891827f7b1 | 115 | if(delay){ |
takashikojo | 5:e4891827f7b1 | 116 | DBG("Delay\n") ; |
takashikojo | 5:e4891827f7b1 | 117 | for(index=8*3; index<8*4; index++) |
takashikojo | 5:e4891827f7b1 | 118 | alarmclock.setOptVal(index, d, 8) ; |
takashikojo | 5:e4891827f7b1 | 119 | } else { |
takashikojo | 5:e4891827f7b1 | 120 | DBG("No Delay\n") ; |
takashikojo | 5:e4891827f7b1 | 121 | for(index=8*3; index<8*4; index++) |
takashikojo | 5:e4891827f7b1 | 122 | alarmclock.setOptVal(index, n, 8) ; |
takashikojo | 5:e4891827f7b1 | 123 | } |
takashikojo | 5:e4891827f7b1 | 124 | */ |
takashikojo | 5:e4891827f7b1 | 125 | #define TRAIN_INDEX (8*4) |
takashikojo | 5:e4891827f7b1 | 126 | for(int i=0; i<14; i++) |
takashikojo | 5:e4891827f7b1 | 127 | alarmclock.setOptVal(i+TRAIN_INDEX, delay ? delayPtn[i] : noDelayPtn[i], 1) ; |
takashikojo | 5:e4891827f7b1 | 128 | } |
takashikojo | 5:e4891827f7b1 | 129 | |
takashikojo | 5:e4891827f7b1 | 130 | #define DUSH 0x40 |
takashikojo | 5:e4891827f7b1 | 131 | static void char2LED(const char *str, unsigned int *ptn) { |
takashikojo | 5:e4891827f7b1 | 132 | int i ; |
takashikojo | 5:e4891827f7b1 | 133 | |
takashikojo | 5:e4891827f7b1 | 134 | if(isdigit(str[0]) && isdigit(str[1])){ |
takashikojo | 5:e4891827f7b1 | 135 | i = atoi(str) ; |
takashikojo | 5:e4891827f7b1 | 136 | ptn[0] = alarmclock.getPtn(i%10) ; |
takashikojo | 5:e4891827f7b1 | 137 | ptn[1] = alarmclock.getPtn(i/10) ; |
takashikojo | 5:e4891827f7b1 | 138 | } else { |
takashikojo | 5:e4891827f7b1 | 139 | ptn[0] = DUSH ; |
takashikojo | 5:e4891827f7b1 | 140 | ptn[1] = DUSH ; |
takashikojo | 5:e4891827f7b1 | 141 | } |
takashikojo | 5:e4891827f7b1 | 142 | } |
takashikojo | 5:e4891827f7b1 | 143 | |
takashikojo | 5:e4891827f7b1 | 144 | static unsigned int precPtn[8][2] = { |
takashikojo | 5:e4891827f7b1 | 145 | { 0x20, 0x00 } , { 0x30, 0x20 } , { 0x12, 0x30 } , { 0x06, 0x12 } , |
takashikojo | 5:e4891827f7b1 | 146 | { 0x24, 0x06 } , { 0x30, 0x24 } , { 0x10, 0x30 } , { 0x00, 0x10 } |
takashikojo | 5:e4891827f7b1 | 147 | |
takashikojo | 5:e4891827f7b1 | 148 | } ; |
takashikojo | 5:e4891827f7b1 | 149 | |
takashikojo | 5:e4891827f7b1 | 150 | #define PREC(j, led0, led1) { led0 = precPtn[j][0]; led1 = precPtn[j][1]; } |
takashikojo | 5:e4891827f7b1 | 151 | |
takashikojo | 5:e4891827f7b1 | 152 | static void setLED_WInfo(const char *hi, const char *lo, const char *prec) |
takashikojo | 5:e4891827f7b1 | 153 | { |
takashikojo | 5:e4891827f7b1 | 154 | unsigned int hi_ptn[4] ; |
takashikojo | 5:e4891827f7b1 | 155 | unsigned int lo_ptn[4] ; |
takashikojo | 5:e4891827f7b1 | 156 | unsigned int prec_ptn[4] ; |
takashikojo | 5:e4891827f7b1 | 157 | int index ; |
takashikojo | 5:e4891827f7b1 | 158 | |
takashikojo | 5:e4891827f7b1 | 159 | DBG("hi=%s, lo=%s, prec=%s\n", hi, lo, prec) ; |
takashikojo | 5:e4891827f7b1 | 160 | |
takashikojo | 5:e4891827f7b1 | 161 | char2LED(hi, hi_ptn) ; |
takashikojo | 5:e4891827f7b1 | 162 | hi_ptn[2] = 0x10 ; |
takashikojo | 5:e4891827f7b1 | 163 | hi_ptn[3] = 0x76 ; |
takashikojo | 5:e4891827f7b1 | 164 | for(index=0; index<8; index++) |
takashikojo | 5:e4891827f7b1 | 165 | alarmclock.setOptVal(index, hi_ptn, 8) ; |
takashikojo | 5:e4891827f7b1 | 166 | |
takashikojo | 5:e4891827f7b1 | 167 | char2LED(lo, lo_ptn) ; |
takashikojo | 5:e4891827f7b1 | 168 | lo_ptn[2] = 0x5c ; |
takashikojo | 5:e4891827f7b1 | 169 | lo_ptn[3] = 0x38 ; |
takashikojo | 5:e4891827f7b1 | 170 | for( ; index<16; index++) |
takashikojo | 5:e4891827f7b1 | 171 | alarmclock.setOptVal(index, lo_ptn, 8) ; |
takashikojo | 5:e4891827f7b1 | 172 | |
takashikojo | 5:e4891827f7b1 | 173 | #define PREC_INDEX (8*2) |
takashikojo | 5:e4891827f7b1 | 174 | for(int i=0; i<16; i++) { |
takashikojo | 5:e4891827f7b1 | 175 | char2LED(prec, prec_ptn) ; |
takashikojo | 5:e4891827f7b1 | 176 | PREC(i%8, prec_ptn[3], prec_ptn[2]) ; |
takashikojo | 5:e4891827f7b1 | 177 | alarmclock.setOptVal(i+PREC_INDEX, prec_ptn, 1) ; |
takashikojo | 5:e4891827f7b1 | 178 | } |
takashikojo | 5:e4891827f7b1 | 179 | } |
takashikojo | 5:e4891827f7b1 | 180 | |
takashikojo | 5:e4891827f7b1 | 181 | #define BUFF_SIZE 1024*64 |
takashikojo | 5:e4891827f7b1 | 182 | static char recvBuff[BUFF_SIZE] ; |
takashikojo | 5:e4891827f7b1 | 183 | void net_main(void const *av) |
takashikojo | 5:e4891827f7b1 | 184 | { |
takashikojo | 5:e4891827f7b1 | 185 | int count = 0 ; |
takashikojo | 5:e4891827f7b1 | 186 | time_t t ; |
takashikojo | 5:e4891827f7b1 | 187 | bool sw = true ; |
takashikojo | 5:e4891827f7b1 | 188 | #define TEMP_SIZE 5 |
takashikojo | 5:e4891827f7b1 | 189 | char hiTemp[TEMP_SIZE], loTemp[TEMP_SIZE], prec[TEMP_SIZE] ; |
takashikojo | 5:e4891827f7b1 | 190 | char *p ; |
takashikojo | 5:e4891827f7b1 | 191 | |
takashikojo | 5:e4891827f7b1 | 192 | watchList.getList("/sd/watchingLines.txt") ; |
takashikojo | 5:e4891827f7b1 | 193 | trainstat.setBuff(recvBuff, BUFF_SIZE) ; |
takashikojo | 5:e4891827f7b1 | 194 | weatherinfo.setBuff(recvBuff, BUFF_SIZE) ; |
takashikojo | 5:e4891827f7b1 | 195 | |
takashikojo | 5:e4891827f7b1 | 196 | while(1) { |
takashikojo | 5:e4891827f7b1 | 197 | sw = !sw ; |
takashikojo | 5:e4891827f7b1 | 198 | trainstat.getStat() ; |
takashikojo | 5:e4891827f7b1 | 199 | setLED_Tdelay(sw) ; |
takashikojo | 5:e4891827f7b1 | 200 | if(count%1 ==0){ |
takashikojo | 5:e4891827f7b1 | 201 | DBG("weatherinfo.getInfo") ; |
takashikojo | 5:e4891827f7b1 | 202 | weatherinfo.getInfo(hiTemp, loTemp, prec) ; |
takashikojo | 5:e4891827f7b1 | 203 | setLED_WInfo(hiTemp, loTemp, prec) ; |
takashikojo | 5:e4891827f7b1 | 204 | } |
takashikojo | 5:e4891827f7b1 | 205 | p = (char *)malloc(10000) ; |
takashikojo | 5:e4891827f7b1 | 206 | printf("Heap=%x\n", (unsigned int)p) ; |
takashikojo | 5:e4891827f7b1 | 207 | free(p) ; |
takashikojo | 5:e4891827f7b1 | 208 | t = time(NULL); |
takashikojo | 5:e4891827f7b1 | 209 | wait(60.0) ; |
takashikojo | 5:e4891827f7b1 | 210 | printf("wait=%d\n", time(NULL) - t ) ; |
takashikojo | 5:e4891827f7b1 | 211 | count++ ; |
takashikojo | 5:e4891827f7b1 | 212 | } |
takashikojo | 5:e4891827f7b1 | 213 | } |
takashikojo | 5:e4891827f7b1 | 214 | |
takashikojo | 5:e4891827f7b1 | 215 | int main() { |
takashikojo | 5:e4891827f7b1 | 216 | EthernetInterface eth; |
takashikojo | 5:e4891827f7b1 | 217 | int ret ; |
takashikojo | 5:e4891827f7b1 | 218 | |
takashikojo | 5:e4891827f7b1 | 219 | alarmclock.setLED(11, 11) ; |
takashikojo | 5:e4891827f7b1 | 220 | ret = eth.init(); |
takashikojo | 5:e4891827f7b1 | 221 | alarmclock.setLED(22, 22) ; |
takashikojo | 5:e4891827f7b1 | 222 | while(1) { |
takashikojo | 5:e4891827f7b1 | 223 | ret = eth.connect(); |
takashikojo | 5:e4891827f7b1 | 224 | if(ret == 0)break ; |
takashikojo | 5:e4891827f7b1 | 225 | Thread::wait(10); |
takashikojo | 5:e4891827f7b1 | 226 | } |
takashikojo | 5:e4891827f7b1 | 227 | ntp("ntp.jst.mfeed.ad.jp") ; |
takashikojo | 5:e4891827f7b1 | 228 | |
takashikojo | 5:e4891827f7b1 | 229 | #define NET_STACK 24000 |
takashikojo | 5:e4891827f7b1 | 230 | Thread t_clock(clock_main, NULL, osPriorityNormal); |
takashikojo | 5:e4891827f7b1 | 231 | Thread t_net (net_main, NULL, osPriorityNormal, NET_STACK ); |
takashikojo | 5:e4891827f7b1 | 232 | while(1)Thread::wait(1000); |
takashikojo | 5:e4891827f7b1 | 233 | } |