mbed library to connect to rfduino

Dependents:   RFDuino_example

RFDuino.cpp

Committer:
dbarbi1
Date:
2014-01-07
Revision:
2:effa15a46f51
Parent:
0:af5f495861b2
Child:
3:aac9193b7fd3

File content as of revision 2:effa15a46f51:

#include "RFDuino.h"

/** RFDuino is used for connecting an mbed to rfduino
 * 
 */
 
//Commands
#define HANDSHAKE  0x11
#define CONNECTED  0x22 
#define TRANSMIT   0x33
#define RECEIVE    0x44

/** Initializes RFDuino. Configures Pins tx and rx for serial communication
 * and creats associated ISR
 */
RFDuino::RFDuino(PinName tx, PinName rx): rfd(tx,rx)    {
    //init
        dataFlag=false;
        //attach Serial isr
        rfd.attach(this, &RFDuino::receive_isr);
}



   /** handshake()
         *
         * @returns
         *   1 on succesfull RFDuino serial reply to Handshake command
         *   0 on unsuccesfull RFDuino serial reply to Handshake command
         */
bool RFDuino::handshake()   {
    unsigned char temp = 0;
    __disable_irq();

    rfd.putc(HANDSHAKE);
    wait(0.1);
    if(rfd.readable())  {
            temp = rfd.getc();
    }
    __enable_irq();
    if(temp) { return 1;} 
            else { return 0;};


}

   /** dataReady()
         *
         * @returns
         *   1 if RFDuino has unread data
         *   0 if RFDuino does not have unread data
         */
bool RFDuino::dataReady()   {
    return dataFlag;
}

   /** isConnected()
         *
         * @returns
         *   1 if the RFDuino has made a successful Bluetooth Connection
         *   0 if the RFDuino has not made a successful Bluetooth Connection
         */
bool RFDuino::isConnected() {
    unsigned char temp;
    __disable_irq();
    
    rfd.putc(CONNECTED);
    temp = rfd.getc();
    
  __enable_irq();
    return temp;
}




   /** transmit(buff, len)
         *
         * @param buff pointer to a byte buffer
         * @param len length of byte buffer to transmit
         */
void RFDuino::transmit(unsigned char* buff, int len)    {
    int i;
    __disable_irq();
    
    //send command
    rfd.putc(TRANSMIT);
    rfd.putc((unsigned char)len);
    for(i=0;i<len;i++)  {
        rfd.putc(buff[i]);
    }
    
    __enable_irq();
}

   /** copyData(buff, size)
         *
         * @param buff pointer to a byte buffer
         * @param size size of buffer to copy data into
         * 
         * @return size of data in RFDuino buffer
         */
int RFDuino::copyData(unsigned char* buff, int size)    {
    
    __disable_irq();
    memcpy(buff, data.buff, size/*data.len*/);
    __enable_irq();
    dataFlag = false;
    
    return data.len;
}

   /** receiv_isr
         *Serial ISR. Checks for Receive command, and reads data into buffer
         */
void RFDuino::receive_isr() {
    
    if(rfd.getc() == RECEIVE)   {
        data.len = (int)rfd.getc();
        for(int i=0;i<data.len;i++) {
            data.buff[i] = rfd.getc();
        }
        
        dataFlag=true;
    } else  {
    //we dont know this command, read and disregard
        while(rfd.readable())   {
            rfd.getc();
        }
    }
    
}