from enum import IntEnum
from UniTAP.dev.modules.dut_tests.test_group_params_types import Param
from UniTAP.dev.modules.dut_tests.test_utils import update_default_value


class BitStream(IntEnum):
    """
    Describes available values for bit stream.
    Sink DUT support 444 CRC for Simple 422 bitstream
    """
    YCbCr422 = 0
    YCbCr444 = 1


class PackedSource(IntEnum):
    """
    Describes available values for packer source.
    Source of the most packet video modes table.
    """
    UseTestConfig = 0
    UseSinkDutEdid = 1


class DisplayIdVisualCheck(IntEnum):
    """
    Describes available values for visual check during DisplayID CTS tests.
    """
    NeverSkip = 0
    SkipIfCrcMatches = 1


class Timing:
    """
    Class `Timing` describes available supported timings standard.
    - CTA `cta` (enable/disable).
    - RB1 `rb1` (enable/disable).
    - RB2 `rb2` (enable/disable).
    """
    def __init__(self, timing_data):
        self.__data = Param(timing_data)
        self.__cta = False
        self.__rb1 = False
        self.__rb2 = False

    @property
    def cta(self):
        """
        Set and get CTA flag support.

        Returns:
            object of bool type
        """
        return self.__cta

    @cta.setter
    def cta(self, cta: bool):
        self.__cta = cta
        self.__data.default_value = update_default_value(value=self.__cta,
                                                         default_value=self.__data.default_value,
                                                         mask=self.__data.bit_field_list[0].mask)

    @property
    def rb1(self):
        """
        Set and get RB1 flag support.

        Returns:
            object of bool type
        """
        return self.__rb1

    @rb1.setter
    def rb1(self, rb1: bool):
        self.__rb1 = rb1
        self.__data.default_value = update_default_value(value=self.__rb1,
                                                         default_value=self.__data.default_value,
                                                         mask=self.__data.bit_field_list[1].mask)

    @property
    def rb2(self):
        """
        Set and get RB2 flag support.

        Returns:
            object of bool type
        """
        return self.__rb2

    @rb2.setter
    def rb2(self, rb2: bool):
        self.__rb2 = rb2
        self.__data.default_value = update_default_value(value=self.__rb2,
                                                         default_value=self.__data.default_value,
                                                         mask=self.__data.bit_field_list[2].mask)

    def set_all(self):
        self.cta = True
        self.rb1 = True
        self.rb2 = True

    def clear(self):
        self.cta = False
        self.rb1 = False
        self.rb2 = False


