Geo beacon for VF.

Dependencies:   MMA8452 aconno_bsp adc52832_common

Revision:
16:a338d2417fd5
Parent:
15:934a04c958f5
Child:
17:51a5456a46cd
--- a/main.cpp	Fri Jul 28 12:28:05 2017 +0000
+++ b/main.cpp	Thu Aug 10 11:02:02 2017 +0000
@@ -11,12 +11,15 @@
 #include "GapAdvertisingData.h"
 #include "acd52832_bsp.h"
 #include "mma8452.h"
+#include "AckService.h"
+#include "nrf52_uart.h"
 
 #define DEBUG               (1)
 #define DEBUG_ACC           (0)
+#define PRINT               (1)
 
-#define SLEEP_TIME_S              (2.0)           /* Sleep time in seconds WAS 0.85 */
-#define ADV_TIMER_TIME_S          (1.0)           /* Advertising time (in s) */
+#define SLEEP_TIME_S              (1.0)           /* Sleep time in seconds WAS 0.85 */
+#define ADV_TIMER_TIME_S          (4.0)           /* Advertising time (in s) */
 #define SCAN_TIMER_TIME_S         (2.0)           /* Scanning time (in s) */
 #define FREE_TIME_S               (0.1)           /* Time between end of a scanning and sleep mode */
 #define AWAKE_TIME_S              (ADV_TIMER_TIME_S+SCAN_TIMER_TIME_S+FREE_TIME_S)      /* Was 0.15 */
@@ -24,7 +27,6 @@
 #define SHORT_SLEEP_TIME_PERIOD_S (5)        /* Time after a last scanned advertisment. In the period, sleep time is SHORT_SLEEP_TIME */
 #define MAC_SIZE_B                (6)
 
-
 /* Static constants for the BLE example */
 #define MAX_BLE_PACKET_SIZE (31)
 #define MSD_SIZE            (18)
@@ -35,7 +37,6 @@
 #define SCAN_INTERVAL       (SCAN_TIMER_TIME_S)   /* Scan interval (in ms) */
 #define SCAN_WINDOW         (SCAN_TIMER_TIME_S)
 
-
 /* Static constants for the accelerometer */
 #define WHO_AM_I            0x0D           /* Type 'read' : This should return the device id of 0x2A */
 #define OUT_Z_MSB           0x05           /* Type 'read' : z axis - 8 most significatn bit of a 12 bit sample */
@@ -44,6 +45,20 @@
 #define INT2_PIN            (p4)
 #define BUZZER              (p31)
 
+#if PRINT
+    /* Defines for debugging over uart */
+    #define TX              (p25)
+    #define RX              (p26)
+    NRF52_UART uart(TX,RX, Baud9600);
+    char printBuffer[30] = {};
+#endif
+
+
+
+bool shushShush = false;
+const static uint16_t ACK_SERVICE_UUID = 0xCBE0;
+const static uint16_t ACK_CHARA_UUID = 0xCBE1;
+
 uint8_t sleepFlag = 0;
 uint8_t tempSleepTime = SLEEP_TIME_S;
 int8_t txPower = 4;
@@ -73,22 +88,83 @@
 InterruptIn gyro_pulse(INT2_PIN);
 Acc_MMA8452 acc(I2C_DATA, I2C_CLK, MMA8452_ADDRESS);
 BLE &ble = BLE::Instance();
-
+ACKService<4> *ackServicePtr;
 
 #if DEBUG
-    DigitalOut advLED(p22);
-    DigitalOut scanLED(p23);
-    DigitalOut awake(p24);
+    DigitalOut advLED(p22);     // Red
+    DigitalOut scanLED(p23);    // Blue
+    DigitalOut connectedLED(p24);  // Green
 #endif
 #if DEBUG_ACC
     DigitalOut int_led(p22);
 #endif
 
+
+void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params){
+    scanLED = !scanLED;       // Blue
+    wait_ms(100);
+    scanLED = !scanLED;       // Blue
+    wait_ms(100);
+    scanLED = !scanLED;       // Blue
+    wait_ms(100);
+    scanLED = !scanLED;       // Blue
+    wait_ms(100);
+    scanLED = !scanLED;       // Blue
+    wait_ms(100);
+    scanLED = !scanLED;       // Blue
+    wait_ms(100);
+    scanLED = 1;       // Blue
+    
+    //WakeSleepT.detach();
+}
+
+
 /* Restart Advertising on disconnection*/
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
-    //BLE::Instance().gap().startAdvertising();
+    shushShush = true;
+    advLED = !advLED;       // RED
+    wait_ms(100);
+    advLED = !advLED;
+    wait_ms(100);
+    advLED = !advLED;
+    wait_ms(100);
+    advLED = !advLED;
+    wait_ms(100);
+    advLED = !advLED;
+    wait_ms(100);
+    advLED = 1;
 }
 
