Test MLDP code for Microchip RN4020 BLE

Dependencies:   mbed-src mbed-rtos MODSERIAL

Committer:
edodm85
Date:
Sat May 13 11:11:00 2017 +0000
Revision:
0:49a7ebfbee00
Child:
1:2b5aaaddd35e
Init version

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 0:49a7ebfbee00 49 pc.printf("SS,C0000001\n");
edodm85 0:49a7ebfbee00 50
edodm85 0:49a7ebfbee00 51
edodm85 0:49a7ebfbee00 52 // sets the supported features of current RN4020 module
edodm85 0:49a7ebfbee00 53 send_cmd("SR,20002000\n"); // Auto Advertise-Server Only
edodm85 0:49a7ebfbee00 54 osDelay(500);
edodm85 0:49a7ebfbee00 55 pc.printf("SR,20002000\n");
edodm85 0:49a7ebfbee00 56
edodm85 0:49a7ebfbee00 57
edodm85 0:49a7ebfbee00 58 // sets the device name
edodm85 0:49a7ebfbee00 59 send_cmd("SN,RN4020\n");
edodm85 0:49a7ebfbee00 60 osDelay(500);
edodm85 0:49a7ebfbee00 61 pc.printf("SN,RN4020\n");
edodm85 0:49a7ebfbee00 62
edodm85 0:49a7ebfbee00 63
edodm85 0:49a7ebfbee00 64 // Clear private service
edodm85 0:49a7ebfbee00 65 send_cmd("PZ\n");
edodm85 0:49a7ebfbee00 66 osDelay(500);
edodm85 0:49a7ebfbee00 67 pc.printf("PZ\n");
edodm85 0:49a7ebfbee00 68
edodm85 0:49a7ebfbee00 69
edodm85 0:49a7ebfbee00 70 // Set private service UUID
edodm85 0:49a7ebfbee00 71 memset(buffer, 0, sizeof(buffer));
edodm85 0:49a7ebfbee00 72 sprintf(buffer, "PS,%s\n", suuid);
edodm85 0:49a7ebfbee00 73 send_cmd(buffer);
edodm85 0:49a7ebfbee00 74 osDelay(500);
edodm85 0:49a7ebfbee00 75 pc.printf("%s", buffer);
edodm85 0:49a7ebfbee00 76
edodm85 0:49a7ebfbee00 77
edodm85 0:49a7ebfbee00 78 // Set private characteristic UUID Read/Notify
edodm85 0:49a7ebfbee00 79 memset(buffer, 0, sizeof(buffer));
edodm85 0:49a7ebfbee00 80 sprintf(buffer, "PC,%s,12,14\n", uuidR); // Read + Notify 10010b = 12hex and maximum data size of 20 bytes
edodm85 0:49a7ebfbee00 81 send_cmd(buffer);
edodm85 0:49a7ebfbee00 82 osDelay(500);
edodm85 0:49a7ebfbee00 83 pc.printf("%s", buffer);
edodm85 0:49a7ebfbee00 84
edodm85 0:49a7ebfbee00 85
edodm85 0:49a7ebfbee00 86 // Set private characteristic UUID Write
edodm85 0:49a7ebfbee00 87 memset(buffer, 0, sizeof(buffer));
edodm85 0:49a7ebfbee00 88 sprintf(buffer, "PC,%s,08,14\n", uuidW); // Write 1000b = 08hex and maximum data size of 20 bytes
edodm85 0:49a7ebfbee00 89 send_cmd(buffer);
edodm85 0:49a7ebfbee00 90 osDelay(500);
edodm85 0:49a7ebfbee00 91 pc.printf("%s", buffer);
edodm85 0:49a7ebfbee00 92
edodm85 0:49a7ebfbee00 93
edodm85 0:49a7ebfbee00 94 // reboot the RN4020 module and to make the new settings effective
edodm85 0:49a7ebfbee00 95 send_cmd("R,1\n");
edodm85 0:49a7ebfbee00 96 osDelay(500);
edodm85 0:49a7ebfbee00 97 pc.printf("R,1\n");
edodm85 0:49a7ebfbee00 98
edodm85 0:49a7ebfbee00 99
edodm85 0:49a7ebfbee00 100 // Start advertising
edodm85 0:49a7ebfbee00 101 send_cmd("A\n");
edodm85 0:49a7ebfbee00 102 osDelay(500);
edodm85 0:49a7ebfbee00 103 pc.printf("A\n");
edodm85 0:49a7ebfbee00 104
edodm85 0:49a7ebfbee00 105
edodm85 0:49a7ebfbee00 106 osDelay(2000);
edodm85 0:49a7ebfbee00 107
edodm85 0:49a7ebfbee00 108
edodm85 0:49a7ebfbee00 109 // Show list of Services
edodm85 0:49a7ebfbee00 110 send_cmd("LS\n");
edodm85 0:49a7ebfbee00 111 osDelay(500);
edodm85 0:49a7ebfbee00 112 pc.printf("LS\n");
edodm85 0:49a7ebfbee00 113
edodm85 0:49a7ebfbee00 114
edodm85 0:49a7ebfbee00 115 start_ble = true;
edodm85 0:49a7ebfbee00 116 }
edodm85 0:49a7ebfbee00 117
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 rxBleCallback(MODSERIAL_IRQ_INFO *q)
edodm85 0:49a7ebfbee00 122 {
edodm85 0:49a7ebfbee00 123 led2 = 1;
edodm85 0:49a7ebfbee00 124 new_from_ble = true;
edodm85 0:49a7ebfbee00 125 }
edodm85 0:49a7ebfbee00 126
edodm85 0:49a7ebfbee00 127 // This function is called when a character goes into the RX buffer.
edodm85 0:49a7ebfbee00 128 void rxPcCallback(MODSERIAL_IRQ_INFO *q)
edodm85 0:49a7ebfbee00 129 {
edodm85 0:49a7ebfbee00 130 led3 = 1;
edodm85 0:49a7ebfbee00 131 new_from_pc = true;
edodm85 0:49a7ebfbee00 132 }
edodm85 0:49a7ebfbee00 133
edodm85 0:49a7ebfbee00 134
edodm85 0:49a7ebfbee00 135
edodm85 0:49a7ebfbee00 136 // read from BLE
edodm85 0:49a7ebfbee00 137 void read_thread(void const *argument)
edodm85 0:49a7ebfbee00 138 {
edodm85 0:49a7ebfbee00 139 while (true)
edodm85 0:49a7ebfbee00 140 {
edodm85 0:49a7ebfbee00 141 if(new_from_ble)
edodm85 0:49a7ebfbee00 142 {
edodm85 0:49a7ebfbee00 143 memset(blueChar, 0, sizeof(blueChar));
edodm85 0:49a7ebfbee00 144
edodm85 0:49a7ebfbee00 145 int i = 0;
edodm85 0:49a7ebfbee00 146 while(ble_rn.readable())
edodm85 0:49a7ebfbee00 147 {
edodm85 0:49a7ebfbee00 148 blueChar[i] = ble_rn.getc();
edodm85 0:49a7ebfbee00 149 i++;
edodm85 0:49a7ebfbee00 150 }
edodm85 0:49a7ebfbee00 151 if(i > 0)
edodm85 0:49a7ebfbee00 152 {
edodm85 0:49a7ebfbee00 153 printf("%s", blueChar);
edodm85 0:49a7ebfbee00 154 new_from_ble = false;
edodm85 0:49a7ebfbee00 155 }
edodm85 0:49a7ebfbee00 156
edodm85 0:49a7ebfbee00 157 led2 = 0;
edodm85 0:49a7ebfbee00 158 }
edodm85 0:49a7ebfbee00 159 }
edodm85 0:49a7ebfbee00 160 }
edodm85 0:49a7ebfbee00 161
edodm85 0:49a7ebfbee00 162
edodm85 0:49a7ebfbee00 163
edodm85 0:49a7ebfbee00 164
edodm85 0:49a7ebfbee00 165
edodm85 0:49a7ebfbee00 166
edodm85 0:49a7ebfbee00 167 int main()
edodm85 0:49a7ebfbee00 168 {
edodm85 0:49a7ebfbee00 169
edodm85 0:49a7ebfbee00 170 ble_rn.baud(115200);
edodm85 0:49a7ebfbee00 171 pc.baud(115200);
edodm85 0:49a7ebfbee00 172
edodm85 0:49a7ebfbee00 173 ble_rn.attach(&rxBleCallback);
edodm85 0:49a7ebfbee00 174 pc.attach(&rxPcCallback);
edodm85 0:49a7ebfbee00 175
edodm85 0:49a7ebfbee00 176 osThreadCreate(osThread(read_thread), NULL);
edodm85 0:49a7ebfbee00 177
edodm85 0:49a7ebfbee00 178 pc.printf("Bluetooth Start\r\n");
edodm85 0:49a7ebfbee00 179
edodm85 0:49a7ebfbee00 180 // Init device
edodm85 0:49a7ebfbee00 181 setup_ble();
edodm85 0:49a7ebfbee00 182
edodm85 0:49a7ebfbee00 183
edodm85 0:49a7ebfbee00 184 int i = 0;
edodm85 0:49a7ebfbee00 185
edodm85 0:49a7ebfbee00 186 while(1)
edodm85 0:49a7ebfbee00 187 {
edodm85 0:49a7ebfbee00 188 if(new_from_pc)
edodm85 0:49a7ebfbee00 189 {
edodm85 0:49a7ebfbee00 190 // receive from PC uart
edodm85 0:49a7ebfbee00 191 int i = 0;
edodm85 0:49a7ebfbee00 192 while(pc.readable())
edodm85 0:49a7ebfbee00 193 {
edodm85 0:49a7ebfbee00 194 pcChar[i] = pc.getc();
edodm85 0:49a7ebfbee00 195 i++;
edodm85 0:49a7ebfbee00 196 }
edodm85 0:49a7ebfbee00 197
edodm85 0:49a7ebfbee00 198 printf("Received from PC: %s", pcChar);
edodm85 0:49a7ebfbee00 199
edodm85 0:49a7ebfbee00 200 // send to ble
edodm85 0:49a7ebfbee00 201 write_characteristic(pcChar, i);
edodm85 0:49a7ebfbee00 202 memset(pcChar, 0, sizeof(pcChar));
edodm85 0:49a7ebfbee00 203 new_from_pc = false;
edodm85 0:49a7ebfbee00 204 led3 = 0;
edodm85 0:49a7ebfbee00 205 }
edodm85 0:49a7ebfbee00 206 osDelay(100);
edodm85 0:49a7ebfbee00 207 i++;
edodm85 0:49a7ebfbee00 208 if(i == 5)
edodm85 0:49a7ebfbee00 209 {
edodm85 0:49a7ebfbee00 210 led1 = !led1;
edodm85 0:49a7ebfbee00 211 i=0;
edodm85 0:49a7ebfbee00 212 }
edodm85 0:49a7ebfbee00 213 }
edodm85 0:49a7ebfbee00 214 }