ble transmitter

Dependencies:   mbed BLE_API nRF51822

Revision:
9:aa9d34bbb46c
Parent:
8:2d82653c8ffd
--- a/transmitter_main.cpp	Wed Apr 17 21:49:53 2019 +0000
+++ b/transmitter_main.cpp	Fri Apr 19 07:03:57 2019 +0000
@@ -9,36 +9,30 @@
 #define BUTTON_PIN  p17
 #define BATTERY_PIN p1
 
-DigitalOut led1(p21);
+DigitalOut greenLed(LED_GREEN);
 
 struct Packet {
-    uint32_t seqNum;
+    uint8_t seqNum;
     
     Packet() : seqNum(0) {}
 };
-uint8_t seqNum2 = 8;
+uint8_t seqNum2 = 7;
 
 BLE ble;
-Packet p;
-const static char DEVICE_NAME[] = "JOEY";
+Packet packet;
+const static char DEVICE_NAME[] = "Transmitter";
 static volatile bool  triggerSensorPolling = false;
 
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
 {
-    BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising(); // restart advertising
-}
-
-void updatePayload(void)
-{
-//    ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&p, sizeof(p));
-    (p.seqNum)++;
-    pc.printf("seq_num: %d\n", p.seqNum);
+    ble.gap().startAdvertising(); // restart advertising
 }
 
 void periodicCallback(void)
 {
-    led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
-    updatePayload();
+    greenLed = !greenLed; /* Do blinky on greenLed while we're waiting for BLE events */
+    //we can't do anything related gap() inside here!
+    //will get error and fault handler will be triggered
     
     /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
      * heavy-weight sensor polling from the main thread. */
@@ -47,44 +41,61 @@
 
 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
 {
-    BLE &localble          = params->ble;
+    BLE &localBle          = params->ble;
     ble_error_t error = params->error;
     
     if (error != BLE_ERROR_NONE) {
         return;
     }
     
-    localble.gap().onDisconnection(disconnectionCallback);
+    /* Ensure that it is the default instance of BLE */
+    if (localBle.getInstanceID() != BLE::DEFAULT_INSTANCE) {
+        return;   
+    }
     
-//    localble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
-//    localble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&p, sizeof(p));
-    localble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&seqNum2, sizeof(seqNum2));
+    localBle.gap().onDisconnection(disconnectionCallback);
 
-    
-    localble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
-    localble.gap().setAdvertisingInterval(1000); /* 1000ms */
-    localble.gap().startAdvertising();
+//    localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+//    localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+//    localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&packet, sizeof(packet));
+    localBle.gap().clearAdvertisingPayload();
+    localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&packet.seqNum, sizeof(packet.seqNum));
+    pc.printf("73: payload: %x\n", localBle.gap().getAdvertisingPayload());
 }
 
 int main(void)
 {
-    led1 = 1;
+    greenLed = 1;
     
     Ticker ticker;
-    ticker.attach(periodicCallback, 1);
+    ticker.attach(periodicCallback, 5);
     
     ble.init(bleInitComplete);
     
     /* SpinWait for initialization to complete. This is necessary because the
      * BLE object is used in the main loop below. */
-    while (ble.hasInitialized()  == false) { /* spin loop */ }
+    while (ble.hasInitialized()  == false) {
+         pc.printf("Initializing BLE\n");
+    }
+    
+    pc.printf("Init Completed\n");
+    
+    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.gap().setAdvertisingInterval(1000); /* 1000ms */
+    ble.gap().setAdvertisingTimeout(0);
+    ble.gap().startAdvertising();
     
     while (1) {
         // check for trigger from periodicCallback()
-        if (triggerSensorPolling && ble.getGapState().connected) {
+        if (triggerSensorPolling) {
+            (packet.seqNum)++;
+            pc.printf("seq_num: %d\n", packet.seqNum);
+            ble.gap().clearAdvertisingPayload();
+            ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&packet.seqNum, sizeof(packet.seqNum));
+            pc.printf("47: payload: %x\n", ble.gap().getAdvertisingPayload());
+            
             triggerSensorPolling = false;
-        } else {
-            ble.waitForEvent(); // low power wait for event
-        }
+        } 
+        ble.waitForEvent();
     }
 }
\ No newline at end of file