Aula Win68 HE model manyetik switch klavye satın aldım. Aklıma bu takıldı. Çünkü bazı pahalı klavyelerin yazılımları bu desteği veriyor yani tuş ile hassas şekilde gaz/fren kullanımı yapılabiliyor. E bu klavye de sonuçta manyetik. Tuşa basmadaki analog değeri bir şekilde klavye algılıyor ve ona göre tuş aktifleşiyor. Ama tabi Windows'a bu dijital bir değer olarak gidiyor. Yazılımda da tuşa basma değeri mm cinsinden gözükyor yani bu değerin analog verisi de bir şekilde Windows'a ulaşıyor diye düşündüm. Hangi veri nereden bulmam lazım falan Gemini ile bir şeyler yapmaya çalıştım.
Klavyedeki W ve S tuşlarından gelen analog bilginin vJoy programında eksene dönüştürülmesini sağlayan son python kodu bu şekilde:
- İlk önce cihazın HID arayüzünü bulduk, tuşa basınca ekrana veri paketlerinin gelmesini sağladık.
- Bu veri paketlerinden hangi değerin analog değer olduğunu bulduk. (9. ve 18. sıradaki sayı 0 ila 255 arasında basmaya bağlı değişiyor.)
- Sonra bu değeri vJoy programına aktarmaya çalıştık.
- Birkaç kere olmadı. Tüm tuşların basması aynı ekseni oynatıyordu. Veri paketlerine tekrar dönüp tuşların hangisinin olduğunu anlamak için sayılara tekrar baktık ve sadece W ve S için kodu düzenledik.
- X ve Y ekseni artık W ve S'ye bağlı olarak hareket ediyor ancak saçma bir şekilde hareket ediyor.
- Basınca bir şeyler algılıyor, ama hemen sıfırlanıyor. Bırakırken tekrar bir şeyler algılıyor ve sıfırlanıyor. Lineer bir ilerleme ve gerileme olmuyor yani.
Klavyedeki W ve S tuşlarından gelen analog bilginin vJoy programında eksene dönüştürülmesini sağlayan son python kodu bu şekilde:
Kod:
import pywinusb.hid as hid
import pyvjoy
import time
# 1. vJoy Cihazını Başlat (Device 1)
vj = None
try:
if hasattr(pyvjoy, 'PyVJoyDevice'):
vj = pyvjoy.PyVJoyDevice(1)
elif hasattr(pyvjoy, 'vJoyDevice'):
vj = pyvjoy.vJoyDevice(1)
else:
vj = pyvjoy._sdk
vj.AcquireVJD(1)
print("[BAŞARILI] vJoy Device 1 aktif.")
except Exception as e:
print(f"[HATA] vJoy Bağlantı Hatası: {e}")
exit()
# Cihaz Filtresi (Aula WIN68 HE)
devices = hid.HidDeviceFilter(vendor_id=0x2e3c, product_id=0xc365).get_devices()
print("[BİLGİ] Kesintisiz Analog Sensör Dinleyici Aktif.")
print("-> W Tuşu: Gaz (X Axis)")
print("-> S Tuşu: Fren (Y Axis)\n")
def data_handler(data):
try:
if len(data) >= 10:
key_id = data[8] # Tuş Kimliği
raw_val = data[9] # Canlı Basış Derinliği (0-255)
# Basış Oranlama (0.0 - 1.0 arası)
# raw_val doğrudan basış derinliğidir
norm_val = min(max(raw_val / 255.0, 0.0), 1.0)
vjoy_val = int(norm_val * 32766) + 1
# W Tuşu (Key ID 2) -> Gaz (X Eksen)
if key_id == 2:
if hasattr(vj, 'set_axis'):
vj.set_axis(pyvjoy.HID_USAGE_X, vjoy_val)
else:
vj.SetAxis(vjoy_val, 1, 0x30)
# S Tuşu (Key ID 3 ve 7. İndeks 3) -> Fren (Y Eksen)
elif key_id == 3 and data[7] == 3:
if hasattr(vj, 'set_axis'):
vj.set_axis(pyvjoy.HID_USAGE_Y, vjoy_val)
else:
vj.SetAxis(vjoy_val, 1, 0x31)
except Exception:
pass
for dev in devices:
try:
dev.open()
dev.set_raw_data_handler(data_handler)
except Exception:
pass
try:
while True:
time.sleep(0.005) # 200 Hz yüksek güncelleme hızı
except KeyboardInterrupt:
print("\n[BİLGİ] Kapatıldı.")