# 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)