Geo beacon for VF.

Dependencies:   MMA8452 aconno_bsp adc52832_common

Revision:
1:5f34885f5cff
Parent:
0:f8c1e0b2d473
Child:
2:5504b714c9ae
--- a/main.cpp	Mon Mar 06 09:09:55 2017 +0000
+++ b/main.cpp	Sun Jul 16 10:04:48 2017 +0000
@@ -1,43 +1,60 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+/*
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *  Made by Jurica Resetar @ aconno
+ *  aconno.de
+ *  All rights reserved
  *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
  */
 
 #include "mbed.h"
 #include "ble/BLE.h"
-#include "ble/services/HealthThermometerService.h"
+#include "GapAdvertisingData.h"
 #include "acd52832_bsp.h"
-#include "GapAdvertisingData.h"
+
+#define MSD_SIZE        (18)
+#define SLEEP_TIME      0.5            // Sleep time in seconds
+#define WAKE_UP_TIME    100            // Awake time in ms
+#define BUZZER          (p31)
 
-#define SLEEP_TIME      5           // Sleep time in seconds
-#define WAKE_UP_TIME    1000        // Sleep time in ms
+/* Static constants for the BLE example */
+#define MANUFACTURER_SPECIFIC_DATA_ID (0xFF)
+#define MSD_OFFSET                    (4)
+#define BUZZ_TIME                     (200)   // Buzz time in ms
+
 
 bool SLEEP = true;
 int8_t txPower = 4;
-
-static HealthThermometerService *thermometerServicePtr;
+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;
 
-uint8_t MSD[18] = {0x59, 0x00, 0xE1, 0x61, 0x35, 0xBA, 0xC0, 0xEC, 0x47, 0x2A, 0x98, 0x00, 0xAF, 0x18, 0x43, 0xFF, 0x05, 0xE8};
+void turnMeOff(void);
 
+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){
-        SLEEP = false;
-    }
+    //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;
+}
 
 /**
  * This function is called when the ble initialization process has failed
@@ -69,41 +86,70 @@
 
     ble.gap().onDisconnection(disconnectionCallback);
 
-    /* Setup primary service. */
-    thermometerServicePtr = new HealthThermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR);
-
+    /* Get my MAC address */
+    BLEProtocol::AddressType_t temp_address_type;
+    ble.gap().getAddress(&temp_address_type, my_mac_address);
+    
+    
     /* setup advertising */
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
-    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)MSD, 18);
+    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();    
 }
 
+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. */
+        // Follows Manufacturer Specific Data
+        if ((params->advertisingData[MSD_OFFSET+1]) == 0x59){
+            if ((params->advertisingData[MSD_OFFSET+2]) == 0x00){
+                for(i=0; i<6; i++){
+                    if((params->advertisingData[MSD_OFFSET+i+3]) == my_mac_address[5-i]){
+                        continue;
+                    }
+                    else{
+                        return;
+                    }
+                }
+                buzzer.write(0.8F);
+                wait_ms(200);
+                buzzer.write(0.0F);
+                }
+            }
+        }
+}
+
 int main(void){
-    Ticker ticker;
+    //ticker2.attach(turnMeOff, WAKE_UP_TIME);
+    
     ticker.attach(wakeMeUp, SLEEP_TIME);   // Wake the device up   
     
-    BLE &ble = BLE::Instance();
     ble.init(bleInitComplete);
     ble.gap().setTxPower(txPower);
     GapAdvertisingData postavke = GapAdvertisingData();
     
+    ble.gap().setScanParams(500, 400);
+    ble.gap().startScan(advertisementCallback);
+    
+    buzzer.period(0.001F);
+    buzzer.write(0.0F);
     
     /* 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){
+    
+    while(true){
         if (SLEEP){
             ble.gap().stopAdvertising();
-            sleep();
+            //ble.waitForEvent();
+            //__WFI();
         }
         else{
-            // I'm awake
             ble.gap().startAdvertising();
-            wait_ms(WAKE_UP_TIME);
-            SLEEP = true;
+            ble.waitForEvent();
             }
+        
     }
 }