My Project
evr_frib.h
1 /*
2  * This software is Copyright by the Board of Trustees of Michigan
3  * State University (c) Copyright 2017.
4  * Copyright (c) 2022 Cosylab d.d.
5  *
6  * Author: Michael Davidsaver <mdavidsaver@gmail.com>
7  */
8 #ifndef EVR_FRIB_H
9 #define EVR_FRIB_H
10 
11 #include <stdexcept>
12 #include <vector>
13 
14 #include <dbScan.h>
15 #include <epicsMutex.h>
16 
17 #include "evr/evr.h"
18 #include "evr/pulser.h"
19 #include "evr/prescaler.h"
20 #include "evr/output.h"
21 
22 struct EVRFRIB;
23 
24 struct OutputFRIB : public Output
25 {
26  epicsUInt32 src;
27  EVRFRIB *evr;
28 
29  OutputFRIB(const std::string& n, epicsUInt32 src, EVRFRIB *evr);
30  virtual ~OutputFRIB();
31 
32  virtual epicsUInt32 source() const { return src; }
33  virtual void setSource(epicsUInt32) {}
34 
35  virtual bool enabled() const;
36  virtual void enable(bool);
37 
38  virtual void lock() const;
39  virtual void unlock() const;
40 };
41 
42 struct PreScalerFRIB : public PreScaler
43 {
44  PreScalerFRIB(const std::string& n, EVRFRIB& o);
45  virtual ~PreScalerFRIB();
46 
47  virtual epicsUInt32 prescaler() const;
48  virtual void setPrescaler(epicsUInt32);
49 
50  virtual void lock() const;
51  virtual void unlock() const;
52 };
53 
54 struct PulserFRIB : public Pulser
55 {
56  unsigned n;
57  EVRFRIB *evr;
58 
59  PulserFRIB(const std::string& s, unsigned n, EVRFRIB *evr);
60  virtual ~PulserFRIB();
61 
62  virtual bool enabled() const { return true;}
63  virtual void enable(bool) {}
64 
65  virtual void softSet() {}
66  virtual void softReset() {}
67 
68  virtual void setDelayRaw(epicsUInt32);
69  virtual void setDelay(double);
70  virtual epicsUInt32 delayRaw() const;
71  virtual double delay() const;
72 
73  virtual void setWidthRaw(epicsUInt32);
74  virtual void setWidth(double);
75  virtual epicsUInt32 widthRaw() const;
76  virtual double width() const;
77 
78  virtual epicsUInt32 prescaler() const { return 1u; }
79  virtual void setPrescaler(epicsUInt32) {}
80 
81  virtual epicsUInt32 psTrig() const { return 0u; }
82  virtual void setPSTrig(epicsUInt32) {}
83 
84  virtual epicsUInt32 dbusTrig() const { return 0u; }
85  virtual void setDBusTrig(epicsUInt32) {}
86 
87  virtual bool polarityInvert() const { return false; }
88  virtual void setPolarityInvert(bool) {}
89 
90  virtual MapType::type mappedSource(epicsUInt32 src) const;
91  virtual void sourceSetMap(epicsUInt32 src,MapType::type action);
92 
93  virtual void lock() const;
94  virtual void unlock() const;
95 };
96 
97 struct EVRFRIB : public mrf::ObjectInst<EVRFRIB, EVR>
98 {
99  typedef mrf::ObjectInst<EVRFRIB, EVR> base_t;
100 
101  mutable epicsMutex mutex;
102 
103  volatile unsigned char *base;
104 
105  double clockFreq; // MHz
106 
107  bool is_evg, internal_clk;
108 
109  // epicsTime = HWtime - timeoffset
110  epicsUInt32 timeoffset;
111 
112  IOSCANPVT statusScan;
113 
114  PreScalerFRIB divider;
115  PulserFRIB pulse0, pulse1;
116  OutputFRIB out_divider,
117  out_pulse0,
118  out_pulse1;
119 
120  struct PulseMap {
121  MapType::type active;
122  unsigned cnt;
123  PulseMap() :active(MapType::None), cnt(0u) {}
124  };
125  struct EvtMap {
126  PulseMap pulse[2];
127  };
128  typedef std::vector<EvtMap> mappings_t;
129  mappings_t mappings;
130 
131  // our methods
132 
133  EVRFRIB(const std::string& s, bus_configuration& busConfig, volatile unsigned char *base);
134  virtual ~EVRFRIB();
135 
136  // from Status
137  epicsUInt32 machineCycles() const;
138 
139  epicsUInt32 Config() const;
140  void setConfig(epicsUInt32 v);
141 
142  // From Command
143  epicsUInt32 Command() const;
144  void setCommand(epicsUInt32 v);
145 
146  epicsUInt32 FPSCommCnt() const;
147  epicsUInt32 FPSStatus() const;
148  epicsUInt32 FPSSource() const;
149  epicsUInt32 BeamOnTime() const;
150 
151  // methods from Object
152 
153  virtual void lock() const;
154  virtual void unlock() const;
155 
156  // methods from EVR
157 
158  virtual std::string model() const;
159  virtual MRFVersion version() const;
160 
161  virtual bool enabled() const { return true; }
162  virtual void enable(bool) {}
163 
164  virtual bool mappedOutputState() const { return false; }
165 
166  virtual bool specialMapped(epicsUInt32 code, epicsUInt32 func) const { return false; }
167  virtual void specialSetMap(epicsUInt32 code, epicsUInt32 func,bool set) {}
168 
169  virtual double clock() const;
170  virtual void clockSet(double clk);
171 
172  virtual bool pllLocked() const { return linkStatus(); }
173 
174  virtual epicsUInt32 uSecDiv() const { return 0; }
175 
176  virtual bool extInhib() const { return false; }
177  virtual void setExtInhib(bool) {}
178 
179  virtual void setSourceTS(TSSource) { }
180  virtual TSSource SourceTS() const { return TSSourceInternal; }
181 
182  virtual double clockTS() const;
183  virtual void clockTSSet(double);
184 
185  virtual epicsUInt32 tsDiv() const { return 1u; }
186 
190  virtual bool interestedInEvent(epicsUInt32 event,bool set);
191 
192  virtual bool TimeStampValid() const;
193  virtual IOSCANPVT TimeStampValidEvent() const { return statusScan; }
194 
195  virtual bool getTimeStamp(epicsTimeStamp *ts,epicsUInt32 event);
196 
201  virtual bool getTicks(epicsUInt32 *tks);
202 
203  virtual IOSCANPVT eventOccurred(epicsUInt32 event) const;
204 
205  virtual void eventNotifyAdd(epicsUInt32 event, eventCallback, void*);
206  virtual void eventNotifyDel(epicsUInt32 event, eventCallback, void*);
207 
208  virtual epicsUInt32 irqCount() const { return 0; }
209 
210  virtual bool linkStatus() const;
211  virtual IOSCANPVT linkChanged() const { return statusScan; }
212  virtual epicsUInt32 recvErrorCount() const { return 0; }
213 
214  virtual epicsUInt16 dbus() const { return 0; }
215 
216  virtual epicsUInt32 heartbeatTIMOCount() const { return 0; }
217  virtual IOSCANPVT heartbeatTIMOOccured() const { return statusScan; }
218 
219  virtual epicsUInt32 FIFOFullCount() const { return 0; }
220  virtual epicsUInt32 FIFOOverRate() const { return 0; }
221  virtual epicsUInt32 FIFOEvtCount() const { return 0; }
222  virtual epicsUInt32 FIFOLoopCount() const { return 0; }
223 };
224 
225 
226 #endif // EVR_FRIB_H
A programmable delay unit.
Definition: pulser.h:40
virtual void sourceSetMap(epicsUInt32 src, MapType::type action)=0
Set mapping of source 'src'.
virtual MapType::type mappedSource(epicsUInt32 src) const =0
What action is source 'src' mapped to?
User implementation hook.
Definition: object.h:460