Test MLDP code for Microchip RN4020 BLE

Dependencies:   mbed-src mbed-rtos MODSERIAL

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?

UserRevisionLine numberNew 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 }