Ble Demo with Raspberry PI

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_DEMO_SPI_HARDCODE by HM_IOT_Demo

Revision:
9:b967a01810e1
Parent:
8:285ebd0e83fb
Child:
10:5e5fa5bf77b5
--- a/main.cpp	Wed Jan 25 08:08:20 2017 +0000
+++ b/main.cpp	Wed Jan 25 14:41:05 2017 +0000
@@ -4,29 +4,27 @@
 ************************************************************************/
 
 #include "hm_config.h"
+//#include "rtos.h"
 
 DiscoveredCharacteristic lightCharacteristic;
 s_serviceInfo lightChar = {NULL,NULL,NULL,NULL};
 Serial pc(USBTX, USBRX);
 
- void bleint();
-bool serviceDiscover = true;
-void readCharacteristics();
-void spiRead();  
-void testaction(uint8_t options);
-bool isint = true;
+void bleint();
+void SPI_Slave_read();
+
 SPISlave spiSlave(P0_9, P0_11, P0_8, P0_10);
 
+bool serviceDiscover = true;
 int spiRX[4];
    // uint8_t spiTX[4];
 uint8_t bufferSize;
 
 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
     uint8_t con_status =0;
-   // uint8_t i;
      //0x51 for Magic light 
     //0x5A
-    if ((params->peerAddr[0] == 0x51) || (params->peerAddr[0] == 0x5A)) { // 0x2F for red bear1.5 /* !ALERT! Alter this filter to suit your device. */
+    if (params->peerAddr[0] == 0x51) { // 0x2F for red bear1.5 /* !ALERT! Alter this filter to suit your device. */
        
            pc.printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
            params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
@@ -36,9 +34,10 @@
            pc.printf("Connection Status : %d\r\n",con_status);
            connect_status = 1;
            BLE::Instance().gap().stopScan();
+           
     }else{
         printf("Not Matched your device\r\n");
-        return; 
+        return;
     }
  }
 
@@ -59,20 +58,15 @@
 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
     pc.printf("  C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
     
-    if (characteristicP->getUUID().getShortUUID() == 0xffe9 ) { /* !ALERT! Alter this filter to suit your device. */
+    if (characteristicP->getUUID().getShortUUID() == 0xffe9) { /* !ALERT! Alter this filter to suit your device. */
        lightCharacteristic = *characteristicP;
        pc.printf("Matched char UUID\r\n");
        printf("Conn Handle = %dand %d \r\n",characteristicP->getConnectionHandle(), lightCharacteristic.getConnectionHandle());
        printf("Value Handle = %d and %d\r\n",characteristicP->getValueHandle(),lightCharacteristic.getValueHandle());
-      // lightCharacteristic.writeWoResponse(sizeof(write_data), write_data);
-      charDiscover = 1;
-      serviceDiscover = true;
-      AddCharNodes(lightCharacteristic);
-      //light_actions(1);
-   
-        //BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,characteristicP->getConnectionHandle(),characteristicP->getValueHandle(),sizeof(write_data),write_data);
-   
-    }else {
+       charDiscover = 1;
+       serviceDiscover = true;
+       AddCharNodes(lightCharacteristic);
+     }else {
         printf("Not Matched char UUID\r\n");
     }
 }
@@ -81,9 +75,6 @@
 {
     printf("Add Char Nodes\r\n");
     lightCharacteristic_t *ptr_temp_char = NULL;
-    
-    printf("\n\rAdding Node...");
-
     ptr_temp_char = lightChar.services_Char[0];
 
     if(NULL == ptr_temp_char)
@@ -109,8 +100,6 @@
     printf("Value Handle = %d\r\n",light_Characteristic.getValueHandle());
     ptr_temp_char->connHandle = light_Characteristic.getConnectionHandle();
     ptr_temp_char->valueHandle = light_Characteristic.getValueHandle();
-    printf("After Conn Handle = %d\r\n",ptr_temp_char->connHandle);
-    printf("After Value Handle = %d\r\n",ptr_temp_char->valueHandle);
     ptr_temp_char->nextChar = NULL;  
 }
 
@@ -142,16 +131,16 @@
     BLE&        ble   = params->ble;
     
     pc.printf("Ble Init\n\r");
-    /* Ensure that it is the default instance of BLE 
+    /* Ensure that it is the default instance of BLE */
     if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
         return;
-    }*/
+    }
  
