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 java.io.UnsupportedEncodingException;
204085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jangimport java.util.Arrays;
21a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
22a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang/**
23a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang * A helper class to build {@link HdmiCecMessage} from various cec commands.
24a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang */
25a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jangpublic class HdmiCecMessageBuilder {
26a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private static final int OSD_NAME_MAX_LENGTH = 13;
27a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
28a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private HdmiCecMessageBuilder() {}
29a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
30a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
314085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * Build {@link HdmiCecMessage} from raw data.
324085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     *
334085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @param src source address of command
344085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @param dest destination address of command
354085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @param body body of message. It includes opcode.
364085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     * @return newly created {@link HdmiCecMessage}
374085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang     */
384085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang    static HdmiCecMessage of(int src, int dest, byte[] body) {
394085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang        byte opcode = body[0];
404085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang        byte params[] = Arrays.copyOfRange(body, 1, body.length);
414085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang        return new HdmiCecMessage(src, dest, opcode, params);
424085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang    }
434085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang
444085d0ef62554c7e139b82bca0f97161bb159f8cJungshik Jang    /**
45a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build <Feature Abort> command. <Feature Abort> consists of
46a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * 1 byte original opcode and 1 byte reason fields with basic fields.
47a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
48a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
49a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
50a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param originalOpcode original opcode causing feature abort
51a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param reason reason of feature abort
52a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
53a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
54a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildFeatureAbortCommand(int src, int dest, int originalOpcode,
55a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            int reason) {
56a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
57339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (originalOpcode & 0xFF),
58339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (reason & 0xFF),
59a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
60c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_FEATURE_ABORT, params);
61a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
62a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
63a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
64cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * Build <Give Physical Address> command.
65cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     *
66cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * @param src source address of command
67cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * @param dest destination address of command
68cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     * @return newly created {@link HdmiCecMessage}
69cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang     */
70cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang    static HdmiCecMessage buildGivePhysicalAddress(int src, int dest) {
71c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS);
72cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang    }
73cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang
74cc5ef8c918e96516a5c51cc40735a1b8a24d8497Jungshik Jang    /**
75be9cd8eb3fe64a572f9c7dfc41f04defd46a752dJungshik Jang     * Build <Give Osd Name> command.
76a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
77a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
78a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
79a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
80a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
81be9cd8eb3fe64a572f9c7dfc41f04defd46a752dJungshik Jang    static HdmiCecMessage buildGiveOsdNameCommand(int src, int dest) {
82c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_GIVE_OSD_NAME);
83a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
84a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
85a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
86a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build <Give Vendor Id Command> command.
87a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
88a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
89a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
90a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
91a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
92a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildGiveDeviceVendorIdCommand(int src, int dest) {
93c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID);
94a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
95a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
96a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
97a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build <Set Menu Language > command.
98a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
99a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * <p>This is a broadcast message sent to all devices on the bus.
100a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
101a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
102a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param language 3-letter ISO639-2 based language code
103a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage} if language is valid.
104a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *         Otherwise, return null
105a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
106a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildSetMenuLanguageCommand(int src, String language) {
107a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        if (language.length() != 3) {
108a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            return null;
109a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        }
110a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // Hdmi CEC uses lower-cased ISO 639-2 (3 letters code).
111a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        String normalized = language.toLowerCase();
112a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
113339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (normalized.charAt(0) & 0xFF),
114339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (normalized.charAt(1) & 0xFF),
115339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (normalized.charAt(2) & 0xFF),
116a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
117a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // <Set Menu Language> is broadcast message.
118c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, Constants.ADDR_BROADCAST,
119c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                Constants.MESSAGE_SET_MENU_LANGUAGE, params);
120a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
121a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
122a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
123a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Set Osd Name &gt; command.
124a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
125a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
126a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param name display (OSD) name of device
127a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage} if valid name. Otherwise,
128a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *         return null
129a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
130a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildSetOsdNameCommand(int src, int dest, String name) {
131a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        int length = Math.min(name.length(), OSD_NAME_MAX_LENGTH);
132a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params;
133a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        try {
134a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            params = name.substring(0, length).getBytes("US-ASCII");
135a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        } catch (UnsupportedEncodingException e) {
136a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang            return null;
137a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        }
138c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_SET_OSD_NAME, params);
139a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
140a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
141a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
142a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Report Physical Address&gt; command. It has two bytes physical
143a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * address and one byte device type as parameter.
144a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
145a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * <p>This is a broadcast message sent to all devices on the bus.
146a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
147a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
148a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param address physical address of device
149a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param deviceType type of device
150a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
151a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
152a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildReportPhysicalAddressCommand(int src, int address, int deviceType) {
153a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
154a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                // Two bytes for physical address
155a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) ((address >> 8) & 0xFF),
156a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) (address & 0xFF),
157a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                // One byte device type
158339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (deviceType & 0xFF)
159a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
160a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // <Report Physical Address> is broadcast message.
161c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, Constants.ADDR_BROADCAST,
162c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS, params);
163a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
164a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
165a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
166a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Device Vendor Id&gt; command. It has three bytes vendor id as
167a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * parameter.
168a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
169a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * <p>This is a broadcast message sent to all devices on the bus.
170a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
171a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
172a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param vendorId device's vendor id
173a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
174a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
175a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildDeviceVendorIdCommand(int src, int vendorId) {
176a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
177a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) ((vendorId >> 16) & 0xFF),
178a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) ((vendorId >> 8) & 0xFF),
179a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang                (byte) (vendorId & 0xFF)
180a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
181a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        // <Device Vendor Id> is broadcast message.
182c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, Constants.ADDR_BROADCAST,
183c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                Constants.MESSAGE_DEVICE_VENDOR_ID, params);
184a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
185a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
186a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
187a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build &lt;Device Vendor Id&gt; command. It has one byte cec version as parameter.
188a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
189a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
190a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
191a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param version version of cec. Use 0x04 for "Version 1.3a" and 0x05 for
192a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *                "Version 1.4 or 1.4a or 1.4b
193a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
194a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
195a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    static HdmiCecMessage buildCecVersion(int src, int dest, int version) {
196a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        byte[] params = new byte[] {
197339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (version & 0xFF)
198a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        };
199c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_CEC_VERSION, params);
200a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
201a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
202a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
20367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Request Arc Initiation&gt;
20467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
20567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
20667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
20767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
20867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
20967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildRequestArcInitiation(int src, int dest) {
210c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_REQUEST_ARC_INITIATION);
21167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
21267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
21367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
21467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Request Arc Termination&gt;
21567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
21667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
21767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
21867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
21967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
22067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildRequestArcTermination(int src, int dest) {
221c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_REQUEST_ARC_TERMINATION);
22267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
22367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
22467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
22567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Report Arc Initiated&gt;
22667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
22767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
22867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
22967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
23067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
23167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildReportArcInitiated(int src, int dest) {
232c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_REPORT_ARC_INITIATED);
23367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
23467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
23567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
23667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * Build &lt;Report Arc Terminated&gt;
23767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
23867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param src source address of command
23967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param dest destination address of command
24067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @return newly created {@link HdmiCecMessage}
24167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
24267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    static HdmiCecMessage buildReportArcTerminated(int src, int dest) {
243c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_REPORT_ARC_TERMINATED);
24467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
24567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
24667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
24778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * Build &lt;Text View On&gt; command.
24878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     *
24978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param src source address of command
25078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param dest destination address of command
25178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @return newly created {@link HdmiCecMessage}
25278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     */
25378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    static HdmiCecMessage buildTextViewOn(int src, int dest) {
254c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_TEXT_VIEW_ON);
25578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
25678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
25778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    /**
25878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * Build &lt;Active Source&gt; command.
25978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     *
26078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param src source address of command
26178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param physicalAddress physical address of the device to become active
26278d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @return newly created {@link HdmiCecMessage}
26378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     */
26478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    static HdmiCecMessage buildActiveSource(int src, int physicalAddress) {
265c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, Constants.ADDR_BROADCAST, Constants.MESSAGE_ACTIVE_SOURCE,
26678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                physicalAddressToParam(physicalAddress));
26778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
26878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
26978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    /**
27038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * Build &lt;Inactive Source&gt; command.
27138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     *
27238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param src source address of command
27338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param physicalAddress physical address of the device to become inactive
27438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @return newly created {@link HdmiCecMessage}
27538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     */
27638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    static HdmiCecMessage buildInactiveSource(int src, int physicalAddress) {
2774fc1d105fc279bf7df6c876e160672866bdad8e7Jungshik Jang        return buildCommand(src, Constants.ADDR_TV,
278c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                Constants.MESSAGE_INACTIVE_SOURCE, physicalAddressToParam(physicalAddress));
27938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    }
28038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
28138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    /**
282a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * Build &lt;Set Stream Path&gt; command.
283a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
284a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * <p>This is a broadcast message sent to all devices on the bus.
285a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
286a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param src source address of command
287a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param streamPath physical address of the device to start streaming
288a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @return newly created {@link HdmiCecMessage}
289a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     */
290a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    static HdmiCecMessage buildSetStreamPath(int src, int streamPath) {
291c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, Constants.ADDR_BROADCAST,
292c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                Constants.MESSAGE_SET_STREAM_PATH, physicalAddressToParam(streamPath));
293a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    }
294a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim
295a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    /**
296a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * Build &lt;Routing Change&gt; command.
297a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
298a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * <p>This is a broadcast message sent to all devices on the bus.
299a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     *
300a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param src source address of command
301a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param oldPath physical address of the currently active routing path
302a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @param newPath physical address of the new active routing path
303a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     * @return newly created {@link HdmiCecMessage}
304a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim     */
305a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    static HdmiCecMessage buildRoutingChange(int src, int oldPath, int newPath) {
306a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim        byte[] param = new byte[] {
307a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim            (byte) ((oldPath >> 8) & 0xFF), (byte) (oldPath & 0xFF),
308a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim            (byte) ((newPath >> 8) & 0xFF), (byte) (newPath & 0xFF)
309a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim        };
310c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, Constants.ADDR_BROADCAST, Constants.MESSAGE_ROUTING_CHANGE,
311c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim                param);
312a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    }
313a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim
314a6ce7708d6124224399241503fadcafe0c4684d4Jinsuk Kim    /**
31578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * Build &lt;Give Device Power Status&gt; command.
31678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     *
31778d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param src source address of command
31878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @param dest destination address of command
31978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     * @return newly created {@link HdmiCecMessage}
32078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim     */
32178d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    static HdmiCecMessage buildGiveDevicePowerStatus(int src, int dest) {
322c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS);
32378d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
32478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
32578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    /**
32638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * Build &lt;Report Power Status&gt; command.
32738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     *
32838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param src source address of command
32938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param dest destination address of command
33038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param powerStatus power status of the device
33138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @return newly created {@link HdmiCecMessage}
33238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     */
33338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    static HdmiCecMessage buildReportPowerStatus(int src, int dest, int powerStatus) {
33438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo        byte[] param = new byte[] {
335339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (powerStatus & 0xFF)
33638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo        };
337c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_REPORT_POWER_STATUS, param);
33838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    }
33938db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
34038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    /**
3413e1564ee397ef833cba351153029317786f3d6bbTerry Heo     * Build &lt;Report Menu Status&gt; command.
3423e1564ee397ef833cba351153029317786f3d6bbTerry Heo     *
3433e1564ee397ef833cba351153029317786f3d6bbTerry Heo     * @param src source address of command
3443e1564ee397ef833cba351153029317786f3d6bbTerry Heo     * @param dest destination address of command
3453e1564ee397ef833cba351153029317786f3d6bbTerry Heo     * @param menuStatus menu status of the device
3463e1564ee397ef833cba351153029317786f3d6bbTerry Heo     * @return newly created {@link HdmiCecMessage}
3473e1564ee397ef833cba351153029317786f3d6bbTerry Heo     */
3483e1564ee397ef833cba351153029317786f3d6bbTerry Heo    static HdmiCecMessage buildReportMenuStatus(int src, int dest, int menuStatus) {
3493e1564ee397ef833cba351153029317786f3d6bbTerry Heo        byte[] param = new byte[] {
350339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) (menuStatus & 0xFF)
3513e1564ee397ef833cba351153029317786f3d6bbTerry Heo        };
3523e1564ee397ef833cba351153029317786f3d6bbTerry Heo        return buildCommand(src, dest, Constants.MESSAGE_MENU_STATUS, param);
3533e1564ee397ef833cba351153029317786f3d6bbTerry Heo    }
3543e1564ee397ef833cba351153029317786f3d6bbTerry Heo
3553e1564ee397ef833cba351153029317786f3d6bbTerry Heo    /**
35663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;System Audio Mode Request&gt; command.
35763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
35863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
35963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param avr destination address of command, it should be AVR
36063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param avrPhysicalAddress physical address of AVR
36163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param enableSystemAudio whether to enable System Audio Mode or not
36263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
36363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
36463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildSystemAudioModeRequest(int src, int avr, int avrPhysicalAddress,
36563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo            boolean enableSystemAudio) {
36663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        if (enableSystemAudio) {
367c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            return buildCommand(src, avr, Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST,
36863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                    physicalAddressToParam(avrPhysicalAddress));
36963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        } else {
370c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            return buildCommand(src, avr, Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST);
37163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        }
37263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
37363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
37463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
37563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;Give Audio Status&gt; command.
37663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
37763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
37863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param dest destination address of command
37963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
38063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
38163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildGiveAudioStatus(int src, int dest) {
382c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_GIVE_AUDIO_STATUS);
38363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
38463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
38563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
38663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;User Control Pressed&gt; command.
38763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
38863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
38963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param dest destination address of command
39063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param uiCommand keycode that user pressed
39163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
39263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
39363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildUserControlPressed(int src, int dest, int uiCommand) {
394339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang        return buildUserControlPressed(src, dest, new byte[] { (byte) (uiCommand & 0xFF) });
395cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim    }
396cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim
397cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim    /**
398cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * Build &lt;User Control Pressed&gt; command.
399cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     *
400cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @param src source address of command
401cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @param dest destination address of command
402cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @param commandParam uiCommand and the additional parameter
403cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     * @return newly created {@link HdmiCecMessage}
404cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim     */
405cd97baf4d08f9a23797eb6a8eb0d57bba1086becJinsuk Kim    static HdmiCecMessage buildUserControlPressed(int src, int dest, byte[] commandParam) {
406c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_USER_CONTROL_PRESSED, commandParam);
40763a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
40863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
40963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
41063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * Build &lt;User Control Released&gt; command.
41163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     *
41263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param src source address of command
41363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @param dest destination address of command
41463a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     * @return newly created {@link HdmiCecMessage}
41563a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo     */
41663a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    static HdmiCecMessage buildUserControlReleased(int src, int dest) {
417c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_USER_CONTROL_RELEASED);
41863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    }
41963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
420187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang    /**
421187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * Build &lt;Give System Audio Mode Status&gt; command.
422187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     *
423187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * @param src source address of command
424187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * @param dest destination address of command
425187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     * @return newly created {@link HdmiCecMessage}
426187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang     */
427187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang    static HdmiCecMessage buildGiveSystemAudioModeStatus(int src, int dest) {
428c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_GIVE_SYSTEM_AUDIO_MODE_STATUS);
429187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang    }
430187d01765b935d07936f74343b4f4af590c239a1Jungshik Jang
43138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    /**
43238db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * Build &lt;Standby&gt; command.
43338db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     *
43438db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param src source address of command
43538db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @param dest destination address of command
43638db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     * @return newly created {@link HdmiCecMessage}
43738db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo     */
43838db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    public static HdmiCecMessage buildStandby(int src, int dest) {
439c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_STANDBY);
44038db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo    }
44138db629d897e9d7c8e31ce0a7e985981e3e12996Yuncheol Heo
442119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    /**
443119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * Build &lt;Vendor Command&gt; command.
444119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     *
445119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param src source address of command
446119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param dest destination address of command
447119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param params vendor-specific parameters
448119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @return newly created {@link HdmiCecMessage}
449119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     */
450119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    static HdmiCecMessage buildVendorCommand(int src, int dest, byte[] params) {
451119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_VENDOR_COMMAND, params);
452119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
453119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
454119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    /**
455119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * Build &lt;Vendor Command With ID&gt; command.
456119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     *
457119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param src source address of command
458119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param dest destination address of command
459119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param vendorId vendor ID
460119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @param operands vendor-specific parameters
461119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     * @return newly created {@link HdmiCecMessage}
462119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim     */
463119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    static HdmiCecMessage buildVendorCommandWithId(int src, int dest, int vendorId,
464119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim            byte[] operands) {
465119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        byte[] params = new byte[operands.length + 3];  // parameter plus len(vendorId)
466119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        params[0] = (byte) ((vendorId >> 16) & 0xFF);
467119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        params[1] = (byte) ((vendorId >> 8) & 0xFF);
468119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        params[2] = (byte) (vendorId & 0xFF);
469119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        System.arraycopy(operands, 0, params, 3, operands.length);
470119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim        return buildCommand(src, dest, Constants.MESSAGE_VENDOR_COMMAND_WITH_ID, params);
471119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim    }
472119160a68195bcb2f5bdf4a269807e01228eca97Jinsuk Kim
473b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    /**
474b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * Build &lt;Record On&gt; command.
475b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     *
476b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @param src source address of command
477b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @param dest destination address of command
478b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @param params parameter of command
479b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @return newly created {@link HdmiCecMessage}
480b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     */
481b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    static HdmiCecMessage buildRecordOn(int src, int dest, byte[] params) {
482b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_RECORD_ON, params);
483b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    }
484b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang
485b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    /**
486b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * Build &lt;Record Off&gt; command.
487b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     *
488b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @param src source address of command
489b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @param dest destination address of command
490b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     * @return newly created {@link HdmiCecMessage}
491b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang     */
492b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    static HdmiCecMessage buildRecordOff(int src, int dest) {
493b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_RECORD_OFF);
494b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang    }
495b6591b8e5399099dc6b7693e0fc719b613aba89cJungshik Jang
49612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    /**
49712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * Build &lt;Set Digital Timer&gt; command.
49812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     *
49912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param src source address of command
50012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param dest destination address of command
50112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param params byte array of timing information and digital service information to be recorded
50212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @return newly created {@link HdmiCecMessage}
50312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     */
50412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    static HdmiCecMessage buildSetDigitalTimer(int src, int dest, byte[] params) {
50512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_SET_DIGITAL_TIMER, params);
50612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    }
50712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
50812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    /**
50912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * Build &lt;Set Analogue Timer&gt; command.
51012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     *
51112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param src source address of command
51212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param dest destination address of command
51312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param params byte array of timing information and analog service information to be recorded
51412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @return newly created {@link HdmiCecMessage}
51512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     */
51612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    static HdmiCecMessage buildSetAnalogueTimer(int src, int dest, byte[] params) {
51712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_SET_ANALOG_TIMER, params);
51812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    }
51912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
52012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    /**
52112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * Build &lt;Set External Timer&gt; command.
52212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     *
52312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param src source address of command
52412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param dest destination address of command
52512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param params byte array of timing information and external source information to be recorded
52612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @return newly created {@link HdmiCecMessage}
52712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     */
52812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    static HdmiCecMessage buildSetExternalTimer(int src, int dest, byte[] params) {
52912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_SET_EXTERNAL_TIMER, params);
53012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    }
53112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
53212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    /**
53312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * Build &lt;Clear Digital Timer&gt; command.
53412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     *
53512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param src source address of command
53612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param dest destination address of command
53712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param params byte array of timing information and digital service information to be cleared
53812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @return newly created {@link HdmiCecMessage}
53912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     */
54012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    static HdmiCecMessage buildClearDigitalTimer(int src, int dest, byte[] params) {
54112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_CLEAR_DIGITAL_TIMER, params);
54212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    }
54312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
54412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    /**
54512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * Build &lt;Clear Analog Timer&gt; command.
54612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     *
54712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param src source address of command
54812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param dest destination address of command
54912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param params byte array of timing information and analog service information to be cleared
55012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @return newly created {@link HdmiCecMessage}
55112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     */
55212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    static HdmiCecMessage buildClearAnalogueTimer(int src, int dest, byte[] params) {
55312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_CLEAR_ANALOG_TIMER, params);
55412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    }
55512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
55612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    /**
55712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * Build &lt;Clear Digital Timer&gt; command.
55812e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     *
55912e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param src source address of command
56012e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param dest destination address of command
56112e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @param params byte array of timing information and external source information to be cleared
56212e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     * @return newly created {@link HdmiCecMessage}
56312e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang     */
56412e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    static HdmiCecMessage buildClearExternalTimer(int src, int dest, byte[] params) {
56512e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang        return buildCommand(src, dest, Constants.MESSAGE_CLEAR_EXTERNAL_TIMER, params);
56612e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang    }
56712e5dcefe136b58562f39604e6a8460ac92cb895Jungshik Jang
56863a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /***** Please ADD new buildXXX() methods above. ******/
56963a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo
57063a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo    /**
571a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build a {@link HdmiCecMessage} without extra parameter.
572a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
573a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
574a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
575a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param opcode opcode for a message
576a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
577a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
578a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private static HdmiCecMessage buildCommand(int src, int dest, int opcode) {
579a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return new HdmiCecMessage(src, dest, opcode, HdmiCecMessage.EMPTY_PARAM);
580a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
581a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang
582a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    /**
583a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * Build a {@link HdmiCecMessage} with given values.
584a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     *
585a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param src source address of command
586a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param dest destination address of command
587a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param opcode opcode for a message
588a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @param params extra parameters for command
589a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     * @return newly created {@link HdmiCecMessage}
590a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang     */
591a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    private static HdmiCecMessage buildCommand(int src, int dest, int opcode, byte[] params) {
592a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang        return new HdmiCecMessage(src, dest, opcode, params);
593a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang    }
59478d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim
59578d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    private static byte[] physicalAddressToParam(int physicalAddress) {
59678d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        return new byte[] {
597339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                (byte) ((physicalAddress >> 8) & 0xFF),
59878d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim                (byte) (physicalAddress & 0xFF)
59978d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim        };
60078d695d8ba532214b02e7f18e0ccf89cf099163dJinsuk Kim    }
601a1fa91fe263c483cf13066e2847a440de2cd52a5Jungshik Jang}
602