157 lines
5.2 KiB
C++
157 lines
5.2 KiB
C++
/*
|
|
* Copyright 2021 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.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <hardware/bluetooth.h>
|
|
|
|
#include <variant>
|
|
#include <vector>
|
|
|
|
namespace bluetooth {
|
|
namespace has {
|
|
|
|
/** Connection State */
|
|
enum class ConnectionState : uint8_t {
|
|
DISCONNECTED = 0,
|
|
CONNECTING,
|
|
CONNECTED,
|
|
DISCONNECTING,
|
|
};
|
|
|
|
/** Results codes for the failed preset operations */
|
|
enum class ErrorCode : uint8_t {
|
|
NO_ERROR = 0,
|
|
SET_NAME_NOT_ALLOWED, // Preset cannot be written (read only preset)
|
|
OPERATION_NOT_SUPPORTED, // If theres no optional characteristic,
|
|
// or request opcode is invalid or not supported
|
|
OPERATION_NOT_POSSIBLE, // Operation cannot be performed at this time
|
|
INVALID_PRESET_NAME_LENGTH,
|
|
INVALID_PRESET_INDEX,
|
|
GROUP_OPERATION_NOT_SUPPORTED,
|
|
PROCEDURE_ALREADY_IN_PROGRESS,
|
|
};
|
|
|
|
enum class PresetInfoReason : uint8_t {
|
|
ALL_PRESET_INFO = 0,
|
|
PRESET_INFO_UPDATE,
|
|
PRESET_DELETED,
|
|
PRESET_AVAILABILITY_CHANGED,
|
|
PRESET_INFO_REQUEST_RESPONSE,
|
|
};
|
|
|
|
struct PresetInfo {
|
|
uint8_t preset_index;
|
|
|
|
bool writable;
|
|
bool available;
|
|
std::string preset_name;
|
|
};
|
|
|
|
/** Service supported feature bits */
|
|
static constexpr uint8_t kFeatureBitHearingAidTypeBinaural = 0x00;
|
|
static constexpr uint8_t kFeatureBitHearingAidTypeMonaural = 0x01;
|
|
static constexpr uint8_t kFeatureBitHearingAidTypeBanded = 0x02;
|
|
static constexpr uint8_t kFeatureBitPresetSynchronizationSupported = 0x04;
|
|
static constexpr uint8_t kFeatureBitIndependentPresets = 0x08;
|
|
static constexpr uint8_t kFeatureBitDynamicPresets = 0x10;
|
|
static constexpr uint8_t kFeatureBitWritablePresets = 0x20;
|
|
|
|
/** Invalid values for the group and preset identifiers */
|
|
static constexpr uint8_t kHasPresetIndexInvalid = 0x00;
|
|
static constexpr int kHasGroupIdInvalid = -1;
|
|
|
|
class HasClientCallbacks {
|
|
public:
|
|
virtual ~HasClientCallbacks() = default;
|
|
|
|
/** Callback for profile connection state change */
|
|
virtual void OnConnectionState(ConnectionState state,
|
|
const RawAddress& addr) = 0;
|
|
|
|
/** Callback for the new available device */
|
|
virtual void OnDeviceAvailable(const RawAddress& addr, uint8_t features) = 0;
|
|
|
|
/** Callback for getting device HAS flags */
|
|
virtual void OnFeaturesUpdate(const RawAddress& addr, uint8_t features) = 0;
|
|
|
|
/** Callback for the currently active preset */
|
|
virtual void OnActivePresetSelected(
|
|
std::variant<RawAddress, int> addr_or_group_id, uint8_t preset_index) = 0;
|
|
|
|
/** Callbacks for the active preset selection error */
|
|
virtual void OnActivePresetSelectError(
|
|
std::variant<RawAddress, int> addr_or_group_id, ErrorCode error_code) = 0;
|
|
|
|
/** Callbacks for the preset details event */
|
|
virtual void OnPresetInfo(std::variant<RawAddress, int> addr_or_group_id,
|
|
PresetInfoReason change_id,
|
|
std::vector<PresetInfo> info_records) = 0;
|
|
|
|
/** Callback for the preset details get error */
|
|
virtual void OnPresetInfoError(std::variant<RawAddress, int> addr_or_group_id,
|
|
uint8_t preset_index,
|
|
ErrorCode error_code) = 0;
|
|
|
|
/** Callback for the preset name set error */
|
|
virtual void OnSetPresetNameError(
|
|
std::variant<RawAddress, int> addr_or_group_id, uint8_t preset_index,
|
|
ErrorCode error_code) = 0;
|
|
};
|
|
|
|
class HasClientInterface {
|
|
public:
|
|
virtual ~HasClientInterface() = default;
|
|
|
|
/** Register the Hearing Aid Service Client profile callbacks */
|
|
virtual void Init(HasClientCallbacks* callbacks) = 0;
|
|
|
|
/** Connect to HAS service */
|
|
virtual void Connect(const RawAddress& addr) = 0;
|
|
|
|
/** Disconnect from HAS service */
|
|
virtual void Disconnect(const RawAddress& addr) = 0;
|
|
|
|
/** Select preset by the index as currently active */
|
|
virtual void SelectActivePreset(
|
|
std::variant<RawAddress, int> addr_or_group_id, uint8_t preset_index) = 0;
|
|
|
|
/** Select next preset as currently active */
|
|
virtual void NextActivePreset(
|
|
std::variant<RawAddress, int> addr_or_group_id) = 0;
|
|
|
|
/** Select previous preset as currently active */
|
|
virtual void PreviousActivePreset(
|
|
std::variant<RawAddress, int> addr_or_group_id) = 0;
|
|
|
|
/** Get preset name by the index */
|
|
virtual void GetPresetInfo(const RawAddress& addr, uint8_t preset_index) = 0;
|
|
|
|
/** Set preset name by the index */
|
|
virtual void SetPresetName(std::variant<RawAddress, int> addr_or_group_id,
|
|
uint8_t preset_index, std::string name) = 0;
|
|
|
|
/** Called when HAS capable device is unbonded */
|
|
virtual void RemoveDevice(const RawAddress& addr) = 0;
|
|
|
|
/** Closes the interface */
|
|
virtual void Cleanup(void) = 0;
|
|
};
|
|
|
|
} // namespace has
|
|
} // namespace bluetooth
|