Test MLDP code for Microchip RN4020 BLE

Dependencies:   mbed-src mbed-rtos MODSERIAL

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?

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