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