-  //  ble.gap().onConnection(connectionCallback);
-//    ble.gap().onDisconnection(disconnectionCallback);
+    ble.gap().onConnection(connectionCallback);
+    ble.gap().onDisconnection(disconnectionCallback);
     
-  //  ble.gap().setScanParams(1000, 800);
-   // ble.gap().startScan(advertisementCallback);
+    ble.gap().setScanParams(1000, 800);
+    ble.gap().startScan(advertisementCallback);
 }
 
 void light_actions(int service_char[]){
@@ -159,15 +148,13 @@
     //={0x56,0xff,0x00,0x00,0x00,0xf0,0xaa};
     write_data = new uint8_t[7];
     lightCharacteristic_t *ptr_tmp = NULL;
-   // uint8_t op;
-    ptr_tmp = lightChar.services_Char[service_char[0]-1];
-    printf("Conn Handle = %d\r\n",ptr_tmp->connHandle);
-    printf("Value Handle = %d\r\n",ptr_tmp->valueHandle);
-        if(connect_status)
+    ptr_tmp = lightChar.services_Char[service_char[1]-1];
+  //  printf("Conn Handle = %d\r\n",ptr_tmp->connHandle);
+   // printf("Value Handle = %d\r\n",ptr_tmp->valueHandle);
+              if(connect_status)
                {
-                   //scanf("%d", &op);
-                   printf("options : %d\n",service_char[1]);
-                   switch(service_char[1])
+
+                   switch(service_char[2])
                    {
                        case TURN_OFF: // off 
                             write_data[0]=0x56;
@@ -183,7 +170,7 @@
                        case TURN_ON: //on
                             write_data[0]=0x56;
                             write_data[1]=0xff;
-                            write_data[2]=0x00;
+                            write_data[2]=0xff;
                             write_data[3]=0xff;
                             write_data[4]=0x00;
                             write_data[5]=0xf0;
@@ -193,9 +180,9 @@
                        
                        case COLOR: // Color
                             write_data[0]=0x56;
-                            write_data[1]=0xff; //lightColor[service_char[2]][0];//0xff
-                            write_data[2]=0x00;//lightColor[service_char[2]][1];//0x00;
-                            write_data[3]=0x00;//lightColor[service_char[2]][2];//0x00;
+                            write_data[1]=lightColor[service_char[3]][0];//0xff
+                            write_data[2]=lightColor[service_char[3]][1];//0x00;
+                            write_data[3]=lightColor[service_char[3]][2];//0x00;
                             write_data[4]=0x00;
                             write_data[5]=0xf0;
                             write_data[6]=0xaa;
@@ -204,30 +191,16 @@
                             break;
                        
                        default:
-                            printf("Invalid Options\r\n");
-                       
+                          printf("Invalid Options\r\n");
                    } 
-                         printf("Write Status : %d\r\n",error_status);
                 delete [] write_data;
-               } 
-}
-
-void readCharacteristics(){
-    printf("Read Characteristics \r\n");
-    lightCharacteristic_t *ptr_tmp = NULL;
-    ptr_tmp = lightChar.services_Char[1]; 
-    uint16_t read_data;
-    error_status = BLE::Instance().gattClient().read(ptr_tmp->connHandle,ptr_tmp->valueHandle,read_data);
-    printf("Read Data : %d\r\n",read_data);
+            } 
 }
 
 void datancpy(char *pre_write, char *writeData, int data_size){
     int numCount;
-    printf("length %d\r\n",sizeof(writeData));
     for(numCount=0; numCount <= data_size; numCount++){
         pre_write[numCount] = writeData[numCount];
-       // printf("write Value = %02x\r\n",writeData[numCount]);
-       //printf("Copy Value = %2x %d \r\n",pre_write[numCount],pre_write[numCount]);
     }
     
 }
