mrfioc2  2.3.0
Public Member Functions | List of all members
MRMPulser Class Reference

#include <drvemPulser.h>

Inheritance diagram for MRMPulser:
Inheritance graph
[legend]
Collaboration diagram for MRMPulser:
Collaboration graph
[legend]

Public Member Functions

 MRMPulser (const std::string &n, epicsUInt32, EVRMRM &)
 
virtual ~MRMPulser ()
 
virtual void lock () const OVERRIDE FINAL
 
virtual void unlock () const OVERRIDE FINAL
 
virtual bool enabled () const OVERRIDE FINAL
 
virtual void enable (bool) OVERRIDE FINAL
 
virtual void setDelayRaw (epicsUInt32) OVERRIDE FINAL
 
virtual void setDelay (double) OVERRIDE FINAL
 
virtual epicsUInt32 delayRaw () const OVERRIDE FINAL
 
virtual double delay () const OVERRIDE FINAL
 
virtual void setWidthRaw (epicsUInt32) OVERRIDE FINAL
 
virtual void setWidth (double) OVERRIDE FINAL
 
virtual epicsUInt32 widthRaw () const OVERRIDE FINAL
 
virtual double width () const OVERRIDE FINAL
 
virtual epicsUInt32 prescaler () const OVERRIDE FINAL
 
virtual void setPrescaler (epicsUInt32) OVERRIDE FINAL
 
virtual bool polarityInvert () const OVERRIDE FINAL
 
virtual void setPolarityInvert (bool) OVERRIDE FINAL
 
epicsUInt32 enables () const
 
void setEnables (epicsUInt32 inps)
 
epicsUInt32 masks () const
 
void setMasks (epicsUInt32 inps)
 
virtual MapType::type mappedSource (epicsUInt32 src) const OVERRIDE FINAL
 What action is source 'src' mapped to? More...
 
virtual void sourceSetMap (epicsUInt32 src, MapType::type action) OVERRIDE FINAL
 Set mapping of source 'src'. More...
 
- Public Member Functions inherited from mrf::ObjectInst< MRMPulser, Pulser >
virtual propertyBasegetPropertyBase (const char *pname, const std::type_info &ptype)
 
virtual void visitProperties (bool(*cb)(propertyBase *, void *), void *arg)
 
- Public Member Functions inherited from Pulser
 Pulser (const std::string &n)
 
virtual ~Pulser ()=0
 
- Public Member Functions inherited from mrf::Object
const std::string & name () const
 
const Objectparent () const
 
child_iterator beginChild () const
 
child_iterator endChild () const
 
template<typename P >
mrf::auto_ptr< property< P > > getProperty (const char *pname)
 

Additional Inherited Members

- Public Types inherited from mrf::Object
typedef m_obj_children_t::const_iterator child_iterator
 
typedef std::map< std::string, std::string > create_args_t
 
typedef Object *(* create_factory_t) (const std::string &name, const std::string &klass, const create_args_t &args)
 
- Static Public Member Functions inherited from mrf::ObjectInst< MRMPulser, Pulser >
static int initObject ()
 
- Static Public Member Functions inherited from mrf::ObjectInst< Pulser >
static int initObject ()
 
- Static Public Member Functions inherited from mrf::Object
static ObjectgetObject (const std::string &name)
 
static ObjectgetCreateObject (const std::string &name, const std::string &klass, const create_args_t &args=create_args_t())
 
static void addFactory (const std::string &klass, create_factory_t fn)
 
static void visitObjects (bool(*)(Object *, void *), void *)
 
- Protected Member Functions inherited from mrf::ObjectInst< MRMPulser, Pulser >
 ObjectInst (const std::string &n)
 
 ObjectInst (const std::string &n, A &a)
 
virtual ~ObjectInst ()
 
- Protected Member Functions inherited from mrf::ObjectInst< Pulser >
 ObjectInst (const std::string &n)
 
 ObjectInst (const std::string &n, A &a)
 
- Protected Member Functions inherited from mrf::Object
 Object (const std::string &n, const Object *par=0)
 
virtual ~Object ()=0
 

Detailed Description

Definition at line 20 of file drvemPulser.h.

Constructor & Destructor Documentation

◆ MRMPulser()

MRMPulser::MRMPulser ( const std::string &  n,
epicsUInt32  i,
EVRMRM o 
)

Definition at line 28 of file drvemPulser.cpp.

29  :base_t(n)
30  ,id(i)
31  ,owner(o)
32 {
33  if(id>31)
34  throw std::out_of_range("pulser id is out of range");
35 
36  std::memset(&this->mapped, 0, NELEMENTS(this->mapped));
37 }

◆ ~MRMPulser()

virtual MRMPulser::~MRMPulser ( )
inlinevirtual

Definition at line 28 of file drvemPulser.h.

28 {};

Member Function Documentation

◆ delay()

double MRMPulser::delay ( ) const
virtual

Implements Pulser.

Definition at line 84 of file drvemPulser.cpp.

85 {
86  double scal=double(prescaler());
87  double ticks=double(delayRaw());
88  double clk=owner.clock(); // in MHz. MTicks/second
89  if (scal<=0) scal=1;
90 
91  return (ticks*scal)/clk;
92 }
virtual double clock() const OVERRIDE FINAL
Definition: drvem.h:141
virtual epicsUInt32 delayRaw() const OVERRIDE FINAL
Definition: drvemPulser.cpp:78
virtual epicsUInt32 prescaler() const OVERRIDE FINAL

◆ delayRaw()

epicsUInt32 MRMPulser::delayRaw ( ) const
virtual

Implements Pulser.

Definition at line 78 of file drvemPulser.cpp.

79 {
80  return READ32(owner.base,PulserDely(id));
81 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223

◆ enable()

void MRMPulser::enable ( bool  s)
virtual

Implements Pulser.

Definition at line 49 of file drvemPulser.cpp.

50 {
51  if(s)
52  BITSET(NAT,32,owner.base, PulserCtrl(id),
54  else
55  BITCLR(NAT,32,owner.base, PulserCtrl(id),
57 }
#define BITCLR(ord, len, base, offset, mask)
Definition: mrfBitOps.h:26
#define PulserCtrl_mtrg
Definition: evrRegMap.h:208
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_ena
Definition: evrRegMap.h:207
#define PulserCtrl_mset
Definition: evrRegMap.h:209
#define BITSET(ord, len, base, offset, mask)
Definition: mrfBitOps.h:21
#define PulserCtrl_mrst
Definition: evrRegMap.h:210

◆ enabled()

bool MRMPulser::enabled ( ) const
virtual

Implements Pulser.

Definition at line 43 of file drvemPulser.cpp.

44 {
45  return READ32(owner.base, PulserCtrl(id)) & PulserCtrl_ena;
46 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_ena
Definition: evrRegMap.h:207

◆ enables()

epicsUInt32 MRMPulser::enables ( ) const

Definition at line 156 of file drvemPulser.cpp.

157 {
158  return (READ32(owner.base, PulserCtrl(id)) & PulserCtrl_enables)>>PulserCtrl_enables_shift;
159 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_enables
Definition: evrRegMap.h:205
#define PulserCtrl_enables_shift
Definition: evrRegMap.h:206

◆ lock()

void MRMPulser::lock ( ) const
virtual

Implements mrf::Object.

Definition at line 39 of file drvemPulser.cpp.

39 {owner.lock();};
virtual void lock() const OVERRIDE FINAL
Definition: drvem.h:121

◆ mappedSource()

MapType::type MRMPulser::mappedSource ( epicsUInt32  src) const
virtual

What action is source 'src' mapped to?

Implements Pulser.

Definition at line 201 of file drvemPulser.cpp.

202 {
203  if(evt>255)
204  throw std::out_of_range("Event code is out of range");
205 
206  if(evt==0)
207  return MapType::None;
208 
209  epicsUInt32 map[3];
210 
211  map[0]=READ32(owner.base, MappingRam(0,evt,Trigger));
212  map[1]=READ32(owner.base, MappingRam(0,evt,Set));
213  map[2]=READ32(owner.base, MappingRam(0,evt,Reset));
214 
215  epicsUInt32 pmask=1<<id, insanity=0;
216 
218 
219  if(map[0]&pmask){
220  ret=MapType::Trigger;
221  insanity++;
222  }
223  if(map[1]&pmask){
224  ret=MapType::Set;
225  insanity++;
226  }
227  if(map[2]&pmask){
228  ret=MapType::Reset;
229  insanity++;
230  }
231  if(insanity>1){
232  errlogPrintf("EVR %s pulser #%d code %02x maps too many actions %08x %08x %08x\n",
233  owner.name().c_str(),id,evt,map[0],map[1],map[2]);
234  }
235 
236  if( (ret==MapType::None) ^ _ismap(evt) ){
237  errlogPrintf("EVR %s pulser #%d code %02x mapping (%08x %08x %08x) is out of sync with view (%d)\n",
238  owner.name().c_str(),id,evt,map[0],map[1],map[2],_ismap(evt));
239  }
240 
241  return ret;
242 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
type
Definition: pulser.h:21
const std::string & name() const
Definition: object.h:393

◆ masks()

epicsUInt32 MRMPulser::masks ( ) const

Definition at line 178 of file drvemPulser.cpp.

179 {
180  return (READ32(owner.base, PulserCtrl(id)) & PulserCtrl_masks)>>PulserCtrl_masks_shift;
181 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_masks
Definition: evrRegMap.h:203
#define PulserCtrl_masks_shift
Definition: evrRegMap.h:204

◆ polarityInvert()

bool MRMPulser::polarityInvert ( ) const
virtual

Implements Pulser.

Definition at line 142 of file drvemPulser.cpp.

143 {
144  return (READ32(owner.base, PulserCtrl(id)) & PulserCtrl_pol) != 0;
145 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_pol
Definition: evrRegMap.h:211

◆ prescaler()

epicsUInt32 MRMPulser::prescaler ( ) const
virtual

Implements Pulser.

Definition at line 130 of file drvemPulser.cpp.

131 {
132  return READ32(owner.base,PulserScal(id));
133 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223

◆ setDelay()

void MRMPulser::setDelay ( double  v)
virtual

Implements Pulser.

Definition at line 66 of file drvemPulser.cpp.

67 {
68  double scal=double(prescaler());
69  if (scal<=0) scal=1;
70  double clk=owner.clock(); // in MHz. MTicks/second
71 
72  epicsUInt32 ticks=roundToUInt((v*clk)/scal);
73 
74  setDelayRaw(ticks);
75 }
virtual double clock() const OVERRIDE FINAL
Definition: drvem.h:141
virtual void setDelayRaw(epicsUInt32) OVERRIDE FINAL
Definition: drvemPulser.cpp:60
virtual epicsUInt32 prescaler() const OVERRIDE FINAL
epicsUInt32 roundToUInt(double val, epicsUInt32 max)
Definition: mrfCommon.cpp:43

◆ setDelayRaw()

void MRMPulser::setDelayRaw ( epicsUInt32  v)
virtual

Implements Pulser.

Definition at line 60 of file drvemPulser.cpp.

61 {
62  WRITE32(owner.base, PulserDely(id), v);
63 }
volatile unsigned char *const base
Definition: drvem.h:223
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ setEnables()

void MRMPulser::setEnables ( epicsUInt32  inps)

Definition at line 161 of file drvemPulser.cpp.

162 {
163  epicsUInt32 reg = READ32(owner.base, PulserCtrl(id));
164 
165  inps <<= PulserCtrl_enables_shift;
166  inps &= PulserCtrl_enables;
167 
168  reg &= ~(PulserCtrl_enables);
169 
170  WRITE32(owner.base, PulserCtrl(id), reg|inps);
171 
172  epicsUInt32 rereg = READ32(owner.base, PulserCtrl(id));
173 
174  if((rereg&PulserCtrl_enables)!=inps)
175  throw std::runtime_error("FW doesn't support Pulser enable-gates");
176 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_enables
Definition: evrRegMap.h:205
#define PulserCtrl_enables_shift
Definition: evrRegMap.h:206
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ setMasks()

void MRMPulser::setMasks ( epicsUInt32  inps)

Definition at line 183 of file drvemPulser.cpp.

184 {
185  epicsUInt32 reg = READ32(owner.base, PulserCtrl(id));
186 
187  inps <<= PulserCtrl_masks_shift;
188  inps &= PulserCtrl_masks;
189 
190  reg &= ~(PulserCtrl_masks);
191 
192  WRITE32(owner.base, PulserCtrl(id), reg|inps);
193 
194  epicsUInt32 rereg = READ32(owner.base, PulserCtrl(id));
195 
196  if((rereg&PulserCtrl_masks)!=inps)
197  throw std::runtime_error("FW doesn't support Pulser masking");
198 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_masks
Definition: evrRegMap.h:203
#define PulserCtrl_masks_shift
Definition: evrRegMap.h:204
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ setPolarityInvert()

void MRMPulser::setPolarityInvert ( bool  s)
virtual

Implements Pulser.

Definition at line 148 of file drvemPulser.cpp.

149 {
150  if(s)
151  BITSET(NAT,32,owner.base, PulserCtrl(id), PulserCtrl_pol);
152  else
153  BITCLR(NAT,32,owner.base, PulserCtrl(id), PulserCtrl_pol);
154 }
#define BITCLR(ord, len, base, offset, mask)
Definition: mrfBitOps.h:26
volatile unsigned char *const base
Definition: drvem.h:223
#define PulserCtrl_pol
Definition: evrRegMap.h:211
#define BITSET(ord, len, base, offset, mask)
Definition: mrfBitOps.h:21

◆ setPrescaler()

void MRMPulser::setPrescaler ( epicsUInt32  v)
virtual

Implements Pulser.

Definition at line 136 of file drvemPulser.cpp.

137 {
138  WRITE32(owner.base, PulserScal(id), v);
139 }
volatile unsigned char *const base
Definition: drvem.h:223
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ setWidth()

void MRMPulser::setWidth ( double  v)
virtual

Implements Pulser.

Definition at line 101 of file drvemPulser.cpp.

102 {
103  double scal=double(prescaler());
104  double clk=owner.clock(); // in MHz. MTicks/second
105  if (scal<=0) scal=1;
106 
107  epicsUInt32 ticks=roundToUInt((v*clk)/scal);
108 
109  setWidthRaw(ticks);
110 }
virtual double clock() const OVERRIDE FINAL
Definition: drvem.h:141
virtual epicsUInt32 prescaler() const OVERRIDE FINAL
epicsUInt32 roundToUInt(double val, epicsUInt32 max)
Definition: mrfCommon.cpp:43
virtual void setWidthRaw(epicsUInt32) OVERRIDE FINAL
Definition: drvemPulser.cpp:95

◆ setWidthRaw()

void MRMPulser::setWidthRaw ( epicsUInt32  v)
virtual

Implements Pulser.

Definition at line 95 of file drvemPulser.cpp.

96 {
97  WRITE32(owner.base, PulserWdth(id), v);
98 }
volatile unsigned char *const base
Definition: drvem.h:223
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119

◆ sourceSetMap()

void MRMPulser::sourceSetMap ( epicsUInt32  src,
MapType::type  action 
)
virtual

Set mapping of source 'src'.

Implements Pulser.

Definition at line 245 of file drvemPulser.cpp.

246 {
247  if(evt>255)
248  throw std::out_of_range("Event code is out of range");
249 
250  if(evt==0)
251  return;
252 
253  epicsUInt32 pmask=1<<id;
254 
255  if( (action!=MapType::None) && _ismap(evt) )
256  throw std::runtime_error("Ignore request for duplicate mapping");
257 
258  if(action!=MapType::None)
259  _map(evt);
260  else
261  _unmap(evt);
262 
263  if(action==MapType::Trigger)
264  BITSET(NAT,32, owner.base, MappingRam(0,evt,Trigger), pmask);
265  else
266  BITCLR(NAT,32, owner.base, MappingRam(0,evt,Trigger), pmask);
267 
268  if(action==MapType::Set)
269  BITSET(NAT,32, owner.base, MappingRam(0,evt,Set), pmask);
270  else
271  BITCLR(NAT,32, owner.base, MappingRam(0,evt,Set), pmask);
272 
273  if(action==MapType::Reset)
274  BITSET(NAT,32, owner.base, MappingRam(0,evt,Reset), pmask);
275  else
276  BITCLR(NAT,32, owner.base, MappingRam(0,evt,Reset), pmask);
277 }
#define BITCLR(ord, len, base, offset, mask)
Definition: mrfBitOps.h:26
volatile unsigned char *const base
Definition: drvem.h:223
#define BITSET(ord, len, base, offset, mask)
Definition: mrfBitOps.h:21

◆ unlock()

void MRMPulser::unlock ( ) const
virtual

Implements mrf::Object.

Definition at line 40 of file drvemPulser.cpp.

40 {owner.unlock();};
virtual void unlock() const OVERRIDE FINAL
Definition: drvem.h:122

◆ width()

double MRMPulser::width ( ) const
virtual

Implements Pulser.

Definition at line 119 of file drvemPulser.cpp.

120 {
121  double scal=double(prescaler());
122  double ticks=double(widthRaw());
123  double clk=owner.clock(); // in MHz. MTicks/second
124  if (scal<=0) scal=1;
125 
126  return (ticks*scal)/clk;
127 }
virtual double clock() const OVERRIDE FINAL
Definition: drvem.h:141
virtual epicsUInt32 prescaler() const OVERRIDE FINAL
virtual epicsUInt32 widthRaw() const OVERRIDE FINAL

◆ widthRaw()

epicsUInt32 MRMPulser::widthRaw ( ) const
virtual

Implements Pulser.

Definition at line 113 of file drvemPulser.cpp.

114 {
115  return READ32(owner.base,PulserWdth(id));
116 }
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
volatile unsigned char *const base
Definition: drvem.h:223

The documentation for this class was generated from the following files: