この記事で扱っていること
- ボタンの長押しによって処理を変える方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWで使用できるブールボタンには機械的動作という設定があり、ユーザーがフロントパネルでそのボタンをどのようにクリックしたかによって反応を変えることができます。
スイッチとラッチという二種類に大別され、さらにそれぞれに3つの設定があるので合計6種類の動作が可能になりますが、「放されるまで~」はあまり使用される機会が多くないと思います。
本記事では、そんな普段スポットがあたりにくい「放されるまで~」の機械的動作を利用してボタンが長押しされたかどうかを検出する方法を紹介します。
どんな結果になるか
フロントパネルにはボタンが置いてあり、このボタンを短く押す、あるいは長く押すことでLEDが光るかどうかが変わります。
単なるクリックの場合にはLEDは光らず、長押しだと光るようにしています。
プログラムの構造
構造はいたってシンプルです。次の二つの性質を利用します。
- 「放されるまでスイッチ」の機械的動作だと、クリックした時(FALSEからTRUE)と、クリックしたボタンから放される(TRUEからFALSEになる)時でイベントが2回発生する
- イベントストラクチャを使用することで、そのイベントが発生した「時間」を取得することができる
上記の性質を元にブールの値変更イベントの中身を構成するだけです。
なお、下の例では「長押しかどうか」の基準を2000ミリ秒以上ブールボタンが押されていたかどうかで判定していますが、ケースストラクチャの「2000..」となっている部分の数値を変えれば異なる時間設定もできます。(例えば「5000..」とすれば5000ミリ秒以上の長押しに反応するようになります)
応用例
いくつか応用例を紹介します。
何度もボタン操作が繰り返される場合
上で紹介したプログラムだと、長押しかどうかに限らずそのままプログラムが終了します。実際のプログラムでは何度もボタンを押すことになることも当然考えられるので、キューを使用してボタン操作があったかどうかを判別後、長押しかどうかで変わる処理を別ループ内で行わせるように組むことができます。
このように組むにはキューを使用してイベント検出とそのイベントが起きた後に行う処理を別ループで実装します。
下のループで「長押しされた?」の判定を行っているので、あとはここにケースストラクチャを追加して、長押しかどうかで処理を変えるようにプログラムを組みます。
ボタンが押されたかどうかを表示させる場合
上で紹介してきたプログラムだと、長押しされたことでブールが光るもののそうでない場合にはブールは光りませんでした。これでは、「ボタンが押されていないから光っていない」のか「ボタンが押されたが長押しではないから光らないのか」がわかりません。
そこで、ボタンがそもそも押されたかどうかも含めて表示させる方法を考えました。
長押しされたかどうかでブールボタンの色を変えるようにしています。下の例だと、長押しされていない場合にはデフォルトの緑色、長押しされた場合には赤色になるようにしています。
色の変更はブールの「カラー」プロパティノードを使用しています。このプロパティには4つの要素を持った配列を入力しますが、カラーボックスでの入力が便利です。カラーボックスの具体的な数値は以下の図を参考にしてください。
なお、このままだと次にボタンが押されるまで「ボタン押された」のLEDは点灯したままです。これだとあまりこのボタンの意味をなさないので、タイムアウトイベントで一定時間が経ったらLEDを消灯する機能を持たせています。上の図で右側のケースストラクチャから1000や-1といった数値を出しているのはこのためです。
右側のケースストラクチャがTRUEのときには、ボタンが押され始めた段階のイベントなのでタイムアウトを起こさせないために-1としていますが、FALSEのときには1000ミリ秒後にLEDを消灯させるようにしています。(もちろん1000の部分を他の数値に変えればLED消灯までの時間をコントロールできます)
本記事では、ボタンの長押しによって処理を変えるための方法を紹介しました。リセットをかけたり、何か特別な操作のために長押しをする必要があるようなプログラムを用意するときに参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント