|
|
|
@ -22,6 +22,20 @@ class SerialProtocol: |
|
|
|
] |
|
|
|
return bytes(cmd_bytes) |
|
|
|
|
|
|
|
def cancel_all(self): |
|
|
|
""" |
|
|
|
取消所有窗口选定 |
|
|
|
""" |
|
|
|
# 根据你的协议文档,这里填入真实的十六进制指令 |
|
|
|
# 示例: [Head, Cmd, Data...] -> bytes |
|
|
|
cmd_bytes = [ |
|
|
|
0x80, # HEAD (假设) |
|
|
|
0x74, # CMD (接命令) |
|
|
|
0x46, # 起始位置 |
|
|
|
0xFF, 0xFF, 0xFF, 0xFF # 填充位 (根据协议长度补齐) |
|
|
|
] |
|
|
|
return bytes(cmd_bytes) |
|
|
|
|
|
|
|
def power_on_all(self): |
|
|
|
"""所有屏幕开机指令""" |
|
|
|
# 根据你的协议文档,这里填入真实的十六进制指令 |
|
|
|
@ -94,12 +108,9 @@ class SerialProtocol: |
|
|
|
start_id = min_row * 4 + min_col + 1 # 转回物理ID |
|
|
|
start_param = start_id - 1 # 协议参数:PanelNumber - 1 |
|
|
|
|
|
|
|
# Hcount (水平个数), Vcount (垂直个数) |
|
|
|
Hcount = max_col - min_col + 1 |
|
|
|
Vcount = max_row - min_row + 1 |
|
|
|
|
|
|
|
|
|
|
|
BigPicID = 1 |
|
|
|
# h_count (水平个数), Vcount (垂直个数) |
|
|
|
h_count = max_col - min_col + 1 |
|
|
|
v_count = max_row - min_row + 1 |
|
|
|
|
|
|
|
# --- 第四步:逻辑校验 --- |
|
|
|
# 检查这个矩形区域内是否有未被选中的屏幕(缺角情况) |
|
|
|
@ -112,47 +123,53 @@ class SerialProtocol: |
|
|
|
|
|
|
|
return { |
|
|
|
"start": start_param, |
|
|
|
"Hcount": Hcount, |
|
|
|
"Vcount": Vcount, |
|
|
|
"BigPicID": BigPicID, |
|
|
|
"h_count": h_count, |
|
|
|
"v_count": v_count, |
|
|
|
"missing_screens": missing_screens, # 用于提示用户 |
|
|
|
"min_row": min_row, |
|
|
|
"min_col": min_col |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
def build_mosaic_packet(self, start, hcount, vcount, cmd_type=0x01): |
|
|
|
def build_mosaic_packet(self, start, h_count, v_count, big_pic_id, cmd_type=0x10): |
|
|
|
""" |
|
|
|
封装拼接指令包 |
|
|
|
:param start: 起始物理屏编号 |
|
|
|
:param hcount: 水平数量 |
|
|
|
:param vcount: 垂直数量 |
|
|
|
:param cmd_type: 命令字,0x01通常代表拼接 |
|
|
|
:return: bytes (指令字节流) |
|
|
|
:param start: 起始物理屏编号 (int) |
|
|
|
:param h_count: 水平数量 (int) |
|
|
|
:param v_count: 垂直数量 (int) |
|
|
|
:param big_pic_id: 拼接大画面序列号,默认0x01表示拼接id (int) |
|
|
|
:param cmd_type: 命令字,默认0x01表示拼接 (int) |
|
|
|
:return: bytes (指令字节流),失败则抛出ValueError |
|
|
|
""" |
|
|
|
|
|
|
|
print(hcount) |
|
|
|
# 参数类型检查 |
|
|
|
if not all(isinstance(i, int) for i in [start, h_count, v_count, big_pic_id, cmd_type]): |
|
|
|
raise ValueError("所有参数必须为整数") |
|
|
|
|
|
|
|
try: |
|
|
|
# 限制数值范围,防止溢出 |
|
|
|
start = max(0, min(255, start)) |
|
|
|
hcount = max(1, min(16, hcount)) # 假设最大16屏 |
|
|
|
vcount = max(1, min(16, vcount)) |
|
|
|
start = max(0, min(255, start)) # 屏幕编号范围 0~255 |
|
|
|
h_count = max(1, min(16, h_count)) # 最大横向16块屏幕 |
|
|
|
v_count = max(1, min(16, v_count)) # 最大纵向16块屏幕 |
|
|
|
|
|
|
|
# 组装数据包 [AA 55] [Cmd] [Start] [H] [V] [FF] |
|
|
|
# 协议格式: [帧头][命令][起始地址][横向数][纵向数][帧尾] |
|
|
|
frame_head_1 = 0x80 # 帧头1 |
|
|
|
frame_head_2 = 0xD6 # 帧头2 |
|
|
|
frame_tail = 0xFF # 帧尾 |
|
|
|
|
|
|
|
# 构造数据包列表 |
|
|
|
packet = [ |
|
|
|
0xAA, # 帧头1 |
|
|
|
0x55, # 帧头2 |
|
|
|
cmd_type, # 命令字 |
|
|
|
start, # 起始地址 |
|
|
|
hcount, # 横向数量 |
|
|
|
vcount, # 纵向数量 |
|
|
|
0xFF # 帧尾 |
|
|
|
frame_head_1, |
|
|
|
frame_head_2, |
|
|
|
cmd_type, |
|
|
|
start, |
|
|
|
v_count, |
|
|
|
h_count, |
|
|
|
big_pic_id, |
|
|
|
frame_tail |
|
|
|
] |
|
|
|
|
|
|
|
# 转换为字节流 |
|
|
|
# 返回构造完成的数据包 |
|
|
|
return bytes(packet) |
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
print(f"协议封装错误: {e}") |
|
|
|
return None |
|
|
|
raise ValueError("构建拼接指令包失败") from e |