Simulated the CD changer of a Saab to implement a bluetooth connection to the car stereo. Control of playback device (phone) with steering wheel buttons. Needs a RN52 bluetooth transciever and a CAN transiever. So far only audio playback and control via steering wheel buttons implemented. Hands free calling planned.
Diff: RN52.cpp
- Revision:
- 0:6cf6e566c0da
- Child:
- 1:63db3f3124d4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RN52.cpp Mon Jan 04 15:31:12 2016 +0000 @@ -0,0 +1,120 @@ +#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'; +} \ No newline at end of file