小林です
009で実装中のSysExメッセージに関して相談です。
現状で、SysExメッセージのアドレスは/sysexになっているのですが、他のメッセージと異なり、これだけリプライを返しません。代わりに、I/Oモジュール側からSysExメッセージが来たとき、同じ/sysexでメッセージが飛んできます。
これらは全くもって非対称で、両者の数はほとんどの場合一致しません。この点に関して、以下のように変更したいと思うのですが、いかがでしょうか?
・ホストPC→I/Oモジュールへのメッセージは/sysex/request
・I/Oモジュール→ホストPCへのメッセージは/sysex/reply
理由としては
・/sysexメッセージの形式に問題があってサーバがリジェクトした場合、それをクライアントに返す手段が無い
・AS3ライブラリはサーバに対するコール&レスポンスで同期化を実現しているが、このメッセージに関してだけイレギュラーになってしまう
ということです。もし、非同期にしたい場合には単に戻ってくる/sysex/requestを無視するだけでOKです。
既に実装をしていただいたライブラリ側の変更はアドレス名だけで済むはずです。もし問題なければサーバ側の実装とRubyライブラリでの動作検証を行おうと思いますが、もし何かお気づきの点などあればお知らせいただけると嬉しいです。
追伸
先日の厚木でのワークショップで、たまたま参加者の方からリクエストがあって予定外で紹介しようとしたAS3版のI2Cがうまく動かない…と悩んでいました。
その原因がこれで、AS3ライブラリで最初の/sysexを送った後でTaskに対してコールバックを設定して待ちに入ってしまい、それ以降のI2Cリクエストが送信できていませんでした。
ざっくりテストした際に動いたように見えていたのは、たまたまその直前にRubyライブラリでテストしたものがそのまま有効になっていただけだったということのようです。お恥ずかしい…。
小林です
追加でお知らせです。
Firmata開発メンバーのHansからの提案を受け、SysEx I2Cで使用しているメッセージを変更しました。
http://funnel.googlecode.com/svn-history/r535/trunk/documents/firmata_i2c_proposal.txt
http://code.google.com/p/funnel/source/detail?r=534
これに伴うサーバ側の変更はすませてありますので、お手数ですが、今後のテストは新しいファームウェアで行っていただけますでしょうか。
これに関して、ライブラリ側での変更は基本的に必要ないはずです。しかし、もしSysExのコマンドバイトが0x76かどうかで判断するような処理を入れていらっしゃったようでしたら、その部分を0x77に変更していただければと思います。
・・・
こうしたことを考えると、せっかくある程度高レベルで記述できるOSCを使っているのですから
/sysex/request
/sysex/reply
ではなく
/sysex/request/i2c
/sysex/reply/i2c
のようにしてしまったほうが、Firmataの実装の細かな変化に影響されなくていいかもしれませんね…。
・・・
あと、I2CDeviceを継承したクラスのコンストラクタに与えるIOModuleのインスタンスの件ですが、普段ioModule()メソッドが登場しないArduinoでいきなりこれが登場するのも不親切かなと思いましたので、AS3ライブラリでは次のような変更を加えてIOModuleのインスタンスだけでなく、IOSystemのインスタンスも渡せるようにしました。
2008/12/2 Shigeru Kobayashi <koto...@gmail.com>:
rubyでも動作確認できないのですが、PinとPortの変更以外の変更点は
PCからI2Cデバイスへは0x76を/sysex/requestにおくる
値を受取るときは 0x77が/sysex/replyに来るものを読む
という2点だけでしょうか?
あとついでに、arduino.rbの31行目がPort::DINになっています。
遠藤孝則
2008/12/07 12:24 Shigeru Kobayashi <koto...@gmail.com>:
--
endo takanori
小林です
> rubyでも動作確認できないのですが、PinとPortの変更以外の変更点は
>
> PCからI2Cデバイスへは0x76を/sysex/requestにおくる
> 値を受取るときは 0x77が/sysex/replyに来るものを読む
>
> という2点だけでしょうか?
はい、そうです。どのレベルでうまく動いていないでしょうか?
送信のみ動く/受信のみ動くなどあれば教えてください。
> あとついでに、arduino.rbの31行目がPort::DINになっています。
すみません、こちらは修正しておきます。
2008/12/15 takanori endo <sweeta...@gmail.com>:
FirmataIo.javaのsendSystemExclusiveMessage()
でI2C_REQUESTは、届いているようで、
slaveAddressもreadWriteModeも正しくとどいています。
逆にprocessInput()ないで見張っていると
processSystemExclusiveData()が実行されていないようなので
サーバーの返事がない状態だと思います。
コンパスの回路は、同じなので問題ないと思います。
今のところreadWriteModeを1で毎回送っています。
2008/12/15 16:28 Shigeru Kobayashi <koto...@gmail.com>:
--
endo takanori
あ、Arduino側のファームは新しい物にしていただけましたでしょうか?
外していたらすみませんが、ねんのため確認をお願いします。
2008/12/15 takanori endo <sweeta...@gmail.com>:
その後初代でもうまくいきました。
ファームの書き込みがうまくいっていなかったのでしょうか。
とにかくありがとうございました。
もうすこし、Pinの名前変更とFioの対応のほうも、早めにやります
遠藤孝則
2008/12/15 16:49 Shigeru Kobayashi <koto...@gmail.com>:
--
endo takanori
FioとArduinoはおなじSimpleI2CFirmataで確認しました。
コンパスは
ArduinoとFioの両方でサンプルを作っています
もうすこしサンプルは増やしたいです
遠藤孝則
2008/12/15 17:18 takanori endo <sweeta...@gmail.com>:
--
endo takanori
小林です
おつかれさまでした。ドキュメントの微修正を行い、009b2としてリリースしました。
http://code.google.com/p/funnel/downloads/list
特にこのご問題がなければ、AXISでのワークショップではこのバージョンを使おうと思います。また何かもしあればお知らせします。お忙しい中の対応、ありがとうございました。
2008/12/17 takanori endo <sweeta...@gmail.com>:
遠藤孝則
2008/12/17 22:24 Shigeru Kobayashi <koto...@gmail.com>:
--
endo takanori