Communication between BLE nano to raspberry pi

Dependencies:   BLE_API mbed nRF51822

Revision:
0:048c1ce80632
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Apr 13 23:24:25 2017 +0000
@@ -0,0 +1,282 @@
+/*
+
+Copyright (c) 2012-2014 RedBearLab
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
+and associated documentation files (the "Software"), to deal in the Software without restriction, 
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
+subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "mbed.h"
+#include "ble/BLE.h"
+
+#define BLE_UUID_TXRX_SERVICE            0x0000 /**< The UUID of the Nordic UART Service. */
+#define BLE_UUID_TX_CHARACTERISTIC       0x0002 /**< The UUID of the TX Characteristic. */
+#define BLE_UUIDS_RX_CHARACTERISTIC      0x0003 /**< The UUID of the RX Characteristic. */
+#define BLE_UUID_PI_ALERT_WRITE_NORESP   0x1802 /**< The UUID of the Write Without Response Alert level pi characteristic. */
+
+#define TXRX_BUF_LEN                     20
+
+//#define DIGITAL_OUT_PIN                  P0_9       //TXD
+#define DIGITAL_IN_PIN                   P0_10      //CTS
+//#define PWM_PIN                          P0_11      //RXD
+//#define SERVO_PIN                        P0_8       //RTS
+#define ANALOG_IN_PIN                    P0_4       //P04
+
+BLE             ble;
+uint8_t value = 0;
+
+//DigitalOut      LED_SET(DIGITAL_OUT_PIN);
+DigitalIn       BUTTON(DIGITAL_IN_PIN);
+//PwmOut          PWM(PWM_PIN);
+AnalogIn        ANALOG(ANALOG_IN_PIN);
+//Servo           MYSERVO(SERVO_PIN);
+
+Serial pc(USBTX, USBRX);
+bool connected = false;
+
+static uint8_t analog_enabled = 0;
+static uint8_t old_state = 0;
+
+// The Nordic UART Service
+static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
+static const uint8_t uart_tx_uuid[]   = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
+static const uint8_t uart_rx_uuid[]   = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
+static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
+
+
+uint8_t txPayload[TXRX_BUF_LEN] = {0,};
+uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
+
+//static uint8_t rx_buf[TXRX_BUF_LEN];
+//static uint8_t rx_len=0;
+
+
+GattCharacteristic  txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
+                                      
+GattCharacteristic  rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
+                                      
+GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
+
+GattService         uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
+
+
+
+/*
+void WrittenHandler(const GattWriteCallbackParams *Handler)
+{   
+    uint8_t buf[TXRX_BUF_LEN];
+    uint16_t bytesRead;
+    
+    if (Handler->handle == txCharacteristic.getValueAttribute().getHandle()) 
+    {
+        ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
+        memset(txPayload, 0, TXRX_BUF_LEN);
+        memcpy(txPayload, buf, TXRX_BUF_LEN);       
+        
+        //for(index=0; index<bytesRead; index++)
+            //pc.putc(buf[index]);
+            
+        if(buf[0] == 0x01)
+        {
+            if(buf[1] == 0x01)
+                LED_SET = 1;
+            else
+                LED_SET = 0;    
+        }
+        else if(buf[0] == 0xA0)
+        {
+            if(buf[1] == 0x01)
+                analog_enabled = 1;
+            else
+                analog_enabled = 0;
+        }
+        else if(buf[0] == 0x02)
+        {
+            float value = (float)buf[1]/255;
+            PWM = value;
+        }
+        else if(buf[0] == 0x03)
+        {
+            MYSERVO.write(buf[1]);
+        }
+        else if(buf[0] == 0x04)
+        {
+            analog_enabled = 0;
+            PWM = 0;
+            MYSERVO.write(0);
+            LED_SET = 0;
+            old_state = 0;    
+        }
+
+    }
+}
+*/
+/*
+void uartCB(void)
+{   
+    while(pc.readable())    
+    {
+        rx_buf[rx_len++] = pc.getc();    
+        if(rx_len>=20 || rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n')
+        {
+            ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), rx_buf, rx_len); 
+            pc.printf("RecHandler \r\n");
+            pc.printf("Length: ");
+            pc.putc(rx_len);
+            pc.printf("\r\n");
+            rx_len = 0;
+            break;
+        }
+    }
+}
+*/
+void m_status_check_handle(void)
+{   
+    uint8_t buf[3];
+    if (analog_enabled)  // if analog reading enabled
+    {
+        // Read and send out
+        float s = ANALOG;
+        uint16_t value = s*1024; 
+        buf[0] = (0x0B);
+        buf[1] = (value >> 8);
+        buf[2] = (value);
+        ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3); 
+    }
+    
+    // If digital in changes, report the state
+    if (BUTTON != old_state)
+    {
+        old_state = BUTTON;
+        
+        if (BUTTON == 1)
+        {
+            buf[0] = (0x0A);
+            buf[1] = (0x01);
+            buf[2] = (0x00);    
+            ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3); 
+        }
+        else
+        {
+            buf[0] = (0x0A);
+            buf[1] = (0x00);
+            buf[2] = (0x00);
+           ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3); 
+        }
+    }
+}
+
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+    connected = false;
+    pc.printf("Disconnected \r\n");
+    pc.printf("Restart advertising \r\n");
+    ble.gap().startAdvertising();
+}
+
+void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
+{
+    connected = true;
+    pc.printf("Connected\r\n");
+    Gap::Handle_t connHandle = params->handle;
+    GattClient& client = ble.gattClient();
+    while( connected ) {
+        ble.waitForEvent();
+        value++;
+        if( value > 100 ) {
+            value = 0;
+        }
+        pc.printf("Writing %d to GATT Client\r\n", value);
+
+        ble_error_t err = client.write((GattClient::WriteOp_t)0x2,
+                                   connHandle,
+                                   0x15,
+                                   sizeof(uint8_t),
+                                   &value);
+        if( err == 0 ) {
+            pc.printf("SUCCESS\r\n");
+        } else {
+            pc.printf("FAILURE: %d\r\n", err);
+        }
+    }
+}
+
+int main(void)
+{   
+    Ticker ticker;
+    ticker.attach_us(m_status_check_handle, 200000);
+    
+    ble.init();
+    ble.onDisconnection(disconnectionCallback);
+    //ble.onDataWritten(WrittenHandler);  
+    
+    pc.baud(9600);
+    pc.printf("BLE_Custom Init \r\n");
+
+    //pc.attach( uartCB , pc.RxIrq);
+    
+    // setup advertising 
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
+    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
+                                    (const uint8_t *)"LUMBERJACK_NANO", sizeof("LUMBERJACK_NANO") - 1);
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
+                                    (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
+    // 100ms; in multiples of 0.625ms. 
+    ble.setAdvertisingInterval(160);
+
+    ble.addService(uartService);
+    
+    ble.onDisconnection(disconnectionCallback);
+    ble.onConnection(connectionCallback);
+    
+    ble.startAdvertising(); 
+    //GattServer& server = ble.gattServer();
+    //pc.printf("Advertising Start \r\n");
+    while(1)
+    {
+        ble.waitForEvent();
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+