Pulse Oximeter (NONIN) communicates with mbed via Bluetooth dongle and sends Heart Rate and Oxygen Saturation via GPRS module

Dependencies:   C12832 GPS GSM mbed

Fork of myBlueUSB_localfix by Nobuaki Aoki

btserial.cpp

Committer:
nobukuma
Date:
2013-12-07
Revision:
0:003889bc474f
Child:
3:55a622e3dbb5

File content as of revision 0:003889bc474f:

#include "btserial.h"

btserial::btserial(char ba[6], char ch) {
    L2CAPAddr a;
    memcpy(&a.bdaddr, ba, 6);
    a.psm = ch;
    sendptr = 0;
    recptrin = 0;
    recptrout = bufsize - 1;
    free = bufsize;
    sock = Socket_Open(SOCKET_RFCOM, &a.hdr,  cb, this);
}

btserial::btserial(char ch) {
    sendptr = 0;
    recptrin = 0;
    recptrout = bufsize - 1;
    free = bufsize;
    sock = Socket_Listen(SOCKET_RFCOM, ch,  cb, this);
}

void btserial::cb(int socket, SocketState state, const unsigned char *data, int len, void* userData) {
    btserial *self = (btserial*)userData;
    if (state == SocketState_Open)
        if (len > 0)
            self->stash(data, len);
        else {
            //Socket_GetOpt(sock, SO_RECBUF, &recbufsize, sizeof(recbufsize));
            //Socket_GetOpt(sock, SO_SNDBUF, &sndbufsize, sizeof(sndbufsize));
            port_settings ps;//defaults are ok
            ps.baud = 3; //9600 baud
            ps.bits = 3;//8 bits
            ps.stop = 0;//1 bit
            ps.par = 0; //no parity
            ps.mask = MASK_BITRATE|MASK_DATABITS|MASK_STOPBITS|MASK_PARITYBITS;
            //set_remote_port_parameters(sock, &ps);
            self->open = true;
        }
        else if (state == SocketState_Closed)
          self->open = false;
}

void btserial::stash(const unsigned char *data, int len) {
    int i = 0;
    while (i < len && free>0) {
        recbuf[recptrin++] =  data[i++];
        if (recptrin == bufsize) recptrin = 0;
        free--;
    }
}

int btserial::getc() {
    if (free == bufsize || !open)
        return -1;
    free++;
    recptrout++;
    if (recptrout == bufsize) recptrout = 0;
    return recbuf[recptrout];
}

int btserial::putc(int c) {
    if (sendptr==bufsize || !open)
        return -1;
    sendbuf[sendptr++] = c;
    if (sendptr==bufsize || c=='\n' || c=='\r') {
        Socket_Send(sock, sendbuf, sendptr);
        sendptr = 0;
    }
    return c;
}

void btserial::baud(int br) {
    int rates[] = {2400,4800,7200,9600,19200,38400,57600,115200,230400};
    if (!open) return;
    for (int i = 0; i < sizeof(rates)/sizeof(int);i++)
        if (rates[i] == br) {
            port_settings ps;
            ps.baud = i;
            ps.mask = MASK_BITRATE;
            set_remote_port_parameters(sock, &ps);
            return;
        }
    printf("Illegal baudrate requested %d\n", br);
}

void btserial::format(int bits, Serial::Parity par, int stop) {
if (!open) return;
    port_settings ps;
    ps.bits = bits-5;
    ps.stop = stop-1;
    switch (par) {
        case Serial::None:
            ps.par = 0;
            ps.par_t = 0;
            break;
        case Serial::Odd:
            ps.par = 1;
            ps.par_t = 0;
            break;
        case Serial::Even:
            ps.par = 1;
            ps.par_t = 1;
            break;
        case Serial::Forced0:
            ps.par = 1;
            ps.par_t = 3;
            break;
        case Serial::Forced1:
            ps.par = 1;
            ps.par_t = 2;
            break;
    }
    ps.mask = MASK_DATABITS|MASK_STOPBITS|MASK_PARITYBITS|MASK_PARITYTYPE;
    set_remote_port_parameters(sock, &ps);
}