Katılım
18 Aralık 2023
Mesajlar
3.030
Makaleler
12
Çözümler
20
Beğeniler
3.643
Yer
Antalya
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.
  1. İlk önce cihazın HID arayüzünü bulduk, tuşa basınca ekrana veri paketlerinin gelmesini sağladık.
  2. 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.)
  3. Sonra bu değeri vJoy programına aktarmaya çalıştık.
  4. 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.
  5. X ve Y ekseni artık W ve S'ye bağlı olarak hareket ediyor ancak saçma bir şekilde hareket ediyor.
  6. 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.
Yani doğru yapamadık. Eksik yaptık. Belki de gönderilen datada başka verileri de ele almamız lazım, bilemiyorum. Ama, bu düşüncemin olumlu sonuçlanacağını düşünüyorum, sonuca yaklaşmış gibi hissediyorum. Sizinle birlikte çözebileceğimizi düşünüyorum.

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ı.")