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@5:8e468fef2754, 2016-01-11 (annotated)
- Committer:
- petter
- Date:
- Mon Jan 11 20:49:59 2016 +0000
- Revision:
- 5:8e468fef2754
- Parent:
- 4:3041a571b7a7
- Child:
- 6:c454f88524d6
Restructured main; Moved RN52 set commands into separate functions
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 | 0:6cf6e566c0da | 25 | } |
petter | 0:6cf6e566c0da | 26 | |
petter | 5:8e468fef2754 | 27 | bool RN52::check_event(RN52_RESULT * result){ |
petter | 0:6cf6e566c0da | 28 | static bool last = 0; |
petter | 4:3041a571b7a7 | 29 | if((last == 1) && (event_pin == 0)) { |
petter | 5:8e468fef2754 | 30 | get(RN52_GETSTATUS, result); |
petter | 5:8e468fef2754 | 31 | switch (result->event) { |
petter | 4:3041a571b7a7 | 32 | case RN52_CALLER_ID_EVENT: |
petter | 5:8e468fef2754 | 33 | get(RN52_CALLER_ID, result); |
petter | 4:3041a571b7a7 | 34 | break; |
petter | 4:3041a571b7a7 | 35 | case RN52_TRACK_CHANGE_EVENT: |
petter | 5:8e468fef2754 | 36 | get(RN52_TRACK_METADATA, result); |
petter | 4:3041a571b7a7 | 37 | break; |
petter | 4:3041a571b7a7 | 38 | } |
petter | 0:6cf6e566c0da | 39 | last = event_pin; |
petter | 4:3041a571b7a7 | 40 | return 1; |
petter | 0:6cf6e566c0da | 41 | } |
petter | 0:6cf6e566c0da | 42 | last = event_pin; |
petter | 0:6cf6e566c0da | 43 | return 0; |
petter | 0:6cf6e566c0da | 44 | } |
petter | 0:6cf6e566c0da | 45 | |
petter | 5:8e468fef2754 | 46 | bool RN52::connect(){ |
petter | 5:8e468fef2754 | 47 | char response[40]; |
petter | 5:8e468fef2754 | 48 | serial.printf(CONNECT); |
petter | 5:8e468fef2754 | 49 | return capture_response(response); |
petter | 5:8e468fef2754 | 50 | } |
petter | 0:6cf6e566c0da | 51 | |
petter | 5:8e468fef2754 | 52 | bool RN52::disconnect(){ |
petter | 5:8e468fef2754 | 53 | char response[40]; |
petter | 5:8e468fef2754 | 54 | serial.printf(DISCONNECT); |
petter | 5:8e468fef2754 | 55 | return capture_response(response); |
petter | 5:8e468fef2754 | 56 | } |
petter | 5:8e468fef2754 | 57 | |
petter | 5:8e468fef2754 | 58 | bool RN52::next_track(){ |
petter | 0:6cf6e566c0da | 59 | char response[40]; |
petter | 5:8e468fef2754 | 60 | serial.printf(NEXTTRACK); |
petter | 5:8e468fef2754 | 61 | return capture_response(response); |
petter | 5:8e468fef2754 | 62 | } |
petter | 5:8e468fef2754 | 63 | |
petter | 5:8e468fef2754 | 64 | bool RN52::prev_track(){ |
petter | 5:8e468fef2754 | 65 | char response[40]; |
petter | 5:8e468fef2754 | 66 | serial.printf(PREVTRACK); |
petter | 5:8e468fef2754 | 67 | return capture_response(response); |
petter | 5:8e468fef2754 | 68 | } |
petter | 5:8e468fef2754 | 69 | |
petter | 5:8e468fef2754 | 70 | bool RN52::toggle_play(){ |
petter | 5:8e468fef2754 | 71 | char response[40]; |
petter | 5:8e468fef2754 | 72 | serial.printf(PLAYPAUSE); |
petter | 5:8e468fef2754 | 73 | return capture_response(response); |
petter | 5:8e468fef2754 | 74 | } |
petter | 5:8e468fef2754 | 75 | |
petter | 5:8e468fef2754 | 76 | bool RN52::maxvolume(){ |
petter | 5:8e468fef2754 | 77 | char response[40]; |
petter | 5:8e468fef2754 | 78 | //serial.printf(MAXVOLUME); |
petter | 5:8e468fef2754 | 79 | serial.printf(VOLUMEUP); |
petter | 5:8e468fef2754 | 80 | serial.printf(VOLUMEUP); |
petter | 5:8e468fef2754 | 81 | serial.printf(VOLUMEUP); |
petter | 5:8e468fef2754 | 82 | serial.printf(VOLUMEUP); |
petter | 5:8e468fef2754 | 83 | return capture_response(response); |
petter | 0:6cf6e566c0da | 84 | } |
petter | 0:6cf6e566c0da | 85 | |
petter | 0:6cf6e566c0da | 86 | bool RN52::get(RN52_COMMAND cmd, RN52_RESULT * result){ |
petter | 0:6cf6e566c0da | 87 | switch (cmd) { |
petter | 4:3041a571b7a7 | 88 | case RN52_GETSTATUS: { |
petter | 0:6cf6e566c0da | 89 | serial.printf(GETSTATUS); |
petter | 0:6cf6e566c0da | 90 | capture_response(result->response); |
petter | 2:10c60edc8573 | 91 | int response_value = strtoul(result->response, NULL, 16); |
petter | 2:10c60edc8573 | 92 | result->media_connected = (response_value & (1 << 10)) >> 10; //byte 0, bit 2 |
petter | 2:10c60edc8573 | 93 | result->phone_connected = (response_value & (1 << 11)) >> 11; //byte 0, bit 3 |
petter | 2:10c60edc8573 | 94 | result->connection = (RN52_CONNECTION)(response_value & 0x0F); //byte 1, bits 0-3 |
petter | 4:3041a571b7a7 | 95 | switch (response_value & 0x3000) { |
petter | 4:3041a571b7a7 | 96 | case 0x1000: //byte 0, bit 4 |
petter | 4:3041a571b7a7 | 97 | result->event = RN52_CALLER_ID_EVENT; |
petter | 4:3041a571b7a7 | 98 | break; |
petter | 4:3041a571b7a7 | 99 | case 0x2000: //byte 0, bit 5 |
petter | 4:3041a571b7a7 | 100 | result->event = RN52_TRACK_CHANGE_EVENT; |
petter | 4:3041a571b7a7 | 101 | break; |
petter | 4:3041a571b7a7 | 102 | default: |
petter | 4:3041a571b7a7 | 103 | result->event = RN52_NO_EVENT; |
petter | 4:3041a571b7a7 | 104 | break; |
petter | 0:6cf6e566c0da | 105 | } |
petter | 0:6cf6e566c0da | 106 | break; |
petter | 4:3041a571b7a7 | 107 | } //added to create local scope of response_value |
petter | 0:6cf6e566c0da | 108 | case RN52_CALLER_ID: |
petter | 0:6cf6e566c0da | 109 | serial.printf(CALLER_ID); |
petter | 0:6cf6e566c0da | 110 | capture_response(result->response); |
petter | 0:6cf6e566c0da | 111 | //parse the response |
petter | 0:6cf6e566c0da | 112 | break; |
petter | 0:6cf6e566c0da | 113 | case RN52_TRACK_METADATA: |
petter | 0:6cf6e566c0da | 114 | serial.printf(TRACK_METADATA); |
petter | 0:6cf6e566c0da | 115 | capture_response(result->response); |
petter | 0:6cf6e566c0da | 116 | //parse the response |
petter | 4:3041a571b7a7 | 117 | break; |
petter | 0:6cf6e566c0da | 118 | default: |
petter | 0:6cf6e566c0da | 119 | return 0; |
petter | 0:6cf6e566c0da | 120 | } |
petter | 0:6cf6e566c0da | 121 | return 1; |
petter | 0:6cf6e566c0da | 122 | } |
petter | 0:6cf6e566c0da | 123 | |
petter | 0:6cf6e566c0da | 124 | |
petter | 5:8e468fef2754 | 125 | bool RN52::capture_response(char * str){ |
petter | 0:6cf6e566c0da | 126 | char c = ' '; |
petter | 0:6cf6e566c0da | 127 | char n = 0; |
petter | 0:6cf6e566c0da | 128 | while(c != '\n') { |
petter | 0:6cf6e566c0da | 129 | if(serial.readable()) { |
petter | 0:6cf6e566c0da | 130 | c = serial.getc(); |
petter | 0:6cf6e566c0da | 131 | str[n] = c; |
petter | 0:6cf6e566c0da | 132 | n++; |
petter | 0:6cf6e566c0da | 133 | } |
petter | 0:6cf6e566c0da | 134 | } |
petter | 0:6cf6e566c0da | 135 | str[n] = '\0'; |
petter | 5:8e468fef2754 | 136 | return (str[0] == 'A'); |
petter | 0:6cf6e566c0da | 137 | } |