Petter Bellander / Mbed 2 deprecated Saab-BT

Dependencies:   mbed

Committer:
petter
Date:
Sat Jan 30 21:03:52 2016 +0000
Revision:
13:968af0520530
Parent:
12:4194c47ca60b
Child:
14:3f4098e94c29
Added sleep control of CAN transceiver MCP2551

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 11:74844f6ca8cf 40 wakeup.attach(&check_for_wakeup, 1);
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 13:968af0520530 55 led3 = !led3;
petter 11:74844f6ca8cf 56 if(!active) {
petter 13:968af0520530 57 led4 = !led4;
petter 11:74844f6ca8cf 58 IBUS_COMMAND cmd = IBUS_OTHER_MESSAGE;
petter 13:968af0520530 59 while(cmd != IBUS_HEAD_UNIT_OFF) {
petter 11:74844f6ca8cf 60 cmd = cdc.get_cmd();
petter 11:74844f6ca8cf 61 if(cmd == IBUS_HEAD_UNIT_ON) {
petter 11:74844f6ca8cf 62 active = 1;
petter 13:968af0520530 63 rn52.enable();
petter 13:968af0520530 64 cdc.enable();
petter 13:968af0520530 65 }
petter 13:968af0520530 66 }
petter 13:968af0520530 67 while(pc.readable()) {
petter 13:968af0520530 68 if(pc.getc() == '1') {
petter 13:968af0520530 69 active = 1;
petter 13:968af0520530 70 rn52.enable();
petter 13:968af0520530 71 cdc.enable();
petter 11:74844f6ca8cf 72 }
petter 11:74844f6ca8cf 73 }
petter 11:74844f6ca8cf 74 }
petter 11:74844f6ca8cf 75 }
petter 8:beb6c399490a 76
petter 5:8e468fef2754 77 void handle_pc_input() {
petter 5:8e468fef2754 78 //Debug connection to PC
petter 5:8e468fef2754 79 if(pc.readable()) {
petter 5:8e468fef2754 80 switch (pc.getc()) {
petter 5:8e468fef2754 81 case 'p':
petter 5:8e468fef2754 82 if(rn52.toggle_play()) {
petter 5:8e468fef2754 83 printf("play/pause\r\n");
petter 5:8e468fef2754 84 }
petter 5:8e468fef2754 85 break;
petter 5:8e468fef2754 86 case 'v':
petter 5:8e468fef2754 87 printf("volume up\r\n");
petter 5:8e468fef2754 88 rn52.maxvolume();
petter 5:8e468fef2754 89 break;
petter 5:8e468fef2754 90 case 'n':
petter 5:8e468fef2754 91 printf("next track\r\n");
petter 5:8e468fef2754 92 rn52.next_track();
petter 5:8e468fef2754 93 break;
petter 5:8e468fef2754 94 case 'q':
petter 5:8e468fef2754 95 printf("getting status\r\n");
petter 8:beb6c399490a 96 rn52.get_status(&res);
petter 7:2df2c6e8c0df 97 printf("%s\r\n", res.response);
petter 5:8e468fef2754 98 break;
petter 5:8e468fef2754 99 case 't':
petter 8:beb6c399490a 100 rn52.get_caller_id(&res);
petter 7:2df2c6e8c0df 101 printf("%s\r\n", res.response);
petter 5:8e468fef2754 102 break;
petter 13:968af0520530 103 case '0':
petter 11:74844f6ca8cf 104 printf("deactivating\r\n");
petter 11:74844f6ca8cf 105 active = 0;
petter 13:968af0520530 106 rn52.disable();
petter 13:968af0520530 107 cdc.disable();
petter 11:74844f6ca8cf 108 break;
petter 5:8e468fef2754 109 }
petter 5:8e468fef2754 110 }
petter 5:8e468fef2754 111 }
petter 5:8e468fef2754 112
petter 5:8e468fef2754 113 void handle_cdc_input() {
petter 5:8e468fef2754 114 switch (cdc.get_cmd()) {
petter 11:74844f6ca8cf 115 case IBUS_HEAD_UNIT_OFF:
petter 11:74844f6ca8cf 116 cdc.display("Shutdown");
petter 13:968af0520530 117 active = 0;
petter 13:968af0520530 118 rn52.disable();
petter 13:968af0520530 119 cdc.disable();
petter 5:8e468fef2754 120 break;
petter 5:8e468fef2754 121 case IBUS_NEXT:
petter 5:8e468fef2754 122 rn52.toggle_play();
petter 5:8e468fef2754 123 break;
petter 5:8e468fef2754 124 case IBUS_CDC_ON:
petter 5:8e468fef2754 125 rn52.connect();
petter 5:8e468fef2754 126 break;
petter 5:8e468fef2754 127 case IBUS_CDC_OFF:
petter 5:8e468fef2754 128 rn52.disconnect();
petter 5:8e468fef2754 129 break;
petter 5:8e468fef2754 130 case IBUS_SKIP_FW:
petter 5:8e468fef2754 131 rn52.next_track();
petter 5:8e468fef2754 132 break;
petter 5:8e468fef2754 133 case IBUS_SKIP_BW:
petter 5:8e468fef2754 134 rn52.prev_track();
petter 5:8e468fef2754 135 break;
petter 5:8e468fef2754 136 case IBUS_SET:
petter 5:8e468fef2754 137 break;
petter 5:8e468fef2754 138 case IBUS_CLEAR:
petter 5:8e468fef2754 139 break;
petter 5:8e468fef2754 140 }
petter 5:8e468fef2754 141 }
petter 5:8e468fef2754 142
petter 5:8e468fef2754 143 void handle_bt_input() {
petter 5:8e468fef2754 144 if(rn52.check_event(&res)) {
petter 5:8e468fef2754 145 switch (res.event) {
petter 5:8e468fef2754 146 case RN52_CALLER_ID_EVENT:
petter 9:9a4c81493a3d 147 //printf("Caller ID event\r\n");
petter 5:8e468fef2754 148 break;
petter 5:8e468fef2754 149 case RN52_TRACK_CHANGE_EVENT:
petter 5:8e468fef2754 150 cdc.reset_elapsed_time();
petter 6:c454f88524d6 151 printf("Track change event\r\n");
petter 7:2df2c6e8c0df 152 printf("title: %s\r\n", res.title);
petter 7:2df2c6e8c0df 153 printf("artist: %s\r\n", res.artist);
petter 7:2df2c6e8c0df 154 printf("album: %s\r\n", res.album);
petter 7:2df2c6e8c0df 155 printf("genre: %s\r\n", res.genre);
petter 6:c454f88524d6 156 printf("duration: %i\r\n", res.duration);
petter 6:c454f88524d6 157 printf("track_count: %i\r\n", res.track_count);
petter 6:c454f88524d6 158 printf("track_number: %i\r\n", res.track_number);
petter 12:4194c47ca60b 159 //cdc.display(res.title);
petter 12:4194c47ca60b 160 cdc.display("BT SPELAR");
petter 8:beb6c399490a 161 cdc.set_track((char)res.track_number);
petter 5:8e468fef2754 162 break;
petter 8:beb6c399490a 163 case RN52_OTHER_EVENT: //no specific event occured, check connection status
petter 5:8e468fef2754 164 switch(res.connection) {
petter 6:c454f88524d6 165 case RN52_CONNECTABLE_DISCOVERABLE:
petter 9:9a4c81493a3d 166 //printf("Waiting for connection\r\n");
petter 11:74844f6ca8cf 167 cdc.display("BT REDO");
petter 6:c454f88524d6 168 break;
petter 5:8e468fef2754 169 case RN52_CONNECTED:
petter 9:9a4c81493a3d 170 //printf("Connected\r\n");
petter 11:74844f6ca8cf 171 cdc.display("BT ANSLUTEN");
petter 5:8e468fef2754 172 rn52.maxvolume();
petter 5:8e468fef2754 173 break;
petter 5:8e468fef2754 174 case RN52_AUDIO_STREAMING:
petter 9:9a4c81493a3d 175 //printf("Streaming\r\n");
petter 11:74844f6ca8cf 176 cdc.display(res.title);
petter 5:8e468fef2754 177 cdc.start_elapsed_time();
petter 5:8e468fef2754 178 break;
petter 5:8e468fef2754 179 }
petter 5:8e468fef2754 180 if(res.connection != RN52_AUDIO_STREAMING) {
petter 5:8e468fef2754 181 cdc.stop_elapsed_time();
petter 5:8e468fef2754 182 }
petter 5:8e468fef2754 183 }
petter 5:8e468fef2754 184 }
petter 0:6cf6e566c0da 185 }