Compare commits

...

4 Commits

Author SHA1 Message Date
Administrator
f4a5a0a584 配置提交 2025-11-13 11:28:08 +08:00
ray
520b8818cd 修复键鼠冲突 2025-11-12 00:48:26 +08:00
Administrator
5ecc0f2bf5 配置提交 2025-11-10 22:45:13 +08:00
Administrator
809d07256a 配置提交 2025-11-10 22:44:54 +08:00
4 changed files with 119 additions and 40 deletions

2
.idea/huojv.iml generated
View File

@@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4"> <module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.9" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.12 virtualenv at C:\Users\Administrator\Downloads\huojv\huojv\.venv" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

2
.idea/misc.xml generated
View File

@@ -3,5 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="D:\CONDA\anaconda3" /> <option name="sdkName" value="D:\CONDA\anaconda3" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 virtualenv at C:\Users\Administrator\Downloads\huojv\huojv\.venv" project-jdk-type="Python SDK" />
</project> </project>

View File

@@ -2,22 +2,42 @@
"groups": [ "groups": [
{ {
"name": "服务器", "name": "服务器",
"serial_port": "COM17",
"serial_baudrate": 9600,
"camera_index": 1,
"camera_width": 1920,
"camera_height": 1080,
"move_velocity": 470,
"active": true
},
{
"name": "2号机",
"serial_port": "COM14",
"serial_baudrate": 9600,
"camera_index": 2,
"camera_width": 1920,
"camera_height": 1080,
"move_velocity": 360,
"active": false
},
{
"name": "3号机",
"serial_port": "COM16", "serial_port": "COM16",
"serial_baudrate": 9600, "serial_baudrate": 9600,
"camera_index": 0, "camera_index": 0,
"camera_width": 1920, "camera_width": 1920,
"camera_height": 1080, "camera_height": 1080,
"move_velocity": 470, "move_velocity": 360,
"active": true "active": false
} }
], ],
"display": { "display": {
"preview_width": 1920, "preview_width": 1920,
"preview_height": 1080, "preview_height": 1080,
"preview_columns": 1, "preview_columns": 2,
"preview_rows": 1, "preview_rows": 2,
"show_preview": true, "show_preview": true,
"preview_multi_window": false, "preview_multi_window": false,
"preview_use_all_groups": false "preview_use_all_groups": true
} }
} }

View File

