1/*
2 * Copyright (C) 2014 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
17package com.android.server.hdmi;
18
19import libcore.util.EmptyArray;
20
21import java.util.Arrays;
22
23/**
24 * A class to encapsulate HDMI-CEC message used for the devices connected via
25 * HDMI cable to communicate with one another. A message is defined by its
26 * source and destination address, command (or opcode), and optional parameters.
27 */
28public final class HdmiCecMessage {
29    public static final byte[] EMPTY_PARAM = EmptyArray.BYTE;
30
31    private final int mSource;
32    private final int mDestination;
33
34    private final int mOpcode;
35    private final byte[] mParams;
36
37    /**
38     * Constructor.
39     */
40    public HdmiCecMessage(int source, int destination, int opcode, byte[] params) {
41        mSource = source;
42        mDestination = destination;
43        mOpcode = opcode & 0xFF;
44        mParams = Arrays.copyOf(params, params.length);
45    }
46
47    /**
48     * Return the source address field of the message. It is the logical address
49     * of the device which generated the message.
50     *
51     * @return source address
52     */
53    public int getSource() {
54        return mSource;
55    }
56
57    /**
58     * Return the destination address field of the message. It is the logical address
59     * of the device to which the message is sent.
60     *
61     * @return destination address
62     */
63    public int getDestination() {
64        return mDestination;
65    }
66
67    /**
68     * Return the opcode field of the message. It is the type of the message that
69     * tells the destination device what to do.
70     *
71     * @return opcode
72     */
73    public int getOpcode() {
74        return mOpcode;
75    }
76
77    /**
78     * Return the parameter field of the message. The contents of parameter varies
79     * from opcode to opcode, and is used together with opcode to describe
80     * the action for the destination device to take.
81     *
82     * @return parameter
83     */
84    public byte[] getParams() {
85        return mParams;
86    }
87
88    @Override
89    public String toString() {
90        StringBuffer s = new StringBuffer();
91        s.append(String.format("<%s> src: %d, dst: %d",
92                opcodeToString(mOpcode), mSource, mDestination));
93        if (mParams.length > 0) {
94            s.append(", params:");
95            for (byte data : mParams) {
96                s.append(String.format(" %02X", data));
97            }
98        }
99        return s.toString();
100    }
101
102    private static String opcodeToString(int opcode) {
103        switch (opcode) {
104            case Constants.MESSAGE_FEATURE_ABORT:
105                return "Feature Abort";
106            case Constants.MESSAGE_IMAGE_VIEW_ON:
107                return "Image View On";
108            case Constants.MESSAGE_TUNER_STEP_INCREMENT:
109                return "Tuner Step Increment";
110            case Constants.MESSAGE_TUNER_STEP_DECREMENT:
111                return "Tuner Step Decrement";
112            case Constants.MESSAGE_TUNER_DEVICE_STATUS:
113                return "Tuner Device Staus";
114            case Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS:
115                return "Give Tuner Device Status";
116            case Constants.MESSAGE_RECORD_ON:
117                return "Record On";
118            case Constants.MESSAGE_RECORD_STATUS:
119                return "Record Status";
120            case Constants.MESSAGE_RECORD_OFF:
121                return "Record Off";
122            case Constants.MESSAGE_TEXT_VIEW_ON:
123                return "Text View On";
124            case Constants.MESSAGE_RECORD_TV_SCREEN:
125                return "Record Tv Screen";
126            case Constants.MESSAGE_GIVE_DECK_STATUS:
127                return "Give Deck Status";
128            case Constants.MESSAGE_DECK_STATUS:
129                return "Deck Status";
130            case Constants.MESSAGE_SET_MENU_LANGUAGE:
131                return "Set Menu Language";
132            case Constants.MESSAGE_CLEAR_ANALOG_TIMER:
133                return "Clear Analog Timer";
134            case Constants.MESSAGE_SET_ANALOG_TIMER:
135                return "Set Analog Timer";
136            case Constants.MESSAGE_TIMER_STATUS:
137                return "Timer Status";
138            case Constants.MESSAGE_STANDBY:
139                return "Standby";
140            case Constants.MESSAGE_PLAY:
141                return "Play";
142            case Constants.MESSAGE_DECK_CONTROL:
143                return "Deck Control";
144            case Constants.MESSAGE_TIMER_CLEARED_STATUS:
145                return "Timer Cleared Status";
146            case Constants.MESSAGE_USER_CONTROL_PRESSED:
147                return "User Control Pressed";
148            case Constants.MESSAGE_USER_CONTROL_RELEASED:
149                return "User Control Release";
150            case Constants.MESSAGE_GIVE_OSD_NAME:
151                return "Give Osd Name";
152            case Constants.MESSAGE_SET_OSD_NAME:
153                return "Set Osd Name";
154            case Constants.MESSAGE_SET_OSD_STRING:
155                return "Set Osd String";
156            case Constants.MESSAGE_SET_TIMER_PROGRAM_TITLE:
157                return "Set Timer Program Title";
158            case Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST:
159                return "System Audio Mode Request";
160            case Constants.MESSAGE_GIVE_AUDIO_STATUS:
161                return "Give Audio Status";
162            case Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE:
163                return "Set System Audio Mode";
164            case Constants.MESSAGE_REPORT_AUDIO_STATUS:
165                return "Report Audio Status";
166            case Constants.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS:
167                return "Give System Audio Mode Status";
168            case Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS:
169                return "System Audio Mode Status";
170            case Constants.MESSAGE_ROUTING_CHANGE:
171                return "Routing Change";
172            case Constants.MESSAGE_ROUTING_INFORMATION:
173                return "Routing Information";
174            case Constants.MESSAGE_ACTIVE_SOURCE:
175                return "Active Source";
176            case Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS:
177                return "Give Physical Address";
178            case Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS:
179                return "Report Physical Address";
180            case Constants.MESSAGE_REQUEST_ACTIVE_SOURCE:
181                return "Request Active Source";
182            case Constants.MESSAGE_SET_STREAM_PATH:
183                return "Set Stream Path";
184            case Constants.MESSAGE_DEVICE_VENDOR_ID:
185                return "Device Vendor Id";
186            case Constants.MESSAGE_VENDOR_COMMAND:
187                return "Vendor Commandn";
188            case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_DOWN:
189                return "Vendor Remote Button Down";
190            case Constants.MESSAGE_VENDOR_REMOTE_BUTTON_UP:
191                return "Vendor Remote Button Up";
192            case Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID:
193                return "Give Device Vendor Id";
194            case Constants.MESSAGE_MENU_REQUEST:
195                return "Menu REquest";
196            case Constants.MESSAGE_MENU_STATUS:
197                return "Menu Status";
198            case Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS:
199                return "Give Device Power Status";
200            case Constants.MESSAGE_REPORT_POWER_STATUS:
201                return "Report Power Status";
202            case Constants.MESSAGE_GET_MENU_LANGUAGE:
203                return "Get Menu Language";
204            case Constants.MESSAGE_SELECT_ANALOG_SERVICE:
205                return "Select Analog Service";
206            case Constants.MESSAGE_SELECT_DIGITAL_SERVICE:
207                return "Select Digital Service";
208            case Constants.MESSAGE_SET_DIGITAL_TIMER:
209                return "Set Digital Timer";
210            case Constants.MESSAGE_CLEAR_DIGITAL_TIMER:
211                return "Clear Digital Timer";
212            case Constants.MESSAGE_SET_AUDIO_RATE:
213                return "Set Audio Rate";
214            case Constants.MESSAGE_INACTIVE_SOURCE:
215                return "InActive Source";
216            case Constants.MESSAGE_CEC_VERSION:
217                return "Cec Version";
218            case Constants.MESSAGE_GET_CEC_VERSION:
219                return "Get Cec Version";
220            case Constants.MESSAGE_VENDOR_COMMAND_WITH_ID:
221                return "Vendor Command With Id";
222            case Constants.MESSAGE_CLEAR_EXTERNAL_TIMER:
223                return "Clear External Timer";
224            case Constants.MESSAGE_SET_EXTERNAL_TIMER:
225                return "Set External Timer";
226            case Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR:
227                return "Repot Short Audio Descriptor";
228            case Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR:
229                return "Request Short Audio Descriptor";
230            case Constants.MESSAGE_INITIATE_ARC:
231                return "Initiate ARC";
232            case Constants.MESSAGE_REPORT_ARC_INITIATED:
233                return "Report ARC Initiated";
234            case Constants.MESSAGE_REPORT_ARC_TERMINATED:
235                return "Report ARC Terminated";
236            case Constants.MESSAGE_REQUEST_ARC_INITIATION:
237                return "Request ARC Initiation";
238            case Constants.MESSAGE_REQUEST_ARC_TERMINATION:
239                return "Request ARC Termination";
240            case Constants.MESSAGE_TERMINATE_ARC:
241                return "Terminate ARC";
242            case Constants.MESSAGE_CDC_MESSAGE:
243                return "Cdc Message";
244            case Constants.MESSAGE_ABORT:
245                return "Abort";
246            default:
247                return String.format("Opcode: %02X", opcode);
248        }
249    }
250}
251
252