Test MLDP code for Microchip RN4020 BLE
Dependencies: mbed-src mbed-rtos MODSERIAL
main.cpp@1:2b5aaaddd35e, 2019-03-13 (annotated)
- Committer:
- edodm85
- Date:
- Wed Mar 13 19:13:09 2019 +0000
- Revision:
- 1:2b5aaaddd35e
- Parent:
- 0:49a7ebfbee00
- Child:
- 2:6dd5f9113367
update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
edodm85 | 0:49a7ebfbee00 | 1 | /* |
edodm85 | 0:49a7ebfbee00 | 2 | * Author: Edoardo De Marchi |
edodm85 | 0:49a7ebfbee00 | 3 | * Date: 17-05-13 |
edodm85 | 0:49a7ebfbee00 | 4 | * Notes: Test code for Microcip RN4020 BLE |
edodm85 | 0:49a7ebfbee00 | 5 | */ |
edodm85 | 0:49a7ebfbee00 | 6 | |
edodm85 | 0:49a7ebfbee00 | 7 | |
edodm85 | 0:49a7ebfbee00 | 8 | #include "main.h" |
edodm85 | 0:49a7ebfbee00 | 9 | |
edodm85 | 0:49a7ebfbee00 | 10 | |
edodm85 | 0:49a7ebfbee00 | 11 | // Send command to ble |
edodm85 | 0:49a7ebfbee00 | 12 | void send_cmd(char* cmd) |
edodm85 | 0:49a7ebfbee00 | 13 | { |
edodm85 | 0:49a7ebfbee00 | 14 | ble_rn.printf("%s", cmd); |
edodm85 | 0:49a7ebfbee00 | 15 | } |
edodm85 | 0:49a7ebfbee00 | 16 | |
edodm85 | 0:49a7ebfbee00 | 17 | |
edodm85 | 0:49a7ebfbee00 | 18 | |
edodm85 | 0:49a7ebfbee00 | 19 | // write to phone via bluetooth |
edodm85 | 0:49a7ebfbee00 | 20 | void write_characteristic(char* data, int length) |
edodm85 | 0:49a7ebfbee00 | 21 | { |
edodm85 | 0:49a7ebfbee00 | 22 | memset(buffer, 0, sizeof(buffer)); |
edodm85 | 0:49a7ebfbee00 | 23 | sprintf(buffer, "SUW,%s,%s\n", uuidR, data); |
edodm85 | 0:49a7ebfbee00 | 24 | send_cmd(buffer); |
edodm85 | 0:49a7ebfbee00 | 25 | } |
edodm85 | 0:49a7ebfbee00 | 26 | |
edodm85 | 0:49a7ebfbee00 | 27 | |
edodm85 | 0:49a7ebfbee00 | 28 | |
edodm85 | 0:49a7ebfbee00 | 29 | // init ble |
edodm85 | 0:49a7ebfbee00 | 30 | void setup_ble() |
edodm85 | 0:49a7ebfbee00 | 31 | { |
edodm85 | 0:49a7ebfbee00 | 32 | // Set the WAKE_SW pin high to enter Command mode. |
edodm85 | 0:49a7ebfbee00 | 33 | wakeSw = 1; |
edodm85 | 0:49a7ebfbee00 | 34 | wakeHw = 0; |
edodm85 | 0:49a7ebfbee00 | 35 | |
edodm85 | 0:49a7ebfbee00 | 36 | // enable Command Mode |
edodm85 | 0:49a7ebfbee00 | 37 | cmdMldp = 0; // (0 --> CMD, 1 --> MLDP) |
edodm85 | 0:49a7ebfbee00 | 38 | |
edodm85 | 0:49a7ebfbee00 | 39 | |
edodm85 | 0:49a7ebfbee00 | 40 | // reset to the factory default configuration |
edodm85 | 0:49a7ebfbee00 | 41 | send_cmd("SF,1\n"); |
edodm85 | 0:49a7ebfbee00 | 42 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 43 | pc.printf("SF,1\n"); |
edodm85 | 0:49a7ebfbee00 | 44 | |
edodm85 | 0:49a7ebfbee00 | 45 | |
edodm85 | 0:49a7ebfbee00 | 46 | // sets the services supported |
edodm85 | 0:49a7ebfbee00 | 47 | send_cmd("SS,C0000001\n"); // Private Service + Device Information |
edodm85 | 0:49a7ebfbee00 | 48 | osDelay(500); |
edodm85 | 1:2b5aaaddd35e | 49 | send_cmd("GS\n"); |
edodm85 | 0:49a7ebfbee00 | 50 | |
edodm85 | 0:49a7ebfbee00 | 51 | |
edodm85 | 0:49a7ebfbee00 | 52 | // sets the supported features of current RN4020 module |
edodm85 | 1:2b5aaaddd35e | 53 | // Auto Advertise |
edodm85 | 1:2b5aaaddd35e | 54 | send_cmd("SR,20000000\n"); |
edodm85 | 0:49a7ebfbee00 | 55 | osDelay(500); |
edodm85 | 1:2b5aaaddd35e | 56 | send_cmd("GR\n"); |
edodm85 | 0:49a7ebfbee00 | 57 | |
edodm85 | 0:49a7ebfbee00 | 58 | |
edodm85 | 0:49a7ebfbee00 | 59 | // sets the device name |
edodm85 | 0:49a7ebfbee00 | 60 | send_cmd("SN,RN4020\n"); |
edodm85 | 0:49a7ebfbee00 | 61 | osDelay(500); |
edodm85 | 1:2b5aaaddd35e | 62 | send_cmd("GN\n"); |
edodm85 | 0:49a7ebfbee00 | 63 | |
edodm85 | 0:49a7ebfbee00 | 64 | |
edodm85 | 0:49a7ebfbee00 | 65 | // Clear private service |
edodm85 | 0:49a7ebfbee00 | 66 | send_cmd("PZ\n"); |
edodm85 | 0:49a7ebfbee00 | 67 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 68 | pc.printf("PZ\n"); |
edodm85 | 0:49a7ebfbee00 | 69 | |
edodm85 | 0:49a7ebfbee00 | 70 | |
edodm85 | 0:49a7ebfbee00 | 71 | // Set private service UUID |
edodm85 | 0:49a7ebfbee00 | 72 | memset(buffer, 0, sizeof(buffer)); |
edodm85 | 0:49a7ebfbee00 | 73 | sprintf(buffer, "PS,%s\n", suuid); |
edodm85 | 0:49a7ebfbee00 | 74 | send_cmd(buffer); |
edodm85 | 0:49a7ebfbee00 | 75 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 76 | pc.printf("%s", buffer); |
edodm85 | 0:49a7ebfbee00 | 77 | |
edodm85 | 0:49a7ebfbee00 | 78 | |
edodm85 | 0:49a7ebfbee00 | 79 | // Set private characteristic UUID Read/Notify |
edodm85 | 0:49a7ebfbee00 | 80 | memset(buffer, 0, sizeof(buffer)); |
edodm85 | 0:49a7ebfbee00 | 81 | sprintf(buffer, "PC,%s,12,14\n", uuidR); // Read + Notify 10010b = 12hex and maximum data size of 20 bytes |
edodm85 | 0:49a7ebfbee00 | 82 | send_cmd(buffer); |
edodm85 | 0:49a7ebfbee00 | 83 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 84 | pc.printf("%s", buffer); |
edodm85 | 0:49a7ebfbee00 | 85 | |
edodm85 | 0:49a7ebfbee00 | 86 | |
edodm85 | 0:49a7ebfbee00 | 87 | // Set private characteristic UUID Write |
edodm85 | 0:49a7ebfbee00 | 88 | memset(buffer, 0, sizeof(buffer)); |
edodm85 | 0:49a7ebfbee00 | 89 | sprintf(buffer, "PC,%s,08,14\n", uuidW); // Write 1000b = 08hex and maximum data size of 20 bytes |
edodm85 | 0:49a7ebfbee00 | 90 | send_cmd(buffer); |
edodm85 | 0:49a7ebfbee00 | 91 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 92 | pc.printf("%s", buffer); |
edodm85 | 0:49a7ebfbee00 | 93 | |
edodm85 | 0:49a7ebfbee00 | 94 | |
edodm85 | 0:49a7ebfbee00 | 95 | // reboot the RN4020 module and to make the new settings effective |
edodm85 | 0:49a7ebfbee00 | 96 | send_cmd("R,1\n"); |
edodm85 | 0:49a7ebfbee00 | 97 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 98 | pc.printf("R,1\n"); |
edodm85 | 0:49a7ebfbee00 | 99 | |
edodm85 | 0:49a7ebfbee00 | 100 | |
edodm85 | 0:49a7ebfbee00 | 101 | osDelay(2000); |
edodm85 | 0:49a7ebfbee00 | 102 | |
edodm85 | 0:49a7ebfbee00 | 103 | |
edodm85 | 0:49a7ebfbee00 | 104 | // Show list of Services |
edodm85 | 0:49a7ebfbee00 | 105 | send_cmd("LS\n"); |
edodm85 | 0:49a7ebfbee00 | 106 | osDelay(500); |
edodm85 | 1:2b5aaaddd35e | 107 | |
edodm85 | 0:49a7ebfbee00 | 108 | start_ble = true; |
edodm85 | 0:49a7ebfbee00 | 109 | } |
edodm85 | 0:49a7ebfbee00 | 110 | |
edodm85 | 0:49a7ebfbee00 | 111 | |
edodm85 | 0:49a7ebfbee00 | 112 | |
edodm85 | 0:49a7ebfbee00 | 113 | // This function is called when a character goes into the RX buffer. |
edodm85 | 0:49a7ebfbee00 | 114 | void rxBleCallback(MODSERIAL_IRQ_INFO *q) |
edodm85 | 0:49a7ebfbee00 | 115 | { |
edodm85 | 0:49a7ebfbee00 | 116 | led2 = 1; |
edodm85 | 0:49a7ebfbee00 | 117 | new_from_ble = true; |
edodm85 | 0:49a7ebfbee00 | 118 | } |
edodm85 | 0:49a7ebfbee00 | 119 | |
edodm85 | 0:49a7ebfbee00 | 120 | // This function is called when a character goes into the RX buffer. |
edodm85 | 0:49a7ebfbee00 | 121 | void rxPcCallback(MODSERIAL_IRQ_INFO *q) |
edodm85 | 0:49a7ebfbee00 | 122 | { |
edodm85 | 0:49a7ebfbee00 | 123 | led3 = 1; |
edodm85 | 0:49a7ebfbee00 | 124 | new_from_pc = true; |
edodm85 | 0:49a7ebfbee00 | 125 | } |
edodm85 | 0:49a7ebfbee00 | 126 | |
edodm85 | 0:49a7ebfbee00 | 127 | |
edodm85 | 0:49a7ebfbee00 | 128 | |
edodm85 | 0:49a7ebfbee00 | 129 | // read from BLE |
edodm85 | 0:49a7ebfbee00 | 130 | void read_thread(void const *argument) |
edodm85 | 0:49a7ebfbee00 | 131 | { |
edodm85 | 0:49a7ebfbee00 | 132 | while (true) |
edodm85 | 0:49a7ebfbee00 | 133 | { |
edodm85 | 0:49a7ebfbee00 | 134 | if(new_from_ble) |
edodm85 | 0:49a7ebfbee00 | 135 | { |
edodm85 | 0:49a7ebfbee00 | 136 | memset(blueChar, 0, sizeof(blueChar)); |
edodm85 | 0:49a7ebfbee00 | 137 | |
edodm85 | 0:49a7ebfbee00 | 138 | int i = 0; |
edodm85 | 0:49a7ebfbee00 | 139 | while(ble_rn.readable()) |
edodm85 | 0:49a7ebfbee00 | 140 | { |
edodm85 | 0:49a7ebfbee00 | 141 | blueChar[i] = ble_rn.getc(); |
edodm85 | 0:49a7ebfbee00 | 142 | i++; |
edodm85 | 0:49a7ebfbee00 | 143 | } |
edodm85 | 0:49a7ebfbee00 | 144 | if(i > 0) |
edodm85 | 0:49a7ebfbee00 | 145 | { |
edodm85 | 0:49a7ebfbee00 | 146 | printf("%s", blueChar); |
edodm85 | 0:49a7ebfbee00 | 147 | new_from_ble = false; |
edodm85 | 0:49a7ebfbee00 | 148 | } |
edodm85 | 0:49a7ebfbee00 | 149 | |
edodm85 | 0:49a7ebfbee00 | 150 | led2 = 0; |
edodm85 | 0:49a7ebfbee00 | 151 | } |
edodm85 | 0:49a7ebfbee00 | 152 | } |
edodm85 | 0:49a7ebfbee00 | 153 | } |
edodm85 | 0:49a7ebfbee00 | 154 | |
edodm85 | 0:49a7ebfbee00 | 155 | |
edodm85 | 0:49a7ebfbee00 | 156 | |
edodm85 | 0:49a7ebfbee00 | 157 | |
edodm85 | 0:49a7ebfbee00 | 158 | |
edodm85 | 0:49a7ebfbee00 | 159 | |
edodm85 | 0:49a7ebfbee00 | 160 | int main() |
edodm85 | 0:49a7ebfbee00 | 161 | { |
edodm85 | 0:49a7ebfbee00 | 162 | |
edodm85 | 0:49a7ebfbee00 | 163 | ble_rn.baud(115200); |
edodm85 | 0:49a7ebfbee00 | 164 | pc.baud(115200); |
edodm85 | 0:49a7ebfbee00 | 165 | |
edodm85 | 0:49a7ebfbee00 | 166 | ble_rn.attach(&rxBleCallback); |
edodm85 | 0:49a7ebfbee00 | 167 | pc.attach(&rxPcCallback); |
edodm85 | 0:49a7ebfbee00 | 168 | |
edodm85 | 0:49a7ebfbee00 | 169 | osThreadCreate(osThread(read_thread), NULL); |
edodm85 | 0:49a7ebfbee00 | 170 | |
edodm85 | 0:49a7ebfbee00 | 171 | pc.printf("Bluetooth Start\r\n"); |
edodm85 | 0:49a7ebfbee00 | 172 | |
edodm85 | 0:49a7ebfbee00 | 173 | // Init device |
edodm85 | 0:49a7ebfbee00 | 174 | setup_ble(); |
edodm85 | 0:49a7ebfbee00 | 175 | |
edodm85 | 0:49a7ebfbee00 | 176 | |
edodm85 | 0:49a7ebfbee00 | 177 | int i = 0; |
edodm85 | 0:49a7ebfbee00 | 178 | |
edodm85 | 0:49a7ebfbee00 | 179 | while(1) |
edodm85 | 0:49a7ebfbee00 | 180 | { |
edodm85 | 0:49a7ebfbee00 | 181 | if(new_from_pc) |
edodm85 | 0:49a7ebfbee00 | 182 | { |
edodm85 | 0:49a7ebfbee00 | 183 | // receive from PC uart |
edodm85 | 0:49a7ebfbee00 | 184 | int i = 0; |
edodm85 | 0:49a7ebfbee00 | 185 | while(pc.readable()) |
edodm85 | 0:49a7ebfbee00 | 186 | { |
edodm85 | 0:49a7ebfbee00 | 187 | pcChar[i] = pc.getc(); |
edodm85 | 0:49a7ebfbee00 | 188 | i++; |
edodm85 | 0:49a7ebfbee00 | 189 | } |
edodm85 | 0:49a7ebfbee00 | 190 | |
edodm85 | 0:49a7ebfbee00 | 191 | printf("Received from PC: %s", pcChar); |
edodm85 | 0:49a7ebfbee00 | 192 | |
edodm85 | 0:49a7ebfbee00 | 193 | // send to ble |
edodm85 | 0:49a7ebfbee00 | 194 | write_characteristic(pcChar, i); |
edodm85 | 0:49a7ebfbee00 | 195 | memset(pcChar, 0, sizeof(pcChar)); |
edodm85 | 0:49a7ebfbee00 | 196 | new_from_pc = false; |
edodm85 | 0:49a7ebfbee00 | 197 | led3 = 0; |
edodm85 | 0:49a7ebfbee00 | 198 | } |
edodm85 | 0:49a7ebfbee00 | 199 | osDelay(100); |
edodm85 | 0:49a7ebfbee00 | 200 | i++; |
edodm85 | 0:49a7ebfbee00 | 201 | if(i == 5) |
edodm85 | 0:49a7ebfbee00 | 202 | { |
edodm85 | 0:49a7ebfbee00 | 203 | led1 = !led1; |
edodm85 | 0:49a7ebfbee00 | 204 | i=0; |
edodm85 | 0:49a7ebfbee00 | 205 | } |
edodm85 | 0:49a7ebfbee00 | 206 | } |
edodm85 | 0:49a7ebfbee00 | 207 | } |