Geo beacon for VF.

Dependencies:   MMA8452 aconno_bsp adc52832_common

Revision:
2:5504b714c9ae
Parent:
1:5f34885f5cff
Child:
3:2a4ac5b87046
--- a/main.cpp	Sun Jul 16 10:04:48 2017 +0000
+++ b/main.cpp	Sun Jul 16 15:10:18 2017 +0000
@@ -11,49 +11,39 @@
 #include "GapAdvertisingData.h"
 #include "acd52832_bsp.h"
 
-#define MSD_SIZE        (18)
-#define SLEEP_TIME      0.5            // Sleep time in seconds
-#define WAKE_UP_TIME    100            // Awake time in ms
+#define SLEEP_TIME      (0.85)            // Sleep time in seconds
+#define AWAKE_TIME      (0.15)
 #define BUZZER          (p31)
 
 /* Static constants for the BLE example */
-#define MANUFACTURER_SPECIFIC_DATA_ID (0xFF)
-#define MSD_OFFSET                    (4)
-#define BUZZ_TIME                     (200)   // Buzz time in ms
+#define MSD_SIZE        (18)
+#define MSD_ID          (0xFF)
+#define MSD_OFFSET      (4)
+#define BUZZ_TIME       (0.4)   // Buzz time in s
 
 
 bool SLEEP = true;
 int8_t txPower = 4;
 uint8_t MSD[MSD_SIZE] = {0x59, 0x00, 0xE1, 0x61, 0x35, 0xBA, 0xC0, 0xEC, 0x47, 0x2A, 0x98, 0x00, 0xAF, 0x18, 0x43, 0xFF, 0x05, 0x00};
-uint8_t mac_address[6] = {0xCF, 0x36, 0x23, 0x9A, 0x55, 0x96};
 uint8_t my_mac_address[6] = {};
-uint8_t LOOKING = 0;
 
-void turnMeOff(void);
+void turnBuzzOff(void);
+void goToSleep();
 
+Ticker WakeSleepT;
+Ticker turnBuzzOffT;
 PwmOut buzzer(BUZZER);
 BLE &ble = BLE::Instance();
-Ticker ticker;
-Ticker ticker2;
-    
+
 /* Restart Advertising on disconnection*/
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
     BLE::Instance().gap().startAdvertising();
 }
 
-void wakeMeUp(void){
-    //ticker.detach();
-    //ticker2.attach(turnMeOff, WAKE_UP_TIME);
-    //LED = !LED;
-    //SLEEP = !SLEEP;
-    if(SLEEP) SLEEP = false;
-    else SLEEP = true;
-}
-
-void turnMeOff(void){
-    //ticker.attach(wakeMeUp, SLEEP_TIME);   // Wake the device up   
-    //ticker2.detach();
-    SLEEP = true;
+void turnBuzzOff(void){
+    buzzer.write(0.0F);
+    turnBuzzOffT.detach();
+    WakeSleepT.attach(goToSleep, AWAKE_TIME);
 }
 
 /**
@@ -95,13 +85,13 @@
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)MSD, MSD_SIZE);
     ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);    
-    ble.gap().setAdvertisingInterval(1000); /* 1000ms */
-    ble.gap().startAdvertising();    
+    ble.gap().setAdvertisingInterval(100);  // --> Has to be at least 100ms!
+    ble.gap().startAdvertising();
 }
 
 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params){    
     uint8_t i=0;
-    if ((params->advertisingData[MSD_OFFSET]) == MANUFACTURER_SPECIFIC_DATA_ID ){ /* !ALERT! Update this filter to suit your device. */
+    if ((params->advertisingData[MSD_OFFSET]) == MSD_ID ){ 
         // Follows Manufacturer Specific Data
         if ((params->advertisingData[MSD_OFFSET+1]) == 0x59){
             if ((params->advertisingData[MSD_OFFSET+2]) == 0x00){
@@ -113,43 +103,58 @@
                         return;
                     }
                 }
-                buzzer.write(0.8F);
-                wait_ms(200);
-                buzzer.write(0.0F);
-                }
+                turnBuzzOffT.detach();
+                WakeSleepT.detach();
+                buzzer.write(0.5F);
+                turnBuzzOffT.attach(turnBuzzOff, BUZZ_TIME);
             }
         }
+    }
+}
+
+void WakeMeUp(){
+    WakeSleepT.detach();
+    WakeSleepT.attach(goToSleep, AWAKE_TIME);
+    
+    ble.gap().startScan(advertisementCallback);
+    ble.gap().startAdvertising();
+    SLEEP = false;
+}
+
+void goToSleep(){
+    WakeSleepT.detach();
+    WakeSleepT.attach(WakeMeUp, SLEEP_TIME);
+    
+    ble.gap().stopAdvertising();
+    ble.gap().stopScan();
+    SLEEP = true;
 }
 
 int main(void){
-    //ticker2.attach(turnMeOff, WAKE_UP_TIME);
-    
-    ticker.attach(wakeMeUp, SLEEP_TIME);   // Wake the device up   
-    
+    WakeSleepT.attach(goToSleep, AWAKE_TIME);
     ble.init(bleInitComplete);
     ble.gap().setTxPower(txPower);
     GapAdvertisingData postavke = GapAdvertisingData();
     
-    ble.gap().setScanParams(500, 400);
+    ble.gap().setScanParams(100, 100);
     ble.gap().startScan(advertisementCallback);
     
     buzzer.period(0.001F);
     buzzer.write(0.0F);
     
+    __enable_irq();
+    
     /* 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(true){
-        if (SLEEP){
-            ble.gap().stopAdvertising();
-            //ble.waitForEvent();
-            //__WFI();
-        }
+        if(SLEEP){
+            __WFI();
+            }
         else{
-            ble.gap().startAdvertising();
             ble.waitForEvent();
             }
-        
     }
+    
 }