blob: fd0ff9d22bf860955c3f9681bbbcacb47f13b655 [file] [log] [blame]
Jinsuk Kim4f512fb2014-02-28 17:41:17 +09001/*
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
Jinsuk Kimc0c20d02014-07-04 14:34:31 +090017package com.android.server.hdmi;
Jinsuk Kim4f512fb2014-02-28 17:41:17 +090018
Jinsuk Kimc70d2292014-04-30 15:43:16 +090019import libcore.util.EmptyArray;
20
Jinsuk Kim4f512fb2014-02-28 17:41:17 +090021import 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 */
Jungshik Jang8e93c842014-08-06 15:48:33 +090028public final class HdmiCecMessage {
Jinsuk Kimc70d2292014-04-30 15:43:16 +090029 public static final byte[] EMPTY_PARAM = EmptyArray.BYTE;
30
Jinsuk Kim4f512fb2014-02-28 17:41:17 +090031 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;
Jinsuk Kima8fd44b2014-05-28 17:42:56 +090043 mOpcode = opcode & 0xFF;
Jinsuk Kim4f512fb2014-02-28 17:41:17 +090044 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
Jinsuk Kim4f512fb2014-02-28 17:41:17 +090088 @Override
89 public String toString() {
90 StringBuffer s = new StringBuffer();
Yuncheol Heo61ced382014-05-23 20:10:19 +090091 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 }
Jinsuk Kim4f512fb2014-02-28 17:41:17 +090098 }
99 return s.toString();
100 }
Yuncheol Heo61ced382014-05-23 20:10:19 +0900101
102 private static String opcodeToString(int opcode) {
103 switch (opcode) {
Jinsuk Kimc0c20d02014-07-04 14:34:31 +0900104 case Constants.MESSAGE_FEATURE_ABORT:
Yuncheol Heo61ced382014-05-23 20:10:19 +0900105 return "Feature Abort";
Jungshik Jangc94ac5c2014-08-27 13:48:37 +0900106 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:
Jungshik Jang473119f2014-08-27 16:43:22 +0900163 return "Set System Audio Mode";
Jungshik Jangc94ac5c2014-08-27 13:48:37 +0900164 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";
Jinsuk Kimc0c20d02014-07-04 14:34:31 +0900216 case Constants.MESSAGE_CEC_VERSION:
Jungshik Jangc94ac5c2014-08-27 13:48:37 +0900217 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";
Jinsuk Kimc0c20d02014-07-04 14:34:31 +0900232 case Constants.MESSAGE_REPORT_ARC_INITIATED:
Yuncheol Heo61ced382014-05-23 20:10:19 +0900233 return "Report ARC Initiated";
Jinsuk Kimc0c20d02014-07-04 14:34:31 +0900234 case Constants.MESSAGE_REPORT_ARC_TERMINATED:
Yuncheol Heo61ced382014-05-23 20:10:19 +0900235 return "Report ARC Terminated";
Jungshik Jangc94ac5c2014-08-27 13:48:37 +0900236 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";
Yuncheol Heo61ced382014-05-23 20:10:19 +0900246 default:
247 return String.format("Opcode: %02X", opcode);
248 }
249 }
Jinsuk Kim4f512fb2014-02-28 17:41:17 +0900250}
251