Petter Bellander / Mbed 2 deprecated Saab-BT

Dependencies:   mbed

Committer:
petter
Date:
Wed Jan 13 22:11:50 2016 +0000
Revision:
6:c454f88524d6
Parent:
5:8e468fef2754
Child:
7:2df2c6e8c0df
Updated rn52 implementation to correspond to 1.16 firmware; Reverted 0x61 response on Ibus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
petter 0:6cf6e566c0da 1 #include "RN52.h"
petter 0:6cf6e566c0da 2 #include "mbed.h"
petter 0:6cf6e566c0da 3
petter 0:6cf6e566c0da 4 // RN52 action command definitions
petter 0:6cf6e566c0da 5 #define PLAYPAUSE "AP\r"
petter 0:6cf6e566c0da 6 #define NEXTTRACK "AT+\r"
petter 0:6cf6e566c0da 7 #define PREVTRACK "AT-\r"
petter 0:6cf6e566c0da 8 #define CONNECT "B\r"
petter 0:6cf6e566c0da 9 #define DISCONNECT "@,1\r"
petter 0:6cf6e566c0da 10 #define REBOOT "R,1\r"
petter 0:6cf6e566c0da 11 #define VOLUMEUP "AV+\r"
petter 0:6cf6e566c0da 12 #define MAXVOLUME "SS,0F\r"
petter 0:6cf6e566c0da 13 #define GETSTATUS "Q\r"
petter 0:6cf6e566c0da 14 #define ASSISTANT "P\r"
petter 0:6cf6e566c0da 15 #define CALLER_ID "T\r"
petter 0:6cf6e566c0da 16 #define TRACK_METADATA "AD\r"
petter 0:6cf6e566c0da 17
petter 0:6cf6e566c0da 18
petter 0:6cf6e566c0da 19 Serial serial(p13, p14); // tx, rx
petter 0:6cf6e566c0da 20 DigitalIn event_pin(p20);
petter 0:6cf6e566c0da 21
petter 0:6cf6e566c0da 22 void RN52::init(){
petter 0:6cf6e566c0da 23 serial.baud(115200);
petter 0:6cf6e566c0da 24 printf("Serial baudrate set\r\n");
petter 6:c454f88524d6 25
petter 6:c454f88524d6 26 //make sure event pin is pulled low
petter 6:c454f88524d6 27 if(event_pin == 0) {
petter 6:c454f88524d6 28 char response[10];
petter 6:c454f88524d6 29 serial.printf(GETSTATUS);
petter 6:c454f88524d6 30 capture_response(response);
petter 6:c454f88524d6 31 }
petter 0:6cf6e566c0da 32 }
petter 0:6cf6e566c0da 33
petter 5:8e468fef2754 34 bool RN52::check_event(RN52_RESULT * result){
petter 6:c454f88524d6 35 clear_serial();
petter 6:c454f88524d6 36 if(event_pin == 0) {
petter 5:8e468fef2754 37 get(RN52_GETSTATUS, result);
petter 5:8e468fef2754 38 switch (result->event) {
petter 4:3041a571b7a7 39 case RN52_CALLER_ID_EVENT:
petter 5:8e468fef2754 40 get(RN52_CALLER_ID, result);
petter 4:3041a571b7a7 41 break;
petter 4:3041a571b7a7 42 case RN52_TRACK_CHANGE_EVENT:
petter 5:8e468fef2754 43 get(RN52_TRACK_METADATA, result);
petter 4:3041a571b7a7 44 break;
petter 4:3041a571b7a7 45 }
petter 4:3041a571b7a7 46 return 1;
petter 0:6cf6e566c0da 47 }
petter 0:6cf6e566c0da 48 return 0;
petter 0:6cf6e566c0da 49 }
petter 0:6cf6e566c0da 50
petter 5:8e468fef2754 51 bool RN52::connect(){
petter 6:c454f88524d6 52 char response[5];
petter 5:8e468fef2754 53 serial.printf(CONNECT);
petter 5:8e468fef2754 54 return capture_response(response);
petter 5:8e468fef2754 55 }
petter 0:6cf6e566c0da 56
petter 5:8e468fef2754 57 bool RN52::disconnect(){
petter 6:c454f88524d6 58 char response[5];
petter 5:8e468fef2754 59 serial.printf(DISCONNECT);
petter 5:8e468fef2754 60 return capture_response(response);
petter 5:8e468fef2754 61 }
petter 5:8e468fef2754 62
petter 5:8e468fef2754 63 bool RN52::next_track(){
petter 6:c454f88524d6 64 char response[5];
petter 5:8e468fef2754 65 serial.printf(NEXTTRACK);
petter 5:8e468fef2754 66 return capture_response(response);
petter 5:8e468fef2754 67 }
petter 5:8e468fef2754 68
petter 5:8e468fef2754 69 bool RN52::prev_track(){
petter 6:c454f88524d6 70 char response[5];
petter 5:8e468fef2754 71 serial.printf(PREVTRACK);
petter 5:8e468fef2754 72 return capture_response(response);
petter 5:8e468fef2754 73 }
petter 5:8e468fef2754 74
petter 5:8e468fef2754 75 bool RN52::toggle_play(){
petter 6:c454f88524d6 76 char response[5];
petter 5:8e468fef2754 77 serial.printf(PLAYPAUSE);
petter 5:8e468fef2754 78 return capture_response(response);
petter 5:8e468fef2754 79 }
petter 5:8e468fef2754 80
petter 5:8e468fef2754 81 bool RN52::maxvolume(){
petter 6:c454f88524d6 82 char response[5];
petter 6:c454f88524d6 83 serial.printf(MAXVOLUME);
petter 5:8e468fef2754 84 return capture_response(response);
petter 0:6cf6e566c0da 85 }
petter 0:6cf6e566c0da 86
petter 0:6cf6e566c0da 87 bool RN52::get(RN52_COMMAND cmd, RN52_RESULT * result){
petter 0:6cf6e566c0da 88 switch (cmd) {
petter 4:3041a571b7a7 89 case RN52_GETSTATUS: {
petter 0:6cf6e566c0da 90 serial.printf(GETSTATUS);
petter 0:6cf6e566c0da 91 capture_response(result->response);
petter 2:10c60edc8573 92 int response_value = strtoul(result->response, NULL, 16);
petter 2:10c60edc8573 93 result->media_connected = (response_value & (1 << 10)) >> 10; //byte 0, bit 2
petter 2:10c60edc8573 94 result->phone_connected = (response_value & (1 << 11)) >> 11; //byte 0, bit 3
petter 2:10c60edc8573 95 result->connection = (RN52_CONNECTION)(response_value & 0x0F); //byte 1, bits 0-3
petter 4:3041a571b7a7 96 switch (response_value & 0x3000) {
petter 4:3041a571b7a7 97 case 0x1000: //byte 0, bit 4
petter 4:3041a571b7a7 98 result->event = RN52_CALLER_ID_EVENT;
petter 4:3041a571b7a7 99 break;
petter 4:3041a571b7a7 100 case 0x2000: //byte 0, bit 5
petter 4:3041a571b7a7 101 result->event = RN52_TRACK_CHANGE_EVENT;
petter 4:3041a571b7a7 102 break;
petter 4:3041a571b7a7 103 default:
petter 4:3041a571b7a7 104 result->event = RN52_NO_EVENT;
petter 4:3041a571b7a7 105 break;
petter 0:6cf6e566c0da 106 }
petter 0:6cf6e566c0da 107 break;
petter 4:3041a571b7a7 108 } //added to create local scope of response_value
petter 0:6cf6e566c0da 109 case RN52_CALLER_ID:
petter 0:6cf6e566c0da 110 serial.printf(CALLER_ID);
petter 0:6cf6e566c0da 111 capture_response(result->response);
petter 0:6cf6e566c0da 112 //parse the response
petter 0:6cf6e566c0da 113 break;
petter 0:6cf6e566c0da 114 case RN52_TRACK_METADATA:
petter 6:c454f88524d6 115 serial.printf(TRACK_METADATA);
petter 6:c454f88524d6 116 if(capture_response(result->response)) {//AOK
petter 6:c454f88524d6 117 while(result->response[4] != '(') { //time(ms) - always the last one
petter 6:c454f88524d6 118 capture_response(result->response);
petter 6:c454f88524d6 119 switch (result->response[3]) {
petter 6:c454f88524d6 120 case 'l': //Title
petter 6:c454f88524d6 121 for( int n = 0; n < STRING_BUFFER_LENGTH-6; n=n+1 ) {
petter 6:c454f88524d6 122 result->title[n] = result->response[n+6];
petter 6:c454f88524d6 123 }
petter 6:c454f88524d6 124 break;
petter 6:c454f88524d6 125 case 'i': //Artist
petter 6:c454f88524d6 126 for( int n = 0; n < STRING_BUFFER_LENGTH-7; n=n+1 ) {
petter 6:c454f88524d6 127 result->artist[n] = result->response[n+7];
petter 6:c454f88524d6 128 }
petter 6:c454f88524d6 129 break;
petter 6:c454f88524d6 130 case 'u': //Album
petter 6:c454f88524d6 131 for( int n = 0; n < STRING_BUFFER_LENGTH-6; n=n+1 ) {
petter 6:c454f88524d6 132 result->album[n] = result->response[n+6];
petter 6:c454f88524d6 133 }
petter 6:c454f88524d6 134 break;
petter 6:c454f88524d6 135 case 'r': //Genre
petter 6:c454f88524d6 136 for( int n = 0; n < STRING_BUFFER_LENGTH-6; n=n+1 ) {
petter 6:c454f88524d6 137 result->genre[n] = result->response[n+6];
petter 6:c454f88524d6 138 }
petter 6:c454f88524d6 139 break;
petter 6:c454f88524d6 140 case 'c': //TrackNumber or TrackCount
petter 6:c454f88524d6 141 {
petter 6:c454f88524d6 142 char number_string[5];
petter 6:c454f88524d6 143 if(result->response[5] == 'N') { //TrackNumber
petter 6:c454f88524d6 144 for( int n = 0; n < 5; n=n+1 ) {
petter 6:c454f88524d6 145 number_string[n] = result->response[n+12];
petter 6:c454f88524d6 146 }
petter 6:c454f88524d6 147 result->track_number = strtoul(number_string, NULL, 10);
petter 6:c454f88524d6 148 }
petter 6:c454f88524d6 149 else { //TrackCount
petter 6:c454f88524d6 150 for( int n = 0; n < 5; n=n+1 ) {
petter 6:c454f88524d6 151 number_string[n] = result->response[n+11];
petter 6:c454f88524d6 152 }
petter 6:c454f88524d6 153 result->track_count = strtoul(number_string, NULL, 10);
petter 6:c454f88524d6 154 }
petter 6:c454f88524d6 155 }
petter 6:c454f88524d6 156 break;
petter 6:c454f88524d6 157 case 'e':
petter 6:c454f88524d6 158 {
petter 6:c454f88524d6 159 char duration_string[10];
petter 6:c454f88524d6 160 for( int n = 0; n < 10; n=n+1 ) {
petter 6:c454f88524d6 161 duration_string[n] = result->response[n+9];
petter 6:c454f88524d6 162 }
petter 6:c454f88524d6 163 result->duration = strtoul(duration_string, NULL, 10);
petter 6:c454f88524d6 164 }
petter 6:c454f88524d6 165 break;
petter 6:c454f88524d6 166 }
petter 6:c454f88524d6 167
petter 6:c454f88524d6 168 }
petter 6:c454f88524d6 169 clear_serial();
petter 6:c454f88524d6 170 }
petter 6:c454f88524d6 171 break;
petter 0:6cf6e566c0da 172 default:
petter 0:6cf6e566c0da 173 return 0;
petter 0:6cf6e566c0da 174 }
petter 0:6cf6e566c0da 175 return 1;
petter 0:6cf6e566c0da 176 }
petter 0:6cf6e566c0da 177
petter 0:6cf6e566c0da 178
petter 6:c454f88524d6 179
petter 5:8e468fef2754 180 bool RN52::capture_response(char * str){
petter 0:6cf6e566c0da 181 char c = ' ';
petter 0:6cf6e566c0da 182 char n = 0;
petter 0:6cf6e566c0da 183 while(c != '\n') {
petter 0:6cf6e566c0da 184 if(serial.readable()) {
petter 0:6cf6e566c0da 185 c = serial.getc();
petter 0:6cf6e566c0da 186 str[n] = c;
petter 0:6cf6e566c0da 187 n++;
petter 0:6cf6e566c0da 188 }
petter 0:6cf6e566c0da 189 }
petter 0:6cf6e566c0da 190 str[n] = '\0';
petter 5:8e468fef2754 191 return (str[0] == 'A');
petter 6:c454f88524d6 192 }
petter 6:c454f88524d6 193
petter 6:c454f88524d6 194 void RN52::clear_serial(){
petter 6:c454f88524d6 195 while(serial.readable()) {
petter 6:c454f88524d6 196 serial.getc();
petter 6:c454f88524d6 197 }
petter 0:6cf6e566c0da 198 }