Geo beacon for VF.

Dependencies:   MMA8452 aconno_bsp adc52832_common

main.cpp

Committer:
jurica238814
Date:
2017-07-16
Revision:
1:5f34885f5cff
Parent:
0:f8c1e0b2d473
Child:
2:5504b714c9ae

File content as of revision 1:5f34885f5cff:

/*
 *
 *  Made by Jurica Resetar @ aconno
 *  aconno.de
 *  All rights reserved
 *
 */

#include "mbed.h"
#include "ble/BLE.h"
#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 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


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);

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;
}

/**
 * This function is called when the ble initialization process has failed
 */
void onBleInitError(BLE &ble, ble_error_t error){
    /* Avoid compiler warnings */
    (void) ble;
    (void) error;
    /* Initialization error handling should go here */
}

/**
 * Callback triggered when the ble initialization process has finished
 */
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params){
    BLE&        ble   = params->ble;
    ble_error_t error = params->error;

    if (error != BLE_ERROR_NONE) {
        /* In case of error, forward the error handling to onBleInitError */
        onBleInitError(ble, error);
        return;
    }

    /* Ensure that it is the default instance of BLE */
    if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
        return;
    }

    ble.gap().onDisconnection(disconnectionCallback);

    /* 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, 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){
    //ticker2.attach(turnMeOff, WAKE_UP_TIME);
    
    ticker.attach(wakeMeUp, SLEEP_TIME);   // Wake the device up   
    
    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){
        if (SLEEP){
            ble.gap().stopAdvertising();
            //ble.waitForEvent();
            //__WFI();
        }
        else{
            ble.gap().startAdvertising();
            ble.waitForEvent();
            }
        
    }
}