o processElapsed
レベル 2: ラップタイム計測機能を付けてください レベル 1 だけでもよいです
次ページ以降では、赤い文字はレベル 2 を表してい ます
できるだけ、レベル 2 にチャレンジしましょう
p やってみよう 2
ハードウェアの構成
タッチセンサー (スイッチ) をセンサーポート a につなぎます タッチセンサー (スイッチ) をセンサーポート b につなぎます 4 桁ディスプレイをバスポートにつなぎます
使い方 ( 仕様 )
1. ボタンを押すと、0 が表示されます
2. スイッチ a を押すと、4 桁ディスプレイに 101 秒単位で経過時間が表示されます このとき、スイッチ b を押すと、そのときの時間が止まって表示されます
この間、時間の計測は続いています
再びスイッチ b を押すと、経過時間の表示に戻ります
3. 再びスイッチ a を押すと、そのときの時間が止まって表示されます 4. このとき、もう 1 度スイッチ a を押すと、時間の計測を再開します 5. そうではなく、スイッチ b を押すと、0 が表示され、2 に戻ります
本物を見て確かめよう ⇒
ここでスライドを 止めてください
ストップウォッチの状態遷移図を描いてみよう 最初はレベル 1 から始めるとよいでしょう
完成形のヒントは、実はこのマテリアルの前の方にありますね
p ストップウォッチの o 状態遷移図
0が表示 されている
計測された 時間が表示 されている
経過時間が 表示されて
いる
ボタン
→開始, 0を表示
スイッチ a
→計測開始
1/10秒
→更新, 表示
スイッチ a
→計測 時間表示 スイッチ a
→計測再開 スイッチ b
→0を表示 ボタン→停止
動いて いない
p ストップウォッチの状 o 態遷移図 ( ラップ付き )
0が表示 されている
計測された 時間が表示 されている
経過時間が 表示されて
いる
ラップタイム が表示されて いる (1) ラップタイム が表示されて いる (2)
ボタン
→開始, 0を表示
1/10秒
→更新, 表示
1/10秒
→更新 スイッチ a
→計測 時間表示
スイッチ a
→計測停止 スイッチ a
→計測再開
スイッチ a
→計測再開 スイッチ b
→0を表示 ボタン→停止
動いて いない
スイッチ b
→表示 スイッチ b
→計測時間表示
ここでスライドを 止めてください
ブレイクダウンする方針を考えてみよう
状態は、どのような変数 (の組) で表せるでしょうか
イベントを 2 種類に分けて、when/run タスクにそれぞれ任せましょう
when タスクの方が、緊急に対処すべきイベントを受け付けるようにします
p 方針を決める
どのような変数が必要かを考えます
計測中の時間を表現できる必要があります 現在、計測中かを区別できる必要があります
現在、ラップタイムを表示しているかを区別できる必要があります
ラップタイム自体の値も必要なので、ラップタイムを表す変数の値に意味を もたせる (例: ゼロ = 表示していない) ことで区別できます
ふたり (when/run タスク ) で実行することを考えます
when タスクは、応答性が高い必要のあるイベントを待つことにします スイッチが押されるのを待ち構えて処理します
run タスクは、その他のイベントを待つことにします 時間の経過を待ちます
ここでスライドを 止めてください
when タスクと run タスクの状態遷移図を描いてみよう
p when タスクの o 状態遷移図
スイッチ待ち (ゼロ表示)
スイッチ待ち (結果表示)
スイッチ待ち (経過表示中)
スイッチ待ち (ラップタイム
表示中 1) スイッチ待ち (ラップタイム
表示中 2)
スイッチ a
→結果表示
スイッチ a
→計測停止 スイッチ a
→タイマリセット
スイッチ a
→タイマ リセット スイッチ b
→表示クリア
スイッチ b
→ラップタイム クリア
スイッチ b
→結果表示
・基本的にはスイッチを待つ
・計測中か区別が必要
・ラップタイムを表示しているか 区別が必要
・計測中は run タスクに時間を 測ってもらう
・赤い部分は レベル2
p run タスクの o 状態遷移図
タイマリセット 待ち
割り込み処理 (when タスク)
完了待ち
タイマ待ち
タイマ
→計測中であれば タイマリセット, ラップタイム表示中 でなければ経過表示 タイマ
→計測中でなければ何もしない
スイッチ a スイッチ a
スイッチ b
スイッチ b
割り込み処理 完了
→表示クリア
・基本的にはタイマを待つ
・when タスクに割り込まれることがある
・スイッチ b が押されても
割り込まれるが、その影響はない
・赤い部分は レベル2
ここでスライドを 止めてください
when タスクと run タスクのトップレベルの PAD を描いてみよう イベントへの対応を整理して考えましょう
基本的には状態で振り分けますが、スイッチ a への対応はラップタイムとは 独立しています
大雑把に考えましょう
細かなことは、手続きとしてまとめて考えて、あとで作りましょう
p run タスクの o トップレベル
run =
リセットする when 起動
時計機能 run タスクの本体は時計機能の手続きに任せることにします
実際に時間を測る手続きです
p when タスクの o トップレベル
when = loop
どちらも押されていない 何もしない ビープ音を鳴らす
スイッチaが押されている