1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.uwb.params; 18 19 import com.android.server.uwb.config.ConfigParam; 20 21 import com.google.uwb.support.base.Params; 22 import com.google.uwb.support.rftest.RfTestOpenSessionParams; 23 import com.google.uwb.support.base.ProtocolVersion; 24 import android.uwb.UwbAddress; 25 26 import com.android.modules.utils.build.SdkLevel; 27 28 /** RfTest encoder */ 29 public class RfTestEncoder extends TlvEncoder { 30 @Override getTlvBuffer(final Params param, final ProtocolVersion protocolVersion)31 public TlvBuffer getTlvBuffer(final Params param, final ProtocolVersion protocolVersion) { 32 if (param instanceof RfTestOpenSessionParams) { 33 return getTlvBufferFromRfTestOpenSessionParams(param); 34 } 35 return null; 36 } 37 getRfTestTlvBuffer(final Params param)38 public TlvBuffer getRfTestTlvBuffer(final Params param) { 39 if (param instanceof RfTestOpenSessionParams) { 40 return getTlvBufferFromRfTestParams(param); 41 } 42 return null; 43 } 44 getTlvBufferFromRfTestParams(final Params param)45 private TlvBuffer getTlvBufferFromRfTestParams(final Params param) { 46 RfTestOpenSessionParams params = (RfTestOpenSessionParams) param; 47 48 TlvBuffer.Builder tlvBufferBuilder = new TlvBuffer.Builder() 49 .putInt(ConfigParam.NUMBER_OF_PACKETS, params.getNumberOfPackets()) 50 .putInt(ConfigParam.T_GAP, params.getTgap()) 51 .putInt(ConfigParam.T_START, params.getTstart()) 52 .putInt(ConfigParam.T_WIN, params.getTwin()) 53 .putByte(ConfigParam.RANDOMIZE_PSDU, (byte) params.getRandomizePsdu()) 54 .putByte(ConfigParam.PHR_RANGING_BIT, (byte) params.getPhrRangingBit()) 55 .putInt(ConfigParam.RMARKER_TX_START, params.getRmarkerTxStart()) 56 .putInt(ConfigParam.RMARKER_RX_START, params.getRmarkerRxStart()) 57 .putByte(ConfigParam.STS_INDEX_AUTO_INCR, (byte) params.getStsIndexAutoIncr()) 58 .putByte(ConfigParam.STS_DETECT_BITMAP, (byte) params.getStsDetectBitmap()); 59 60 return tlvBufferBuilder.build(); 61 } 62 getTlvBufferFromRfTestOpenSessionParams(final Params baseParam)63 private TlvBuffer getTlvBufferFromRfTestOpenSessionParams(final Params baseParam) { 64 RfTestOpenSessionParams params = (RfTestOpenSessionParams) baseParam; 65 66 TlvBuffer.Builder tlvBufferBuilder = new TlvBuffer.Builder() 67 .putByte(ConfigParam.CHANNEL_NUMBER, (byte) params.getChannelNumber()) 68 .putByte(ConfigParam.NUMBER_OF_CONTROLEES, 69 (byte) params.getDestAddressList().size()) 70 .putByteArray(ConfigParam.DEVICE_MAC_ADDRESS, params.getDeviceAddress().size(), 71 getComputedMacAddress(params.getDeviceAddress())) 72 .putShort(ConfigParam.SLOT_DURATION, (short) params.getSlotDurationRstu()) 73 .putInt(ConfigParam.STS_INDEX, params.getStsIndex()) 74 .putByte(ConfigParam.MAC_FCS_TYPE, (byte) params.getFcsType()) 75 .putByte(ConfigParam.DEVICE_ROLE, (byte) params.getDeviceRole()) 76 .putByte(ConfigParam.RFRAME_CONFIG, (byte) params.getRframeConfig()) 77 .putByte(ConfigParam.PREAMBLE_CODE_INDEX, (byte) params.getPreambleCodeIndex()) 78 .putByte(ConfigParam.SFD_ID, (byte) params.getSfdId()) 79 .putByte(ConfigParam.PSDU_DATA_RATE, (byte) params.getPsduDataRate()) 80 .putByte(ConfigParam.PREAMBLE_DURATION, (byte) params.getPreambleDuration()) 81 .putByte(ConfigParam.PRF_MODE, (byte) params.getPrfMode()) 82 .putByte(ConfigParam.NUMBER_OF_STS_SEGMENTS, (byte) params.getStsSegmentCount()); 83 return tlvBufferBuilder.build(); 84 } 85 getComputedMacAddress(final UwbAddress address)86 private static byte[] getComputedMacAddress(final UwbAddress address) { 87 if (!SdkLevel.isAtLeastU()) { 88 return TlvUtil.getReverseBytes(address.toBytes()); 89 } 90 return address.toBytes(); 91 } 92 } 93