Test MLDP code for Microchip RN4020 BLE
Dependencies: mbed-src mbed-rtos MODSERIAL
main.cpp@2:6dd5f9113367, 2019-03-13 (annotated)
- Committer:
- edodm85
- Date:
- Wed Mar 13 21:24:20 2019 +0000
- Revision:
- 2:6dd5f9113367
- Parent:
- 1:2b5aaaddd35e
Test MLDP with RN4020
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 | 2:6dd5f9113367 | 3 | * Date: 19-03-13 |
edodm85 | 2:6dd5f9113367 | 4 | * Notes: Test MLDP connection with Microchip 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 | 2:6dd5f9113367 | 14 | ble_rn.printf("%s\r", cmd); |
edodm85 | 0:49a7ebfbee00 | 15 | } |
edodm85 | 0:49a7ebfbee00 | 16 | |
edodm85 | 0:49a7ebfbee00 | 17 | |
edodm85 | 0:49a7ebfbee00 | 18 | // init ble |
edodm85 | 0:49a7ebfbee00 | 19 | void setup_ble() |
edodm85 | 0:49a7ebfbee00 | 20 | { |
edodm85 | 0:49a7ebfbee00 | 21 | // Set the WAKE_SW pin high to enter Command mode. |
edodm85 | 0:49a7ebfbee00 | 22 | wakeSw = 1; |
edodm85 | 0:49a7ebfbee00 | 23 | wakeHw = 0; |
edodm85 | 0:49a7ebfbee00 | 24 | |
edodm85 | 0:49a7ebfbee00 | 25 | // enable Command Mode |
edodm85 | 0:49a7ebfbee00 | 26 | cmdMldp = 0; // (0 --> CMD, 1 --> MLDP) |
edodm85 | 0:49a7ebfbee00 | 27 | |
edodm85 | 0:49a7ebfbee00 | 28 | |
edodm85 | 0:49a7ebfbee00 | 29 | // reset to the factory default configuration |
edodm85 | 2:6dd5f9113367 | 30 | send_cmd("SF,1"); |
edodm85 | 0:49a7ebfbee00 | 31 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 32 | pc.printf("SF,1\n"); |
edodm85 | 0:49a7ebfbee00 | 33 | |
edodm85 | 0:49a7ebfbee00 | 34 | |
edodm85 | 0:49a7ebfbee00 | 35 | // sets the services supported |
edodm85 | 2:6dd5f9113367 | 36 | send_cmd("SS,00000000"); // No Service |
edodm85 | 0:49a7ebfbee00 | 37 | osDelay(500); |
edodm85 | 2:6dd5f9113367 | 38 | send_cmd("GS"); |
edodm85 | 0:49a7ebfbee00 | 39 | |
edodm85 | 0:49a7ebfbee00 | 40 | |
edodm85 | 0:49a7ebfbee00 | 41 | // sets the supported features of current RN4020 module |
edodm85 | 1:2b5aaaddd35e | 42 | // Auto Advertise |
edodm85 | 2:6dd5f9113367 | 43 | // Enable MLDP |
edodm85 | 2:6dd5f9113367 | 44 | // UART Flow Control |
edodm85 | 2:6dd5f9113367 | 45 | // Auto-enter MLDP Mode |
edodm85 | 2:6dd5f9113367 | 46 | send_cmd("SR,32000A00"); |
edodm85 | 0:49a7ebfbee00 | 47 | osDelay(500); |
edodm85 | 2:6dd5f9113367 | 48 | send_cmd("GR"); |
edodm85 | 0:49a7ebfbee00 | 49 | |
edodm85 | 0:49a7ebfbee00 | 50 | |
edodm85 | 0:49a7ebfbee00 | 51 | // sets the device name |
edodm85 | 2:6dd5f9113367 | 52 | send_cmd("SN,RN4020"); |
edodm85 | 0:49a7ebfbee00 | 53 | osDelay(500); |
edodm85 | 2:6dd5f9113367 | 54 | send_cmd("GN"); |
edodm85 | 2:6dd5f9113367 | 55 | |
edodm85 | 0:49a7ebfbee00 | 56 | |
edodm85 | 0:49a7ebfbee00 | 57 | // reboot the RN4020 module and to make the new settings effective |
edodm85 | 2:6dd5f9113367 | 58 | send_cmd("R,1"); |
edodm85 | 0:49a7ebfbee00 | 59 | osDelay(500); |
edodm85 | 0:49a7ebfbee00 | 60 | pc.printf("R,1\n"); |
edodm85 | 0:49a7ebfbee00 | 61 | |
edodm85 | 0:49a7ebfbee00 | 62 | |
edodm85 | 2:6dd5f9113367 | 63 | osDelay(2000); |
edodm85 | 1:2b5aaaddd35e | 64 | |
edodm85 | 2:6dd5f9113367 | 65 | start_ble = true; |
edodm85 | 2:6dd5f9113367 | 66 | cmdMldp = 1; |
edodm85 | 0:49a7ebfbee00 | 67 | } |
edodm85 | 0:49a7ebfbee00 | 68 | |
edodm85 | 0:49a7ebfbee00 | 69 | |
edodm85 | 0:49a7ebfbee00 | 70 | |
edodm85 | 0:49a7ebfbee00 | 71 | // This function is called when a character goes into the RX buffer. |
edodm85 | 0:49a7ebfbee00 | 72 | void rxBleCallback(MODSERIAL_IRQ_INFO *q) |
edodm85 | 0:49a7ebfbee00 | 73 | { |
edodm85 | 0:49a7ebfbee00 | 74 | led2 = 1; |
edodm85 | 0:49a7ebfbee00 | 75 | new_from_ble = true; |
edodm85 | 0:49a7ebfbee00 | 76 | } |
edodm85 | 0:49a7ebfbee00 | 77 | |
edodm85 | 0:49a7ebfbee00 | 78 | // This function is called when a character goes into the RX buffer. |
edodm85 | 0:49a7ebfbee00 | 79 | void rxPcCallback(MODSERIAL_IRQ_INFO *q) |
edodm85 | 0:49a7ebfbee00 | 80 | { |
edodm85 | 0:49a7ebfbee00 | 81 | led3 = 1; |
edodm85 | 0:49a7ebfbee00 | 82 | new_from_pc = true; |
edodm85 | 0:49a7ebfbee00 | 83 | } |
edodm85 | 0:49a7ebfbee00 | 84 | |
edodm85 | 0:49a7ebfbee00 | 85 | |
edodm85 | 0:49a7ebfbee00 | 86 | |
edodm85 | 0:49a7ebfbee00 | 87 | // read from BLE |
edodm85 | 0:49a7ebfbee00 | 88 | void read_thread(void const *argument) |
edodm85 | 0:49a7ebfbee00 | 89 | { |
edodm85 | 0:49a7ebfbee00 | 90 | while (true) |
edodm85 | 0:49a7ebfbee00 | 91 | { |
edodm85 | 0:49a7ebfbee00 | 92 | if(new_from_ble) |
edodm85 | 0:49a7ebfbee00 | 93 | { |
edodm85 | 0:49a7ebfbee00 | 94 | memset(blueChar, 0, sizeof(blueChar)); |
edodm85 | 0:49a7ebfbee00 | 95 | |
edodm85 | 0:49a7ebfbee00 | 96 | int i = 0; |
edodm85 | 0:49a7ebfbee00 | 97 | while(ble_rn.readable()) |
edodm85 | 0:49a7ebfbee00 | 98 | { |
edodm85 | 0:49a7ebfbee00 | 99 | blueChar[i] = ble_rn.getc(); |
edodm85 | 0:49a7ebfbee00 | 100 | i++; |
edodm85 | 0:49a7ebfbee00 | 101 | } |
edodm85 | 0:49a7ebfbee00 | 102 | if(i > 0) |
edodm85 | 0:49a7ebfbee00 | 103 | { |
edodm85 | 2:6dd5f9113367 | 104 | pc.printf("%s", blueChar); |
edodm85 | 0:49a7ebfbee00 | 105 | new_from_ble = false; |
edodm85 | 0:49a7ebfbee00 | 106 | } |
edodm85 | 0:49a7ebfbee00 | 107 | |
edodm85 | 0:49a7ebfbee00 | 108 | led2 = 0; |
edodm85 | 0:49a7ebfbee00 | 109 | } |
edodm85 | 0:49a7ebfbee00 | 110 | } |
edodm85 | 0:49a7ebfbee00 | 111 | } |
edodm85 | 0:49a7ebfbee00 | 112 | |
edodm85 | 0:49a7ebfbee00 | 113 | |
edodm85 | 0:49a7ebfbee00 | 114 | |
edodm85 | 0:49a7ebfbee00 | 115 | |
edodm85 | 0:49a7ebfbee00 | 116 | int main() |
edodm85 | 0:49a7ebfbee00 | 117 | { |
edodm85 | 0:49a7ebfbee00 | 118 | |
edodm85 | 0:49a7ebfbee00 | 119 | ble_rn.baud(115200); |
edodm85 | 0:49a7ebfbee00 | 120 | pc.baud(115200); |
edodm85 | 0:49a7ebfbee00 | 121 | |
edodm85 | 0:49a7ebfbee00 | 122 | ble_rn.attach(&rxBleCallback); |
edodm85 | 0:49a7ebfbee00 | 123 | pc.attach(&rxPcCallback); |
edodm85 | 0:49a7ebfbee00 | 124 | |
edodm85 | 0:49a7ebfbee00 | 125 | osThreadCreate(osThread(read_thread), NULL); |
edodm85 | 0:49a7ebfbee00 | 126 | |
edodm85 | 0:49a7ebfbee00 | 127 | pc.printf("Bluetooth Start\r\n"); |
edodm85 | 0:49a7ebfbee00 | 128 | |
edodm85 | 0:49a7ebfbee00 | 129 | // Init device |
edodm85 | 0:49a7ebfbee00 | 130 | setup_ble(); |
edodm85 | 0:49a7ebfbee00 | 131 | |
edodm85 | 0:49a7ebfbee00 | 132 | |
edodm85 | 2:6dd5f9113367 | 133 | int iBlink = 0; |
edodm85 | 0:49a7ebfbee00 | 134 | |
edodm85 | 0:49a7ebfbee00 | 135 | while(1) |
edodm85 | 0:49a7ebfbee00 | 136 | { |
edodm85 | 0:49a7ebfbee00 | 137 | if(new_from_pc) |
edodm85 | 0:49a7ebfbee00 | 138 | { |
edodm85 | 0:49a7ebfbee00 | 139 | // receive from PC uart |
edodm85 | 2:6dd5f9113367 | 140 | int iCount = 0; |
edodm85 | 0:49a7ebfbee00 | 141 | while(pc.readable()) |
edodm85 | 0:49a7ebfbee00 | 142 | { |
edodm85 | 2:6dd5f9113367 | 143 | pcChar[iCount] = pc.getc(); |
edodm85 | 2:6dd5f9113367 | 144 | iCount++; |
edodm85 | 0:49a7ebfbee00 | 145 | } |
edodm85 | 0:49a7ebfbee00 | 146 | |
edodm85 | 0:49a7ebfbee00 | 147 | // send to ble |
edodm85 | 2:6dd5f9113367 | 148 | send_cmd(pcChar); |
edodm85 | 0:49a7ebfbee00 | 149 | memset(pcChar, 0, sizeof(pcChar)); |
edodm85 | 0:49a7ebfbee00 | 150 | new_from_pc = false; |
edodm85 | 0:49a7ebfbee00 | 151 | led3 = 0; |
edodm85 | 0:49a7ebfbee00 | 152 | } |
edodm85 | 2:6dd5f9113367 | 153 | osDelay(10); |
edodm85 | 2:6dd5f9113367 | 154 | iBlink++; |
edodm85 | 2:6dd5f9113367 | 155 | if(iBlink == 50) |
edodm85 | 0:49a7ebfbee00 | 156 | { |
edodm85 | 0:49a7ebfbee00 | 157 | led1 = !led1; |
edodm85 | 2:6dd5f9113367 | 158 | iBlink=0; |
edodm85 | 0:49a7ebfbee00 | 159 | } |
edodm85 | 0:49a7ebfbee00 | 160 | } |
edodm85 | 0:49a7ebfbee00 | 161 | } |