Components / BluetoothSerial

Dependents:   Shield_Seeed_Bluetooth

Fork of BluetoothSerial by Yihui Xiong

Committer:
screamer
Date:
Fri Jul 25 10:25:45 2014 +0000
Revision:
1:cf4d7779d9d6
Parent:
0:f56002898ee8
Add param to setup for baud speed;; Add pin() method to change the pin;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:f56002898ee8 1 #include "BluetoothSerial.h"
yihui 0:f56002898ee8 2 #include <string.h>
yihui 0:f56002898ee8 3
yihui 0:f56002898ee8 4 #define LOG(args...) // std::printf(args)
yihui 0:f56002898ee8 5
yihui 0:f56002898ee8 6 BluetoothSerial::BluetoothSerial(PinName tx, PinName rx) : _serial(tx, rx)
yihui 0:f56002898ee8 7 {
yihui 0:f56002898ee8 8
yihui 0:f56002898ee8 9 }
yihui 0:f56002898ee8 10
yihui 0:f56002898ee8 11 void BluetoothSerial::setup()
yihui 0:f56002898ee8 12 {
yihui 0:f56002898ee8 13 _serial.baud(BLUETOOTH_SERIAL_DEFAULT_BAUD);
yihui 0:f56002898ee8 14 }
yihui 0:f56002898ee8 15
screamer 1:cf4d7779d9d6 16 void BluetoothSerial::setup(int baud)
screamer 1:cf4d7779d9d6 17 {
screamer 1:cf4d7779d9d6 18 _serial.baud(baud);
screamer 1:cf4d7779d9d6 19 }
screamer 1:cf4d7779d9d6 20
yihui 0:f56002898ee8 21
yihui 0:f56002898ee8 22 void BluetoothSerial::master(const char *name, uint8_t autoc)
yihui 0:f56002898ee8 23 {
yihui 0:f56002898ee8 24 _serial.puts("\r\n+STWMOD=1\r\n");
yihui 0:f56002898ee8 25 _serial.printf("\r\n+STNA=%s\r\n", name);
yihui 0:f56002898ee8 26 _serial.printf("\r\n+STAUTO=%d\r\n", autoc ? 1 : 0);
yihui 0:f56002898ee8 27 }
yihui 0:f56002898ee8 28
yihui 0:f56002898ee8 29
yihui 0:f56002898ee8 30 void BluetoothSerial::slave(const char *name, uint8_t autoc, uint8_t oaut)
yihui 0:f56002898ee8 31 {
yihui 0:f56002898ee8 32 _serial.puts("\r\n+STWMOD=0\r\n");
yihui 0:f56002898ee8 33 _serial.printf("\r\n+STNA=%s\r\n", name);
yihui 0:f56002898ee8 34 _serial.printf("\r\n+STOAUT=%d\r\n", oaut ? 1 : 0);
yihui 0:f56002898ee8 35 _serial.printf("\r\n+STAUTO=%d\r\n", autoc ? 1 : 0);
yihui 0:f56002898ee8 36 }
yihui 0:f56002898ee8 37
screamer 1:cf4d7779d9d6 38 void BluetoothSerial::pin(int pin)
screamer 1:cf4d7779d9d6 39 {
screamer 1:cf4d7779d9d6 40 _serial.puts("\r\n+STWMOD=0\r\n");
screamer 1:cf4d7779d9d6 41 _serial.printf("\r\n+STPIN=%s\r\n", pin);
screamer 1:cf4d7779d9d6 42 }
screamer 1:cf4d7779d9d6 43
screamer 1:cf4d7779d9d6 44 void BluetoothSerial::pin(const char *pin)
screamer 1:cf4d7779d9d6 45 {
screamer 1:cf4d7779d9d6 46 _serial.puts("\r\n+STWMOD=0\r\n");
screamer 1:cf4d7779d9d6 47 _serial.printf("\r\n+STPIN=%s\r\n", pin);
screamer 1:cf4d7779d9d6 48 }
screamer 1:cf4d7779d9d6 49
yihui 0:f56002898ee8 50 int BluetoothSerial::connect()
yihui 0:f56002898ee8 51 {
yihui 0:f56002898ee8 52 clear();
yihui 0:f56002898ee8 53 _serial.puts("\r\n+INQ=1\r\n"); // Make the bluetooth module inquirable
yihui 0:f56002898ee8 54 LOG("BT: INQUIRING\r\n");
yihui 0:f56002898ee8 55
yihui 0:f56002898ee8 56 const char *prefix = "CONNECT:";
yihui 0:f56002898ee8 57 uint8_t prefix_len = sizeof("CONNECT:") - 1;
yihui 0:f56002898ee8 58 for (uint8_t i = 0; i < 12; i++) {
yihui 0:f56002898ee8 59 int len = readline(_buf, sizeof(_buf));
yihui 0:f56002898ee8 60 if (len > 0) {
yihui 0:f56002898ee8 61 LOG("%s\r\n", _buf);
yihui 0:f56002898ee8 62 if (!memcmp(_buf, prefix, prefix_len)) { // check prefix
yihui 0:f56002898ee8 63 const char *suffix = "OK";
yihui 0:f56002898ee8 64 uint8_t suffix_len = sizeof("OK") - 1;
yihui 0:f56002898ee8 65
yihui 0:f56002898ee8 66 if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
yihui 0:f56002898ee8 67 LOG("BT: CONNECTED\r\n");
yihui 0:f56002898ee8 68 return 1;
yihui 0:f56002898ee8 69 }
yihui 0:f56002898ee8 70
yihui 0:f56002898ee8 71 suffix = "FAIL";
yihui 0:f56002898ee8 72 suffix_len = sizeof("FAIL") - 1;
yihui 0:f56002898ee8 73
yihui 0:f56002898ee8 74 if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
yihui 0:f56002898ee8 75 return 0;
yihui 0:f56002898ee8 76 }
yihui 0:f56002898ee8 77 }
yihui 0:f56002898ee8 78 }
yihui 0:f56002898ee8 79 }
yihui 0:f56002898ee8 80
yihui 0:f56002898ee8 81 return 0;
yihui 0:f56002898ee8 82 }
yihui 0:f56002898ee8 83
yihui 0:f56002898ee8 84 int BluetoothSerial::connect(const char *name)
yihui 0:f56002898ee8 85 {
yihui 0:f56002898ee8 86 char *mac;
yihui 0:f56002898ee8 87 int name_len = strlen(name);
yihui 0:f56002898ee8 88
yihui 0:f56002898ee8 89 clear();
yihui 0:f56002898ee8 90 _serial.puts("\r\n+INQ=1\r\n");
yihui 0:f56002898ee8 91 LOG("BT: INQUERING\r\n");
yihui 0:f56002898ee8 92 while (1) {
yihui 0:f56002898ee8 93 int len = readline(_buf, sizeof(_buf)); // +RTINQ=XX,XX,X,X,X,X;DEVICE_NAME
yihui 0:f56002898ee8 94 if (len > 0) {
yihui 0:f56002898ee8 95 LOG("%s\r\n", _buf);
yihui 0:f56002898ee8 96 if (!memcmp(_buf, "+RTINQ=", sizeof("+RTINQ=") - 1)) { // check prefix
yihui 0:f56002898ee8 97
yihui 0:f56002898ee8 98 if (!memcmp(_buf + len - name_len, name, name_len)) { // check suffix
yihui 0:f56002898ee8 99 _buf[len - name_len - 1] = '\0';
yihui 0:f56002898ee8 100 mac = (char*)_buf + sizeof("+RTINQ=") - 1;
yihui 0:f56002898ee8 101 LOG("Connecting device: %s\r\n", mac);
yihui 0:f56002898ee8 102
yihui 0:f56002898ee8 103 break;
yihui 0:f56002898ee8 104 }
yihui 0:f56002898ee8 105 }
yihui 0:f56002898ee8 106 }
yihui 0:f56002898ee8 107 }
yihui 0:f56002898ee8 108
yihui 0:f56002898ee8 109 LOG("BT: CONNECTING\r\n");
yihui 0:f56002898ee8 110 _serial.printf("\r\n+CONN=%s\r\n", mac);
yihui 0:f56002898ee8 111
yihui 0:f56002898ee8 112 const char *prefix = "CONNECT:";
yihui 0:f56002898ee8 113 int prefix_len = sizeof("CONNECT:") - 1;
yihui 0:f56002898ee8 114 for (uint8_t i = 0; i < 6; i++) {
yihui 0:f56002898ee8 115 int len = readline(_buf, sizeof(_buf), 0);
yihui 0:f56002898ee8 116 if (len >= 0) {
yihui 0:f56002898ee8 117 LOG("%s\r\n", _buf);
yihui 0:f56002898ee8 118 if (!memcmp(_buf, prefix, prefix_len)) { // check prefix
yihui 0:f56002898ee8 119 const char *suffix = "OK";
yihui 0:f56002898ee8 120 uint8_t suffix_len = sizeof("OK") - 1;
yihui 0:f56002898ee8 121
yihui 0:f56002898ee8 122 if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
yihui 0:f56002898ee8 123 LOG("BT: CONNECTED\r\n");
yihui 0:f56002898ee8 124 return 1;
yihui 0:f56002898ee8 125 }
yihui 0:f56002898ee8 126
yihui 0:f56002898ee8 127 suffix = "FAIL";
yihui 0:f56002898ee8 128 suffix_len = sizeof("FAIL") - 1;
yihui 0:f56002898ee8 129
yihui 0:f56002898ee8 130 if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
yihui 0:f56002898ee8 131 LOG("TB: CONNECTION FAILED\r\n");
yihui 0:f56002898ee8 132 return 0;
yihui 0:f56002898ee8 133 }
yihui 0:f56002898ee8 134 }
yihui 0:f56002898ee8 135 }
yihui 0:f56002898ee8 136 }
yihui 0:f56002898ee8 137
yihui 0:f56002898ee8 138 return 0;
yihui 0:f56002898ee8 139 }
yihui 0:f56002898ee8 140
yihui 0:f56002898ee8 141
yihui 0:f56002898ee8 142 int BluetoothSerial::_getc()
yihui 0:f56002898ee8 143 {
yihui 0:f56002898ee8 144 return _serial.getc();
yihui 0:f56002898ee8 145 }
yihui 0:f56002898ee8 146
yihui 0:f56002898ee8 147 int BluetoothSerial::_putc(int c)
yihui 0:f56002898ee8 148 {
yihui 0:f56002898ee8 149 return _serial.putc(c);
yihui 0:f56002898ee8 150 }
yihui 0:f56002898ee8 151
yihui 0:f56002898ee8 152 int BluetoothSerial::readline(uint8_t *buf, int len, uint32_t timeout)
yihui 0:f56002898ee8 153 {
yihui 0:f56002898ee8 154 int get = 0;
yihui 0:f56002898ee8 155 int count = timeout;
yihui 0:f56002898ee8 156 while (count >= 0) {
yihui 0:f56002898ee8 157 if (_serial.readable()) {
yihui 0:f56002898ee8 158 char c = _serial.getc();
yihui 0:f56002898ee8 159 buf[get] = c;
yihui 0:f56002898ee8 160 if (c == '\n' && get && buf[get - 1] == '\r') {
yihui 0:f56002898ee8 161 buf[get - 1] = '\0';
yihui 0:f56002898ee8 162 return get - 1;
yihui 0:f56002898ee8 163 }
yihui 0:f56002898ee8 164 get++;
yihui 0:f56002898ee8 165 if (get >= len) {
yihui 0:f56002898ee8 166 LOG("Too long line, the buffer is not enough\r\n");
yihui 0:f56002898ee8 167 return -(get + 1);
yihui 0:f56002898ee8 168 }
screamer 1:cf4d7779d9d6 169
yihui 0:f56002898ee8 170 count = timeout;
yihui 0:f56002898ee8 171 }
yihui 0:f56002898ee8 172
yihui 0:f56002898ee8 173 if (timeout != 0) {
yihui 0:f56002898ee8 174 count--;
yihui 0:f56002898ee8 175 }
yihui 0:f56002898ee8 176 }
yihui 0:f56002898ee8 177
yihui 0:f56002898ee8 178 return -(get + 1);
yihui 0:f56002898ee8 179 }
yihui 0:f56002898ee8 180
yihui 0:f56002898ee8 181 void BluetoothSerial::clear()
yihui 0:f56002898ee8 182 {
yihui 0:f56002898ee8 183 int count = 0;
yihui 0:f56002898ee8 184
yihui 0:f56002898ee8 185 LOG("Clear previous command output\r\n");
yihui 0:f56002898ee8 186 do {
yihui 0:f56002898ee8 187 count++;
yihui 0:f56002898ee8 188 if (_serial.readable()) {
yihui 0:f56002898ee8 189 int get = _serial.getc();
yihui 0:f56002898ee8 190 count = 0;
yihui 0:f56002898ee8 191
yihui 0:f56002898ee8 192 LOG("%c", get);
yihui 0:f56002898ee8 193 }
yihui 0:f56002898ee8 194 } while (count < BLUETOOTH_SERIAL_TIMEOUT);
yihui 0:f56002898ee8 195 LOG("done\r\n");
yihui 0:f56002898ee8 196 }
yihui 0:f56002898ee8 197
yihui 0:f56002898ee8 198
yihui 0:f56002898ee8 199