Lines Matching refs:device
174 auto device = std::find_if(devices_.begin(), devices_.end(), in Connect() local
176 if (device == devices_.end()) { in Connect()
181 device->is_connecting_actively = true; in Connect()
182 if (!device->IsConnected()) in Connect()
196 auto device = std::find_if(devices_.begin(), devices_.end(), in AddFromStorage() local
198 if (device == devices_.end()) in AddFromStorage()
224 auto device = std::find_if(devices_.begin(), devices_.end(), in Disconnect() local
226 if (device == devices_.end()) { in Disconnect()
231 auto conn_id = device->conn_id; in Disconnect()
232 auto is_connecting_actively = device->is_connecting_actively; in Disconnect()
233 devices_.erase(device); in Disconnect()
251 void UpdateJournalOpEntryStatus(HasDevice& device, HasGattOpContext context, in UpdateJournalOpEntryStatus() argument
255 device.has_journal_.begin(), device.has_journal_.end(), in UpdateJournalOpEntryStatus()
263 if (journal_entry == device.has_journal_.end()) { in UpdateJournalOpEntryStatus()
270 if (journal_entry == device.has_journal_.end()) { in UpdateJournalOpEntryStatus()
298 auto device = GetDevice(conn_id); in OnHasActivePresetCycleStatus() local
299 if (!device) { in OnHasActivePresetCycleStatus()
307 UpdateJournalOpEntryStatus(*device, context, status); in OnHasActivePresetCycleStatus()
325 log::info("Database out of sync for {}", device->addr); in OnHasActivePresetCycleStatus()
326 ClearDeviceInformationAndStartSearch(device); in OnHasActivePresetCycleStatus()
332 auto device = GetDevice(conn_id); in OnHasPresetNameSetStatus() local
333 if (!device) { in OnHasPresetNameSetStatus()
342 UpdateJournalOpEntryStatus(*device, context, status); in OnHasPresetNameSetStatus()
356 callbacks_->OnSetPresetNameError(device->addr, op.index, in OnHasPresetNameSetStatus()
359 log::info("Database out of sync for {}", device->addr); in OnHasPresetNameSetStatus()
360 ClearDeviceInformationAndStartSearch(device); in OnHasPresetNameSetStatus()
366 auto device = GetDevice(conn_id); in OnHasPresetNameGetStatus() local
367 if (!device) { in OnHasPresetNameGetStatus()
376 UpdateJournalOpEntryStatus(*device, context, status); in OnHasPresetNameGetStatus()
387 callbacks_->OnPresetInfoError(device->addr, op.index, in OnHasPresetNameGetStatus()
391 log::info("Database out of sync for {}", device->addr); in OnHasPresetNameGetStatus()
392 ClearDeviceInformationAndStartSearch(device); in OnHasPresetNameGetStatus()
395 device->addr); in OnHasPresetNameGetStatus()
396 BTA_GATTC_Close(device->conn_id); in OnHasPresetNameGetStatus()
404 auto device = GetDevice(conn_id); in OnHasPresetIndexOperation() local
405 if (!device) { in OnHasPresetIndexOperation()
414 UpdateJournalOpEntryStatus(*device, context, status); in OnHasPresetIndexOperation()
430 callbacks_->OnPresetInfoError(device->addr, op.index, in OnHasPresetIndexOperation()
439 log::info("Database out of sync for {}", device->addr); in OnHasPresetIndexOperation()
440 ClearDeviceInformationAndStartSearch(device); in OnHasPresetIndexOperation()
443 device->addr); in OnHasPresetIndexOperation()
444 BTA_GATTC_Close(device->conn_id); in OnHasPresetIndexOperation()
458 auto device = std::find_if( in CpReadAllPresetsOperation() local
461 if (device == devices_.end()) { in CpReadAllPresetsOperation()
464 callbacks_->OnPresetInfoError(device->addr, operation.index, in CpReadAllPresetsOperation()
469 if (!device->SupportsPresets()) { in CpReadAllPresetsOperation()
470 callbacks_->OnPresetInfoError(device->addr, operation.index, in CpReadAllPresetsOperation()
477 device->has_journal_.Append(HasJournalRecord(operation, context)); in CpReadAllPresetsOperation()
482 device->conn_id, device->cp_handle, operation.ToCharacteristicValue(), in CpReadAllPresetsOperation()
492 ErrorCode CpPresetIndexOperationWriteReq(HasDevice& device, in CpPresetIndexOperationWriteReq() argument
496 if (!device.IsConnected()) return ErrorCode::OPERATION_NOT_POSSIBLE; in CpPresetIndexOperationWriteReq()
498 if (!device.SupportsPresets()) return ErrorCode::OPERATION_NOT_SUPPORTED; in CpPresetIndexOperationWriteReq()
500 if (!device.SupportsOperation(operation.opcode)) in CpPresetIndexOperationWriteReq()
505 if (!device.IsValidPreset(operation.index)) in CpPresetIndexOperationWriteReq()
511 device.has_journal_.Append(HasJournalRecord(operation, context)); in CpPresetIndexOperationWriteReq()
516 device.conn_id, device.cp_handle, operation.ToCharacteristicValue(), in CpPresetIndexOperationWriteReq()
530 auto device = std::find_if(devices_.begin(), devices_.end(), in AreAllDevicesAvailable() local
532 if (device == devices_.end() || !device->IsConnected()) { in AreAllDevicesAvailable()
541 std::function<ErrorCode(HasDevice& device, HasCtpOp& operation)> in CpPresetOperationCaller() argument
575 auto device = std::find_if(devices_.begin(), devices_.end(), in CpPresetOperationCaller() local
577 if (device != devices_.end()) { in CpPresetOperationCaller()
578 status = write_cb(*device, operation); in CpPresetOperationCaller()
591 auto device = std::find_if(devices_.begin(), devices_.end(), in CpPresetOperationCaller() local
593 if (device != devices_.end()) { in CpPresetOperationCaller()
594 status = write_cb(*device, operation); in CpPresetOperationCaller()
608 auto device = std::find_if(devices_.begin(), devices_.end(), in CpPresetOperationCaller() local
612 if (device != devices_.end()) status = write_cb(*device, operation); in CpPresetOperationCaller()
622 operation, [](HasDevice& device, HasCtpOp operation) -> ErrorCode { in CpPresetIndexOperation() argument
624 return instance->CpPresetIndexOperationWriteReq(device, operation); in CpPresetIndexOperation()
650 ErrorCode CpPresetsCycleOperationWriteReq(HasDevice& device, in CpPresetsCycleOperationWriteReq() argument
652 log::debug("addr: {} operation: {}", device.addr, operation); in CpPresetsCycleOperationWriteReq()
654 if (!device.IsConnected()) return ErrorCode::OPERATION_NOT_POSSIBLE; in CpPresetsCycleOperationWriteReq()
656 if (!device.SupportsPresets()) return ErrorCode::OPERATION_NOT_SUPPORTED; in CpPresetsCycleOperationWriteReq()
658 if (!device.SupportsOperation(operation.opcode)) in CpPresetsCycleOperationWriteReq()
666 device.has_journal_.Append(HasJournalRecord(operation, context)); in CpPresetsCycleOperationWriteReq()
671 device.conn_id, device.cp_handle, operation.ToCharacteristicValue(), in CpPresetsCycleOperationWriteReq()
686 operation, [](HasDevice& device, HasCtpOp operation) -> ErrorCode { in CpPresetsCycleOperation() argument
688 return instance->CpPresetsCycleOperationWriteReq(device, operation); in CpPresetsCycleOperation()
696 ErrorCode CpWritePresetNameOperationWriteReq(HasDevice& device, in CpWritePresetNameOperationWriteReq() argument
698 log::debug("addr: {} operation: {}", device.addr, operation); in CpWritePresetNameOperationWriteReq()
700 if (!device.IsConnected()) return ErrorCode::OPERATION_NOT_POSSIBLE; in CpWritePresetNameOperationWriteReq()
702 if (!device.SupportsPresets()) return ErrorCode::OPERATION_NOT_SUPPORTED; in CpWritePresetNameOperationWriteReq()
704 if (!device.IsValidPreset(operation.index, true)) in CpWritePresetNameOperationWriteReq()
705 return device.IsValidPreset(operation.index) in CpWritePresetNameOperationWriteReq()
709 if (!device.SupportsOperation(operation.opcode)) in CpWritePresetNameOperationWriteReq()
719 device.has_journal_.Append(HasJournalRecord(operation, context)); in CpWritePresetNameOperationWriteReq()
724 device.conn_id, device.cp_handle, operation.ToCharacteristicValue(), in CpWritePresetNameOperationWriteReq()
764 auto device = std::find_if(devices_.begin(), devices_.end(), in CpWritePresetNameOperation() local
766 if (device != devices_.end()) { in CpWritePresetNameOperation()
767 status = CpWritePresetNameOperationWriteReq(*device, operation); in CpWritePresetNameOperation()
799 auto device = std::find_if(devices_.begin(), devices_.end(), in shouldRequestSyncedOp() local
801 if (device != devices_.end()) { in shouldRequestSyncedOp()
802 if (device->SupportsOperation(opcode)) return true; in shouldRequestSyncedOp()
846 auto device = std::find_if(devices_.begin(), devices_.end(), in GetPresetInfo() local
848 if (device == devices_.end()) { in GetPresetInfo()
861 auto* preset = device->GetPreset(preset_index); in GetPresetInfo()
892 for (auto& device : devices_) { in CleanUp() local
893 if (device.conn_id != GATT_INVALID_CONN_ID) in CleanUp()
894 BTA_GATTC_Close(device.conn_id); in CleanUp()
895 DoDisconnectCleanUp(device); in CleanUp()
907 for (const auto& device : devices_) { in Dump() local
909 device.Dump(stream); in Dump()
930 void WriteAllNeededCcc(const HasDevice& device) { in WriteAllNeededCcc() argument
931 if (device.conn_id == GATT_INVALID_CONN_ID) { in WriteAllNeededCcc()
932 log::error("Device {} is not connected", device.addr); in WriteAllNeededCcc()
938 if (device.SupportsFeaturesNotification()) { in WriteAllNeededCcc()
939 SubscribeForNotifications(device.conn_id, device.addr, in WriteAllNeededCcc()
940 device.features_handle, in WriteAllNeededCcc()
941 device.features_ccc_handle); in WriteAllNeededCcc()
944 if (device.SupportsPresets()) { in WriteAllNeededCcc()
945 SubscribeForNotifications(device.conn_id, device.addr, device.cp_handle, in WriteAllNeededCcc()
946 device.cp_ccc_handle, device.cp_ccc_val); in WriteAllNeededCcc()
947 SubscribeForNotifications(device.conn_id, device.addr, in WriteAllNeededCcc()
948 device.active_preset_handle, in WriteAllNeededCcc()
949 device.active_preset_ccc_handle); in WriteAllNeededCcc()
955 HasCtpOp(device.addr, PresetCtpOpcode::READ_PRESETS, in WriteAllNeededCcc()
961 void OnEncrypted(HasDevice& device) { in OnEncrypted() argument
962 log::debug("{}", device.addr); in OnEncrypted()
964 if (device.isGattServiceValid()) { in OnEncrypted()
965 device.is_connecting_actively = false; in OnEncrypted()
966 NotifyHasDeviceValid(device); in OnEncrypted()
967 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::ALL_PRESET_INFO, in OnEncrypted()
968 device.GetAllPresetInfo()); in OnEncrypted()
969 callbacks_->OnActivePresetSelected(device.addr, in OnEncrypted()
970 device.currently_active_preset); in OnEncrypted()
971 WriteAllNeededCcc(device); in OnEncrypted()
973 BTA_GATTC_ServiceSearchRequest(device.conn_id, kUuidHearingAccessService); in OnEncrypted()
977 void NotifyHasDeviceValid(const HasDevice& device) { in NotifyHasDeviceValid() argument
978 log::debug("addr:{}", device.addr); in NotifyHasDeviceValid()
981 preset_indices.reserve(device.has_presets.size()); in NotifyHasDeviceValid()
982 for (auto const& preset : device.has_presets) { in NotifyHasDeviceValid()
987 callbacks_->OnConnectionState(ConnectionState::CONNECTED, device.addr); in NotifyHasDeviceValid()
990 void MarkDeviceValidIfInInitialDiscovery(HasDevice& device) { in MarkDeviceValidIfInInitialDiscovery() argument
991 if (device.isGattServiceValid()) return; in MarkDeviceValidIfInInitialDiscovery()
993 --device.gatt_svc_validation_steps; in MarkDeviceValidIfInInitialDiscovery()
995 if (device.isGattServiceValid()) { in MarkDeviceValidIfInInitialDiscovery()
996 device.is_connecting_actively = false; in MarkDeviceValidIfInInitialDiscovery()
999 if (device.SerializePresets(presets_bin)) { in MarkDeviceValidIfInInitialDiscovery()
1000 btif_storage_add_leaudio_has_device(device.addr, presets_bin, in MarkDeviceValidIfInInitialDiscovery()
1001 device.GetFeatures(), in MarkDeviceValidIfInInitialDiscovery()
1002 device.currently_active_preset); in MarkDeviceValidIfInInitialDiscovery()
1004 NotifyHasDeviceValid(device); in MarkDeviceValidIfInInitialDiscovery()
1012 auto device = GetDevice(conn_id); in OnGattWriteCcc() local
1013 if (!device) { in OnGattWriteCcc()
1020 log::info("Database out of sync for {}", device->addr); in OnGattWriteCcc()
1021 ClearDeviceInformationAndStartSearch(device); in OnGattWriteCcc()
1029 if (handle == device->features_ccc_handle) { in OnGattWriteCcc()
1031 device->features_notifications_enabled = enabling_ntf; in OnGattWriteCcc()
1033 } else if ((handle == device->active_preset_ccc_handle) || in OnGattWriteCcc()
1034 (handle == device->cp_ccc_handle)) { in OnGattWriteCcc()
1047 auto device = GetDevice(conn_id); in OnHasNotification() local
1048 if (!device) { in OnHasNotification()
1053 if (handle == device->features_handle) { in OnHasNotification()
1054 OnHasFeaturesValue(&(*device), GATT_SUCCESS, handle, len, value); in OnHasNotification()
1056 } else if (handle == device->cp_handle) { in OnHasNotification()
1057 OnHasCtpValueNotification(&(*device), len, value); in OnHasNotification()
1059 } else if (handle == device->active_preset_handle) { in OnHasNotification()
1060 OnHasActivePresetValue(&(*device), GATT_SUCCESS, handle, len, value); in OnHasNotification()
1067 HasDevice* device = nullptr; in GetDevice() local
1070 device = std::get<HasDevice*>(conn_id_device_variant); in GetDevice()
1075 if (it != devices_.end()) device = &(*it); in GetDevice()
1078 return device; in GetDevice()
1087 auto device = GetDevice(conn_id_device_variant); in OnHasFeaturesValue() local
1088 if (!device) { in OnHasFeaturesValue()
1095 log::info("Database out of sync for {}", device->addr); in OnHasFeaturesValue()
1096 ClearDeviceInformationAndStartSearch(device); in OnHasFeaturesValue()
1099 BTA_GATTC_Close(device->conn_id); in OnHasFeaturesValue()
1107 BTA_GATTC_Close(device->conn_id); in OnHasFeaturesValue()
1114 device->UpdateFeatures(features); in OnHasFeaturesValue()
1116 if (device->isGattServiceValid()) { in OnHasFeaturesValue()
1117 btif_storage_set_leaudio_has_features(device->addr, features); in OnHasFeaturesValue()
1121 device->has_journal_.Append(HasJournalRecord(features, true)); in OnHasFeaturesValue()
1126 if (!device->isGattServiceValid()) in OnHasFeaturesValue()
1127 callbacks_->OnDeviceAvailable(device->addr, device->GetFeatures()); in OnHasFeaturesValue()
1130 callbacks_->OnFeaturesUpdate(device->addr, device->GetFeatures()); in OnHasFeaturesValue()
1132 MarkDeviceValidIfInInitialDiscovery(*device); in OnHasFeaturesValue()
1162 void OnHasPresetReadResponseNotification(HasDevice& device) { in OnHasPresetReadResponseNotification() argument
1165 while (device.ctp_notifications_.size() != 0) { in OnHasPresetReadResponseNotification()
1166 auto ntf = device.ctp_notifications_.front(); in OnHasPresetReadResponseNotification()
1172 device.has_presets.erase(ntf.preset->GetIndex()); in OnHasPresetReadResponseNotification()
1173 device.has_presets.insert(ntf.preset.value()); in OnHasPresetReadResponseNotification()
1179 if (device.isGattServiceValid()) { in OnHasPresetReadResponseNotification()
1180 auto info = device.GetPresetInfo(ntf.preset.value().GetIndex()); in OnHasPresetReadResponseNotification()
1183 device.addr, PresetInfoReason::PRESET_INFO_REQUEST_RESPONSE, in OnHasPresetReadResponseNotification()
1188 device.has_journal_.Append(HasJournalRecord(ntf)); in OnHasPresetReadResponseNotification()
1189 device.ctp_notifications_.pop_front(); in OnHasPresetReadResponseNotification()
1192 auto in_svc_validation = !device.isGattServiceValid(); in OnHasPresetReadResponseNotification()
1193 MarkDeviceValidIfInInitialDiscovery(device); in OnHasPresetReadResponseNotification()
1199 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::ALL_PRESET_INFO, in OnHasPresetReadResponseNotification()
1200 device.GetAllPresetInfo()); in OnHasPresetReadResponseNotification()
1205 if (device.isGattServiceValid()) in OnHasPresetReadResponseNotification()
1206 callbacks_->OnActivePresetSelected(device.addr, in OnHasPresetReadResponseNotification()
1207 device.currently_active_preset); in OnHasPresetReadResponseNotification()
1211 void OnHasPresetGenericUpdate(HasDevice& device) { in OnHasPresetGenericUpdate() argument
1218 while (device.ctp_notifications_.size() != 0) { in OnHasPresetGenericUpdate()
1219 auto nt = device.ctp_notifications_.front(); in OnHasPresetGenericUpdate()
1227 auto it = device.has_presets.begin(); in OnHasPresetGenericUpdate()
1228 while (it != device.has_presets.end()) { in OnHasPresetGenericUpdate()
1231 auto info = device.GetPresetInfo(it->GetIndex()); in OnHasPresetGenericUpdate()
1234 it = device.has_presets.erase(it); in OnHasPresetGenericUpdate()
1241 auto info = device.GetPreset(nt.preset->GetIndex()); in OnHasPresetGenericUpdate()
1244 device.has_presets.erase(nt.preset->GetIndex()); in OnHasPresetGenericUpdate()
1245 device.has_presets.insert(*nt.preset); in OnHasPresetGenericUpdate()
1247 *device.GetPresetInfo(nt.preset->GetIndex())); in OnHasPresetGenericUpdate()
1250 device.has_presets.insert(*nt.preset); in OnHasPresetGenericUpdate()
1251 updated_infos.push_back(*device.GetPresetInfo(nt.preset->GetIndex())); in OnHasPresetGenericUpdate()
1256 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetGenericUpdate()
1257 device.ctp_notifications_.pop_front(); in OnHasPresetGenericUpdate()
1260 if (device.isGattServiceValid()) { in OnHasPresetGenericUpdate()
1263 if (device.SerializePresets(presets_bin)) { in OnHasPresetGenericUpdate()
1264 btif_storage_set_leaudio_has_presets(device.addr, presets_bin); in OnHasPresetGenericUpdate()
1287 if (group_op_coordinator.SetCompleted(device.addr)) { in OnHasPresetGenericUpdate()
1315 device.addr, PresetInfoReason::PRESET_INFO_UPDATE, updated_infos); in OnHasPresetGenericUpdate()
1319 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_DELETED, in OnHasPresetGenericUpdate()
1325 void OnHasPresetAvailabilityChanged(HasDevice& device) { in OnHasPresetAvailabilityChanged() argument
1330 while (device.ctp_notifications_.size() != 0) { in OnHasPresetAvailabilityChanged()
1331 auto nt = device.ctp_notifications_.front(); in OnHasPresetAvailabilityChanged()
1336 auto preset = device.has_presets.extract(nt.index).value(); in OnHasPresetAvailabilityChanged()
1350 device.has_presets.insert( in OnHasPresetAvailabilityChanged()
1353 auto info = device.GetPresetInfo(nt.index); in OnHasPresetAvailabilityChanged()
1357 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetAvailabilityChanged()
1358 device.ctp_notifications_.pop_front(); in OnHasPresetAvailabilityChanged()
1362 if (device.isGattServiceValid()) { in OnHasPresetAvailabilityChanged()
1364 if (device.SerializePresets(presets_bin)) { in OnHasPresetAvailabilityChanged()
1365 btif_storage_set_leaudio_has_presets(device.addr, presets_bin); in OnHasPresetAvailabilityChanged()
1370 device.addr, PresetInfoReason::PRESET_AVAILABILITY_CHANGED, infos); in OnHasPresetAvailabilityChanged()
1373 void OnHasPresetDeleted(HasDevice& device) { in OnHasPresetDeleted() argument
1379 while (device.ctp_notifications_.size() != 0) { in OnHasPresetDeleted()
1380 auto nt = device.ctp_notifications_.front(); in OnHasPresetDeleted()
1388 auto info = device.GetPresetInfo(nt.index); in OnHasPresetDeleted()
1391 if (device.has_presets.count(nt.index)) { in OnHasPresetDeleted()
1393 device.has_presets.erase(nt.index); in OnHasPresetDeleted()
1397 device.has_journal_.Append(HasJournalRecord(nt)); in OnHasPresetDeleted()
1398 device.ctp_notifications_.pop_front(); in OnHasPresetDeleted()
1402 if (device.isGattServiceValid()) { in OnHasPresetDeleted()
1404 if (device.SerializePresets(presets_bin)) { in OnHasPresetDeleted()
1405 btif_storage_set_leaudio_has_presets(device.addr, presets_bin); in OnHasPresetDeleted()
1410 callbacks_->OnPresetInfo(device.addr, PresetInfoReason::PRESET_DELETED, in OnHasPresetDeleted()
1414 void ProcessCtpNotificationQueue(HasDevice& device) { in ProcessCtpNotificationQueue() argument
1417 while (device.ctp_notifications_.size() != 0) { in ProcessCtpNotificationQueue()
1418 auto ntf = device.ctp_notifications_.front(); in ProcessCtpNotificationQueue()
1424 OnHasPresetGenericUpdate(device); in ProcessCtpNotificationQueue()
1427 OnHasPresetAvailabilityChanged(device); in ProcessCtpNotificationQueue()
1430 OnHasPresetAvailabilityChanged(device); in ProcessCtpNotificationQueue()
1433 OnHasPresetDeleted(device); in ProcessCtpNotificationQueue()
1441 OnHasPresetReadResponseNotification(device); in ProcessCtpNotificationQueue()
1449 void OnHasCtpValueNotification(HasDevice* device, uint16_t len, in OnHasCtpValueNotification() argument
1453 log::error("Unhandled notification for device: {}", *device); in OnHasCtpValueNotification()
1454 BTA_GATTC_Close(device->conn_id); in OnHasCtpValueNotification()
1461 device->ctp_notifications_.push_back(ntf); in OnHasCtpValueNotification()
1462 if (ntf.is_last) ProcessCtpNotificationQueue(*device); in OnHasCtpValueNotification()
1471 auto device = GetDevice(conn_id_device_variant); in OnHasActivePresetValue() local
1472 if (!device) { in OnHasActivePresetValue()
1479 log::info("Database out of sync for {}", device->addr); in OnHasActivePresetValue()
1480 ClearDeviceInformationAndStartSearch(device); in OnHasActivePresetValue()
1483 BTA_GATTC_Close(device->conn_id); in OnHasActivePresetValue()
1490 BTA_GATTC_Close(device->conn_id); in OnHasActivePresetValue()
1496 STREAM_TO_UINT8(device->currently_active_preset, pp); in OnHasActivePresetValue()
1498 if (device->isGattServiceValid()) { in OnHasActivePresetValue()
1500 device->addr, device->currently_active_preset); in OnHasActivePresetValue()
1504 device->has_journal_.Append( in OnHasActivePresetValue()
1505 HasJournalRecord(device->currently_active_preset, false)); in OnHasActivePresetValue()
1508 MarkDeviceValidIfInInitialDiscovery(*device); in OnHasActivePresetValue()
1510 if (device->isGattServiceValid()) { in OnHasActivePresetValue()
1529 if (group_op_coordinator.SetCompleted(device->addr)) { in OnHasActivePresetValue()
1541 device->currently_active_preset); in OnHasActivePresetValue()
1548 callbacks_->OnActivePresetSelected(device->addr, in OnHasActivePresetValue()
1549 device->currently_active_preset); in OnHasActivePresetValue()
1554 void DeregisterNotifications(HasDevice& device) { in DeregisterNotifications() argument
1556 if (device.features_ccc_handle != GAP_INVALID_HANDLE) { in DeregisterNotifications()
1557 BTA_GATTC_DeregisterForNotifications(gatt_if_, device.addr, in DeregisterNotifications()
1558 device.features_handle); in DeregisterNotifications()
1562 if (device.active_preset_ccc_handle != GAP_INVALID_HANDLE) { in DeregisterNotifications()
1563 BTA_GATTC_DeregisterForNotifications(gatt_if_, device.addr, in DeregisterNotifications()
1564 device.active_preset_handle); in DeregisterNotifications()
1568 if (device.cp_ccc_handle != GAP_INVALID_HANDLE) { in DeregisterNotifications()
1569 BTA_GATTC_DeregisterForNotifications(gatt_if_, device.addr, in DeregisterNotifications()
1570 device.cp_handle); in DeregisterNotifications()
1575 void DoDisconnectCleanUp(HasDevice& device, in DoDisconnectCleanUp() argument
1577 log::debug(": device={}", device.addr); in DoDisconnectCleanUp()
1579 DeregisterNotifications(device); in DoDisconnectCleanUp()
1581 if (device.conn_id != GATT_INVALID_CONN_ID) { in DoDisconnectCleanUp()
1582 BtaGattQueue::Clean(device.conn_id); in DoDisconnectCleanUp()
1583 if (invalidate_gatt_service) device.gatt_svc_validation_steps = 0xFE; in DoDisconnectCleanUp()
1587 auto addr = device.addr; in DoDisconnectCleanUp()
1599 device.ConnectionCleanUp(); in DoDisconnectCleanUp()
1603 bool CacheAttributeHandles(const gatt::Service& service, HasDevice* device) { in CacheAttributeHandles() argument
1604 log::debug("device={}", device->addr); in CacheAttributeHandles()
1610 FindCccHandle(device->conn_id, charac.value_handle); in CacheAttributeHandles()
1615 device->active_preset_ccc_handle = ccc_handle; in CacheAttributeHandles()
1616 device->active_preset_handle = charac.value_handle; in CacheAttributeHandles()
1621 FindCccHandle(device->conn_id, charac.value_handle); in CacheAttributeHandles()
1639 device->cp_ccc_handle = ccc_handle; in CacheAttributeHandles()
1640 device->cp_handle = charac.value_handle; in CacheAttributeHandles()
1641 device->cp_ccc_val = ccc_val; in CacheAttributeHandles()
1645 FindCccHandle(device->conn_id, charac.value_handle); in CacheAttributeHandles()
1646 device->features_ccc_handle = ccc_handle; in CacheAttributeHandles()
1647 device->features_handle = charac.value_handle; in CacheAttributeHandles()
1653 bool LoadHasDetailsFromStorage(HasDevice* device) { in LoadHasDetailsFromStorage() argument
1654 log::debug("device={}", device->addr); in LoadHasDetailsFromStorage()
1659 if (!btif_storage_get_leaudio_has_presets(device->addr, presets_bin, in LoadHasDetailsFromStorage()
1664 *device)) in LoadHasDetailsFromStorage()
1669 device->currently_active_preset = active_preset; in LoadHasDetailsFromStorage()
1673 if (btif_storage_get_leaudio_has_features(device->addr, val)) in LoadHasDetailsFromStorage()
1674 device->UpdateFeatures(val); in LoadHasDetailsFromStorage()
1677 device->gatt_svc_validation_steps = 0; in LoadHasDetailsFromStorage()
1678 device->is_connecting_actively = false; in LoadHasDetailsFromStorage()
1680 NotifyHasDeviceValid(*device); in LoadHasDetailsFromStorage()
1681 callbacks_->OnPresetInfo(device->addr, PresetInfoReason::ALL_PRESET_INFO, in LoadHasDetailsFromStorage()
1682 device->GetAllPresetInfo()); in LoadHasDetailsFromStorage()
1683 callbacks_->OnActivePresetSelected(device->addr, in LoadHasDetailsFromStorage()
1684 device->currently_active_preset); in LoadHasDetailsFromStorage()
1685 if (device->conn_id == GATT_INVALID_CONN_ID) return true; in LoadHasDetailsFromStorage()
1689 WriteAllNeededCcc(*device); in LoadHasDetailsFromStorage()
1695 HasDevice* device) { in StartInitialHasDetailsReadAndValidation() argument
1697 if (device->features_handle == GAP_INVALID_HANDLE) { in StartInitialHasDetailsReadAndValidation()
1703 if (device->cp_handle != GAP_INVALID_HANDLE) { in StartInitialHasDetailsReadAndValidation()
1704 if (device->active_preset_handle == GAP_INVALID_HANDLE) return false; in StartInitialHasDetailsReadAndValidation()
1705 if (device->active_preset_ccc_handle == GAP_INVALID_HANDLE) return false; in StartInitialHasDetailsReadAndValidation()
1709 device->gatt_svc_validation_steps = 1 + (device->SupportsPresets() ? 2 : 0); in StartInitialHasDetailsReadAndValidation()
1713 device->conn_id, device->features_handle, in StartInitialHasDetailsReadAndValidation()
1723 if (device->SupportsFeaturesNotification()) { in StartInitialHasDetailsReadAndValidation()
1724 SubscribeForNotifications(device->conn_id, device->addr, in StartInitialHasDetailsReadAndValidation()
1725 device->features_handle, in StartInitialHasDetailsReadAndValidation()
1726 device->features_ccc_handle); in StartInitialHasDetailsReadAndValidation()
1734 if (device->SupportsPresets()) { in StartInitialHasDetailsReadAndValidation()
1736 SubscribeForNotifications(device->conn_id, device->addr, in StartInitialHasDetailsReadAndValidation()
1737 device->active_preset_handle, in StartInitialHasDetailsReadAndValidation()
1738 device->active_preset_ccc_handle); in StartInitialHasDetailsReadAndValidation()
1740 SubscribeForNotifications(device->conn_id, device->addr, in StartInitialHasDetailsReadAndValidation()
1741 device->cp_handle, device->cp_ccc_handle, in StartInitialHasDetailsReadAndValidation()
1742 device->cp_ccc_val); in StartInitialHasDetailsReadAndValidation()
1746 HasCtpOp(device->addr, PresetCtpOpcode::READ_PRESETS, in StartInitialHasDetailsReadAndValidation()
1752 device->conn_id, device->active_preset_handle, in StartInitialHasDetailsReadAndValidation()
1772 auto* device = static_cast<HasDevice*>(context); in OnHasServiceFound() local
1775 if (!CacheAttributeHandles(service, device)) return false; in OnHasServiceFound()
1778 if (LoadHasDetailsFromStorage(device)) return true; in OnHasServiceFound()
1781 return StartInitialHasDetailsReadAndValidation(service, device); in OnHasServiceFound()
1838 auto device = std::find_if(devices_.begin(), devices_.end(), in OnGattConnected() local
1840 if (device == devices_.end()) { in OnGattConnected()
1847 if (!device->is_connecting_actively) { in OnGattConnected()
1853 devices_.erase(device); in OnGattConnected()
1859 device->conn_id = evt.conn_id; in OnGattConnected()
1861 if (BTM_SecIsSecurityPending(device->addr)) { in OnGattConnected()
1869 if (BTM_IsEncrypted(device->addr, BT_TRANSPORT_LE)) { in OnGattConnected()
1871 OnEncrypted(*device); in OnGattConnected()
1875 int result = BTM_SetEncryption(device->addr, BT_TRANSPORT_LE, nullptr, in OnGattConnected()
1879 device->addr, result); in OnGattConnected()
1882 log::error("Link key unknown for {}, disconnect profile", device->addr); in OnGattConnected()
1883 BTA_GATTC_Close(device->conn_id); in OnGattConnected()
1888 auto device = std::find_if(devices_.begin(), devices_.end(), in OnGattDisconnected() local
1890 if (device == devices_.end()) { in OnGattDisconnected()
1895 log::debug("device={}: reason=0x{:x}", device->addr, in OnGattDisconnected()
1899 if (device->is_connecting_actively || device->isGattServiceValid()) in OnGattDisconnected()
1905 DoDisconnectCleanUp(*device, peer_disconnected ? false : true); in OnGattDisconnected()
1909 BTA_GATTC_Open(gatt_if_, device->addr, BTM_BLE_BKG_CONNECT_ALLOW_LIST, in OnGattDisconnected()
1914 auto device = GetDevice(evt.conn_id); in OnGattServiceSearchComplete() local
1915 if (!device) { in OnGattServiceSearchComplete()
1923 if (!BTM_IsEncrypted(device->addr, BT_TRANSPORT_LE)) { in OnGattServiceSearchComplete()
1931 if (!device->isGattServiceValid()) { in OnGattServiceSearchComplete()
1934 BTA_GATTC_Close(device->conn_id); in OnGattServiceSearchComplete()
1939 BTA_GATTC_GetServices(device->conn_id); in OnGattServiceSearchComplete()
1948 BTA_GATTC_Close(device->conn_id); in OnGattServiceSearchComplete()
1953 if (!instance->OnHasServiceFound(*service, &(*device))) { in OnGattServiceSearchComplete()
1955 BTA_GATTC_Close(device->conn_id); in OnGattServiceSearchComplete()
1975 auto device = std::find_if(devices_.begin(), devices_.end(), in OnLeEncryptionComplete() local
1977 if (device == devices_.end()) { in OnLeEncryptionComplete()
1985 BTA_GATTC_Close(device->conn_id); in OnLeEncryptionComplete()
1989 if (device->isGattServiceValid()) { in OnLeEncryptionComplete()
1990 instance->OnEncrypted(*device); in OnLeEncryptionComplete()
1992 BTA_GATTC_ServiceSearchRequest(device->conn_id, in OnLeEncryptionComplete()
1997 void ClearDeviceInformationAndStartSearch(HasDevice* device) { in ClearDeviceInformationAndStartSearch() argument
1998 if (!device) { in ClearDeviceInformationAndStartSearch()
2003 log::info("{}", device->addr); in ClearDeviceInformationAndStartSearch()
2005 if (!device->isGattServiceValid()) { in ClearDeviceInformationAndStartSearch()
2011 DeregisterNotifications(*device); in ClearDeviceInformationAndStartSearch()
2012 BtaGattQueue::Clean(device->conn_id); in ClearDeviceInformationAndStartSearch()
2013 device->ClearSvcData(); in ClearDeviceInformationAndStartSearch()
2014 btif_storage_remove_leaudio_has(device->addr); in ClearDeviceInformationAndStartSearch()
2015 BTA_GATTC_ServiceSearchRequest(device->conn_id, kUuidHearingAccessService); in ClearDeviceInformationAndStartSearch()
2019 auto device = std::find_if(devices_.begin(), devices_.end(), in OnGattServiceChangeEvent() local
2021 if (device == devices_.end()) { in OnGattServiceChangeEvent()
2026 ClearDeviceInformationAndStartSearch(&(*device)); in OnGattServiceChangeEvent()
2030 auto device = std::find_if(devices_.begin(), devices_.end(), in OnGattServiceDiscoveryDoneEvent() local
2032 if (device == devices_.end()) { in OnGattServiceDiscoveryDoneEvent()
2039 if (!device->isGattServiceValid()) in OnGattServiceDiscoveryDoneEvent()
2040 BTA_GATTC_ServiceSearchRequest(device->conn_id, in OnGattServiceDiscoveryDoneEvent()