ViSaGe反応ボックスのチェック
反応ボックス(CB6 Response Box)の動作を調べるためのプログラムを作成してみた。ソースコードは以下のようである。
===============================================
private: System::Void
buttonClose_Click(System::Object^
sender, System::EventArgs^
e) {
Close();
}
private: System::Void
buttonStart_Click(System::Object^
sender, System::EventArgs^
e) {
timer1->Enabled = true;
}
private: System::Void
buttonStop_Click(System::Object^
sender, System::EventArgs^
e) {
timer1->Enabled = false;
}
private: System::Void
Form1_Load(System::Object^ sender,
System::EventArgs^ e) {
::vsgInit("");
::cbboxOpen(respCB6);
//
::cbboxSendback();
}
private: System::Void
timer1_Tick(System::Object^ sender,
System::EventArgs^ e) {
timer1->Enabled = false;
::CBBOXRECORD c;
//
::cbboxSendback();
if
(::cbboxCheck(&c) == respEMPTY){
richTextBox1->AppendText("No responses\n");
}else{
if
(c.changeA != 0) {
switch
(c.switchA) {
case
respUP: richTextBox1->AppendText("Switch A -> Up\n");
break;
case
respCENTRE: richTextBox1->AppendText("Switch A -> Center\n");
break;
case
respDOWN: richTextBox1->AppendText("Switch A -> Down\n");
break;
default: richTextBox1->AppendText("Switch A -> Error\n");
break;
}
}
if
(c.changeB != 0) {
switch
(c.switchB) {
case
respUP: richTextBox1->AppendText("Switch B -> Up\n");
break;
case
respCENTRE: richTextBox1->AppendText("Switch B -> Center\n");
break;
case
respDOWN: richTextBox1->AppendText("Switch B -> Down\n");
break;
default: richTextBox1->AppendText("Switch B -> Error\n");
break;
}
}
if (c.changeC
!= 0) {
switch
(c.switchC) {
case
respUP: richTextBox1->AppendText("Switch C -> Up\n");
break;
case
respCENTRE: richTextBox1->AppendText("Switch C -> Center\n");
break;
case
respDOWN: richTextBox1->AppendText("Switch C -> Down\n");
break;
default: richTextBox1->AppendText("Switch C -> Error\n");
break;
}
}
}
if
(richTextBox1->Lines->Length > 100)
richTextBox1->Text = "";
richTextBox1->ScrollToCaret();
timer1->Enabled = true;
}
private: System::Void
buttonFlush_Click(System::Object^
sender, System::EventArgs^
e) {
timer1->Enabled = false;
//
::cbboxFlush();
using namespace mytimer;
MyTimer tm;
int t0 =
tm.timems();
::cbboxOpen(respCB6);
int t1 =
tm.timems();
richTextBox1->AppendText("cbboxOpen took " + (t1-t0).ToString() +
"ms...\n");
timer1->Enabled = true;
}
==================================================
このプログラムCheckIOBoxを実行すると図1のような結果を得る。

図1
Startボタンをクリックすると、timerコントロールにより約0.5秒間隔で反応ボックスのチェックが行われ、その結果がリッチテキストボックスに表示される。プログラムのソースコードなどは圧縮ファイルCheckIOBox.ZIPにまとめたので、圧縮ファイル名CheckIOBox.ZIPをクリックしてダウンロードした後、右ボタンのクリックなどで解凍(あるいは展開)できる。解凍したファイルは、Visual C++2008などで開くことができる。
上のプログラムでは、反応ボックスのボタンの状態に変化があったかどうかのチェック
if (::cbboxCheck(&c) == respEMPTY)
を行い、変化があればそれを表示するということが行われている。これに対して、変化の有無に関わらず常に約0.7秒間隔で反応ボックスを調べるプログラムも作成してみた。そのソースコードを以下に示す。
======================================================
private: System::Void
buttonClose_Click(System::Object^
sender, System::EventArgs^
e) {
Close();
}
private: System::Void
buttonStart_Click(System::Object^
sender, System::EventArgs^
e) {
timer1->Enabled = true;
}
private: System::Void
buttonStop_Click(System::Object^
sender, System::EventArgs^
e) {
timer1->Enabled = false;
}
private: System::Void
Form1_Load(System::Object^ sender,
System::EventArgs^ e) {
::vsgInit("");
::cbboxOpen(respCB6);
//
::cbboxSendback();
}
private: System::Void
timer1_Tick(System::Object^ sender,
System::EventArgs^ e) {
timer1->Enabled = false;
::CBBOXRECORD c;
richTextBox1->AppendText("\n");
//
::cbboxSendback();
if
(::cbboxCheck(&c) == respEMPTY){
richTextBox1->AppendText("No responses\n");
}else{
richTextBox1->AppendText("Response(s) -----------------------\n");
}
switch
(c.switchA) {
case
respUP: richTextBox1->AppendText("Switch A -> Up\n");
break;
case
respCENTRE: richTextBox1->AppendText("Switch A -> Center\n");
break;
case
respDOWN: richTextBox1->AppendText("Switch A -> Down\n");
break;
default: richTextBox1->AppendText("Switch A -> Error\n");
break;
}
switch
(c.switchB) {
case
respUP: richTextBox1->AppendText("Switch B -> Up\n");
break;
case
respCENTRE: richTextBox1->AppendText("Switch B -> Center\n");
break;
case
respDOWN: richTextBox1->AppendText("Switch B -> Down\n");
break;
default: richTextBox1->AppendText("Switch B -> Error\n");
break;
}
switch (c.switchC)
{
case
respUP: richTextBox1->AppendText("Switch C -> Up\n");
break;
case
respCENTRE: richTextBox1->AppendText("Switch C -> Center\n");
break;
case
respDOWN: richTextBox1->AppendText("Switch C -> Down\n");
break;
default: richTextBox1->AppendText("Switch C -> Error\n");
break;
}
if
(richTextBox1->Lines->Length > 10000)
richTextBox1->Text = "";
richTextBox1->ScrollToCaret();
timer1->Enabled = true;
}
private: System::Void
buttonFlush_Click(System::Object^
sender, System::EventArgs^
e) {
timer1->Enabled = false;
//
::cbboxFlush();
using namespace mytimer;
MyTimer tm;
int t0 =
tm.timems();
::cbboxOpen(respCB6);
int t1 =
tm.timems();
richTextBox1->AppendText("cbboxOpen took " + (t1-t0).ToString() +
"ms...\n");
timer1->Enabled = true;
}
====================================================
反応ボックスのボタンの変化のチェックを行わないことを除けば、先のものとほぼ同じである。実行結果は図2のようになる。

図2
このプログラムのソースコードファイルも圧縮ファイルCheckIOBoxDirect.ZIPとしてまとめた。圧縮ファイル名CheckIOBoxDirect.ZIPをクリックしてダウンロードした後、右ボタンのクリックなどで解凍(あるいは展開)できる。解凍したファイルは、Visual C++2008などで開くことができる。
CB6以外の反応ボックスに対して上記プログラムにより反応ボックスの動作を確認するときは、使用する反応ボックスに合わせて適宜変更する必要がある。