class Dp14SinkTimings:
    """
    Class `Dp14SinkTimings` defines DSC video modes adn allows settings values.
    - 1920x1080 30Hz `T_1920_x_1080_30`.
    - 1920x1080 60Hz `T_1920_x_1080_60`.
    - 1920x1080 120Hz `T_1920_x_1080_120`.
    - 3840x2160 30Hz `T_3840_x_2160_30`.
    - 3840x2160 60Hz `T_3840_x_2160_60`.
    - 3840x2160 120Hz `T_3840_x_2160_120`.
    - 5120x2160 30Hz `T_5120_x_2160_30`.
    - 5120x2160 60Hz `T_5120_x_2160_60`.
    - 5120x2160 120Hz `T_5120_x_2160_120`.
    - 7680x4320 30Hz `T_7680_x_4320_30`.
    - 7680x4320 60Hz `T_7680_x_4320_60`.
    - 7680x4320 100Hz `T_7680_x_4320_100`.
    """
    def __init__(self, json_obj):
        self.__1920_x_1080_30_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_0"])
        self.__1920_x_1080_30 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_0"])

        self.__1920_x_1080_60_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_1"])
        self.__1920_x_1080_60 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_1"])

        self.__1920_x_1080_120_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_2"])
        self.__1920_x_1080_120 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_2"])

        self.__3840_x_2160_30_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_3"])
        self.__3840_x_2160_30 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_3"])

        self.__3840_x_2160_60_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_4"])
        self.__3840_x_2160_60 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_4"])

        self.__3840_x_2160_120_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_5"])
        self.__3840_x_2160_120 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_5"])

        self.__5120_x_2160_30_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_6"])
        self.__5120_x_2160_30 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_6"])

        self.__5120_x_2160_60_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_7"])
        self.__5120_x_2160_60 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_7"])

        self.__5120_x_2160_120_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_8"])
        self.__5120_x_2160_120 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_8"])

        self.__7680_x_4320_30_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_9"])
        self.__7680_x_4320_30 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_9"])

        self.__7680_x_4320_60_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_10"])
        self.__7680_x_4320_60 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_10"])

        self.__7680_x_4320_100_id = Param(json_obj["TSI_DP14_SINKCTS_DSC_VM_11"])
        self.__7680_x_4320_100 = Timing(timing_data=json_obj["TSI_DP14_SINKCTS_DSC_VM_T_11"])

    @property
    def T_1920_x_1080_30(self) -> Timing:
        """
        Set and get 1920x1080 30Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__1920_x_1080_30

    @T_1920_x_1080_30.setter
    def T_1920_x_1080_30(self, _1920_x_1080_30: Timing):
        self.__1920_x_1080_30 = _1920_x_1080_30

    @property
    def T_1920_x_1080_60(self) -> Timing:
        """
        Set and get 1920x1080 60Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__1920_x_1080_60

    @T_1920_x_1080_60.setter
    def T_1920_x_1080_60(self, _1920_x_1080_60: Timing):
        self.__1920_x_1080_60 = _1920_x_1080_60

    @property
    def T_1920_x_1080_120(self) -> Timing:
        """
        Set and get 1920x1080 120Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__1920_x_1080_120

    @T_1920_x_1080_120.setter
    def T_1920_x_1080_120(self, _1920_x_1080_120: Timing):
        self.__1920_x_1080_120 = _1920_x_1080_120

    @property
    def T_3840_x_2160_30(self) -> Timing:
        """
        Set and get 3840x2160 30Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__3840_x_2160_30

    @T_3840_x_2160_30.setter
    def T_3840_x_2160_30(self, _3840_x_2160_30: Timing):
        self.__3840_x_2160_30 = _3840_x_2160_30

    @property
    def T_3840_x_2160_60(self) -> Timing:
        """
        Set and get 3840x2160 60Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__3840_x_2160_60

    @T_3840_x_2160_60.setter
    def T_3840_x_2160_60(self, _3840_x_2160_60: Timing):
        self.__3840_x_2160_60 = _3840_x_2160_60

    @property
    def T_3840_x_2160_120(self) -> Timing:
        """
        Set and get 3840x2160 120Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__3840_x_2160_120

    @T_3840_x_2160_120.setter
    def T_3840_x_2160_120(self, _3840_x_2160_120: Timing):
        self.__3840_x_2160_120 = _3840_x_2160_120

    @property
    def T_5120_x_2160_30(self) -> Timing:
        """
        Set and get 5120x2160 30Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__5120_x_2160_30

    @T_5120_x_2160_30.setter
    def T_5120_x_2160_30(self, _5120_x_2160_30: Timing):
        self.__15120_x_2160_30 = _5120_x_2160_30

    @property
    def T_5120_x_2160_60(self) -> Timing:
        """
        Set and get 5120x2160 60Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__5120_x_2160_60

    @T_5120_x_2160_60.setter
    def T_5120_x_2160_60(self, _5120_x_2160_60: Timing):
        self.__5120_x_2160_60 = _5120_x_2160_60

    @property
    def T_5120_x_2160_120(self) -> Timing:
        """
        Set and get 5120x2160 120Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__5120_x_2160_120

    @T_5120_x_2160_120.setter
    def T_5120_x_2160_120(self, _5120_x_2160_120: Timing):
        self.__5120_x_2160_120 = _5120_x_2160_120

    @property
    def T_7680_x_4320_30(self) -> Timing:
        """
        Set and get 7680x4320 30Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__7680_x_4320_30

    @T_7680_x_4320_30.setter
    def T_7680_x_4320_30(self, _7680_x_4320_30: Timing):
        self.__7680_x_4320_30 = _7680_x_4320_30

    @property
    def T_7680_x_4320_60(self) -> Timing:
        """
        Set and get 7680x4320 60Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__7680_x_4320_60

    @T_7680_x_4320_60.setter
    def T_7680_x_4320_60(self, _7680_x_4320_60: Timing):
        self.__7680_x_4320_60 = _7680_x_4320_60

    @property
    def T_7680_x_4320_100(self) -> Timing:
        """
        Set and get 7680x4320 100Hz timing.

        Returns:
            object of `Timing` type
        """
        return self.__7680_x_4320_100

    @T_7680_x_4320_100.setter
    def T_7680_x_4320_100(self, _7680_x_4320_100: Timing):
        self.__7680_x_4320_100 = _7680_x_4320_100


class ConfigVideoMode1LaneParam:
    """
    Class `ConfigVideoMode1LaneParam` defines support for video mode for 1 lane and allows settings values.
    - CVT 1280x800 `cvt_1280x800`.
    - DMT 1280x768 `dmt_1280x768`.
    - DMT 800x600 `dmt_800x600`.
    - DMT 1024x768 `dmt_1024x768`.
    - CTA 1440x480 `cta_1440x480`.
    - CTA 1440x576 `cta_1440x576`.
    """
    def __init__(self, json_obj):
        self.__cvt_1280x800 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_0"])
        self.__dmt_1280x768 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_1"])
        self.__dmt_800x600 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_2"])
        self.__dmt_1024x768 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_3"])
        self.__cta_1440x480 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_14"])
        self.__cta_1440x576 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_15"])

    @property
    def cvt_1280x800(self) -> bool:
        """
        Set and get CVT 1280x800 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cvt_1280x800.default_value

    @cvt_1280x800.setter
    def cvt_1280x800(self, cvt_1280x800: bool):
        self.__cvt_1280x800.default_value = cvt_1280x800

    @property
    def dmt_1280x768(self) -> bool:
        """
        Set and get DMT 1280x768 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1280x768.default_value

    @dmt_1280x768.setter
    def dmt_1280x768(self, dmt_1280x768: bool):
        self.__dmt_1280x768.default_value = dmt_1280x768

    @property
    def dmt_800x600(self) -> bool:
        """
        Set and get DMT 800x600 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_800x600.default_value

    @dmt_800x600.setter
    def dmt_800x600(self, dmt_800x600: bool):
        self.__dmt_800x600.default_value = dmt_800x600

    @property
    def dmt_1024x768(self) -> bool:
        """
        Set and get DMT 1024x768 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1024x768.default_value

    @dmt_1024x768.setter
    def dmt_1024x768(self, dmt_1024x768: bool):
        self.__dmt_1024x768.default_value = dmt_1024x768

    @property
    def cta_1440x480(self) -> bool:
        """
        Set and get CTA 1440x480 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cta_1440x480.default_value

    @cta_1440x480.setter
    def cta_1440x480(self, cta_1440x480: bool):
        self.__cta_1440x480.default_value = cta_1440x480

    @property
    def cta_1440x576(self) -> bool:
        """
        Set and get CTA 1440x576 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cta_1440x576.default_value

    @cta_1440x576.setter
    def cta_1440x576(self, cta_1440x576: bool):
        self.__cta_1440x576.default_value = cta_1440x576


class ConfigVideoMode2LaneParam:
    """
    Class `ConfigVideoMode2LaneParam` defines support for video mode for 2 lane and allows settings values.
    - DMT 1280x1024 `dmt_1280x1024`.
    - DMT 1280x960 `dmt_1280x960`.
    - DMT 1360x768 `dmt_1360x768`.
    - CVT 1280x800 `cvt_1280x800`.
    - DMT 1400x1050 `dmt_1400x1050`.
    - DMT 1280x768 `dmt_1280x768`.
    - CVT 1600x1200 `cvt_1600x1200`
    """
    def __init__(self, json_obj):
        self.__dmt_1280x1024 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_4"])
        self.__dmt_1280x960 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_5"])
        self.__dmt_1360x768 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_6"])
        self.__cvt_1280x800 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_7"])
        self.__dmt_1400x1050 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_8"])
        self.__dmt_1280x768 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_9"])
        self.__cvt_1600x1200 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_10"])

    @property
    def dmt_1280x1024(self) -> bool:
        """
        Set and get DMT 1280x1024 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1280x1024.default_value

    @dmt_1280x1024.setter
    def dmt_1280x1024(self, dmt_1280x1024: bool):
        self.__dmt_1280x1024.default_value = dmt_1280x1024

    @property
    def dmt_1280x960(self) -> bool:
        """
        Set and get DMT 1280x960 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1280x960.default_value

    @dmt_1280x960.setter
    def dmt_1280x960(self, dmt_1280x960: bool):
        self.__dmt_1280x960.default_value = dmt_1280x960

    @property
    def dmt_1360x768(self) -> bool:
        """
        Set and get DMT 1360x768 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1360x768.default_value

    @dmt_1360x768.setter
    def dmt_1360x768(self, dmt_1360x768: bool):
        self.__dmt_1360x768.default_value = dmt_1360x768

    @property
    def cvt_1280x800(self) -> bool:
        """
        Set and get CVT 1280x800 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cvt_1280x800.default_value

    @cvt_1280x800.setter
    def cvt_1280x800(self, cvt_1280x800: bool):
        self.__cvt_1280x800.default_value = cvt_1280x800

    @property
    def dmt_1400x1050(self) -> bool:
        """
        Set and get DMT 1400x1050 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1400x1050.default_value

    @dmt_1400x1050.setter
    def dmt_1400x1050(self, dmt_1400x1050: bool):
        self.__dmt_1400x1050.default_value = dmt_1400x1050

    @property
    def dmt_1280x768(self) -> bool:
        """
        Set and get DMT 1280x768 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1280x768.default_value

    @dmt_1280x768.setter
    def dmt_1280x768(self, dmt_1280x768: bool):
        self.__dmt_1280x768.default_value = dmt_1280x768

    @property
    def cvt_1600x1200(self) -> bool:
        """
        Set and get CVT 1600x1200 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cvt_1600x1200.default_value

    @cvt_1600x1200.setter
    def cvt_1600x1200(self, cvt_1600x1200: bool):
        self.__cvt_1600x1200.default_value = cvt_1600x1200


