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@2:10c60edc8573, 2016-01-04 (annotated)
- 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?
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 | 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 | } |