Files
pqAutomationApp/docs/UCD-API文档/examples/check_crc_rx_and_tx_sides.py
2026-07-02 17:16:18 +08:00

153 lines
6.7 KiB
Python

# =================================================================================================
# This script is written to check the CRC values on the TX and RX sides,
# as well as check the CRC for captured video frames.
# The main check is performed on standard patterns, but you can also use custom images.
# In order to check the DSC of an image, you need to change the functions to select the CRC values,
# as well as take a value from a stream variable link.status.stream(stream_number).dsc_crc.
# =================================================================================================
# Import UniTAP and others module.
import UniTAP
import time
from UniTAP.utils import calculate_crc
max_streams = 1
log_fid = open("rb_testing.log", 'w')
# =================================================================================================
# Function. Setting and applying Pattern Generator (PG)
# =================================================================================================
def apply_PG(role, max_streams, timing, bpc, color_format, pg_progress_max, pg_progress_cur, pattern):
color_mode = UniTAP.ColorInfo()
if color_format == color_mode.ColorFormat.CF_RGB:
color_mode.bpc = bpc
color_mode.dynamic_range = color_mode.DynamicRange.DR_VESA
else:
color_mode.dynamic_range = color_mode.DynamicRange.DR_CTA
# if bpc == 6:
# return 0
color_mode.bpc = bpc
color_mode.color_format = color_format
color_mode.colorimetry = UniTAP.ColorInfo.Colorimetry.CM_ITUR_BT601
if not color_mode.is_valid():
print("Color mode " + color_mode.__str__() + " is not valid")
exit(1)
video_mode = UniTAP.VideoMode(timing=timing, color_info=color_mode)
for stream in range(max_streams):
role.pg[stream].set_vm(vm=video_mode)
role.pg[stream].set_pattern(pattern=pattern)
role.pg[stream].apply()
# logger.debug("Set video mode: " + video_mode.__str__())
# print("Set video mode: " + video_mode.__str__())
progress(pg_progress_max, pg_progress_cur, "Timing: {}".format(video_mode), log_fid)
time.sleep(0.5)
# =================================================================================================
# Function. TX, RX CRCs comparison
# =================================================================================================
def check_CRCs_the_same(roles, max_streams, log_fid):
for stream in range(max_streams):
tx_crc = list(map(hex, roles.dptx.link.status.stream(stream).crc))
rx_crc = list(map(hex, roles.dprx.link.status.stream(stream).crc))
if tx_crc != rx_crc:
msg = "@Error: stream " + stream.__str__() + ": CRCs are different: TX: " + tx_crc.__str__() + "; RX: " + rx_crc.__str__()
print(msg)
log_fid.write(msg + '\n')
# =================================================================================================
# Function. Check CRCs on captured frames: stability and equality with dprx.stream.crc
# =================================================================================================
def check_capturing(log_fid):
buffers = 3
role_rx.video_capturer.start(frames_count=buffers)
role_rx.video_capturer.stop()
result = role_rx.video_capturer.capture_result
stream_crc = list(map(hex, role_rx.link.status.stream(0).crc))
bin_fid = open('buf.dat', 'bw')
bin_fid.write(result.buffer[0].data)
bin_fid.close()
for b in range(buffers):
capt_crc = list(map(hex, calculate_crc(result.buffer[b])))
if stream_crc != capt_crc:
msg = "@Error: stream 0 CRCs are different: RX: " + stream_crc.__str__() + "; Captured: " + capt_crc.__str__()
print(msg)
log_fid.write(msg + '\n')
# =================================================================================================
# Function. Progress
# =================================================================================================
def progress(max, cur, msg='', log_fid=0):
print("Progress: %3.2f%%: %s" % (cur * 100 / max, msg), end='\n')
log_fid.write(msg + '\n')
# =================================================================================================
# MAIN
# =================================================================================================
# -------------------------------------------------------------------------------------------------
# Open roles and others init routines
# -------------------------------------------------------------------------------------------------
if __name__ == '__main__':
# init UniTAP library wrapper
lUniTAP = UniTAP.TsiLib()
# open device and set the role
serial_number = "2150C474"
dev = lUniTAP.open(serial_number)
roles = dev.select_role(UniTAP.dev.UCD500.USBCSourceUSBCSink)
role_tx = roles.dptx
role_rx = roles.dprx
# -------------------------------------------------------------------------------------------------
# Setting up links
# -------------------------------------------------------------------------------------------------
# make LT
role_tx.link.start_link_training()
# wait some time after LT
time.sleep(2)
# -------------------------------------------------------------------------------------------------
# Get all video modes
# -------------------------------------------------------------------------------------------------
timing_manager = role_tx.pg.timing_manager
color_mode = UniTAP.ColorInfo()
# set color_formats list
color_formats = [
# color_mode.ColorFormat.CF_RGB,
# color_mode.ColorFormat.CF_YCbCr_444,
color_mode.ColorFormat.CF_YCbCr_422,
# color_mode.ColorFormat.CF_YCbCr_420
]
# set pattern (can be value from defaults, like UniTAP.VideoPattern.SolidWhite) or name of image
pattern = UniTAP.VideoPattern.SolidWhite
# pattern = "image.png"
# set bpc list
color_bpcs = [6, 8, 10, 12, 16]
# get RB timings only (it was a test case of Maxim Zaitsev)
rb_timings = []
for t in timing_manager.get_all():
if t.reduce_blanking > 0:
rb_timings.append(t)
pg_progress_max = len(rb_timings) * len(color_formats) * len(color_bpcs)
pg_progress_cur = 0
for t in rb_timings:
for cf in color_formats:
for bpc in color_bpcs:
if cf != color_mode.ColorFormat.CF_RGB and bpc == 6:
pass
else:
apply_PG(role_tx, max_streams, t, bpc, cf, pg_progress_max, pg_progress_cur, pattern)
check_CRCs_the_same(roles, max_streams, log_fid)
check_capturing(log_fid)
pg_progress_cur += 1
log_fid.close()