Mengontrol Input Monitor dengan Gamepad

Saat ini saya memakai 3 komputer sekaligus: PC Windows di samping meja, Mac Mini M1, dan Rock 5B (saya bahas di posting blog ini). Saya memakai monitor Philips 278E 4K, yang memiliki 3 input: DisplayPort (DP), HDMI 1 dan HDMI2. Saya sering kesal: tidak mudah pindah input monitor .

Tiga komputer

Memindah input monitor perlu menekan tombol kecil, butuh banyak langkah , dan response monitornya sangat lama. Selain itu jika monitor masih menampilkan tulisan di layar (OSD/on screen display), maka tombol yang ditekan akan diabaikan.

Monitor Philips 4K

Kontroller KidStation

Saya menemukan controller KidStation di toko barang bekas sudah agak lama, tapi belum saya manfaatkan. Konektor ujungnya kompatibel dengan PS1. Ini bisa dihubungkan ke PC dengan adaptor sehingga bisa dibaca sebagai gamepad USB. Saya cek bahwa benda ini bisa dibeli di Shopee (Thailand) dengan harga kurang dari 150 ribu rupiah.

Dengan membuat program singkat dalam Go, saya sekarang bisa mengontrol perpindahan monitor dengan menekan tombol besar di KidStation. Tombolnya saya taruh di lantai, jadi pakai kaki mencetnya.

DDC, MCC, VCP

Sekarang akan saya jelaskan cara kerjanya. Untuk kebanyakan monitor yang relatif baru (5-10 tahun terakhir), kita bisa mengontrol input monitor melalui DDC (Data Display Channel) untuk mengirimkan MCC (Monitor Control Command). Tepatnya lagi ini dilakukan dengan mengirimkan kode untuk menulis VCP (Virtual Control Panel) 0x60.

Cara termudah untuk mengetest ini adalah dengan program winddcutil di Windows atau ddcutil di Linux. Pertama download programnya, lalu jalankan:

winddcutil.exe capabilities 0

Jika punya lebih dari 1 monitor, ganti 0 dengan indeks monitor. Di monitor saya, hasilnya:

(prot(monitor)type(LCD)model(328E1C)cmds(01 02 03 07 0C E3 F3)vcp(02 04 05 08 0B 0C 10 12 14(01 04 05 06 07 08 0A 0B) 16 18 1A 52 54(00 01) 60( 11 12 0F) 62(00 01) 6C 6E 70 72(05 78 FB 50 64 78 8C A0) 86(01 02 08) 87 8D(00 01) AC AE B2 B6 C0 C6 C8 CA(01 02) CC(01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 12 14 16 17 1A 1E 24) D6(01 04 05) DC(00 01 02 03 05 08) DF E9(00 02) EB(00 01 02 03) F0(00 01) FD FF)mswhql(1)asset_eep(40)mccs_ver(2.2))

Perhatikan bagian VCP (tebal) di bagian yang saya warnai merah. Terlihat angka di sebelah kanan 60 adalah daftar input yang bisa dipilih (11 12 dan 0F). Kita bisa melihat input saat ini dengan:

winddcutil.exe getvcp 0 60 (ganti 0 dengan indeks monitor)

Akan muncul teks diplay saat ini, misalnya VCP 60 f. Anda harus coba-coba untuk mencari tahu tiap nilai mewakili input yang mana. Di monitor saya f artinya Display Port, 11 artinya HDMI 1 dan 12 artinya HDMI 2.

Dan untuk berpindah input, gunakan:

winddcutil.exe setvcp 0 60 0f (ganti 0 dengan indeks monitor, dan 0f denfan input yang diiinginkan).

Golang

Sekarang untuk bagian program Go-nya: saya tidak ingin ribet memprogram DDC langsung, jadi saya panggil saja program winddcutil. Jadi berikutnya kita hanya perlu membaca Gamepad, ini bisa dilakukan dengan library joystick.

Saya mencoba mengubah program ini menjadi Windows service, tapi walau sudah diset bisa berinteraksi dengan desktop, tapi ternyata gagal menulis ke DDC. Karena tidak ingin repot, saya ubah agar program berjalan di systray (bagian kanan taskbar Windows). Ini mudah dilakukan dengan package systray.

Jangan lupa mengcompile programnya sebagai aplikasi GUI agar tidak muncul Window. Ini bisa dilakukan dengan:

go build -ldflags -H=windowsgui

Jadi sekarang untuk pindah monitor dari PC, Mac dan Rock5B, saya cukup menekan tombol dengan kaki. Jika ingin memindahkan input USB, saya perlu menekan USB switcher untuk input berikut. Berikut ini kodenya apa adanya, path saya hardcode, nilai input HDMI monitor saya juga saya hardcode, jadi dibaca dulu kodenya kalau ingin modifikasi ini.

https://gist.github.com/yohanes/5f85a3435f113a2215c4e6c7ffef2951

Alternatif: USB Switch + display_switch

Sebelum beralih coding sendiri, saya memakai program display_switch. Program ini bisa otomatis memindah input jika terjadi perubahan USB yang dicabut/colok. Saya memakai USB switcher jadi bisa menggunakan tiga komputer tapi satu keyboard/mouse.

Device yang saya pakai seperti ini
Konfigurasi dengan USB switch

Display Switch

Sebelum minggu lalu, saya memakai program bernama display-switch. Program ini sangat praktis: jika USB terdeteksi (atau dicabut), maka switch input monitor otomatis ke input tertentu. Program ini bekerja di Windows, Linux dan macOS, tapi sayangnya belum bisa di Mac Mini M1 .

Mac Mini M1 belum disupport

Andaikan semua PC/Mac/Linux mendukung display-switch, maka teorinya kita bisa menginstall di semua PC/Mac/Linux, lalu ketika USB di-switch ke komputer tersebut, komputer akan minta agar inputnya juga diswitch ke input yang sesuai.

Karena Mac Mini M1 tidak didukung oleh display_switch, dan tadinya saya hanya memakai PC dan Mac, maka saya hanya install display-switch di PC. Saya membuat konfigurasi: jika USB dicolok (artinya USB switch sedang diarahkan ke PC), maka switch input monitor agar menampilkan PC, dan jika USB dicabut (pasti USB switch diarahkan ke Mac), maka set input monitor ke Mac. Sejak menambah Rock 5B, saya tidak lagi bisa menggunakan cara ini.

Penutup

Tulisan ini isinya sekedar keisengan yang saya lakukan, sebagai catatan pribadi, tapi mungkin bisa berguna juga bagi orang lain.

Sekedar catatan: mungkin akan lebih gampang kalau di masa depan saya menggunakan langsung switch KVM yang mendukung HDMI jadi bisa langsung switch banyak device. Saya sering mengalami masalah dengan HDMI switcher ketika menghubungkan beberapa desktop, kadang gambar tidak muncul, hilang, bersemut dsb terutama jika semua device on.

Masalah terakhir yang saya alami adalah dengan KVM, Mac Mini M1 saya layarnya akan mati sebentar, lalu nyala lagi. Cukup banyak orang mengalami masalah semacam ini di Mac Mini M1, tapi di kasus saya hanya terjadi jika memakai KVM, jika memakai koneksi langsung ke layar, maka tidak pernah terjadi, jadi sekarang ini setting ini masih paling optimal untuk saya.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.