akif999 / drivers

TinyGo drivers for sensors and other devices that use I2C, SPI, GPIO, ADC, and UART interfaces.
https://tinygo.org
BSD 3-Clause "New" or "Revised" License
3 stars 0 forks source link

Tx method #5

Closed akif999 closed 1 year ago

akif999 commented 1 year ago

https://github.com/akif999/drivers/issues/2#issuecomment-1414572421 より、要件は以下の引用の通り。

(2) 送信 I/F が先頭 3byte を addr + ch として扱う固定送信モードを前提とした送信 I/F となっているので改善する トランスペアレントモードか否かで先頭に addr + ch を設定するかを分岐するようにする

sago35 commented 1 year ago

Configure() の引数に machine.PinMode を渡してるけど、 out / out / in にしか設定予定はないと思うので引数にする理由はないかな、と思います。 一方で SetMode(Mode0) にしているけど、その部分こそ引数にすべきなのでは? SetMode するごとに 30ms 待ってしまうので。

akif999 commented 1 year ago

https://github.com/akif999/drivers/pull/5#issuecomment-1423455735

c816575b309c6b0462a5f4465bdc3e5fb223ac05 にて対応しました。

Configure() の引数に machine.PinMode を渡してるけど、 out / out / in にしか設定予定はないと思うので引数にする理由> はないかな、と思います。

どこかで Pulldown するか否かをユーザーで決めれられた方がよい、みたいなコメントをいただいて変えた記憶なのですが、どんな話だったか忘れてしまいました。 再考すると ↑ の通り out / out / in しかないと考えられるため、固定に変更しました。

一方で SetMode(Mode0) にしているけど、その部分こそ引数にすべきなのでは? SetMode するごとに 30ms 待ってしまうので。

起動時の Mode を引数とするように変更しました。

sago35 commented 1 year ago

Makefile の smoke-test に ./examples/e220 以下を追加してください。 現状、 rx 側のビルドが通らないはず。

akif999 commented 1 year ago

Makefile の smoke-test に ./examples/e220 以下を追加してください。 現状、 rx 側のビルドが通らないはず。

一旦 a445b1a839dfdb8182c5e42350e1c2b6c38e5dbe へ commit できていなかった変更を push しました。 続けて 39e9f5f7b50d38e979eb3f21ba3a809637c94b79 にて smoketest を追加しました。

akif999 commented 1 year ago

https://github.com/akif999/drivers/pull/5#discussion_r1100962681 に関連して。 return を入れるように修正したことで以下がわかったので対応しました。

Device.Configure() にてE220 の起動時の Mode を設定するよう c816575b309c6b0462a5f4465bdc3e5fb223ac05 にて変更していましたが、Configure の中で SetMode すると、その後すぐに E220 へ UART 送信するとギリギリ E220 の起動時のシーケンス完了より早くなってしまい、examples の ReadConfig の処理が失敗していることがわかりました(下図参照)。

よって対策として以下の commit で Device.Write() 同様にAUX Pin を監視してデバイス送受信可能になってから UART.Write() するように変更しました。 162b07fac227c9752d3dca1af9a6754e1a5936e8 (これで SetMode の 30ms 待ちも特に意味はなくなるので、削除してもよいかもしれません)

image

sago35 commented 1 year ago

Aux ピンで見れるならそれで OK ですね。 その場合、いったんは Aux ピン必須、としておくのがよさそう。 ※ Aux を machine.NoPin にするアイディアがあったが、いったん取りやめたほうがよさそう

akif999 commented 1 year ago

Aux ピンで見れるならそれで OK ですね。 その場合、いったんは Aux ピン必須、としておくのがよさそう。 ※ Aux を machine.NoPin にするアイディアがあったが、いったん取りやめたほうがよさそう

Aux Pin 必須は、example のコメントとして足す、という対応で良さそうでしょうか。 (Device.New をする時点の引数 aux は nullable な値でなく、あり/なしのチェックができないためこの対応くらいかなと考えました)

akif999 commented 1 year ago

e14f7eebcbc1cd413bcbf40ad630b4a3a507fbff にて buildtag を足しました。 これで machine package がないことによる fail はしなくなりましたが、unittest でこけている状態です。 まだ以下のメッセージで何がこけているかが理解できていないのでもう少し確認します。

ok      tinygo.org/x/drivers/tester 0.003s
FAIL
make: *** [Makefile:270: unit-test] Error 1
Error: Process completed with exit code 2.
akif999 commented 1 year ago

Aux ピンで見れるならそれで OK ですね。 その場合、いったんは Aux ピン必須、としておくのがよさそう。 ※ Aux を machine.NoPin にするアイディアがあったが、いったん取りやめたほうがよさそう

Aux Pin 必須は、example のコメントとして足す、という対応で良さそうでしょうか。 (Device.New をする時点の引数 aux は nullable な値でなく、あり/なしのチェックができないためこの対応くらいかなと考えました)

試しに各処理の wait 処理をすべて削除してみたところ、E220 起動時前の AUX Pin の状態を読んですぐに送信を開始してしまっている。 よって、Configure の際に起動時間 + 10ms 程度待ってから処理を開始するようにした方が良さそう。 (これでもリセットスタート後の「プログラム実行開始」よりも「3v Pin からの電流出力開始」が極端に遅い、というようなマイコンが存在しない限りは問題ないと考られる)

image

↑ の考えに沿って wait 処理を最適化した commit を以下で積みました。 52265ee16b7aaf5ba97ee35bb545f365351a6ccb

sago35 commented 1 year ago

上記以外は良さそう。

akif999 commented 1 year ago

追加で不要な buildtag の削除を commit した。 それ以外は解決済みのため merge する。