mieki256's diary



2021/03/08(月) [n年前の日記]

#1 [hsp][raspberrypi][linux] hsp3dish.cppをもう少し修正して動作確認

Raspberry Pi版HSPがキーボードやマウスを検出できない件についてもう少し追試。

_先日修正した内容 では、入力機器が type == 1 and (code == 0 or code == 1) を返してきた時にマウス入力がおかしくなりそうな気配がするわけで。本当は、もうちょっと、入力値をちゃんと解析しないといかんよなと。

ちゃんと対応させるためには、手持ちの各入力機器がどういう値を返してくるのか、調べないといけない。

幸い、Linux には evtest というツールがあって、それを使うと、各機器がどんな値を返してくるのか一覧表示してくれる。また、実際にキーを叩いたりマウスを動かしたりすると、その時の値を出力してくれるので、それらを眺めて動作確認できる。

ということで、調べてみた結果は以下。タッチパッドを操作したり、キーを叩いたり、マウスを動かしたりして、どんな値が返ってくるのか記録してみた。

_Logicool K400r (event-mouse)
_BUFFALO BSKBW03WH (event-kbd)
_BUFFALO BSKBW03WH (event-mouse)
_A4TECH XL-755BK (event-kbd)
_A4TECH XL-755BK (event-mouse)
_Lenovo KU-1255 (event-kbd)
_Lenovo KU-1255 (event-mouse)

それぞれ、Linux Input Subsystem という仕組みで値を返してくるわけだけど、そのあたりは以下のページの説明が分かりやすかった。ありがたや。

_Linux Input Subsystemの使い方

返してくる値は、linux/input.h というファイルで定義されているらしい。

_linux/input.h at master - spotify/linux

さておき。手持ちの機器を調べた範囲では…。 そういう値を返してくるのは間違いなさそうだなと…。妙な値を返してくるヤツが居たりしないかと不安だったけど、そんな機器は居なかった。

であれば、OpenHSP/src/hsp3dish/raspbian/hsp3dish.cpp の updateKeyboard() 内は、以下のように書けそうかなと…。

_hsp3dish.cpp
_hsp3dish.cpp.diff
static void updateKeyboard( void )
{
    int rd;
    int sx,sy;
    if (devIdx <= 0) return;

    sx = (int)mem_engine.width;
    sy = (int)mem_engine.height;

    // Read events from keyboard or mouse
    for (int idx = 0; idx < devIdx; idx ++) {
        if (devFd[idx] == -1) continue;

        rd = read(devFd[idx], ev, sizeof(ev));
        if (rd <= 0) continue;

        int count, n;
        struct input_event *evp;

        count = rd / sizeof(struct input_event);
        n = 0;
        while(count--) {
            evp = &ev[n++];

            switch(evp->type) {
                case EV_SYN:
                    break;

                case EV_KEY:
                    // check keyboard
                    if (( evp->code >= 0 )&&( evp->code < KEY_MAX )) {
                        key_map[evp->code] = evp->value;
                    }

                    if((evp->code == KEY_ESC) && (evp->value == 1)) {
                        quit_flag = 1;
                    }
                
                    // check mouse button
                    if(evp->code == BTN_LEFT)  {
                        //printf("Left button(%d)\n",evp->value);
                        mouse_btn1 = evp->value;
                    }
        
                    if(evp->code == BTN_RIGHT)  {
                        //printf("Right button(%d)\n",evp->value);
                        mouse_btn2 = evp->value;
                    }
                    break;

                case EV_REL:
                    if(evp->code == REL_X) {
                        // Mouse move Left/Right
                        //printf("Mouse moved left/right %d\n",evp->value);
                        mouse_x += evp->value;
                        if ( mouse_x < 0 ) mouse_x = 0;
                        if ( mouse_x >= sx ) mouse_x = sx-1;
                    }
        
                    if(evp->code == REL_Y) {
                        // Mouse move Up/Down
                        //printf("Mouse moved up/down %d\n",evp->value);
                        mouse_y += evp->value;
                        if ( mouse_y < 0 ) mouse_y = 0;
                        if ( mouse_y >= sy ) mouse_y = sy-1;
                    }
                    break;

                default:
                    break;
            }
        }
    }
}

switch - case を使って、evp->type の種類によって処理を分けるように書いてしまっても問題無いだろう…。また、hsp3dish.cpp の最初のあたりで、linux/input.h を include しているようなので、EV_KEY, EV_REL, REL_X, REL_Y 等のシンボルを使って記述してもいいのではないか。そのほうが可読性はちょっとだけ良くなるはず。

この状態でビルドして動作確認してみたけれど、手持ちのキーボードやマウスに関しては、どれも動作してくれたので、こういう書き方・処理内容で、おそらく問題無いのだろう…。

ただ、タッチパネルを使っている環境で HSP を動かしたときは困りそうだなと…。おそらく、タッチパネルの場合は、type == EV_ABS を返してきそうな気がする…。EV_ABS が来た場合については処理を記述してないので、無反応になるのではないか…。自分、タッチパネルは持っていないので、そのあたりの実験・動作確認はできないのだよな…。

余談。 :

キーボードなのに event-mouse を返してきたり、マウスなのに event-kbd を返してきたりする製品があるのは何故だろう。

これは根拠がない勝手な想像だけど、もしかすると、それら製品のコントローラ部分が、複合キーボード・マウスにも対応できる機能を持っているから、ではないのかなと…。

ひょっとすると、それらキーボードにポインティングデバイスも追加してみたり、あるいはマウスにキー入力用のボタンを追加してみたら、複合キーボード・複合マウスとしてもあっさり使えてしまうのかもしれない。分解してみたら、基板上に、それら付加機能にも対応させる回路パターンまで存在するのかもしれないよなと。ただ、自分が入手した各製品については、コスト的な問題や、商品展開の関係で、キーボード単体、マウス単体としてのハードウェアしか用意してなかっただけ、ではあるまいか…。

考えてみたら、キーボードにしか使えないコントローラや、マウスにしか使えないコントローラを設計製造するよりも、キーボードにもマウスにも使えるコントローラを作ってしまって、それをどの製品にも組み込んで設計製造したほうがコスト削減できるよなと…。いや、分からんけど。でも、たぶん、そういうことなんじゃないかと。

となると、安い製品だから変な情報は返してこないはずだ、と思い込んで実装するのは危ないかもしれない。安い製品だからこそ、実際には載ってないハードウェアの情報まで何故か返してくるかもよ、と若干疑いながらソースを書いておいたほうが安全だったりするのだろうなと思えてきたりもして。

一応issueを投稿しておいた。 :

_onitama/OpenHSP に、一応このあたりの内容を _投稿しておいた。 とメモ。

もっとも、「そんな変態キーボード・変態マウスにまで対応させる気はありません」とか「どれも今では入手できない製品ですよね? 無視します」と書かれて放置されてもおかしくない話かもしれんなあ、とも…。 *1

*1: ただ…。 _2017年頃 に自分が HSP を触ってみて、「アレ? ESCキーもCtrl+Cも受け付けないぞ? キー入力すらまともに動かないなんて、これは鋭意開発中ってことだな…」と思って放置して、そこから数年間そのまま、という流れを思い返すと…。修正対応できるなら、したほうがいいよな…。自分以外にも、「HSP使えねー。キーボードすら反応しねー」と思ってしまってHSPを窓から投げ捨てていた人が居てもおかしくないわけで。

#2 [pc][nitijyou] 白いノートPCを少しだけメンテナンス

階下・茶の間に置いてある、お袋さん用の白いノートPC、FUJITSU LIFEBOOK AH33/J (FMVA33JW1) を、親父さんが久々に起動してみたらしいのだけど。「いつまで経っても起動しない」と苦情が。

確認してみたら、一応起動はするようだけど、ログイン画面・サインイン画面が出てくるまで、たしかに数分かかる…。しかも、親父さんの Microsoftアカウントでサインインしようとすると、3〜5分ぐらいかかる…。

ローカルアカウントに切り替えてみたら、1分ぐらいでサインインできるようになった。しかし、それでも遅い。

HDDが壊れかけているのだろうか…。と思っていたけれど、シャットダウンしようとしたら「更新して再起動」の文字が。ああ、なるほど。久々に電源を入れたから、Windows Update で大量にファイルをDLしていて遅くなってたのかもしれんなと…。もっとも、Celeron B820 1.7GHz という遅いCPUが載ってるPCだし、SSDじゃなくてHDDだから、通常時からしてサクサク動くわけもないのだけど。

このノートPC、バッテリーが完全に死んでいるので交換すべきかどうか悩むけど、もはやどこにも売ってないであろう予感もあるし、交換したところでこのスペックではなあ、という気もするし。

でも、当時の日本製ノートPCなだけあって、Microsoft Office がプリインストールされてるし、年賀状ソフトやらDVD再生ソフトやら、色々プリインストールされているのだよな…。捨てるとしても、そこだけは、なんだかもったいない…。どうしたもんか…。

バッテリーの型番が分からない。 :

バッテリーの型番について調べてみたけど、これがなんだかよく分からない…。

本体についているのは、 Product No. : FPCBP342、P/N : FMVNBP212、10.8V 24Wh(2200mAh) とあるけれど、富士通 WEB MARTで、の _バッテリー商品一覧 上で、型番: FMVA33JW1 で検索してみると FMVNBP189 と出てくる。そして FMVNBP189 の対応機種の中に AH33/J なんて無い。

_[富士通WEB MART] アクセサリー・周辺機器(オプション) : 富士通 を眺めても、AH33/J という型番は無いし…。というか多過ぎ。型番多過ぎ。

#3 [nitijyou] 歯が痛い

昨日、一昨日から、左上の奥歯の前あたりがなんだかしくしくと痛い。虫歯の進行が進んだのか、それとも歯茎が弱ってるのか分からんけれど…。

数日後に、メンテナンスとして歯医者の予約は入れているけれど、そこではメンテナンスの時間しか確保してないだろうから、虫歯だった場合の治療は別途予約を入れないといかんわけで。とは言え、現状では、何が原因で痛んでいるのか分からんし…。

コロナウイルスが流行しているこんな時期に、通院回数を増やしたくはないのだけど、しかし放置していても虫歯が治るはずもなく。どうしたもんか。

以上、1 日分です。

過去ログ表示

Prev - 2021/03 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project