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@8:beb6c399490a, 2016-01-15 (annotated)
- Committer:
- petter
- Date:
- Fri Jan 15 20:59:51 2016 +0000
- Revision:
- 8:beb6c399490a
- Parent:
- 7:2df2c6e8c0df
- Child:
- 9:9a4c81493a3d
Minor restructuring
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 | 7:2df2c6e8c0df | 37 | clear_result(result); |
petter | 8:beb6c399490a | 38 | get_status(result); |
petter | 5:8e468fef2754 | 39 | switch (result->event) { |
petter | 4:3041a571b7a7 | 40 | case RN52_CALLER_ID_EVENT: |
petter | 8:beb6c399490a | 41 | get_caller_id(result); |
petter | 4:3041a571b7a7 | 42 | break; |
petter | 4:3041a571b7a7 | 43 | case RN52_TRACK_CHANGE_EVENT: |
petter | 8:beb6c399490a | 44 | get_track_metadata(result); |
petter | 4:3041a571b7a7 | 45 | break; |
petter | 4:3041a571b7a7 | 46 | } |
petter | 4:3041a571b7a7 | 47 | return 1; |
petter | 0:6cf6e566c0da | 48 | } |
petter | 0:6cf6e566c0da | 49 | return 0; |
petter | 0:6cf6e566c0da | 50 | } |
petter | 0:6cf6e566c0da | 51 | |
petter | 5:8e468fef2754 | 52 | bool RN52::connect(){ |
petter | 6:c454f88524d6 | 53 | char response[5]; |
petter | 5:8e468fef2754 | 54 | serial.printf(CONNECT); |
petter | 5:8e468fef2754 | 55 | return capture_response(response); |
petter | 5:8e468fef2754 | 56 | } |
petter | 0:6cf6e566c0da | 57 | |
petter | 5:8e468fef2754 | 58 | bool RN52::disconnect(){ |
petter | 6:c454f88524d6 | 59 | char response[5]; |
petter | 5:8e468fef2754 | 60 | serial.printf(DISCONNECT); |
petter | 5:8e468fef2754 | 61 | return capture_response(response); |
petter | 5:8e468fef2754 | 62 | } |
petter | 5:8e468fef2754 | 63 | |
petter | 5:8e468fef2754 | 64 | bool RN52::next_track(){ |
petter | 6:c454f88524d6 | 65 | char response[5]; |
petter | 5:8e468fef2754 | 66 | serial.printf(NEXTTRACK); |
petter | 5:8e468fef2754 | 67 | return capture_response(response); |
petter | 5:8e468fef2754 | 68 | } |
petter | 5:8e468fef2754 | 69 | |
petter | 5:8e468fef2754 | 70 | bool RN52::prev_track(){ |
petter | 6:c454f88524d6 | 71 | char response[5]; |
petter | 5:8e468fef2754 | 72 | serial.printf(PREVTRACK); |
petter | 5:8e468fef2754 | 73 | return capture_response(response); |
petter | 5:8e468fef2754 | 74 | } |
petter | 5:8e468fef2754 | 75 | |
petter | 5:8e468fef2754 | 76 | bool RN52::toggle_play(){ |
petter | 6:c454f88524d6 | 77 | char response[5]; |
petter | 5:8e468fef2754 | 78 | serial.printf(PLAYPAUSE); |
petter | 5:8e468fef2754 | 79 | return capture_response(response); |
petter | 5:8e468fef2754 | 80 | } |
petter | 5:8e468fef2754 | 81 | |
petter | 5:8e468fef2754 | 82 | bool RN52::maxvolume(){ |
petter | 6:c454f88524d6 | 83 | char response[5]; |
petter | 6:c454f88524d6 | 84 | serial.printf(MAXVOLUME); |
petter | 5:8e468fef2754 | 85 | return capture_response(response); |
petter | 0:6cf6e566c0da | 86 | } |
petter | 0:6cf6e566c0da | 87 | |
petter | 8:beb6c399490a | 88 | bool RN52::get_status(RN52_RESULT * result){ |
petter | 8:beb6c399490a | 89 | serial.printf(GETSTATUS); |
petter | 8:beb6c399490a | 90 | capture_response(result->response); |
petter | 8:beb6c399490a | 91 | int response_value = strtoul(result->response, NULL, 16); |
petter | 8:beb6c399490a | 92 | result->media_connected = (response_value & (1 << 10)) >> 10; //byte 0, bit 2 |
petter | 8:beb6c399490a | 93 | result->phone_connected = (response_value & (1 << 11)) >> 11; //byte 0, bit 3 |
petter | 8:beb6c399490a | 94 | result->connection = (RN52_CONNECTION)(response_value & 0x0F); //byte 1, bits 0-3 |
petter | 8:beb6c399490a | 95 | switch (response_value & 0x3000) { |
petter | 8:beb6c399490a | 96 | case 0x1000: //byte 0, bit 4 |
petter | 8:beb6c399490a | 97 | result->event = RN52_CALLER_ID_EVENT; |
petter | 0:6cf6e566c0da | 98 | break; |
petter | 8:beb6c399490a | 99 | case 0x2000: //byte 0, bit 5 |
petter | 8:beb6c399490a | 100 | result->event = RN52_TRACK_CHANGE_EVENT; |
petter | 8:beb6c399490a | 101 | break; |
petter | 8:beb6c399490a | 102 | default: |
petter | 8:beb6c399490a | 103 | result->event = RN52_OTHER_EVENT; |
petter | 0:6cf6e566c0da | 104 | break; |
petter | 8:beb6c399490a | 105 | } |
petter | 8:beb6c399490a | 106 | return 1; |
petter | 8:beb6c399490a | 107 | } |
petter | 8:beb6c399490a | 108 | |
petter | 8:beb6c399490a | 109 | bool RN52::get_caller_id(RN52_RESULT * result){ |
petter | 8:beb6c399490a | 110 | serial.printf(CALLER_ID); |
petter | 8:beb6c399490a | 111 | capture_response(result->response); |
petter | 8:beb6c399490a | 112 | //parse the response |
petter | 8:beb6c399490a | 113 | return 1; |
petter | 8:beb6c399490a | 114 | } |
petter | 8:beb6c399490a | 115 | |
petter | 8:beb6c399490a | 116 | bool RN52::get_track_metadata(RN52_RESULT * result){ |
petter | 8:beb6c399490a | 117 | serial.printf(TRACK_METADATA); |
petter | 8:beb6c399490a | 118 | if(capture_response(result->response)) {//AOK |
petter | 8:beb6c399490a | 119 | while(result->response[4] != '(') { //time(ms) - always the last one |
petter | 8:beb6c399490a | 120 | capture_response(result->response); |
petter | 8:beb6c399490a | 121 | switch (result->response[3]) { |
petter | 8:beb6c399490a | 122 | case 'l': //Title |
petter | 8:beb6c399490a | 123 | copy_response(result->response, result->title, 6); |
petter | 8:beb6c399490a | 124 | break; |
petter | 8:beb6c399490a | 125 | case 'i': //Artist |
petter | 8:beb6c399490a | 126 | copy_response(result->response, result->artist, 7); |
petter | 8:beb6c399490a | 127 | break; |
petter | 8:beb6c399490a | 128 | case 'u': //Album |
petter | 8:beb6c399490a | 129 | copy_response(result->response, result->album, 6); |
petter | 8:beb6c399490a | 130 | break; |
petter | 8:beb6c399490a | 131 | case 'r': //Genre |
petter | 8:beb6c399490a | 132 | copy_response(result->response, result->genre, 6); |
petter | 8:beb6c399490a | 133 | break; |
petter | 8:beb6c399490a | 134 | case 'c': //TrackNumber or TrackCount |
petter | 8:beb6c399490a | 135 | { |
petter | 8:beb6c399490a | 136 | char number_string[5]; |
petter | 8:beb6c399490a | 137 | if(result->response[5] == 'N') { //TrackNumber |
petter | 8:beb6c399490a | 138 | copy_response(result->response, number_string, 12); |
petter | 8:beb6c399490a | 139 | result->track_number = strtoul(number_string, NULL, 10); |
petter | 8:beb6c399490a | 140 | } |
petter | 8:beb6c399490a | 141 | else { //TrackCount |
petter | 8:beb6c399490a | 142 | copy_response(result->response, number_string, 11); |
petter | 8:beb6c399490a | 143 | result->track_count = strtoul(number_string, NULL, 10); |
petter | 6:c454f88524d6 | 144 | } |
petter | 6:c454f88524d6 | 145 | } |
petter | 8:beb6c399490a | 146 | break; |
petter | 8:beb6c399490a | 147 | case 'e': |
petter | 8:beb6c399490a | 148 | { |
petter | 8:beb6c399490a | 149 | char duration_string[10]; |
petter | 8:beb6c399490a | 150 | copy_response(result->response, duration_string, 9); |
petter | 8:beb6c399490a | 151 | result->duration = strtoul(duration_string, NULL, 10); |
petter | 8:beb6c399490a | 152 | } |
petter | 8:beb6c399490a | 153 | break; |
petter | 8:beb6c399490a | 154 | } |
petter | 8:beb6c399490a | 155 | } |
petter | 8:beb6c399490a | 156 | clear_serial(); |
petter | 0:6cf6e566c0da | 157 | } |
petter | 0:6cf6e566c0da | 158 | return 1; |
petter | 0:6cf6e566c0da | 159 | } |
petter | 0:6cf6e566c0da | 160 | |
petter | 0:6cf6e566c0da | 161 | |
petter | 5:8e468fef2754 | 162 | bool RN52::capture_response(char * str){ |
petter | 0:6cf6e566c0da | 163 | char c = ' '; |
petter | 0:6cf6e566c0da | 164 | char n = 0; |
petter | 0:6cf6e566c0da | 165 | while(c != '\n') { |
petter | 0:6cf6e566c0da | 166 | if(serial.readable()) { |
petter | 0:6cf6e566c0da | 167 | c = serial.getc(); |
petter | 0:6cf6e566c0da | 168 | str[n] = c; |
petter | 0:6cf6e566c0da | 169 | n++; |
petter | 0:6cf6e566c0da | 170 | } |
petter | 0:6cf6e566c0da | 171 | } |
petter | 7:2df2c6e8c0df | 172 | str[n-2] = '\0'; //terminate string before \r\n |
petter | 5:8e468fef2754 | 173 | return (str[0] == 'A'); |
petter | 6:c454f88524d6 | 174 | } |
petter | 6:c454f88524d6 | 175 | |
petter | 6:c454f88524d6 | 176 | void RN52::clear_serial(){ |
petter | 6:c454f88524d6 | 177 | while(serial.readable()) { |
petter | 6:c454f88524d6 | 178 | serial.getc(); |
petter | 6:c454f88524d6 | 179 | } |
petter | 7:2df2c6e8c0df | 180 | } |
petter | 7:2df2c6e8c0df | 181 | |
petter | 7:2df2c6e8c0df | 182 | void RN52::copy_response(char * source, char * destination, char offset){ |
petter | 7:2df2c6e8c0df | 183 | int n = 0; |
petter | 7:2df2c6e8c0df | 184 | while(source[n+offset+1] != '\0') { //remove carraige return in the end |
petter | 7:2df2c6e8c0df | 185 | destination[n] = source[n+offset]; |
petter | 7:2df2c6e8c0df | 186 | n++; |
petter | 7:2df2c6e8c0df | 187 | } |
petter | 7:2df2c6e8c0df | 188 | destination[n] = '\0'; //end string where carriage was |
petter | 7:2df2c6e8c0df | 189 | } |
petter | 7:2df2c6e8c0df | 190 | |
petter | 7:2df2c6e8c0df | 191 | void RN52::clear_result(RN52_RESULT * result) { |
petter | 7:2df2c6e8c0df | 192 | result->event = RN52_NO_EVENT; |
petter | 7:2df2c6e8c0df | 193 | result->media_connected = 0; |
petter | 7:2df2c6e8c0df | 194 | result->phone_connected = 0; |
petter | 8:beb6c399490a | 195 | result->connection = RN52_NOT_SET; |
petter | 7:2df2c6e8c0df | 196 | result->title[0] = '\0'; |
petter | 7:2df2c6e8c0df | 197 | result->artist[0] = '\0'; |
petter | 7:2df2c6e8c0df | 198 | result->album[0] = '\0'; |
petter | 7:2df2c6e8c0df | 199 | result->genre[0] = '\0'; |
petter | 7:2df2c6e8c0df | 200 | result->duration = 0; |
petter | 7:2df2c6e8c0df | 201 | result->track_number = 0; |
petter | 7:2df2c6e8c0df | 202 | result->track_count = 0; |
petter | 7:2df2c6e8c0df | 203 | result->response[0] = '\0'; |
petter | 0:6cf6e566c0da | 204 | } |