Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
RN52.cpp@6:c454f88524d6, 2016-01-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |