a

Dependents:   IOT_Sockets

Fork of xbee_api by Wiktor Grajkowski

Committer:
noname77
Date:
Sat Jan 25 21:20:41 2014 +0000
Revision:
8:3ef2044c1302
Parent:
7:8e5855f18ad3
Child:
9:08ccd085662f
some working code, xbees comunicate. need to mess it up a bit

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 8:3ef2044c1302 89 void xbeeFrame::SetDestination(unsigned char* dest)
noname77 7:8e5855f18ad3 90 {
noname77 7:8e5855f18ad3 91 char i;
noname77 7:8e5855f18ad3 92 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 93 _destAddr[i] = *dest++;
noname77 7:8e5855f18ad3 94 }
noname77 7:8e5855f18ad3 95
noname77 8:3ef2044c1302 96 void xbeeFrame::SetPayload(char* payload)
noname77 8:3ef2044c1302 97 {
noname77 8:3ef2044c1302 98 _payload = payload;
noname77 8:3ef2044c1302 99 }
noname77 8:3ef2044c1302 100
noname77 7:8e5855f18ad3 101 void xbeeFrame::ParseFrame(void)
noname77 7:8e5855f18ad3 102 {
noname77 7:8e5855f18ad3 103 char cnt = 3;
noname77 7:8e5855f18ad3 104 _frameType = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 105 switch(_frameType)
noname77 7:8e5855f18ad3 106 {
noname77 7:8e5855f18ad3 107 case RX_PACKET_64:
noname77 7:8e5855f18ad3 108 {
noname77 7:8e5855f18ad3 109 char i;
noname77 7:8e5855f18ad3 110 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 111 _sourceAddr[i] = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 112 _rssi = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 113 _options = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 114 _payload = &(_apiFrame[cnt]);
noname77 8:3ef2044c1302 115 char* p = _rfData;
noname77 7:8e5855f18ad3 116 for(i=0; i<GetLength()-11; i++)
noname77 8:3ef2044c1302 117 *p++ = _apiFrame[cnt++];
noname77 8:3ef2044c1302 118 *p = '\0';
noname77 7:8e5855f18ad3 119 _checksum = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 120 break;
noname77 7:8e5855f18ad3 121 }
noname77 7:8e5855f18ad3 122 case TX_STATUS:
noname77 7:8e5855f18ad3 123 {
noname77 7:8e5855f18ad3 124 _frameID = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 125 _status = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 126 _checksum = _apiFrame[cnt];
noname77 7:8e5855f18ad3 127 break;
noname77 7:8e5855f18ad3 128 }
noname77 7:8e5855f18ad3 129 }
noname77 7:8e5855f18ad3 130 }
noname77 7:8e5855f18ad3 131
noname77 7:8e5855f18ad3 132 void xbeeFrame::PrintData(void)
noname77 7:8e5855f18ad3 133 {
noname77 8:3ef2044c1302 134 printf("\rFrame received\n\r");
noname77 8:3ef2044c1302 135 printf("Length: %u\n\r", GetLength());
noname77 8:3ef2044c1302 136 printf("Frame Type: %X\n\r", _frameType);
noname77 7:8e5855f18ad3 137 switch(_frameType)
noname77 7:8e5855f18ad3 138 {
noname77 7:8e5855f18ad3 139 case RX_PACKET_64:
noname77 7:8e5855f18ad3 140 {
noname77 7:8e5855f18ad3 141 printf("Source Address: ");
noname77 7:8e5855f18ad3 142 char i;
noname77 7:8e5855f18ad3 143 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 144 printf("%X", _sourceAddr[i]);
noname77 8:3ef2044c1302 145 printf("\n\r");
noname77 8:3ef2044c1302 146 printf("RSSI: %u\n\r", _rssi);
noname77 8:3ef2044c1302 147 printf("Options: %X\n\r", _options);
noname77 8:3ef2044c1302 148 printf("RF Data: %s\n\r", _rfData);
noname77 7:8e5855f18ad3 149 break;
noname77 7:8e5855f18ad3 150 }
noname77 7:8e5855f18ad3 151 case TX_STATUS:
noname77 7:8e5855f18ad3 152 {
noname77 8:3ef2044c1302 153 printf("Frame ID: %X\n\r", _frameID);
noname77 8:3ef2044c1302 154 printf("Status: %X\n\r", _status);
noname77 7:8e5855f18ad3 155 break;
noname77 7:8e5855f18ad3 156 }
noname77 7:8e5855f18ad3 157 default :
noname77 8:3ef2044c1302 158 printf("co jest kurwa?!\n\r");
noname77 7:8e5855f18ad3 159 }
noname77 8:3ef2044c1302 160 printf("Checksum: %X\n\r", _checksum);
noname77 7:8e5855f18ad3 161 }
noname77 7:8e5855f18ad3 162
noname77 7:8e5855f18ad3 163 //todo add timeout
noname77 8:3ef2044c1302 164 void xbeeFrame::ReceiveFrame(char* buf)
noname77 7:8e5855f18ad3 165 {
noname77 8:3ef2044c1302 166 _rfData = buf;
noname77 8:3ef2044c1302 167 int cnt = 0; //byte counter
noname77 7:8e5855f18ad3 168 char c;
noname77 7:8e5855f18ad3 169 unsigned int len = 0; //frame length + Startbyte
noname77 7:8e5855f18ad3 170 char receivingFrame = 0;
noname77 7:8e5855f18ad3 171 frameReceived = 0;
noname77 7:8e5855f18ad3 172 Serial DATA(_tx,_rx);
noname77 7:8e5855f18ad3 173
noname77 7:8e5855f18ad3 174 while(!frameReceived)
noname77 7:8e5855f18ad3 175 {
noname77 7:8e5855f18ad3 176 if(DATA.readable())
noname77 7:8e5855f18ad3 177 {
noname77 7:8e5855f18ad3 178 c = DATA.getc();
noname77 7:8e5855f18ad3 179 if(c == STARTBYTE)
noname77 7:8e5855f18ad3 180 receivingFrame = 1;
noname77 7:8e5855f18ad3 181 if(receivingFrame)
noname77 7:8e5855f18ad3 182 {
noname77 7:8e5855f18ad3 183 _apiFrame[cnt++] = c;
noname77 7:8e5855f18ad3 184 if(cnt == 3)
noname77 7:8e5855f18ad3 185 {
noname77 7:8e5855f18ad3 186 _length[0] = _apiFrame[1];
noname77 7:8e5855f18ad3 187 _length[1] = _apiFrame[2];
noname77 7:8e5855f18ad3 188 len = GetLength();
noname77 7:8e5855f18ad3 189 }
noname77 7:8e5855f18ad3 190 if(cnt>3 && (cnt == len + 4)) //startbyte, 2 len bytes and checksum
noname77 7:8e5855f18ad3 191 {
noname77 7:8e5855f18ad3 192 receivingFrame = 0;
noname77 7:8e5855f18ad3 193 frameReceived = 1;
noname77 7:8e5855f18ad3 194 ParseFrame();
noname77 7:8e5855f18ad3 195 }
noname77 7:8e5855f18ad3 196 }
noname77 7:8e5855f18ad3 197 }
noname77 7:8e5855f18ad3 198 }
noname77 8:3ef2044c1302 199 }
noname77 8:3ef2044c1302 200
noname77 8:3ef2044c1302 201 char* xbeeFrame::GetFramePointer()
noname77 8:3ef2044c1302 202 {
noname77 8:3ef2044c1302 203 return &_apiFrame[0];
noname77 8:3ef2044c1302 204 }
noname77 8:3ef2044c1302 205
noname77 8:3ef2044c1302 206 void xbeeFrame::PrintPayload()
noname77 8:3ef2044c1302 207 {
noname77 8:3ef2044c1302 208 char* p = _payload;
noname77 8:3ef2044c1302 209 while(*p != '\0')
noname77 8:3ef2044c1302 210 printf("%c", *p++);
noname77 8:3ef2044c1302 211 }
noname77 8:3ef2044c1302 212
noname77 8:3ef2044c1302 213 void xbeeFrame::SendFrame(void)
noname77 8:3ef2044c1302 214 {
noname77 8:3ef2044c1302 215 Serial DATA(_tx, _rx);
noname77 8:3ef2044c1302 216 int i;
noname77 8:3ef2044c1302 217 for (i=0; i<GetLength()+4; i++)
noname77 8:3ef2044c1302 218 DATA.printf("%c", _apiFrame[i]);
noname77 7:8e5855f18ad3 219 }