138 lines
5.3 KiB
Python
138 lines
5.3 KiB
Python
# import serial
|
|
# import pyvjoy
|
|
# import re
|
|
# import time
|
|
# import sys
|
|
|
|
# # ========== НАСТРОЙКИ ПОРТА ==========
|
|
# COM_PORT = 'COM7' # Ваш порт
|
|
# BAUD_RATE = 115200
|
|
# VJOY_DEVICE_ID = 1
|
|
|
|
# # ========== ИНВЕРСИЯ ОСЕЙ ==========
|
|
# INVERT_STEER = True # True = инвертировать направление руля
|
|
# INVERT_THROTTLE = True # True = при нажатии газа крестик идёт ВВЕРХ (исправляет "опускается вниз")
|
|
# INVERT_BRAKE = True # True = при нажатии тормоза ось Z растёт от 0, а не стоит в максимуме
|
|
|
|
# # ========== КАЛИБРОВКА ОСЕЙ ==========
|
|
# STEER_RAW_MIN = 462
|
|
# STEER_RAW_CENTER = 512
|
|
# STEER_RAW_MAX = 562
|
|
|
|
# # Значения, полученные вами в режиме отладки
|
|
# THROTTLE_RAW_MIN = 490 # Педаль отпущена
|
|
# THROTTLE_RAW_MAX = 650 # Педаль нажата
|
|
|
|
# BRAKE_RAW_MIN = 300 # Педаль отпущена
|
|
# BRAKE_RAW_MAX = 110 # Педаль нажата
|
|
|
|
# # ========== ФУНКЦИИ ==========
|
|
# def map_value(x, in_min, in_max, out_min, out_max):
|
|
# if in_min == in_max:
|
|
# return (out_min + out_max) // 2
|
|
# val = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
|
|
# return int(max(min(val, out_max), out_min))
|
|
|
|
# def calibrate_steer(raw):
|
|
# if raw <= STEER_RAW_CENTER:
|
|
# return map_value(raw, STEER_RAW_MIN, STEER_RAW_CENTER, -32768, 0)
|
|
# else:
|
|
# return map_value(raw, STEER_RAW_CENTER, STEER_RAW_MAX, 0, 32767)
|
|
|
|
# def calibrate_axis(raw, raw_min, raw_max, invert):
|
|
# val = map_value(raw, raw_min, raw_max, 0, 32767)
|
|
# if invert:
|
|
# val = 32767 - val
|
|
# return val
|
|
|
|
# def open_serial_port(port, baudrate, timeout=2, retries=3):
|
|
# for attempt in range(retries):
|
|
# try:
|
|
# ser = 0#serial.Serial(port, baudrate, timeout=timeout)
|
|
# print(f"✅ Подключено к {port} на скорости {baudrate}")
|
|
# return ser
|
|
# except serial.SerialException as e:
|
|
# print(f"⚠️ Попытка {attempt+1}/{retries}: не удалось открыть порт {port}")
|
|
# print(f" Ошибка: {e}")
|
|
# time.sleep(2)
|
|
# print("❌ Не удалось открыть порт.")
|
|
# sys.exit(1)
|
|
|
|
# DEBUG_MODE = False # Включите для отладки, чтобы увидеть сырые значения
|
|
|
|
# def main():
|
|
# ser = open_serial_port(COM_PORT, BAUD_RATE)
|
|
# time.sleep(2)
|
|
|
|
# try:
|
|
# joy = pyvjoy.VJoyDevice(VJOY_DEVICE_ID)
|
|
# print("🎮 Виртуальный джойстик vJoy инициализирован")
|
|
# except Exception as e:
|
|
# print(f"❌ Ошибка vJoy: {e}")
|
|
# sys.exit(1)
|
|
|
|
# print("🚀 Скрипт запущен. Ожидание данных...")
|
|
# if DEBUG_MODE:
|
|
# print("🔧 РЕЖИМ ОТЛАДКИ\n")
|
|
# else:
|
|
# print(" Нажмите Ctrl+C для выхода.\n")
|
|
|
|
# try:
|
|
# while True:
|
|
# line_bytes = ser.readline()
|
|
# if not line_bytes:
|
|
# continue
|
|
# line = line_bytes.decode('utf-8', errors='ignore').strip()
|
|
# if not line:
|
|
# continue
|
|
|
|
# match = re.search(r'STEER:(\d+)\s+THROTTLE:(\d+)\s+BRAKE:(\d+)', line)
|
|
# if not match:
|
|
# if DEBUG_MODE:
|
|
# print(f"[DEBUG] {line}")
|
|
# continue
|
|
|
|
# steer_raw = int(match.group(1))
|
|
# throttle_raw = int(match.group(2))
|
|
# brake_raw = int(match.group(3))
|
|
|
|
# if DEBUG_MODE:
|
|
# print(f"RAW: STEER={steer_raw:4d} | THROTTLE={throttle_raw:4d} | BRAKE={brake_raw:4d}")
|
|
# continue
|
|
|
|
# steer = calibrate_steer(steer_raw)
|
|
# throttle = calibrate_axis(throttle_raw, THROTTLE_RAW_MIN, THROTTLE_RAW_MAX, INVERT_THROTTLE)
|
|
# brake = calibrate_axis(brake_raw, BRAKE_RAW_MIN, BRAKE_RAW_MAX, INVERT_BRAKE)
|
|
|
|
# # Преобразуем steer из -32768..32767 в 0..32767 для vJoy
|
|
# steer_vjoy = map_value(steer, -32768, 32767, 0, 32767)
|
|
|
|
# # ИНВЕРСИЯ РУЛЯ
|
|
# if INVERT_STEER:
|
|
# steer_vjoy = 32767 - steer_vjoy
|
|
|
|
# joy.set_axis(pyvjoy.HID_USAGE_X, steer_vjoy)
|
|
# joy.set_axis(pyvjoy.HID_USAGE_Y, throttle)
|
|
# joy.set_axis(pyvjoy.HID_USAGE_Z, brake)
|
|
|
|
# except KeyboardInterrupt:
|
|
# print("\n🛑 Остановка пользователем.")
|
|
# except Exception as e:
|
|
# print(f"\n❌ Ошибка: {e}")
|
|
# finally:
|
|
# if 'ser' in locals() and ser.is_open:
|
|
# ser.close()
|
|
# print("🔌 Порт закрыт.")
|
|
# if 'joy' in locals():
|
|
# joy.set_axis(pyvjoy.HID_USAGE_X, 16384) # центр
|
|
# joy.set_axis(pyvjoy.HID_USAGE_Y, 0) # газ отпущен
|
|
# joy.set_axis(pyvjoy.HID_USAGE_Z, 0) # тормоз отпущен
|
|
# print("🎮 Джойстик сброшен.")
|
|
# sys.exit(0)
|
|
|
|
# if __name__ == "__main__":
|
|
# main()
|
|
|
|
from utils import devices
|
|
|
|
print(devices.list_com_ports()[0].name) |