00001 #ifndef PSANA_EVR_DDL_H
00002 #define PSANA_EVR_DDL_H 1
00003
00004
00005
00006 #include <vector>
00007 #include <iosfwd>
00008 #include <cstring>
00009 #include "ndarray/ndarray.h"
00010 #include "pdsdata/xtc/TypeId.hh"
00011 #include "pdsdata/xtc/DetInfo.hh"
00012 namespace Psana {
00013 namespace EvrData {
00014
00015
00016
00017
00018
00019
00020
00021 class PulseConfig {
00022 public:
00023 enum { Trigger_Shift = 0 };
00024 enum { Set_Shift = 8 };
00025 enum { Clear_Shift = 16 };
00026 enum { Polarity_Shift = 0 };
00027 enum { Map_Set_Ena_Shift = 1 };
00028 enum { Map_Reset_Ena_Shift = 2 };
00029 enum { Map_Trigger_Ena_Shift = 3 };
00030 PulseConfig(uint32_t pulse, int16_t trigger, int16_t set, int16_t clear, uint8_t polarity, uint8_t map_set_enable, uint8_t map_reset_enable, uint8_t map_trigger_enable, uint32_t prescale, uint32_t delay, uint32_t width)
00031 : _pulse(pulse), _input_control(((trigger+1) & 0xff)|(((set+1) & 0xff)<<8)|(((clear+1) & 0xff)<<16)), _output_control(((polarity) & 0x1)|(((map_set_enable) & 0x1)<<1)|(((map_reset_enable) & 0x1)<<2)|(((map_trigger_enable) & 0x1)<<3)), _prescale(prescale), _delay(delay), _width(width)
00032 {
00033 }
00034 PulseConfig() {}
00035
00036 uint32_t pulse() const { return _pulse; }
00037
00038 uint32_t _input_control_value() const { return _input_control; }
00039 private:
00040 int16_t bf_trigger() const { return int16_t(this->_input_control & 0xff); }
00041 int16_t bf_set() const { return int16_t((this->_input_control>>8) & 0xff); }
00042 int16_t bf_clear() const { return int16_t((this->_input_control>>16) & 0xff); }
00043 public:
00044
00045 uint32_t _output_control_value() const { return _output_control; }
00046 uint8_t polarity() const { return uint8_t(this->_output_control & 0x1); }
00047 uint8_t map_set_enable() const { return uint8_t((this->_output_control>>1) & 0x1); }
00048 uint8_t map_reset_enable() const { return uint8_t((this->_output_control>>2) & 0x1); }
00049 uint8_t map_trigger_enable() const { return uint8_t((this->_output_control>>3) & 0x1); }
00050
00051 uint32_t prescale() const { return _prescale; }
00052
00053 uint32_t delay() const { return _delay; }
00054
00055 uint32_t width() const { return _width; }
00056 int16_t trigger() const;
00057 int16_t set() const;
00058 int16_t clear() const;
00059 static uint32_t _sizeof() { return 24; }
00060 private:
00061 uint32_t _pulse;
00062 uint32_t _input_control;
00063 uint32_t _output_control;
00064 uint32_t _prescale;
00065 uint32_t _delay;
00066 uint32_t _width;
00067 };
00068
00069
00070
00071
00072
00073
00074
00075 class PulseConfigV3 {
00076 public:
00077 PulseConfigV3(uint16_t arg__u16PulseId, uint16_t arg__u16Polarity, uint32_t arg__u32Prescale, uint32_t arg__u32Delay, uint32_t arg__u32Width)
00078 : _u16PulseId(arg__u16PulseId), _u16Polarity(arg__u16Polarity), _u32Prescale(arg__u32Prescale), _u32Delay(arg__u32Delay), _u32Width(arg__u32Width)
00079 {
00080 }
00081 PulseConfigV3() {}
00082 uint16_t pulseId() const { return _u16PulseId; }
00083
00084 uint16_t polarity() const { return _u16Polarity; }
00085
00086 uint32_t prescale() const { return _u32Prescale; }
00087
00088 uint32_t delay() const { return _u32Delay; }
00089
00090 uint32_t width() const { return _u32Width; }
00091 static uint32_t _sizeof() { return 16; }
00092 private:
00093 uint16_t _u16PulseId;
00094 uint16_t _u16Polarity;
00095 uint32_t _u32Prescale;
00096 uint32_t _u32Delay;
00097 uint32_t _u32Width;
00098 };
00099
00100
00101
00102
00103
00104
00105
00106 class EventCodeV3 {
00107 public:
00108 EventCodeV3(uint16_t arg__u16Code, uint8_t arg__bf_isReadout, uint8_t arg__bf_isTerminator, uint32_t arg__u32MaskTrigger, uint32_t arg__u32MaskSet, uint32_t arg__u32MaskClear)
00109 : _u16Code(arg__u16Code), _u16MaskEventAttr(((arg__bf_isReadout) & 0x1)|(((arg__bf_isTerminator) & 0x1)<<1)), _u32MaskTrigger(arg__u32MaskTrigger), _u32MaskSet(arg__u32MaskSet), _u32MaskClear(arg__u32MaskClear)
00110 {
00111 }
00112 EventCodeV3() {}
00113 uint16_t code() const { return _u16Code; }
00114 uint8_t isReadout() const { return uint8_t(this->_u16MaskEventAttr & 0x1); }
00115 uint8_t isTerminator() const { return uint8_t((this->_u16MaskEventAttr>>1) & 0x1); }
00116 uint32_t maskTrigger() const { return _u32MaskTrigger; }
00117 uint32_t maskSet() const { return _u32MaskSet; }
00118 uint32_t maskClear() const { return _u32MaskClear; }
00119 static uint32_t _sizeof() { return 16; }
00120 private:
00121 uint16_t _u16Code;
00122 uint16_t _u16MaskEventAttr;
00123 uint32_t _u32MaskTrigger;
00124 uint32_t _u32MaskSet;
00125 uint32_t _u32MaskClear;
00126 };
00127
00128
00129
00130
00131
00132
00133
00134 class EventCodeV4 {
00135 public:
00136 EventCodeV4(uint16_t arg__u16Code, uint8_t arg__bf_isReadout, uint8_t arg__bf_isTerminator, uint32_t arg__u32ReportDelay, uint32_t arg__u32ReportWidth, uint32_t arg__u32MaskTrigger, uint32_t arg__u32MaskSet, uint32_t arg__u32MaskClear)
00137 : _u16Code(arg__u16Code), _u16MaskEventAttr(((arg__bf_isReadout) & 0x1)|(((arg__bf_isTerminator) & 0x1)<<1)), _u32ReportDelay(arg__u32ReportDelay), _u32ReportWidth(arg__u32ReportWidth), _u32MaskTrigger(arg__u32MaskTrigger), _u32MaskSet(arg__u32MaskSet), _u32MaskClear(arg__u32MaskClear)
00138 {
00139 }
00140 EventCodeV4() {}
00141 uint16_t code() const { return _u16Code; }
00142 uint8_t isReadout() const { return uint8_t(this->_u16MaskEventAttr & 0x1); }
00143 uint8_t isTerminator() const { return uint8_t((this->_u16MaskEventAttr>>1) & 0x1); }
00144 uint32_t reportDelay() const { return _u32ReportDelay; }
00145 uint32_t reportWidth() const { return _u32ReportWidth; }
00146 uint32_t maskTrigger() const { return _u32MaskTrigger; }
00147 uint32_t maskSet() const { return _u32MaskSet; }
00148 uint32_t maskClear() const { return _u32MaskClear; }
00149 static uint32_t _sizeof() { return 24; }
00150 private:
00151 uint16_t _u16Code;
00152 uint16_t _u16MaskEventAttr;
00153 uint32_t _u32ReportDelay;
00154 uint32_t _u32ReportWidth;
00155 uint32_t _u32MaskTrigger;
00156 uint32_t _u32MaskSet;
00157 uint32_t _u32MaskClear;
00158 };
00159
00160
00161
00162
00163
00164
00165
00166 class EventCodeV5 {
00167 public:
00168 enum { DescSize = 16 };
00169 EventCodeV5(uint16_t arg__u16Code, uint8_t arg__bf_isReadout, uint8_t arg__bf_isCommand, uint8_t arg__bf_isLatch, uint32_t arg__u32ReportDelay, uint32_t arg__u32ReportWidth, uint32_t arg__u32MaskTrigger, uint32_t arg__u32MaskSet, uint32_t arg__u32MaskClear, const char* arg__desc)
00170 : _u16Code(arg__u16Code), _u16MaskEventAttr(((arg__bf_isReadout) & 0x1)|(((arg__bf_isCommand) & 0x1)<<1)|(((arg__bf_isLatch) & 0x1)<<2)), _u32ReportDelay(arg__u32ReportDelay), _u32ReportWidth(arg__u32ReportWidth), _u32MaskTrigger(arg__u32MaskTrigger), _u32MaskSet(arg__u32MaskSet), _u32MaskClear(arg__u32MaskClear)
00171 {
00172 if (arg__desc) std::copy(arg__desc, arg__desc+(16), &_desc[0]);
00173 }
00174 EventCodeV5() {}
00175 uint16_t code() const { return _u16Code; }
00176 uint8_t isReadout() const { return uint8_t(this->_u16MaskEventAttr & 0x1); }
00177 uint8_t isCommand() const { return uint8_t((this->_u16MaskEventAttr>>1) & 0x1); }
00178 uint8_t isLatch() const { return uint8_t((this->_u16MaskEventAttr>>2) & 0x1); }
00179 uint32_t reportDelay() const { return _u32ReportDelay; }
00180 uint32_t reportWidth() const { return _u32ReportWidth; }
00181 uint32_t maskTrigger() const { return _u32MaskTrigger; }
00182 uint32_t maskSet() const { return _u32MaskSet; }
00183 uint32_t maskClear() const { return _u32MaskClear; }
00184 const char* desc() const { return _desc; }
00185 uint32_t releaseCode() const { return this->_u32ReportWidth; }
00186 static uint32_t _sizeof() { return ((((24+(1*(DescSize)))+4)-1)/4)*4; }
00187
00188 std::vector<int> desc_shape() const;
00189 private:
00190 uint16_t _u16Code;
00191 uint16_t _u16MaskEventAttr;
00192 uint32_t _u32ReportDelay;
00193 uint32_t _u32ReportWidth;
00194 uint32_t _u32MaskTrigger;
00195 uint32_t _u32MaskSet;
00196 uint32_t _u32MaskClear;
00197 char _desc[DescSize];
00198 };
00199
00200
00201
00202
00203
00204
00205
00206 class EventCodeV6 {
00207 public:
00208 enum { DescSize = 16 };
00209 enum { MaxReadoutGroup = 7 };
00210 EventCodeV6(uint16_t arg__u16Code, uint8_t arg__bf_isReadout, uint8_t arg__bf_isCommand, uint8_t arg__bf_isLatch, uint32_t arg__u32ReportDelay, uint32_t arg__u32ReportWidth, uint32_t arg__u32MaskTrigger, uint32_t arg__u32MaskSet, uint32_t arg__u32MaskClear, const char* arg__desc, uint16_t arg__u16ReadGroup)
00211 : _u16Code(arg__u16Code), _u16MaskEventAttr(((arg__bf_isReadout) & 0x1)|(((arg__bf_isCommand) & 0x1)<<1)|(((arg__bf_isLatch) & 0x1)<<2)), _u32ReportDelay(arg__u32ReportDelay), _u32ReportWidth(arg__u32ReportWidth), _u32MaskTrigger(arg__u32MaskTrigger), _u32MaskSet(arg__u32MaskSet), _u32MaskClear(arg__u32MaskClear), _u16ReadGroup(arg__u16ReadGroup)
00212 {
00213 if (arg__desc) std::copy(arg__desc, arg__desc+(16), &_desc[0]);
00214 }
00215 EventCodeV6() {}
00216 uint16_t code() const { return _u16Code; }
00217 uint8_t isReadout() const { return uint8_t(this->_u16MaskEventAttr & 0x1); }
00218 uint8_t isCommand() const { return uint8_t((this->_u16MaskEventAttr>>1) & 0x1); }
00219 uint8_t isLatch() const { return uint8_t((this->_u16MaskEventAttr>>2) & 0x1); }
00220 uint32_t reportDelay() const { return _u32ReportDelay; }
00221 uint32_t reportWidth() const { return _u32ReportWidth; }
00222 uint32_t maskTrigger() const { return _u32MaskTrigger; }
00223 uint32_t maskSet() const { return _u32MaskSet; }
00224 uint32_t maskClear() const { return _u32MaskClear; }
00225 const char* desc() const { return _desc; }
00226 uint16_t readoutGroup() const { return _u16ReadGroup; }
00227 uint32_t releaseCode() const { return this->_u32ReportWidth; }
00228 static uint32_t _sizeof() { return (((((24+(1*(DescSize)))+2)+4)-1)/4)*4; }
00229
00230 std::vector<int> desc_shape() const;
00231 private:
00232 uint16_t _u16Code;
00233 uint16_t _u16MaskEventAttr;
00234 uint32_t _u32ReportDelay;
00235 uint32_t _u32ReportWidth;
00236 uint32_t _u32MaskTrigger;
00237 uint32_t _u32MaskSet;
00238 uint32_t _u32MaskClear;
00239 char _desc[DescSize];
00240 uint16_t _u16ReadGroup;
00241 };
00242
00243
00244
00245
00246
00247
00248
00249 class SrcEventCode {
00250 public:
00251 enum { DescSize = 16 };
00252 enum { MaxReadoutGroup = 7 };
00253 SrcEventCode(uint16_t arg__u16Code, uint32_t arg__u32Period, uint32_t arg__u32MaskTriggerP, uint32_t arg__u32MaskTriggerR, const char* arg__desc, uint16_t arg__u16ReadGroup)
00254 : _u16Code(arg__u16Code), _u32Period(arg__u32Period), _u32MaskTriggerP(arg__u32MaskTriggerP), _u32MaskTriggerR(arg__u32MaskTriggerR), _u16ReadGroup(arg__u16ReadGroup)
00255 {
00256 if (arg__desc) std::copy(arg__desc, arg__desc+(16), &_desc[0]);
00257 }
00258 SrcEventCode() {}
00259
00260 uint16_t code() const { return _u16Code; }
00261
00262 uint32_t period() const { return _u32Period; }
00263
00264 uint32_t maskTriggerP() const { return _u32MaskTriggerP; }
00265
00266 uint32_t maskTriggerR() const { return _u32MaskTriggerR; }
00267
00268 const char* desc() const { return _desc; }
00269
00270 uint16_t readoutGroup() const { return _u16ReadGroup; }
00271 static uint32_t _sizeof() { return (((((16+(1*(DescSize)))+2)+4)-1)/4)*4; }
00272
00273 std::vector<int> desc_shape() const;
00274 private:
00275 uint16_t _u16Code;
00276 uint16_t _u16rsvd;
00277 uint32_t _u32Period;
00278 uint32_t _u32MaskTriggerP;
00279 uint32_t _u32MaskTriggerR;
00280 char _desc[DescSize];
00281 uint16_t _u16ReadGroup;
00282 };
00283
00284
00285
00286
00287
00288
00289
00290 class OutputMap {
00291 public:
00292 enum Source {
00293 Pulse,
00294 DBus,
00295 Prescaler,
00296 Force_High,
00297 Force_Low,
00298 };
00299 enum Conn {
00300 FrontPanel,
00301 UnivIO,
00302 };
00303 OutputMap(EvrData::OutputMap::Source arg__bf_source, uint8_t arg__bf_source_id, EvrData::OutputMap::Conn arg__bf_conn, uint8_t arg__bf_conn_id)
00304 : _v(((arg__bf_source) & 0xff)|(((arg__bf_source_id) & 0xff)<<8)|(((arg__bf_conn) & 0xff)<<16)|(((arg__bf_conn_id) & 0xff)<<24))
00305 {
00306 }
00307 OutputMap() {}
00308 uint32_t value() const { return _v; }
00309 EvrData::OutputMap::Source source() const { return Source(this->_v & 0xff); }
00310 uint8_t source_id() const { return uint8_t((this->_v>>8) & 0xff); }
00311 EvrData::OutputMap::Conn conn() const { return Conn((this->_v>>16) & 0xff); }
00312 uint8_t conn_id() const { return uint8_t((this->_v>>24) & 0xff); }
00313
00314 uint32_t map() const;
00315 static uint32_t _sizeof() { return 4; }
00316 private:
00317 uint32_t _v;
00318 };
00319 std::ostream& operator<<(std::ostream& str, EvrData::OutputMap::Source enval);
00320 std::ostream& operator<<(std::ostream& str, EvrData::OutputMap::Conn enval);
00321
00322
00323
00324
00325
00326
00327
00328 class OutputMapV2 {
00329 public:
00330 enum Source {
00331 Pulse,
00332 DBus,
00333 Prescaler,
00334 Force_High,
00335 Force_Low,
00336 };
00337 enum Conn {
00338 FrontPanel,
00339 UnivIO,
00340 };
00341 OutputMapV2(EvrData::OutputMapV2::Source arg__bf_source, uint8_t arg__bf_source_id, EvrData::OutputMapV2::Conn arg__bf_conn, uint8_t arg__bf_conn_id, uint8_t arg__bf_module)
00342 : _v(((arg__bf_source) & 0xf)|(((arg__bf_source_id) & 0xff)<<4)|(((arg__bf_conn) & 0xf)<<12)|(((arg__bf_conn_id) & 0xff)<<16)|(((arg__bf_module) & 0xff)<<24))
00343 {
00344 }
00345 OutputMapV2() {}
00346 uint32_t value() const { return _v; }
00347 EvrData::OutputMapV2::Source source() const { return Source(this->_v & 0xf); }
00348 uint8_t source_id() const { return uint8_t((this->_v>>4) & 0xff); }
00349 EvrData::OutputMapV2::Conn conn() const { return Conn((this->_v>>12) & 0xf); }
00350 uint8_t conn_id() const { return uint8_t((this->_v>>16) & 0xff); }
00351 uint8_t module() const { return uint8_t((this->_v>>24) & 0xff); }
00352
00353 uint32_t map() const;
00354 static uint32_t _sizeof() { return 4; }
00355 private:
00356 uint32_t _v;
00357 };
00358 std::ostream& operator<<(std::ostream& str, EvrData::OutputMapV2::Source enval);
00359 std::ostream& operator<<(std::ostream& str, EvrData::OutputMapV2::Conn enval);
00360
00361
00362
00363
00364
00365
00366
00367 class ConfigV1 {
00368 public:
00369 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00370 enum { Version = 1 };
00371 virtual ~ConfigV1();
00372 virtual uint32_t npulses() const = 0;
00373 virtual uint32_t noutputs() const = 0;
00374 virtual ndarray<const EvrData::PulseConfig, 1> pulses() const = 0;
00375 virtual ndarray<const EvrData::OutputMap, 1> output_maps() const = 0;
00376 };
00377
00378
00379
00380
00381
00382
00383
00384 class ConfigV2 {
00385 public:
00386 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00387 enum { Version = 2 };
00388 enum { beamOn = 100 };
00389 enum { baseRate = 40 };
00390 enum { singleShot = 150 };
00391 enum RateCode {
00392 r120Hz,
00393 r60Hz,
00394 r30Hz,
00395 r10Hz,
00396 r5Hz,
00397 r1Hz,
00398 r0_5Hz,
00399 Single,
00400 NumberOfRates,
00401 };
00402 enum BeamCode {
00403 Off,
00404 On,
00405 };
00406 virtual ~ConfigV2();
00407 virtual uint32_t opcode() const = 0;
00408 virtual uint32_t npulses() const = 0;
00409 virtual uint32_t noutputs() const = 0;
00410 virtual ndarray<const EvrData::PulseConfig, 1> pulses() const = 0;
00411 virtual ndarray<const EvrData::OutputMap, 1> output_maps() const = 0;
00412 virtual EvrData::ConfigV2::BeamCode beam() const = 0;
00413 virtual EvrData::ConfigV2::RateCode rate() const = 0;
00414 };
00415 std::ostream& operator<<(std::ostream& str, EvrData::ConfigV2::RateCode enval);
00416 std::ostream& operator<<(std::ostream& str, EvrData::ConfigV2::BeamCode enval);
00417
00418
00419
00420
00421
00422
00423
00424 class ConfigV3 {
00425 public:
00426 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00427 enum { Version = 3 };
00428 virtual ~ConfigV3();
00429 virtual uint32_t neventcodes() const = 0;
00430 virtual uint32_t npulses() const = 0;
00431 virtual uint32_t noutputs() const = 0;
00432 virtual ndarray<const EvrData::EventCodeV3, 1> eventcodes() const = 0;
00433 virtual ndarray<const EvrData::PulseConfigV3, 1> pulses() const = 0;
00434 virtual ndarray<const EvrData::OutputMap, 1> output_maps() const = 0;
00435 };
00436
00437
00438
00439
00440
00441
00442
00443 class ConfigV4 {
00444 public:
00445 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00446 enum { Version = 4 };
00447 virtual ~ConfigV4();
00448 virtual uint32_t neventcodes() const = 0;
00449 virtual uint32_t npulses() const = 0;
00450 virtual uint32_t noutputs() const = 0;
00451 virtual ndarray<const EvrData::EventCodeV4, 1> eventcodes() const = 0;
00452 virtual ndarray<const EvrData::PulseConfigV3, 1> pulses() const = 0;
00453 virtual ndarray<const EvrData::OutputMap, 1> output_maps() const = 0;
00454 };
00455
00456
00457
00458
00459
00460
00461
00462 class SequencerEntry {
00463 public:
00464 SequencerEntry(uint32_t eventcode, uint32_t delay)
00465 : _value(((delay) & 0xffffff)|(((eventcode) & 0xff)<<24))
00466 {
00467 }
00468 SequencerEntry() {}
00469 uint32_t delay() const { return uint32_t(this->_value & 0xffffff); }
00470 uint32_t eventcode() const { return uint32_t((this->_value>>24) & 0xff); }
00471 static uint32_t _sizeof() { return 4; }
00472 private:
00473 uint32_t _value;
00474 };
00475
00476
00477
00478
00479
00480
00481
00482 class SequencerConfigV1 {
00483 public:
00484 enum Source {
00485 r120Hz,
00486 r60Hz,
00487 r30Hz,
00488 r10Hz,
00489 r5Hz,
00490 r1Hz,
00491 r0_5Hz,
00492 Disable,
00493 };
00494 virtual ~SequencerConfigV1();
00495 virtual EvrData::SequencerConfigV1::Source sync_source() const = 0;
00496 virtual EvrData::SequencerConfigV1::Source beam_source() const = 0;
00497 virtual uint32_t length() const = 0;
00498 virtual uint32_t cycles() const = 0;
00499 virtual ndarray<const EvrData::SequencerEntry, 1> entries() const = 0;
00500 };
00501 std::ostream& operator<<(std::ostream& str, EvrData::SequencerConfigV1::Source enval);
00502
00503
00504
00505
00506
00507
00508
00509 class ConfigV5 {
00510 public:
00511 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00512 enum { Version = 5 };
00513 enum { MaxPulses = 32 };
00514 enum { EvrOutputs = 10 };
00515 virtual ~ConfigV5();
00516 virtual uint32_t neventcodes() const = 0;
00517 virtual uint32_t npulses() const = 0;
00518 virtual uint32_t noutputs() const = 0;
00519 virtual ndarray<const EvrData::EventCodeV5, 1> eventcodes() const = 0;
00520 virtual ndarray<const EvrData::PulseConfigV3, 1> pulses() const = 0;
00521 virtual ndarray<const EvrData::OutputMap, 1> output_maps() const = 0;
00522 virtual const EvrData::SequencerConfigV1& seq_config() const = 0;
00523 };
00524
00525
00526
00527
00528
00529
00530
00531 class ConfigV6 {
00532 public:
00533 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00534 enum { Version = 6 };
00535 enum { MaxPulses = 256 };
00536 enum { MaxOutputs = 256 };
00537 virtual ~ConfigV6();
00538 virtual uint32_t neventcodes() const = 0;
00539 virtual uint32_t npulses() const = 0;
00540 virtual uint32_t noutputs() const = 0;
00541 virtual ndarray<const EvrData::EventCodeV5, 1> eventcodes() const = 0;
00542 virtual ndarray<const EvrData::PulseConfigV3, 1> pulses() const = 0;
00543 virtual ndarray<const EvrData::OutputMapV2, 1> output_maps() const = 0;
00544 virtual const EvrData::SequencerConfigV1& seq_config() const = 0;
00545 };
00546
00547
00548
00549
00550
00551
00552
00553 class ConfigV7 {
00554 public:
00555 enum { TypeId = Pds::TypeId::Id_EvrConfig };
00556 enum { Version = 7 };
00557 enum { MaxPulses = 256 };
00558 enum { MaxOutputs = 256 };
00559 virtual ~ConfigV7();
00560 virtual uint32_t neventcodes() const = 0;
00561 virtual uint32_t npulses() const = 0;
00562 virtual uint32_t noutputs() const = 0;
00563 virtual ndarray<const EvrData::EventCodeV6, 1> eventcodes() const = 0;
00564 virtual ndarray<const EvrData::PulseConfigV3, 1> pulses() const = 0;
00565 virtual ndarray<const EvrData::OutputMapV2, 1> output_maps() const = 0;
00566 virtual const EvrData::SequencerConfigV1& seq_config() const = 0;
00567 };
00568
00569
00570
00571
00572
00573
00574
00575 class SrcConfigV1 {
00576 public:
00577 enum { TypeId = Pds::TypeId::Id_EvsConfig };
00578 enum { Version = 1 };
00579 enum { MaxPulses = 12 };
00580 enum { MaxOutputs = 12 };
00581 virtual ~SrcConfigV1();
00582 virtual uint32_t neventcodes() const = 0;
00583 virtual uint32_t npulses() const = 0;
00584 virtual uint32_t noutputs() const = 0;
00585 virtual ndarray<const EvrData::SrcEventCode, 1> eventcodes() const = 0;
00586 virtual ndarray<const EvrData::PulseConfigV3, 1> pulses() const = 0;
00587 virtual ndarray<const EvrData::OutputMapV2, 1> output_maps() const = 0;
00588 };
00589
00590
00591
00592
00593
00594
00595
00596 class FIFOEvent {
00597 public:
00598 FIFOEvent(uint32_t arg__timestampHigh, uint32_t arg__timestampLow, uint32_t arg__eventCode)
00599 : _timestampHigh(arg__timestampHigh), _timestampLow(arg__timestampLow), _eventCode(arg__eventCode)
00600 {
00601 }
00602 FIFOEvent() {}
00603
00604 uint32_t timestampHigh() const { return _timestampHigh; }
00605
00606 uint32_t timestampLow() const { return _timestampLow; }
00607
00608 uint32_t eventCode() const { return _eventCode; }
00609 static uint32_t _sizeof() { return 12; }
00610 private:
00611 uint32_t _timestampHigh;
00612 uint32_t _timestampLow;
00613 uint32_t _eventCode;
00614 };
00615
00616
00617
00618
00619
00620
00621
00622 class DataV3 {
00623 public:
00624 enum { TypeId = Pds::TypeId::Id_EvrData };
00625 enum { Version = 3 };
00626 virtual ~DataV3();
00627
00628 virtual uint32_t numFifoEvents() const = 0;
00629
00630 virtual ndarray<const EvrData::FIFOEvent, 1> fifoEvents() const = 0;
00631 };
00632
00633
00634
00635
00636
00637
00638
00639 class DataV4 {
00640 public:
00641 enum { TypeId = Pds::TypeId::Id_EvrData };
00642 enum { Version = 4 };
00643 virtual ~DataV4();
00644
00645 virtual uint32_t numFifoEvents() const = 0;
00646
00647 virtual ndarray<const EvrData::FIFOEvent, 1> fifoEvents() const = 0;
00648
00649 virtual uint8_t present(uint8_t opcode) const = 0;
00650 };
00651
00652
00653
00654
00655
00656
00657
00658 class IOChannel {
00659 public:
00660 enum { NameLength = 12 };
00661 enum { MaxInfos = 8 };
00662 IOChannel(const char* arg__name, uint32_t arg__ninfo, const Pds::DetInfo* arg__info)
00663 : _ninfo(arg__ninfo)
00664 {
00665 if (arg__name) std::copy(arg__name, arg__name+(12), &_name[0]);
00666 if (arg__info) std::copy(arg__info, arg__info+(8), &_info[0]);
00667 }
00668 IOChannel() {}
00669 const char* name() const { return _name; }
00670 uint32_t ninfo() const { return _ninfo; }
00671
00672
00673 ndarray<const Pds::DetInfo, 1> infos() const { return make_ndarray(&_info[0], MaxInfos); }
00674 static uint32_t _sizeof() { return ((((((0+(1*(NameLength)))+4)+(8*(MaxInfos)))+4)-1)/4)*4; }
00675
00676 std::vector<int> name_shape() const;
00677 private:
00678 char _name[NameLength];
00679 uint32_t _ninfo;
00680 Pds::DetInfo _info[MaxInfos];
00681 };
00682
00683
00684
00685
00686
00687
00688
00689 class IOConfigV1 {
00690 public:
00691 enum { TypeId = Pds::TypeId::Id_EvrIOConfig };
00692 enum { Version = 1 };
00693 virtual ~IOConfigV1();
00694 virtual uint16_t nchannels() const = 0;
00695 virtual ndarray<const EvrData::IOChannel, 1> channels() const = 0;
00696 virtual EvrData::OutputMap::Conn conn() const = 0;
00697 };
00698
00699
00700
00701
00702
00703
00704
00705 class IOChannelV2 {
00706 public:
00707 enum { NameLength = 64 };
00708 enum { MaxInfos = 16 };
00709 IOChannelV2(const EvrData::OutputMapV2& arg__output, const char* arg__name, uint32_t arg__ninfo, const Pds::DetInfo* arg__info)
00710 : _output(arg__output), _ninfo(arg__ninfo)
00711 {
00712 if (arg__name) std::copy(arg__name, arg__name+(64), &_name[0]);
00713 if (arg__info) std::copy(arg__info, arg__info+(16), &_info[0]);
00714 }
00715 IOChannelV2() {}
00716
00717 const EvrData::OutputMapV2& output() const { return _output; }
00718
00719 const char* name() const { return _name; }
00720
00721 uint32_t ninfo() const { return _ninfo; }
00722
00723
00724
00725
00726 ndarray<const Pds::DetInfo, 1> infos() const { return make_ndarray(&_info[0], MaxInfos); }
00727 static uint32_t _sizeof() { return (((((((0+(EvrData::OutputMapV2::_sizeof()))+(1*(NameLength)))+4)+(8*(MaxInfos)))+4)-1)/4)*4; }
00728
00729 std::vector<int> name_shape() const;
00730 private:
00731 EvrData::OutputMapV2 _output;
00732 char _name[NameLength];
00733 uint32_t _ninfo;
00734 Pds::DetInfo _info[MaxInfos];
00735 };
00736
00737
00738
00739
00740
00741
00742
00743 class IOConfigV2 {
00744 public:
00745 enum { TypeId = Pds::TypeId::Id_EvrIOConfig };
00746 enum { Version = 2 };
00747 virtual ~IOConfigV2();
00748
00749 virtual uint32_t nchannels() const = 0;
00750
00751 virtual ndarray<const EvrData::IOChannelV2, 1> channels() const = 0;
00752 };
00753 }
00754 }
00755 #endif // PSANA_EVR_DDL_H