Geo beacon for VF.
Dependencies: MMA8452 aconno_bsp adc52832_common
Diff: main.cpp
- 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(); } + } }