Geo beacon for VF.

Dependencies:   MMA8452 aconno_bsp adc52832_common

Files at this revision

API Documentation at this revision

Comitter:
jurica238814
Date:
Thu Aug 10 11:02:02 2017 +0000
Parent:
15:934a04c958f5
Child:
17:51a5456a46cd
Commit message:
Sh-sh implementation started. Does not work (sh-sh works but the scanner does not). Try to use UART for debugging (does not work).

Changed in this revision

AckService.h Show annotated file Show diff for this revision Revisions of this file
aconno_nrf52_uart.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AckService.h	Thu Aug 10 11:02:02 2017 +0000
@@ -0,0 +1,26 @@
+
+#define MAC_ADDR_SIZE_B (6)
+
+// Template allows you to use 'constant' values on non-constant places (XD)
+template<uint8_t dataSize>
+
+class ACKService{
+    public:
+        const static uint16_t ACK_SERVICE_UUID        = 0xA000;
+        const static uint16_t ACK_CHARA_UUID = 0xA001;
+        const static uint16_t ACK_MAC_CHAR_UUID = 0xA002;
+
+        ACKService(BLEDevice &_ble, uint8_t *_initValues) : ble(_ble), ACK(ACK_CHARA_UUID, _initValues), MAC(ACK_MAC_CHAR_UUID, _initValues, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY){
+                GattCharacteristic *charTable[] = {&ACK, &MAC};     // Add characteristick in table
+                GattService AckService(ACK_SERVICE_UUID, charTable, sizeof(charTable)/sizeof(GattCharacteristic *));   
+                ble.addService(AckService); // Add service in the BLE
+        }
+        void updateMacAddress(uint8_t  *MacAddress){
+            ble.gattServer().write(MAC.getValueHandle(), MacAddress, MAC_ADDR_SIZE_B);
+        }
+    private:
+        BLEDevice &ble;
+        // Create new characteristic
+        WriteOnlyArrayGattCharacteristic<uint8_t, dataSize> ACK;
+        ReadOnlyArrayGattCharacteristic<uint8_t, MAC_ADDR_SIZE_B> MAC;
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aconno_nrf52_uart.lib	Thu Aug 10 11:02:02 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/Dautor/code/aconno_nrf52_uart/#ebebc790336a
--- 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();
         }
     }