この記事で扱っていること
点滅の仕方で状態を表現する仕組みを作る方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
プログラムの作りによっては、発生したエラーをメッセージではなく例えばランプを点滅させるパターンで区別させるような表現方法でユーザーに知らせるのがそのプログラムの「雰囲気」に合っていることがあります。
点滅だけで複数の種類のエラーを区別できるようにするためには、例えば連続で何回点滅したか、みたいな、点滅のタイミングを制御する方法もあれば、点滅の色を変えるパターンなども考えられます。
本記事ではメインとしては点滅のタイミングを制御する方法を紹介していますが、後半では色を変えるパターンでの表現方法の一例も紹介しています。
どんな結果になるか
実装の仕方を説明するために、いくつかのパターンでの点滅のさせ方をわざと発生させるため、フロントパネルのボタンが押されたら各パターンで点滅する、という状態を例にとります。
各ボタンを押すと、点滅のパターンが変わります。(図ではパターンを実際に紹介できないので、気になる方は実際に作ってみてください)
プログラムの構造
LED表示器を点滅させる、という機能を持ったWhileループを一つ用意し、これに外から命令を与えるような実装としています。
今回はユーザーがボタンを押すことで「状態」を変えています。が、実際にはイベントである必要はなく、プログラムの中で特定の処理が実行されている際にステータスを示したい部分でキューを使ってLED操作のWhileループ(上の図でいう、下側のWhileループ)に命令を送るという実装でも問題ありません。
イベントストラクチャの中身を以下のようにして、各ボタンが押された際のblink timeの数値配列の中身を少しずつ変えています。
これらの命令を受けて、実際にLEDの操作を担う下のWhileループでは各種ステートを以下のように指定した、ステートマシン的な動きをします。
status updateによって点滅のパターンを変更しこれをシフトレジスタに入れて、blinkステートでblink timeにある値を見つけたらstatusをTRUEにしています。
blinkステートにある待機関数(下の図では150を入力している)の値を変えれば、違う点滅周期のパターンも作れます。(もちろんblink timeの配列の指定を変えてもパターンを変えられます)
点滅の色を変更する場合
上記の例では、点滅のタイミングを指定した数値配列を命令として与え、様々なパターンを作り出していました。
色を変更する場合には、この数値配列の代わりに、色を指定するためのスカラーの数値データを渡せばいいだけ、になります。
今回は点滅のタイミングは一定にしておきます。その際に、点滅を止める場合のステートを新たに用意しておくこととしています。
全体的な作りは、点滅タイミングを変えるプログラムと同じです。
イベントの考え方も同じです。
異常解消の場合にstopのステートを指定しているところが変更点になります。
下のWhileループの中身は以下のようです。
このプログラムの場合のカウンターは、偶数か奇数かだけを表し、それによってstatusのLEDを光らせるかどうかを判定しています。
であれば別にブールの値をシフトレジスタに渡してNotの関数を使用してTRUEとFALSEを交互に入れ替えるのでももちろんいいのですが、このように実装しておくとblinkのステートで「2」の代わりに別の数字を指定することで点滅パターンも簡単に変えられるので便利、という利点があります。
status updateのケースでは、statusのLEDのカラープロパティに渡す値を変更しています。
上のWhileループからどの数値を受け取るかで指定の仕方を変えています。
このように、ケースストラクチャを使用してあらかじめ決めた配列などの値を指定する方法は、点滅タイミングを変更する方のプログラムでも同じことができます。
同じ実装でもつまらないのでこちらは敢えてケースストラクチャで分ける方法としてみました。
本記事では、点滅の仕方で状態を表現する仕組みを作る方法を紹介しました。
エラーでなくても、何かプログラムの処理工程をメッセージ以外の方法で表現する際にも使えると思うので、参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント