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.

Dependencies:   mbed

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