| /* |
| * Copyright 2019 HIMSA II K/S - www.himsa.com. |
| * Represented by EHIMA - www.ehima.com |
| * |
| * 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 |
| * |
| * 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. |
| */ |
| |
| #ifndef BLE_SCANNER_HCI_INTERFACE_H |
| #define BLE_SCANNER_HCI_INTERFACE_H |
| |
| #include <base/callback.h> |
| |
| #include <vector> |
| |
| #include "stack/include/bt_types.h" |
| |
| class BleScannerHciInterface { |
| public: |
| using status_cb = base::Callback<void(uint8_t /* status */)>; |
| using list_size_cb = base::Callback<void(int8_t /* list_size */)>; |
| using handle_cb = |
| base::Callback<void(uint8_t /* status */, uint16_t /* adv_handle */)>; |
| |
| static void Initialize(); |
| static BleScannerHciInterface* Get(); |
| static void CleanUp(); |
| |
| virtual ~BleScannerHciInterface() = default; |
| |
| class ScanEventObserver { |
| public: |
| virtual ~ScanEventObserver() = default; |
| virtual void OnPeriodicScanResult(uint16_t sync_handle, uint8_t tx_power, |
| int8_t rssi, uint8_t cte_type, |
| uint8_t pkt_data_status, |
| uint8_t pkt_data_len, |
| const uint8_t* pkt_data) = 0; |
| virtual void OnPeriodicScanEstablished( |
| uint8_t status, uint16_t sync_handle, uint8_t set_id, |
| uint8_t adv_addr_type, const RawAddress& adv_addr, uint8_t adv_phy, |
| uint16_t adv_interval, uint8_t adv_clock_accuracy) = 0; |
| virtual void OnPeriodicScanLost(uint16_t sync_handle) = 0; |
| }; |
| |
| virtual void SetScanEventObserver(ScanEventObserver* observer) = 0; |
| |
| /** |
| * Used to synchronize with a periodic advertising train from an advertiser |
| * and begin receiving periodic advertising packets. |
| * |
| * @param options bit 0: whether to use advertiser list, adv_sid, |
| * adv_addr_type and adv_addr parameters are being used otherwise, bit 1: |
| * whether reporting is initially disabled, all other bits: Reserved for |
| * future use |
| * @param adv_sid advertising set ID |
| * @param adv_addr_type advertiser device address type |
| * @param adv_addr advertiser device address |
| * @param skip_num the maximum number of periodic advertising events that can |
| * be skipped after a successful receive. Range: 0x0000 to 0x01F3. |
| * @param sync_timeout synchronization timeout for the periodic advertising |
| * train, Range: 0x000A to 0x4000, Time = N*10 ms, Range: 100 ms to 163.84s |
| * @param sync_cte_type bit 0: do not sync to packets with an AoA Constant |
| * Tone Extension, bit 1: do not sync to packets with an AoD Constant Tone |
| * Extension with 1 μs slots, bit 2: do not sync to packets with an AoD |
| * Constant Tone Extension with 2 μs slots, bit 3: do not sync to packets with |
| * a type 3 Constant Tone Extension (currently reserved for future use), |
| * bit 4: do not sync to packets without a Constant Tone Extension, all other |
| * bits: reserved for future use. |
| */ |
| virtual void PeriodicScanStart(uint8_t options, uint8_t set_id, |
| uint8_t adv_addr_type, |
| const RawAddress& adv_addr, uint16_t skip_num, |
| uint16_t sync_timeout, |
| uint8_t sync_cte_type) = 0; |
| |
| /** |
| * Used to cancel the HCI_LE_Periodic_Advertising_Create_Sync command while it |
| * is pending. |
| * |
| * @param cb status callback |
| */ |
| virtual void PeriodicScanCancelStart(status_cb cb) = 0; |
| |
| /** |
| * Used to stop reception of the periodic advertising train identified by the |
| * Sync_Handle parameter. |
| * |
| * @param sync_handle synced advertising handle |
| * @param cb status callback |
| */ |
| virtual void PeriodicScanTerminate(uint16_t sync_handle, status_cb cb) = 0; |
| |
| /** |
| * Enable or disable reports for the periodic advertising train defined by the |
| * sync_handle. |
| * |
| * @param sync_handle synced advewrtising handle |
| * @param enable whether enable or disable the advertising reports |
| * @param cb status callback |
| */ |
| virtual void PeriodicScanResultEvtEnable(uint16_t sync_handle, bool enable, |
| status_cb cb) = 0; |
| |
| /** |
| * Used to add an entry, consisting of a single device address and SID, to the |
| * Periodic Advertiser list stored in the Controller. Any additions to the |
| * Periodic Advertiser list take effect immediately. If the entry is already |
| * on the list, the Controller shall return the error code Invalid HCI Command |
| * Parameters (0x12). |
| * |
| * @param adv_addr_type advertiser device address type |
| * @param adv_addr advertiser device address |
| * @param adv_sid advertising set ID |
| * @param cb status callback |
| */ |
| virtual void PeriodicAdvertiserListAddDevice(uint8_t adv_addr_type, |
| RawAddress& adv_addr, |
| uint8_t adv_sid, |
| status_cb cb) = 0; |
| /** |
| * Remove one entry from the list of Periodic Advertisers stored in the |
| * Controller. Removals from the Periodic Advertisers List take effect |
| * immediately. |
| * |
| * @param adv_addr_type advertiser device address type |
| * @param adv_addr advertiser device address |
| * @param adv_sid advertising set ID |
| * @param cb status callback |
| */ |
| virtual void PeriodicAdvertiserListRemoveDevice(uint8_t adv_addr_type, |
| RawAddress& adv_addr, |
| uint8_t adv_sid, |
| status_cb cb) = 0; |
| |
| /** |
| * Remove all entries from the list of Periodic Advertisers in the Controller. |
| * |
| * @param cb status callback |
| */ |
| virtual void PeriodicAdvertiserListClear(status_cb cb) = 0; |
| |
| /** |
| * Read the total number of Periodic Advertiser list entries that can be |
| * stored in the Controller. |
| * |
| * @param cb status and advertiser list size callback |
| */ |
| virtual void PeriodicAdvertiserListGetSize(list_size_cb cb) = 0; |
| |
| /** |
| * Send synchronization information about the periodic advertising train |
| * identified by the sync_handle parameter to a connected device. |
| * |
| * @param bd_addr connected peer device address to whom sync data is |
| * transferred |
| * @param service_data a value provided by the Host |
| * @param sync_handle synced advewrtising handle |
| * @param cb status and connection handle callback |
| */ |
| virtual void PeriodicAdvSyncTransfer(const RawAddress& bd_addr, |
| uint16_t service_data, |
| uint16_t sync_handle, handle_cb cb) = 0; |
| |
| /** |
| * Send synchronization information about the periodic advertising in an |
| * advertising set to a connected device. |
| * |
| * @param bd_addr connected peer device address to whom set info is |
| * transferred |
| * @param service_data a value provided by the Host |
| * @param sync_handle synced advertising handle |
| * @param cb status and connection handle callback |
| */ |
| virtual void PeriodicAdvSetInfoTransfer(const RawAddress& bd_addr, |
| uint16_t service_data, |
| uint8_t sync_handle, |
| handle_cb cb) = 0; |
| |
| /** |
| * Specify how the Controller will process periodic advertising |
| * synchronization information received from the device identified by the |
| * bd_addr |
| * |
| * @param bd_addr connected peer device address who transfers the sync data |
| * @param mode 0x00: No attempt is made to synchronize to the periodic |
| * advertising and no HCI_LE_Periodic_Advertising_Sync_Transfer_Received event |
| * is sent to the Host. 0x01: An |
| * HCI_LE_Periodic_Advertising_Sync_Transfer_Received event is sent to the |
| * Host. HCI_LE_Periodic_Advertising_Report events will be disabled. 0x02: An |
| * HCI_LE_Periodic_Advertising_Sync_Transfer_Received event is sent to the |
| * Host. HCI_LE_Periodic_Advertising_Report events will be enabled. All other |
| * values: Reserved for future use. |
| * @param skip The number of periodic advertising packets that can be skipped |
| * after a successful receive, Range: 0x0000 to 0x01F3 |
| * @param sync_timeout Synchronization timeout for the periodic advertising |
| * train. Range: 0x000A to 0x4000. Time = N*10 ms. Time Range: 100 ms to |
| * 163.84 s |
| * @param cte_type bit 0: do not sync to packets with an AoA Constant Tone |
| * Extension, bit 1: do not sync to packets with an AoD Constant Tone |
| * Extension with 1 μs slots, bit 2: do not sync to packets with an AoD |
| * Constant Tone Extension with 2 μs slots, bit 4: do not sync to packets |
| * without a Constant Tone Extension, all other values: reserved for future |
| * use. |
| * @param set_defaults whether to send |
| * HCI_LE_SET_DEFAULT_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAM or |
| * HCI_LE_SET_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAM. |
| * @param cb status callback |
| */ |
| virtual void SetPeriodicAdvSyncTransferParams(const RawAddress& bd_addr, |
| uint8_t mode, uint16_t skip, |
| uint16_t sync_timeout, |
| uint8_t cte_type, |
| bool set_defaults, |
| status_cb cb) = 0; |
| |
| static constexpr uint8_t kOptUseAdvertiserList = 0x01; |
| static constexpr uint8_t kOptReportsInitiallyEnabled = 0x02; |
| }; |
| |
| #endif // BLE_SCANNER_HCI_INTERFACE_H |