Setelah membahas teardown Vstroker pada jurnal sebelumnya, kini akan dibahas mengenai antarmuka perangkat Vstroker dengan sistem operasi GNU/Linux. Sebenarnya sudah ada yang membuat antarmuka antara Vstroker dan sistem operasi GNU/Linux, yaitu libvstroker yang memanfaatkan python dan module hid yang menggunakan library hidapi. Namun, karena sesuatu hal tidak dapat berjalan dengan lancar pada sistem yang saya gunakan, sehingga harus menempuh jalan lain. Oleh karena itu, tutorial ini akan memanfaatkan python dan modul PyUSB yang menggunakan libusb. Berikut ini adalah langkah-langkahnya:

  • Lakukan instalasi libusb terlebih dahulu jika sistem yang Anda gunakan belum memilikinya. Pada distro Fedora, cukup lakukan dengan perintah:
$ sudo dnf install libusbx
  • Setelah itu, lakukan instalasi PyUSB menggunakan PIP:
$ sudo pip install pyusb
  • Setelah kedua proses di atas selesai, maka lanjutkan dengan membuat script python yang akan mengambil input yang diterima oleh USB dongle Vstroker. Script tersebut berbasis pada tutorial Linux, HID and PyUSB, dengan sedikit modifikasi, diantaranya mengubah nilai idVendor dan idProduct. Berikut ini adalah script yang digunakan:
#!/usr/bin/env python
import sys, usb.core

dev = usb.core.find(idVendor=0x0451, idProduct=0x55a5)
if dev is None:
    sys.exit("No Panic button found in the system");

try:
   if dev.is_kernel_driver_active(0) is True:
       dev.detach_kernel_driver(0)
except usb.core.USBError as e:
   sys.exit("Kernel driver won't give up control over device: %s" % str(e))

try:
   dev.set_configuration()
   dev.reset()
except usb.core.USBError as e:
   sys.exit("Cannot set configuration the device: %s" % str(e))

endpoint = dev[0][(0,0)][0]
while 1:
    try:
        data = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, timeout=10000)
        if data is not None and len(data) > 2:
            sys.stdout.write(''.join(chr(c).encode('hex') for c in data) + '\r')
            sys.stdout.flush()
    except (usb.core.USBError, KeyboardInterrupt):
        sys.exit('punt!')
  • Script tersebut perlu dijalankan sebagai administrator (root), karena script tersebut akan mengambil alih kendali dari default driver di kernel. Simpan script tersebut dengan nama vstroker.py dan jalankan dengan perintah seperti ini:
$ sudo ./vstroker.py
6fc4f6e6f618f6313b77

Ketika dijalankan, maka script tersebut akan menghasilkan output dalam format hexadesimal seperti yang dapat dilihat pada potongan output di atas. Selanjutnya, kita akan mengubah script di atas, dengan memanfaatkan informasi yang terdapat pada libvstroker dan menyesuaikannya dengan script yang kita gunakan pada tutorial ini karena menggunakan libusbx. Library tersebut memiliki informasi yang dapat digunakan untuk parsing data dari vstroker. Berikut ini adalah script vstroker.py yang telah dilengkapi dengan parsing yang akan menampilkan koordinat sumbu X, Y dan Z dalam format yang lebih mudah dibaca, dimana jika koordinatnya melebihi 0xff, maka akan ditampilkan dengan nilai -1:

#!/usr/bin/env python
import sys
import time
import usb.core

dev = usb.core.find(idVendor=0x0451, idProduct=0x55a5)
if dev is None:
    sys.exit("No Panic button found in the system");

try:
   if dev.is_kernel_driver_active(0) is True:
       dev.detach_kernel_driver(0)
except usb.core.USBError as e:
   sys.exit("Kernel driver won't give up control over device: %s" % str(e))

try:
   dev.set_configuration()
   dev.reset()
except usb.core.USBError as e:
   sys.exit("Cannot set configuration the device: %s" % str(e))

endpoint = dev[0][(0,0)][0]
while 1:
    try:
        data = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, timeout=10000)
        if data is not None and len(data) > 2:
            axis = []
            xor_byte = data[0]
            for i in range(3):
                a = (((data[(i*2)+1] & 0xf) << 4) | (data[(i*2)+1] >> 4)) ^ xor_byte
                b = (((data[(i*2)+2] & 0xf) << 4) | (data[(i*2)+2] >> 4)) ^ xor_byte
                c = a | b << 8
                if c > 0xff:
                    c = -1
                axis.append(c)
            sys.stdout.write("X: " + str(axis[0]) + " Y: " + str(axis[1]) + " Z: " + str(axis[2]) + (" "*10) + "\r")
            sys.stdout.flush()

    except (usb.core.USBError, KeyboardInterrupt):
        sys.exit('punt!')

Simpan potongan kode di atas sebagai vstroker.py (timpa script yang lama), lalu jalankan, maka hasilnya kurang lebih seperti ini:

$ sudo ./vstroker.py
X: 35 Y: 1 Z: 238

Selanjutnya, kita dapat membuat aplikasi yang dapat melakukan respon dengan memanfaatkan informasi koordinat sumbu X, Y dan Z tersebut. Hal tersebut akan dibahas pada tutorial yang akan datang. Sekian tutorial singkat kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, om Wella yang sudah menyumbangkan perangkat untuk di-oprek, dan Anda yang telah membaca tutorial ini.