DAQ-Middleware講習会 DAQコンポーネント開発

Slides:



Advertisements
Similar presentations
DAQ-Middleware の現状報告 千代浩司 A,F 、仲吉一男 A,F 、安芳次 A,F 、 井上栄二 A,F 、長坂康史 B,F 、味村周平 C,F 、神徳徹雄 D,F 、安藤慶昭 D,F 、和田 正樹 E 高エネルギー加速器研究機構素粒子原子核研究所 A 広島工業大学 B 大坂大学 C 産業技術総合研究所.
Advertisements

実習環境整備 高エネルギー加速器研究機構 素粒子原子核研究所 千代浩司. DAQ-Middleware 配布物 ソース Scientific Linux 5.9 上で作った RPM
P HI T S スクリプト言語を用いた PHITS の連続 実行 Multi-Purpose Particle and Heavy Ion Transport code System title 年 2 月改訂.
UNIX利用法.
UNIX利用法 情報ネットワーク特論資料.
高エネルギー加速器研究機構 素粒子原子核研究所 濱田 英太郎
知能機械工学科 担当:長谷川晶一 TA:新・後藤・ナンバ
高エネルギー加速器研究機構 素粒子原子核研究所 千代浩司
高エネルギー加速器研究機構 素粒子原子核研究所 千代浩司
高エネルギー加速器研究機構 素粒子原子核研究所 千代浩司
Report of working at CERN PHOS readout test bench
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
プログラミング基礎I(再) 山元進.
第3回 ファイルとフォルダ 伊藤 高廣 計算機リテラシーM 第3回 ファイルとフォルダ 伊藤 高廣
コマンドプロンプトの起動と終了 最初に覚えるコマンド ディレクトリ構造とパス 各種コマンドの練習 Cコンパイルとプログラムの実行
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
DAQ-Middleware講習会 DAQコンポーネント開発
COPPER/FINESSE System構築
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
WSDL と JAX-RPC 年10月13日 Webサービス II (第3回) WSDL と JAX-RPC 年10月13日.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
第2回ネットワークプログラミング 中村 修.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
稚内北星学園大学 情報メディア学部 助教授 安藤 友晴
DAQ-Middlewareの開発環境と 適用事例
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
HTTPプロトコルとJSP (1) データベース論 第3回.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
Tohoku University Kyo Tsukada
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
DAQ-Middlewareトレーニングコース 実習
DAQ-Middlewareトレーニングコース 実習
TA 高田正法 B10 CPUを作る 2日目 SPIMのコンパイル TA 高田正法
スクリプト言語を用いたPHITSの連続実行
DAQ-Middleware講習会 DAQコンポーネント開発
DAQ-Middleware トレーニングコース 実習
DAQ-Middleware トレーニングコース実習
DAQ-Middleware の新機能 コンポーネント制御機能
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
九州大学キャンパスクラウド 利用法 情報ネットワーク特論 講義資料.
高エネルギー加速器研究機構 素粒子原子核研究所 千代浩司
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
Windows PowerShell Cmdlet
GEM検出器用DAQ-Middleware
DAQ-Middlewareへの 機器制御機能の実装と性能評価
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
デジタル画像とC言語.
DAQ-Middlewareの新機能と 実験への展開
J-PARC E16実験におけるDAQ-Middleware を用いたDAQソフトウェアの開発
UNIX演習 情報ネットワーク特論.
プログラミング基礎B 文字列の扱い.
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
B演習(言語処理系演習)第2回 田浦.
UNIX演習 情報ネットワーク特論資料.
高度プログラミング演習 (01).
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
KEK素核研 エレクトロニクスシステムGr. 仲吉一男
Make の使い方.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
情報処理Ⅱ 2005年11月25日(金).
printf・scanf・変数・四則演算
千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

DAQ-Middleware講習会 DAQコンポーネント開発 千代浩司 高エネルギー加速器研究機構 素粒子原子核研究所 2010-08-05 2010年度DAQ-Middleware講習会

