diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2019-02-28 17:04:22 -0500 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2019-02-28 17:04:22 -0500 |
commit | d6869d1ec4bd24cd2c3eafa534f0849b25ec5607 (patch) | |
tree | 79e54ed27b39c31864895535d11399708d5a45c0 /arduino/libraries/Bluefruit52Lib/src/BLEAdvertising.h | |
parent | 614ee97bf3a2270c413527a7f35c54cbecd9e601 (diff) |
added basic code
Diffstat (limited to 'arduino/libraries/Bluefruit52Lib/src/BLEAdvertising.h')
-rwxr-xr-x | arduino/libraries/Bluefruit52Lib/src/BLEAdvertising.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/arduino/libraries/Bluefruit52Lib/src/BLEAdvertising.h b/arduino/libraries/Bluefruit52Lib/src/BLEAdvertising.h new file mode 100755 index 0000000..f85c5e6 --- /dev/null +++ b/arduino/libraries/Bluefruit52Lib/src/BLEAdvertising.h @@ -0,0 +1,172 @@ +/**************************************************************************/ +/*! + @file BLEAdvertising.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, Adafruit Industries (adafruit.com) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ +#ifndef BLEADVERTISING_H_ +#define BLEADVERTISING_H_ + +#include <Arduino.h> +#include "bluefruit_common.h" +#include "BLEClientService.h" + +#include "BLEUuid.h" +#include "BLEService.h" + +#include "services/BLEBeacon.h" +#include "services/EddyStone.h" + +/* Advertising Guideline from Apple + * https://developer.apple.com/library/content/qa/qa1931/_index.html + * + * The recommended advertising pattern and advertising intervals are: + * - First, advertise at 20 ms intervals for at least 30 seconds + * - If not discovered after 30 seconds, you may change to one of the following + * longer intervals: 152.5 ms, 211.25 ms, 318.75 ms, 417.5 ms, 546.25 ms, + * 760 ms, 852.5 ms, 1022.5 ms, 1285 ms + */ +#define BLE_ADV_INTERVAL_FAST_DFLT 32 // 20 ms (in 0.625 ms unit) +#define BLE_ADV_INTERVAL_SLOW_DFLT 244 // 152.5 ms (in 0.625 ms unit) +#define BLE_ADV_FAST_TIMEOUT_DFLT 30 // in seconds + +// forward declaration +class BLEAdvertisingData; + +// Abstract Class to set Adv Data +class Advertisable +{ + public: + virtual bool setAdv(BLEAdvertisingData& adv) = 0; +}; + +class BLEAdvertisingData +{ +protected: + uint8_t _data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; + uint8_t _count; + +public: + BLEAdvertisingData(void); + + /*------------- Adv Data -------------*/ + bool addData(uint8_t type, const void* data, uint8_t len); + bool addFlags(uint8_t flags); + bool addTxPower(void); + bool addName(void); + bool addAppearance(uint16_t appearance); + bool addManufacturerData(const void* data, uint8_t count); + + /*------------- UUID -------------*/ + bool addUuid(BLEUuid bleuuid); + bool addUuid(BLEUuid bleuuid1, BLEUuid bleuuid2); + bool addUuid(BLEUuid bleuuid1, BLEUuid bleuuid2, BLEUuid bleuuid3); + bool addUuid(BLEUuid bleuuid1, BLEUuid bleuuid2, BLEUuid bleuuid3, BLEUuid bleuuid4); + + bool addUuid(BLEUuid bleuuid[], uint8_t count); + + /*------------- Service -------------*/ + bool addService(BLEService& service); + bool addService(BLEService& service1, BLEService& service2); + bool addService(BLEService& service1, BLEService& service2, BLEService& service3); + bool addService(BLEService& service1, BLEService& service2, BLEService& service3, BLEService& service4); + + /*------------- Client Service -------------*/ + bool addService(BLEClientService& service); + + // Functions to work with the raw advertising packet + uint8_t count(void); + uint8_t* getData(void); + bool setData(const uint8_t* data, uint8_t count); + void clearData(void); + + bool setData(Advertisable& adv_able) { return adv_able.setAdv(*this); } +}; + +class BLEAdvertising : public BLEAdvertisingData +{ +public: + typedef void (*stop_callback_t) (void); + typedef void (*slow_callback_t) (void); + + BLEAdvertising(void); + + void setType(uint8_t adv_type); + void setFastTimeout(uint16_t sec); + + void setSlowCallback(slow_callback_t fp); + void setStopCallback(stop_callback_t fp); + + void setInterval (uint16_t fast, uint16_t slow); + void setIntervalMS(uint16_t fast, uint16_t slow); + + uint16_t getInterval(void); + + bool setBeacon(BLEBeacon& beacon); + bool setBeacon(EddyStoneUrl& eddy_url); + + bool isRunning(void); + + void restartOnDisconnect(bool enable); + bool start(uint16_t timeout = 0); + bool stop (void); + + /*------------------------------------------------------------------*/ + /* INTERNAL USAGE ONLY + * Although declare as public, it is meant to be invoked by internal + * code. User should not call these directly + *------------------------------------------------------------------*/ + void _eventHandler(ble_evt_t* evt); + +private: + uint8_t _hdl; + uint8_t _type; + bool _start_if_disconnect; + bool _runnning; + + uint16_t _fast_interval; // in 0.625 ms + uint16_t _slow_interval; // in 0.625 ms + uint16_t _active_interval; // in 0.625 ms + + uint16_t _fast_timeout; // in second + uint16_t _stop_timeout; // in second + uint16_t _left_timeout; + + stop_callback_t _stop_cb; + slow_callback_t _slow_cb; + + // Internal function + bool _start(uint16_t interval, uint16_t timeout); + +}; + +#endif /* BLEADVERTISING_H_ */ |