A libery to connect to telegesis zigbee module. Bassed on implemtation of XBEE

Fork of xbee_lib by Tristan Hughes

telegesis.cpp

Committer:
gert_lauritsen
Date:
2013-10-15
Revision:
11:18ff088287ea
Parent:
9:c8e4339ccc29
Child:
12:debf76f0c0bf

File content as of revision 11:18ff088287ea:

#include "telegesis.h"


zigbee::zigbee(PinName tx, PinName rx): _zbee(tx, rx) {
    _tx = tx;
    _rx = rx;
     
      _zbee.baud(19200);
}

zigbee::~zigbee()
{
}

int zigbee::wait4OK() {
    readPacket();
    if (strstr(_responseFrameString,"OK"))  return 1; else return 0;
}

int zigbee::GetSerial()
{ 
    /** comes with something like this
  Telegesis ETRX357-LRS
  R305C
  000D6F0000D5F06A
  OK
*/   
    _zbee.printf("ATI\r");
      readPacket(); readPacket(); //commando
      readPacket();
    sscanf(_responseFrameString,"Telegesis %s",HWType);
      readPacket(); readPacket();
    sscanf (_responseFrameString,"%s",LocalID);
    return 1;
}

int zigbee::SetKey(char* key)
{
    return 1;
}



void zigbee::RecieveData(char *data_buf, int numchar)
{
    int count=0;
    if(numchar == 0) {
        numchar = sizeof(data_buf);
    }
    
    while(numchar!=count) {
        if(_zbee.readable()) {
            *data_buf = _zbee.getc();
            data_buf+=1;
            count++;
        }

    }
}

int zigbee::ATI()
{
    _zbee.printf("ATI\r");
    _zbee.scanf ("%*s");
    return 1;
}


int zigbee::PingOut()
{
    _zbee.printf("AT+ANNCE\r");
    _zbee.scanf ("%*s");
    return 1;
}


int zigbee::PanScan()
{
    
    
    _zbee.printf("AT+PANSCAN\r");
    _zbee.scanf ("%*s");
    return 1;
}


int zigbee::Establish_Network()
{
    _zbee.printf("AT+EN\r");
    _zbee.scanf ("%*s");
    return 1;
}


int zigbee::JoinNetwork()
{
    _zbee.printf("AT+JN\r");
    _zbee.scanf ("%*s");
    return 1;
}

int zigbee::ScanNetwork()
{
    _zbee.printf("AT+SN\r");
    _zbee.scanf ("%*s");
    return 1;
}

int zigbee::NetworkInfo()
{
//Return something like this "+N=COO,12,-11,29F0,55C0E0DCE605C522"
    _zbee.printf("AT+N\r");
    _zbee.scanf ("+N=%s,%d,%d,%4X,%X",Devicetype,&channel,&NodeID,&EPID);
    return 1;
}

int zigbee::UniCast(char *adr,char *payload)  //Ascii mode with null terminated string
{
    _zbee.printf("AT+UCAST:%s=%s\r",adr,payload);
    _zbee.scanf ("UCAST:%X,%X=%s ",&EUI64,&framesize,Zdata);
    return 1;
}

int zigbee::UniCastb(char *adr,char *payload, char payloadSize) //sends data in binary format
{
    _zbee.printf("AT+UCASTB:%X,%s\r",adr,payloadSize);
    _zbee.scanf ("%*s");
    return 1;
}

//-----------------------Håndtere indkommende data------------------------------

unsigned long zigbee::hextolong(const char *hex)
{
    //return 32 bit
    unsigned long result = 0;
    while (*hex) { //så længe det ikke er null
        if (*hex >= '0' && *hex <= '9')
            result += (*hex - '0');
        else if (*hex >= 'A' && *hex <= 'F')
            result += (*hex - 'A' +10);
        else if (*hex >= 'a' && *hex <= 'f')
            result += (*hex - 'a'+ 10);

        if (*++hex) //hvis den næstee ikke er null
            result <<= 4;
    }
    return result;
}


unsigned int zigbee::hextoint(const char *hex)
{
    //return 16 bit
    unsigned int result = 0;
    while (*hex) { //så længe det ikke er null
        if (*hex >= '0' && *hex <= '9')
            result += (*hex - '0');
        else if (*hex >= 'A' && *hex <= 'F')
            result += (*hex - 'A' +10);
        else if (*hex >= 'a' && *hex <= 'f')
            result += (*hex - 'a'+ 10);

        if (*++hex) //hvis den næstee ikke er null
            result <<= 4;
    }
    return result;
}
//---------------------------------------------------------------
void zigbee::readPacket() {
    //read and waits for the packet
    while (SeePacket()!='\n') {
    }
}   


uint8_t zigbee::SeePacket() {
 char *p;   
      _pos=0; b=0;
    if (_zbee.readable()) {
        b = _zbee.getc();
              if ((b!=CR) & (b!=LF)) _responseFrameString[_pos++]=b;
            if (b==CR) {
              _responseFrameString[_pos]=0; //Nul terminate
                 if (strstr(_responseFrameString,"+UCAST:")) { //returns on that we have sendt something
          //Do something 
         } else
                 if (strstr(_responseFrameString,"UCAST:")) {//checke for incoming UCAST data
           Zdat=1;
           p=strstr(_responseFrameString,"="); p++;
           strcpy(Zdata,p);
         }
               if (strstr(_responseFrameString,"LeftPAN:")) PanOnline=0;  //Local node has left the Pan

                 if (strstr(_responseFrameString,"NEWNODE:")) { //NEWNODE: <NodeID>,<EUI64>,<Parent NodeID>
                     //new node on the pan
                 }

                 if (strstr(_responseFrameString,"OK")) {  
                        //if (ScriptState) ConnectScript();
                        //Ok=1; Cmd=0; LineNo=0; 
                 }
                 
                 if (strstr(_responseFrameString,"ACK")) { //
                    PacketAck=1;
                    p=strstr(_responseFrameString,":"); p++; //P indholder nu SEQ nummer
                    SeqNumber=hextoint(p);
                 }
                 if (strstr(_responseFrameString,"NAK")) {
                    PacketAck=0; 
                    p=strstr(_responseFrameString,":"); p++; //P indholder nu SEQ nummer
                    SeqNumber=hextoint(p);
                 }
                 if (strstr(_responseFrameString,"SEQ")) { //
                    PacketAck=1;
                    p=strstr(_responseFrameString,":"); p++; //P indholder nu SEQ nummer
                    SeqNumber=hextoint(p);
                 }
            }   
    }
    return b;
}