xbee gateway

Dependencies:   NTPClient SDFileSystem WIZnetInterface XBeeLib mbed

main.cpp

Committer:
jehoon
Date:
2015-09-23
Revision:
0:4e6019c8c85f

File content as of revision 0:4e6019c8c85f:

#include "mbed.h"
#include "XBeeLib.h"
#include "NTPClient.h"
#include "EthernetInterface.h"
#include "SDFileSystem.h"

#define _SDENABLE 
#define _DBG


#define REMOTE_NODE_ADDR64_MSB  ((uint32_t)0x0013A200)
#define REMOTE_NODE_ADDR64_LSB  ((uint32_t)0x40e82830)
//#define REMOTE_NODE_ADDR64_LSB  ((uint32_t)0x40B8EBCE)

#define REMOTE_NODE_ADDR16      ((uint16_t)0xFFFF)
#define REMOTE_NODE_ADDR64      UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB)


using namespace XBeeLib;

Serial pc(DEBUG_TX, DEBUG_RX);

DigitalOut LED(D6);
time_t cTime;
Ticker now;
time_t rtime;
unsigned long waterlog = 0;

enum dataType {
    REQTOTAL = 0,    
    SENDDATA
};


void ethInit();
int storeSDCard(uint8_t *data, uint16_t len);
static void receiveXbee(const RemoteXBee802& remote, bool broadcast, const uint8_t *const data, uint16_t len);
static void sendRemoteXbee(XBee802& xbee, const RemoteXBee802& RemoteDevice);
time_t getCurTime();







void ledBlink(int cnt, int delay_ms = 50){
    
    LED = 0;
    
    for(int i = 0; i < cnt; i++){
        LED = 1;
        wait_ms(delay_ms);
        LED = 0;
        wait_ms(delay_ms);
    }
}

static void sendRemoteXbee(XBee802& xbee, const RemoteXBee802& RemoteDevice)
{   
    char data[20] = {'\0'};
    sprintf(data, "init");
    
    const uint16_t data_len = strlen(data);
    printf("%s\n",data);
    const TxStatus txStatus = xbee.send_data(RemoteDevice, (const uint8_t *)data, data_len);

    if (txStatus == TxStatusSuccess)
        printf(">> Send_data_to_remote_node OK...  %s\r\n",data);
    else
        printf(">> send_data_to_remote_node failed with %d\r\n", (int)txStatus);
}


static void receiveXbee(const RemoteXBee802& remote, bool broadcast, const uint8_t *const data, uint16_t len)
{
    char tmp[50] = {'\0'};
        
#ifdef _DBG

    if (remote.is_valid_addr16b()) {
        printf("\r\n>> Got a %s 16-bit RX packet [%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", remote.get_addr16(), len);
    } else {
        printf("\r\n>> Got a %s 64-bit RX packet [%08x:%08x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", remote.get_addr64(), len);
    }
#endif
    
    for (int i = 1; i < len; i++){
        printf("%c", data[i]);
        tmp[i - 1] = data[i];
    }
    printf("\r\n");
    
   // int val = atoi(tmp);
    //printf("%d",val);
    if(data[0] == SENDDATA + 48){
         storeSDCard((uint8_t*)(data + 1), len - 1); 
     }
    else if(data[0] == REQTOTAL + 48){  //plust ascii
   //     readSDCard();  
    //    sendRemoteXbee(xbee, remoteDevice64b, val);  
    }
    
}

void ethInit(){
    
    int phy_link;
    printf("Wait a second...\r\n");

    uint8_t mac_addr[6] = {0x00,0x08,0xDC,0x1C,0xA8,0x95}; 
    
    EthernetInterface eth;
//    eth.init(mac_addr,"222.98.173.194","255.255.255.0","222.98.173.254"); //Use DHCP
    eth.init(mac_addr);
    eth.connect();
    
     do{
        phy_link = eth.ethernet_link();
        printf("...");
        ledBlink(1);
        wait(2);
     }while(!phy_link);
     printf("\r\n");
  
    printf("IP Address is %s\r\n", eth.getIPAddress());

}
// copied from Real time bus arrival alarm by eric
time_t getCurTime(){

    // NTP initialize
    NTPClient ntp;

    printf("\r\nTrying to update time...\r\n");    


    if (ntp.setTime("211.233.40.78") == 0) 
    {
        printf("Set time successfully\r\n");
        time_t ctTime;
        ctTime = time(NULL);
        ctTime += 32400; // GMT+9/Seoul
        printf("Time is set to (GMT+9): %s\r\n", ctime(&ctTime));
        return ctTime;
    }
    else
    {
        printf("Error\r\n");
        return 0;
    }
    
    
}
int readSDCard(){
    

}

int storeSDCard(uint8_t *data, uint16_t len){
    char buffer[35];
    char storeString[50] = {'\0'};
    time_t ctTime = getCurTime();
    data[len] = '\0';
    strftime(buffer, 35, "%Y/%m/%d %I:%M %p", localtime(&ctTime));

    //printf("%s\n%s\n", buffer ,data);
    
    mkdir("/sd/WaterLogger", 0777);
    
    FILE *fp = fopen("/sd/WaterLogger/WarerLevel.txt", "a");
    if(fp == NULL) {
        error("Could not open file for write\n");
        return 0;
    }
    ledBlink(5);
    sprintf(storeString,"%s %sml\r\n", buffer, data);
    fprintf(fp, storeString);
    fclose(fp); 
    waterlog += atoi((char*)data);
    
#ifdef _DBG
    printf("%s",storeString);    
    printf("Stored Water Level\n");
#endif

    return 1;
}


//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////
void addTime(){
    
    rtime++;
}


int main()
{
    
   // printf("%d",val);
    ethInit(); // ethernet initialiaze

    pc.baud(9600);
    
    XBee802 xbee = XBee802(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
    SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // the pinout on the mbed Cool Components workshop board
    
    /* Register callback */
    xbee.register_receive_cb(&receiveXbee);
    RadioStatus const radioStatus = xbee.init();
    MBED_ASSERT(radioStatus == Success);
    const RemoteXBee802 remoteDevice64b = RemoteXBee802(REMOTE_NODE_ADDR64);  
    
    rtime = getCurTime();
    struct tm *realtime;
    realtime = localtime(&rtime);
    set_time(rtime);
    now.attach(&addTime, 1); //tick for realtime
    
    //strftime(buffer, 35, "%Y/%m/%d %I:%M %p", localtime(&rtime));    
    while (true) {
       // strftime(buffer, 35, "%Y/%m/%d %I:%M %p", localtime(&rtime));    
     //  strftime(buffer, 35, "%I:%M %p %S\n",localtime(&rtime));
       // printf("%s",buffer);
        
        //if( realtime->tm_hour == 0 && realtime->tm_min == 0 && realtime->tm_sec == 0)
           // sendRemoteXbee(xbee, remoteDevice64b);  
        
        xbee.process_rx_frames();
        wait_ms(100);
    }
    

}