Compare commits
4 Commits
1d0d6d0b9f
...
ui
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4a5a0a584 | ||
| 520b8818cd | |||
|
|
5ecc0f2bf5 | ||
|
|
809d07256a |
2
.idea/huojv.iml
generated
2
.idea/huojv.iml
generated
@@ -2,7 +2,7 @@
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<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" />
|
||||
</component>
|
||||
</module>
|
||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -3,5 +3,5 @@
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="D:\CONDA\anaconda3" />
|
||||
</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>
|
||||
30
config.json
30
config.json
@@ -2,22 +2,42 @@
|
||||
"groups": [
|
||||
{
|
||||
"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_baudrate": 9600,
|
||||
"camera_index": 0,
|
||||
"camera_width": 1920,
|
||||
"camera_height": 1080,
|
||||
"move_velocity": 470,
|
||||
"active": true
|
||||
"move_velocity": 360,
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"preview_width": 1920,
|
||||
"preview_height": 1080,
|
||||
"preview_columns": 1,
|
||||
"preview_rows": 1,
|
||||
"preview_columns": 2,
|
||||
"preview_rows": 2,
|
||||
"show_preview": true,
|
||||
"preview_multi_window": false,
|
||||
"preview_use_all_groups": false
|
||||
"preview_use_all_groups": true
|
||||
}
|
||||
}
|
||||
103
main_single.py
103
main_single.py
@@ -133,25 +133,76 @@ def run_automation_for_group(group_index):
|
||||
best_point = p
|
||||
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):
|
||||
k = k % 4
|
||||
suiji_t = float(random.randint(10, 13) / 10)
|
||||
if k == 0:
|
||||
keyboard.send_data("66")
|
||||
if safe_keyboard_send("66"):
|
||||
time.sleep(suiji_t)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
elif k == 1:
|
||||
keyboard.send_data("88")
|
||||
if safe_keyboard_send("88"):
|
||||
time.sleep(suiji_t)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
elif k == 2:
|
||||
keyboard.send_data("44")
|
||||
if safe_keyboard_send("44"):
|
||||
time.sleep(suiji_t)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
elif k == 3:
|
||||
keyboard.send_data("22")
|
||||
if safe_keyboard_send("22"):
|
||||
time.sleep(suiji_t)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
return k + 1
|
||||
|
||||
def move_to(rw, mb):
|
||||
@@ -159,22 +210,22 @@ def run_automation_for_group(group_index):
|
||||
nonlocal v
|
||||
v = group['move_velocity']
|
||||
if rw[0] >= mb[0]:
|
||||
keyboard.send_data("44")
|
||||
if safe_keyboard_send("44"):
|
||||
time.sleep(float(abs(rw[0] - mb[0]) / v))
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
else:
|
||||
keyboard.send_data("66")
|
||||
if safe_keyboard_send("66"):
|
||||
time.sleep(float(abs(rw[0] - mb[0]) / v))
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
|
||||
if rw[1] >= mb[1]:
|
||||
keyboard.send_data("88")
|
||||
if safe_keyboard_send("88"):
|
||||
time.sleep(float(abs(rw[1] - mb[1]) / v))
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
else:
|
||||
keyboard.send_data("22")
|
||||
if safe_keyboard_send("22"):
|
||||
time.sleep(float(abs(rw[1] - mb[1]) / v))
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
|
||||
# 主循环
|
||||
print(f"🔄 配置组 {group['name']} 开始自动化循环...")
|
||||
@@ -225,9 +276,9 @@ def run_automation_for_group(group_index):
|
||||
elif detections['npc4'] is not None:
|
||||
if sq(detections['npc4'], rw) < 50:
|
||||
print(f"[{group['name']}] 离npc4很近 直接进入")
|
||||
keyboard.send_data("DD")
|
||||
if safe_keyboard_send("DD"):
|
||||
time.sleep(0.15)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
time.sleep(1)
|
||||
im_opencv = get_image.get_frame()
|
||||
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:
|
||||
move_to(rw, process_points(detections['daojv']))
|
||||
for i in range(3 + len(detections['daojv'])):
|
||||
keyboard.send_data("AA")
|
||||
if safe_keyboard_send("AA"):
|
||||
time.sleep(0.15)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
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:
|
||||
print(f"[{group['name']}] 识别到可以退出挑战!!!!!!!!!!!!!!!!!!")
|
||||
@@ -328,9 +379,9 @@ def run_automation_for_group(group_index):
|
||||
panduan = True
|
||||
move_to(rw, detections['next'])
|
||||
for i in range(2):
|
||||
keyboard.send_data("DD")
|
||||
if safe_keyboard_send("DD"):
|
||||
time.sleep(0.15)
|
||||
keyboard.release()
|
||||
safe_keyboard_release()
|
||||
continue
|
||||
else:
|
||||
k = move_randomly(rw, k)
|
||||
@@ -348,6 +399,14 @@ def run_automation_for_group(group_index):
|
||||
traceback.print_exc()
|
||||
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 len(sys.argv) > 1:
|
||||
group_index = int(sys.argv[1])
|
||||
|
||||
Reference in New Issue
Block a user