@@ -235,11 +208,8 @@
 void bleint()
 {
     printf("Init\r\n");
-    if(isint){
+    BLE &ble = BLE::Instance();
     BLE::Instance().init(bleInitComplete);
-         isint=false;
-    }
-       
 }
 
 
@@ -248,81 +218,36 @@
     // Serial port configuration
     pc.baud(9600);
     wait(8.0);
+    pc.printf("Start\n\r");
     spiSlave.reply(191);
-    pc.printf("Start\n\r");
-    BLE &ble = BLE::Instance();
-    //ble.init(bleInitComplete);
-    //bleint();
-    
-    //ble.waitForEvent();
-    while(true) {
-        printf("loop\r\n");
-        printf("Status : %d\r\n",BLE::Instance().gattClient().isServiceDiscoveryActive());
-
-       // if(connect_status && charDiscover){
-        if(spiSlave.receive())
-        { 
-            spiRX[bufferSize] = spiSlave.read();
-            spiSlave.reply(spiRX[bufferSize]);
-            bufferSize++;
-            if(bufferSize>=4){
-                bufferSize=0;
-                
-              //  light_actions(spiRX);
-        
-            }
+    // Initialize the Ble
+    bleint();
+     while(1){
+        //printf("loop\r\n");
+        if (serviceDiscover || BLE::Instance().gattClient().isServiceDiscoveryActive()){ 
+            BLE::Instance().waitForEvent();
+     
+        }else{ 
+          // printf("Slave Read loop\r\n");
+           SPI_Slave_read();
         }
-        bleint();
-       // }
-        if (serviceDiscover || BLE::Instance().gattClient().isServiceDiscoveryActive()){
-            ble.waitForEvent();
-            //serviceDiscover = false; 
-        }
-       }
-}
-/*
-void testaction(uint8_t options)
-{
-    int tx_buf[4];
     
-    switch(options)
-        {
-            case 1: //off
-                tx_buf[0] = 0x1; 
-                tx_buf[1] = 0x0;
-                tx_buf[2] = 0x0;
-                tx_buf[3] = 0x0;
-                light_actions(tx_buf);
-                break;
-            case 2: //on
-                tx_buf[0] = 0x1; 
-                tx_buf[1] = 0x1;
-                tx_buf[2] = 0x0;
-                tx_buf[3] = 0x0;
-                light_actions(tx_buf);
-                break;
-            case 3: //Red
-                tx_buf[0] = 0x1; 
-                tx_buf[1] = 0x2;
-                tx_buf[2] = 0x0;
-                tx_buf[3] = 0x0;
-                light_actions(tx_buf);
-                break; 
-            case 4: //Green
-                tx_buf[0] = 0x1; 
-                tx_buf[1] = 0x2;
-                tx_buf[2] = 0x1;
-                tx_buf[3] = 0x0;
-                light_actions(tx_buf);
-                break;
-            case 5: //Blue
-                tx_buf[0] = 0x1; 
-                tx_buf[1] = 0x2;
-                tx_buf[2] = 0x2;
-                tx_buf[3] = 0x0;
-                light_actions(tx_buf);
-                break; */
-         /*   default:
-                printf("Invalid \r\n");
+    }
+
+}
+
+void SPI_Slave_read(){
+    
+    wait_us(2);
+    if(spiSlave.receive()){
+    // printf("Slave Read loop1\r\n");
+    spiRX[bufferSize] = spiSlave.read();
+    spiSlave.reply(spiRX[bufferSize]);
+    bufferSize++;
+        if(bufferSize>=4){
+            bufferSize=0;
+            light_actions(spiRX);
+         //     printf("Receive\n\r");
         }
-}*/
\ No newline at end of file
+    }    
+}