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

Committer:
petter
Date:
Mon Jan 04 23:36:50 2016 +0000
Revision:
2:10c60edc8573
Parent:
0:6cf6e566c0da
Child:
3:b76c74783d0d
Moved elapsed time timer into CDC; Fixed RN52 status interpretation (ascii hex -> int)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
petter 0:6cf6e566c0da 1 // Inspired from BlueSaab
petter 0:6cf6e566c0da 2 // Project/Hardware: http://bluesaab.blogspot.com/
petter 0:6cf6e566c0da 3 // Code: https://github.com/kveilands/SAAB-CDC/tree/master/SAAB-CDC
petter 0:6cf6e566c0da 4 // I-Bus information from http://pikkupossu.1g.fi/tomi/projects/i-bus/i-bus.html
petter 0:6cf6e566c0da 5
petter 0:6cf6e566c0da 6 #include "mbed.h"
petter 0:6cf6e566c0da 7 #include "CDC.h"
petter 0:6cf6e566c0da 8 #include "RN52.h"
petter 0:6cf6e566c0da 9
petter 0:6cf6e566c0da 10 CDC cdc;
petter 0:6cf6e566c0da 11 RN52 rn52;
petter 0:6cf6e566c0da 12 RN52_RESULT res;
petter 0:6cf6e566c0da 13
petter 0:6cf6e566c0da 14 Serial pc(USBTX, USBRX); // tx, rx
petter 0:6cf6e566c0da 15
petter 0:6cf6e566c0da 16 int main() {
petter 0:6cf6e566c0da 17 printf("Petters BT CDC-emulator\r\n");
petter 0:6cf6e566c0da 18 printf("Initializing\r\n");
petter 0:6cf6e566c0da 19 cdc.init();
petter 0:6cf6e566c0da 20 rn52.init();
petter 0:6cf6e566c0da 21 printf("Starting loop\r\n");
petter 0:6cf6e566c0da 22 while(1) {
petter 2:10c60edc8573 23 //Debug connection to PC
petter 0:6cf6e566c0da 24 if(pc.readable()) {
petter 0:6cf6e566c0da 25 switch (pc.getc()) {
petter 0:6cf6e566c0da 26 case 'p':
petter 0:6cf6e566c0da 27 if(rn52.set(RN52_PLAYPAUSE)) {
petter 0:6cf6e566c0da 28 printf("play/pause\r\n");
petter 0:6cf6e566c0da 29 }
petter 0:6cf6e566c0da 30 break;
petter 0:6cf6e566c0da 31 case 'v':
petter 0:6cf6e566c0da 32 printf("volume up\r\n");
petter 0:6cf6e566c0da 33 rn52.set(RN52_VOLUMEUP);
petter 0:6cf6e566c0da 34 break;
petter 0:6cf6e566c0da 35 case 'n':
petter 0:6cf6e566c0da 36 printf("next track\r\n");
petter 0:6cf6e566c0da 37 rn52.set(RN52_NEXTTRACK);
petter 0:6cf6e566c0da 38 break;
petter 0:6cf6e566c0da 39 case 'q':
petter 0:6cf6e566c0da 40 printf("getting status\r\n");
petter 0:6cf6e566c0da 41 rn52.get(RN52_GETSTATUS, &res);
petter 0:6cf6e566c0da 42 printf("%s", res.response);
petter 2:10c60edc8573 43 break;
petter 0:6cf6e566c0da 44 case 't':
petter 0:6cf6e566c0da 45 rn52.get(RN52_CALLER_ID, &res);
petter 0:6cf6e566c0da 46 printf("%s", res.response);
petter 2:10c60edc8573 47 break;
petter 2:10c60edc8573 48 case 'e':
petter 2:10c60edc8573 49 cdc.start_elapsed_time();
petter 2:10c60edc8573 50 break;
petter 0:6cf6e566c0da 51 }
petter 0:6cf6e566c0da 52 }
petter 0:6cf6e566c0da 53 switch (cdc.get_cmd()) {
petter 0:6cf6e566c0da 54 case IBUS_OTHER_MESSAGE:
petter 0:6cf6e566c0da 55 break;
petter 0:6cf6e566c0da 56 case IBUS_DOORS_LOCKED:
petter 0:6cf6e566c0da 57 break;
petter 0:6cf6e566c0da 58 case IBUS_DOORS_UNLOCKED:
petter 0:6cf6e566c0da 59 break;
petter 0:6cf6e566c0da 60 case IBUS_NEXT:
petter 0:6cf6e566c0da 61 cdc.display("NEXT");
petter 0:6cf6e566c0da 62 rn52.set(RN52_PLAYPAUSE);
petter 0:6cf6e566c0da 63 break;
petter 0:6cf6e566c0da 64 case IBUS_CDC_ON:
petter 0:6cf6e566c0da 65 cdc.display("CDC ON");
petter 0:6cf6e566c0da 66 break;
petter 0:6cf6e566c0da 67 case IBUS_CDC_OFF:
petter 0:6cf6e566c0da 68 cdc.display("CDC OFF");
petter 0:6cf6e566c0da 69 break;
petter 0:6cf6e566c0da 70 case IBUS_VOLUME_UP:
petter 0:6cf6e566c0da 71 cdc.display("VOLUME UP");
petter 0:6cf6e566c0da 72 rn52.set(RN52_VOLUMEUP);
petter 0:6cf6e566c0da 73 break;
petter 0:6cf6e566c0da 74 case IBUS_VOLUME_DOWN:
petter 0:6cf6e566c0da 75 cdc.display("VOLUME DOWN");
petter 0:6cf6e566c0da 76 break;
petter 0:6cf6e566c0da 77 case IBUS_SKIP_FW:
petter 0:6cf6e566c0da 78 cdc.display("SKIP FW");
petter 0:6cf6e566c0da 79 rn52.set(RN52_NEXTTRACK);
petter 0:6cf6e566c0da 80 break;
petter 0:6cf6e566c0da 81 case IBUS_SKIP_BW:
petter 0:6cf6e566c0da 82 cdc.display("SKIP BW");
petter 0:6cf6e566c0da 83 rn52.set(RN52_PREVTRACK);
petter 0:6cf6e566c0da 84 break;
petter 0:6cf6e566c0da 85 case IBUS_SET:
petter 0:6cf6e566c0da 86 cdc.display("SET");
petter 0:6cf6e566c0da 87 rn52.set(RN52_CONNECT);
petter 0:6cf6e566c0da 88 break;
petter 0:6cf6e566c0da 89 case IBUS_CLEAR:
petter 0:6cf6e566c0da 90 cdc.display("CLEAR");
petter 0:6cf6e566c0da 91 rn52.set(RN52_DISCONNECT);
petter 0:6cf6e566c0da 92 break;
petter 0:6cf6e566c0da 93 }
petter 0:6cf6e566c0da 94 if(rn52.changed()) {
petter 2:10c60edc8573 95 printf("got RN52 event\r\n");
petter 0:6cf6e566c0da 96 rn52.get(RN52_GETSTATUS, &res);
petter 2:10c60edc8573 97 printf("raw: %s",res.response);
petter 2:10c60edc8573 98 printf("event: %i\r\n", res.event);
petter 2:10c60edc8573 99 printf("connection: %i\r\n", res.connection);
petter 2:10c60edc8573 100 printf("media_profile: %i\r\n", res.media_connected);
petter 2:10c60edc8573 101 printf("phone_profile: %i\r\n", res.phone_connected);
petter 0:6cf6e566c0da 102 switch (res.event) {
petter 0:6cf6e566c0da 103 case RN52_CALLER_ID_EVENT:
petter 0:6cf6e566c0da 104 rn52.get(RN52_CALLER_ID, &res);
petter 0:6cf6e566c0da 105 break;
petter 0:6cf6e566c0da 106 case RN52_TRACK_CHANGE_EVENT:
petter 0:6cf6e566c0da 107 rn52.get(RN52_TRACK_METADATA, &res);
petter 2:10c60edc8573 108 cdc.reset_elapsed_time();
petter 0:6cf6e566c0da 109 break;
petter 2:10c60edc8573 110 case RN52_NO_EVENT: //no event occured, check connection status
petter 0:6cf6e566c0da 111 if(res.connection == RN52_AUDIO_STREAMING) {
petter 0:6cf6e566c0da 112 cdc.display("BT SPELAR");
petter 2:10c60edc8573 113 cdc.start_elapsed_time();
petter 0:6cf6e566c0da 114 }
petter 0:6cf6e566c0da 115 else {
petter 2:10c60edc8573 116 cdc.stop_elapsed_time();
petter 2:10c60edc8573 117 cdc.reset_elapsed_time();
petter 0:6cf6e566c0da 118 }
petter 0:6cf6e566c0da 119
petter 0:6cf6e566c0da 120 }
petter 0:6cf6e566c0da 121
petter 0:6cf6e566c0da 122 }
petter 0:6cf6e566c0da 123 }
petter 0:6cf6e566c0da 124 }