Petter Bellander / Mbed 2 deprecated Saab-BT

Dependencies:   mbed

RN52.cpp

Committer:
petter
Date:
2016-01-04
Revision:
0:6cf6e566c0da
Child:
1:63db3f3124d4

File content as of revision 0:6cf6e566c0da:

#include "RN52.h"
#include "mbed.h"

// RN52 action command definitions
#define PLAYPAUSE       "AP\r"
#define NEXTTRACK       "AT+\r"
#define PREVTRACK       "AT-\r"
#define CONNECT         "B\r"
#define DISCONNECT      "@,1\r"
#define REBOOT          "R,1\r"
#define VOLUMEUP        "AV+\r"
#define MAXVOLUME       "SS,0F\r"
#define GETSTATUS       "Q\r"
#define ASSISTANT       "P\r"
#define CALLER_ID       "T\r"
#define TRACK_METADATA  "AD\r"


Serial serial(p13, p14);  // tx, rx
DigitalIn event_pin(p20);

void RN52::init(){
    serial.baud(115200);
    printf("Serial baudrate set\r\n");
}

bool RN52::changed(){
    static bool last = 0;
    if(last != event_pin) {
        last = event_pin;
        return !event_pin;
    }
    last = event_pin;
    return 0;
}


bool RN52::set(RN52_COMMAND cmd){
    char response[40];
    switch (cmd) {
        case RN52_PLAYPAUSE:
            serial.printf(PLAYPAUSE);
            break;
        case RN52_NEXTTRACK:
            serial.printf(NEXTTRACK);
            break;
        case RN52_PREVTRACK:
            serial.printf(PREVTRACK);
            break;
        case RN52_CONNECT:
            serial.printf(CONNECT);
            break;
        case RN52_DISCONNECT:
            serial.printf(DISCONNECT);
            break;
        case RN52_REBOOT:
            serial.printf(REBOOT);
            break;
        case RN52_VOLUMEUP:
            serial.printf(VOLUMEUP);
            break;
        case RN52_MAXVOLUME:
            serial.printf(MAXVOLUME);
            break;
        case RN52_ASSISTANT:
            serial.printf(ASSISTANT);
            break;
        default:
            return false;
    }
    capture_response(response);
    return (response[0] == 'A');
}

bool RN52::get(RN52_COMMAND cmd, RN52_RESULT * result){
    switch (cmd) {
        case RN52_GETSTATUS:
            serial.printf(GETSTATUS);
            capture_response(result->response);
            result->media_connected = (result->response[0] & (1 << 2)) >> 2;
            result->phone_connected = (result->response[0] & (1 << 3)) >> 23;
            result->connection = (RN52_CONNECTION)(result->response[0] & 0x0F);
            if((result->response[0] & (1 << 4)) >> 4) {
                result->event = RN52_CALLER_ID_EVENT;
            }
            else if((result->response[0] & (1 << 5)) >> 5) {
                result->event = RN52_TRACK_CHANGE_EVENT;
            }
            else {
                result->event = RN52_NO_EVENT;
            }
            break;
        case RN52_CALLER_ID:
            serial.printf(CALLER_ID);
            capture_response(result->response);
            //parse the response
            break;
        case RN52_TRACK_METADATA:
            serial.printf(TRACK_METADATA);
            capture_response(result->response);
            //parse the response
        default:
            return 0;
    }
    return 1;
}


void RN52::capture_response(char * str){        
    char c = ' ';
    char n = 0;
    while(c != '\n') {
        if(serial.readable()) {
            c = serial.getc();
            str[n] = c;
            n++;
        }   
    }
    str[n] = '\0';
}