mrfioc2  2.3.0
evgMrm.h
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2010 Brookhaven Science Associates, as Operator of
3 * Brookhaven National Laboratory.
4 * Copyright (c) 2015 Paul Scherrer Institute (PSI), Villigen, Switzerland
5 * mrfioc2 is distributed subject to a Software License Agreement found
6 * in file LICENSE that is included with this distribution.
7 \*************************************************************************/
8 #ifndef EVG_MRM_H
9 #define EVG_MRM_H
10 
11 #include <vector>
12 #include <map>
13 #include <string>
14 
15 #include <stdio.h>
16 #include <dbScan.h>
17 #include <callback.h>
18 #include <epicsMutex.h>
19 #include <epicsTimer.h>
20 #include <errlog.h>
21 #include <epicsTime.h>
22 #include <generalTimeSup.h>
23 #include <epicsThread.h>
24 #include <epicsEvent.h>
25 #include <epicsMutex.h>
26 
27 #include <devLibPCI.h>
28 
29 #include "evgAcTrig.h"
30 #include "evgEvtClk.h"
31 #include "evgTrigEvt.h"
32 #include "evgMxc.h"
33 #include "evgDbus.h"
34 #include "evgInput.h"
35 #include "evgOutput.h"
36 #include "mrmDataBufTx.h"
37 #include "mrmtimesrc.h"
38 #include "mrmevgseq.h"
39 #include "mrmspi.h"
40 #include "configurationInfo.h"
41 #include "drvem.h"
42 
43 /*********
44  * Each EVG will be represented by the instance of class 'evgMrm'. Each evg
45  * object maintains a list to all the evg sub-componets i.e. Event clock,
46  * Software Events, Trigger Events, Distributed bus, Multiplex Counters,
47  * Input, Output etc.
48  */
49 class wdTimer;
50 class wdTimer1;
51 
52 class FCT;
53 
55 
56 class evgMrm : public mrf::ObjectInst<evgMrm>,
57  public TimeStampSource,
58  public MRMSPI
59 {
60 public:
61  struct Config {
62  const char *model;
63  unsigned numFrontInp,
64  numUnivInp,
65  numRearInp;
66  };
67 
68  evgMrm(const std::string& id,
69  const Config *conf,
70  bus_configuration& busConfig,
71  volatile epicsUInt8* const base,
72  const epicsPCIDevice* pciDevice);
73  ~evgMrm();
74 
75  void enableIRQ();
76 
77  /* locking done internally: TODO: not really... */
78  virtual void lock() const{};
79  virtual void unlock() const{};
80  epicsMutex m_lock;
81 
83  const std::string getId() const;
84  volatile epicsUInt8* getRegAddr() const;
85  MRFVersion version() const;
86  std::string getFwVersionStr() const;
87  std::string getSwVersion() const;
88 
89  void enable(epicsUInt16);
90  epicsUInt16 enabled() const;
91 
92  bool getResetMxc() const {return true;}
93  void resetMxc(bool reset);
94  epicsUInt32 getDbusStatus() const;
95 
96  IOSCANPVT timeErrorScan() const { return ioScanTimestamp; }
97 
98  virtual void postSoftSecondsSrc();
99 
100  // event clock
101  epicsFloat64 getFrequency() const;
102 
103  void setRFFreq(epicsFloat64);
104  epicsFloat64 getRFFreq() const;
105 
106  void setRFDiv(epicsUInt32);
107  epicsUInt32 getRFDiv() const;
108 
109  void setFracSynFreq(epicsFloat64);
110  epicsFloat64 getFracSynFreq() const;
111 
112  // see ClockCtrl[RFSEL]
113  enum ClkSrc {
117  ClkSrcRecovered=4, // fanout mode
118  ClkSrcSplit=5, // split, external on downstream, recovered on upstream
121  };
122  void setSource(epicsUInt16);
123  epicsUInt16 getSource() const;
124 
125  bool pllLocked() const;
126 
128  static void isr(evgMrm *evg, bool pci);
129  static void isr_pci(void*);
130  static void isr_vme(void*);
131  static void isr_poll(void*);
132  static void init_cb(CALLBACK*, int, void(*)(CALLBACK*), void*);
133  static void process_inp_cb(CALLBACK*);
134 
135  void setEvtCode(epicsUInt32);
136 
137  // use w/ Object properties for which no getter is necessary
138  epicsUInt32 writeonly() const { return 0; }
139 
141  evgInput* getInput(epicsUInt32, InputType);
142  epicsEvent* getTimerEvent();
144 
145  CALLBACK irqExtInp_cb;
146 
147  unsigned char irqExtInp_queued;
148 
149  IOSCANPVT ioScanTimestamp;
150 
152 
153  void show(int lvl);
154 
155  const epicsPCIDevice* m_pciDevice;
156 
157 private:
158  const std::string m_id;
159  volatile epicsUInt8* const m_pReg;
160  const bus_configuration busConfiguration;
161 
162  epicsFloat64 m_RFref; // In MHz
163  epicsFloat64 m_fracSynFreq; // In MHz
164  unsigned m_RFDiv;
165  ClkSrc m_ClkSrc;
166  void recalcRFDiv();
167 
168  EvgSeqManager m_seq;
169 
170  evgAcTrig m_acTrig;
171 
172  typedef std::vector<evgTrigEvt*> TrigEvt_t;
173  TrigEvt_t m_trigEvt;
174 
175  typedef std::vector<evgMxc*> MuxCounter_t;
176  MuxCounter_t m_muxCounter;
177 
178  typedef std::vector<evgDbus*> Dbus_t;
179  Dbus_t m_dbus;
180 
181  typedef std::map< std::pair<epicsUInt32, InputType>, evgInput*> Input_t;
182  Input_t m_input;
183 
184 public:
185  typedef Input_t::iterator inputs_iterator;
186  inputs_iterator beginInputs() { return m_input.begin(); }
187  inputs_iterator endInputs() { return m_input.end(); }
188 private:
189 
190  typedef std::map< std::pair<epicsUInt32, evgOutputType>, evgOutput*> Output_t;
191  Output_t m_output;
192 
193  epicsEvent m_timerEvent;
194 
195  epicsUInt32 shadowIrqEnable;
196 
197  // EVM only
198  mrf::auto_ptr<FCT> fct;
199  mrf::auto_ptr<EVRMRM> evru, evrd;
200 };
201 
202 #endif //EVG_MRM_H
epicsEvent * getTimerEvent()
Definition: evgMrm.cpp:425
std::string getFwVersionStr() const
Definition: evgMrm.cpp:228
static void isr_vme(void *)
Definition: evgMrm.cpp:299
std::string getSwVersion() const
Definition: evgMrm.cpp:234
epicsMutex m_lock
Definition: evgMrm.h:79
void show(int lvl)
Definition: evgMrm.cpp:434
IOSCANPVT timeErrorScan() const
Definition: evgMrm.h:96
epicsFloat64 getFrequency() const
Definition: evgEvtClk.cpp:15
void setEvtCode(epicsUInt32)
Definition: evgMrm.cpp:400
epicsUInt32 getRFDiv() const
Definition: evgEvtClk.cpp:59
epicsFloat64 getFracSynFreq() const
Definition: evgEvtClk.cpp:91
ClkSrc
Definition: evgMrm.h:113
~evgMrm()
Definition: evgMrm.cpp:172
unsigned numUnivInp
Definition: evgMrm.h:63
static void process_inp_cb(CALLBACK *)
Definition: evgMrm.cpp:374
void enable(epicsUInt16)
Definition: evgMrm.cpp:244
volatile epicsUInt8 * getRegAddr() const
Definition: evgMrm.cpp:219
Definition: fct.h:19
void resetMxc(bool reset)
Definition: evgMrm.cpp:272
bool getResetMxc() const
Definition: evgMrm.h:92
mrmDataBufTx m_buftx
Definition: evgMrm.h:151
inputs_iterator endInputs()
Definition: evgMrm.h:187
CALLBACK irqExtInp_cb
Definition: evgMrm.h:145
IOSCANPVT ioScanTimestamp
Definition: evgMrm.h:149
Definition: mrmspi.h:20
static void isr_poll(void *)
Definition: evgMrm.cpp:307
epicsUInt32 getDbusStatus() const
Definition: evgMrm.cpp:239
virtual void postSoftSecondsSrc()
Definition: evgMrm.cpp:393
unsigned char irqExtInp_queued
Definition: evgMrm.h:147
User implementation hook.
Definition: object.h:459
const bus_configuration * getBusConfiguration()
Definition: evgMrm.cpp:429
ALARM_TS
Definition: evgMrm.h:54
void setRFDiv(epicsUInt32)
Definition: evgEvtClk.cpp:46
evgInput * getInput(epicsUInt32, InputType)
Definition: evgMrm.cpp:416
void enableIRQ()
Definition: evgMrm.cpp:192
const epicsPCIDevice * m_pciDevice
Definition: evgMrm.h:155
bool pllLocked() const
Definition: evgEvtClk.cpp:120
epicsUInt16 getSource() const
Definition: evgEvtClk.cpp:114
virtual void unlock() const
Definition: evgMrm.h:79
static void init_cb(CALLBACK *, int, void(*)(CALLBACK *), void *)
Definition: evgMrm.cpp:206
InputType
Definition: evgInput.h:11
static void isr(evgMrm *evg, bool pci)
Definition: evgMrm.cpp:315
Input_t::iterator inputs_iterator
Definition: evgMrm.h:185
void setFracSynFreq(epicsFloat64)
Definition: evgEvtClk.cpp:64
void setRFFreq(epicsFloat64)
Definition: evgEvtClk.cpp:30
const std::string getId() const
Definition: evgMrm.cpp:214
epicsUInt16 enabled() const
Definition: evgMrm.cpp:264
static void isr_pci(void *)
Definition: evgMrm.cpp:280
epicsFloat64 getRFFreq() const
Definition: evgEvtClk.cpp:41
epicsUInt32 writeonly() const
Definition: evgMrm.h:138
evgMrm(const std::string &id, const Config *conf, bus_configuration &busConfig, volatile epicsUInt8 *const base, const epicsPCIDevice *pciDevice)
Definition: evgMrm.cpp:73
unsigned numFrontInp
Definition: evgMrm.h:63
const char * model
Definition: evgMrm.h:62
virtual void lock() const
Definition: evgMrm.h:78
Definition: evgMrm.h:56
void setSource(epicsUInt16)
Definition: evgEvtClk.cpp:96
MRFVersion version() const
Definition: evgMrm.cpp:223
unsigned numRearInp
Definition: evgMrm.h:63
inputs_iterator beginInputs()
Definition: evgMrm.h:186