Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Shield_Seeed_Bluetooth
Fork of BluetoothSerial by
BluetoothSerial.cpp
- Committer:
- yihui
- Date:
- 2014-02-20
- Revision:
- 0:f56002898ee8
- Child:
- 1:cf4d7779d9d6
File content as of revision 0:f56002898ee8:
#include "BluetoothSerial.h"
#include <string.h>
#define LOG(args...) // std::printf(args)
BluetoothSerial::BluetoothSerial(PinName tx, PinName rx) : _serial(tx, rx)
{
}
void BluetoothSerial::setup()
{
_serial.baud(BLUETOOTH_SERIAL_DEFAULT_BAUD);
}
void BluetoothSerial::master(const char *name, uint8_t autoc)
{
_serial.puts("\r\n+STWMOD=1\r\n");
_serial.printf("\r\n+STNA=%s\r\n", name);
_serial.printf("\r\n+STAUTO=%d\r\n", autoc ? 1 : 0);
}
void BluetoothSerial::slave(const char *name, uint8_t autoc, uint8_t oaut)
{
_serial.puts("\r\n+STWMOD=0\r\n");
_serial.printf("\r\n+STNA=%s\r\n", name);
_serial.printf("\r\n+STOAUT=%d\r\n", oaut ? 1 : 0);
_serial.printf("\r\n+STAUTO=%d\r\n", autoc ? 1 : 0);
}
int BluetoothSerial::connect()
{
clear();
_serial.puts("\r\n+INQ=1\r\n"); // Make the bluetooth module inquirable
LOG("BT: INQUIRING\r\n");
const char *prefix = "CONNECT:";
uint8_t prefix_len = sizeof("CONNECT:") - 1;
for (uint8_t i = 0; i < 12; i++) {
int len = readline(_buf, sizeof(_buf));
if (len > 0) {
LOG("%s\r\n", _buf);
if (!memcmp(_buf, prefix, prefix_len)) { // check prefix
const char *suffix = "OK";
uint8_t suffix_len = sizeof("OK") - 1;
if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
LOG("BT: CONNECTED\r\n");
return 1;
}
suffix = "FAIL";
suffix_len = sizeof("FAIL") - 1;
if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
return 0;
}
}
}
}
return 0;
}
int BluetoothSerial::connect(const char *name)
{
char *mac;
int name_len = strlen(name);
clear();
_serial.puts("\r\n+INQ=1\r\n");
LOG("BT: INQUERING\r\n");
while (1) {
int len = readline(_buf, sizeof(_buf)); // +RTINQ=XX,XX,X,X,X,X;DEVICE_NAME
if (len > 0) {
LOG("%s\r\n", _buf);
if (!memcmp(_buf, "+RTINQ=", sizeof("+RTINQ=") - 1)) { // check prefix
if (!memcmp(_buf + len - name_len, name, name_len)) { // check suffix
_buf[len - name_len - 1] = '\0';
mac = (char*)_buf + sizeof("+RTINQ=") - 1;
LOG("Connecting device: %s\r\n", mac);
break;
}
}
}
}
LOG("BT: CONNECTING\r\n");
_serial.printf("\r\n+CONN=%s\r\n", mac);
const char *prefix = "CONNECT:";
int prefix_len = sizeof("CONNECT:") - 1;
for (uint8_t i = 0; i < 6; i++) {
int len = readline(_buf, sizeof(_buf), 0);
if (len >= 0) {
LOG("%s\r\n", _buf);
if (!memcmp(_buf, prefix, prefix_len)) { // check prefix
const char *suffix = "OK";
uint8_t suffix_len = sizeof("OK") - 1;
if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
LOG("BT: CONNECTED\r\n");
return 1;
}
suffix = "FAIL";
suffix_len = sizeof("FAIL") - 1;
if (!memcmp(_buf + prefix_len, suffix, suffix_len)) { // check suffix
LOG("TB: CONNECTION FAILED\r\n");
return 0;
}
}
}
}
return 0;
}
int BluetoothSerial::_getc()
{
return _serial.getc();
}
int BluetoothSerial::_putc(int c)
{
return _serial.putc(c);
}
int BluetoothSerial::readline(uint8_t *buf, int len, uint32_t timeout)
{
int get = 0;
int count = timeout;
while (count >= 0) {
if (_serial.readable()) {
char c = _serial.getc();
buf[get] = c;
if (c == '\n' && get && buf[get - 1] == '\r') {
buf[get - 1] = '\0';
return get - 1;
}
get++;
if (get >= len) {
LOG("Too long line, the buffer is not enough\r\n");
return -(get + 1);
}
count = timeout;
}
if (timeout != 0) {
count--;
}
}
return -(get + 1);
}
void BluetoothSerial::clear()
{
int count = 0;
LOG("Clear previous command output\r\n");
do {
count++;
if (_serial.readable()) {
int get = _serial.getc();
count = 0;
LOG("%c", get);
}
} while (count < BLUETOOTH_SERIAL_TIMEOUT);
LOG("done\r\n");
}