class ConfigVideoMode4LaneParam:
    """
    Class `ConfigVideoMode4LaneParam` defines support for video mode for 4 lane and allows settings values.
    - CVT 2048x1536 `cvt_2048x1536`.
    - DMT 1792x1344 `dmt_1792x1344`.
    - DMT 1600x1200 `dmt_1600x1200`.
    - CTA 1920x1080 `cta_1920x1080`.
    """
    def __init__(self, json_obj):
        self.__cvt_2048x1536 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_11"])
        self.__dmt_1792x1344 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_12"])
        self.__dmt_1600x1200 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_13"])
        self.__cta_1920x1080 = Param(json_obj["TSI_DP14_SINKCTS_VIDEO_MODE_16"])

    @property
    def cvt_2048x1536(self) -> bool:
        """
        Set and get CVT 2048x1536 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cvt_2048x1536.default_value

    @cvt_2048x1536.setter
    def cvt_2048x1536(self, cvt_2048x1536: bool):
        self.__cvt_2048x1536.default_value = cvt_2048x1536

    @property
    def dmt_1792x1344(self) -> bool:
        """
        Set and get DMT 1792x1344 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1792x1344.default_value

    @dmt_1792x1344.setter
    def dmt_1792x1344(self, dmt_1792x1344: bool):
        self.__dmt_1792x1344.default_value = dmt_1792x1344

    @property
    def dmt_1600x1200(self) -> bool:
        """
        Set and get DMT 1600x1200 timing flag support.

        Returns:
            object of bool type
        """
        return self.__dmt_1600x1200.default_value

    @dmt_1600x1200.setter
    def dmt_1600x1200(self, dmt_1600x1200: bool):
        self.__dmt_1600x1200.default_value = dmt_1600x1200

    @property
    def cta_1920x1080(self) -> bool:
        """
        Set and get CTA 1920x1080 timing flag support.

        Returns:
            object of bool type
        """
        return self.__cta_1920x1080.default_value

    @cta_1920x1080.setter
    def cta_1920x1080(self, cta_1920x1080: bool):
        self.__cta_1920x1080.default_value = cta_1920x1080


class Dp14SinkTestParam:
    """
    Class `Dp14SinkTestParam` allows working with parameters for Sink DP 1.4 LLCTS tests.
    - Set and get test timeout, in milliseconds `timeout`.
    - Set and get DSC timings `timings` type `Dp14SinkTimings`.
    - Set and get capabilities of DSC video mode `dsc_video_mode`.
    - Set and get bitstream type `bitstream` - type `BitStream`.
    - Set and get packed source `packed_source` - type `PackedSource`.
    - Set and get configuration of video modes for 1 lane `config_video_mode_1_lane` type `ConfigVideoMode1LaneParam`.
    - Set and get configuration of video modes for 2 lane `config_video_mode_2_lane` type `ConfigVideoMode2LaneParam`.
    - Set and get configuration of video modes for 4 lane `config_video_mode_4_lane` type `ConfigVideoMode4LaneParam`.
    - Set and get flag of display id visual `display_id_visual` type `DisplayIdVisualCheck`.
    """
    def __init__(self, json_obj):
        self.__timeout = Param(json_obj["TSI_DP14_SINKCTS_TIMEOUT"])
        self.__timings = Dp14SinkTimings(json_obj)
        self.__dsc_video_mode = Param(json_obj["TSI_DP14_SINKCTS_DSC_SOURCE"])  # PackedSource
        self.__bitstream = Param(json_obj["TSI_DP14_SINKCTS_SUPPORT_444CRC"])  # BitStream
        self.__packed_source = Param(json_obj["TSI_DP14_SINKCTS_PACKET_SOURCE"])  # PackedSource
        self.__config_video_mode_1_lane = ConfigVideoMode1LaneParam(json_obj)
        self.__config_video_mode_2_lane = ConfigVideoMode2LaneParam(json_obj)
        self.__config_video_mode_4_lane = ConfigVideoMode4LaneParam(json_obj)
        self.__display_id_visual = Param(json_obj["TSI_DP14_SINKCTS_VISUAL_TEST_CHECK"])

    @property
    def timeout(self) -> int:
        """
        Set and get test timeout, in milliseconds.

        Returns:
            object of int type
        """
        return self.__timeout.default_value

    @timeout.setter
    def timeout(self, timeout: int):
        if not(self.__timeout.min_value < timeout < self.__timeout.max_value):
            raise ValueError(f"Timeout cannot be less than {self.__timeout.min_value} and more than "
                             f"{self.__timeout.max_value}.")
        self.__timeout.default_value = timeout

    @property
    def timings(self):
        """
        Set and get timings.

        Returns:
            object `Dp14SinkTimings`
        """
        return self.__timings

    @timings.setter
    def timings(self, timings: Dp14SinkTimings):
        self.__timings = timings

    @property
    def dsc_video_mode(self) -> PackedSource:
        """
        Set and get dsc video packed source.

        Returns:
            object `PackedSource`
        """
        return PackedSource(self.__dsc_video_mode.default_value)

    @dsc_video_mode.setter
    def dsc_video_mode(self, dsc_video_mode: PackedSource):
        self.__dsc_video_mode.default_value = dsc_video_mode.value

    @property
    def bitstream(self) -> BitStream:
        """
        Set and get bitstream.

        Returns:
            object `BitStream`
        """
        return BitStream(self.__bitstream.default_value)

    @bitstream.setter
    def bitstream(self, bitstream: BitStream):
        self.__bitstream.default_value = bitstream.value

    @property
    def packed_source(self) -> PackedSource:
        """
        Set and get packed source.

        Returns:
            object `PackedSource`
        """
        return PackedSource(self.__packed_source.default_value)

    @packed_source.setter
    def packed_source(self, packed_source: PackedSource):
        self.__packed_source.default_value = packed_source.value

    @property
    def config_video_mode_1_lane(self):
        """
        Set and get configuration of video modes for 1 lane.

        Returns:
            object `ConfigVideoMode1LaneParam`
        """
        return self.__config_video_mode_1_lane

    @config_video_mode_1_lane.setter
    def config_video_mode_1_lane(self, config_video_mode_1_lane: ConfigVideoMode1LaneParam):
        self.__config_video_mode_1_lane = config_video_mode_1_lane

    @property
    def config_video_mode_2_lane(self):
        """
        Set and get configuration of video modes for 2 lane.

        Returns:
            object `ConfigVideoMode2LaneParam`
        """
        return self.__config_video_mode_2_lane

    @config_video_mode_2_lane.setter
    def config_video_mode_2_lane(self, config_video_mode_2_lane: ConfigVideoMode2LaneParam):
        self.__config_video_mode_2_lane = config_video_mode_2_lane

    @property
    def config_video_mode_4_lane(self):
        """
        Set and get configuration of video modes for 4 lane.

        Returns:
            object `ConfigVideoMode4LaneParam`
        """
        return self.__config_video_mode_4_lane

    @config_video_mode_4_lane.setter
    def config_video_mode_4_lane(self, config_video_mode_4_lane: ConfigVideoMode4LaneParam):
        self.__config_video_mode_4_lane = config_video_mode_4_lane

    @property
    def display_id_visual(self) -> DisplayIdVisualCheck:
        """
        Set and get flag of visual check in Display ID.

        Returns:
            object `DisplayIdVisualCheck`
        """
        return DisplayIdVisualCheck(self.__display_id_visual.default_value)

    @display_id_visual.setter
    def display_id_visual(self, display_id_visual: DisplayIdVisualCheck):
        self.__display_id_visual.default_value = display_id_visual
