14f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim/*
24f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * Copyright (C) 2014 The Android Open Source Project
34f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim *
44f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * Licensed under the Apache License, Version 2.0 (the "License");
54f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * you may not use this file except in compliance with the License.
64f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * You may obtain a copy of the License at
74f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim *
84f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim *      http://www.apache.org/licenses/LICENSE-2.0
94f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim *
104f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * Unless required by applicable law or agreed to in writing, software
114f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * distributed under the License is distributed on an "AS IS" BASIS,
124f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * See the License for the specific language governing permissions and
144f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * limitations under the License.
154f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim */
164f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
17c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kimpackage com.android.server.hdmi;
184f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
19c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kimimport libcore.util.EmptyArray;
20c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim
214f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kimimport java.util.Arrays;
224f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
234f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim/**
244f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * A class to encapsulate HDMI-CEC message used for the devices connected via
254f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * HDMI cable to communicate with one another. A message is defined by its
264f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim * source and destination address, command (or opcode), and optional parameters.
274f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim */
288e93c84739902f5adaa499b474f39e3c4807bc1cJungshik Jangpublic final class HdmiCecMessage {
29c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim    public static final byte[] EMPTY_PARAM = EmptyArray.BYTE;
30c70d2295dd3fb87ce8c81c704688d1ad05043b4dJinsuk Kim
314f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    private final int mSource;
324f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    private final int mDestination;
334f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
344f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    private final int mOpcode;
354f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    private final byte[] mParams;
364f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
374f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    /**
384f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * Constructor.
394f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     */
404f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    public HdmiCecMessage(int source, int destination, int opcode, byte[] params) {
414f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        mSource = source;
424f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        mDestination = destination;
43a8fd44b74b8822426cdc0e45351899c95bf30e16Jinsuk Kim        mOpcode = opcode & 0xFF;
444f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        mParams = Arrays.copyOf(params, params.length);
454f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    }
464f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
474f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    /**
484f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * Return the source address field of the message. It is the logical address
494f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * of the device which generated the message.
504f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     *
514f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * @return source address
524f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     */
534f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    public int getSource() {
544f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        return mSource;
554f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    }
564f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
574f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    /**
584f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * Return the destination address field of the message. It is the logical address
594f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * of the device to which the message is sent.
604f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     *
614f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * @return destination address
624f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     */
634f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    public int getDestination() {
644f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        return mDestination;
654f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    }
664f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
674f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    /**
684f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * Return the opcode field of the message. It is the type of the message that
694f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * tells the destination device what to do.
704f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     *
714f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * @return opcode
724f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     */
734f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    public int getOpcode() {
744f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        return mOpcode;
754f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    }
764f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
774f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    /**
784f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * Return the parameter field of the message. The contents of parameter varies
794f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * from opcode to opcode, and is used together with opcode to describe
804f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * the action for the destination device to take.
814f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     *
824f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     * @return parameter
834f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim     */
844f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    public byte[] getParams() {
854f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        return mParams;
864f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    }
874f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
884f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    @Override
894f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    public String toString() {
904f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        StringBuffer s = new StringBuffer();
9161ced38d61926bc28638d805436086db22b642c3Yuncheol Heo        s.append(String.format("<%s> src: %d, dst: %d",
9261ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                opcodeToString(mOpcode), mSource, mDestination));
9361ced38d61926bc28638d805436086db22b642c3Yuncheol Heo        if (mParams.length > 0) {
9461ced38d61926bc28638d805436086db22b642c3Yuncheol Heo            s.append(", params:");
9561ced38d61926bc28638d805436086db22b642c3Yuncheol Heo            for (byte data : mParams) {
9661ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                s.append(String.format(" %02X", data));
9761ced38d61926bc28638d805436086db22b642c3Yuncheol Heo            }
984f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        }
994f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim        return s.toString();
1004f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim    }
10161ced38d61926bc28638d805436086db22b642c3Yuncheol Heo
10261ced38d61926bc28638d805436086db22b642c3Yuncheol Heo    private static String opcodeToString(int opcode) {
10361ced38d61926bc28638d805436086db22b642c3Yuncheol Heo        switch (opcode) {
104c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            case Constants.MESSAGE_FEATURE_ABORT:
10561ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                return "Feature Abort";
106c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_IMAGE_VIEW_ON:
107c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Image View On";
108c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_TUNER_STEP_INCREMENT:
109c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Tuner Step Increment";
110c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_TUNER_STEP_DECREMENT:
111c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Tuner Step Decrement";
112c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_TUNER_DEVICE_STATUS:
113c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Tuner Device Staus";
114c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS:
115c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give Tuner Device Status";
116c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_RECORD_ON:
117c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Record On";
118c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_RECORD_STATUS:
119c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Record Status";
120c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_RECORD_OFF:
121c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Record Off";
122c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            case Constants.MESSAGE_TEXT_VIEW_ON:
12361ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                return "Text View On";
124c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_RECORD_TV_SCREEN:
125c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Record Tv Screen";
126c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_DECK_STATUS:
127c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give Deck Status";
128c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_DECK_STATUS:
129c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Deck Status";
130c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_MENU_LANGUAGE:
131c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Menu Language";
132c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_CLEAR_ANALOG_TIMER:
133c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Clear Analog Timer";
134c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_ANALOG_TIMER:
135c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Analog Timer";
136c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_TIMER_STATUS:
137c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Timer Status";
138c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_STANDBY:
139c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Standby";
140c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_PLAY:
141c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Play";
142c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_DECK_CONTROL:
143c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Deck Control";
144c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_TIMER_CLEARED_STATUS:
145c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Timer Cleared Status";
146c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_USER_CONTROL_PRESSED:
147c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "User Control Pressed";
148c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_USER_CONTROL_RELEASED:
149c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "User Control Release";
150c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_OSD_NAME:
151c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give Osd Name";
152c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_OSD_NAME:
153c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Osd Name";
154c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_OSD_STRING:
155c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Osd String";
156c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_TIMER_PROGRAM_TITLE:
157c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Timer Program Title";
158c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST:
159c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "System Audio Mode Request";
160c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_AUDIO_STATUS:
161c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give Audio Status";
162c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE:
163473119fdc36340f833e4b755ae7f50a6914e0a24Jungshik Jang                return "Set System Audio Mode";
164c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REPORT_AUDIO_STATUS:
165c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Report Audio Status";
166c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS:
167c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give System Audio Mode Status";
168c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS:
169c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "System Audio Mode Status";
170c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_ROUTING_CHANGE:
171c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Routing Change";
172c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_ROUTING_INFORMATION:
173c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Routing Information";
174c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            case Constants.MESSAGE_ACTIVE_SOURCE:
17561ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                return "Active Source";
176c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS:
177c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give Physical Address";
178c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS:
179c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Report Physical Address";
180c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE:
181c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Request Active Source";
182c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_STREAM_PATH:
183c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Stream Path";
184c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_DEVICE_VENDOR_ID:
185c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Device Vendor Id";
186c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_VENDOR_COMMAND:
187c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Vendor Commandn";
188c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_DOWN:
189c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Vendor Remote Button Down";
190c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_UP:
191c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Vendor Remote Button Up";
192c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
193c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Give Device Vendor Id";
194c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_MENU_REQUEST:
195c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Menu REquest";
196c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_MENU_STATUS:
197c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Menu Status";
198c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            case Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS:
19961ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                return "Give Device Power Status";
200c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REPORT_POWER_STATUS:
201c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Report Power Status";
202c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GET_MENU_LANGUAGE:
203c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Get Menu Language";
204c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SELECT_ANALOG_SERVICE:
205c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Select Analog Service";
206c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SELECT_DIGITAL_SERVICE:
207c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Select Digital Service";
208c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_DIGITAL_TIMER:
209c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Digital Timer";
210c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_CLEAR_DIGITAL_TIMER:
211c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Clear Digital Timer";
212c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_AUDIO_RATE:
213c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set Audio Rate";
214c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_INACTIVE_SOURCE:
215c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "InActive Source";
216c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_CEC_VERSION:
217c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Cec Version";
218c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_GET_CEC_VERSION:
219c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Get Cec Version";
220119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            case Constants.MESSAGE_VENDOR_COMMAND_WITH_ID:
221c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Vendor Command With Id";
222c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_CLEAR_EXTERNAL_TIMER:
223c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Clear External Timer";
224c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_SET_EXTERNAL_TIMER:
225c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Set External Timer";
226c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR:
227c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Repot Short Audio Descriptor";
228c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR:
229c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Request Short Audio Descriptor";
230c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_INITIATE_ARC:
231c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Initiate ARC";
232c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REPORT_ARC_INITIATED:
233c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Report ARC Initiated";
234c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REPORT_ARC_TERMINATED:
235c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Report ARC Terminated";
236c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REQUEST_ARC_INITIATION:
237c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Request ARC Initiation";
238c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_REQUEST_ARC_TERMINATION:
239c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Request ARC Termination";
240c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_TERMINATE_ARC:
241c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Terminate ARC";
242c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_CDC_MESSAGE:
243c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Cdc Message";
244c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang            case Constants.MESSAGE_ABORT:
245c94ac5cffc982898bc4f7a5d97d8fad5520ff444Jungshik Jang                return "Abort";
24661ced38d61926bc28638d805436086db22b642c3Yuncheol Heo            default:
24761ced38d61926bc28638d805436086db22b642c3Yuncheol Heo                return String.format("Opcode: %02X", opcode);
24861ced38d61926bc28638d805436086db22b642c3Yuncheol Heo        }
24961ced38d61926bc28638d805436086db22b642c3Yuncheol Heo    }
2504f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim}
2514f512fb451c8ddcea852645c5c24314c20c0974bJinsuk Kim
252