OnesSoft

estimer icon computer software download site welcome to my web site

esTimerの中身

esTimerは、操作が容易で直観的に使用でき、デスクトップ上にキッチンタイマーがあるようなソフトウェアを目指して作成したものです。
名前のesTimerもeasy(容易)に使用できるTimerを略してesTimerとしました。

このソフトウェアがどのように実現されているかesTimerの中身の一部をご説明したいと思います。
操作を簡単にするために、入力はマウスによってボタンを押すだけにし、その種類も三種類にしました。「スタート/ストップボタン」、 「リセットボタン」、あとは分と秒を入力するための「スピンボタン」です。「スピンボタン」は分と秒の二つありますが、処理上は同じ働きをするので一種類と考えます。セットする分や秒をキーボードにより直接入力する 方法も考えましたが操作を容易にするために「スピンボタン」によりセットするのみとしました。実際のキッチンタイマーもこのような入力方法が採られているものが多いようです。

これらのインターフェースでタイマーを実現するために、状態遷移という考え方を使います。状態遷移とは内部でいまどのような状態であるかという「状態」を持ち、 その「状態」が外部からのイベント等で(例えば「スタート/ストップボタン」を押す)変化していく状態遷移を考えて制御するというものです。

そこでまずどのような「状態」があり得るのか、探してみます。
タイマーの数字が「00:00」で停止している状態(リセット初期状態)
タイマーの数字が「00:00」以外の数字で停止している状態(初期状態)
上記の二つは、似ていますが「00:00」のときに計測を開始すればそれはカウントアップになり、「00:00」以外の数字のときに計測を開始すれば、それはカウントダウンの開始になり違う状態と考えます。 そのほかにカウントダウンで計測中の「タイマー稼働状態」、カウントアップで計測中の「カウントアップ状態」、またアラームが鳴っている「アラーム状態」があります。 また少しややこしくなってきますがカウントダウン中に一時停止をする「タイマー稼働中断状態」や、カウントアップ中に一時停止している「カウントアップ中断状態」もあります。 またなにか出てきたらあとで追加するとして、これらの状態で状態遷移図を考えてみました。それがつぎの図です。

esTimerの状態遷移図

esTimer状態遷移図

stsp -- スタート/ストップボタン
rst -- リセットボタン
spn -- スピンボタン

実線の矢印は、ボタンを押した時の遷移を表し、そのよこにあるのはボタンの種類です。点線の矢印は、内部において遷移させたものです。(タイマー計測が終了しアラームをならした時)

この遷移図をプログラムにすればよいのですが、もっとわかりやすくするために状態遷移表を作ってみます。ここでの状態遷移表とは、縦軸に状態、横軸に遷移させるイベントをとり、その交差したエリア にイベントに対する処理と次の遷移状態を記入したものです。

上記の状態遷移図をもとに作成した状態遷移表

スタート/ストップボタン押下スピンボタン押下リセットボタン押下
リセット初期状態カウントアップの開始
カウントアップ状態へ変更
分あるいは秒の変更
初期状態へ変更
なにもせず
初期状態カウントダウン開始
タイマー稼働状態へ変更
分あるいは秒の変更
00:00ならばリセット初期状態へ変更
分、秒を0に変更
リセット初期状態へ変更
タイマー稼働状態カウントダウン中断(タイマー停止)
タイマー稼働中断状態へ変更
カウントダウン停止(タイマー停止)
初期状態へ変更
カウントダウン停止(タイマー停止)、分、秒を0に変更
リセット初期状態へ変更
タイマー稼働中断状態カウントダウン再開(タイマー再開)
タイマー稼働状態へ変更
分あるいは秒の変更
初期状態へ変更(00:00ならリセット初期状態へ変更)
分、秒を0に変更
リセット初期状態へ変更
アラーム稼働状態アラーム停止、初期設定時間の表示
初期状態へ変更
アラームの停止、初期設定時間の表示
初期状態へ変更
アラームの停止
リセット初期状態へ変更
カウントアップ状態カウントアップ中断(タイマーの停止)
カウントアップ中断状態へ変更
カウントアップ中断(タイマーの停止)
カウントアップ中断状態へ変更
カウントアップ停止(タイマーの停止)、分、秒を0に変更
リセット初期状態へ変更
カウントアップ中断状態カウントアップ再開(タイマーの再開)
カウントアップ状態へ変更
分あるいは秒の変更
初期状態へ変更(00:00ならリセット初期状態へ変更)
分、秒を0に変更
リセット初期状態へ変更

上記の状態遷移図と状態遷移表は少し違う部分があります。スピンボタンを押下した時の状態遷移ですが、初期状態とタイマー稼働中断状態とカウントアップ中断状態の状態遷移は状態遷移図では違う状態への遷移はないようになっていますが、分と秒が00:00になった場合は、リセット初期状態に遷移します。 状態遷移図は、図を見やすくするため簡略化して書いてあります。

この状態遷移表をもとにプログラミングをしていきます。各ボタン押下のイベント処理において、各状態ごとに処理を記述します。あるボタンが押されたら今の状態を判別して、上記の状態遷移表 のその「ボタン」の今の「状態」の処理をします。ここで次の状態に遷移します。
状態遷移のプログラミングにおける実現の方法は単純で、「状態」にある定数を結びつけてその状態を表します。そして今の状態を表す変数に代入し今の状態を表します。よって状態遷移 は、状態を表す変数に新しい状態を表す定数を代入すればよいだけです。
ここで重要な事があります。それは、それぞれの状態遷移の処理が互いに排他的でないとならないということです。一つの状態遷移の処理中に割り込みが入り違う状態遷移処理が始まってしまったら この状態遷移の制御は破たんしタイマーは正常に動作しません。状態遷移での制御においては、それは前提と考えないといけないでしょう。

この状態遷移の部分はこのプログラムの核のひとつです。

もう一つの核は、タイマーコントロールの使い方です。これは、開発環境に依存していて計測の正確性を担保するために工夫が必要になる場合があります。

いかがでしょうか。esTimerがどのように実現されているか少しおわかりいただけたかと思います。 このような中身であると理解しながら一つ一つの動作を確認しながら使用してみると面白いかな?。

戻る