Smart Clock

Dependencies:   AlarmClock DigitalClock EthernetInterface FourDigitLED HTTPClient NTPClient SDFileSystem TrainStat WeatherInfo XML_aide mbed-rtos mbed picojson wolfSSL

Committer:
takashikojo
Date:
Fri Oct 23 05:52:37 2015 +0000
Revision:
5:e4891827f7b1
Initial public version

Who changed what in which revision?

UserRevisionLine numberNew 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 }