update v0.1.0

- 使用三通道颜色值定位,防止杂色干扰
pull/7/head
ERR0RPR0MPT 2024-04-14 07:03:19 +08:00
parent 2ab5c4d4cd
commit d8d0414080
13 changed files with 111 additions and 16 deletions

2
.gitignore vendored
View File

@ -4,3 +4,5 @@
/app/ /app/
/main_test.py /main_test.py
/start_test.bat /start_test.bat
/start_wec.bat
/config_wec.yaml

59
config.yaml 100644
View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 369 KiB

63
main.py
View File

@ -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 '') + "开启屏幕反转")

View File

@ -1,2 +1,3 @@
Pillow Pillow
pyserial pyserial
pyyaml