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 <Set Osd Name > 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 <Report Physical Address> 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 <Device Vendor Id> 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 <Device Vendor Id> 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 <Request Arc Initiation> 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 <Request Arc Termination> 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 <Report Arc Initiated> 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 <Report Arc Terminated> 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 <Text View On> 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 <Active Source> 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 <Inactive Source> 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 <Set Stream Path> 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 <Routing Change> 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 <Give Device Power Status> 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 <Report Power Status> 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 <Report Menu Status> 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 <System Audio Mode Request> 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 <Give Audio Status> 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 <User Control Pressed> 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 <User Control Pressed> 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 <User Control Released> 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 <Give System Audio Mode Status> 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 <Standby> 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 <Vendor Command> 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 <Vendor Command With ID> 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 <Record On> 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 <Record Off> 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 <Set Digital Timer> 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 <Set Analogue Timer> 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 <Set External Timer> 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 <Clear Digital Timer> 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 <Clear Analog Timer> 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 <Clear Digital Timer> 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