mrfioc2  2.3.0
evgMxc.cpp
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 #include "evgMxc.h"
9 
10 #include <iostream>
11 #include <stdexcept>
12 #include <math.h>
13 
14 #include <mrfCommonIO.h>
15 #include <errlog.h>
16 #include <mrfCommon.h>
17 
18 #include "evgMrm.h"
19 #include "evgRegMap.h"
20 
21 evgMxc::evgMxc(const std::string& name, const epicsUInt32 id,
22  evgMrm* const owner):
23 mrf::ObjectInst<evgMxc>(name),
24 m_id(id),
25 m_owner(owner),
26 m_pReg(owner->getRegAddr()) {
27 }
28 
30 }
31 
32 bool
34  return (READ32(m_pReg, MuxControl(m_id)) & MuxControl_Sts) != 0;
35 }
36 
37 void
38 evgMxc::setPolarity(bool polarity) {
39  if(polarity)
40  BITSET32(m_pReg, MuxControl(m_id), MuxControl_Pol);
41  else
42  BITCLR32(m_pReg, MuxControl(m_id), MuxControl_Pol);
43 }
44 
45 bool
47  return (READ32(m_pReg, MuxControl(m_id)) & MuxControl_Pol) != 0;
48 }
49 
50 void
51 evgMxc::setPrescaler(epicsUInt32 preScaler) {
52  if(preScaler == 0 || preScaler == 1)
53  throw std::runtime_error("Invalid preScaler value in Multiplexed Counter. Value should not be 0 or 1.");
54 
55  WRITE32(m_pReg, MuxPrescaler(m_id), preScaler);
56 }
57 
58 epicsUInt32
60  return READ32(m_pReg, MuxPrescaler(m_id));
61 }
62 
63 
64 void
65 evgMxc::setFrequency(epicsFloat64 freq) {
66  epicsUInt32 clkSpeed = (epicsUInt32)(getFrequency() *
67  pow(10.0, 6));
68  epicsUInt32 preScaler = (epicsUInt32)((epicsFloat64)clkSpeed / freq);
69 
70  setPrescaler(preScaler);
71 }
72 
73 epicsFloat64
75  epicsFloat64 clkSpeed = (epicsFloat64)m_owner->getFrequency()
76  * pow(10.0, 6);
77  epicsFloat64 preScaler = (epicsFloat64)getPrescaler();
78  return clkSpeed/preScaler;
79 }
80 
81 void
82 evgMxc::setTrigEvtMap(epicsUInt16 trigEvt, bool ena) {
83  if(trigEvt > 7)
84  throw std::runtime_error("EVG Mxc Trig Event ID too large. Max: 7");
85 
86  epicsUInt32 mask = 1 << (trigEvt+MuxControl_TrigMap_SHIFT);
87  if(ena)
88  BITSET32(m_pReg, MuxControl(m_id), mask);
89  else
90  BITCLR32(m_pReg, MuxControl(m_id), mask);
91 }
92 
93 bool
94 evgMxc::getTrigEvtMap(epicsUInt16 trigEvt) const {
95  if(trigEvt > 7)
96  throw std::runtime_error("EVG Mxc Trig Event ID too large. Max: 7");
97 
98  epicsUInt32 mask = 1 << (trigEvt+MuxControl_TrigMap_SHIFT);
99  return READ32(m_pReg, MuxControl(m_id))&mask;
100 }
101 
#define BITSET32(base, offset, mask)
Definition: mrfCommonIO.h:124
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
~evgMxc()
Definition: evgMxc.cpp:29
epicsUInt32 getPrescaler() const
Definition: evgMxc.cpp:59
void setFrequency(epicsFloat64)
Definition: evgMxc.cpp:65
epicsFloat64 getFrequency() const
Definition: evgEvtClk.cpp:15
bool getStatus() const
Definition: evgMxc.cpp:33
void setPrescaler(epicsUInt32)
Definition: evgMxc.cpp:51
#define MuxControl_TrigMap_SHIFT
Definition: evgRegMap.h:186
bool getPolarity() const
Definition: evgMxc.cpp:46
#define MuxControl_Sts
Definition: evgRegMap.h:184
#define BITCLR32(base, offset, mask)
Definition: mrfCommonIO.h:129
#define MuxControl_Pol
Definition: evgRegMap.h:183
evgMxc(const std::string &, const epicsUInt32, evgMrm *const)
Definition: evgMxc.cpp:21
void setPolarity(bool)
Definition: evgMxc.cpp:38
void setTrigEvtMap(epicsUInt16, bool)
Definition: evgMxc.cpp:82
bool getTrigEvtMap(epicsUInt16) const
Definition: evgMxc.cpp:94
epicsFloat64 getFrequency() const
Definition: evgMxc.cpp:74
Definition: flash.cpp:23
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119
Definition: evgMrm.h:56
Definition: evgMxc.h:9