Skip to content
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

Closed
dynamis opened this issue Aug 25, 2019 · 5 comments
Closed
Labels
bug Something isn't working

Comments

@dynamis
Copy link
Contributor

dynamis commented Aug 25, 2019

BME280 を microbit 経由で利用した場合に温度センサーの値が最初は読めるが数回目で読めなくなる問題が発生している。原因としては

await bme280.readData()

の Promise がいつまで待っても解決しない状態になっている。readData() から順に元を辿ると最終的に processNextQueue() が Bluetooth API の writeValue() の Promise が解決しないケースが発生している。現在のコードでは一度でも writeValue() が解決しないケースが発生するとキューは貯まりっぱなしで何も処理できなくなる。

			async function processNextQueue(){
				if ( uartCallBackObj.conn ){
					nextCmd = uartCallBackObj.cmdQueue.shift();
					uartCallBackObj.mbCmdReturnValue =[];
					uartCallBackObj.uartCallBack = nextCmd.cbFunc;
					uartCallBackObj.sending = true;
					try{
						await mbBleUartRx.writeValue(nextCmd.blmsg);
					// この後、microBitから返事が返ると、onCharacteristicValueChanged()がn回連続で呼び出され、最後に"END"の値が返ったものが来る
					} catch ( err ){
    ...

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

@dynamis dynamis added the bug Something isn't working label Aug 25, 2019
@satakagi
Copy link
Collaborator

この問題、可能性があることは認識していましたがテストできるものがなかったため放置していました。
手持ちのBMEでも同じ現象が起きればやりやすいのですが、ブレークアウトボードをいくつか変えて検証してみます。

@dynamis
Copy link
Contributor Author

dynamis commented Aug 27, 2019

学生の環境では発生していたのですが私の方でコード書いて試してみたら microbit 本体もブレークアウトボードも学生が使っていた同じ個体で試して見ても再現しませんでした。。。

再現できる環境を見つけたらまたお知らせします。。。

@dynamis
Copy link
Contributor Author

dynamis commented Aug 27, 2019

実行環境の OS, Chrome, Bluetooth Driver 等に依存する問題かも知れないです。。。

@satakagi
Copy link
Collaborator

micro:bit側のブリッジソフトに手を入れて、時々即座に値が返らないようにして、例外の実装を試みてみますね。

@satakagi
Copy link
Collaborator

satakagi commented Aug 30, 2019

30c19b9
で、タイムアウト処理を実装しました。

実際に起きた問題が再現できていないので、本当にISSUEが消えたとは言いにくいですが、ひとまずこれでISSUEをCloseします。 同種の問題が再現したら再開しましょう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants