/* * Copyright 2024 The Android Open Source Project * * 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. */ #include #include #include "bta/include/bta_gatt_api.h" #include "bta/include/bta_ras_api.h" #include "bta/ras/ras_types.h" #include "os/log.h" #include "stack/include/bt_types.h" #include "stack/include/btm_ble_addr.h" #include "stack/include/gap_api.h" #include "types/bluetooth/uuid.h" using namespace bluetooth; using namespace ::ras; using namespace ::ras::uuid; namespace ras { std::string uuid::getUuidName(const bluetooth::Uuid& uuid) { switch (uuid.As16Bit()) { case kRangingService16Bit: return "Ranging Service"; case kRasFeaturesCharacteristic16bit: return "RAS Features"; case kRasRealTimeRangingDataCharacteristic16bit: return "Real-time Ranging Data"; case kRasOnDemandDataCharacteristic16bit: return "On-demand Ranging Data"; case kRasControlPointCharacteristic16bit: return "RAS Control Point (RAS-CP)"; case kRasRangingDataReadyCharacteristic16bit: return "Ranging Data Ready"; case kRasRangingDataOverWrittenCharacteristic16bit: return "Ranging Data Overwritten"; case kClientCharacteristicConfiguration16bit: return "Client Characteristic Configuration"; default: return "Unknown UUID"; } } bool ParseControlPointCommand(ControlPointCommand* command, const uint8_t* value, uint16_t len) { // Check for minimum expected length switch (value[0]) { case (uint8_t)Opcode::ABORT_OPERATION: break; case (uint8_t)Opcode::PCT_FORMAT: { if (len < 2) { return false; } } break; case (uint8_t)Opcode::GET_RANGING_DATA: case (uint8_t)Opcode::ACK_RANGING_DATA: case (uint8_t)Opcode::FILTER: { if (len < 3) { return false; } } break; case (uint8_t)Opcode::RETRIEVE_LOST_RANGING_DATA_SEGMENTS: { if (len < 5) { return false; } } break; default: log::warn("unknown opcode 0x{:02x}", value[0]); return false; } command->opcode_ = static_cast(value[0]); std::memcpy(command->parameter_, value + 1, len - 1); return true; } std::string GetOpcodeText(Opcode opcode) { switch (opcode) { case Opcode::GET_RANGING_DATA: return "GET_RANGING_DATA"; case Opcode::ACK_RANGING_DATA: return "ACK_RANGING_DATA"; case Opcode::RETRIEVE_LOST_RANGING_DATA_SEGMENTS: return "RETRIEVE_LOST_RANGING_DATA_SEGMENTS"; case Opcode::ABORT_OPERATION: return "ABORT_OPERATION"; case Opcode::FILTER: return "FILTER"; case Opcode::PCT_FORMAT: return "PCT_FORMAT"; default: return "Unknown Opcode"; } } std::string GetResponseOpcodeValueText(ResponseCodeValue response_code_value) { switch (response_code_value) { case ResponseCodeValue::RESERVED_FOR_FUTURE_USE: return "RESERVED_FOR_FUTURE_USE"; case ResponseCodeValue::SUCCESS: return "SUCCESS"; case ResponseCodeValue::OP_CODE_NOT_SUPPORTED: return "OP_CODE_NOT_SUPPORTED"; case ResponseCodeValue::INVALID_OPERATOR: return "INVALID_OPERATOR"; case ResponseCodeValue::OPERATOR_NOT_SUPPORTED: return "OPERATOR_NOT_SUPPORTED"; case ResponseCodeValue::INVALID_OPERAND: return "INVALID_OPERAND"; case ResponseCodeValue::ABORT_UNSUCCESSFUL: return "ABORT_UNSUCCESSFUL"; case ResponseCodeValue::PROCEDURE_NOT_COMPLETED: return "PROCEDURE_NOT_COMPLETED"; case ResponseCodeValue::OPERAND_NOT_SUPPORTED: return "OPERAND_NOT_SUPPORTED"; case ResponseCodeValue::NO_RECORDS_FOUND: return "NO_RECORDS_FOUND"; default: return "Unknown Opcode"; } } bool IsRangingServiceCharacteristic(const bluetooth::Uuid& uuid) { if (!uuid.Is16Bit()) { return false; } switch (uuid.As16Bit()) { case kRangingService16Bit: case kRasFeaturesCharacteristic16bit: case kRasRealTimeRangingDataCharacteristic16bit: case kRasOnDemandDataCharacteristic16bit: case kRasControlPointCharacteristic16bit: case kRasRangingDataReadyCharacteristic16bit: case kRasRangingDataOverWrittenCharacteristic16bit: return true; default: return false; } } } // namespace ras