XBEE code to reduce program size

Dependencies:   mbed

XBEE/XBEE.cpp

Committer:
giovanniwsn
Date:
2018-10-14
Revision:
0:7c9e8aaa85d4
Child:
1:b0c665b697c7

File content as of revision 0:7c9e8aaa85d4:

#include "XBEE.h"

/* Class constructor */
XBEE::XBEE(Serial* serial, int baud):xbee(serial)
{
    xbee->baud(baud);
    /* Enable the reception of bytes on the serial interface by providing a cb */
    xbee->attach(callback(this, &XBEE::recvAttach), Serial::RxIrq);
    init();
}

/* Initialize the Device XBEE */
void XBEE::init(void)
{
    count_tx = 0;
    count_rx = 0;
    memset(&buf_tx,0,sizeof(buf_tx));
    memset(&buf_rx,0,sizeof(buf_rx));
}

/* Send message to the destination */
//int XBEE::send_msg(char * str, int dest)
int XBEE::send_msg(char * str)
{
    int n = strlen(str);
    if(n > 92) {
        return -1;
    }
    //create_TX(str,dest);
    create_TX(str);
    sendBuffer();
    wait(0.2);
    return 0;
}

/* Receives a message, writes in str */
int XBEE::recv_msg(char * buf, int tam)
{
    pkt_tx *p;
    int i;
    int ptam = 0;
    int j = 0;
    
    memset(buf,0,tam);
    
    for(i = 0; i < count_rx; i++) {
        if(buf_rx[i] == 0x7E) {
            
            p = (pkt_tx *) &buf_rx[i];
            
            if(p->frame_type == 0x90) {
                ptam = p->length - 0x0C;
                if(tam < ptam + j) {
                    return -1;
                }
                // posicao aonde comeca a msg em um pacote de Receive
                memcpy(&buf[j], ((char *)(&p->broadcast_radius)), ptam);
                j += ptam;
            }
        }
    }
    return j;
}

/* Chamada por Interrupcao, RX */
void XBEE::recvAttach (void) 
{
    //if (serial_RX_ctrl == 1)
        while(xbee->readable()) {
            buf_rx[count_rx%sizeof(buf_rx)] = xbee->getc();
            count_rx++;
        }
}

/* Envia pacote do buffer_tx */
void XBEE::sendBuffer(void) 
{
    if(xbee->writeable()) {
        for(int i = 0; i < count_tx; i++) {
            xbee->putc(buf_tx[i]);
        }
        //pode zerar pacote aqui
    }
}

/* Cria pacote de mensagem */
//int XBEE::create_TX(char * str, int dest)
int XBEE::create_TX(char * str)
{
    int i = 0;
    int n = strlen(str);
    uint8_t count = 0;

    pkt_tx *p = (pkt_tx *) buf_tx; // ponteiro para buffer global
    

    if(n > 92) {
        // Error: data nao pode exceder 92 bytes
        return -1;
    }

    count_tx = 0;
    memset(&buf_tx,0,sizeof(buf_tx));

    p->start_delimiter = 0x7E;
    p->length = 0x0E + n;   // pacote vazio + dados
    p->frame_type = 0x10;   // transmit request
    p->frame_id = 1;

    //if(dest == XBEE_COORD) {
        p->dest_addr64[6] = 0x00;   //SL_H
        p->dest_addr64[7] = 0x00;   //SL_L
    /*} else if(dest == XBEE_BROAD) {
        p->dest_addr64[6] = 0xFF;   //SL_H
        p->dest_addr64[7] = 0xFF;   //SL_L
    } else {
        p->dest_addr64[0] = 0x00;
        p->dest_addr64[1] = 0x13;
        p->dest_addr64[2] = 0xA2;
        p->dest_addr64[3] = 0x00;
        
        p->dest_addr64[4] = (dest >> 24);
        p->dest_addr64[5] = (dest & 0x00FF0000) >> 16;
        p->dest_addr64[6] = (dest & 0x0000FF00) >> 8;
        p->dest_addr64[7] = (dest & 0x000000FF);
    } */
    p->dest_addr16[0] = 0xFF;   //MY_H
    p->dest_addr16[1] = 0xFF;   //MY_L
    
    memcpy(&p->rf_data, str, n);

    // Calcula Checksum

    // comeca 3 pra frente, tenq passar 3 adiante no final
    // para ler o mesmo tamanho de pacote
    for(i = 3; i < p->length + 3; i++) {
        count += buf_tx[i];
        //printf("\n%d\n", count);
    }
    count = 0xFF - count;

    p->rf_data[n] = count;

    //p->length tem o tamanho soh do frame, 
    //pacote total eh o starter + length alto + length baixo + checksum
    count_tx = p->length + 4;
    return count_tx;
}

/* Active or Desactive Serial RX */
/*
void XBEE::read_active(uint8_t val){
    serial_RX_ctrl = val;
}*/

/* Printa todo o buffer de Receive, e limpa */
/*
void XBEE::printBuffer(void) 
{
    char flag_msg = 0;
    int size = sizeof(buf_rx);
    if(count_rx < size) {
        size = count_rx;
    }
    for(int i = 0; i < size; i++) {
        printf("%c", buf_rx[i]);
        flag_msg++;
    }
    if (flag_msg) {
        printf("\n");
    }
    
    //Limpa buffer
    count_rx = 0;
    memset(&buf_rx,0,sizeof(buf_rx));
} 
*/

// Verify Packet Checksum return 0 if msg OK, just work with Transmit Package
/*
char XBEE::validPackage(uint8_t * buf, int tam) 
{
    int i = 0;
    uint8_t count = 0;
    
    if(buf[0] != 0x7E) return 1;
    if(buf[1] != 0) return 2;
    if(buf[2] != tam-4) return 3;
    
    for(i = 3; i < tam; i++) {
        count += buf[i];
    }
    if(count != 0xFF) return 4;
    
    return 0; // OK
}
*/