Test MLDP code for Microchip RN4020 BLE

Dependencies:   mbed-src mbed-rtos MODSERIAL

main.cpp

Committer:
edodm85
Date:
2019-03-13
Revision:
1:2b5aaaddd35e
Parent:
0:49a7ebfbee00
Child:
2:6dd5f9113367

File content as of revision 1:2b5aaaddd35e:

/*
 * Author: Edoardo De Marchi
 * Date: 17-05-13
 * Notes: Test code for Microcip RN4020 BLE
*/


#include "main.h"


// Send command to ble
void send_cmd(char* cmd) 
{
    ble_rn.printf("%s", cmd); 
}

 

// write to phone via bluetooth
void write_characteristic(char* data, int length) 
{  
    memset(buffer, 0, sizeof(buffer));
    sprintf(buffer, "SUW,%s,%s\n", uuidR, data);
    send_cmd(buffer);
}
 
 
 
// init ble
void setup_ble() 
{
    // Set the WAKE_SW pin high to enter Command mode.
    wakeSw = 1; 
    wakeHw = 0;
    
    // enable Command Mode
    cmdMldp = 0;                        // (0 --> CMD, 1 --> MLDP)


    // reset to the factory default configuration
    send_cmd("SF,1\n");
    osDelay(500);                 
    pc.printf("SF,1\n");


    // sets the services supported
    send_cmd("SS,C0000001\n");          // Private Service + Device Information
    osDelay(500);
    send_cmd("GS\n");
    
    
    // sets the supported features of current RN4020 module
    // Auto Advertise 
    send_cmd("SR,20000000\n");                                              
    osDelay(500);
    send_cmd("GR\n");
   
    
    // sets the device name
    send_cmd("SN,RN4020\n");           
    osDelay(500);
    send_cmd("GN\n");
    
    
    // Clear private service
    send_cmd("PZ\n");                               
    osDelay(500);
    pc.printf("PZ\n");

    
    // Set private service UUID
    memset(buffer, 0, sizeof(buffer));
    sprintf(buffer, "PS,%s\n", suuid);              
    send_cmd(buffer);
    osDelay(500);
    pc.printf("%s", buffer);
    

    // Set private characteristic UUID Read/Notify
    memset(buffer, 0, sizeof(buffer));
    sprintf(buffer, "PC,%s,12,14\n", uuidR);         // Read + Notify  10010b = 12hex and maximum data size of 20 bytes
    send_cmd(buffer);
    osDelay(500);
    pc.printf("%s", buffer);
    
    
    // Set private characteristic UUID Write
    memset(buffer, 0, sizeof(buffer));
    sprintf(buffer, "PC,%s,08,14\n", uuidW);         // Write  1000b = 08hex and maximum data size of 20 bytes
    send_cmd(buffer);
    osDelay(500);
    pc.printf("%s", buffer);
    
    
    // reboot the RN4020 module and to make the new settings effective
    send_cmd("R,1\n"); 
    osDelay(500);                 
    pc.printf("R,1\n");
    
    
    osDelay(2000); 


    // Show list of Services
    send_cmd("LS\n");
    osDelay(500);                   
     
    start_ble = true;
} 
 


// This function is called when a character goes into the RX buffer.
void rxBleCallback(MODSERIAL_IRQ_INFO *q) 
{
    led2 = 1;
    new_from_ble = true;
}

// This function is called when a character goes into the RX buffer.
void rxPcCallback(MODSERIAL_IRQ_INFO *q) 
{
    led3 = 1;
    new_from_pc = true;
} 



// read from BLE
void read_thread(void const *argument)
{
    while (true) 
    {
        if(new_from_ble)
        {
            memset(blueChar, 0, sizeof(blueChar)); 
            
            int i = 0;
            while(ble_rn.readable())
            {
                blueChar[i] = ble_rn.getc();           
                i++;        
            }
            if(i > 0)
            {
                printf("%s", blueChar);
                new_from_ble = false;  
            } 
            
            led2 = 0;
        }  
    } 
} 





 
int main() 
{   

    ble_rn.baud(115200);
    pc.baud(115200);
    
    ble_rn.attach(&rxBleCallback);
    pc.attach(&rxPcCallback);
 
    osThreadCreate(osThread(read_thread), NULL);
    
    pc.printf("Bluetooth Start\r\n");
    
    // Init device
    setup_ble();
 
    
    int i = 0;
   
    while(1)
    {
        if(new_from_pc)
        {
            // receive from PC uart
            int i = 0;
            while(pc.readable())
            {
                pcChar[i] = pc.getc();
                i++;
            }
            
            printf("Received from PC: %s", pcChar); 
            
            // send to ble
            write_characteristic(pcChar, i);
            memset(pcChar, 0, sizeof(pcChar));
            new_from_pc = false;
            led3 = 0;
        } 
        osDelay(100);
        i++;
        if(i == 5)
        {
            led1 = !led1;
            i=0;    
        }
    } 
}