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 11 20:49:59 2016 +0000
Revision:
5:8e468fef2754
Parent:
4:3041a571b7a7
Child:
6:c454f88524d6
Restructured main; Moved RN52 set commands into separate functions

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 5:8e468fef2754 16 void handle_pc_input() {
petter 5:8e468fef2754 17 //Debug connection to PC
petter 5:8e468fef2754 18 if(pc.readable()) {
petter 5:8e468fef2754 19 switch (pc.getc()) {
petter 5:8e468fef2754 20 case 'p':
petter 5:8e468fef2754 21 if(rn52.toggle_play()) {
petter 5:8e468fef2754 22 printf("play/pause\r\n");
petter 5:8e468fef2754 23 }
petter 5:8e468fef2754 24 break;
petter 5:8e468fef2754 25 case 'v':
petter 5:8e468fef2754 26 printf("volume up\r\n");
petter 5:8e468fef2754 27 rn52.maxvolume();
petter 5:8e468fef2754 28 break;
petter 5:8e468fef2754 29 case 'n':
petter 5:8e468fef2754 30 printf("next track\r\n");
petter 5:8e468fef2754 31 rn52.next_track();
petter 5:8e468fef2754 32 break;
petter 5:8e468fef2754 33 case 'q':
petter 5:8e468fef2754 34 printf("getting status\r\n");
petter 5:8e468fef2754 35 rn52.get(RN52_GETSTATUS, &res);
petter 5:8e468fef2754 36 printf("%s", res.response);
petter 5:8e468fef2754 37 break;
petter 5:8e468fef2754 38 case 't':
petter 5:8e468fef2754 39 rn52.get(RN52_CALLER_ID, &res);
petter 5:8e468fef2754 40 printf("%s", res.response);
petter 5:8e468fef2754 41 break;
petter 5:8e468fef2754 42 }
petter 5:8e468fef2754 43 }
petter 5:8e468fef2754 44 }
petter 5:8e468fef2754 45
petter 5:8e468fef2754 46 void handle_cdc_input() {
petter 5:8e468fef2754 47 switch (cdc.get_cmd()) {
petter 5:8e468fef2754 48 case IBUS_OTHER_MESSAGE:
petter 5:8e468fef2754 49 break;
petter 5:8e468fef2754 50 case IBUS_DOORS_LOCKED:
petter 5:8e468fef2754 51 //Goto sleep
petter 5:8e468fef2754 52 break;
petter 5:8e468fef2754 53 case IBUS_DOORS_UNLOCKED:
petter 5:8e468fef2754 54 //wake up
petter 5:8e468fef2754 55 break;
petter 5:8e468fef2754 56 case IBUS_NEXT:
petter 5:8e468fef2754 57 rn52.toggle_play();
petter 5:8e468fef2754 58 break;
petter 5:8e468fef2754 59 case IBUS_CDC_ON:
petter 5:8e468fef2754 60 rn52.connect();
petter 5:8e468fef2754 61 break;
petter 5:8e468fef2754 62 case IBUS_CDC_OFF:
petter 5:8e468fef2754 63 rn52.disconnect();
petter 5:8e468fef2754 64 break;
petter 5:8e468fef2754 65 case IBUS_VOLUME_UP:
petter 5:8e468fef2754 66 break;
petter 5:8e468fef2754 67 case IBUS_VOLUME_DOWN:
petter 5:8e468fef2754 68 break;
petter 5:8e468fef2754 69 case IBUS_SKIP_FW:
petter 5:8e468fef2754 70 rn52.next_track();
petter 5:8e468fef2754 71 break;
petter 5:8e468fef2754 72 case IBUS_SKIP_BW:
petter 5:8e468fef2754 73 rn52.prev_track();
petter 5:8e468fef2754 74 break;
petter 5:8e468fef2754 75 case IBUS_SET:
petter 5:8e468fef2754 76 rn52.connect();
petter 5:8e468fef2754 77 break;
petter 5:8e468fef2754 78 case IBUS_CLEAR:
petter 5:8e468fef2754 79 break;
petter 5:8e468fef2754 80 }
petter 5:8e468fef2754 81 }
petter 5:8e468fef2754 82
petter 5:8e468fef2754 83 void handle_bt_input() {
petter 5:8e468fef2754 84 if(rn52.check_event(&res)) {
petter 5:8e468fef2754 85 switch (res.event) {
petter 5:8e468fef2754 86 case RN52_CALLER_ID_EVENT:
petter 5:8e468fef2754 87 break;
petter 5:8e468fef2754 88 case RN52_TRACK_CHANGE_EVENT:
petter 5:8e468fef2754 89 cdc.reset_elapsed_time();
petter 5:8e468fef2754 90 break;
petter 5:8e468fef2754 91 case RN52_NO_EVENT: //no specific event occured, check connection status
petter 5:8e468fef2754 92 switch(res.connection) {
petter 5:8e468fef2754 93 case RN52_CONNECTED:
petter 5:8e468fef2754 94 cdc.display("BT ANSLUTEN");
petter 5:8e468fef2754 95 rn52.maxvolume();
petter 5:8e468fef2754 96 break;
petter 5:8e468fef2754 97 case RN52_AUDIO_STREAMING:
petter 5:8e468fef2754 98 cdc.display("BT SPELAR");
petter 5:8e468fef2754 99 cdc.start_elapsed_time();
petter 5:8e468fef2754 100 break;
petter 5:8e468fef2754 101 }
petter 5:8e468fef2754 102 if(res.connection != RN52_AUDIO_STREAMING) {
petter 5:8e468fef2754 103 cdc.stop_elapsed_time();
petter 5:8e468fef2754 104 cdc.reset_elapsed_time();
petter 5:8e468fef2754 105 }
petter 5:8e468fef2754 106 }
petter 5:8e468fef2754 107 }
petter 5:8e468fef2754 108 }
petter 5:8e468fef2754 109
petter 0:6cf6e566c0da 110 int main() {
petter 0:6cf6e566c0da 111 printf("Petters BT CDC-emulator\r\n");
petter 0:6cf6e566c0da 112 printf("Initializing\r\n");
petter 0:6cf6e566c0da 113 cdc.init();
petter 0:6cf6e566c0da 114 rn52.init();
petter 0:6cf6e566c0da 115 printf("Starting loop\r\n");
petter 0:6cf6e566c0da 116 while(1) {
petter 5:8e468fef2754 117 handle_pc_input();
petter 5:8e468fef2754 118 handle_cdc_input();
petter 5:8e468fef2754 119 handle_bt_input();
petter 0:6cf6e566c0da 120 }
petter 0:6cf6e566c0da 121 }