ドキュメンテーション DAQ-Middleware 1.0.0 技術解説書 http://daqmw.kek.jp/docs/DAQ-Middleware-1.0.0-Tech.pdf DAQ-Middleware 1.0.0開発マニュアル http://daqmw.kek.jp/docs/DAQ-Middleware-1.0.0-DevManual.pdf 訂正があります: http://daqmw.kek.jp/docs/erratum-DAQ-Middleware-1.0.0-DevManual.pdf 2010-08-05 2010年度DAQ-Middleware講習会

基本DAQモデル XML User Interface HTTP Server Daq Operator Command/Status  使用するコンポーネントを指定 コンポーネント間接続情報 パラメータ User Interface PC HTTP Server XML Daq Operator Command/Status  装置パラメータ オンラインモニタ用パラメータ System Configuration Control Panel on Web browser XML/JSON Device Condition/ Online analysis PC Logger Online histograms on Web browser ・ Gatherer Dispatcher Monitor Detectors Read-out modules Online histograms using ROOT 2010-08-05 2010年度DAQ-Middleware講習会

+ = DAQコンポーネント DAQコンポーネントを組み合わせてDAQシステムを構築する InPort OutPort Service Port (command/status) Logics (for data handling) Data + = DAQコンポーネントを組み合わせてDAQシステムを構築する データ転送機能、ランコントロール、システムコンフィギュレーション機能はDAQ-Middlewareで実装済み。 データを下流に送るにはOutPortに書く。 上流からのデータを読むにはInPortを読む。 ユーザーはコアロジックを実装することで新しいコンポーネントを作成できる。 リードアウトモジュールからのデータの読み取りロジック ヒストグラムの作成ロジック 2010-08-05 2010年度DAQ-Middleware講習会

DAQコンポーネント開発のながれ コンポーネント作成 configuration fileの作成 コンポーネント起動、DaqOperator起動 DaqOperatorに対して指示をだす (今回はHTTPで指示を出すかわりにキーボードから数字キーを入力して指示を出します) run.py –cl config.xml 2010-08-05 2010年度DAQ-Middleware講習会

クラス RTC::DataFlowComponentBase DAQMW::DaqComponentBase 技術解説書 11ページ 技術解説書 11ページ クラス RTC::DataFlowComponentBase DAQMW::DaqComponentBase 2010-08-05 2010年度DAQ-Middleware講習会

1コンポーネントに必要なソースファイル Skeletonという名前のコンポーネントの場合 技術解説書 14ページ 1コンポーネントに必要なソースファイル Skeletonという名前のコンポーネントの場合 Skeleton.h (DaqComponentBaseを継承。Skeletonクラス) Skeleton.cpp (各状態ロジックを実装) SkeletonComp.cpp (main()がここにある) Makefile その他分離したくなったファイル 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント状態遷移 LOADED CONFIGURED RUNNING PAUSED daq_dummy() daq_run() daq_configure() START daq_start() PAUSE daq_pause() UNCONFIGURE daq_unconfigure() STOP daq_stop() RESUME daq_resume() 各状態にあるあいだその 関数がくりかえし呼ばれる。 状態遷移するときは状態遷移 関数が呼ばれる。 状態遷移できるようにするために は、daq_run()等は永遠にそのなかでブロックしてはだめ。 (例:Gathererのソケットプログラムでtimeoutつきにする必要がある) 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント状態遷移 技術解説書 15ページ Gatherer daq_start(): リードアウトモジュールに接続 技術解説書 15ページ コンポーネント状態遷移 Gatherer LOADED CONFIGURED RUNNING PAUSED daq_dummy() daq_run() CONFIGURE daq_configure() START daq_start() PAUSE daq_pause() UNCONFIGURE daq_unconfigure() STOP daq_stop() RESUME daq_resume() daq_start(): リードアウトモジュールに接続 daq_run(): リードアウトモジュールからデータ を読んで後段コンポーネントに データを送る daq_stop(): リードアウトモジュールから切断。 Monitor daq_start(): ヒストグラムデータの作成 daq_run(): 上流コンポーネントからデータをう けとり、デコードしてヒストグラム データをアップデートする。定期 的にヒストグラム図を書く daq_stop(): 最終データを使ってヒストグラム 図を書く Daq Operator ReadOutModule gatherer monitor 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント実装方法 各メソッドを実装することでコンポーネントを作成する daq_configure() daq_start() 技術解説書 15ページ コンポーネント実装方法 各メソッドを実装することでコンポーネントを作成する daq_configure() daq_start() daq_run() daq_stop() daq_unconfigure() 2010-08-05 2010年度DAQ-Middleware講習会

/usr/share/daqmw/examples/Skeleton/ で状態遷移の確認の例 Skeleton.h, Skeleton.cppを見てみる。 各メソッドが本当に呼ばれているのか確認するには cd /home/daq/Mydaq cp –r /usr/share/daqmw/examples/Skeleton . cd Skeleton vi Skeleton.cpp m_debug(true)にセットする、daq_run()等でstd::cerr << “Skeleton::daq_run()” << std::endl; になっているかどうか確認する。なってなかったら書く。 make cd .. cp /usr/share/daqmw/conf/skel.xml . run.py –cl skel.xml run.py –cl で起動したコンポーネントのstd::cerrは/tmp/daqmw/log.SkeletonCompにでるので別の端末で tail –f /tmp/daqmw/log.SkeletonComp してrun.pyで0: configure等するたびにログが表示されることを確認する。 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント間のデータフォーマット 技術解説書 7ページ COMPONENT HEADER FOOTER Event Data Reserved Header Magic Data Byte Size Data Byte Sizeには下流コンポーネントに何バイトのデータを送ろうとしたか を入れる 下流側ではDataByteSizeを読んでデータが全部読めたかどうか判断する Component Footer Reserved Footer Magic Seq. Num Sequence Numberにデータを送るのは何回目かを入れる 下流側では受け取った回数を自分で数えておいて、Sequence Numberとあうか どうか確認する 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント間のデータフォーマット 技術解説書 6ページ Reserved Header Magic Data Byte Size Footer Magic Seq. Num Reservedのバイトはユーザが使用してもよい 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント間データフォーマット 関連メソッド 技術解説書 12ページ コンポーネント間データフォーマット 関連メソッド inc_sequence_num() reset_sequence_num() get_sequence_num() set_header(unsigned char *header, unsigned int data_byte_size) set_footer(unsinged char *footer, unsigned int sequence_num) check_header(unsigned char *header, unsigned received_byte) check_footer(unsigned char *footer, unsigned int loop_count) check_header_footer(......) 2010-08-05 2010年度DAQ-Middleware講習会

Fatal Error 致命的エラーが起こったらfatal_error_report()を使ってDaqOperatorへ通知する。 技術解説書 18ページ Fatal Error 致命的エラーが起こったらfatal_error_report()を使ってDaqOperatorへ通知する。 DAQ-Middlewareで定義しているものとユーザーが定義できるものがある。   fatal_error_report(USER_DEFINED_ERROR1,       “cannot connect to readout module”); DaqOpertorに通知されたあとの動作は上位のフレームワークあるいは人が対処する(ランを停止する、再スタートするなど) 2010-08-05 2010年度DAQ-Middleware講習会

+ = InPort, OutPort操作 技術解説書 17ページ Skeleton.h: Skeleton.cpp // Ctor Service Port (command/status) Logics (for data handling) Data + = Skeleton.h: private: TimedOctetSeq m_in_data; InPort<TimedOctetSeq> m_InPort; TimedOctetSeq m_out_data; OutPort<TimedOctetSeq> m_OutPort; Skeleton.cpp // Ctor Skeleton::Skeleton(RTC::Manager* manager) : DAQMW::DaqComponentBase(manager), m_InPort("skeleton_in", m_in_data), m_OutPort("skeleton_out", m_out_data), 2010-08-05 2010年度DAQ-Middleware講習会

InPort操作 bool rv = m_InPort.read() 読んだデータはm_in_data.data配列にデータが入る 技術解説書17ページ bool rv = m_InPort.read() 読んだデータはm_in_data.data配列にデータが入る length = m_in_data.data.length() で長さ (Component Header, Footerを含めた長さ) 戻り値: true, false falseの場合は check_inPort_status(m_InPort)でInPortの状態を確認する。 check_inPort_statusの戻り値 BUF_TIMEOUT: 通常リトライするようにコードを書く BUF_FATAL: 通常fatal_error_report()でエラーを報告 2010-08-05 2010年度DAQ-Middleware講習会

OutPort操作 bool rv = m_OutPort.write() 技術解説書18ページ bool rv = m_OutPort.write() m_out_data.data.length(length)でデータ長を指定 (Component Header, Footerを含めた長さ) 送るデータはm_out_data.data配列に入れる (Component Header, Footerを含める) m_OutPort.write()でデータが送られる。 戻り値: true, false falseの場合は check_outPort_status(m_OutPort)でOutPortの状態を確認する。 check_inPort_statusの戻り値 BUF_TIMEOUT: 通常リトライするようにコードを書く BUF_FATAL: 通常fatal_error_report()でエラーを報告 2010-08-05 2010年度DAQ-Middleware講習会

DaqOperator 通常DaqOperatorは変更する必要はない。 /usr/libexec/daqmw/DaqOperatorにバイナリがある。 2010-08-05 2010年度DAQ-Middleware講習会

開発環境 newcomp Makefile 新規コンポーネント開発開始用テンプレート作成ツール あんまりぐちゃぐちゃ書かなくても済むようにしてみた。 2010-08-05 2010年度DAQ-Middleware講習会

newcomp newcomp MyMonitor Source型、Sink型はオプションがある Makefile、MyMonitor.h、MyMonitor.cpp、MyMonitorComp.cppのひな形を作る インクルードガード、コンポーネント名は MYMONITOR、MyMonitor、mymonitorになる(ケースマッチで引数から取得) InPort 1 個、OutPort 1 個、実装すべきメソッド(ほぼ空)のものができる。 Source型、Sink型はオプションがある newcomp -t source MyReader newcomp -t sink MyMonitor それぞれInPort, OutPortは必要なものだけ作る。 newcomp -h で簡単なヘルプがでる。 2010-08-05 2010年度DAQ-Middleware講習会

newcomp -h Usage: newcomp [-c] [-f] [-t component_type] NewCompName Create skeleton component files with NewCompName in NewCompName directory. If this directory does not exist, it will be created automatically unless -c option is specified. Please specify NewCompName as you need. If you issue "newcomp NewGatherer", following files will be created: NewGatherer/ NewGatherer/Makefile NewGatherer/NewGatherer.h NewGatherer/NewGatherer.cpp NewGatherer/NewGathererComp.cpp You may specify component type as -t option. Valid component types are: null sink source Other option: -c Don't create directory but create component files in the current directory -f Overwrite exisiting file(s) 2010-08-05 2010年度DAQ-Middleware講習会

newcomp –t source MyReader //MyReader.h private: TimedOctetSeq m_out_data; OutPort<TimedOctetSeq> m_OutPort; // MyReader.cpp Ctor MyReader::MyReader(RTC::Manager* manager) : DAQMW::DaqComponentBase(manager), m_OutPort("myreader_out", m_out_data), m_out_status(BUF_SUCCESS), 2010-08-05 2010年度DAQ-Middleware講習会

newcomp –t sink MyMonitor //MyMonitor.h private: TimedOctetSeq m_in_data; InPort<TimedOctetSeq> m_InPort; //MyMonitor.cpp Ctor MyMonitor::MyMonitor(RTC::Manager* manager) : DAQMW::DaqComponentBase(manager), m_InPort("mymonitor_in", m_in_data), 2010-08-05 2010年度DAQ-Middleware講習会

newcompで入るロジック置き場 source, sinkそれぞれ典型的な使い方はこうだろうと思ったものの空のものが入っている。 source: read_data_from_detectors() sink: online_analyze() 2010-08-05 2010年度DAQ-Middleware講習会

newcomp誕生までの道のり 昨年まではSkeletonファイルをコピーして とかしていた。 マニュアルにもそう書いた(つもりだった)がコマンドがまちがっていました(申し訳ありません) for i in Skeleton*; do sed -i.bak -e 's/skeleton/mymonitor/' \ -e 's/Skeleton/MyMonitor/' \ -e 's/SKELETON/MYMONITOR/' $i done 2010-08-05 2010年度DAQ-Middleware講習会

Makefile 雛型が作るMakefileに ソースファイルが増えたら SRCS += として追加する。 インクルードファイルの場所は CPPFLAGS += で追加する。 ライブラリファイルは LDLIBS += -L/path/to/lib –lmylib で追加する。 あとはincludeしているcomp.mkとimplicit ruleが面倒をみる。 2010-08-05 2010年度DAQ-Middleware講習会

Makefile COMP_NAME = MyMonitor all: $(COMP_NAME)Comp SRCS += $(COMP_NAME).cpp SRCS += $(COMP_NAME)Comp.cpp # sample install target # # MODE = 0755 # BINDIR = /tmp/mybinary # install: $(COMP_NAME)Comp # mkdir -p $(BINDIR) # install -m $(MODE) $(COMP_NAME)Comp $(BINDIR) include /usr/share/daqmw/mk/comp.mk 2010-08-05 2010年度DAQ-Middleware講習会

Makefile (implicit rule) hello.cがあったらMakefileなしでも make hello でOK CFLAGS: CXXFLAGS: CPPFLAGS: LDLIBS: GNU make。*BSDではLDADD 2010-08-05 2010年度DAQ-Middleware講習会

Makefile (implicit rule, LDLIBS) PROG = sample CFLAGS = -g -O0 -Wall LDLIBS += -lm all: ${PROG} clean: rm -f *.o ${PROG} % make cc -g -O0 -Wall sample.c -lm -o sample 2010-08-05 2010年度DAQ-Middleware講習会

GNU Make Linuxにたいてい採用されているGNU Makeだとobjectファイルを追加していくようだ all: hello OBJS += hello.o OBJS += options.o OBJS += help.o hello: $(OBJS) 2010-08-05 2010年度DAQ-Middleware講習会

Makefile ファイルが増えてきてMakefileをアップデートするときviで :r! ls -1 *.c aaa.c bbb.c ccc.c ソースファイルを並べて、この先頭にOBJS += を追加。そのあと.cを.oに変更するつもりで、忘れていて make clean(ソースが消えます) SRCS += でソースを追加する方式に変更 2010-08-05 2010年度DAQ-Middleware講習会

Makefile 自動生成されるファイルの対処 Skeleton.h Skeleton.cpp SkeletonComp.cpp makeしたら自動生成でこれより多い数のソースが出現。 めざわりなので自動生成されるファイル群はautogenディレクトリへ押し込め。 2010-08-05 2010年度DAQ-Middleware講習会

DAQシステムの起動 コンフィギュレーションファイルを書く 今はまだGUIがありません(すみません) サンプルをコピーして手で編集 だいたいここで間違いが入ることがおおいです(だからGUIがあればよいんだが。重ねてお詫び申し上げます)。ので /usr/share/daqmw/examples/以下にあるサンプルコンポーネントのコンフィギュレーションは全部/usr/share/daqmw/conf/に入れた。 システム統括はDaqOperatorが行いますが、各コンポーネントは既に起動している必要があります コンポーネントの起動方法 手でコマンドラインから起動 ネットワークブート コンフィギュレーションファイルにexecPathがあるからこれを読んでプログラムが起動 (run.pyの目的その1) 2010-08-05 2010年度DAQ-Middleware講習会

run.py 開発中は 起動することが多いかと思うのでここではこの方法だけを扱います DaqOperatorをコンソールモードで 各コンポーネントはlocal計算機で 起動することが多いかと思うのでここではこの方法だけを扱います コマンド:  run.py –c –l config.xml 2010-08-05 2010年度DAQ-Middleware講習会

run.py –c –l config.xml 動作説明 xmllintで引数で指定されたconfig.xmlのvalidationを実行 (config.xmlのスキーマは /usr/share/daqmw/conf/config.xsd) ネームサーバーの起動 config.xml内のexecPathからコンポーネントパス名を取得してそれらを起動 最後にDaqOperatorをコンソールモードで起動 コマンドはキーボードから手入力 (httpではない) 端末に各コンポーネントが扱ったバイト数を表示 2010-08-05 2010年度DAQ-Middleware講習会

runl run.py –c –lと同じ動作をするshell script DAQ-Middleware 1.0.0の配布物には入ってない VMware Playerイメージの /home/daq/bin/にひっそりと入っているだけ 2010-08-05 2010年度DAQ-Middleware講習会

開発マニュアルでの例題 いずれもソース、コンフィギュレーションファイルは/usr/share/daqmw/examples/, /usr/share/daqmw/conf/の下にあります。 Skeletonコンポーネントでの状態遷移の確認 (17ページ) コンポーネント間のデータ通信 (19ページ) エミュレータからのデータを読んでROOTでヒストグラムを書くシステムの開発 (24ページ) 上のシステムのコンディションデータベース化(50ページ) 2010-08-05 2010年度DAQ-Middleware講習会

コンポーネント間のデータ通信 (19ページ) TinySourceは適当に数値を入れておくる コンポーネント間のデータ通信 (19ページ) Daq Operator Tiny Source Tiny Sink TinySourceは適当に数値を入れておくる TinySinkは受け取ったデータを標準エラーに出力する run.py –cl tiny.xml で起動したコンポーネントのエラーログは/tmp/daqmw/log.CompName (CompNameはコンポーネント名)に出力される(TinySinkのログは/tmp/daqmw/log.TinySinkに出力される) 2010-08-05 2010年度DAQ-Middleware講習会

SampleReader, SampleMonitor Daq Operator Emulatorからのデータを読んでROOTでヒストグラムを書く Emulator Sample Reader Sample Monitor 2010-08-05 2010年度DAQ-Middleware講習会

Conditionデータベース Daq Operator Sample Reader Sample Monitor Emulator Sample Reader Sample Monitor  装置パラメータ オンラインモニタ用パラメータ ランごとにヒストグラムパラメータを決められるようにdaq_start()でこれを読んでヒストグラムのパラメータを決めるようにする XML/JSON 2010-08-05 2010年度DAQ-Middleware講習会

SampleReader, SampleMonitorデモ ふつうにデモ ヒストグラム最小値、最大値を変え(Conditionファイル) 2010-08-05 2010年度DAQ-Middleware講習会

データソースの準備 Emulatorを作るとか実機を用意するとか 今回はemulatorを使います。 /home/daq/MyDaq/emulator-GEN_GAUSS 2010-08-05 2010年度DAQ-Middleware講習会

Emulatorの転送レートアルゴリズム cstream http://www.cons.org/cracauer/cstream.html のアルゴリズムをそのまま使用 スタート時刻をgettimeofday()で取得 一定バイト数write() 書き終わったらgettimeofday()で時刻を取得 スタート時刻からの時間経過がわかるのでこれまでの転送レートがわかる 書きすぎだったら、どのくらいsleep()したら指定された転送レートに合わせられるか計算できるのでそのぶんsleep()する 書きすぎてなかったらsleep()なしにwrite()する。 2010-08-05 2010年度DAQ-Middleware講習会

Emulatorの仕様 ./emulator [-t tx_bytes/s] [-b buf_bytes] [-h ip_address] デフォルトは –t 8k –b 1k (8kB/sec, 1回1kb) 数値はm, kのサフィックスが使える 指定された転送レートをできるだけ守るようにデータを送る 送ってくるデータフォーマット: Magic Format Version Module Number Reserved Event Data Magic: 0x5a Format Version: 0x01 Module Number: 0x00 – 0x07 Event Data: 適当にガウシャン風。100, 200, 300, ... 800にピークがある。 1000倍した整数値で送ってくる。ネットワークバイトオーダー。 2010-08-05 2010年度DAQ-Middleware講習会

Emulatorの注意 指定された(あるいはデフォルトの)転送レートを守るように作ったのでどの実験のデータフローともまったく異なったデータフローになっているはずで実用の意味はあまりないと思う。 2010-08-05 2010年度DAQ-Middleware講習会

デモ 起動して nc で読んでみる cd /home/daq/MyDaq/emulator-GEN_GAUSS ./emulator 別の端末で /usr/bin/nc localhost 2222 > data & \ (sleep 10; pkill –f /usr/bin/nc) hexdump –vC data 2010-08-05 2010年度DAQ-Middleware講習会