local fix version of myBlueUSB (http://mbed.org/users/networker/code/myBlueUSB/). - merge deleted files which are required to compile. - enable echo back of received data via RFCOMM.

Dependencies:   AvailableMemory FatFileSystem mbed myUSBHost

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers btserial.cpp Source File

btserial.cpp

00001 #include "btserial.h"
00002 
00003 btserial::btserial(char ba[6], char ch) {
00004     L2CAPAddr a;
00005     memcpy(&a.bdaddr, ba, 6);
00006     a.psm = ch;
00007     sendptr = 0;
00008     recptrin = 0;
00009     recptrout = bufsize - 1;
00010     free = bufsize;
00011     sock = Socket_Open(SOCKET_RFCOM, &a.hdr,  cb, this);
00012 }
00013 
00014 btserial::btserial(char ch) {
00015     sendptr = 0;
00016     recptrin = 0;
00017     recptrout = bufsize - 1;
00018     free = bufsize;
00019     sock = Socket_Listen(SOCKET_RFCOM, ch,  cb, this);
00020 }
00021 
00022 void btserial::cb(int socket, SocketState state, const unsigned char *data, int len, void* userData) {
00023     btserial *self = (btserial*)userData;
00024     if (state == SocketState_Open)
00025         if (len > 0)
00026             self->stash(data, len);
00027         else {
00028             //Socket_GetOpt(sock, SO_RECBUF, &recbufsize, sizeof(recbufsize));
00029             //Socket_GetOpt(sock, SO_SNDBUF, &sndbufsize, sizeof(sndbufsize));
00030             port_settings ps;//defaults are ok
00031             ps.baud = 3; //9600 baud
00032             ps.bits = 3;//8 bits
00033             ps.stop = 0;//1 bit
00034             ps.par = 0; //no parity
00035             ps.mask = MASK_BITRATE|MASK_DATABITS|MASK_STOPBITS|MASK_PARITYBITS;
00036             //set_remote_port_parameters(sock, &ps);
00037             self->open = true;
00038         }
00039         else if (state == SocketState_Closed)
00040           self->open = false;
00041 }
00042 
00043 void btserial::stash(const unsigned char *data, int len) {
00044     int i = 0;
00045     while (i < len && free>0) {
00046         recbuf[recptrin++] =  data[i++];
00047         if (recptrin == bufsize) recptrin = 0;
00048         free--;
00049     }
00050 }
00051 
00052 int btserial::getc() {
00053     if (free == bufsize || !open)
00054         return -1;
00055     free++;
00056     recptrout++;
00057     if (recptrout == bufsize) recptrout = 0;
00058     return recbuf[recptrout];
00059 }
00060 
00061 int btserial::putc(int c) {
00062     if (sendptr==bufsize || !open)
00063         return -1;
00064     sendbuf[sendptr++] = c;
00065     if (sendptr==bufsize || c=='\n' || c=='\r') {
00066         Socket_Send(sock, sendbuf, sendptr);
00067         sendptr = 0;
00068     }
00069     return c;
00070 }
00071 
00072 void btserial::baud(int br) {
00073     int rates[] = {2400,4800,7200,9600,19200,38400,57600,115200,230400};
00074     if (!open) return;
00075     for (int i = 0; i < sizeof(rates)/sizeof(int);i++)
00076         if (rates[i] == br) {
00077             port_settings ps;
00078             ps.baud = i;
00079             ps.mask = MASK_BITRATE;
00080             set_remote_port_parameters(sock, &ps);
00081             return;
00082         }
00083     printf("Illegal baudrate requested %d\n", br);
00084 }
00085 
00086 void btserial::format(int bits, Serial::Parity par, int stop) {
00087 if (!open) return;
00088     port_settings ps;
00089     ps.bits = bits-5;
00090     ps.stop = stop-1;
00091     switch (par) {
00092         case Serial::None:
00093             ps.par = 0;
00094             ps.par_t = 0;
00095             break;
00096         case Serial::Odd:
00097             ps.par = 1;
00098             ps.par_t = 0;
00099             break;
00100         case Serial::Even:
00101             ps.par = 1;
00102             ps.par_t = 1;
00103             break;
00104         case Serial::Forced0:
00105             ps.par = 1;
00106             ps.par_t = 3;
00107             break;
00108         case Serial::Forced1:
00109             ps.par = 1;
00110             ps.par_t = 2;
00111             break;
00112     }
00113     ps.mask = MASK_DATABITS|MASK_STOPBITS|MASK_PARITYBITS|MASK_PARITYTYPE;
00114     set_remote_port_parameters(sock, &ps);
00115 }
00116