Smart Clock
Dependencies: AlarmClock DigitalClock EthernetInterface FourDigitLED HTTPClient NTPClient SDFileSystem TrainStat WeatherInfo XML_aide mbed-rtos mbed picojson wolfSSL
Diff: main.txt
- Revision:
- 5:e4891827f7b1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.txt Fri Oct 23 05:52:37 2015 +0000 @@ -0,0 +1,233 @@ +#include "mbed.h" +#include <ctype.h> + +#include "EthernetInterface.h" +#include "HTTPClient.h" +#include "NTPClient.h" +#include "AlarmClock.h" +#include "TrainStat.h" +#include "WeatherInfo.h" +#include "matchLine.h" + +#if 0 +//Enable debug +#define DBG(x, ...) std::printf("[Main : DBG]"x"\r\n", ##__VA_ARGS__); +#define WARN(x, ...) std::printf("[Main : WARN]"x"\r\n", ##__VA_ARGS__); +#else +//Disable debug +#define DBG(x, ...) +#define WARN(x, ...) +#endif + +#define ERR(x, ...) std::printf("[Main : ERR]"x"\r\n", ##__VA_ARGS__); + +AlarmClock alarmclock ( + /* Segment 0 - 6, Dot */ D11,D6, D3, D1, D0, D10,D4, D2 , + /* Digit 1 - 4 */ D5, D7, D9, D12, + /* Alarm, Hour, Min, Tone */D13, D14, D15, PTC11 +) ; + +TrainStat trainstat(TOKYO_METRO /*YAHOO_TRAIN*/) ; +WeatherInfo weatherinfo(WEATHER_HACKS) ; +HTTPClient httpClient; +matchLine watchList ; + +static void ntp(char *site) +{ + NTPClient ntp; + + alarmclock.setLED(33, 33) ; + if (ntp.setTime(site) == 0) { + alarmclock.flashLED() ; + } else { + alarmclock.setLED(0, 0) ; + wait(30.0) ; + return ; + } +} + +void clock_main(void const *av) +{ + + alarmclock.start() ; + while(1){ + alarmclock.poll() ; + Thread::wait(100); + } +} + +#define FRONT0 0x06 +#define FRONT1 0x79 +#define FRONT2 0x49 +#define MIDDLE 0x49 +#define TAIL0 0x49 +#define TAIL1 0x4f +#define TAIL2 0x30 +#define ROCK 0x5c +#define BLANK 0x00 + +static unsigned int delayPtn[14][4] = { + { BLANK, BLANK, BLANK, BLANK } , + { FRONT1, BLANK, BLANK, ROCK } , + { FRONT2, FRONT0,BLANK, ROCK } , + { TAIL0, FRONT1,BLANK, ROCK } , + { TAIL1, FRONT2, FRONT0,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { TAIL2, MIDDLE, FRONT1,ROCK } , + { BLANK, BLANK, BLANK, BLANK } +} ; + +static unsigned int noDelayPtn[14][4] = { + +// { MIDDLE, FRONT1,BLANK, BLANK } , +// { MIDDLE, FRONT2,FRONT0, BLANK } , + { BLANK, BLANK, BLANK, BLANK } , + { MIDDLE, FRONT1,BLANK, BLANK } , + { TAIL0, FRONT2,FRONT0, BLANK } , + { TAIL1, MIDDLE,FRONT1, BLANK } , + { TAIL2, TAIL0, FRONT2, FRONT0 } , + { BLANK, TAIL1, MIDDLE, FRONT1 } , + { BLANK, TAIL2, TAIL0, FRONT2 } , + { BLANK, BLANK, TAIL1, MIDDLE } , + { BLANK, BLANK, TAIL2, TAIL0 } , + { BLANK, BLANK, BLANK, TAIL1 } , + { BLANK, BLANK, BLANK, TAIL2 } , + { BLANK, BLANK, BLANK, BLANK } , + { BLANK, BLANK, BLANK, BLANK } , + { BLANK, BLANK, BLANK, BLANK } +} ; + +static void setLED_Tdelay(bool delay) +{ +/* Delay/No Delay */ +// const unsigned int d[4] = { 0x6e, 0x77, 0x38, 0x5e} ; +// const unsigned int n[4] = { 0x5c, 0x37, 0x38, 0x5e,} ; +/*const unsigned int n[4] = { 0x09, 0x09, 0x29, 0x58} ; +const unsigned int d[4] = { 0x09, 0x29, 0x58, 0x14} ; + int index ; + + if(delay){ + DBG("Delay\n") ; + for(index=8*3; index<8*4; index++) + alarmclock.setOptVal(index, d, 8) ; + } else { + DBG("No Delay\n") ; + for(index=8*3; index<8*4; index++) + alarmclock.setOptVal(index, n, 8) ; + } +*/ + #define TRAIN_INDEX (8*4) + for(int i=0; i<14; i++) + alarmclock.setOptVal(i+TRAIN_INDEX, delay ? delayPtn[i] : noDelayPtn[i], 1) ; +} + +#define DUSH 0x40 +static void char2LED(const char *str, unsigned int *ptn) { + int i ; + + if(isdigit(str[0]) && isdigit(str[1])){ + i = atoi(str) ; + ptn[0] = alarmclock.getPtn(i%10) ; + ptn[1] = alarmclock.getPtn(i/10) ; + } else { + ptn[0] = DUSH ; + ptn[1] = DUSH ; + } +} + +static unsigned int precPtn[8][2] = { + { 0x20, 0x00 } , { 0x30, 0x20 } , { 0x12, 0x30 } , { 0x06, 0x12 } , + { 0x24, 0x06 } , { 0x30, 0x24 } , { 0x10, 0x30 } , { 0x00, 0x10 } + +} ; + +#define PREC(j, led0, led1) { led0 = precPtn[j][0]; led1 = precPtn[j][1]; } + +static void setLED_WInfo(const char *hi, const char *lo, const char *prec) +{ + unsigned int hi_ptn[4] ; + unsigned int lo_ptn[4] ; + unsigned int prec_ptn[4] ; + int index ; + + DBG("hi=%s, lo=%s, prec=%s\n", hi, lo, prec) ; + + char2LED(hi, hi_ptn) ; + hi_ptn[2] = 0x10 ; + hi_ptn[3] = 0x76 ; + for(index=0; index<8; index++) + alarmclock.setOptVal(index, hi_ptn, 8) ; + + char2LED(lo, lo_ptn) ; + lo_ptn[2] = 0x5c ; + lo_ptn[3] = 0x38 ; + for( ; index<16; index++) + alarmclock.setOptVal(index, lo_ptn, 8) ; + + #define PREC_INDEX (8*2) + for(int i=0; i<16; i++) { + char2LED(prec, prec_ptn) ; + PREC(i%8, prec_ptn[3], prec_ptn[2]) ; + alarmclock.setOptVal(i+PREC_INDEX, prec_ptn, 1) ; + } +} + +#define BUFF_SIZE 1024*64 +static char recvBuff[BUFF_SIZE] ; +void net_main(void const *av) +{ + int count = 0 ; + time_t t ; + bool sw = true ; + #define TEMP_SIZE 5 + char hiTemp[TEMP_SIZE], loTemp[TEMP_SIZE], prec[TEMP_SIZE] ; + char *p ; + + watchList.getList("/sd/watchingLines.txt") ; + trainstat.setBuff(recvBuff, BUFF_SIZE) ; + weatherinfo.setBuff(recvBuff, BUFF_SIZE) ; + + while(1) { + sw = !sw ; + trainstat.getStat() ; + setLED_Tdelay(sw) ; + if(count%1 ==0){ + DBG("weatherinfo.getInfo") ; + weatherinfo.getInfo(hiTemp, loTemp, prec) ; + setLED_WInfo(hiTemp, loTemp, prec) ; + } + p = (char *)malloc(10000) ; + printf("Heap=%x\n", (unsigned int)p) ; + free(p) ; + t = time(NULL); + wait(60.0) ; + printf("wait=%d\n", time(NULL) - t ) ; + count++ ; + } +} + +int main() { + EthernetInterface eth; + int ret ; + + alarmclock.setLED(11, 11) ; + ret = eth.init(); + alarmclock.setLED(22, 22) ; + while(1) { + ret = eth.connect(); + if(ret == 0)break ; + Thread::wait(10); + } + ntp("ntp.jst.mfeed.ad.jp") ; + + #define NET_STACK 24000 + Thread t_clock(clock_main, NULL, osPriorityNormal); + Thread t_net (net_main, NULL, osPriorityNormal, NET_STACK ); + while(1)Thread::wait(1000); +}