Smart Clock

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

main.cpp

Committer:
takashikojo
Date:
2015-10-23
Revision:
5:e4891827f7b1
Parent:
4:8a2d1544d6e0
Child:
7:53dd54df1441

File content as of revision 5:e4891827f7b1:

#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 ,
                                  PTB19,PTC0, D3, D1, D0, PTC1, D4, D2,
    /* Digit 1 - 4        */    //D5, D7, D9, D12,
                                  D5, PTC9, PTC8, PTB18,
    /* Alarm, Hour, Min, Tone */D13, D15, D14, PTC11
)  ;

TrainStat   trainstat(/* YAHOO_TRAIN*/ TOKYO_METRO) ;
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() ;
    }
    printf("clock_main\n") ;
}

#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) ;
    }
}

static     EthernetInterface eth ;
#if 0
static bool restartEth(void)
{
    int ret ;
    printf("==== RESTARTING Ethernet ===\n") ;
    eth->disconnect();
    printf("eth.disconnect\n") ;
    /*free(eth) ;
    printf("free(eth)\n") ;
    eth = new EthernetInterface ;
    if(eth == NULL) {
        ERR("Ethernet can not Restart") ;
        return false ;
    }
    printf("new EthernetInterface|n") ;
    alarmclock.setLED(11, 11) ;
    ret = eth->init();*/
    alarmclock.setLED(22, 22) ;
    while(1) {
        ret = eth->connect();
        if(ret == 0)break ;
        Thread::wait(10);
    }
    return true ;
}
#endif

#define BUFF_SIZE 1024*64
static char recvBuff[BUFF_SIZE] ;
void net_main(void const *av)
{
    int count = 0 ;
    time_t t ; 
    char *p[1000] ; int i ;
#define TEMP_SIZE 5
    char hiTemp[TEMP_SIZE], loTemp[TEMP_SIZE], prec[TEMP_SIZE] ;

    watchList.getList("/sd/watchingLines.txt") ;
    trainstat.setBuff(recvBuff, BUFF_SIZE) ;
    weatherinfo.setBuff(recvBuff, BUFF_SIZE) ;

    while(1) {
        setLED_Tdelay(trainstat.getStat()) ;
        if(count%1 ==0) {
            DBG("weatherinfo.getInfo") ;
            weatherinfo.getInfo(hiTemp, loTemp, prec) ;
            setLED_WInfo(hiTemp, loTemp, prec) ;
        }
        t = time(NULL);
        for( i=0; i<sizeof(p) ; i++) {
            p[i] = (char *)malloc(1000) ;
            if(p[i]==NULL) {
                printf("\nHeap=%d\n", (unsigned int)i) ;
                break ;
            } else printf("+") ;
        }
        for(i=0; p[i] != NULL; i++){ printf("-") ; free(p[i]) ;}
        printf("\n") ;
        Thread::wait(60) ;
        printf("wait=%d\n", time(NULL) - t ) ;
        count++ ;
        /*
        if((count % 1) == 0)
            if(restartEth() == false)break ;
        */
    }
    printf("net_main\n") ;
}
 
int main()
{

    int ret ;

#define RESTART_TIMES 3

    //eth =  new EthernetInterface ;
    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, osPriorityHigh);
    Thread t_net  (net_main,   NULL, osPriorityNormal, NET_STACK  );

    while(1)Thread::wait(1000);
}