00001 #ifndef PSANA_ENCODER_DDL_H
00002 #define PSANA_ENCODER_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 Encoder {
00013
00014
00015
00016
00017
00018
00019
00020 class ConfigV1 {
00021 public:
00022 enum { TypeId = Pds::TypeId::Id_EncoderConfig };
00023 enum { Version = 1 };
00024 enum count_mode_type {
00025 WRAP_FULL,
00026 LIMIT,
00027 HALT,
00028 WRAP_PRESET,
00029 COUNT_END,
00030 };
00031 enum quad_mode {
00032 CLOCK_DIR,
00033 X1,
00034 X2,
00035 X4,
00036 QUAD_END,
00037 };
00038 virtual ~ConfigV1();
00039 virtual uint32_t chan_num() const = 0;
00040 virtual Encoder::ConfigV1::count_mode_type count_mode() const = 0;
00041 virtual Encoder::ConfigV1::quad_mode quadrature_mode() const = 0;
00042 virtual uint32_t input_num() const = 0;
00043 virtual uint32_t input_rising() const = 0;
00044 virtual uint32_t ticks_per_sec() const = 0;
00045 };
00046 std::ostream& operator<<(std::ostream& str, Encoder::ConfigV1::count_mode_type enval);
00047 std::ostream& operator<<(std::ostream& str, Encoder::ConfigV1::quad_mode enval);
00048
00049
00050
00051
00052
00053
00054
00055 class ConfigV2 {
00056 public:
00057 enum { TypeId = Pds::TypeId::Id_EncoderConfig };
00058 enum { Version = 2 };
00059 enum count_mode_type {
00060 WRAP_FULL,
00061 LIMIT,
00062 HALT,
00063 WRAP_PRESET,
00064 COUNT_END,
00065 };
00066 enum quad_mode {
00067 CLOCK_DIR,
00068 X1,
00069 X2,
00070 X4,
00071 QUAD_END,
00072 };
00073 virtual ~ConfigV2();
00074 virtual uint32_t chan_mask() const = 0;
00075 virtual Encoder::ConfigV2::count_mode_type count_mode() const = 0;
00076 virtual Encoder::ConfigV2::quad_mode quadrature_mode() const = 0;
00077 virtual uint32_t input_num() const = 0;
00078 virtual uint32_t input_rising() const = 0;
00079 virtual uint32_t ticks_per_sec() const = 0;
00080 };
00081 std::ostream& operator<<(std::ostream& str, Encoder::ConfigV2::count_mode_type enval);
00082 std::ostream& operator<<(std::ostream& str, Encoder::ConfigV2::quad_mode enval);
00083
00084
00085
00086
00087
00088
00089
00090 class DataV1 {
00091 public:
00092 enum { TypeId = Pds::TypeId::Id_EncoderData };
00093 enum { Version = 1 };
00094 virtual ~DataV1();
00095 virtual uint32_t timestamp() const = 0;
00096 virtual uint32_t encoder_count() const = 0;
00097
00098 virtual int32_t value() const = 0;
00099 };
00100
00101
00102
00103
00104
00105
00106
00107 class DataV2 {
00108 public:
00109 enum { TypeId = Pds::TypeId::Id_EncoderData };
00110 enum { Version = 2 };
00111 enum { NEncoders = 3 };
00112 virtual ~DataV2();
00113 virtual uint32_t timestamp() const = 0;
00114 virtual ndarray<const uint32_t, 1> encoder_count() const = 0;
00115
00116 virtual int32_t value(uint32_t i) const = 0;
00117 };
00118 }
00119 }
00120 #endif // PSANA_ENCODER_DDL_H