library for Bluetooth Shield from Seeed Studio

Fork of BluetoothSerial by Yihui Xiong

BluetoothSerial.cpp

Committer:
yihui
Date:
2014-02-20
Revision:
0:f56002898ee8

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");
}