+void onDataWrittenCallback(const GattWriteCallbackParams *params) {
+    if(params->handle == ACK_CHARA_UUID || 1){
+        // Something is written into AckCharacteristic
+        if(params->data[0] == 0xBA)
+            if(params->data[1] == 0xBE){
+                connectedLED = !connectedLED;       // BLUE
+                wait_ms(100);
+                connectedLED = !connectedLED;
+                wait_ms(100);
+                connectedLED = !connectedLED;
+                wait_ms(100);
+                connectedLED = !connectedLED;
+                wait_ms(100);
+                connectedLED = !connectedLED;
+                wait_ms(100);
+                connectedLED = 1;
+                wait_ms(100);
+                /*
+                    This function should make advertiser stop
+                */
+                ble.disconnect(Gap::LOCAL_HOST_TERMINATED_CONNECTION);
+                return;
+            }
+    }
+    else{
+        // Execute this for wrong data written into characteristic
+        wait_ms(500);
+        
+    }
+}
 
 /**
  * This function is called when the ble initialization process has failed
@@ -117,21 +193,26 @@
     if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
         return;
     }
-
-    ble.gap().onDisconnection(disconnectionCallback);
-
+    
+    uint8_t init_values[4] = {0,0,0,0};
     /* Get my MAC address */
     BLEProtocol::AddressType_t temp_address_type;
     ble.gap().getAddress(&temp_address_type, myMacAddress);
+    ackServicePtr = new ACKService<4>(ble, init_values);
+    ackServicePtr->updateMacAddress(myMacAddress);    // Update MAC address
+    ble.gap().onDisconnection(disconnectionCallback);
+    
+    //ble.gap().onConnection(onConnectionCallback);         // -->> Uncomment these two lines for shush-shush 
+    //ble.gattServer().onDataWritten(onDataWrittenCallback);
     
     
     /* setup advertising */
-    
     //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
     //ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);    
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)msd, MSD_SIZE);
     ble.gap().setAdvertisingInterval(ADV_INTERVAL);  // --> Has to be at least 100ms!
-    //ble.gap().startAdvertising();   
+    //ble.gap().startAdvertising();
+
 }
 
 
