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
btserial.cpp@13:327622e38551, 2011-07-01 (annotated)
- 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?
User | Revision | Line number | New 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 |