2

この質問は、レゴ マインドストーム ロボットの NXT ブロックと通信するアプリケーションの作成に関するものです。

私がしたいこと

NXC (厳密には C ではなく、NXT 用のプログラムを作成するための言語) は、条件が true と評価されるuntil(condition)まで待機する関数を提供します。Bluetoothメッセージングプロトコルを使用してこれを実装し、AndroidアプリケーションからBluetooth経由でNXTと通信したいと考えています。

これまでにできること:

入力クエリ メッセージ ( ) を送信できます。このメッセージは、 の入力getInputValue(int in)現在のステータスを求めるメッセージを NXT に送信します。次に、NXT はこの情報を含むメッセージを送り返します。この情報は、最後に要求された入力値を保持するグローバル変数に書き込まれます ( と呼びましょう)。myValue

問題は何ですか:

私はレゴ MINDroid アプリケーションの一部を使用しています。このクラスには、NXT との直接通信を処理する別の通信スレッドがあります。メッセージを受信すると、 を介してメイン スレッドに転送しますHandler。この問題は、応答を待ってビジー状態にしようとすると発生します。

while(myValue != valueIWant) {
  sleep(100);
  getInputValue(in);
}

ハンドラが実際にメッセージを受信しないように、メイン スレッドがビジー状態になります。通信スレッドは NXT からメッセージを受信し、それらをメイン スレッドに転送しますが、ハンドラーは他の処理を行っているため呼び出されません。

これを回避する最善の方法は何ですか? メッセージの受信も停止するため、スレッドを待機させることはできません:(

任意の提案をいただければ幸いです! また、喜んでコードの詳細を説明します。

役に立つかもしれないリンク

http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/main.html

http://github.com/NXT/LEGO-MINDSTORMS-MINDdroid

http://mindstorms.lego.com/en-us/support/files/default.aspx (Bluetooth ドキュメント用)

4

1 に答える 1

1

コールバックを使用して解決しました:)必要に応じて詳しく説明してください。

編集:(返信が遅くなってすみません!)

最終的に、コールバック プロシージャを実装し、「コールバック」関数をいくつかのリストに追加しました。ハンドラーがメッセージを受信すると、コールバックのリストを調べ、受信したメッセージが存在するコールバック関数のいずれかと一致するかどうかを確認します。一致する場合は、コールバック内でメソッドを実行します。

次に、これらのコールバックの周りにクラスを作成し、そこで実行キュー (doA; doB; doC;) を作成し、それらをコールバック チェーン (callBack({doA; callBack({doB; call...})) にラップします。 }))、実際には非同期で動作しているのに、同期環境で動作しているという印象を与えました。

于 2012-08-09T16:06:34.693 に答える