Petter Bellander / Mbed 2 deprecated Saab-BT

Dependencies:   mbed

Committer:
petter
Date:
Sun Jan 31 20:58:42 2016 +0000
Revision:
14:3f4098e94c29
Parent:
13:968af0520530
Child:
15:82c3cc87bd02
Power saving features on RN52 & MPC2551; RN52 track info still buggy

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