/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hdmicec.cts;

import androidx.annotation.IntDef;

import java.io.File;

public final class HdmiCecConstants {

    private HdmiCecConstants() {}

    public static final String PHYSICAL_ADDRESS_NAME = "cec-phy-addr";
    public static final int REBOOT_TIMEOUT = 60000;
    public static final int TIMEOUT_CEC_REINIT_SECONDS = 5;
    public static final int TIMEOUT_SAFETY_MS = 500;

    public static final int INVALID_VENDOR_ID = 0xFFFFFF;

    // Standard delay to allow the DUT to react to a CEC message or ADB command
    public static final int DEVICE_WAIT_TIME_SECONDS = 5;
    public static final int DEVICE_WAIT_TIME_MS = 5000;
    public static final int MAX_SLEEP_TIME_SECONDS = 8;
    public static final int SLEEP_TIMESTEP_SECONDS = 1;
    public static final int DEFAULT_PHYSICAL_ADDRESS = 0x1000;
    public static final int TV_PHYSICAL_ADDRESS = 0x0000;
    public static final int PHYSICAL_ADDRESS_LENGTH = 4; /* Num nibbles in CEC message */

    public static final int CEC_KEYCODE_SELECT = 0x00;
    public static final int CEC_KEYCODE_UP = 0x01;
    public static final int CEC_KEYCODE_DOWN = 0x02;
    public static final int CEC_KEYCODE_LEFT = 0x03;
    public static final int CEC_KEYCODE_RIGHT = 0x04;
    public static final int CEC_KEYCODE_ROOT_MENU = 0x09;
    public static final int CEC_KEYCODE_SETUP_MENU = 0x0A;
    public static final int CEC_KEYCODE_CONTENTS_MENU = 0x0B;
    public static final int CEC_KEYCODE_BACK = 0x0D;
    public static final int CEC_KEYCODE_MEDIA_TOP_MENU = 0x10;
    public static final int CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU = 0x11;
    public static final int CEC_KEYCODE_NUMBER_0_OR_NUMBER_10 = 0x20;
    public static final int CEC_KEYCODE_NUMBERS_1 = 0x21;
    public static final int CEC_KEYCODE_NUMBERS_2 = 0x22;
    public static final int CEC_KEYCODE_NUMBERS_3 = 0x23;
    public static final int CEC_KEYCODE_NUMBERS_4 = 0x24;
    public static final int CEC_KEYCODE_NUMBERS_5 = 0x25;
    public static final int CEC_KEYCODE_NUMBERS_6 = 0x26;
    public static final int CEC_KEYCODE_NUMBERS_7 = 0x27;
    public static final int CEC_KEYCODE_NUMBERS_8 = 0x28;
    public static final int CEC_KEYCODE_NUMBERS_9 = 0x29;
    public static final int CEC_KEYCODE_CHANNEL_UP = 0x30;
    public static final int CEC_KEYCODE_CHANNEL_DOWN = 0x31;
    public static final int CEC_KEYCODE_PREVIOUS_CHANNEL = 0x32;
    public static final int CEC_KEYCODE_DISPLAY_INFORMATION = 0x35;
    public static final int CEC_KEYCODE_POWER = 0x40;
    public static final int CEC_KEYCODE_VOLUME_UP = 0x41;
    public static final int CEC_KEYCODE_VOLUME_DOWN = 0x42;
    public static final int CEC_KEYCODE_MUTE = 0x43;
    public static final int CEC_KEYCODE_PLAY = 0x44;
    public static final int CEC_KEYCODE_STOP = 0x45;
    public static final int CEC_KEYCODE_PAUSE = 0x46;
    public static final int CEC_KEYCODE_RECORD = 0x47;
    public static final int CEC_KEYCODE_REWIND = 0x48;
    public static final int CEC_KEYCODE_FAST_FORWARD = 0x49;
    public static final int CEC_KEYCODE_EJECT = 0x4A;
    public static final int CEC_KEYCODE_FORWARD = 0x4B;
    public static final int CEC_KEYCODE_BACKWARD = 0x4C;
    public static final int CEC_KEYCODE_POWER_TOGGLE_FUNCTION = 0x6B;
    public static final int CEC_KEYCODE_POWER_OFF_FUNCTION = 0x6C;
    public static final int CEC_KEYCODE_POWER_ON_FUNCTION = 0x6D;
    public static final int CEC_KEYCODE_F1_BLUE = 0x71;
    public static final int CEC_KEYCODE_F2_RED = 0x72;
    public static final int CEC_KEYCODE_F3_GREEN = 0x73;
    public static final int CEC_KEYCODE_F4_YELLOW = 0x74;
    public static final int CEC_KEYCODE_DATA = 0x76;

