/** @file * @brief Internal APIs for Bluetooth Hearing Access Profile. */ /* * Copyright (c) 2022 Codecoup * * SPDX-License-Identifier: Apache-2.0 */ /* Control Point opcodes */ #define BT_HAS_OP_READ_PRESET_REQ 0x01 #define BT_HAS_OP_READ_PRESET_RSP 0x02 #define BT_HAS_OP_PRESET_CHANGED 0x03 #define BT_HAS_OP_WRITE_PRESET_NAME 0x04 #define BT_HAS_OP_SET_ACTIVE_PRESET 0x05 #define BT_HAS_OP_SET_NEXT_PRESET 0x06 #define BT_HAS_OP_SET_PREV_PRESET 0x07 #define BT_HAS_OP_SET_ACTIVE_PRESET_SYNC 0x08 #define BT_HAS_OP_SET_NEXT_PRESET_SYNC 0x09 #define BT_HAS_OP_SET_PREV_PRESET_SYNC 0x0a /* Application error codes */ #define BT_HAS_ERR_INVALID_OPCODE 0x80 #define BT_HAS_ERR_WRITE_NAME_NOT_ALLOWED 0x81 #define BT_HAS_ERR_PRESET_SYNC_NOT_SUPP 0x82 #define BT_HAS_ERR_OPERATION_NOT_POSSIBLE 0x83 #define BT_HAS_ERR_INVALID_PARAM_LEN 0x84 /* Hearing Aid Feature bits */ #define BT_HAS_FEAT_HEARING_AID_TYPE_LSB BIT(0) #define BT_HAS_FEAT_HEARING_AID_TYPE_MSB BIT(1) #define BT_HAS_FEAT_PRESET_SYNC_SUPP BIT(2) #define BT_HAS_FEAT_INDEPENDENT_PRESETS BIT(3) #define BT_HAS_FEAT_DYNAMIC_PRESETS BIT(4) #define BT_HAS_FEAT_WRITABLE_PRESETS_SUPP BIT(5) #define BT_HAS_FEAT_HEARING_AID_TYPE_MASK (BT_HAS_FEAT_HEARING_AID_TYPE_LSB | \ BT_HAS_FEAT_HEARING_AID_TYPE_MSB) /* Preset Changed Change ID values */ #define BT_HAS_CHANGE_ID_GENERIC_UPDATE 0x00 #define BT_HAS_CHANGE_ID_PRESET_DELETED 0x01 #define BT_HAS_CHANGE_ID_PRESET_AVAILABLE 0x02 #define BT_HAS_CHANGE_ID_PRESET_UNAVAILABLE 0x03 #define BT_HAS_IS_LAST 0x01 struct bt_has { /** Hearing Aid Features value */ uint8_t features; /** Active preset index value */ uint8_t active_index; /* Whether the service has been registered or not */ bool registered; }; struct bt_has_cp_hdr { uint8_t opcode; uint8_t data[0]; } __packed; struct bt_has_cp_read_presets_req { uint8_t start_index; uint8_t num_presets; } __packed; struct bt_has_cp_read_preset_rsp { uint8_t is_last; uint8_t index; uint8_t properties; uint8_t name[0]; } __packed; struct bt_has_cp_preset_changed { uint8_t change_id; uint8_t is_last; } __packed; struct bt_has_cp_generic_update { uint8_t prev_index; uint8_t index; uint8_t properties; uint8_t name[0]; } __packed; struct bt_has_cp_write_preset_name { uint8_t index; uint8_t name[0]; } __packed; struct bt_has_cp_set_active_preset { uint8_t index; } __packed; static inline const char *bt_has_op_str(uint8_t op) { switch (op) { case BT_HAS_OP_READ_PRESET_REQ: return "Read preset request"; case BT_HAS_OP_READ_PRESET_RSP: return "Read preset response"; case BT_HAS_OP_PRESET_CHANGED: return "Preset changed"; case BT_HAS_OP_WRITE_PRESET_NAME: return "Write preset name"; case BT_HAS_OP_SET_ACTIVE_PRESET: return "Set active preset"; case BT_HAS_OP_SET_NEXT_PRESET: return "Set next preset"; case BT_HAS_OP_SET_PREV_PRESET: return "Set previous preset"; case BT_HAS_OP_SET_ACTIVE_PRESET_SYNC: return "Set active preset (sync)"; case BT_HAS_OP_SET_NEXT_PRESET_SYNC: return "Set next preset (sync)"; case BT_HAS_OP_SET_PREV_PRESET_SYNC: return "Set previous preset (sync)"; default: return "Unknown"; } } static inline const char *bt_has_change_id_str(uint8_t change_id) { switch (change_id) { case BT_HAS_CHANGE_ID_GENERIC_UPDATE: return "Generic update"; case BT_HAS_CHANGE_ID_PRESET_DELETED: return "Preset deleted"; case BT_HAS_CHANGE_ID_PRESET_AVAILABLE: return "Preset available"; case BT_HAS_CHANGE_ID_PRESET_UNAVAILABLE: return "Preset unavailable"; default: return "Unknown changeId"; } }