Armadilloフォーラム

ATDE9開発のキーボード検知について

matsui.k

2024年7月22日 10時37分

 お世話になっております。
Windows11 Home 64bitにて、oracle VM VirtualBox7.0でのATDE9の開発についてお伺い致します。

 Armadilloに接続したノートPCのキーボード入力を検知するためにbuttondを使用する事を検討しており、

https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
「6.18.2. USB キーボードの対応」

を参考にキーボードのイベントを確認しようとしたのですが、
buttond -vvv /dev/input/* /dev/input/by-*/*
のコマンドを実行して←キー、↑キー、→キー、↓キーと順に押下したところ、

buttond -vvv /dev/input/* /dev/input/bu-*/*
Skipping directory /dev/inout/by-path
^[[D
^[[A
^[[C
^[[B

と出力されました。
マニュアルの「図6.221 buttond で USB キーボードのイベントを確認する」とは
大きく異なりますが、接続したノートPCのキー入力検知の際は上記マニュアルの手順以外の方法で
キー入力を検知しなければいけないのでしょうか。

また、
buttond -vvv /dev/input/* /dev/input/by-*/*
のコマンドを実行したら
ERROR: File /dev/pint/by-*/* does not exist and we are not in inotify mode
のエラーが出る時がありました。
イベント確認のコマンドを実行する前に行わなければいけない処理や設定等があるという事でしょうか。
もし何らかの設定等がございましたらご教授願えませんでしょうか。

コメント

>  お世話になっております。
> Windows11 Home 64bitにて、oracle VM VirtualBox7.0でのATDE9の開発についてお伺い致します。
>
>  Armadilloに接続したノートPCのキーボード入力を検知するためにbuttondを使用する事を検討しており、

その考え方は誤りです。
buttondはArmadilloに”キーボード”を接続した場合に使うことができます。

ノートPCのキーボードを押したときキー入力が伝わるのはノートPCのCPUであって
Armadilloではありません。

今話されている状況は、PCとArmadilloをUSB経由のシリアルポートで接続しており、
PC上でうごいている仮想コンソールアプリケーションによってシリアルポートへの
キャラクタ通信がArmadilloへ伝わっています。Armadilloに伝わっているのは
キー入力ではありません。

もし、つまりただのシリアル通信です。
シリアルポートからの入力を待ち受けて(つまり単なるCUIアプリですね)
プログラムの実行をしたいのであれば

シェルスクリプトで以下のようなスクリプトを書いてarmadilloで実行すると
良いです。(勿論、この場合PC上で仮想コンソールアプリケーションを開いて
入力可能な状態にしておく必要があります。)

#!/bin/sh
 
echo -n INPUT:
read data
echo $data

ご回答ありがとうございます。

シェルについてはまったくの未経験のため少々難儀致しましたが、
キー入力を検知するスクリプトを作成し、Armadilloで実行させる事でキー入力検知が実現しました。

マニュアルのシェルの記述について1点お伺いしたいのですが、
https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…
図5.8 算術演算の例 にて、
「変数に対して算術演算を行う場合は、$(())構文を使います。」
とありますが、他の方法( 'expr~' や@ ~等)は使用不可、と言う認識でよろしかったでしょうか、

> その考え方は誤りです。
> buttondはArmadilloに”キーボード”を接続した場合に使うことができます。
>
> ノートPCのキーボードを押したときキー入力が伝わるのはノートPCのCPUであって
> Armadilloではありません。
>
> 今話されている状況は、PCとArmadilloをUSB経由のシリアルポートで接続しており、
> PC上でうごいている仮想コンソールアプリケーションによってシリアルポートへの
> キャラクタ通信がArmadilloへ伝わっています。Armadilloに伝わっているのは
> キー入力ではありません。
>
> もし、つまりただのシリアル通信です。
> シリアルポートからの入力を待ち受けて(つまり単なるCUIアプリですね)
> プログラムの実行をしたいのであれば
>
> シェルスクリプトで以下のようなスクリプトを書いてarmadilloで実行すると
> 良いです。(勿論、この場合PC上で仮想コンソールアプリケーションを開いて
> 入力可能な状態にしておく必要があります。)

> キー入力を検知するスクリプトを作成し、Armadilloで実行させる事でキー入力検知が実現しました。

結果報告ありがとうございます。
期待する方向になったようで良かったです。

> マニュアルのシェルの記述について1点お伺いしたいのですが、
> https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…
> 図5.8 算術演算の例 にて、
> 「変数に対して算術演算を行う場合は、$(())構文を使います。」
> とありますが、他の方法( 'expr~' や@ ~等)は使用不可、と言う認識でよろしかったでしょうか、

いいえ、exprも$@も使っても構いません。

$(())はbashで使える文ですが開発ガイドの当該章がbashを基準に書いているため、
「bashでは〜を使います。」という意図になっています。
(exprより柔軟な記述ができて便利、という文脈です。)
$(())を使う場合は、当然レガシーなshでは動かないので、スクリプトのshebangは
#!/bin/bashとする必要があります。

勿論、exprはbashに依存しないため互換性が高くなるため、レガシーなshで
動かす可能性があるならexprがベターです。$@についてはbashでなくても
使えたはずなので、使い分けは気にしなくても良いです。

ご回答ありがとうございます。

 今回作成しましたシェルはレガシーなものではなく至極限定的な検証として使用するため、
開発ガイドに沿ったコードで問題無い認識です。
もし未来でレガシーなシェルを作成する事になった場合は、互換性を考慮してexpr構文にて
構築するよう考慮致します。

解決にご協力頂き、ありがとうございました。今後ともよろしくお願い致します。

安藤と申します。
気になったので書き込みます。

>もし未来でレガシーなシェルを作成する事になった場合は、互換性を考慮してexpr構文にて
>構築するよう考慮致します。

exprは古すぎるため、最近ではPOSIXでそもそも非推奨のようです。
$(())構文が推奨されています。
https://www.shellcheck.net/wiki/SC2003

>The expr utility has a rather difficult syntax [...] In many cases, the arithmetic and string features
>provided as part of the shell command language are easier to use than their equivalents in expr.
>Newly written scripts should avoid expr in favor of the new features within the shell.

ABOSのbusyboxの/bin/shでも、Debianのdashでも$(())算術演算が使えるので、
移植性を考えても、こちらのほうが良いような気がします。

(参照されている古い開発者マニュアルの、Atmark Distのbusyboxだと使えないんですかね?手元にないので確認できませんでした...)