android遊戲手柄問題

    新產品(一款android智能機頂盒)需要支持2.4G無線遊戲手柄,這款遊戲手柄是一個接收頭、雙手柄的配置。客戶反饋遊戲搖桿的按鍵有問題,兩個手柄同時將搖桿拉到上方,應用程序的onKeyDown事件中KEYCODE_UP有丟失。對遊戲手柄一無所知,從頭瞭解。

    先用ubuntu調試。先把2.4g接收頭插入PC上的usb接口,dmesg發現這是個hidraw設備,有兩個設備節點被創建了:/dev/input/js0,/dev/input/js1。google下“linux遊戲手柄驅動”,果然發現大把示例代碼。到網上下載遊戲手柄的驅動程序。編譯成可執行文件,cc -o my_joystick my_joystick.c listop.c -lm。運行./my_joystick,開始驗證,可以收到按鍵和搖桿的事件。下載地址(http://download.csdn.net/detail/special_lin/6286457)。

    手柄驅動的關鍵代碼:

rc = ioctl(fd, JSIOCGAXES, &number_of_axes);    //獲取手柄搖桿軸數
rc = ioctl(fd, JSIOCGBUTTONS, &number_of_btns);    //獲取手柄搖桿按鍵個數
i4_rd_bytes = read(i4_fd, &jse, sizeof(struct js_event));    //讀手柄輸入數據
if (jse.type  == JS_EVENT_BUTTON){    //按鍵事件
// ...
}
else if (jse.type == JS_EVENT_AXIS) {   //搖桿事件
//...
}

看驅動代碼大致瞭解了手柄的工作原理。我們使用的Android系統的linux kernel中一般會集成主流設備的驅動程序。以JS_EVENT_AXIS爲線索,果然找到了內核選項INPUT_JOYSTICK。也就是這個選項打開的時候,內核已經支持手柄設備了。

再看Framework中的InputReader,有一個專門處理手柄的類,JoystickInputMapper。當InputEvent 發上來數據的時候,交由JoystickInputMapper處理,JoystickInputMapper在sync的時候,將搖桿事件包裝成爲Android的motion事件。當motion事件沒有被用戶處理到的時候,纔會被轉換爲key event。如何轉換的,這部分代碼還沒有看,轉換的邏輯應該有一些問題,導致有些Key事件發不出來。但是可以確定的是,需要在onGenericMotionEvent處理手柄搖桿事件。


時間緊張,只能簡單記錄。有時鍵再來回頭詳細看這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章