a

Dependents:   IOT_Sockets

Fork of xbee_api by Wiktor Grajkowski

Committer:
noname77
Date:
Sat Jan 25 16:29:44 2014 +0000
Revision:
7:8e5855f18ad3
Child:
8:3ef2044c1302
first succes build, checking for errors

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 7:8e5855f18ad3 54 unsigned 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 7:8e5855f18ad3 74 while(*_payload++)
noname77 7:8e5855f18ad3 75 cnt++;
noname77 7:8e5855f18ad3 76 cnt+=11; // frame type, frame id, 8 destination address bytes and options
noname77 7:8e5855f18ad3 77 _length[0] = (cnt >> 8) & 0xff;
noname77 7:8e5855f18ad3 78 _length[1] = cnt & 0xff;
noname77 7:8e5855f18ad3 79 return cnt;
noname77 7:8e5855f18ad3 80 }
noname77 7:8e5855f18ad3 81
noname77 7:8e5855f18ad3 82 int xbeeFrame::GetLength(void)
noname77 7:8e5855f18ad3 83 {
noname77 7:8e5855f18ad3 84 int len = (_length[0] << 8) + _length[1];
noname77 7:8e5855f18ad3 85 return len;
noname77 7:8e5855f18ad3 86 }
noname77 7:8e5855f18ad3 87
noname77 7:8e5855f18ad3 88 void xbeeFrame::SetDestination(char* dest)
noname77 7:8e5855f18ad3 89 {
noname77 7:8e5855f18ad3 90 char i;
noname77 7:8e5855f18ad3 91 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 92 _destAddr[i] = *dest++;
noname77 7:8e5855f18ad3 93 }
noname77 7:8e5855f18ad3 94
noname77 7:8e5855f18ad3 95 void xbeeFrame::ParseFrame(void)
noname77 7:8e5855f18ad3 96 {
noname77 7:8e5855f18ad3 97 char cnt = 3;
noname77 7:8e5855f18ad3 98 _frameType = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 99 switch(_frameType)
noname77 7:8e5855f18ad3 100 {
noname77 7:8e5855f18ad3 101 case RX_PACKET_64:
noname77 7:8e5855f18ad3 102 {
noname77 7:8e5855f18ad3 103 char i;
noname77 7:8e5855f18ad3 104 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 105 _sourceAddr[i] = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 106 _rssi = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 107 _options = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 108 _payload = &(_apiFrame[cnt]);
noname77 7:8e5855f18ad3 109 for(i=0; i<GetLength()-11; i++)
noname77 7:8e5855f18ad3 110 _rfData[i] = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 111 _rfData[i] = '\0';
noname77 7:8e5855f18ad3 112 _checksum = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 113 break;
noname77 7:8e5855f18ad3 114 }
noname77 7:8e5855f18ad3 115 case TX_STATUS:
noname77 7:8e5855f18ad3 116 {
noname77 7:8e5855f18ad3 117 _frameID = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 118 _status = _apiFrame[cnt++];
noname77 7:8e5855f18ad3 119 _checksum = _apiFrame[cnt];
noname77 7:8e5855f18ad3 120 break;
noname77 7:8e5855f18ad3 121 }
noname77 7:8e5855f18ad3 122 }
noname77 7:8e5855f18ad3 123 }
noname77 7:8e5855f18ad3 124
noname77 7:8e5855f18ad3 125 void xbeeFrame::PrintData(void)
noname77 7:8e5855f18ad3 126 {
noname77 7:8e5855f18ad3 127 printf("Frame received");
noname77 7:8e5855f18ad3 128 printf("Length: %u\n", GetLength());
noname77 7:8e5855f18ad3 129 printf("Frame Type: %X\n", _frameType);
noname77 7:8e5855f18ad3 130 switch(_frameType)
noname77 7:8e5855f18ad3 131 {
noname77 7:8e5855f18ad3 132 case RX_PACKET_64:
noname77 7:8e5855f18ad3 133 {
noname77 7:8e5855f18ad3 134 printf("Source Address: ");
noname77 7:8e5855f18ad3 135 char i;
noname77 7:8e5855f18ad3 136 for(i=0; i<8; i++)
noname77 7:8e5855f18ad3 137 printf("%X", _sourceAddr[i]);
noname77 7:8e5855f18ad3 138 printf("\n");
noname77 7:8e5855f18ad3 139 printf("RSSI: %u\n", _rssi);
noname77 7:8e5855f18ad3 140 printf("Options: %X\n", _options);
noname77 7:8e5855f18ad3 141 printf("RF Data: %s\n", _rfData);
noname77 7:8e5855f18ad3 142 break;
noname77 7:8e5855f18ad3 143 }
noname77 7:8e5855f18ad3 144 case TX_STATUS:
noname77 7:8e5855f18ad3 145 {
noname77 7:8e5855f18ad3 146 printf("Frame ID: %X\n", _frameID);
noname77 7:8e5855f18ad3 147 printf("Status: %X\n", _status);
noname77 7:8e5855f18ad3 148 break;
noname77 7:8e5855f18ad3 149 }
noname77 7:8e5855f18ad3 150 default :
noname77 7:8e5855f18ad3 151 printf("co jest kurwa?!\n");
noname77 7:8e5855f18ad3 152 }
noname77 7:8e5855f18ad3 153 printf("Checksum: %X\n", _checksum);
noname77 7:8e5855f18ad3 154 }
noname77 7:8e5855f18ad3 155
noname77 7:8e5855f18ad3 156 //todo add timeout
noname77 7:8e5855f18ad3 157 void xbeeFrame::ReceiveFrame(void)
noname77 7:8e5855f18ad3 158 {
noname77 7:8e5855f18ad3 159 int cnt = 0;; //byte counter
noname77 7:8e5855f18ad3 160 char c;
noname77 7:8e5855f18ad3 161 unsigned int len = 0; //frame length + Startbyte
noname77 7:8e5855f18ad3 162 char receivingFrame = 0;
noname77 7:8e5855f18ad3 163 frameReceived = 0;
noname77 7:8e5855f18ad3 164 Serial DATA(_tx,_rx);
noname77 7:8e5855f18ad3 165
noname77 7:8e5855f18ad3 166 while(!frameReceived)
noname77 7:8e5855f18ad3 167 {
noname77 7:8e5855f18ad3 168 if(DATA.readable())
noname77 7:8e5855f18ad3 169 {
noname77 7:8e5855f18ad3 170 c = DATA.getc();
noname77 7:8e5855f18ad3 171 if(c == STARTBYTE)
noname77 7:8e5855f18ad3 172 receivingFrame = 1;
noname77 7:8e5855f18ad3 173 if(receivingFrame)
noname77 7:8e5855f18ad3 174 {
noname77 7:8e5855f18ad3 175 _apiFrame[cnt++] = c;
noname77 7:8e5855f18ad3 176 if(cnt == 3)
noname77 7:8e5855f18ad3 177 {
noname77 7:8e5855f18ad3 178 _length[0] = _apiFrame[1];
noname77 7:8e5855f18ad3 179 _length[1] = _apiFrame[2];
noname77 7:8e5855f18ad3 180 len = GetLength();
noname77 7:8e5855f18ad3 181 }
noname77 7:8e5855f18ad3 182 if(cnt>3 && (cnt == len + 4)) //startbyte, 2 len bytes and checksum
noname77 7:8e5855f18ad3 183 {
noname77 7:8e5855f18ad3 184 receivingFrame = 0;
noname77 7:8e5855f18ad3 185 frameReceived = 1;
noname77 7:8e5855f18ad3 186 ParseFrame();
noname77 7:8e5855f18ad3 187 }
noname77 7:8e5855f18ad3 188 }
noname77 7:8e5855f18ad3 189 }
noname77 7:8e5855f18ad3 190 }
noname77 7:8e5855f18ad3 191 }