New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mbBleUartRx.writeValue の Promise が解決しないことがある #5
Comments
この問題、可能性があることは認識していましたがテストできるものがなかったため放置していました。 |
学生の環境では発生していたのですが私の方でコード書いて試してみたら microbit 本体もブレークアウトボードも学生が使っていた同じ個体で試して見ても再現しませんでした。。。
再現できる環境を見つけたらまたお知らせします。。。 |
実行環境の OS, Chrome, Bluetooth Driver 等に依存する問題かも知れないです。。。 |
micro:bit側のブリッジソフトに手を入れて、時々即座に値が返らないようにして、例外の実装を試みてみますね。 |
30c19b9 実際に起きた問題が再現できていないので、本当にISSUEが消えたとは言いにくいですが、ひとまずこれでISSUEをCloseします。 同種の問題が再現したら再開しましょう。 |
BME280 を microbit 経由で利用した場合に温度センサーの値が最初は読めるが数回目で読めなくなる問題が発生している。原因としては
の Promise がいつまで待っても解決しない状態になっている。readData() から順に元を辿ると最終的に processNextQueue() が Bluetooth API の writeValue() の Promise が解決しないケースが発生している。現在のコードでは一度でも writeValue() が解決しないケースが発生するとキューは貯まりっぱなしで何も処理できなくなる。
microbit 側のデバッグが出来ないのだけど通信速度やキューが溢れてたりするんじゃないかと想定し、応急処置として writeValue 前に sleep(50) 入れれば BME280 の読み出しが安定するようになった。
但し writeValue 毎に sleep 入れるのは流石に通信速度低下が激しい (#4 もある) ので、前回のキュー呼び出し時の時刻を記録して一定時間以内に呼ばれた場合だけ sleep を入れるとか最小限のオーバーヘッドにしたい。
あるいは microbit 側のコードでもっと賢い対処が出来るのかも知れないがそこについては未確認。
また、writeValue が解決しないことが再発したときに全てが止まらないようにする&原因不明とならないようにするため、一定時間以内に writeValue が解決しないときにエラーとして例外を発生させるべき。
ref:
https://github.com/chirimen-oh/chirimen-raspi3/tree/master/gc/contrib/examples/i2c-BME280
https://codesandbox.io/s/github/chirimen-oh/chirimen-raspi3/tree/master/gc/contrib/examples/i2c-BME280?module=main.js
The text was updated successfully, but these errors were encountered: