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.
main.cpp@5:8e468fef2754, 2016-01-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |