ROOM は,UNIX(SVR4) でデータ収集ハードウェアを利用するためのクラスライブラリです. オブジェクト指向による直観的なライブラリ構成と,ハードウェアアクセスのカプセル化によるプラットフォーム独立性が大きな特長です.
作成には充分注意しておりますが,間違い等が含まれている可能性があります. 動作の保証はできませんので,御了承下さい.
ROOM は,分散型汎用オンライン環境の構築を目指す KiNOKO プロジェクトの一部として作成されました. KiNOKO プロジェクトの詳細については,KiNOKO ホームページ を御覧下さい.
CPU OS VME controller CAMAC controller Intel x86 Linux 2.0/2.2/2.4 Bit3 617/618/620 - Intel x86 Linux 2.0/2.2/2.4 - 東陽テクニカ CC/7x00 FORCE CPU-xV Solaris 2.5/2.6 FORCE FGA-5x00 Kinetic 2917-3922
動作確認を行ったコンパイラは以下のとおりです.多分,他のコンパイラでも動作すると思います.
OS コンパイラ 備考 Linux 2.0/2.2/2.4 gcc 2.8.1/2.95
gcc 3.2
Intel C++ Compiler 5.0.1- Solaris 2.5/2.6 for SPARC Sun WorkShop 4.2
gcc 2.8.1WorkShop 4.2 は 別途 STL ライブラリが必要
デバイス ドライバ 開発元 SBS Technologies (Bit3)
Model 617/618/620vmedrv KiNOKO プロジェクト 東陽テクニカ
CC/7x00camdrv KiNOKO プロジェクト FORCE Computers
FGA-5x00FRCvme (CPU-xV に付属) FORCE Computers Kinetic Systems
2917-3922KEK CCドライバ KEK オンライン
--with に渡せるドライバ名は以下のようになっています.% cd kinoko/src/kernel/lib-common/room % ./configure --with-ドライバ名=ドライバパス (以下参照)
ドライバパスは自分の環境に合わせて,適切に設定してください.
Bit3 617/618/620 (vmedrv) --with-vmedrv=/usr/local/kinoko/drv/vmedrv 東陽 CC/7x00 (camdrv) --with-camdrv=/usr/local/kinoko/drv/camdrv FORCE FGA-5x00 (FRCvme) --with-frcvme=/opt/FRCvme Kinetic 2917-3922 (KEK CC) --with-kekcamlib=/opt/cc
% make
try { //... } catch (THardwareException &e) { cerr << "ERROR: " << e << endl; }
TDeviceFactory* DeviceFactory = TDeviceFactory::GetInstance(); TCamacCrate* CamacCrate = DeviceFactory->CreateCamacCrate(); TCamacController* CamacController = DeviceFactory->CreateCamacController("Toyo-CC7x00"); TCamacModule* Adc = DeviceFactory->CreateCamacModule("Rinei-RPC022");
int StaionNumber; Crate->InstallController(Controller); Crate->Install(Adc, StationNumber = 4); Controller->Initialize();
割り込みを使用する,いちばん優れた方法です.これを行なう場合,割り込みの各種設定が正しく行なわれている必要があります.
if (Adc->WaitData()) { // データを読む } else { // タイムアウト }
割り込みがうまく扱えない場合に使用します.usleep() の待ち時間分,レスポンスが悪くなります.usleep() をなくせばレスポンスは良くなりますが,イベント待ちの間ずっと CPU を消費しつづけるようになることに注意してください.原則として,TModule::HasData() メソッドは,モジュールのレジスタをチェックします(CAMAC なら,test LAM で Q レスポンスを見ます).
while (! Adc->HasData()) { usleep(1000); // ちょっと待つ } // データを読む
上の2つの方法がうまく行かないときの CAMAC だけの裏技です.CAMAC コントローラの LAM-SUM フラグをチェックします.
Adc->EnableLam(); while (! CamacController->ReadLam()) { usleep(1000); // ちょっと待つ } // データを読む
Read() は,Channel 引数に指定されたチャンネルからデータを読み込み,その値を Data 引数に格納し,読み出しのステータス(CAMACならQレスポンス)を返します.エラーが起きた場合(CAMAC で X が 1 でない場合など),例外 THardwareException を投げます.
int Channel, Data, Response; for (Channel = 0; Channel < 4; Channel++) { Response = Adc->Read(Channel, Data); if (Response) { cout << Channel << " " << Data << endl; } else { cerr << "no Q response from ADC" << endl; } }
delete Crate; delete Controller; delete Adc;