とあるメカ系制御装置、そのパラメータ設定と
動作チェック用に液晶表示を付けた外部リモコンを
使っています。 (AVRマイコンで制御)
表示は16文字×2行とシンプル。
これはデバッグ機の表示で、実機は
ちゃんとバックライト付の液晶で
暗い現場でもOKなように。
操作スイッチは、「↑」「↓」のカーソルキーと
「ENT」「ESC」の合計4つ。
試運転のための動作モニターやパラメータの設定に
このリモコンが必要ですが、それらが終わったら、
このリモコンは不要。
コネクタから抜いてしまいます。
簡単なリモコンですが、どこにも売っていないもの
ですんで、製造を依頼するとなるとそれなりに
お金がかかります。 (ケース加工がぁぁ)
客先から、
『WindowsのPCでこのリモコンの真似ができれば』
ということでウインドウズのプログラムを作ってみました。
手慣れたツールが古~い「C++builder(v5.03)」なので、
この環境から抜け出せません。
本体との通信はTTLレベルのシリアル。
USBシリアル変換アダプタを用います。
そして、いろんなPCでの動作をチェックしているとき
このトラブル に遭遇したのです。
・16文字×2行の表示
・マウスでのクリック操作だけでなく、キーボードの
↑→・↓←・ENT・ESCキーでも操作できるよう。
・マウスのホイールでも↑↓。
どうしたものかと悩んだのが表示。
装置からは表示文字列だけでなく、
・カーソル位置
・カーソルのon/off
・画面消去
・部分消去
・beep報知 ピ、ピピッ、ピピッ・ピピッ
などと調子を変えての報知。
などのコードが送られてきます。
カーソルの点滅は不要ですが、カーソル・オンで
カーソル位置の文字を白黒反転しなくちゃなりません。
Windowsの文字表示、
・1行表示のEditを2段に貼り付けるか。
・2行にしたMemoにするか。
・RichEditのほうがあれこれ使いやすいか
わずか32文字の表示ですが、ちょい悩みます。
EditやMemoやRichEditを使うと、文字列はAnsiString。
あれこれ便利ですが、ちょい面倒。
結局・・・手を抜ける解決策に。
32文字の表示を32個の「Label」にしちゃいました。
Labelを32コ置いた配列の「Caption」に文字を1つだけ。
カーソルを表現するときは、
「Font->Color」を白にしてLabelの背景色「Color」を黒に。
液晶コントローラを制御しているリモコンのプログラム
をそのまま移行するような感じでWindowsの文字制御が
できました。
メインフォームがこんなの。
実行したときの様子。
・処理の一部
// 文字バッファをラベルで
TLabel *dd[32]; // 文字はcaptionに書き込む
//***** メイン画面 開始 *****
void __fastcall TForm1::FormCreate(TObject *Sender){
paraload(); // 設定ファイルの読み出し
:
dd[0] = Label1; // 表示文字バッファ ラベルで
dd[1] = Label2; // [0]~[31]にLabel1~Label32
dd[2] = Label3;
:
dd[31] = Label32;
:
}
/***** 1文字書き込み *****/
// cur_posに書き込んでカーソルを進める
void dispchar(char c){
dd[cur_pos]->Caption = c; // 1文字書き込み
cur_pos++;
if(cur_pos >= DISP_SIZ) cur_pos = 0;
}
/***** カーソルon *****/
void dispcuron(void){
dd[cur_pos]->Font->Color = clWindow; // 文字白
dd[cur_pos]->Color = clWindowText;
}
/***** カーソルoff *****/
void dispcuroff(void){
dd[cur_pos]->Font->Color = clWindowText; // 文字黒
dd[cur_pos]->Color = clWindow;
}
TLabelの配列 dd[] にアクセスするだけで、文字描画が完了。
なにやら、表示はシンプルにできちゃいました。
※キーボードのカーソルキーなどの横取りにちょいと
コツがありました。
キーを横取りしても、何かの拍子、カーソルキーを
押したとき(TABでの入力場所移動のように)フォーカスする
ボタンの位置を変えるような操作になってしまうのです。
それを嫌って、メインフォーム左下側に細い幅で「Edit」
を配置。 (左下端に細い白い棒が見えてるでしょ)
そこで、キーの横取りやボタン操作の後は、このEdit1に
「Edit1->SetFocus();」を実行しています。
すると、カーソルキーが思うように動きました。
/***** ↓押した *****/
void __fastcall TForm1::Button3MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y){
CommX1->TransChar('-'); // - 送信
f_kdown = 1; // ↓(-)送出処理フラグon
tm_kdown = 16; // 500ms後に2発目送出
}
/***** ↓離した *****/
void __fastcall TForm1::Button3MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y){
f_kdown = 0; // ↓(-)送出処理フラグoff
Edit1->SetFocus();
}
/***** キー入力 *****/
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift){
switch(Key){
case VK_UP: // ↑
case VK_RIGHT: // →
CommX1->TransChar('+'); // + 送信
break;
case VK_DOWN: // ↓
case VK_LEFT: // ←
CommX1->TransChar('-'); // - 送信
break;
case VK_RETURN:
CommX1->TransChar('\x0d'); // CR 送信
break;
default:
CommX1->TransChar('\x1b'); // ESC 送信
}
Edit1->SetFocus();
}
リモコンのスイッチ操作、
カーソル↑が「+」、↓が「-」文字で。
ENTとESCはそのもののコードを送出。
最近のコメント