Petter Bellander / Mbed 2 deprecated Saab-BT

Dependencies:   mbed

Committer:
petter
Date:
Sun Feb 07 18:24:13 2016 +0000
Revision:
15:82c3cc87bd02
Parent:
14:3f4098e94c29
Child:
16:7bb8b161e00b
RN52 bug fixed; CDC not returning buttons

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 11:74844f6ca8cf 6 // Due to power saving functions special firmware required http://mbed.org/users/simon/notebook/interface-powerdown/
petter 11:74844f6ca8cf 7
petter 0:6cf6e566c0da 8 #include "mbed.h"
petter 11:74844f6ca8cf 9 #include "PowerControl/PowerControl.h"
petter 11:74844f6ca8cf 10 #include "PowerControl/EthernetPowerControl.h"
petter 11:74844f6ca8cf 11
petter 0:6cf6e566c0da 12 #include "CDC.h"
petter 0:6cf6e566c0da 13 #include "RN52.h"
petter 0:6cf6e566c0da 14
petter 11:74844f6ca8cf 15
petter 0:6cf6e566c0da 16 CDC cdc;
petter 0:6cf6e566c0da 17 RN52 rn52;
petter 0:6cf6e566c0da 18 RN52_RESULT res;
petter 13:968af0520530 19
petter 11:74844f6ca8cf 20 Ticker wakeup;
petter 0:6cf6e566c0da 21 Serial pc(USBTX, USBRX); // tx, rx
petter 13:968af0520530 22 DigitalOut led3(LED3, 0);
petter 13:968af0520530 23 DigitalOut led4(LED4, 0);
petter 11:74844f6ca8cf 24 bool active = 1;
petter 0:6cf6e566c0da 25
petter 8:beb6c399490a 26 void handle_pc_input();
petter 8:beb6c399490a 27 void handle_cdc_input();
petter 8:beb6c399490a 28 void handle_bt_input();
petter 11:74844f6ca8cf 29 void check_for_wakeup();
petter 8:beb6c399490a 30
petter 8:beb6c399490a 31 int main() {
petter 8:beb6c399490a 32 printf("Petters BT CDC-emulator\r\n");
petter 8:beb6c399490a 33 printf("Initializing\r\n");
petter 11:74844f6ca8cf 34 printf("Disabling unused peripherals to decrease power consumption\r\n");
petter 11:74844f6ca8cf 35 PHY_PowerDown(); // Power down Ethernet interface - saves around 175mW
petter 11:74844f6ca8cf 36 semihost_powerdown(); // If you don't need the PC host USB interface power down magic USB interface chip - saves around 150mW | Needs new firmware (URL below) and USB cable not connected http://mbed.org/users/simon/notebook/interface-powerdown/
petter 13:968af0520530 37 rn52.init();
petter 8:beb6c399490a 38 cdc.init();
petter 11:74844f6ca8cf 39 printf("Adding wakeup routine\r\n");
petter 14:3f4098e94c29 40 wakeup.attach(&check_for_wakeup, 0.5);
petter 8:beb6c399490a 41 printf("Starting loop\r\n");
petter 8:beb6c399490a 42 while(1) {
petter 11:74844f6ca8cf 43 if(active) {
petter 11:74844f6ca8cf 44 handle_pc_input();
petter 11:74844f6ca8cf 45 handle_cdc_input();
petter 11:74844f6ca8cf 46 handle_bt_input();
petter 11:74844f6ca8cf 47 }
petter 11:74844f6ca8cf 48 else {
petter 11:74844f6ca8cf 49 sleep();
petter 11:74844f6ca8cf 50 }
petter 8:beb6c399490a 51 }
petter 8:beb6c399490a 52 }
petter 8:beb6c399490a 53
petter 11:74844f6ca8cf 54 void check_for_wakeup(){
petter 11:74844f6ca8cf 55 if(!active) {
petter 13:968af0520530 56 led4 = !led4;
petter 11:74844f6ca8cf 57 IBUS_COMMAND cmd = IBUS_OTHER_MESSAGE;
petter 13:968af0520530 58 while(cmd != IBUS_HEAD_UNIT_OFF) {
petter 11:74844f6ca8cf 59 cmd = cdc.get_cmd();
petter 11:74844f6ca8cf 60 if(cmd == IBUS_HEAD_UNIT_ON) {
petter 11:74844f6ca8cf 61 active = 1;
petter 15:82c3cc87bd02 62 cdc.enable();
petter 13:968af0520530 63 rn52.enable();
petter 13:968af0520530 64 }
petter 13:968af0520530 65 }
petter 13:968af0520530 66 while(pc.readable()) {
petter 14:3f4098e94c29 67 switch (pc.getc()) {
petter 14:3f4098e94c29 68 case '1':
petter 14:3f4098e94c29 69 printf("enabling\r\n");
petter 14:3f4098e94c29 70 active = 1;
petter 15:82c3cc87bd02 71 cdc.enable();
petter 14:3f4098e94c29 72 rn52.enable();
petter 14:3f4098e94c29 73 break;
petter 11:74844f6ca8cf 74 }
petter 11:74844f6ca8cf 75 }
petter 11:74844f6ca8cf 76 }
petter 11:74844f6ca8cf 77 }
petter 8:beb6c399490a 78
petter 5:8e468fef2754 79 void handle_pc_input() {
petter 5:8e468fef2754 80 //Debug connection to PC
petter 5:8e468fef2754 81 if(pc.readable()) {
petter 5:8e468fef2754 82 switch (pc.getc()) {
petter 5:8e468fef2754 83 case 'p':
petter 5:8e468fef2754 84 if(rn52.toggle_play()) {
petter 5:8e468fef2754 85 printf("play/pause\r\n");
petter 5:8e468fef2754 86 }
petter 5:8e468fef2754 87 break;
petter 5:8e468fef2754 88 case 'v':
petter 5:8e468fef2754 89 printf("volume up\r\n");
petter 5:8e468fef2754 90 rn52.maxvolume();
petter 5:8e468fef2754 91 break;
petter 5:8e468fef2754 92 case 'n':
petter 5:8e468fef2754 93 printf("next track\r\n");
petter 5:8e468fef2754 94 rn52.next_track();
petter 5:8e468fef2754 95 break;
petter 5:8e468fef2754 96 case 'q':
petter 5:8e468fef2754 97 printf("getting status\r\n");
petter 8:beb6c399490a 98 rn52.get_status(&res);
petter 7:2df2c6e8c0df 99 printf("%s\r\n", res.response);
petter 5:8e468fef2754 100 break;
petter 5:8e468fef2754 101 case 't':
petter 8:beb6c399490a 102 rn52.get_caller_id(&res);
petter 7:2df2c6e8c0df 103 printf("%s\r\n", res.response);
petter 5:8e468fef2754 104 break;
petter 15:82c3cc87bd02 105 case 'c':
petter 15:82c3cc87bd02 106 rn52.config("Saab 9-5");
petter 15:82c3cc87bd02 107 printf("configuring RN52\r\n");
petter 15:82c3cc87bd02 108 break;
petter 15:82c3cc87bd02 109 case 'm':
petter 15:82c3cc87bd02 110 rn52.get_track_metadata(&res);
petter 15:82c3cc87bd02 111 printf("Getting metadata\r\n");
petter 15:82c3cc87bd02 112 printf("title: %s\r\n", res.title);
petter 15:82c3cc87bd02 113 printf("artist: %s\r\n", res.artist);
petter 15:82c3cc87bd02 114 printf("album: %s\r\n", res.album);
petter 15:82c3cc87bd02 115 printf("genre: %s\r\n", res.genre);
petter 15:82c3cc87bd02 116 printf("duration: %i\r\n", res.duration);
petter 15:82c3cc87bd02 117 printf("track_count: %i\r\n", res.track_count);
petter 15:82c3cc87bd02 118 printf("track_number: %i\r\n", res.track_number);
petter 15:82c3cc87bd02 119 break;
petter 5:8e468fef2754 120 }
petter 5:8e468fef2754 121 }
petter 5:8e468fef2754 122 }
petter 5:8e468fef2754 123
petter 5:8e468fef2754 124 void handle_cdc_input() {
petter 5:8e468fef2754 125 switch (cdc.get_cmd()) {
petter 11:74844f6ca8cf 126 case IBUS_HEAD_UNIT_OFF:
petter 13:968af0520530 127 active = 0;
petter 14:3f4098e94c29 128 cdc.disable();
petter 13:968af0520530 129 rn52.disable();
petter 5:8e468fef2754 130 break;
petter 5:8e468fef2754 131 case IBUS_NEXT:
petter 15:82c3cc87bd02 132 cdc.display("PLAY_PAUSE");
petter 5:8e468fef2754 133 rn52.toggle_play();
petter 5:8e468fef2754 134 break;
petter 5:8e468fef2754 135 case IBUS_CDC_ON:
petter 15:82c3cc87bd02 136 cdc.display("CDC_ON");
petter 5:8e468fef2754 137 rn52.connect();
petter 5:8e468fef2754 138 break;
petter 5:8e468fef2754 139 case IBUS_CDC_OFF:
petter 15:82c3cc87bd02 140 cdc.display("CDC_OFF");
petter 5:8e468fef2754 141 break;
petter 5:8e468fef2754 142 case IBUS_SKIP_FW:
petter 15:82c3cc87bd02 143 cdc.display("SKIP_FW");
petter 5:8e468fef2754 144 rn52.next_track();
petter 5:8e468fef2754 145 break;
petter 5:8e468fef2754 146 case IBUS_SKIP_BW:
petter 15:82c3cc87bd02 147 cdc.display("SKIP_BW");
petter 5:8e468fef2754 148 rn52.prev_track();
petter 5:8e468fef2754 149 break;
petter 5:8e468fef2754 150 case IBUS_SET:
petter 15:82c3cc87bd02 151 cdc.display("SET");
petter 5:8e468fef2754 152 break;
petter 5:8e468fef2754 153 case IBUS_CLEAR:
petter 15:82c3cc87bd02 154 cdc.display("CLEAR");
petter 5:8e468fef2754 155 break;
petter 5:8e468fef2754 156 }
petter 5:8e468fef2754 157 }
petter 5:8e468fef2754 158
petter 5:8e468fef2754 159 void handle_bt_input() {
petter 5:8e468fef2754 160 if(rn52.check_event(&res)) {
petter 5:8e468fef2754 161 switch (res.event) {
petter 5:8e468fef2754 162 case RN52_CALLER_ID_EVENT:
petter 9:9a4c81493a3d 163 //printf("Caller ID event\r\n");
petter 5:8e468fef2754 164 break;
petter 5:8e468fef2754 165 case RN52_TRACK_CHANGE_EVENT:
petter 5:8e468fef2754 166 cdc.reset_elapsed_time();
petter 14:3f4098e94c29 167 cdc.display(res.title);
petter 8:beb6c399490a 168 cdc.set_track((char)res.track_number);
petter 5:8e468fef2754 169 break;
petter 8:beb6c399490a 170 case RN52_OTHER_EVENT: //no specific event occured, check connection status
petter 5:8e468fef2754 171 switch(res.connection) {
petter 6:c454f88524d6 172 case RN52_CONNECTABLE_DISCOVERABLE:
petter 11:74844f6ca8cf 173 cdc.display("BT REDO");
petter 6:c454f88524d6 174 break;
petter 5:8e468fef2754 175 case RN52_CONNECTED:
petter 11:74844f6ca8cf 176 cdc.display("BT ANSLUTEN");
petter 5:8e468fef2754 177 rn52.maxvolume();
petter 15:82c3cc87bd02 178 rn52.toggle_play();
petter 5:8e468fef2754 179 break;
petter 5:8e468fef2754 180 case RN52_AUDIO_STREAMING:
petter 11:74844f6ca8cf 181 cdc.display(res.title);
petter 5:8e468fef2754 182 cdc.start_elapsed_time();
petter 5:8e468fef2754 183 break;
petter 5:8e468fef2754 184 }
petter 5:8e468fef2754 185 if(res.connection != RN52_AUDIO_STREAMING) {
petter 5:8e468fef2754 186 cdc.stop_elapsed_time();
petter 5:8e468fef2754 187 }
petter 5:8e468fef2754 188 }
petter 5:8e468fef2754 189 }
petter 0:6cf6e566c0da 190 }