HdmiCecMessageBuilder.java revision 187d01765b935d07936f74343b4f4af590c239a1
1a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang/*
2a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * Copyright (C) 2014 The Android Open Source Project
3a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang *
4a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * Licensed under the Apache License, Version 2.0 (the "License");
5a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * you may not use this file except in compliance with the License.
6a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * You may obtain a copy of the License at
7a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang *
8a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang *      http://www.apache.org/licenses/LICENSE-2.0
9a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang *
10a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * Unless required by applicable law or agreed to in writing, software
11a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * distributed under the License is distributed on an "AS IS" BASIS,
12a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * See the License for the specific language governing permissions and
14a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * limitations under the License.
15a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang */
16a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
17a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jangpackage com.android.server.hdmi;
18a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
19a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jangimport android.hardware.hdmi.HdmiCec;
20a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jangimport android.hardware.hdmi.HdmiCecMessage;
21a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
22a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jangimport java.io.UnsupportedEncodingException;
234085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jangimport java.util.Arrays;
24a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
25a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang/**
26a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * A helper class to build {@link HdmiCecMessage} from various cec commands.
27a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang */
28a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jangpublic class HdmiCecMessageBuilder {
29a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private static final int OSD_NAME_MAX_LENGTH = 13;
30a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
31a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private HdmiCecMessageBuilder() {}
32a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
33a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
344085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * Build {@link HdmiCecMessage} from raw data.
354085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     *
364085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @param src source address of command
374085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @param dest destination address of command
384085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @param body body of message. It includes opcode.
394085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @return newly created {@link HdmiCecMessage}
404085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     */
414085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang    static HdmiCecMessage of(int src, int dest, byte[] body) {
424085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang        byte opcode = body[0];
434085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang        byte params[] = Arrays.copyOfRange(body, 1, body.length);
444085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang        return new HdmiCecMessage(src, dest, opcode, params);
454085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang    }
464085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang
474085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang    /**
48a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build <Feature Abort> command. <Feature Abort> consists of
49a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * 1 byte original opcode and 1 byte reason fields with basic fields.
50a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
51a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
52a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
53a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param originalOpcode original opcode causing feature abort
54a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param reason reason of feature abort
55a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
56a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
57a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildFeatureAbortCommand(int src, int dest, int originalOpcode,
58a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            int reason) {
59a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
60a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) originalOpcode,
61a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) reason,
62a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
63a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_FEATURE_ABORT, params);
64a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
65a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
66a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
67cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * Build <Give Physical Address> command.
68cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     *
69cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * @param src source address of command
70cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * @param dest destination address of command
71cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * @return newly created {@link HdmiCecMessage}
72cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     */
73cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang    static HdmiCecMessage buildGivePhysicalAddress(int src, int dest) {
74cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_GIVE_PHYSICAL_ADDRESS);
75cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang    }
76cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang
77cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang    /**
78be9cd8eb3fe64a572f9c7dfc41f04defd46a752dJungshik Jang     * Build <Give Osd Name> command.
79a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
80a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
81a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
82a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
83a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
84be9cd8eb3fe64a572f9c7dfc41f04defd46a752dJungshik Jang    static HdmiCecMessage buildGiveOsdNameCommand(int src, int dest) {
85be9cd8eb3fe64a572f9c7dfc41f04defd46a752dJungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_GIVE_OSD_NAME);
86a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
87a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
88a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
89a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build <Give Vendor Id Command> command.
90a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
91a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
92a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
93a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
94a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
95a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildGiveDeviceVendorIdCommand(int src, int dest) {
96a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_GIVE_DEVICE_VENDOR_ID);
97a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
98a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
99a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
100a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build <Set Menu Language > command.
101a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
102a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * <p>This is a broadcast message sent to all devices on the bus.
103a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
104a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
105a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param language 3-letter ISO639-2 based language code
106a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage} if language is valid.
107a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *         Otherwise, return null
108a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
109a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildSetMenuLanguageCommand(int src, String language) {
110a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        if (language.length() != 3) {
111a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            return null;
112a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        }
113a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // Hdmi CEC uses lower-cased ISO 639-2 (3 letters code).
114a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        String normalized = language.toLowerCase();
115a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
116a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) normalized.charAt(0),
117a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) normalized.charAt(1),
118a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) normalized.charAt(2),
119a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
120a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // <Set Menu Language> is broadcast message.
121a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, HdmiCec.ADDR_BROADCAST, HdmiCec.MESSAGE_SET_MENU_LANGUAGE,
122a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                params);
123a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
124a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
125a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
126a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Set Osd Name &gt; command.
127a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
128a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
129a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param name display (OSD) name of device
130a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage} if valid name. Otherwise,
131a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *         return null
132a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
133a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildSetOsdNameCommand(int src, int dest, String name) {
134a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        int length = Math.min(name.length(), OSD_NAME_MAX_LENGTH);
135a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params;
136a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        try {
137a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            params = name.substring(0, length).getBytes("US-ASCII");
138a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        } catch (UnsupportedEncodingException e) {
139a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            return null;
140a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        }
141a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_SET_OSD_NAME, params);
142a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
143a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
144a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
145a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Report Physical Address&gt; command. It has two bytes physical
146a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * address and one byte device type as parameter.
147a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
148a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * <p>This is a broadcast message sent to all devices on the bus.
149a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
150a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
151a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param address physical address of device
152a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param deviceType type of device
153a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
154a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
155a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildReportPhysicalAddressCommand(int src, int address, int deviceType) {
156a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
157a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                // Two bytes for physical address
158a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) ((address >> 8) & 0xFF),
159a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) (address & 0xFF),
160a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                // One byte device type
161a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) deviceType
162a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
163a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // <Report Physical Address> is broadcast message.
164a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, HdmiCec.ADDR_BROADCAST, HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS,
165a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                params);
166a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
167a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
168a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
169a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Device Vendor Id&gt; command. It has three bytes vendor id as
170a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * parameter.
171a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
172a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * <p>This is a broadcast message sent to all devices on the bus.
173a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
174a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
175a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param vendorId device's vendor id
176a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
177a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
178a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildDeviceVendorIdCommand(int src, int vendorId) {
179a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
180a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) ((vendorId >> 16) & 0xFF),
181a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) ((vendorId >> 8) & 0xFF),
182a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) (vendorId & 0xFF)
183a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
184a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // <Device Vendor Id> is broadcast message.
185a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, HdmiCec.ADDR_BROADCAST, HdmiCec.MESSAGE_DEVICE_VENDOR_ID,
186a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                params);
187a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
188a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
189a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
190a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Device Vendor Id&gt; command. It has one byte cec version as parameter.
191a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
192a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
193a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
194a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param version version of cec. Use 0x04 for "Version 1.3a" and 0x05 for
195a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *                "Version 1.4 or 1.4a or 1.4b
196a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
197a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
198a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildCecVersion(int src, int dest, int version) {
199a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
200a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) version
201a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
202a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_CEC_VERSION, params);
203a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
204a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
205a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
20667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Request Arc Initiation&gt;
20767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
20867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
20967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
21067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
21167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
21267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildRequestArcInitiation(int src, int dest) {
21367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_REQUEST_ARC_INITIATION);
21467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
21567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
21667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
21767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Request Arc Termination&gt;
21867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
21967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
22067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
22167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
22267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
22367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildRequestArcTermination(int src, int dest) {
22467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_REQUEST_ARC_TERMINATION);
22567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
22667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
22767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
22867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Report Arc Initiated&gt;
22967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
23067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
23167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
23267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
23367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
23467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildReportArcInitiated(int src, int dest) {
23567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_REPORT_ARC_INITIATED);
23667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
23767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
23867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
23967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Report Arc Terminated&gt;
24067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
24167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
24267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
24367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
24467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
24567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildReportArcTerminated(int src, int dest) {
24667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_REPORT_ARC_TERMINATED);
24767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
24867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
24967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
25078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * Build &lt;Text View On&gt; command.
25178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     *
25278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param src source address of command
25378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param dest destination address of command
25478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @return newly created {@link HdmiCecMessage}
25578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     */
25678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    static HdmiCecMessage buildTextViewOn(int src, int dest) {
25778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        return buildCommand(src, dest, HdmiCec.MESSAGE_TEXT_VIEW_ON);
25878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
25978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
26078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    /**
26178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * Build &lt;Active Source&gt; command.
26278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     *
26378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param src source address of command
26478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param physicalAddress physical address of the device to become active
26578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @return newly created {@link HdmiCecMessage}
26678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     */
26778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    static HdmiCecMessage buildActiveSource(int src, int physicalAddress) {
26878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        return buildCommand(src, HdmiCec.ADDR_BROADCAST, HdmiCec.MESSAGE_ACTIVE_SOURCE,
26978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                physicalAddressToParam(physicalAddress));
27078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
27178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
27278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    /**
273a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * Build &lt;Set Stream Path&gt; command.
274a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
275a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * <p>This is a broadcast message sent to all devices on the bus.
276a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
277a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param src source address of command
278a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param streamPath physical address of the device to start streaming
279a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @return newly created {@link HdmiCecMessage}
280a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     */
281a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    static HdmiCecMessage buildSetStreamPath(int src, int streamPath) {
282a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim        return buildCommand(src, HdmiCec.ADDR_BROADCAST, HdmiCec.MESSAGE_SET_STREAM_PATH,
283a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim                physicalAddressToParam(streamPath));
284a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    }
285a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim
286a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    /**
287a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * Build &lt;Routing Change&gt; command.
288a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
289a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * <p>This is a broadcast message sent to all devices on the bus.
290a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
291a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param src source address of command
292a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param oldPath physical address of the currently active routing path
293a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param newPath physical address of the new active routing path
294a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @return newly created {@link HdmiCecMessage}
295a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     */
296a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    static HdmiCecMessage buildRoutingChange(int src, int oldPath, int newPath) {
297a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim        byte[] param = new byte[] {
298a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim            (byte) ((oldPath >> 8) & 0xFF), (byte) (oldPath & 0xFF),
299a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim            (byte) ((newPath >> 8) & 0xFF), (byte) (newPath & 0xFF)
300a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim        };
301a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim        return buildCommand(src, HdmiCec.ADDR_BROADCAST, HdmiCec.MESSAGE_ROUTING_CHANGE, param);
302a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    }
303a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim
304a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    /**
30578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * Build &lt;Give Device Power Status&gt; command.
30678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     *
30778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param src source address of command
30878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param dest destination address of command
30978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @return newly created {@link HdmiCecMessage}
31078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     */
31178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    static HdmiCecMessage buildGiveDevicePowerStatus(int src, int dest) {
31278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        return buildCommand(src, dest, HdmiCec.MESSAGE_GIVE_DEVICE_POWER_STATUS);
31378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
31478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
31578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    /**
31663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;System Audio Mode Request&gt; command.
31763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
31863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
31963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param avr destination address of command, it should be AVR
32063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param avrPhysicalAddress physical address of AVR
32163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param enableSystemAudio whether to enable System Audio Mode or not
32263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
32363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
32463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildSystemAudioModeRequest(int src, int avr, int avrPhysicalAddress,
32563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo            boolean enableSystemAudio) {
32663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        if (enableSystemAudio) {
32763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo            return buildCommand(src, avr, HdmiCec.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST,
32863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                    physicalAddressToParam(avrPhysicalAddress));
32963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        } else {
33063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo            return buildCommand(src, avr, HdmiCec.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST);
33163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        }
33263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
33363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
33463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
33563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;Give Audio Status&gt; command.
33663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
33763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
33863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param dest destination address of command
33963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
34063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
34163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildGiveAudioStatus(int src, int dest) {
34263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        return buildCommand(src, dest, HdmiCec.MESSAGE_GIVE_AUDIO_STATUS);
34363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
34463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
34563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
34663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;User Control Pressed&gt; command.
34763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
34863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
34963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param dest destination address of command
35063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param uiCommand keycode that user pressed
35163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
35263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
35363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildUserControlPressed(int src, int dest, int uiCommand) {
354cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim        return buildUserControlPressed(src, dest, new byte[] { (byte) uiCommand });
355cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim    }
356cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim
357cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim    /**
358cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * Build &lt;User Control Pressed&gt; command.
359cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     *
360cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @param src source address of command
361cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @param dest destination address of command
362cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @param commandParam uiCommand and the additional parameter
363cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @return newly created {@link HdmiCecMessage}
364cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     */
365cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim    static HdmiCecMessage buildUserControlPressed(int src, int dest, byte[] commandParam) {
366cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim        return buildCommand(src, dest, HdmiCec.MESSAGE_USER_CONTROL_PRESSED, commandParam);
36763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
36863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
36963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
37063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;User Control Released&gt; command.
37163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
37263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
37363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param dest destination address of command
37463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
37563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
37663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildUserControlReleased(int src, int dest) {
37763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        return buildCommand(src, dest, HdmiCec.MESSAGE_USER_CONTROL_RELEASED);
37863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
37963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
380187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang    /**
381187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * Build &lt;Give System Audio Mode Status&gt; command.
382187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     *
383187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * @param src source address of command
384187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * @param dest destination address of command
385187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * @return newly created {@link HdmiCecMessage}
386187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     */
387187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang    static HdmiCecMessage buildGiveSystemAudioModeStatus(int src, int dest) {
388187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang        return buildCommand(src, dest, HdmiCec.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS);
389187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang    }
390187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang
39163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /***** Please ADD new buildXXX() methods above. ******/
39263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
39363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
394a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build a {@link HdmiCecMessage} without extra parameter.
395a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
396a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
397a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
398a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param opcode opcode for a message
399a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
400a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
401a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private static HdmiCecMessage buildCommand(int src, int dest, int opcode) {
402a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return new HdmiCecMessage(src, dest, opcode, HdmiCecMessage.EMPTY_PARAM);
403a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
404a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
405a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
406a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build a {@link HdmiCecMessage} with given values.
407a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
408a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
409a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
410a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param opcode opcode for a message
411a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param params extra parameters for command
412a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
413a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
414a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private static HdmiCecMessage buildCommand(int src, int dest, int opcode, byte[] params) {
415a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return new HdmiCecMessage(src, dest, opcode, params);
416a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
41778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
41878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    private static byte[] physicalAddressToParam(int physicalAddress) {
41978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        return new byte[] {
42078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                (byte) (physicalAddress >> 8),
42178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                (byte) (physicalAddress & 0xFF)
42278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        };
42378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
424a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang}
425