diff --git a/.gitignore b/.gitignore index 65bd646..907fa47 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ /app/ /main_test.py /start_test.bat +/start_wec.bat +/config_wec.yaml diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..ec231a4 --- /dev/null +++ b/config.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 diff --git a/getevent.py b/example/getevent.py similarity index 100% rename from getevent.py rename to example/getevent.py diff --git a/image/color_exp_panel.png b/image/color_exp_panel.png index c568385..c395d19 100644 Binary files a/image/color_exp_panel.png and b/image/color_exp_panel.png differ diff --git a/image/image_monitor.png b/image/image_monitor.png index 3ae9515..968da55 100644 Binary files a/image/image_monitor.png and b/image/image_monitor.png differ diff --git a/image/image_monitor_bigger.png b/image/image_monitor_bigger.png deleted file mode 100644 index 2440db6..0000000 Binary files a/image/image_monitor_bigger.png and /dev/null differ diff --git a/image/image_monitor_bigger_bigger.png b/image/image_monitor_bigger_bigger.png deleted file mode 100644 index 20e49af..0000000 Binary files a/image/image_monitor_bigger_bigger.png and /dev/null differ diff --git a/image/image_monitor_edit.png b/image/image_monitor_edit.png deleted file mode 100644 index c040f0c..0000000 Binary files a/image/image_monitor_edit.png and /dev/null differ diff --git a/image/image_monitor_edit2.png b/image/image_monitor_edit2.png deleted file mode 100644 index 5981b6c..0000000 Binary files a/image/image_monitor_edit2.png and /dev/null differ diff --git a/image/image_monitor_edit3.png b/image/image_monitor_edit3.png deleted file mode 100644 index 446c280..0000000 Binary files a/image/image_monitor_edit3.png and /dev/null differ diff --git a/image/image_monitor_high.png b/image/image_monitor_high.png index ae8c598..c758bce 100644 Binary files a/image/image_monitor_high.png and b/image/image_monitor_high.png differ diff --git a/main.py b/main.py index b4270bf..2a623d0 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,3 @@ -import math - from PIL import Image import subprocess import copy @@ -7,6 +5,10 @@ import time import threading import queue import serial +import math +import yaml +import os +import sys # 编辑好的图片路径 IMAGE_PATH = "./image/image_monitor.png" @@ -18,10 +20,12 @@ COM_BAUDRATE = 9600 MAX_SLOT = 12 # 检测区域的像素值范围 AREA_SCOPE = 50 +# 检测区域圆上点的数量 +AREA_POINT_NUM = 8 # Android 设备实际屏幕大小 (单位:像素) -ANDROID_ABS_MONITOR_SIZE = (1600, 2560) +ANDROID_ABS_MONITOR_SIZE = [1600, 2560] # Android 设备触控屏幕大小 (单位:像素) -ANDROID_ABS_INPUT_SIZE = (1600, 2560) +ANDROID_ABS_INPUT_SIZE = [1600, 2560] # 是否开启屏幕反转(充电口朝上时开启该配置) ANDROID_REVERSE_MONITOR = False # touch_thread 是否启用sleep, 默认开启, 如果程序 CPU 占用较高则开启, 如果滑动时延迟极大请关闭 @@ -38,13 +42,13 @@ exp_list = [ ["D8", "E1", "E2", "E3", "E4", ], ["E5", "E6", "E7", "E8", ], ] -exp_image_dict = { - "61": "A1", "65": "A2", "71": "A3", "75": "A4", "81": "A5", "85": "A6", "91": "A7", "95": "A8", - "101": "B1", "105": "B2", "111": "B3", "115": "B4", "121": "B5", "125": "B6", "130": "B7", "135": "B8", - "140": "C1", "145": "C2", - "150": "D1", "155": "D2", "160": "D3", "165": "D4", "170": "D5", "175": "D6", "180": "D7", "185": "D8", - "190": "E1", "195": "E2", "200": "E3", "205": "E4", "210": "E5", "215": "E6", "220": "E7", "225": "E8", -} +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'} class SerialManager: @@ -183,22 +187,28 @@ def microsecond_sleep(sleep_time): # 选择圆形区域的9个点作为判定 def get_colors_in_area(x, y): colors = set() # 使用集合来存储颜色值,以避免重复 - num_points = 24 # 要获取的点的数量 + num_points = AREA_POINT_NUM # 要获取的点的数量 angle_increment = 360.0 / 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)] + # 处理中心点 + 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): dx = int(AREA_SCOPE * cos_values[i]) dy = int(AREA_SCOPE * sin_values[i]) px = x + dx py = y + dy if 0 <= px < exp_image_width and 0 <= py < exp_image_height: - pixel = exp_image.getpixel((px, py)) - color = str(pixel[0]) - colors.add(color) + colors.add(get_color_name(exp_image.getpixel((px, py)))) return list(colors) +def get_color_name(pixel): + return str(pixel[0]) + "-" + str(pixel[1]) + "-" + str(pixel[2]) + + def convert(touch_data): 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 @@ -261,6 +271,7 @@ def getevent(): try: event = line.decode('utf-8').strip() _, _, event_type, event_value = event.split() + # print(event_type, int(event_value, 16)) if event_type == 'ABS_MT_POSITION_X': key_is_changed = True if not ANDROID_REVERSE_MONITOR: @@ -309,6 +320,28 @@ exp_image_width, exp_image_height = exp_image.size abs_multi = 1 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() print("当前触控区域大小倍数:", abs_multi) print(('已' if ANDROID_REVERSE_MONITOR else '未') + "开启屏幕反转") diff --git a/requirements.txt b/requirements.txt index 556ed6e..cbe2cc7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ Pillow -pyserial \ No newline at end of file +pyserial +pyyaml \ No newline at end of file