1 /* 2 * Copyright (C) 2021 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 package com.android.server.uwb; 17 18 import android.os.PersistableBundle; 19 import android.uwb.RangingChangeReason; 20 21 import com.android.server.uwb.data.UwbUciConstants; 22 23 import com.google.uwb.support.base.Params; 24 import com.google.uwb.support.ccc.CccParams; 25 import com.google.uwb.support.ccc.CccRangingError; 26 import com.google.uwb.support.fira.FiraStatusCode; 27 28 public class UwbSessionNotificationHelper { convertUciReasonCodeToApiReasonCode(int reasonCode)29 public static int convertUciReasonCodeToApiReasonCode(int reasonCode) { 30 /* set default */ 31 int rangingChangeReason = RangingChangeReason.UNKNOWN; 32 switch (reasonCode) { 33 case UwbUciConstants.REASON_STATE_CHANGE_WITH_SESSION_MANAGEMENT_COMMANDS: 34 rangingChangeReason = RangingChangeReason.LOCAL_API; 35 break; 36 case UwbUciConstants.REASON_MAX_RANGING_ROUND_RETRY_COUNT_REACHED: 37 rangingChangeReason = RangingChangeReason.MAX_RR_RETRY_REACHED; 38 break; 39 case UwbUciConstants.REASON_MAX_NUMBER_OF_MEASUREMENTS_REACHED: 40 rangingChangeReason = RangingChangeReason.REMOTE_REQUEST; 41 break; 42 case UwbUciConstants.REASON_ERROR_INSUFFICIENT_SLOTS_PER_RR: 43 case UwbUciConstants.REASON_ERROR_SLOT_LENGTH_NOT_SUPPORTED: 44 case UwbUciConstants.REASON_ERROR_INVALID_UL_TDOA_RANDOM_WINDOW: 45 case UwbUciConstants.REASON_ERROR_MAC_ADDRESS_MODE_NOT_SUPPORTED: 46 case UwbUciConstants.REASON_ERROR_INVALID_RANGING_INTERVAL: 47 case UwbUciConstants.REASON_ERROR_INVALID_STS_CONFIG: 48 case UwbUciConstants.REASON_ERROR_INVALID_RFRAME_CONFIG: 49 rangingChangeReason = RangingChangeReason.BAD_PARAMETERS; 50 break; 51 case UwbUciConstants.REASON_REGULATION_UWB_OFF: 52 rangingChangeReason = RangingChangeReason.SYSTEM_REGULATION; 53 break; 54 } 55 return rangingChangeReason; 56 } 57 convertUciStatusToApiReasonCode(int status)58 public static int convertUciStatusToApiReasonCode(int status) { 59 /* set default */ 60 int rangingChangeReason = RangingChangeReason.UNKNOWN; 61 switch (status) { 62 case UwbUciConstants.STATUS_CODE_OK: 63 rangingChangeReason = RangingChangeReason.LOCAL_API; 64 break; 65 case UwbUciConstants.STATUS_CODE_ERROR_MAX_SESSIONS_EXCEEDED: 66 rangingChangeReason = RangingChangeReason.MAX_SESSIONS_REACHED; 67 break; 68 case UwbUciConstants.STATUS_CODE_INVALID_PARAM: 69 case UwbUciConstants.STATUS_CODE_INVALID_RANGE: 70 case UwbUciConstants.STATUS_CODE_INVALID_MESSAGE_SIZE: 71 rangingChangeReason = RangingChangeReason.BAD_PARAMETERS; 72 break; 73 case UwbUciConstants.STATUS_CODE_ERROR_SESSION_NOT_EXIST: 74 case UwbUciConstants.STATUS_CODE_CCC_LIFECYCLE: 75 case UwbUciConstants.STATUS_CODE_CCC_SE_BUSY: 76 rangingChangeReason = RangingChangeReason.PROTOCOL_SPECIFIC; 77 break; 78 case UwbUciConstants.REASON_ERROR_INSUFFICIENT_SLOTS_PER_RR: 79 rangingChangeReason = RangingChangeReason.INSUFFICIENT_SLOTS_PER_RR; 80 break; 81 } 82 return rangingChangeReason; 83 } 84 convertUciStatusToApiCccProtocolError(int status)85 private static @CccParams.ProtocolError int convertUciStatusToApiCccProtocolError(int status) { 86 switch (status) { 87 case UwbUciConstants.STATUS_CODE_ERROR_SESSION_NOT_EXIST: 88 return CccParams.PROTOCOL_ERROR_NOT_FOUND; 89 case UwbUciConstants.STATUS_CODE_CCC_LIFECYCLE: 90 return CccParams.PROTOCOL_ERROR_LIFECYCLE; 91 case UwbUciConstants.STATUS_CODE_CCC_SE_BUSY: 92 return CccParams.PROTOCOL_ERROR_SE_BUSY; 93 default: 94 return CccParams.PROTOCOL_ERROR_UNKNOWN; 95 } 96 } 97 convertUciStatusToParam(String protocolName, int status)98 public static PersistableBundle convertUciStatusToParam(String protocolName, int status) { 99 Params c; 100 if (protocolName.equals(CccParams.PROTOCOL_NAME)) { 101 c = new CccRangingError.Builder() 102 .setError(convertUciStatusToApiCccProtocolError(status)) 103 .build(); 104 } else { 105 c = new FiraStatusCode.Builder().setStatusCode(status).build(); 106 } 107 return c.toBundle(); 108 } 109 getSessionStateString(int state)110 static String getSessionStateString(int state) { 111 String ret = ""; 112 switch (state) { 113 case UwbUciConstants.UWB_SESSION_STATE_INIT: 114 ret = "INIT"; 115 break; 116 case UwbUciConstants.UWB_SESSION_STATE_DEINIT: 117 ret = "DEINIT"; 118 break; 119 case UwbUciConstants.UWB_SESSION_STATE_ACTIVE: 120 ret = "ACTIVE"; 121 break; 122 case UwbUciConstants.UWB_SESSION_STATE_IDLE: 123 ret = "IDLE"; 124 break; 125 case UwbUciConstants.UWB_SESSION_STATE_ERROR: 126 ret = "ERROR"; 127 break; 128 } 129 return ret; 130 } 131 } 132