Arduinoのプログラミングをしていて、あることが起きました。
「なんかステータス遷移しない……」
今回はその例と原因、解決方法についてです。
状態遷移しない
ステータスによって処理を切り替えるために、loop()でこのような処理を書きました。
- Status1で何かをしてStatus2へ
- Status2で関数をコール
- 戻り値がfalse: ステータス変化しない
- 戻り値がtrue: 次のステータスへ
void loop() { interval<CYCLE>::run([] { switch (status) { case Status1: // ... status = Status2; break; case Status2: int isFinished = hoge(); if (isFinished) { status = Status3; } break; case Status3: // ... break; } }); }
しかしどうにもうまく動いていない。
原因
Status2で使用している「isFinished」という変数が問題でした。
どうやらswitch内で宣言された変数は、挙動がおかしくなるようです。
case Status2: // ここで変数生成して実行すると、抜けられなくなる isFinished = hoge(); if (isFinished) { status = Status3; } break;
解決方法
switch外でローカル変数を定義したところ、解決しました。
void loop() { interval<CYCLE>::run([] { int isFinished; switch (status) { case Status1: // ... status = Status2; break; case Status2: isFinished = hoge(); if (isFinished) { status = Status3; } break; case Status3: // ... break; } }); }
あとがき
Arduinoでswitchによるステータス遷移がうまくいかなかった問題の原因と解決方法についてでした!
普段swtich内で変数宣言なんてしてなかったんですが、ガーッと書いてるときに不意にやってしまったのが仇となりました……
ふとして思いつきで「これいいのか?」と気づいたことで解決しました。
ほんと気づいてよかった……