A libery to connect to telegesis zigbee module. Bassed on implemtation of XBEE
Fork of xbee_lib by
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; }