|
@ -4,3 +4,5 @@
|
||||||
/app/
|
/app/
|
||||||
/main_test.py
|
/main_test.py
|
||||||
/start_test.bat
|
/start_test.bat
|
||||||
|
/start_wec.bat
|
||||||
|
/config_wec.yaml
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
# 编辑好的图片路径
|
||||||
|
IMAGE_PATH: "./image/image_monitor.png"
|
||||||
|
# 串口号
|
||||||
|
COM_PORT: "COM33"
|
||||||
|
# 比特率
|
||||||
|
COM_BAUDRATE: 9600
|
||||||
|
# Android 多点触控数量
|
||||||
|
MAX_SLOT: 12
|
||||||
|
# 检测区域的像素值范围
|
||||||
|
AREA_SCOPE: 50
|
||||||
|
# 检测区域圆上点的数量
|
||||||
|
AREA_POINT_NUM: 8
|
||||||
|
# Android 设备实际屏幕大小 (单位:像素)
|
||||||
|
ANDROID_ABS_MONITOR_SIZE: [ 1600, 2560 ]
|
||||||
|
# Android 设备触控屏幕大小 (单位:像素)
|
||||||
|
ANDROID_ABS_INPUT_SIZE: [ 1600, 2560 ]
|
||||||
|
# 是否开启屏幕反转(充电口朝上时开启该配置)
|
||||||
|
ANDROID_REVERSE_MONITOR: false
|
||||||
|
# touch_thread 是否启用sleep, 默认开启, 如果程序 CPU 占用较高则开启, 如果滑动时延迟极大请关闭
|
||||||
|
TOUCH_THREAD_SLEEP_MODE: true
|
||||||
|
# 每次 sleep 的延迟, 单位: 微秒, 默认 100 微秒
|
||||||
|
TOUCH_THREAD_SLEEP_DELAY: 100
|
||||||
|
|
||||||
|
# RGB 颜色值对应区块配置
|
||||||
|
exp_image_dict:
|
||||||
|
'41-65-93': A1
|
||||||
|
'87-152-13': A2
|
||||||
|
'213-109-81': A3
|
||||||
|
'23-222-55': A4
|
||||||
|
'69-203-71': A5
|
||||||
|
'147-253-55': A6
|
||||||
|
'77-19-35': A7
|
||||||
|
'159-109-79': A8
|
||||||
|
'87-217-111': B1
|
||||||
|
'149-95-154': B2
|
||||||
|
'97-233-9': B3
|
||||||
|
'159-27-222': B4
|
||||||
|
'152-173-186': B5
|
||||||
|
'192-185-149': B6
|
||||||
|
'158-45-23': B7
|
||||||
|
'197-158-219': B8
|
||||||
|
'242-41-155': C1
|
||||||
|
'127-144-79': C2
|
||||||
|
'69-67-213': D1
|
||||||
|
'105-25-130': D2
|
||||||
|
'17-39-170': D3
|
||||||
|
'97-103-203': D4
|
||||||
|
'113-25-77': D5
|
||||||
|
'21-21-140': D6
|
||||||
|
'155-179-166': D7
|
||||||
|
'55-181-134': D8
|
||||||
|
'61-33-27': E1
|
||||||
|
'51-91-95': E2
|
||||||
|
'143-227-63': E3
|
||||||
|
'216-67-226': E4
|
||||||
|
'202-181-245': E5
|
||||||
|
'99-11-183': E6
|
||||||
|
'75-119-224': E7
|
||||||
|
'182-19-85': E8
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 380 KiB |
Before Width: | Height: | Size: 243 KiB |
Before Width: | Height: | Size: 246 KiB |
Before Width: | Height: | Size: 273 KiB |
Before Width: | Height: | Size: 264 KiB |
Before Width: | Height: | Size: 261 KiB |
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 369 KiB |
63
main.py
|
@ -1,5 +1,3 @@
|
||||||
import math
|
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
import subprocess
|
import subprocess
|
||||||
import copy
|
import copy
|
||||||
|
@ -7,6 +5,10 @@ import time
|
||||||
import threading
|
import threading
|
||||||
import queue
|
import queue
|
||||||
import serial
|
import serial
|
||||||
|
import math
|
||||||
|
import yaml
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
# 编辑好的图片路径
|
# 编辑好的图片路径
|
||||||
IMAGE_PATH = "./image/image_monitor.png"
|
IMAGE_PATH = "./image/image_monitor.png"
|
||||||
|
@ -18,10 +20,12 @@ COM_BAUDRATE = 9600
|
||||||
MAX_SLOT = 12
|
MAX_SLOT = 12
|
||||||
# 检测区域的像素值范围
|
# 检测区域的像素值范围
|
||||||
AREA_SCOPE = 50
|
AREA_SCOPE = 50
|
||||||
|
# 检测区域圆上点的数量
|
||||||
|
AREA_POINT_NUM = 8
|
||||||
# Android 设备实际屏幕大小 (单位:像素)
|
# Android 设备实际屏幕大小 (单位:像素)
|
||||||
ANDROID_ABS_MONITOR_SIZE = (1600, 2560)
|
ANDROID_ABS_MONITOR_SIZE = [1600, 2560]
|
||||||
# Android 设备触控屏幕大小 (单位:像素)
|
# Android 设备触控屏幕大小 (单位:像素)
|
||||||
ANDROID_ABS_INPUT_SIZE = (1600, 2560)
|
ANDROID_ABS_INPUT_SIZE = [1600, 2560]
|
||||||
# 是否开启屏幕反转(充电口朝上时开启该配置)
|
# 是否开启屏幕反转(充电口朝上时开启该配置)
|
||||||
ANDROID_REVERSE_MONITOR = False
|
ANDROID_REVERSE_MONITOR = False
|
||||||
# touch_thread 是否启用sleep, 默认开启, 如果程序 CPU 占用较高则开启, 如果滑动时延迟极大请关闭
|
# touch_thread 是否启用sleep, 默认开启, 如果程序 CPU 占用较高则开启, 如果滑动时延迟极大请关闭
|
||||||
|
@ -38,13 +42,13 @@ exp_list = [
|
||||||
["D8", "E1", "E2", "E3", "E4", ],
|
["D8", "E1", "E2", "E3", "E4", ],
|
||||||
["E5", "E6", "E7", "E8", ],
|
["E5", "E6", "E7", "E8", ],
|
||||||
]
|
]
|
||||||
exp_image_dict = {
|
exp_image_dict = {'41-65-93': 'A1', '87-152-13': 'A2', '213-109-81': 'A3', '23-222-55': 'A4', '69-203-71': 'A5',
|
||||||
"61": "A1", "65": "A2", "71": "A3", "75": "A4", "81": "A5", "85": "A6", "91": "A7", "95": "A8",
|
'147-253-55': 'A6', '77-19-35': 'A7', '159-109-79': 'A8', '87-217-111': 'B1', '149-95-154': 'B2',
|
||||||
"101": "B1", "105": "B2", "111": "B3", "115": "B4", "121": "B5", "125": "B6", "130": "B7", "135": "B8",
|
'97-233-9': 'B3', '159-27-222': 'B4', '152-173-186': 'B5', '192-185-149': 'B6', '158-45-23': 'B7',
|
||||||
"140": "C1", "145": "C2",
|
'197-158-219': 'B8', '242-41-155': 'C1', '127-144-79': 'C2', '69-67-213': 'D1', '105-25-130': 'D2',
|
||||||
"150": "D1", "155": "D2", "160": "D3", "165": "D4", "170": "D5", "175": "D6", "180": "D7", "185": "D8",
|
'17-39-170': 'D3', '97-103-203': 'D4', '113-25-77': 'D5', '21-21-140': 'D6', '155-179-166': 'D7',
|
||||||
"190": "E1", "195": "E2", "200": "E3", "205": "E4", "210": "E5", "215": "E6", "220": "E7", "225": "E8",
|
'55-181-134': 'D8', '61-33-27': 'E1', '51-91-95': 'E2', '143-227-63': 'E3', '216-67-226': 'E4',
|
||||||
}
|
'202-181-245': 'E5', '99-11-183': 'E6', '75-119-224': 'E7', '182-19-85': 'E8'}
|
||||||
|
|
||||||
|
|
||||||
class SerialManager:
|
class SerialManager:
|
||||||
|
@ -183,22 +187,28 @@ def microsecond_sleep(sleep_time):
|
||||||
# 选择圆形区域的9个点作为判定
|
# 选择圆形区域的9个点作为判定
|
||||||
def get_colors_in_area(x, y):
|
def get_colors_in_area(x, y):
|
||||||
colors = set() # 使用集合来存储颜色值,以避免重复
|
colors = set() # 使用集合来存储颜色值,以避免重复
|
||||||
num_points = 24 # 要获取的点的数量
|
num_points = AREA_POINT_NUM # 要获取的点的数量
|
||||||
angle_increment = 360.0 / num_points # 角度增量
|
angle_increment = 360.0 / num_points # 角度增量
|
||||||
cos_values = [math.cos(math.radians(i * angle_increment)) for i in range(num_points)]
|
cos_values = [math.cos(math.radians(i * angle_increment)) for i in range(num_points)]
|
||||||
sin_values = [math.sin(math.radians(i * angle_increment)) for i in range(num_points)]
|
sin_values = [math.sin(math.radians(i * angle_increment)) for i in range(num_points)]
|
||||||
|
# 处理中心点
|
||||||
|
if 0 <= x < exp_image_width and 0 <= y < exp_image_height:
|
||||||
|
colors.add(get_color_name(exp_image.getpixel((x, y))))
|
||||||
|
# 处理圆上的点
|
||||||
for i in range(num_points):
|
for i in range(num_points):
|
||||||
dx = int(AREA_SCOPE * cos_values[i])
|
dx = int(AREA_SCOPE * cos_values[i])
|
||||||
dy = int(AREA_SCOPE * sin_values[i])
|
dy = int(AREA_SCOPE * sin_values[i])
|
||||||
px = x + dx
|
px = x + dx
|
||||||
py = y + dy
|
py = y + dy
|
||||||
if 0 <= px < exp_image_width and 0 <= py < exp_image_height:
|
if 0 <= px < exp_image_width and 0 <= py < exp_image_height:
|
||||||
pixel = exp_image.getpixel((px, py))
|
colors.add(get_color_name(exp_image.getpixel((px, py))))
|
||||||
color = str(pixel[0])
|
|
||||||
colors.add(color)
|
|
||||||
return list(colors)
|
return list(colors)
|
||||||
|
|
||||||
|
|
||||||
|
def get_color_name(pixel):
|
||||||
|
return str(pixel[0]) + "-" + str(pixel[1]) + "-" + str(pixel[2])
|
||||||
|
|
||||||
|
|
||||||
def convert(touch_data):
|
def convert(touch_data):
|
||||||
copy_exp_list = copy.deepcopy(exp_list)
|
copy_exp_list = copy.deepcopy(exp_list)
|
||||||
touch_keys = {exp_image_dict[r_str] for i in touch_data if i["p"] for r_str in get_colors_in_area(i["x"], i["y"]) if
|
touch_keys = {exp_image_dict[r_str] for i in touch_data if i["p"] for r_str in get_colors_in_area(i["x"], i["y"]) if
|
||||||
|
@ -261,6 +271,7 @@ def getevent():
|
||||||
try:
|
try:
|
||||||
event = line.decode('utf-8').strip()
|
event = line.decode('utf-8').strip()
|
||||||
_, _, event_type, event_value = event.split()
|
_, _, event_type, event_value = event.split()
|
||||||
|
# print(event_type, int(event_value, 16))
|
||||||
if event_type == 'ABS_MT_POSITION_X':
|
if event_type == 'ABS_MT_POSITION_X':
|
||||||
key_is_changed = True
|
key_is_changed = True
|
||||||
if not ANDROID_REVERSE_MONITOR:
|
if not ANDROID_REVERSE_MONITOR:
|
||||||
|
@ -309,6 +320,28 @@ exp_image_width, exp_image_height = exp_image.size
|
||||||
abs_multi = 1
|
abs_multi = 1
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
yaml_file_path = 'config.yaml'
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
yaml_file_path = sys.argv[1]
|
||||||
|
if os.path.isfile(yaml_file_path):
|
||||||
|
print("使用配置文件:", yaml_file_path)
|
||||||
|
with open(yaml_file_path, 'r', encoding='utf-8') as file:
|
||||||
|
c = yaml.safe_load(file)
|
||||||
|
IMAGE_PATH = c["IMAGE_PATH"]
|
||||||
|
COM_PORT = c["COM_PORT"]
|
||||||
|
COM_BAUDRATE = c["COM_BAUDRATE"]
|
||||||
|
MAX_SLOT = c["MAX_SLOT"]
|
||||||
|
AREA_SCOPE = c["AREA_SCOPE"]
|
||||||
|
AREA_POINT_NUM = c["AREA_POINT_NUM"]
|
||||||
|
ANDROID_ABS_MONITOR_SIZE = c["ANDROID_ABS_MONITOR_SIZE"]
|
||||||
|
ANDROID_ABS_INPUT_SIZE = c["ANDROID_ABS_INPUT_SIZE"]
|
||||||
|
ANDROID_REVERSE_MONITOR = c["ANDROID_REVERSE_MONITOR"]
|
||||||
|
TOUCH_THREAD_SLEEP_MODE = c["TOUCH_THREAD_SLEEP_MODE"]
|
||||||
|
TOUCH_THREAD_SLEEP_DELAY = c["TOUCH_THREAD_SLEEP_DELAY"]
|
||||||
|
exp_image_dict = c["exp_image_dict"]
|
||||||
|
else:
|
||||||
|
print("未找到配置文件, 使用默认配置")
|
||||||
|
|
||||||
abs_multi = calc_abs_x_y()
|
abs_multi = calc_abs_x_y()
|
||||||
print("当前触控区域大小倍数:", abs_multi)
|
print("当前触控区域大小倍数:", abs_multi)
|
||||||
print(('已' if ANDROID_REVERSE_MONITOR else '未') + "开启屏幕反转")
|
print(('已' if ANDROID_REVERSE_MONITOR else '未') + "开启屏幕反转")
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
Pillow
|
Pillow
|
||||||
pyserial
|
pyserial
|
||||||
|
pyyaml
|