@@ -157,14 +238,32 @@
 uint8_t CheckMac(const Gap::AdvertisementCallbackParams_t *params, uint8_t *myMacAddress, uint8_t msdOffset){
     int i=0;
     
+    /* Get my MAC address */
+    BLEProtocol::AddressType_t temp_address_type;
+    ble.gap().getAddress(&temp_address_type, myMacAddress);
+    
     if(msdOffset == 0){
+        for(i=0; i<10; i++){
+            scanLED = !scanLED; // BLUE
+            wait_ms(100);
+        }
         return 0;     // There's no MSD in BLE advertisement data
     }
     for(i=0; i<6; i++){
-        if((params->advertisingData[msdOffset+i+3]) != myMacAddress[5-i]){
+        //if((params->advertisingData[0+i+4]) != myMacAddress[i]){
+        //if(params->advertisingData[4] != myMacAddress[4]){
+        if(params->advertisingData[msdOffset + 3 + i] != myMacAddress[5-i]){      // myMacAddress[0] == 0x91
+            for(i=0; i<10; i++){
+                connectedLED = !connectedLED; // Green
+                wait_ms(100);
+            }
             return 0;
         }
     }       
+    for(i=0; i<10; i++){
+        advLED = !advLED; // RED
+        wait_ms(100);
+    }
     return 1;
 }
 
@@ -175,7 +274,7 @@
     uint8_t msdOffset, i;
                     
     //msdOffset = findMSDIndex(params);
-    msdOffset = 4;
+    msdOffset = 1;  // 1 or 4
     if(msdOffset == 0){
         return;     // There's no MSD in BLE advertisement data
     }
@@ -183,11 +282,14 @@
         // Follows Manufacturer Specific Data
         if ((params->advertisingData[msdOffset+1]) == 0x59){
             if ((params->advertisingData[msdOffset+2]) == 0x00){
+                /*
                 for(i=0; i<6; i++){
                     if((params->advertisingData[msdOffset+i+3]) != myMacAddress[5-i]){
                         return;
                     }
-                    //if(CheckMac(params, myMacAddress, msdOffset) || 1){
+                }
+                */
+                if(CheckMac(params, myMacAddress, msdOffset)){
                     ble.gap().stopScan();
                     buzzer.write(0.5F);
                     WakeSleepT.detach();
@@ -220,13 +322,21 @@
 }
 
 void startAdvertising(){
-    ble.gap().startAdvertising();
-    #if DEBUG
-        advLED = 0;
-        scanLED = 1;
-    #endif
-    WakeSleepT.detach();
-    WakeSleepT.attach(WakeMeUp, ADV_TIMER_TIME_S);    // Call the wakeMeUp function
+    if(shushShush){
+        // Do not advertise! Go to sleep
+        WakeSleepT.detach();
+        ble.gap().stopAdvertising();
+        WakeMeUp();
+    }
+    else{
+        ble.gap().startAdvertising();
+        #if DEBUG
+            advLED = 0;
+            scanLED = 1;
+        #endif
+        WakeSleepT.detach();
+        WakeSleepT.attach(WakeMeUp, ADV_TIMER_TIME_S);    // Call the wakeMeUp function
+    }
 }
 
 void startScanning(){
@@ -258,11 +368,8 @@
         case SCANNING:{
                 radioState = OFF;
                 WakeSleepT.detach();
-                WakeSleepT.attach(GoToSleep, FREE_TIME_S);
-                #if DEBUG
-                    advLED = 1;
-                    scanLED = 1;
-                #endif
+                //WakeSleepT.attach(GoToSleep, FREE_TIME_S);
+                GoToSleep();
                 break;
             }
         default: return;
@@ -275,6 +382,10 @@
     ble.gap().stopAdvertising();
     ble.gap().stopScan();
     sleepFlag = 1;
+    #if DEBUG
+        advLED = 1;
+        scanLED = 1;
+    #endif
 }
 
 void buzz(void){
@@ -297,22 +408,34 @@
 
 int main(void){   
     #if DEBUG
-        awake = 1;
         advLED = 1;
         scanLED = 1;
+        connectedLED = 1;
     #endif
     
-    WakeSleepT.attach(GoToSleep, AWAKE_TIME_S);
-    ble.init(bleInitComplete);
-    ble.gap().setTxPower(txPower);
-    GapAdvertisingData postavke = GapAdvertisingData();
-    
     buzzer.period(0.0009F);
     buzzer.write(0.0F);
     gyro_power.period(0.01F);
     gyro_power.write(1.0F);
     i2c_power.period(0.01F);
     i2c_power.write(1.0F);
+    
+    int i;
+    for(i=0; i<10; i++){
+    #if PRINT
+        printBuffer[0] = 'B';
+        printBuffer[1] = 'o';
+        printBuffer[2] = 'k';
+        uart.send(printBuffer, 3);
+    #endif
+    wait_ms(100);
+    }
+    
+    WakeSleepT.attach(GoToSleep, AWAKE_TIME_S);
+    ble.init(bleInitComplete);
+    ble.gap().setTxPower(txPower);
+    GapAdvertisingData postavke = GapAdvertisingData();
+    
     wait_ms(1000);
     
     /* Pulse interrupt detection */
@@ -328,8 +451,8 @@
     wait_ms(1);
             
     /* Setup for the interrupt handler */
-    gyro_pulse.rise(&pulse_handler);                                                                                //  -------------------------------------
-    acc.set_register((char)CTRL_REG_1, (char) 0x01);        // Flow data rate and Active mode           
+    //gyro_pulse.rise(&pulse_handler);                                                                                //  -------------------------------------
+    //acc.set_register((char)CTRL_REG_1, (char) 0x01);        // Flow data rate and Active mode           
     wait(1);
     
     __enable_irq();
@@ -342,11 +465,11 @@
         
     while(true){
         if(sleepFlag){
-            if(!awake) awake = 1;
+            //if(!awake) awake = 1;
             __WFI();
         }
         else{
-            if(awake) awake = 0;
+            //if(awake) awake = 0;
             ble.waitForEvent();
         }
     }