    public static final int UNRECOGNIZED_OPCODE = 0x0;

    @IntDef(
            value = {
                CEC_DEVICE_TYPE_UNKNOWN,
                CEC_DEVICE_TYPE_TV,
                CEC_DEVICE_TYPE_RECORDER,
                CEC_DEVICE_TYPE_RESERVED,
                CEC_DEVICE_TYPE_TUNER,
                CEC_DEVICE_TYPE_PLAYBACK_DEVICE,
                CEC_DEVICE_TYPE_AUDIO_SYSTEM,
                CEC_DEVICE_TYPE_SWITCH
            })
    public @interface CecDeviceType {}

    public static final int CEC_DEVICE_TYPE_UNKNOWN = -1;
    public static final int CEC_DEVICE_TYPE_TV = 0;
    public static final int CEC_DEVICE_TYPE_RECORDER = 1;
    public static final int CEC_DEVICE_TYPE_RESERVED = 2;
    public static final int CEC_DEVICE_TYPE_TUNER = 3;
    public static final int CEC_DEVICE_TYPE_PLAYBACK_DEVICE = 4;
    public static final int CEC_DEVICE_TYPE_AUDIO_SYSTEM = 5;
    public static final int CEC_DEVICE_TYPE_SWITCH = 6;
    public static final int CEC_DEVICE_TYPE_VIDEO_PROCESSOR = 7;

    /** Feature Abort Reasons */
    public static final int ABORT_UNRECOGNIZED_MODE = 0;
    public static final int ABORT_NOT_IN_CORRECT_MODE = 1;
    public static final int ABORT_CANNOT_PROVIDE_SOURCE = 2;
    public static final int ABORT_INVALID_OPERAND = 3;
    public static final int ABORT_REFUSED = 4;
    public static final int ABORT_UNABLE_TO_DETERMINE = 5;

    // CEC versions
    public static final int CEC_VERSION_1_4 = 0x05;
    public static final int CEC_VERSION_2_0 = 0x06;

    /** CEC Power Status */
    public static final int CEC_POWER_STATUS_ON = 0x0;
    public static final int CEC_POWER_STATUS_STANDBY = 0x1;
    public static final int CEC_POWER_STATUS_IN_TRANSITION_TO_ON = 0x2;
    public static final int CEC_POWER_STATUS_IN_TRANSITION_TO_STANDBY = 0x3;

    /** PowerManager wakefulness states */
    public static final String WAKEFULNESS_AWAKE = "Awake";
    public static final String WAKEFULNESS_ASLEEP = "Asleep";

    /** Poll Message Success */
    public static final String POLL_SUCCESS = "POLL message sent";

    // CEC Device feature list
    public static final String HDMI_CEC_FEATURE = "feature:android.hardware.hdmi.cec";
    public static final String LEANBACK_FEATURE = "feature:android.software.leanback";

    // CEC Device property list
    public static final String HDMI_DEVICE_TYPE_PROPERTY = "ro.hdmi.device_type";
    public static final String PROPERTY_ARC_SUPPORT = "persist.sys.hdmi.property_arc_support";

    /*
     * The default name of local directory into which the port to device mapping files are stored.
     */
    public static final File CEC_MAP_FOLDER =
            new File(System.getProperty("java.io.tmpdir"), "cec-cts-temp");

    // CEC Settings
    public static final String SETTING_VOLUME_CONTROL_ENABLED = "volume_control_enabled";

    // CEC Settings Values
    public static final String VOLUME_CONTROL_ENABLED = "1";

    // Power Control Modes for source devices
    public static final String POWER_CONTROL_MODE_BROADCAST = "broadcast";
    public static final String POWER_CONTROL_MODE_NONE = "none";
    public static final String POWER_CONTROL_MODE_TV = "to_tv";

    // Power State Change on Active Source Lost Settings values
    public static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE = "none";
    public static final String POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW = "standby_now";

    // CEC 2.0 Report Feature Bits
    public static final int FEATURES_SINK_SUPPORTS_ARC_TX_BIT = 0x4;
    public static final int FEATURES_SINK_SUPPORTS_ARC_RX_BIT = 0x2;
}
