ToDo:
何かAPIが足りない気がする
従って、ca_create_subscriptionしている状況で、ca_get + ca_pend_ioするとsubscription中のevent callbackの喪失が発生し得る&喪失したイベント発生元とイベント数が不明となる
結論…つかいものにならない
やはり、AutoStart->FalseなCaMonitorからGetCBして、WaitValueするCaRead2互換実装作らないとだめか? (callbackベースなら、ca_pend_eventで回せる)
多分、CaOpen済みのハンドルを想定するなら、chidを受け取るConstructorを設けるのが吉(Destruct/ClearChannel時にca_clear_channelしないこと) 多分、chid modifierも受け取れる仕様にする必要があるか…
だんだん面倒な方向に…
arg->dbr->statusに関しては、格納する領域が無い模様(捨てられている)
CaRead互換の出力をするのであれば、インスタンス変数の割り当て・Query methodの実装とValueCBへの格納コードの実装が必要
従って、CaRead[{pvs...}]を以下の擬似コードでca_pend_ioを使わずに再実装できる
Module[{ca}, ca = CaMonitor[{pvs...}, AutoStart->False, ConStatCommand:>With[{p = ca@PositionL[]}, If[ca@ConnectedQ[p], ca@GetCB[p]]]]; ca@WaitValue[EPICS$CaReadTimeout[]]; MapThread[If[#1 === Undefined, $Failed, {##}]&, {ca@Value[], ca@Status[], ca@Severity, ca@Timestamp$[]}]];
次は、Constructor拡張?
実装アイデア
実装アイデア
問題点は、timeoutまでに応答しないcallbackが有った場合に、ca_get_callbackをキャンセルするか、書き込み先の消失を指令するメモ領域が必要(メモ領域はcallback routine側で開放する必要がある)
callbackメモの内容
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記