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:
2:10c60edc8573
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 04 15:31:12 2016 +0000
@@ -0,0 +1,117 @@
+// Inspired from BlueSaab
+// Project/Hardware: http://bluesaab.blogspot.com/
+// Code: https://github.com/kveilands/SAAB-CDC/tree/master/SAAB-CDC
+// I-Bus information from http://pikkupossu.1g.fi/tomi/projects/i-bus/i-bus.html
+
+#include "mbed.h"
+#include "CDC.h"
+#include "RN52.h"
+
+CDC cdc;
+RN52 rn52;
+RN52_RESULT res;
+
+Timer playback;
+
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+int main() {
+    printf("Petters BT CDC-emulator\r\n");
+    printf("Initializing\r\n");
+    cdc.init();
+    rn52.init();
+    printf("Starting loop\r\n");
+    playback.start(); //only for debug
+    while(1) {
+        if(pc.readable()) {
+            switch (pc.getc()) {
+                case 'p':
+                    if(rn52.set(RN52_PLAYPAUSE)) {
+                        printf("play/pause\r\n");
+                    }
+                    break;
+                case 'v':
+                    printf("volume up\r\n");
+                    rn52.set(RN52_VOLUMEUP);
+                    break;             
+                case 'n':
+                    printf("next track\r\n");
+                    rn52.set(RN52_NEXTTRACK);
+                    break;  
+                case 'q':
+                    printf("getting status\r\n");
+                    rn52.get(RN52_GETSTATUS, &res);
+                    printf("%s", res.response);
+                case 't':
+                    rn52.get(RN52_CALLER_ID, &res);
+                    printf("%s", res.response);
+            }
+        }
+        cdc.set_time((char)(((int)playback.read())/60),(char)(((int)playback.read())%60));
+        switch (cdc.get_cmd()) {
+            case IBUS_OTHER_MESSAGE:
+                break;
+            case IBUS_DOORS_LOCKED:
+                break;
+            case IBUS_DOORS_UNLOCKED:
+                break;
+            case IBUS_NEXT:
+                cdc.display("NEXT");
+                rn52.set(RN52_PLAYPAUSE);
+                break;
+            case IBUS_CDC_ON:
+                cdc.display("CDC ON");
+                break;
+            case IBUS_CDC_OFF:
+                cdc.display("CDC OFF");
+                break;
+            case IBUS_VOLUME_UP:
+                cdc.display("VOLUME UP");
+                rn52.set(RN52_VOLUMEUP);
+                break;
+            case IBUS_VOLUME_DOWN:
+                cdc.display("VOLUME DOWN");
+                break;
+            case IBUS_SKIP_FW:
+                cdc.display("SKIP FW");
+                rn52.set(RN52_NEXTTRACK);
+                break;
+            case IBUS_SKIP_BW:
+                cdc.display("SKIP BW");
+                rn52.set(RN52_PREVTRACK);
+                break;
+            case IBUS_SET:
+                cdc.display("SET");
+                rn52.set(RN52_CONNECT);
+                break;
+            case IBUS_CLEAR:
+                cdc.display("CLEAR");
+                rn52.set(RN52_DISCONNECT);
+                break;
+        }
+        if(rn52.changed()) {
+            rn52.get(RN52_GETSTATUS, &res);
+            switch (res.event) {
+                case RN52_CALLER_ID_EVENT:
+                    rn52.get(RN52_CALLER_ID, &res);
+                    break;
+                case RN52_TRACK_CHANGE_EVENT:
+                    rn52.get(RN52_TRACK_METADATA, &res);
+                    playback.reset();
+                    break;
+                default: //no event occured, check connection status
+                    if(res.connection == RN52_AUDIO_STREAMING) {
+                        cdc.display("BT SPELAR");
+                        playback.start();
+                    }
+                    else {
+                        playback.stop();
+                        playback.reset();
+                    }
+                    
+            }
+            
+        }
+    }
+}
\ No newline at end of file