ボードゲームタイマーをM5Stack Fireで作る(4)
ボードゲームの定例会が3/18に決まりました。つまり週末でボードゲームタイマーを仕上げたいわけです。現状は試行錯誤はあるものの、前回記事の状態から進んでいません。
そこでボードゲーム定例会までに実装したい機能を明らかにして、優先して開発する機能を考えたいと思います。なんだかアジャイルっぽいです。(言葉の使い方合ってますかね)
最終的にはDGT Cubeに近しい機能を実装したいのですが、これは私自身の開発目標であって、ユーザー(ボードゲーム定例会の参加者)の要求ではありません。そもそもユーザーに要求はないので、ここでは以前にテラフォーミング・マーズでDGT Cubeを使ったときの用途をユーザーの要求と考えています。
そう考えますと現状で不足している機能は以下の2点です。
起動直後に時間を設定できること
タイマーをリセットできること
現在はM5Stack起動後に固定時間を表示し、ボタンを押したらタイマーが開始、停止します。そこで、M5Stackが起動してからタイマー開始ボタンが押されるまではタイマー時間を設定できるようにします。またタイマー開始後に一時停止したときに最初に設定した時間にリセットできるようにします。
まず、ボタンAを設定の変更、ボタンCを設定項目の変更で使いたいと思います。DGT Cubeと同じように設定の変更は「+」、設定項目の変更は「>>」で表示します。
全体的な動きは以下のようにしたいと思います。
M5Stackを起動すると、中央のタイマーが表示され、1桁目が点滅する
Aボタン(+)を押すと点滅している桁数の値が変わる
Cボタン(>>)を押すと点滅する桁数が変わる
Bボタン(Start)を押すと設定した時間でタイマーで開始する
タイマー動作中にBボタン(Stop)を押すとタイマーが一時停止する
Aボタンを押すとタイマーをリセットする
1.M5Stackを起動すると、中央のタイマーが表示され、1桁目が点滅する
今までは処理が開始したら固定時間を設定してBボタン(Start)が押されるまで待機していただけでした。これを以下のように変更します。
この処理は、変更可能な時間の桁位置を点滅させる内容となっています。点滅させる数字の桁はCボタンを押したときに更新する変数update_positionの値で判断します。0.4秒非表示にして、0.6秒表示することを繰り返して点滅表示を再現します。
2.Aボタン(+)を押すと点滅している桁数の値が変わる
数字が点滅しているときにAボタン(+)を押すと点滅している数字に1加算します。今まではBボタンしか使ってきませんでしたが、Aボタンを押したときの処理を追加します。
Aボタンを押したときの処理は以下の通りです。処理が多いですが、殆どはタイマーをリセットしたときの処理です。タイマーの数字を変える処理はボタンを1回押すたびに100msのtimerを1回だけ呼び出すようにしています。
100msごとに呼び出すタイマーは以下の通りです。Cボタンを押したときに更新する変数update_positionの値で更新する時間を特定して秒に変換します。また変換した秒数をリセットしたときに復元するために保存します。それぞれの桁で最大値が異なるため、上限の値でAボタンを押した場合には0にします。この処理により、タイマーは最大で59分59秒まで設定できるようになっています。
3.Cボタン(>>)を押すと点滅する桁数が変わる
タイマー設定中にCボタンを押すと、更新する桁数が変わったことをAボタンに伝えることで設定を変えることができます。処理はAボタンと変わらず、Cボタンを1回押すたびに100msの対応したtimerを1回だけ呼び出すようにしています。
100msごとに呼び出すタイマーは以下の通りです。ここでAボタンの設定項目で出てきたupdate_positionを更新します。現時点で設定を変えるところは数字4桁の4種類のため、Cボタンを押した4回目は最初の設定項目に戻ります。
4.Bボタン(Start)を押すと設定した時間でタイマーで開始する
こちらは前回までに作成した機能です。詳細は以前の記事をご覧ください。
ただしタイマーを開始したあとにAボタンの「+」、Cボタンの「>>」を表示しない処理を追加しました。
5.タイマー動作中にBボタン(Stop)を押すとタイマーが一時停止する
タイマーが動いでいる途中でBボタンを押すと全タイマーが止まります。これは1000ms周期のタイマーが停止されるためです。ただし止めたい時は本体液晶を床面に伏せるように置いても止まるようにしていますので積極的に使う機能でもありません。
また液晶画面を上に向けて置いた状態でBボタンを押すと、AボタンのところにResetが表示されます。
6.Aボタンを押すとタイマーをリセットする
Resetが画面に表示されているときにAボタンを押しますと、最初に設定した時間にタイマーがリセットされます。
7.Blocklyファイルの公開
まずは、これまで開発した機能でボードゲーム定例会に持参して感想を集めたいと思います。また、よく考えてみますとバッテリーは合計何時間もつのか検証していませんでした。充電できる準備もしつつ、実地試験したいと思います。
ソースコードであれば貼り付けるのですが、UIFlowで作ったものは難しいのでファイルでダウンロードできるようにします。もしよろしければお試しください。厳密なテストはしていませんが、基本的なタイマーとしては動くと思います。動作の確認はM5Stack Fireのみで行っています。