1371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann/* 2371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * Copyright (C) 2018 The Android Open Source Project 3371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * 4371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License"); 5371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * you may not use this file except in compliance with the License. 6371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * You may obtain a copy of the License at 7371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * 8371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * http://www.apache.org/licenses/LICENSE-2.0 9371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * 10371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software 11371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS, 12371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * See the License for the specific language governing permissions and 14371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann * limitations under the License. 15371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann */ 16371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 17371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannpackage com.android.internal.usb; 18371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 19371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static android.hardware.usb.UsbPort.MODE_AUDIO_ACCESSORY; 20371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static android.hardware.usb.UsbPort.MODE_DEBUG_ACCESSORY; 21371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static android.hardware.usb.UsbPort.MODE_DFP; 22371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static android.hardware.usb.UsbPort.MODE_DUAL; 23371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static android.hardware.usb.UsbPort.MODE_NONE; 24371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static android.hardware.usb.UsbPort.MODE_UFP; 25371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 26371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull; 27371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 28371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.annotation.NonNull; 29371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbAccessory; 30371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbConfiguration; 31371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbDevice; 32371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbEndpoint; 33371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbInterface; 34371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbPort; 35371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.UsbPortStatus; 36371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.hardware.usb.V1_0.Constants; 37371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbAccessoryProto; 38371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbConfigurationProto; 39371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbDeviceProto; 40371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbEndPointProto; 41371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbInterfaceProto; 42371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbPortProto; 43371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbPortStatusProto; 44371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport android.service.usb.UsbPortStatusRoleCombinationProto; 45371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 46371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport com.android.internal.util.dump.DualDumpOutputStream; 47371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 48371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann/** Dump methods for public USB classes */ 49371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannpublic class DumpUtils { 50371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann public static void writeAccessory(@NonNull DualDumpOutputStream dump, @NonNull String idName, 51371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, @NonNull UsbAccessory accessory) { 52371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 53371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 54371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("manufacturer", UsbAccessoryProto.MANUFACTURER, accessory.getManufacturer()); 55371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("model", UsbAccessoryProto.MODEL, accessory.getModel()); 56371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeStringIfNotNull(dump, "description", UsbAccessoryProto.DESCRIPTION, 57371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann accessory.getManufacturer()); 58371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("version", UsbAccessoryProto.VERSION, accessory.getVersion()); 59371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeStringIfNotNull(dump, "uri", UsbAccessoryProto.URI, accessory.getUri()); 60371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("serial", UsbAccessoryProto.SERIAL, accessory.getSerial()); 61371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 62371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 63371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 64371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 65371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann public static void writeDevice(@NonNull DualDumpOutputStream dump, @NonNull String idName, 66371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, @NonNull UsbDevice device) { 67371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 68371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 69371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("name", UsbDeviceProto.NAME, device.getDeviceName()); 70371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("vendor_id", UsbDeviceProto.VENDOR_ID, device.getVendorId()); 71371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("product_id", UsbDeviceProto.PRODUCT_ID, device.getProductId()); 72371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("class", UsbDeviceProto.CLASS, device.getDeviceClass()); 73371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("subclass", UsbDeviceProto.SUBCLASS, device.getDeviceSubclass()); 74371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("protocol", UsbDeviceProto.PROTOCOL, device.getDeviceProtocol()); 75371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("manufacturer_name", UsbDeviceProto.MANUFACTURER_NAME, 76371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann device.getManufacturerName()); 77371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("product_name", UsbDeviceProto.PRODUCT_NAME, device.getProductName()); 78371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("version", UsbDeviceProto.VERSION, device.getVersion()); 79371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("serial_number", UsbDeviceProto.SERIAL_NUMBER, device.getSerialNumber()); 80371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 81371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int numConfigurations = device.getConfigurationCount(); 82371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann for (int i = 0; i < numConfigurations; i++) { 83371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeConfiguration(dump, "configurations", UsbDeviceProto.CONFIGURATIONS, 84371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann device.getConfiguration(i)); 85371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 86371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 87371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 88371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 89371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 90371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann private static void writeConfiguration(@NonNull DualDumpOutputStream dump, 91371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann @NonNull String idName, long id, @NonNull UsbConfiguration configuration) { 92371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 93371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("id", UsbConfigurationProto.ID, configuration.getId()); 94371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("name", UsbConfigurationProto.NAME, configuration.getName()); 95371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("attributes", UsbConfigurationProto.ATTRIBUTES, configuration.getAttributes()); 96371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("max_power", UsbConfigurationProto.MAX_POWER, configuration.getMaxPower()); 97371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 98371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int numInterfaces = configuration.getInterfaceCount(); 99371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann for (int i = 0; i < numInterfaces; i++) { 100371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeInterface(dump, "interfaces", UsbConfigurationProto.INTERFACES, 101371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann configuration.getInterface(i)); 102371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 103371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 104371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 105371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 106371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann private static void writeInterface(@NonNull DualDumpOutputStream dump, @NonNull String idName, 107371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, @NonNull UsbInterface iface) { 108371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 109371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 110371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("id", UsbInterfaceProto.ID, iface.getId()); 111371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("alternate_settings", UsbInterfaceProto.ALTERNATE_SETTINGS, 112371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann iface.getAlternateSetting()); 113371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("name", UsbInterfaceProto.NAME, iface.getName()); 114371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("class", UsbInterfaceProto.CLASS, iface.getInterfaceClass()); 115371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("subclass", UsbInterfaceProto.SUBCLASS, iface.getInterfaceSubclass()); 116371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("protocol", UsbInterfaceProto.PROTOCOL, iface.getInterfaceProtocol()); 117371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 118371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int numEndpoints = iface.getEndpointCount(); 119371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann for (int i = 0; i < numEndpoints; i++) { 120371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeEndpoint(dump, "endpoints", UsbInterfaceProto.ENDPOINTS, iface.getEndpoint(i)); 121371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 122371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 123371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 124371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 125371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann private static void writeEndpoint(@NonNull DualDumpOutputStream dump, @NonNull String idName, 126371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, @NonNull UsbEndpoint endpoint) { 127371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 128371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 129371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("endpoint_number", UsbEndPointProto.ENDPOINT_NUMBER, 130371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann endpoint.getEndpointNumber()); 131371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("direction", UsbEndPointProto.DIRECTION, endpoint.getDirection()); 132371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("address", UsbEndPointProto.ADDRESS, endpoint.getAddress()); 133371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("type", UsbEndPointProto.TYPE, endpoint.getType()); 134371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("attributes", UsbEndPointProto.ATTRIBUTES, 135371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann endpoint.getAttributes()); 136371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("max_packet_size", UsbEndPointProto.MAX_PACKET_SIZE, 137371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann endpoint.getMaxPacketSize()); 138371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("interval", UsbEndPointProto.INTERVAL, endpoint.getInterval()); 139371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 140371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 141371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 142371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 143371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann public static void writePort(@NonNull DualDumpOutputStream dump, @NonNull String idName, 144371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, @NonNull UsbPort port) { 145371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 146371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 147371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("id", UsbPortProto.ID, port.getId()); 148371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 149371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int mode = port.getSupportedModes(); 150371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if (dump.isProto()) { 151371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if (mode == MODE_NONE) { 152371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_NONE); 153371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else { 154371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if ((mode & MODE_DUAL) == MODE_DUAL) { 155371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_DUAL); 156371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else { 157371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if ((mode & MODE_DFP) == MODE_DFP) { 158371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_DFP); 159371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else if ((mode & MODE_UFP) == MODE_UFP) { 160371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_UFP); 161371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 162371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 163371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 164371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if ((mode & MODE_AUDIO_ACCESSORY) == MODE_AUDIO_ACCESSORY) { 165371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, 166371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann MODE_AUDIO_ACCESSORY); 167371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 168371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 169371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if ((mode & MODE_DEBUG_ACCESSORY) == MODE_DEBUG_ACCESSORY) { 170371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, 171371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann MODE_DEBUG_ACCESSORY); 172371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 173371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 174371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else { 175371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, UsbPort.modeToString(mode)); 176371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 177371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 178371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 179371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 180371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 181371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann private static void writePowerRole(@NonNull DualDumpOutputStream dump, @NonNull String idName, 182371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, int powerRole) { 183371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if (dump.isProto()) { 184371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write(idName, id, powerRole); 185371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else { 186371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write(idName, id, UsbPort.powerRoleToString(powerRole)); 187371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 188371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 189371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 190371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann private static void writeDataRole(@NonNull DualDumpOutputStream dump, @NonNull String idName, 191371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, int dataRole) { 192371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if (dump.isProto()) { 193371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write(idName, id, dataRole); 194371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else { 195371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write(idName, id, UsbPort.dataRoleToString(dataRole)); 196371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 197371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 198371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 199371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 200371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann public static void writePortStatus(@NonNull DualDumpOutputStream dump, @NonNull String idName, 201371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long id, @NonNull UsbPortStatus status) { 202371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long token = dump.start(idName, id); 203371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 204371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("connected", UsbPortStatusProto.CONNECTED, status.isConnected()); 205371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 206371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann if (dump.isProto()) { 207371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("current_mode", UsbPortStatusProto.CURRENT_MODE, status.getCurrentMode()); 208371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } else { 209371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.write("current_mode", UsbPortStatusProto.CURRENT_MODE, 210371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann UsbPort.modeToString(status.getCurrentMode())); 211371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 212371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 213371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writePowerRole(dump, "power_role", UsbPortStatusProto.POWER_ROLE, 214371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann status.getCurrentPowerRole()); 215371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeDataRole(dump, "data_role", UsbPortStatusProto.DATA_ROLE, status.getCurrentDataRole()); 216371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 217371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int undumpedCombinations = status.getSupportedRoleCombinations(); 218371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann while (undumpedCombinations != 0) { 219371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int index = Integer.numberOfTrailingZeros(undumpedCombinations); 220371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann undumpedCombinations &= ~(1 << index); 221371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 222371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int powerRole = (index / Constants.PortDataRole.NUM_DATA_ROLES 223371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann + Constants.PortPowerRole.NONE); 224371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann int dataRole = index % Constants.PortDataRole.NUM_DATA_ROLES; 225371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 226371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann long roleCombinationToken = dump.start("role_combinations", 227371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann UsbPortStatusProto.ROLE_COMBINATIONS); 228371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writePowerRole(dump, "power_role", UsbPortStatusRoleCombinationProto.POWER_ROLE, 229371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann powerRole); 230371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann writeDataRole(dump, "data_role", UsbPortStatusRoleCombinationProto.DATA_ROLE, 231371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dataRole); 232371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(roleCombinationToken); 233371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 234371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann 235371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann dump.end(token); 236371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann } 237371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann} 238