XBEE code to reduce program size

Dependencies:   mbed

Committer:
giovanniwsn
Date:
Sun Oct 14 05:47:42 2018 +0000
Revision:
0:7c9e8aaa85d4
Child:
1:b0c665b697c7
XBEE code to reduce program size

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 /* Enable the reception of bytes on the serial interface by providing a cb */
giovanniwsn 0:7c9e8aaa85d4 8 xbee->attach(callback(this, &XBEE::recvAttach), Serial::RxIrq);
giovanniwsn 0:7c9e8aaa85d4 9 init();
giovanniwsn 0:7c9e8aaa85d4 10 }
giovanniwsn 0:7c9e8aaa85d4 11
giovanniwsn 0:7c9e8aaa85d4 12 /* Initialize the Device XBEE */
giovanniwsn 0:7c9e8aaa85d4 13 void XBEE::init(void)
giovanniwsn 0:7c9e8aaa85d4 14 {
giovanniwsn 0:7c9e8aaa85d4 15 count_tx = 0;
giovanniwsn 0:7c9e8aaa85d4 16 count_rx = 0;
giovanniwsn 0:7c9e8aaa85d4 17 memset(&buf_tx,0,sizeof(buf_tx));
giovanniwsn 0:7c9e8aaa85d4 18 memset(&buf_rx,0,sizeof(buf_rx));
giovanniwsn 0:7c9e8aaa85d4 19 }
giovanniwsn 0:7c9e8aaa85d4 20
giovanniwsn 0:7c9e8aaa85d4 21 /* Send message to the destination */
giovanniwsn 0:7c9e8aaa85d4 22 //int XBEE::send_msg(char * str, int dest)
giovanniwsn 0:7c9e8aaa85d4 23 int XBEE::send_msg(char * str)
giovanniwsn 0:7c9e8aaa85d4 24 {
giovanniwsn 0:7c9e8aaa85d4 25 int n = strlen(str);
giovanniwsn 0:7c9e8aaa85d4 26 if(n > 92) {
giovanniwsn 0:7c9e8aaa85d4 27 return -1;
giovanniwsn 0:7c9e8aaa85d4 28 }
giovanniwsn 0:7c9e8aaa85d4 29 //create_TX(str,dest);
giovanniwsn 0:7c9e8aaa85d4 30 create_TX(str);
giovanniwsn 0:7c9e8aaa85d4 31 sendBuffer();
giovanniwsn 0:7c9e8aaa85d4 32 wait(0.2);
giovanniwsn 0:7c9e8aaa85d4 33 return 0;
giovanniwsn 0:7c9e8aaa85d4 34 }
giovanniwsn 0:7c9e8aaa85d4 35
giovanniwsn 0:7c9e8aaa85d4 36 /* Receives a message, writes in str */
giovanniwsn 0:7c9e8aaa85d4 37 int XBEE::recv_msg(char * buf, int tam)
giovanniwsn 0:7c9e8aaa85d4 38 {
giovanniwsn 0:7c9e8aaa85d4 39 pkt_tx *p;
giovanniwsn 0:7c9e8aaa85d4 40 int i;
giovanniwsn 0:7c9e8aaa85d4 41 int ptam = 0;
giovanniwsn 0:7c9e8aaa85d4 42 int j = 0;
giovanniwsn 0:7c9e8aaa85d4 43
giovanniwsn 0:7c9e8aaa85d4 44 memset(buf,0,tam);
giovanniwsn 0:7c9e8aaa85d4 45
giovanniwsn 0:7c9e8aaa85d4 46 for(i = 0; i < count_rx; i++) {
giovanniwsn 0:7c9e8aaa85d4 47 if(buf_rx[i] == 0x7E) {
giovanniwsn 0:7c9e8aaa85d4 48
giovanniwsn 0:7c9e8aaa85d4 49 p = (pkt_tx *) &buf_rx[i];
giovanniwsn 0:7c9e8aaa85d4 50
giovanniwsn 0:7c9e8aaa85d4 51 if(p->frame_type == 0x90) {
giovanniwsn 0:7c9e8aaa85d4 52 ptam = p->length - 0x0C;
giovanniwsn 0:7c9e8aaa85d4 53 if(tam < ptam + j) {
giovanniwsn 0:7c9e8aaa85d4 54 return -1;
giovanniwsn 0:7c9e8aaa85d4 55 }
giovanniwsn 0:7c9e8aaa85d4 56 // posicao aonde comeca a msg em um pacote de Receive
giovanniwsn 0:7c9e8aaa85d4 57 memcpy(&buf[j], ((char *)(&p->broadcast_radius)), ptam);
giovanniwsn 0:7c9e8aaa85d4 58 j += ptam;
giovanniwsn 0:7c9e8aaa85d4 59 }
giovanniwsn 0:7c9e8aaa85d4 60 }
giovanniwsn 0:7c9e8aaa85d4 61 }
giovanniwsn 0:7c9e8aaa85d4 62 return j;
giovanniwsn 0:7c9e8aaa85d4 63 }
giovanniwsn 0:7c9e8aaa85d4 64
giovanniwsn 0:7c9e8aaa85d4 65 /* Chamada por Interrupcao, RX */
giovanniwsn 0:7c9e8aaa85d4 66 void XBEE::recvAttach (void)
giovanniwsn 0:7c9e8aaa85d4 67 {
giovanniwsn 0:7c9e8aaa85d4 68 //if (serial_RX_ctrl == 1)
giovanniwsn 0:7c9e8aaa85d4 69 while(xbee->readable()) {
giovanniwsn 0:7c9e8aaa85d4 70 buf_rx[count_rx%sizeof(buf_rx)] = xbee->getc();
giovanniwsn 0:7c9e8aaa85d4 71 count_rx++;
giovanniwsn 0:7c9e8aaa85d4 72 }
giovanniwsn 0:7c9e8aaa85d4 73 }
giovanniwsn 0:7c9e8aaa85d4 74
giovanniwsn 0:7c9e8aaa85d4 75 /* Envia pacote do buffer_tx */
giovanniwsn 0:7c9e8aaa85d4 76 void XBEE::sendBuffer(void)
giovanniwsn 0:7c9e8aaa85d4 77 {
giovanniwsn 0:7c9e8aaa85d4 78 if(xbee->writeable()) {
giovanniwsn 0:7c9e8aaa85d4 79 for(int i = 0; i < count_tx; i++) {
giovanniwsn 0:7c9e8aaa85d4 80 xbee->putc(buf_tx[i]);
giovanniwsn 0:7c9e8aaa85d4 81 }
giovanniwsn 0:7c9e8aaa85d4 82 //pode zerar pacote aqui
giovanniwsn 0:7c9e8aaa85d4 83 }
giovanniwsn 0:7c9e8aaa85d4 84 }
giovanniwsn 0:7c9e8aaa85d4 85
giovanniwsn 0:7c9e8aaa85d4 86 /* Cria pacote de mensagem */
giovanniwsn 0:7c9e8aaa85d4 87 //int XBEE::create_TX(char * str, int dest)
giovanniwsn 0:7c9e8aaa85d4 88 int XBEE::create_TX(char * str)
giovanniwsn 0:7c9e8aaa85d4 89 {
giovanniwsn 0:7c9e8aaa85d4 90 int i = 0;
giovanniwsn 0:7c9e8aaa85d4 91 int n = strlen(str);
giovanniwsn 0:7c9e8aaa85d4 92 uint8_t count = 0;
giovanniwsn 0:7c9e8aaa85d4 93
giovanniwsn 0:7c9e8aaa85d4 94 pkt_tx *p = (pkt_tx *) buf_tx; // ponteiro para buffer global
giovanniwsn 0:7c9e8aaa85d4 95
giovanniwsn 0:7c9e8aaa85d4 96
giovanniwsn 0:7c9e8aaa85d4 97 if(n > 92) {
giovanniwsn 0:7c9e8aaa85d4 98 // Error: data nao pode exceder 92 bytes
giovanniwsn 0:7c9e8aaa85d4 99 return -1;
giovanniwsn 0:7c9e8aaa85d4 100 }
giovanniwsn 0:7c9e8aaa85d4 101
giovanniwsn 0:7c9e8aaa85d4 102 count_tx = 0;
giovanniwsn 0:7c9e8aaa85d4 103 memset(&buf_tx,0,sizeof(buf_tx));
giovanniwsn 0:7c9e8aaa85d4 104
giovanniwsn 0:7c9e8aaa85d4 105 p->start_delimiter = 0x7E;
giovanniwsn 0:7c9e8aaa85d4 106 p->length = 0x0E + n; // pacote vazio + dados
giovanniwsn 0:7c9e8aaa85d4 107 p->frame_type = 0x10; // transmit request
giovanniwsn 0:7c9e8aaa85d4 108 p->frame_id = 1;
giovanniwsn 0:7c9e8aaa85d4 109
giovanniwsn 0:7c9e8aaa85d4 110 //if(dest == XBEE_COORD) {
giovanniwsn 0:7c9e8aaa85d4 111 p->dest_addr64[6] = 0x00; //SL_H
giovanniwsn 0:7c9e8aaa85d4 112 p->dest_addr64[7] = 0x00; //SL_L
giovanniwsn 0:7c9e8aaa85d4 113 /*} else if(dest == XBEE_BROAD) {
giovanniwsn 0:7c9e8aaa85d4 114 p->dest_addr64[6] = 0xFF; //SL_H
giovanniwsn 0:7c9e8aaa85d4 115 p->dest_addr64[7] = 0xFF; //SL_L
giovanniwsn 0:7c9e8aaa85d4 116 } else {
giovanniwsn 0:7c9e8aaa85d4 117 p->dest_addr64[0] = 0x00;
giovanniwsn 0:7c9e8aaa85d4 118 p->dest_addr64[1] = 0x13;
giovanniwsn 0:7c9e8aaa85d4 119 p->dest_addr64[2] = 0xA2;
giovanniwsn 0:7c9e8aaa85d4 120 p->dest_addr64[3] = 0x00;
giovanniwsn 0:7c9e8aaa85d4 121
giovanniwsn 0:7c9e8aaa85d4 122 p->dest_addr64[4] = (dest >> 24);
giovanniwsn 0:7c9e8aaa85d4 123 p->dest_addr64[5] = (dest & 0x00FF0000) >> 16;
giovanniwsn 0:7c9e8aaa85d4 124 p->dest_addr64[6] = (dest & 0x0000FF00) >> 8;
giovanniwsn 0:7c9e8aaa85d4 125 p->dest_addr64[7] = (dest & 0x000000FF);
giovanniwsn 0:7c9e8aaa85d4 126 } */
giovanniwsn 0:7c9e8aaa85d4 127 p->dest_addr16[0] = 0xFF; //MY_H
giovanniwsn 0:7c9e8aaa85d4 128 p->dest_addr16[1] = 0xFF; //MY_L
giovanniwsn 0:7c9e8aaa85d4 129
giovanniwsn 0:7c9e8aaa85d4 130 memcpy(&p->rf_data, str, n);
giovanniwsn 0:7c9e8aaa85d4 131
giovanniwsn 0:7c9e8aaa85d4 132 // Calcula Checksum
giovanniwsn 0:7c9e8aaa85d4 133
giovanniwsn 0:7c9e8aaa85d4 134 // comeca 3 pra frente, tenq passar 3 adiante no final
giovanniwsn 0:7c9e8aaa85d4 135 // para ler o mesmo tamanho de pacote
giovanniwsn 0:7c9e8aaa85d4 136 for(i = 3; i < p->length + 3; i++) {
giovanniwsn 0:7c9e8aaa85d4 137 count += buf_tx[i];
giovanniwsn 0:7c9e8aaa85d4 138 //printf("\n%d\n", count);
giovanniwsn 0:7c9e8aaa85d4 139 }
giovanniwsn 0:7c9e8aaa85d4 140 count = 0xFF - count;
giovanniwsn 0:7c9e8aaa85d4 141
giovanniwsn 0:7c9e8aaa85d4 142 p->rf_data[n] = count;
giovanniwsn 0:7c9e8aaa85d4 143
giovanniwsn 0:7c9e8aaa85d4 144 //p->length tem o tamanho soh do frame,
giovanniwsn 0:7c9e8aaa85d4 145 //pacote total eh o starter + length alto + length baixo + checksum
giovanniwsn 0:7c9e8aaa85d4 146 count_tx = p->length + 4;
giovanniwsn 0:7c9e8aaa85d4 147 return count_tx;
giovanniwsn 0:7c9e8aaa85d4 148 }
giovanniwsn 0:7c9e8aaa85d4 149
giovanniwsn 0:7c9e8aaa85d4 150 /* Active or Desactive Serial RX */
giovanniwsn 0:7c9e8aaa85d4 151 /*
giovanniwsn 0:7c9e8aaa85d4 152 void XBEE::read_active(uint8_t val){
giovanniwsn 0:7c9e8aaa85d4 153 serial_RX_ctrl = val;
giovanniwsn 0:7c9e8aaa85d4 154 }*/
giovanniwsn 0:7c9e8aaa85d4 155
giovanniwsn 0:7c9e8aaa85d4 156 /* Printa todo o buffer de Receive, e limpa */
giovanniwsn 0:7c9e8aaa85d4 157 /*
giovanniwsn 0:7c9e8aaa85d4 158 void XBEE::printBuffer(void)
giovanniwsn 0:7c9e8aaa85d4 159 {
giovanniwsn 0:7c9e8aaa85d4 160 char flag_msg = 0;
giovanniwsn 0:7c9e8aaa85d4 161 int size = sizeof(buf_rx);
giovanniwsn 0:7c9e8aaa85d4 162 if(count_rx < size) {
giovanniwsn 0:7c9e8aaa85d4 163 size = count_rx;
giovanniwsn 0:7c9e8aaa85d4 164 }
giovanniwsn 0:7c9e8aaa85d4 165 for(int i = 0; i < size; i++) {
giovanniwsn 0:7c9e8aaa85d4 166 printf("%c", buf_rx[i]);
giovanniwsn 0:7c9e8aaa85d4 167 flag_msg++;
giovanniwsn 0:7c9e8aaa85d4 168 }
giovanniwsn 0:7c9e8aaa85d4 169 if (flag_msg) {
giovanniwsn 0:7c9e8aaa85d4 170 printf("\n");
giovanniwsn 0:7c9e8aaa85d4 171 }
giovanniwsn 0:7c9e8aaa85d4 172
giovanniwsn 0:7c9e8aaa85d4 173 //Limpa buffer
giovanniwsn 0:7c9e8aaa85d4 174 count_rx = 0;
giovanniwsn 0:7c9e8aaa85d4 175 memset(&buf_rx,0,sizeof(buf_rx));
giovanniwsn 0:7c9e8aaa85d4 176 }
giovanniwsn 0:7c9e8aaa85d4 177 */
giovanniwsn 0:7c9e8aaa85d4 178
giovanniwsn 0:7c9e8aaa85d4 179 // Verify Packet Checksum return 0 if msg OK, just work with Transmit Package
giovanniwsn 0:7c9e8aaa85d4 180 /*
giovanniwsn 0:7c9e8aaa85d4 181 char XBEE::validPackage(uint8_t * buf, int tam)
giovanniwsn 0:7c9e8aaa85d4 182 {
giovanniwsn 0:7c9e8aaa85d4 183 int i = 0;
giovanniwsn 0:7c9e8aaa85d4 184 uint8_t count = 0;
giovanniwsn 0:7c9e8aaa85d4 185
giovanniwsn 0:7c9e8aaa85d4 186 if(buf[0] != 0x7E) return 1;
giovanniwsn 0:7c9e8aaa85d4 187 if(buf[1] != 0) return 2;
giovanniwsn 0:7c9e8aaa85d4 188 if(buf[2] != tam-4) return 3;
giovanniwsn 0:7c9e8aaa85d4 189
giovanniwsn 0:7c9e8aaa85d4 190 for(i = 3; i < tam; i++) {
giovanniwsn 0:7c9e8aaa85d4 191 count += buf[i];
giovanniwsn 0:7c9e8aaa85d4 192 }
giovanniwsn 0:7c9e8aaa85d4 193 if(count != 0xFF) return 4;
giovanniwsn 0:7c9e8aaa85d4 194
giovanniwsn 0:7c9e8aaa85d4 195 return 0; // OK
giovanniwsn 0:7c9e8aaa85d4 196 }
giovanniwsn 0:7c9e8aaa85d4 197 */