XBEE code to reduce program size

Dependencies:   mbed

Committer:
giovanniwsn
Date:
Sun Oct 14 05:56:14 2018 +0000
Revision:
1:b0c665b697c7
Parent:
0:7c9e8aaa85d4
removido os comentarios, codigo limpo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovanniwsn 0:7c9e8aaa85d4 1 #include "XBEE.h"
giovanniwsn 0:7c9e8aaa85d4 2
giovanniwsn 0:7c9e8aaa85d4 3 /* Class constructor */
giovanniwsn 0:7c9e8aaa85d4 4 XBEE::XBEE(Serial* serial, int baud):xbee(serial)
giovanniwsn 0:7c9e8aaa85d4 5 {
giovanniwsn 0:7c9e8aaa85d4 6 xbee->baud(baud);
giovanniwsn 0:7c9e8aaa85d4 7 xbee->attach(callback(this, &XBEE::recvAttach), Serial::RxIrq);
giovanniwsn 0:7c9e8aaa85d4 8 init();
giovanniwsn 0:7c9e8aaa85d4 9 }
giovanniwsn 0:7c9e8aaa85d4 10
giovanniwsn 0:7c9e8aaa85d4 11 /* Initialize the Device XBEE */
giovanniwsn 0:7c9e8aaa85d4 12 void XBEE::init(void)
giovanniwsn 0:7c9e8aaa85d4 13 {
giovanniwsn 0:7c9e8aaa85d4 14 count_tx = 0;
giovanniwsn 0:7c9e8aaa85d4 15 count_rx = 0;
giovanniwsn 0:7c9e8aaa85d4 16 memset(&buf_tx,0,sizeof(buf_tx));
giovanniwsn 0:7c9e8aaa85d4 17 memset(&buf_rx,0,sizeof(buf_rx));
giovanniwsn 0:7c9e8aaa85d4 18 }
giovanniwsn 0:7c9e8aaa85d4 19
giovanniwsn 0:7c9e8aaa85d4 20 /* Send message to the destination */
giovanniwsn 0:7c9e8aaa85d4 21 int XBEE::send_msg(char * str)
giovanniwsn 0:7c9e8aaa85d4 22 {
giovanniwsn 0:7c9e8aaa85d4 23 int n = strlen(str);
giovanniwsn 1:b0c665b697c7 24 if(n > 92) return -1;
giovanniwsn 0:7c9e8aaa85d4 25 create_TX(str);
giovanniwsn 0:7c9e8aaa85d4 26 sendBuffer();
giovanniwsn 0:7c9e8aaa85d4 27 wait(0.2);
giovanniwsn 0:7c9e8aaa85d4 28 return 0;
giovanniwsn 0:7c9e8aaa85d4 29 }
giovanniwsn 0:7c9e8aaa85d4 30
giovanniwsn 0:7c9e8aaa85d4 31 /* Receives a message, writes in str */
giovanniwsn 0:7c9e8aaa85d4 32 int XBEE::recv_msg(char * buf, int tam)
giovanniwsn 0:7c9e8aaa85d4 33 {
giovanniwsn 0:7c9e8aaa85d4 34 pkt_tx *p;
giovanniwsn 0:7c9e8aaa85d4 35 int i;
giovanniwsn 0:7c9e8aaa85d4 36 int ptam = 0;
giovanniwsn 0:7c9e8aaa85d4 37 int j = 0;
giovanniwsn 0:7c9e8aaa85d4 38 memset(buf,0,tam);
giovanniwsn 0:7c9e8aaa85d4 39
giovanniwsn 0:7c9e8aaa85d4 40 for(i = 0; i < count_rx; i++) {
giovanniwsn 0:7c9e8aaa85d4 41 if(buf_rx[i] == 0x7E) {
giovanniwsn 0:7c9e8aaa85d4 42 p = (pkt_tx *) &buf_rx[i];
giovanniwsn 0:7c9e8aaa85d4 43 if(p->frame_type == 0x90) {
giovanniwsn 0:7c9e8aaa85d4 44 ptam = p->length - 0x0C;
giovanniwsn 0:7c9e8aaa85d4 45 if(tam < ptam + j) {
giovanniwsn 0:7c9e8aaa85d4 46 return -1;
giovanniwsn 0:7c9e8aaa85d4 47 }
giovanniwsn 1:b0c665b697c7 48 // posicao aonde comeca msg
giovanniwsn 0:7c9e8aaa85d4 49 memcpy(&buf[j], ((char *)(&p->broadcast_radius)), ptam);
giovanniwsn 0:7c9e8aaa85d4 50 j += ptam;
giovanniwsn 0:7c9e8aaa85d4 51 }
giovanniwsn 0:7c9e8aaa85d4 52 }
giovanniwsn 0:7c9e8aaa85d4 53 }
giovanniwsn 0:7c9e8aaa85d4 54 return j;
giovanniwsn 0:7c9e8aaa85d4 55 }
giovanniwsn 0:7c9e8aaa85d4 56
giovanniwsn 0:7c9e8aaa85d4 57 /* Chamada por Interrupcao, RX */
giovanniwsn 0:7c9e8aaa85d4 58 void XBEE::recvAttach (void)
giovanniwsn 0:7c9e8aaa85d4 59 {
giovanniwsn 1:b0c665b697c7 60 while(xbee->readable()) {
giovanniwsn 1:b0c665b697c7 61 buf_rx[count_rx%sizeof(buf_rx)] = xbee->getc();
giovanniwsn 1:b0c665b697c7 62 count_rx++;
giovanniwsn 1:b0c665b697c7 63 }
giovanniwsn 0:7c9e8aaa85d4 64 }
giovanniwsn 0:7c9e8aaa85d4 65
giovanniwsn 0:7c9e8aaa85d4 66 /* Envia pacote do buffer_tx */
giovanniwsn 0:7c9e8aaa85d4 67 void XBEE::sendBuffer(void)
giovanniwsn 0:7c9e8aaa85d4 68 {
giovanniwsn 0:7c9e8aaa85d4 69 if(xbee->writeable()) {
giovanniwsn 0:7c9e8aaa85d4 70 for(int i = 0; i < count_tx; i++) {
giovanniwsn 0:7c9e8aaa85d4 71 xbee->putc(buf_tx[i]);
giovanniwsn 0:7c9e8aaa85d4 72 }
giovanniwsn 0:7c9e8aaa85d4 73 }
giovanniwsn 0:7c9e8aaa85d4 74 }
giovanniwsn 0:7c9e8aaa85d4 75
giovanniwsn 0:7c9e8aaa85d4 76 /* Cria pacote de mensagem */
giovanniwsn 0:7c9e8aaa85d4 77 int XBEE::create_TX(char * str)
giovanniwsn 0:7c9e8aaa85d4 78 {
giovanniwsn 0:7c9e8aaa85d4 79 int i = 0;
giovanniwsn 0:7c9e8aaa85d4 80 int n = strlen(str);
giovanniwsn 0:7c9e8aaa85d4 81 uint8_t count = 0;
giovanniwsn 0:7c9e8aaa85d4 82 pkt_tx *p = (pkt_tx *) buf_tx; // ponteiro para buffer global
giovanniwsn 0:7c9e8aaa85d4 83
giovanniwsn 1:b0c665b697c7 84 if(n > 92) return -1; // nao pode exceder 92 bytes
giovanniwsn 0:7c9e8aaa85d4 85 count_tx = 0;
giovanniwsn 0:7c9e8aaa85d4 86 memset(&buf_tx,0,sizeof(buf_tx));
giovanniwsn 0:7c9e8aaa85d4 87
giovanniwsn 0:7c9e8aaa85d4 88 p->start_delimiter = 0x7E;
giovanniwsn 0:7c9e8aaa85d4 89 p->length = 0x0E + n; // pacote vazio + dados
giovanniwsn 0:7c9e8aaa85d4 90 p->frame_type = 0x10; // transmit request
giovanniwsn 0:7c9e8aaa85d4 91 p->frame_id = 1;
giovanniwsn 1:b0c665b697c7 92 p->dest_addr64[6] = 0x00; //SL_H
giovanniwsn 1:b0c665b697c7 93 p->dest_addr64[7] = 0x00; //SL_L
giovanniwsn 0:7c9e8aaa85d4 94 p->dest_addr16[0] = 0xFF; //MY_H
giovanniwsn 0:7c9e8aaa85d4 95 p->dest_addr16[1] = 0xFF; //MY_L
giovanniwsn 0:7c9e8aaa85d4 96 memcpy(&p->rf_data, str, n);
giovanniwsn 0:7c9e8aaa85d4 97
giovanniwsn 1:b0c665b697c7 98 // Calc. Checksum: comeca 3 pra frente, tenq passar 3 adiante no final
giovanniwsn 1:b0c665b697c7 99 for(i = 3; i < p->length + 3; i++) count += buf_tx[i];
giovanniwsn 1:b0c665b697c7 100
giovanniwsn 0:7c9e8aaa85d4 101 count = 0xFF - count;
giovanniwsn 0:7c9e8aaa85d4 102 p->rf_data[n] = count;
giovanniwsn 0:7c9e8aaa85d4 103
giovanniwsn 0:7c9e8aaa85d4 104 //p->length tem o tamanho soh do frame,
giovanniwsn 0:7c9e8aaa85d4 105 //pacote total eh o starter + length alto + length baixo + checksum
giovanniwsn 0:7c9e8aaa85d4 106 count_tx = p->length + 4;
giovanniwsn 0:7c9e8aaa85d4 107 return count_tx;
giovanniwsn 1:b0c665b697c7 108 }