Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234

Dependencies:   mbed myUSBHost AvailableMemory

Dependents:   mbed_TANK_Kinect myBlueUSB_ros ftusbClass

Committer:
networker
Date:
Fri Jul 01 09:16:00 2011 +0000
Revision:
13:327622e38551
made some improvements to get massstorage functioning

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 13:327622e38551 1 #include "btserial.h"
networker 13:327622e38551 2
networker 13:327622e38551 3 btserial::btserial(char ba[6], char ch) {
networker 13:327622e38551 4 L2CAPAddr a;
networker 13:327622e38551 5 memcpy(&a.bdaddr, ba, 6);
networker 13:327622e38551 6 a.psm = ch;
networker 13:327622e38551 7 sendptr = 0;
networker 13:327622e38551 8 recptrin = 0;
networker 13:327622e38551 9 recptrout = bufsize - 1;
networker 13:327622e38551 10 free = bufsize;
networker 13:327622e38551 11 sock = Socket_Open(SOCKET_RFCOM, &a.hdr, cb, this);
networker 13:327622e38551 12 }
networker 13:327622e38551 13
networker 13:327622e38551 14 btserial::btserial(char ch) {
networker 13:327622e38551 15 sendptr = 0;
networker 13:327622e38551 16 recptrin = 0;
networker 13:327622e38551 17 recptrout = bufsize - 1;
networker 13:327622e38551 18 free = bufsize;
networker 13:327622e38551 19 sock = Socket_Listen(SOCKET_RFCOM, ch, cb, this);
networker 13:327622e38551 20 }
networker 13:327622e38551 21
networker 13:327622e38551 22 void btserial::cb(int socket, SocketState state, const unsigned char *data, int len, void* userData) {
networker 13:327622e38551 23 btserial *self = (btserial*)userData;
networker 13:327622e38551 24 if (state == SocketState_Open)
networker 13:327622e38551 25 if (len > 0)
networker 13:327622e38551 26 self->stash(data, len);
networker 13:327622e38551 27 else {
networker 13:327622e38551 28 //Socket_GetOpt(sock, SO_RECBUF, &recbufsize, sizeof(recbufsize));
networker 13:327622e38551 29 //Socket_GetOpt(sock, SO_SNDBUF, &sndbufsize, sizeof(sndbufsize));
networker 13:327622e38551 30 port_settings ps;//defaults are ok
networker 13:327622e38551 31 ps.baud = 3; //9600 baud
networker 13:327622e38551 32 ps.bits = 3;//8 bits
networker 13:327622e38551 33 ps.stop = 0;//1 bit
networker 13:327622e38551 34 ps.par = 0; //no parity
networker 13:327622e38551 35 ps.mask = MASK_BITRATE|MASK_DATABITS|MASK_STOPBITS|MASK_PARITYBITS;
networker 13:327622e38551 36 //set_remote_port_parameters(sock, &ps);
networker 13:327622e38551 37 self->open = true;
networker 13:327622e38551 38 }
networker 13:327622e38551 39 else if (state == SocketState_Closed)
networker 13:327622e38551 40 self->open = false;
networker 13:327622e38551 41 }
networker 13:327622e38551 42
networker 13:327622e38551 43 void btserial::stash(const unsigned char *data, int len) {
networker 13:327622e38551 44 int i = 0;
networker 13:327622e38551 45 while (i < len && free>0) {
networker 13:327622e38551 46 recbuf[recptrin++] = data[i++];
networker 13:327622e38551 47 if (recptrin == bufsize) recptrin = 0;
networker 13:327622e38551 48 free--;
networker 13:327622e38551 49 }
networker 13:327622e38551 50 }
networker 13:327622e38551 51
networker 13:327622e38551 52 int btserial::getc() {
networker 13:327622e38551 53 if (free == bufsize || !open)
networker 13:327622e38551 54 return -1;
networker 13:327622e38551 55 free++;
networker 13:327622e38551 56 recptrout++;
networker 13:327622e38551 57 if (recptrout == bufsize) recptrout = 0;
networker 13:327622e38551 58 return recbuf[recptrout];
networker 13:327622e38551 59 }
networker 13:327622e38551 60
networker 13:327622e38551 61 int btserial::putc(int c) {
networker 13:327622e38551 62 if (sendptr==bufsize || !open)
networker 13:327622e38551 63 return -1;
networker 13:327622e38551 64 sendbuf[sendptr++] = c;
networker 13:327622e38551 65 if (sendptr==bufsize || c=='\n' || c=='\r') {
networker 13:327622e38551 66 Socket_Send(sock, sendbuf, sendptr);
networker 13:327622e38551 67 sendptr = 0;
networker 13:327622e38551 68 }
networker 13:327622e38551 69 return c;
networker 13:327622e38551 70 }
networker 13:327622e38551 71
networker 13:327622e38551 72 void btserial::baud(int br) {
networker 13:327622e38551 73 int rates[] = {2400,4800,7200,9600,19200,38400,57600,115200,230400};
networker 13:327622e38551 74 if (!open) return;
networker 13:327622e38551 75 for (int i = 0; i < sizeof(rates)/sizeof(int);i++)
networker 13:327622e38551 76 if (rates[i] == br) {
networker 13:327622e38551 77 port_settings ps;
networker 13:327622e38551 78 ps.baud = i;
networker 13:327622e38551 79 ps.mask = MASK_BITRATE;
networker 13:327622e38551 80 set_remote_port_parameters(sock, &ps);
networker 13:327622e38551 81 return;
networker 13:327622e38551 82 }
networker 13:327622e38551 83 printf("Illegal baudrate requested %d\n", br);
networker 13:327622e38551 84 }
networker 13:327622e38551 85
networker 13:327622e38551 86 void btserial::format(int bits, Serial::Parity par, int stop) {
networker 13:327622e38551 87 if (!open) return;
networker 13:327622e38551 88 port_settings ps;
networker 13:327622e38551 89 ps.bits = bits-5;
networker 13:327622e38551 90 ps.stop = stop-1;
networker 13:327622e38551 91 switch (par) {
networker 13:327622e38551 92 case Serial::None:
networker 13:327622e38551 93 ps.par = 0;
networker 13:327622e38551 94 ps.par_t = 0;
networker 13:327622e38551 95 break;
networker 13:327622e38551 96 case Serial::Odd:
networker 13:327622e38551 97 ps.par = 1;
networker 13:327622e38551 98 ps.par_t = 0;
networker 13:327622e38551 99 break;
networker 13:327622e38551 100 case Serial::Even:
networker 13:327622e38551 101 ps.par = 1;
networker 13:327622e38551 102 ps.par_t = 1;
networker 13:327622e38551 103 break;
networker 13:327622e38551 104 case Serial::Forced0:
networker 13:327622e38551 105 ps.par = 1;
networker 13:327622e38551 106 ps.par_t = 3;
networker 13:327622e38551 107 break;
networker 13:327622e38551 108 case Serial::Forced1:
networker 13:327622e38551 109 ps.par = 1;
networker 13:327622e38551 110 ps.par_t = 2;
networker 13:327622e38551 111 break;
networker 13:327622e38551 112 }
networker 13:327622e38551 113 ps.mask = MASK_DATABITS|MASK_STOPBITS|MASK_PARITYBITS|MASK_PARITYTYPE;
networker 13:327622e38551 114 set_remote_port_parameters(sock, &ps);
networker 13:327622e38551 115 }
networker 13:327622e38551 116