@@ -133,25 +133,76 @@ def run_automation_for_group(group_index):
best_point = p best_point = p
return best_point return best_point
def safe_keyboard_send(data, max_retries=3):
"""安全的键盘发送函数,带重试机制"""
nonlocal keyboard
for attempt in range(max_retries):
try:
keyboard.send_data(data)
return True
except (serial.serialutil.SerialException, PermissionError, OSError) as e:
if attempt < max_retries - 1:
print(f"⚠️ 键盘发送失败 (尝试 {attempt + 1}/{max_retries}): {e}")
time.sleep(0.1 * (attempt + 1)) # 递增延迟
# 尝试重新初始化串口
try:
if serial.ser and serial.ser.is_open:
serial.ser.close()
time.sleep(0.2)
init_mouse_keyboard(group)
# 重新创建keyboard对象
keyboard = ch9329Comm.keyboard.DataComm()
except Exception as init_e:
print(f"⚠️ 重新初始化串口失败: {init_e}")
else:
print(f"❌ 键盘发送失败,已重试 {max_retries} 次: {e}")
raise
return False
def safe_keyboard_release(max_retries=3):
"""安全的键盘释放函数,带重试机制"""
nonlocal keyboard
for attempt in range(max_retries):
try:
keyboard.release()
return True
except (serial.serialutil.SerialException, PermissionError, OSError) as e:
if attempt < max_retries - 1:
time.sleep(0.1 * (attempt + 1))
# 尝试重新初始化串口
try:
if serial.ser and serial.ser.is_open:
serial.ser.close()
time.sleep(0.2)
init_mouse_keyboard(group)
keyboard = ch9329Comm.keyboard.DataComm()
except Exception as init_e:
print(f"⚠️ 重新初始化串口失败: {init_e}")
else:
print(f"⚠️ 键盘释放失败: {e}")
# 释放失败不算致命错误,继续执行
return False
return False
def move_randomly(rw, k): def move_randomly(rw, k):
k = k % 4 k = k % 4
suiji_t = float(random.randint(10, 13) / 10) suiji_t = float(random.randint(10, 13) / 10)
if k == 0: if k == 0:
keyboard.send_data("66") if safe_keyboard_send("66"):
time.sleep(suiji_t) time.sleep(suiji_t)
keyboard.release() safe_keyboard_release()
elif k == 1: elif k == 1:
keyboard.send_data("88") if safe_keyboard_send("88"):
time.sleep(suiji_t) time.sleep(suiji_t)
keyboard.release() safe_keyboard_release()
elif k == 2: elif k == 2:
keyboard.send_data("44") if safe_keyboard_send("44"):
time.sleep(suiji_t) time.sleep(suiji_t)
keyboard.release() safe_keyboard_release()
elif k == 3: elif k == 3:
keyboard.send_data("22") if safe_keyboard_send("22"):
time.sleep(suiji_t) time.sleep(suiji_t)
keyboard.release() safe_keyboard_release()
return k + 1 return k + 1
def move_to(rw, mb): def move_to(rw, mb):
@@ -159,22 +210,22 @@ def run_automation_for_group(group_index):
nonlocal v nonlocal v
v = group['move_velocity'] v = group['move_velocity']
if rw[0] >= mb[0]: if rw[0] >= mb[0]:
keyboard.send_data("44") if safe_keyboard_send("44"):
time.sleep(float(abs(rw[0] - mb[0]) / v)) time.sleep(float(abs(rw[0] - mb[0]) / v))
keyboard.release() safe_keyboard_release()
else: else:
keyboard.send_data("66") if safe_keyboard_send("66"):
time.sleep(float(abs(rw[0] - mb[0]) / v)) time.sleep(float(abs(rw[0] - mb[0]) / v))
keyboard.release() safe_keyboard_release()
if rw[1] >= mb[1]: if rw[1] >= mb[1]:
keyboard.send_data("88") if safe_keyboard_send("88"):
time.sleep(float(abs(rw[1] - mb[1]) / v)) time.sleep(float(abs(rw[1] - mb[1]) / v))
keyboard.release() safe_keyboard_release()
else: else:
keyboard.send_data("22") if safe_keyboard_send("22"):
time.sleep(float(abs(rw[1] - mb[1]) / v)) time.sleep(float(abs(rw[1] - mb[1]) / v))
keyboard.release() safe_keyboard_release()
# 主循环 # 主循环
print(f"🔄 配置组 {group['name']} 开始自动化循环...") print(f"🔄 配置组 {group['name']} 开始自动化循环...")
@@ -225,9 +276,9 @@ def run_automation_for_group(group_index):
elif detections['npc4'] is not None: elif detections['npc4'] is not None:
if sq(detections['npc4'], rw) < 50: if sq(detections['npc4'], rw) < 50:
print(f"[{group['name']}] 离npc4很近 直接进入") print(f"[{group['name']}] 离npc4很近 直接进入")
keyboard.send_data("DD") if safe_keyboard_send("DD"):
time.sleep(0.15) time.sleep(0.15)
keyboard.release() safe_keyboard_release()
time.sleep(1) time.sleep(1)
im_opencv = get_image.get_frame() im_opencv = get_image.get_frame()
if im_opencv and shizi.daoying(im_opencv[0]): if im_opencv and shizi.daoying(im_opencv[0]):
@@ -271,9 +322,9 @@ def run_automation_for_group(group_index):
if len(detections['daojv']) != 0: if len(detections['daojv']) != 0:
move_to(rw, process_points(detections['daojv'])) move_to(rw, process_points(detections['daojv']))
for i in range(3 + len(detections['daojv'])): for i in range(3 + len(detections['daojv'])):
keyboard.send_data("AA") if safe_keyboard_send("AA"):
time.sleep(0.15) time.sleep(0.15)
keyboard.release() safe_keyboard_release()
continue continue
if shizi.tuichu(im_opencv[0]) and detections['next'] is None and len(detections['daojv']) == 0 and len(detections['gw']) == 0 and boss_pd: if shizi.tuichu(im_opencv[0]) and detections['next'] is None and len(detections['daojv']) == 0 and len(detections['gw']) == 0 and boss_pd:
print(f"[{group['name']}] 识别到可以退出挑战!!!!!!!!!!!!!!!!!!") print(f"[{group['name']}] 识别到可以退出挑战!!!!!!!!!!!!!!!!!!")
@@ -328,9 +379,9 @@ def run_automation_for_group(group_index):
panduan = True panduan = True
move_to(rw, detections['next']) move_to(rw, detections['next'])
for i in range(2): for i in range(2):
keyboard.send_data("DD") if safe_keyboard_send("DD"):
time.sleep(0.15) time.sleep(0.15)
keyboard.release() safe_keyboard_release()
continue continue
else: else:
k = move_randomly(rw, k) k = move_randomly(rw, k)
@@ -348,6 +399,14 @@ def run_automation_for_group(group_index):
traceback.print_exc() traceback.print_exc()
time.sleep(1) time.sleep(1)
# 清理资源
try:
if serial.ser and serial.ser.is_open:
serial.ser.close()
print(f"✅ 配置组 {group['name']} 串口已关闭")
except Exception as e:
print(f"⚠️ 关闭串口时出错: {e}")
if __name__ == "__main__": if __name__ == "__main__":
if len(sys.argv) > 1: if len(sys.argv) > 1:
group_index = int(sys.argv[1]) group_index = int(sys.argv[1])