a

Dependents:   IOT_Sockets

Fork of xbee_api by Wiktor Grajkowski

Committer:
ammanvedi
Date:
Sat Feb 01 17:29:36 2014 +0000
Revision:
11:c8737cf52430
Parent:
10:61e607fa8621
added ifdef declarations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
noname77 7:8e5855f18ad3 1 /* Copyright (c) 2014 Wiktor Grajkowski, Some Lincense
noname77 7:8e5855f18ad3 2 *
noname77 7:8e5855f18ad3 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
noname77 7:8e5855f18ad3 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
noname77 7:8e5855f18ad3 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
noname77 7:8e5855f18ad3 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
noname77 7:8e5855f18ad3 7 * furnished to do so, subject to the following conditions:
noname77 7:8e5855f18ad3 8 *
noname77 7:8e5855f18ad3 9 * The above copyright notice and this permission notice shall be included in all copies or
noname77 7:8e5855f18ad3 10 * substantial portions of the Software.
noname77 7:8e5855f18ad3 11 *
noname77 7:8e5855f18ad3 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
noname77 7:8e5855f18ad3 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
noname77 7:8e5855f18ad3 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
noname77 7:8e5855f18ad3 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
noname77 7:8e5855f18ad3 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
noname77 7:8e5855f18ad3 17 */
noname77 7:8e5855f18ad3 18
noname77 7:8e5855f18ad3 19 #include "xbee.h"
noname77 7:8e5855f18ad3 20 #include "xbeeFrame.h"
noname77 7:8e5855f18ad3 21
noname77 7:8e5855f18ad3 22
noname77 7:8e5855f18ad3 23 xbeeFrame::xbeeFrame(PinName tx, PinName rx, PinName reset) : xbee(tx, rx, reset)
noname77 7:8e5855f18ad3 24 {
noname77 7:8e5855f18ad3 25 _tx = tx;
noname77 7:8e5855f18ad3 26 _rx = rx;
noname77 7:8e5855f18ad3 27 _reset = reset;
noname77 7:8e5855f18ad3 28 }
noname77 7:8e5855f18ad3 29 xbeeFrame::~xbeeFrame()
noname77 7:8e5855f18ad3 30 {
noname77 7:8e5855f18ad3 31 }
noname77 7:8e5855f18ad3 32
noname77 7:8e5855f18ad3 33 void xbeeFrame::InitFrame(void)
noname77 7:8e5855f18ad3 34 {
noname77 7:8e5855f18ad3 35 _frameType = TX_REQUEST_64;
noname77 7:8e5855f18ad3 36 _frameID = 1;
noname77 7:8e5855f18ad3 37 _options = 0;
noname77 7:8e5855f18ad3 38
noname77 7:8e5855f18ad3 39 }
noname77 7:8e5855f18ad3 40
noname77 7:8e5855f18ad3 41 void xbeeFrame::AssembleFrame(void)
noname77 7:8e5855f18ad3 42 {
noname77 7:8e5855f18ad3 43 int cnt = 0; //byte counter
noname77 7:8e5855f18ad3 44 _apiFrame[cnt++] = STARTBYTE; // starting delimiter
noname77 7:8e5855f18ad3 45 int len = CalculateLength(); // calculate frame length
noname77 7:8e5855f18ad3 46 _apiFrame[cnt++] = (len >> 8) & 0xff; // put length msb
noname77 7:8e5855f18ad3 47 _apiFrame[cnt++] = len & 0xff; // put length lsb
noname77 7:8e5855f18ad3 48 _apiFrame[cnt++] = _frameType; // put frame type
noname77 7:8e5855f18ad3 49 _apiFrame[cnt++] = _frameID; // put frame id
noname77 7:8e5855f18ad3 50 char i;
noname77 7:8e5855f18ad3 51 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 52 _apiFrame[cnt++] = _destAddr[i]; // put destination address
noname77 7:8e5855f18ad3 53 _apiFrame[cnt++] = _options; // put other options
noname77 8:3ef2044c1302 54 char* p = _payload;
noname77 7:8e5855f18ad3 55 while(*p)
noname77 7:8e5855f18ad3 56 _apiFrame[cnt++] = *p++; // put payload
noname77 7:8e5855f18ad3 57 _apiFrame[cnt++] = CalculateChecksum(); //put checksum
noname77 7:8e5855f18ad3 58 }
noname77 7:8e5855f18ad3 59
noname77 7:8e5855f18ad3 60 // calculates the checksum - http://www.digi.com/support/kbase/kbaseresultdetl?id=2206
noname77 7:8e5855f18ad3 61 char xbeeFrame::CalculateChecksum(void)
noname77 7:8e5855f18ad3 62 {
noname77 7:8e5855f18ad3 63 int temp = 0; // will sum up here
noname77 7:8e5855f18ad3 64 int len = CalculateLength();
noname77 7:8e5855f18ad3 65 char i;
noname77 7:8e5855f18ad3 66 for(i=0; i<len; i++)
noname77 7:8e5855f18ad3 67 temp+=_apiFrame[3+i];
noname77 7:8e5855f18ad3 68 return 0xff - (temp & 0xff);
noname77 7:8e5855f18ad3 69 }
noname77 7:8e5855f18ad3 70
noname77 7:8e5855f18ad3 71 int xbeeFrame::CalculateLength(void)
noname77 7:8e5855f18ad3 72 {
noname77 7:8e5855f18ad3 73 int cnt = 0; // holds payload size
noname77 8:3ef2044c1302 74 char* p = _payload;
noname77 8:3ef2044c1302 75 while(*p++)
noname77 7:8e5855f18ad3 76 cnt++;
noname77 7:8e5855f18ad3 77 cnt+=11; // frame type, frame id, 8 destination address bytes and options
noname77 7:8e5855f18ad3 78 _length[0] = (cnt >> 8) & 0xff;
noname77 7:8e5855f18ad3 79 _length[1] = cnt & 0xff;
noname77 7:8e5855f18ad3 80 return cnt;
noname77 7:8e5855f18ad3 81 }
noname77 7:8e5855f18ad3 82
noname77 7:8e5855f18ad3 83 int xbeeFrame::GetLength(void)
noname77 7:8e5855f18ad3 84 {
noname77 7:8e5855f18ad3 85 int len = (_length[0] << 8) + _length[1];
noname77 7:8e5855f18ad3 86 return len;
noname77 7:8e5855f18ad3 87 }
noname77 7:8e5855f18ad3 88
noname77 10:61e607fa8621 89 int xbeeFrame::GetType(void)
noname77 10:61e607fa8621 90 {
noname77 10:61e607fa8621 91 return _frameType;
noname77 10:61e607fa8621 92 }
noname77 10:61e607fa8621 93
noname77 10:61e607fa8621 94 int xbeeFrame::GetStatus(void)
noname77 10:61e607fa8621 95 {
noname77 10:61e607fa8621 96 return _status;
noname77 10:61e607fa8621 97 }
noname77 10:61e607fa8621 98
noname77 8:3ef2044c1302 99 void xbeeFrame::SetDestination(unsigned char* dest)
noname77 7:8e5855f18ad3 100 {
noname77 7:8e5855f18ad3 101 char i;
noname77 7:8e5855f18ad3 102 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 103 _destAddr[i] = *dest++;
noname77 7:8e5855f18ad3 104 }
noname77 7:8e5855f18ad3 105
noname77 8:3ef2044c1302 106 void xbeeFrame::SetPayload(char* payload)
noname77 8:3ef2044c1302 107 {
noname77 8:3ef2044c1302 108 _payload = payload;
noname77 8:3ef2044c1302 109 }
noname77 8:3ef2044c1302 110
noname77 7:8e5855f18ad3 111 void xbeeFrame::ParseFrame(void)
noname77 7:8e5855f18ad3 112 {
noname77 7:8e5855f18ad3 113 char cnt = 3;
noname77 7:8e5855f18ad3 114 _frameType = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 115 switch(_frameType)
noname77 7:8e5855f18ad3 116 {
noname77 7:8e5855f18ad3 117 case RX_PACKET_64:
noname77 7:8e5855f18ad3 118 {
noname77 7:8e5855f18ad3 119 char i;
noname77 7:8e5855f18ad3 120 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 121 _sourceAddr[i] = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 122 _rssi = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 123 _options = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 124 _payload = &(_apiFrame[cnt]);
noname77 8:3ef2044c1302 125 char* p = _rfData;
noname77 7:8e5855f18ad3 126 for(i=0; i<GetLength()-11; i++)
noname77 8:3ef2044c1302 127 *p++ = _apiFrame[cnt++];
noname77 8:3ef2044c1302 128 *p = '\0';
noname77 7:8e5855f18ad3 129 _checksum = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 130 break;
noname77 7:8e5855f18ad3 131 }
noname77 7:8e5855f18ad3 132 case TX_STATUS:
noname77 7:8e5855f18ad3 133 {
noname77 7:8e5855f18ad3 134 _frameID = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 135 _status = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 136 _checksum = _apiFrame[cnt];
noname77 7:8e5855f18ad3 137 break;
noname77 7:8e5855f18ad3 138 }
noname77 7:8e5855f18ad3 139 }
noname77 7:8e5855f18ad3 140 }
noname77 7:8e5855f18ad3 141
noname77 7:8e5855f18ad3 142 void xbeeFrame::PrintData(void)
noname77 7:8e5855f18ad3 143 {
noname77 8:3ef2044c1302 144 printf("\rFrame received\n\r");
noname77 8:3ef2044c1302 145 printf("Length: %u\n\r", GetLength());
noname77 8:3ef2044c1302 146 printf("Frame Type: %X\n\r", _frameType);
noname77 7:8e5855f18ad3 147 switch(_frameType)
noname77 7:8e5855f18ad3 148 {
noname77 7:8e5855f18ad3 149 case RX_PACKET_64:
noname77 7:8e5855f18ad3 150 {
noname77 7:8e5855f18ad3 151 printf("Source Address: ");
noname77 7:8e5855f18ad3 152 char i;
noname77 7:8e5855f18ad3 153 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 154 printf("%X", _sourceAddr[i]);
noname77 8:3ef2044c1302 155 printf("\n\r");
noname77 8:3ef2044c1302 156 printf("RSSI: %u\n\r", _rssi);
noname77 8:3ef2044c1302 157 printf("Options: %X\n\r", _options);
noname77 8:3ef2044c1302 158 printf("RF Data: %s\n\r", _rfData);
noname77 7:8e5855f18ad3 159 break;
noname77 7:8e5855f18ad3 160 }
noname77 7:8e5855f18ad3 161 case TX_STATUS:
noname77 7:8e5855f18ad3 162 {
noname77 8:3ef2044c1302 163 printf("Frame ID: %X\n\r", _frameID);
noname77 8:3ef2044c1302 164 printf("Status: %X\n\r", _status);
noname77 7:8e5855f18ad3 165 break;
noname77 7:8e5855f18ad3 166 }
noname77 7:8e5855f18ad3 167 default :
noname77 8:3ef2044c1302 168 printf("co jest kurwa?!\n\r");
noname77 7:8e5855f18ad3 169 }
noname77 8:3ef2044c1302 170 printf("Checksum: %X\n\r", _checksum);
noname77 7:8e5855f18ad3 171 }
noname77 7:8e5855f18ad3 172
noname77 7:8e5855f18ad3 173 //todo add timeout
noname77 9:08ccd085662f 174 void xbeeFrame::ReceiveFrame(char* buf, int timeout)
noname77 7:8e5855f18ad3 175 {
noname77 9:08ccd085662f 176 Timer t;
noname77 9:08ccd085662f 177 t.start();
noname77 8:3ef2044c1302 178 _rfData = buf;
noname77 8:3ef2044c1302 179 int cnt = 0; //byte counter
noname77 7:8e5855f18ad3 180 char c;
noname77 7:8e5855f18ad3 181 unsigned int len = 0; //frame length + Startbyte
noname77 7:8e5855f18ad3 182 char receivingFrame = 0;
noname77 7:8e5855f18ad3 183 frameReceived = 0;
noname77 7:8e5855f18ad3 184 Serial DATA(_tx,_rx);
noname77 7:8e5855f18ad3 185
noname77 9:08ccd085662f 186 while(!frameReceived && (t.read_ms() < timeout))
noname77 7:8e5855f18ad3 187 {
noname77 7:8e5855f18ad3 188 if(DATA.readable())
noname77 7:8e5855f18ad3 189 {
noname77 7:8e5855f18ad3 190 c = DATA.getc();
noname77 7:8e5855f18ad3 191 if(c == STARTBYTE)
noname77 7:8e5855f18ad3 192 receivingFrame = 1;
noname77 7:8e5855f18ad3 193 if(receivingFrame)
noname77 7:8e5855f18ad3 194 {
noname77 7:8e5855f18ad3 195 _apiFrame[cnt++] = c;
noname77 7:8e5855f18ad3 196 if(cnt == 3)
noname77 7:8e5855f18ad3 197 {
noname77 7:8e5855f18ad3 198 _length[0] = _apiFrame[1];
noname77 7:8e5855f18ad3 199 _length[1] = _apiFrame[2];
noname77 7:8e5855f18ad3 200 len = GetLength();
noname77 7:8e5855f18ad3 201 }
noname77 7:8e5855f18ad3 202 if(cnt>3 && (cnt == len + 4)) //startbyte, 2 len bytes and checksum
noname77 7:8e5855f18ad3 203 {
noname77 7:8e5855f18ad3 204 receivingFrame = 0;
noname77 7:8e5855f18ad3 205 frameReceived = 1;
noname77 7:8e5855f18ad3 206 ParseFrame();
noname77 7:8e5855f18ad3 207 }
noname77 7:8e5855f18ad3 208 }
noname77 7:8e5855f18ad3 209 }
noname77 7:8e5855f18ad3 210 }
noname77 8:3ef2044c1302 211 }
noname77 8:3ef2044c1302 212
noname77 8:3ef2044c1302 213 char* xbeeFrame::GetFramePointer()
noname77 8:3ef2044c1302 214 {
noname77 8:3ef2044c1302 215 return &_apiFrame[0];
noname77 8:3ef2044c1302 216 }
noname77 8:3ef2044c1302 217
noname77 8:3ef2044c1302 218 void xbeeFrame::PrintPayload()
noname77 8:3ef2044c1302 219 {
noname77 8:3ef2044c1302 220 char* p = _payload;
noname77 8:3ef2044c1302 221 while(*p != '\0')
noname77 8:3ef2044c1302 222 printf("%c", *p++);
noname77 8:3ef2044c1302 223 }
noname77 8:3ef2044c1302 224
noname77 8:3ef2044c1302 225 void xbeeFrame::SendFrame(void)
noname77 8:3ef2044c1302 226 {
noname77 8:3ef2044c1302 227 Serial DATA(_tx, _rx);
noname77 8:3ef2044c1302 228 int i;
noname77 8:3ef2044c1302 229 for (i=0; i<GetLength()+4; i++)
noname77 8:3ef2044c1302 230 DATA.printf("%c", _apiFrame[i]);
noname77 7:8e5855f18ad3 231 }