00001 #ifndef PSANA_IMP_DDL_H
00002 #define PSANA_IMP_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 namespace Psana {
00012 namespace Imp {
00013
00014
00015
00016
00017
00018
00019
00020 class ConfigV1 {
00021 public:
00022 enum { TypeId = Pds::TypeId::Id_ImpConfig };
00023 enum { Version = 1 };
00024 enum { MaxNumberOfSamples = 0x3ff };
00025 enum Registers {
00026 Range,
00027 Cal_range,
00028 Reset,
00029 Bias_data,
00030 Cal_data,
00031 BiasDac_data,
00032 Cal_strobe,
00033 NumberOfSamples,
00034 TrigDelay,
00035 Adc_delay,
00036 NumberOfRegisters,
00037 };
00038 virtual ~ConfigV1();
00039 virtual uint32_t range() const = 0;
00040 virtual uint32_t calRange() const = 0;
00041 virtual uint32_t reset() const = 0;
00042 virtual uint32_t biasData() const = 0;
00043 virtual uint32_t calData() const = 0;
00044 virtual uint32_t biasDacData() const = 0;
00045 virtual uint32_t calStrobe() const = 0;
00046 virtual uint32_t numberOfSamples() const = 0;
00047 virtual uint32_t trigDelay() const = 0;
00048 virtual uint32_t adcDelay() const = 0;
00049 };
00050 std::ostream& operator<<(std::ostream& str, Imp::ConfigV1::Registers enval);
00051
00052
00053
00054
00055
00056
00057
00058 class Sample {
00059 public:
00060 enum { channelsPerDevice = 4 };
00061 Sample(const uint16_t* arg__channels)
00062 {
00063 if (arg__channels) std::copy(arg__channels, arg__channels+(4), &_channels[0]);
00064 }
00065 Sample() {}
00066
00067
00068 ndarray<const uint16_t, 1> channels() const { return make_ndarray(&_channels[0], 4); }
00069 static uint32_t _sizeof() { return ((((0+(2*(4)))+2)-1)/2)*2; }
00070 private:
00071 uint16_t _channels[4];
00072 };
00073
00074
00075
00076
00077
00078
00079
00080 class LaneStatus {
00081 public:
00082 LaneStatus(uint8_t arg__usLinkErrCount, uint8_t arg__usLinkDownCount, uint8_t arg__usCellErrCount, uint8_t arg__usRxCount, uint8_t arg__usLocLinked, uint8_t arg__usRemLinked, uint16_t arg__zeros, uint8_t arg__powersOkay)
00083 : _value(((arg__usLinkErrCount) & 0xf)|(((arg__usLinkDownCount) & 0xf)<<4)|(((arg__usCellErrCount) & 0xf)<<8)|(((arg__usRxCount) & 0xf)<<12)|(((arg__usLocLinked) & 0x1)<<16)|(((arg__usRemLinked) & 0x1)<<17)|(((arg__zeros) & 0x3ff)<<18)|(((arg__powersOkay) & 0xf)<<28))
00084 {
00085 }
00086 LaneStatus() {}
00087 uint8_t linkErrCount() const { return uint8_t(this->_value & 0xf); }
00088 uint8_t linkDownCount() const { return uint8_t((this->_value>>4) & 0xf); }
00089 uint8_t cellErrCount() const { return uint8_t((this->_value>>8) & 0xf); }
00090 uint8_t rxCount() const { return uint8_t((this->_value>>12) & 0xf); }
00091 uint8_t locLinked() const { return uint8_t((this->_value>>16) & 0x1); }
00092 uint8_t remLinked() const { return uint8_t((this->_value>>17) & 0x1); }
00093 uint16_t zeros() const { return uint16_t((this->_value>>18) & 0x3ff); }
00094 uint8_t powersOkay() const { return uint8_t((this->_value>>28) & 0xf); }
00095 static uint32_t _sizeof() { return 4; }
00096 private:
00097 uint32_t _value;
00098 };
00099
00100
00101
00102
00103
00104
00105 class ConfigV1;
00106
00107 class ElementV1 {
00108 public:
00109 enum { TypeId = Pds::TypeId::Id_ImpData };
00110 enum { Version = 1 };
00111 virtual ~ElementV1();
00112 virtual uint8_t vc() const = 0;
00113 virtual uint8_t lane() const = 0;
00114 virtual uint32_t frameNumber() const = 0;
00115 virtual uint32_t range() const = 0;
00116 virtual const Imp::LaneStatus& laneStatus() const = 0;
00117 virtual ndarray<const Imp::Sample, 1> samples() const = 0;
00118 };
00119 }
00120 }
00121 #endif // PSANA_IMP_DDL_H