Xbee

Committer:
renanbmx123
Date:
Sun Oct 14 02:01:07 2018 +0000
Revision:
0:fbed291691a6
Xbee

Who changed what in which revision?

UserRevisionLine numberNew contents of line
renanbmx123 0:fbed291691a6 1 #include "XBEE.h"
renanbmx123 0:fbed291691a6 2 #include <stdlib.h>
renanbmx123 0:fbed291691a6 3
renanbmx123 0:fbed291691a6 4 /* Class constructor */
renanbmx123 0:fbed291691a6 5 XBEE::XBEE(Serial* serial, int baud):xbee(serial)
renanbmx123 0:fbed291691a6 6 {
renanbmx123 0:fbed291691a6 7 xbee->baud(baud);
renanbmx123 0:fbed291691a6 8 /* Enable the reception of bytes on the serial interface by providing a cb */
renanbmx123 0:fbed291691a6 9 xbee->attach(callback(this, &XBEE::recvAttach), Serial::RxIrq);
renanbmx123 0:fbed291691a6 10 }
renanbmx123 0:fbed291691a6 11
renanbmx123 0:fbed291691a6 12 /* Class destructor */
renanbmx123 0:fbed291691a6 13 XBEE::~XBEE()
renanbmx123 0:fbed291691a6 14 {
renanbmx123 0:fbed291691a6 15 if (xbee != NULL) {
renanbmx123 0:fbed291691a6 16 delete xbee;
renanbmx123 0:fbed291691a6 17 }
renanbmx123 0:fbed291691a6 18 }
renanbmx123 0:fbed291691a6 19
renanbmx123 0:fbed291691a6 20 /* Chamada por Interrupcao, RX */
renanbmx123 0:fbed291691a6 21 void XBEE::recvAttach (void)
renanbmx123 0:fbed291691a6 22 {
renanbmx123 0:fbed291691a6 23 if (int_ctrl == 1)
renanbmx123 0:fbed291691a6 24 while(xbee->readable()) {
renanbmx123 0:fbed291691a6 25 buf_rx[count_rx%sizeof(buf_rx)] = xbee->getc();
renanbmx123 0:fbed291691a6 26 //buf_rx.push(xbee->getc());
renanbmx123 0:fbed291691a6 27 count_rx++;
renanbmx123 0:fbed291691a6 28 }
renanbmx123 0:fbed291691a6 29 }
renanbmx123 0:fbed291691a6 30
renanbmx123 0:fbed291691a6 31 /* Initialize the Device XBEE */
renanbmx123 0:fbed291691a6 32 void XBEE::init(void)
renanbmx123 0:fbed291691a6 33 {
renanbmx123 0:fbed291691a6 34 // memset(&NI,0,sizeof(NI));
renanbmx123 0:fbed291691a6 35 ID = 0;
renanbmx123 0:fbed291691a6 36 MY = 0;
renanbmx123 0:fbed291691a6 37 SH = 0;
renanbmx123 0:fbed291691a6 38 SL = 0;
renanbmx123 0:fbed291691a6 39 PL = 0;
renanbmx123 0:fbed291691a6 40 BD = 0;
renanbmx123 0:fbed291691a6 41 AO = 0;
renanbmx123 0:fbed291691a6 42 DB = 0;
renanbmx123 0:fbed291691a6 43 TP = 0;
renanbmx123 0:fbed291691a6 44
renanbmx123 0:fbed291691a6 45 wait(0.5);
renanbmx123 0:fbed291691a6 46
renanbmx123 0:fbed291691a6 47 memset(&buf_rx,0,sizeof(buf_rx));
renanbmx123 0:fbed291691a6 48
renanbmx123 0:fbed291691a6 49 create_CMD("NI",0); // Pan ID da rede
renanbmx123 0:fbed291691a6 50 sendBuffer();
renanbmx123 0:fbed291691a6 51 wait(0.5);
renanbmx123 0:fbed291691a6 52
renanbmx123 0:fbed291691a6 53 recv_NI();
renanbmx123 0:fbed291691a6 54 read_cfg("ID", ID);
renanbmx123 0:fbed291691a6 55 read_cfg("SH", SH);
renanbmx123 0:fbed291691a6 56 read_cfg("SL", SL);
renanbmx123 0:fbed291691a6 57 read_cfg("PL", PL);
renanbmx123 0:fbed291691a6 58 read_cfg("BD", BD);
renanbmx123 0:fbed291691a6 59 read_cfg("AO", AO);
renanbmx123 0:fbed291691a6 60 read_cfg("DB", DB);
renanbmx123 0:fbed291691a6 61 read_cfg("TP", TP);
renanbmx123 0:fbed291691a6 62
renanbmx123 0:fbed291691a6 63 count_rx = 0;
renanbmx123 0:fbed291691a6 64 memset(&buf_rx,0,sizeof(buf_rx));
renanbmx123 0:fbed291691a6 65 }
renanbmx123 0:fbed291691a6 66
renanbmx123 0:fbed291691a6 67 /* Send message to the destination */
renanbmx123 0:fbed291691a6 68 int XBEE::send_msg(char * str, int dest)
renanbmx123 0:fbed291691a6 69 {
renanbmx123 0:fbed291691a6 70 int n = strlen(str);
renanbmx123 0:fbed291691a6 71 if(n > 92) {
renanbmx123 0:fbed291691a6 72 return -1;
renanbmx123 0:fbed291691a6 73 }
renanbmx123 0:fbed291691a6 74 create_TX(str,dest);
renanbmx123 0:fbed291691a6 75 sendBuffer();
renanbmx123 0:fbed291691a6 76 wait(0.2);
renanbmx123 0:fbed291691a6 77 return 0;
renanbmx123 0:fbed291691a6 78 }
renanbmx123 0:fbed291691a6 79
renanbmx123 0:fbed291691a6 80 /* Sets a configuration value into the module device */
renanbmx123 0:fbed291691a6 81 int XBEE::set_cfg(char * cmd, int value)
renanbmx123 0:fbed291691a6 82 {
renanbmx123 0:fbed291691a6 83 int n = strlen(cmd);
renanbmx123 0:fbed291691a6 84 if(n != 2) {
renanbmx123 0:fbed291691a6 85 return -1;
renanbmx123 0:fbed291691a6 86 }
renanbmx123 0:fbed291691a6 87 create_CMD(cmd,hex2dec(value));
renanbmx123 0:fbed291691a6 88 sendBuffer();
renanbmx123 0:fbed291691a6 89 wait(0.2);
renanbmx123 0:fbed291691a6 90
renanbmx123 0:fbed291691a6 91 create_CMD("WR",0);
renanbmx123 0:fbed291691a6 92 sendBuffer();
renanbmx123 0:fbed291691a6 93 wait(0.2);
renanbmx123 0:fbed291691a6 94
renanbmx123 0:fbed291691a6 95 create_CMD("AC",0);
renanbmx123 0:fbed291691a6 96 sendBuffer();
renanbmx123 0:fbed291691a6 97 wait(0.2);
renanbmx123 0:fbed291691a6 98 return 0;
renanbmx123 0:fbed291691a6 99 }
renanbmx123 0:fbed291691a6 100
renanbmx123 0:fbed291691a6 101 /* Receives a message, writes in str */
renanbmx123 0:fbed291691a6 102 int XBEE::recv_msg(char * buf, int tam)
renanbmx123 0:fbed291691a6 103 {
renanbmx123 0:fbed291691a6 104 pkt_tx *p;
renanbmx123 0:fbed291691a6 105 int i;
renanbmx123 0:fbed291691a6 106 int ptam = 0;
renanbmx123 0:fbed291691a6 107 int j = 0;
renanbmx123 0:fbed291691a6 108
renanbmx123 0:fbed291691a6 109 memset(buf,0,tam);
renanbmx123 0:fbed291691a6 110
renanbmx123 0:fbed291691a6 111 for(i = 0; i < count_rx; i++) {
renanbmx123 0:fbed291691a6 112 if(buf_rx[i] == 0x7E) {
renanbmx123 0:fbed291691a6 113
renanbmx123 0:fbed291691a6 114 p = (pkt_tx *) &buf_rx[i];
renanbmx123 0:fbed291691a6 115
renanbmx123 0:fbed291691a6 116 if(p->frame_type == 0x90) {
renanbmx123 0:fbed291691a6 117 ptam = p->length - 0x0C;
renanbmx123 0:fbed291691a6 118 if(tam < ptam + j) {
renanbmx123 0:fbed291691a6 119 return -1;
renanbmx123 0:fbed291691a6 120 }
renanbmx123 0:fbed291691a6 121 // posicao aonde comeca a msg em um pacote de Receive
renanbmx123 0:fbed291691a6 122 memcpy(&buf[j], ((char *)(&p->broadcast_radius)), ptam);
renanbmx123 0:fbed291691a6 123 j += ptam;
renanbmx123 0:fbed291691a6 124 }
renanbmx123 0:fbed291691a6 125 }
renanbmx123 0:fbed291691a6 126 }
renanbmx123 0:fbed291691a6 127 return j;
renanbmx123 0:fbed291691a6 128 }
renanbmx123 0:fbed291691a6 129
renanbmx123 0:fbed291691a6 130 /* Updates the command value, call a request from device configurations */
renanbmx123 0:fbed291691a6 131 int XBEE::read_cfg(char * cmd, int & var)
renanbmx123 0:fbed291691a6 132 {
renanbmx123 0:fbed291691a6 133 int n = strlen(cmd);
renanbmx123 0:fbed291691a6 134 if(n != 2) {
renanbmx123 0:fbed291691a6 135 return -1;
renanbmx123 0:fbed291691a6 136 }
renanbmx123 0:fbed291691a6 137 count_rx = 0;
renanbmx123 0:fbed291691a6 138 memset(&buf_rx,0,sizeof(buf_rx));
renanbmx123 0:fbed291691a6 139
renanbmx123 0:fbed291691a6 140 create_CMD(cmd,0); // Pan ID da rede
renanbmx123 0:fbed291691a6 141 sendBuffer();
renanbmx123 0:fbed291691a6 142 wait(0.5);
renanbmx123 0:fbed291691a6 143 recv_CMD(var);
renanbmx123 0:fbed291691a6 144 return 0;
renanbmx123 0:fbed291691a6 145 }
renanbmx123 0:fbed291691a6 146
renanbmx123 0:fbed291691a6 147 /* Clear all the Receive buffer */
renanbmx123 0:fbed291691a6 148 void XBEE::clear_buf(void)
renanbmx123 0:fbed291691a6 149 {
renanbmx123 0:fbed291691a6 150 count_rx = 0;
renanbmx123 0:fbed291691a6 151 memset(buf_rx,0,sizeof(buf_rx));
renanbmx123 0:fbed291691a6 152 }
renanbmx123 0:fbed291691a6 153
renanbmx123 0:fbed291691a6 154 /* Cria pacote de mensagem */
renanbmx123 0:fbed291691a6 155 int XBEE::create_TX(char * str, int dest)
renanbmx123 0:fbed291691a6 156 {
renanbmx123 0:fbed291691a6 157 int i = 0;
renanbmx123 0:fbed291691a6 158 int n = strlen(str);
renanbmx123 0:fbed291691a6 159
renanbmx123 0:fbed291691a6 160 pkt_tx *p = (pkt_tx *) buf_tx; // ponteiro para buffer global
renanbmx123 0:fbed291691a6 161
renanbmx123 0:fbed291691a6 162 uint8_t count = 0;
renanbmx123 0:fbed291691a6 163
renanbmx123 0:fbed291691a6 164 if(n > 92) {
renanbmx123 0:fbed291691a6 165 // Error: data nao pode exceder 92 bytes
renanbmx123 0:fbed291691a6 166 return -1;
renanbmx123 0:fbed291691a6 167 }
renanbmx123 0:fbed291691a6 168
renanbmx123 0:fbed291691a6 169 count_tx = 0;
renanbmx123 0:fbed291691a6 170 memset(&buf_tx,0,sizeof(buf_tx));
renanbmx123 0:fbed291691a6 171
renanbmx123 0:fbed291691a6 172 p->start_delimiter = 0x7E;
renanbmx123 0:fbed291691a6 173 p->length = 0x0E + n; // pacote vazio + dados
renanbmx123 0:fbed291691a6 174 p->frame_type = 0x10; // transmit request
renanbmx123 0:fbed291691a6 175 p->frame_id = 1;
renanbmx123 0:fbed291691a6 176
renanbmx123 0:fbed291691a6 177 if(dest == XBEE_COORD) {
renanbmx123 0:fbed291691a6 178 p->dest_addr64[6] = 0x00; //SL_H
renanbmx123 0:fbed291691a6 179 p->dest_addr64[7] = 0x00; //SL_L
renanbmx123 0:fbed291691a6 180 } else if(dest == XBEE_BROAD) {
renanbmx123 0:fbed291691a6 181 p->dest_addr64[6] = 0xFF; //SL_H
renanbmx123 0:fbed291691a6 182 p->dest_addr64[7] = 0xFF; //SL_L
renanbmx123 0:fbed291691a6 183 } else {
renanbmx123 0:fbed291691a6 184 p->dest_addr64[0] = 0x00;
renanbmx123 0:fbed291691a6 185 p->dest_addr64[1] = 0x13;
renanbmx123 0:fbed291691a6 186 p->dest_addr64[2] = 0xA2;
renanbmx123 0:fbed291691a6 187 p->dest_addr64[3] = 0x00;
renanbmx123 0:fbed291691a6 188
renanbmx123 0:fbed291691a6 189 p->dest_addr64[4] = (dest >> 24);
renanbmx123 0:fbed291691a6 190 p->dest_addr64[5] = (dest & 0x00FF0000) >> 16;
renanbmx123 0:fbed291691a6 191 p->dest_addr64[6] = (dest & 0x0000FF00) >> 8;
renanbmx123 0:fbed291691a6 192 p->dest_addr64[7] = (dest & 0x000000FF);
renanbmx123 0:fbed291691a6 193 }
renanbmx123 0:fbed291691a6 194 p->dest_addr16[0] = 0xFF; //MY_H
renanbmx123 0:fbed291691a6 195 p->dest_addr16[1] = 0xFF; //MY_L
renanbmx123 0:fbed291691a6 196
renanbmx123 0:fbed291691a6 197 memcpy(&p->rf_data, str, n);
renanbmx123 0:fbed291691a6 198
renanbmx123 0:fbed291691a6 199 // Calcula Checksum
renanbmx123 0:fbed291691a6 200
renanbmx123 0:fbed291691a6 201 // comeca 3 pra frente, tenq passar 3 adiante no final
renanbmx123 0:fbed291691a6 202 // para ler o mesmo tamanho de pacote
renanbmx123 0:fbed291691a6 203 for(i = 3; i < p->length + 3; i++) {
renanbmx123 0:fbed291691a6 204 count += buf_tx[i];
renanbmx123 0:fbed291691a6 205 //printf("\n%d\n", count);
renanbmx123 0:fbed291691a6 206 }
renanbmx123 0:fbed291691a6 207 count = 0xFF - count;
renanbmx123 0:fbed291691a6 208
renanbmx123 0:fbed291691a6 209 p->rf_data[n] = count;
renanbmx123 0:fbed291691a6 210
renanbmx123 0:fbed291691a6 211 //p->length tem o tamanho soh do frame,
renanbmx123 0:fbed291691a6 212 //pacote total eh o starter + length alto + length baixo + checksum
renanbmx123 0:fbed291691a6 213 count_tx = p->length + 4;
renanbmx123 0:fbed291691a6 214 return count_tx;
renanbmx123 0:fbed291691a6 215 }
renanbmx123 0:fbed291691a6 216
renanbmx123 0:fbed291691a6 217 /* Cria pacote de comando */
renanbmx123 0:fbed291691a6 218 int XBEE::create_CMD(char * cmd, int val)
renanbmx123 0:fbed291691a6 219 {
renanbmx123 0:fbed291691a6 220 pkt_cmd *p = (pkt_cmd *) buf_tx; // ponteiro para buffer global
renanbmx123 0:fbed291691a6 221 char str[4]; // string do val
renanbmx123 0:fbed291691a6 222 int size_cmd = strlen(cmd);
renanbmx123 0:fbed291691a6 223 //int value = dec2hex(val);
renanbmx123 0:fbed291691a6 224 int value = val;
renanbmx123 0:fbed291691a6 225 int n = 0; // tamanho em bytes do parametro do comando
renanbmx123 0:fbed291691a6 226 int i;
renanbmx123 0:fbed291691a6 227 uint8_t count = 0;
renanbmx123 0:fbed291691a6 228
renanbmx123 0:fbed291691a6 229 if(size_cmd != 2) {
renanbmx123 0:fbed291691a6 230 // Error: comando deve conter 2 chars
renanbmx123 0:fbed291691a6 231 return -1;
renanbmx123 0:fbed291691a6 232 }
renanbmx123 0:fbed291691a6 233
renanbmx123 0:fbed291691a6 234 if(val != 0) {
renanbmx123 0:fbed291691a6 235 if( (value >> 24) & 0xFF ) {
renanbmx123 0:fbed291691a6 236 str[0] = (value >> 24) & 0xFF;
renanbmx123 0:fbed291691a6 237 str[1] = (value >> 16) & 0xFF;
renanbmx123 0:fbed291691a6 238 str[2] = (value >> 8) & 0xFF;
renanbmx123 0:fbed291691a6 239 str[3] = value & 0xFF;
renanbmx123 0:fbed291691a6 240 n = 4;
renanbmx123 0:fbed291691a6 241 } else if( (value >> 16) & 0xFF ) {
renanbmx123 0:fbed291691a6 242 str[0] = (value >> 16) & 0xFF;
renanbmx123 0:fbed291691a6 243 str[1] = (value >> 8) & 0xFF;
renanbmx123 0:fbed291691a6 244 str[2] = value & 0xFF;
renanbmx123 0:fbed291691a6 245 n = 3;
renanbmx123 0:fbed291691a6 246 } else if( (value >> 8) & 0xFF ) {
renanbmx123 0:fbed291691a6 247 str[0] = (value >> 8) & 0xFF;
renanbmx123 0:fbed291691a6 248 str[1] = value & 0xFF;
renanbmx123 0:fbed291691a6 249 n = 2;
renanbmx123 0:fbed291691a6 250 } else {
renanbmx123 0:fbed291691a6 251 str[0] = value & 0xFF;
renanbmx123 0:fbed291691a6 252 n = 1;
renanbmx123 0:fbed291691a6 253 }
renanbmx123 0:fbed291691a6 254 }
renanbmx123 0:fbed291691a6 255
renanbmx123 0:fbed291691a6 256 count_tx = 0;
renanbmx123 0:fbed291691a6 257 memset(&buf_tx,0,sizeof(buf_tx));
renanbmx123 0:fbed291691a6 258
renanbmx123 0:fbed291691a6 259 p->start_delimiter = 0x7E;
renanbmx123 0:fbed291691a6 260 p->length = 0x04 + n; // pacote vazio + dados
renanbmx123 0:fbed291691a6 261 p->frame_type = 0x09; // AT Command Queue
renanbmx123 0:fbed291691a6 262 p->frame_id = 1;
renanbmx123 0:fbed291691a6 263
renanbmx123 0:fbed291691a6 264 p->command[0] = cmd[0];
renanbmx123 0:fbed291691a6 265 p->command[1] = cmd[1];
renanbmx123 0:fbed291691a6 266
renanbmx123 0:fbed291691a6 267 if(val != 0) {
renanbmx123 0:fbed291691a6 268 memcpy(&p->rf_data, str, n);
renanbmx123 0:fbed291691a6 269 }
renanbmx123 0:fbed291691a6 270
renanbmx123 0:fbed291691a6 271 // Calcula Checksum
renanbmx123 0:fbed291691a6 272
renanbmx123 0:fbed291691a6 273 // comeca 3 pra frente, tenq passar 3 adiante no final
renanbmx123 0:fbed291691a6 274 // para ler o mesmo tamanho de pacote
renanbmx123 0:fbed291691a6 275 for(i = 3; i < p->length + 3; i++) {
renanbmx123 0:fbed291691a6 276 count += buf_tx[i];
renanbmx123 0:fbed291691a6 277 //printf("\n%d\n", count);
renanbmx123 0:fbed291691a6 278 }
renanbmx123 0:fbed291691a6 279 count = 0xFF - count;
renanbmx123 0:fbed291691a6 280
renanbmx123 0:fbed291691a6 281 p->rf_data[n] = count;
renanbmx123 0:fbed291691a6 282
renanbmx123 0:fbed291691a6 283 //p->length tem o tamanho soh do frame,
renanbmx123 0:fbed291691a6 284 //pacote total eh o starter + length alto + length baixo + checksum
renanbmx123 0:fbed291691a6 285 count_tx = p->length + 4;
renanbmx123 0:fbed291691a6 286 return count_tx;
renanbmx123 0:fbed291691a6 287 }
renanbmx123 0:fbed291691a6 288
renanbmx123 0:fbed291691a6 289 /* Envia pacote do buffer_tx */
renanbmx123 0:fbed291691a6 290 void XBEE::sendBuffer(void)
renanbmx123 0:fbed291691a6 291 {
renanbmx123 0:fbed291691a6 292 if(xbee->writeable()) {
renanbmx123 0:fbed291691a6 293 for(int i = 0; i < count_tx; i++) {
renanbmx123 0:fbed291691a6 294 xbee->putc(buf_tx[i]);
renanbmx123 0:fbed291691a6 295 }
renanbmx123 0:fbed291691a6 296 //pode zerar pacote aqui
renanbmx123 0:fbed291691a6 297 }
renanbmx123 0:fbed291691a6 298 }
renanbmx123 0:fbed291691a6 299
renanbmx123 0:fbed291691a6 300 /* Printa todo o buffer de Receive, e limpa */
renanbmx123 0:fbed291691a6 301 /*
renanbmx123 0:fbed291691a6 302 void XBEE::printBuffer(void)
renanbmx123 0:fbed291691a6 303 {
renanbmx123 0:fbed291691a6 304 char flag_msg = 0;
renanbmx123 0:fbed291691a6 305 int size = sizeof(buf_rx);
renanbmx123 0:fbed291691a6 306 if(count_rx < size) {
renanbmx123 0:fbed291691a6 307 size = count_rx;
renanbmx123 0:fbed291691a6 308 }
renanbmx123 0:fbed291691a6 309 for(int i = 0; i < size; i++) {
renanbmx123 0:fbed291691a6 310 printf("%c", buf_rx[i]);
renanbmx123 0:fbed291691a6 311 flag_msg++;
renanbmx123 0:fbed291691a6 312 }
renanbmx123 0:fbed291691a6 313 if (flag_msg) {
renanbmx123 0:fbed291691a6 314 printf("\n");
renanbmx123 0:fbed291691a6 315 }
renanbmx123 0:fbed291691a6 316
renanbmx123 0:fbed291691a6 317 //Limpa buffer
renanbmx123 0:fbed291691a6 318 count_rx = 0;
renanbmx123 0:fbed291691a6 319 memset(&buf_rx,0,sizeof(buf_rx));
renanbmx123 0:fbed291691a6 320 }
renanbmx123 0:fbed291691a6 321 */
renanbmx123 0:fbed291691a6 322
renanbmx123 0:fbed291691a6 323 /* Receive and update NI variable */
renanbmx123 0:fbed291691a6 324 void XBEE::recv_NI(void)
renanbmx123 0:fbed291691a6 325 {
renanbmx123 0:fbed291691a6 326 pkt_cmd *p;
renanbmx123 0:fbed291691a6 327 int i;
renanbmx123 0:fbed291691a6 328 for(i = 0; i < count_rx; i++) {
renanbmx123 0:fbed291691a6 329 if(buf_rx[i] == 0x7E) {
renanbmx123 0:fbed291691a6 330 p = (pkt_cmd *) &buf_rx[i];
renanbmx123 0:fbed291691a6 331 }
renanbmx123 0:fbed291691a6 332 }
renanbmx123 0:fbed291691a6 333 if(p->frame_type == 0x88) {
renanbmx123 0:fbed291691a6 334 memcpy(NI, ((char *)(&p->rf_data))+2, 16);
renanbmx123 0:fbed291691a6 335 // remove o checksum do nome
renanbmx123 0:fbed291691a6 336 for(i = 15; i >= 0; i--) {
renanbmx123 0:fbed291691a6 337 if(NI[i] != 0) {
renanbmx123 0:fbed291691a6 338 NI[i] = '\0';
renanbmx123 0:fbed291691a6 339 break;
renanbmx123 0:fbed291691a6 340 }
renanbmx123 0:fbed291691a6 341 }
renanbmx123 0:fbed291691a6 342 }
renanbmx123 0:fbed291691a6 343 }
renanbmx123 0:fbed291691a6 344
renanbmx123 0:fbed291691a6 345 /* Receive and update CMD variable */
renanbmx123 0:fbed291691a6 346 void XBEE::recv_CMD(int &cmd)
renanbmx123 0:fbed291691a6 347 {
renanbmx123 0:fbed291691a6 348 char data[16];
renanbmx123 0:fbed291691a6 349 pkt_cmd *p;
renanbmx123 0:fbed291691a6 350 int i;
renanbmx123 0:fbed291691a6 351 int j = -1;
renanbmx123 0:fbed291691a6 352
renanbmx123 0:fbed291691a6 353 for(i = 0; i < count_rx; i++) {
renanbmx123 0:fbed291691a6 354 if(buf_rx[i] == 0x7E) {
renanbmx123 0:fbed291691a6 355 p = (pkt_cmd *) &buf_rx[i];
renanbmx123 0:fbed291691a6 356 }
renanbmx123 0:fbed291691a6 357 }
renanbmx123 0:fbed291691a6 358 if(p->frame_type == 0x88) {
renanbmx123 0:fbed291691a6 359 memcpy(data, &p->rf_data, 16);
renanbmx123 0:fbed291691a6 360 for(i = 15; i > -1; i--) {
renanbmx123 0:fbed291691a6 361 if(data[i] != 0 || j != -1) {
renanbmx123 0:fbed291691a6 362 // pular o checksum
renanbmx123 0:fbed291691a6 363 if(j==-1) {
renanbmx123 0:fbed291691a6 364 j++;
renanbmx123 0:fbed291691a6 365 } else {
renanbmx123 0:fbed291691a6 366 //ID = (int)(dec2hex((data[i] << 8)) + dec2hex(data[i+1]));
renanbmx123 0:fbed291691a6 367 cmd += data[i] << 8*j;
renanbmx123 0:fbed291691a6 368 j++;
renanbmx123 0:fbed291691a6 369 }
renanbmx123 0:fbed291691a6 370 }
renanbmx123 0:fbed291691a6 371 }
renanbmx123 0:fbed291691a6 372 }
renanbmx123 0:fbed291691a6 373 }
renanbmx123 0:fbed291691a6 374
renanbmx123 0:fbed291691a6 375 /* Verify Packet Checksum return 0 if msg OK, just work with Transmit Package*/
renanbmx123 0:fbed291691a6 376 /*
renanbmx123 0:fbed291691a6 377 char XBEE::validPackage(uint8_t * buf, int tam)
renanbmx123 0:fbed291691a6 378 {
renanbmx123 0:fbed291691a6 379 int i = 0;
renanbmx123 0:fbed291691a6 380 uint8_t count = 0;
renanbmx123 0:fbed291691a6 381
renanbmx123 0:fbed291691a6 382 if(buf[0] != 0x7E) return 1;
renanbmx123 0:fbed291691a6 383 if(buf[1] != 0) return 2;
renanbmx123 0:fbed291691a6 384 if(buf[2] != tam-4) return 3;
renanbmx123 0:fbed291691a6 385
renanbmx123 0:fbed291691a6 386 for(i = 3; i < tam; i++) {
renanbmx123 0:fbed291691a6 387 count += buf[i];
renanbmx123 0:fbed291691a6 388 }
renanbmx123 0:fbed291691a6 389 if(count != 0xFF) return 4;
renanbmx123 0:fbed291691a6 390
renanbmx123 0:fbed291691a6 391 return 0; // OK
renanbmx123 0:fbed291691a6 392 }
renanbmx123 0:fbed291691a6 393 */
renanbmx123 0:fbed291691a6 394
renanbmx123 0:fbed291691a6 395 /* Convert Dec to Hex, OBS: just for Hex number without Letter */
renanbmx123 0:fbed291691a6 396 int XBEE::dec2hex(int nbr)
renanbmx123 0:fbed291691a6 397 {
renanbmx123 0:fbed291691a6 398 char hexa[8];
renanbmx123 0:fbed291691a6 399 int temp;
renanbmx123 0:fbed291691a6 400 int result = 0;
renanbmx123 0:fbed291691a6 401 int i = 0;
renanbmx123 0:fbed291691a6 402 char hasLetter = 0;
renanbmx123 0:fbed291691a6 403
renanbmx123 0:fbed291691a6 404 while(nbr != 0)
renanbmx123 0:fbed291691a6 405 {
renanbmx123 0:fbed291691a6 406 temp = nbr % 16;
renanbmx123 0:fbed291691a6 407 hexa[i] = temp;
renanbmx123 0:fbed291691a6 408 nbr = nbr / 16;
renanbmx123 0:fbed291691a6 409 i++;
renanbmx123 0:fbed291691a6 410 if(temp > 9) {
renanbmx123 0:fbed291691a6 411 hasLetter++;
renanbmx123 0:fbed291691a6 412 }
renanbmx123 0:fbed291691a6 413 }
renanbmx123 0:fbed291691a6 414 // concat number
renanbmx123 0:fbed291691a6 415 for(i=i-1; i > -1; i--) {
renanbmx123 0:fbed291691a6 416 result += hexa[i] * pow(10.0,(double)i);
renanbmx123 0:fbed291691a6 417 }
renanbmx123 0:fbed291691a6 418
renanbmx123 0:fbed291691a6 419 return result;
renanbmx123 0:fbed291691a6 420 }
renanbmx123 0:fbed291691a6 421
renanbmx123 0:fbed291691a6 422 /* Convert Hex to Dec */
renanbmx123 0:fbed291691a6 423 int XBEE::hex2dec(int nbr)
renanbmx123 0:fbed291691a6 424 {
renanbmx123 0:fbed291691a6 425 char deci[8];
renanbmx123 0:fbed291691a6 426 int result = 0;
renanbmx123 0:fbed291691a6 427 int i = 0;
renanbmx123 0:fbed291691a6 428 int temp;
renanbmx123 0:fbed291691a6 429 char hasLetter = 0;
renanbmx123 0:fbed291691a6 430
renanbmx123 0:fbed291691a6 431 while(nbr != 0) {
renanbmx123 0:fbed291691a6 432 temp = nbr % 10;
renanbmx123 0:fbed291691a6 433 deci[i] = temp;
renanbmx123 0:fbed291691a6 434 nbr = nbr / 10;
renanbmx123 0:fbed291691a6 435 i++;
renanbmx123 0:fbed291691a6 436 if(temp > 9) {
renanbmx123 0:fbed291691a6 437 hasLetter++;
renanbmx123 0:fbed291691a6 438 }
renanbmx123 0:fbed291691a6 439 }
renanbmx123 0:fbed291691a6 440 // concat number
renanbmx123 0:fbed291691a6 441 for(i=i-1; i > -1; i--) {
renanbmx123 0:fbed291691a6 442 result += (deci[i] * pow(16.0,(double)i) );
renanbmx123 0:fbed291691a6 443 }
renanbmx123 0:fbed291691a6 444 return result;
renanbmx123 0:fbed291691a6 445 }
renanbmx123 0:fbed291691a6 446 void XBEE::int_mng(int value){
renanbmx123 0:fbed291691a6 447 int_ctrl = value;
renanbmx123 0:fbed291691a6 448 }