mrfioc2  2.3.0
evgAcTrig.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 "evgAcTrig.h"
9 
10 #include <iostream>
11 #include <stdexcept>
12 
13 #include <mrfCommonIO.h>
14 #include <mrfCommon.h>
15 
16 #include "evgRegMap.h"
17 
18 evgAcTrig::evgAcTrig(const std::string& name, volatile epicsUInt8* const pReg):
19 mrf::ObjectInst<evgAcTrig>(name),
20 m_pReg(pReg) {
21 }
22 
24 }
25 
26 void
27 evgAcTrig::setDivider(epicsUInt32 divider) {
28  if(divider > 255)
29  throw std::runtime_error("EVG AC Trigger divider out of range. Range: 0 - 255"); // 0: divide by 1, 1: divide by 2, ... 255: divide by 256
30 
31  epicsUInt32 temp = READ32(m_pReg, AcTrigControl)&~AcTrigControl_Divider_MASK;
32  WRITE32(m_pReg, AcTrigControl, temp|(divider<<AcTrigControl_Divider_SHIFT));
33 }
34 
35 epicsUInt32
37  return (READ32(m_pReg, AcTrigControl)&AcTrigControl_Divider_MASK)>>AcTrigControl_Divider_SHIFT;
38 }
39 
40 void
41 evgAcTrig::setPhase(epicsFloat64 phase) {
42  if(phase < 0 || phase > 25.5)
43  throw std::runtime_error("EVG AC Trigger phase out of range. Delay range 0 ms - 25.5 ms in 0.1 ms steps");
44  epicsUInt32 iphase = phase;
45 
46  epicsUInt32 temp = READ32(m_pReg, AcTrigControl)&~AcTrigControl_Phase_MASK;
47  WRITE32(m_pReg, AcTrigControl, temp|(iphase<<AcTrigControl_Phase_SHIFT));
48 }
49 
50 epicsFloat64
52  return (READ32(m_pReg, AcTrigControl)&AcTrigControl_Phase_MASK)>>AcTrigControl_Phase_SHIFT;
53 }
54 
55 void
57  if(byp)
58  BITSET32(m_pReg, AcTrigControl, AcTrigControl_Bypass);
59  else
60  BITCLR32(m_pReg, AcTrigControl, AcTrigControl_Bypass);
61 }
62 
63 bool
65  return !!(READ32(m_pReg, AcTrigControl)&AcTrigControl_Bypass);
66 }
67 
68 
69 void
70 evgAcTrig::setSyncSrc(bool syncSrc) {
71  if(syncSrc)
72  BITSET32(m_pReg, AcTrigControl, AcTrigControl_Sync);
73  else
74  BITCLR32(m_pReg, AcTrigControl, AcTrigControl_Sync);
75 }
76 
77 bool
79  return !!(READ32(m_pReg, AcTrigControl)&AcTrigControl_Sync);
80 }
81 
82 void
83 evgAcTrig::setTrigEvtMap(epicsUInt16 trigEvt, bool ena) {
84  if(trigEvt > 7)
85  throw std::runtime_error("EVG Trig Event ID too large. Max : 7");
86 
87  epicsUInt32 mask = 1 << (trigEvt+AcTrigMap_EvtSHIFT);
88 
89  if(ena)
90  BITSET32(m_pReg, AcTrigMap, mask);
91  else
92  BITCLR32(m_pReg, AcTrigMap, mask);
93 }
94 
95 epicsUInt32
97  return READ32(m_pReg, AcTrigMap)>>AcTrigMap_EvtSHIFT;
98 }
#define BITSET32(base, offset, mask)
Definition: mrfCommonIO.h:124
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
void setPhase(epicsFloat64)
Definition: evgAcTrig.cpp:41
#define AcTrigControl_Divider_MASK
Definition: evgRegMap.h:73
#define AcTrigControl_Sync
Definition: evgRegMap.h:71
#define AcTrigControl_Divider_SHIFT
Definition: evgRegMap.h:74
bool getSyncSrc() const
Definition: evgAcTrig.cpp:78
bool getBypass() const
Definition: evgAcTrig.cpp:64
void setTrigEvtMap(epicsUInt16, bool)
Definition: evgAcTrig.cpp:83
epicsUInt32 getTrigEvtMap() const
Definition: evgAcTrig.cpp:96
void setBypass(bool)
Definition: evgAcTrig.cpp:56
#define BITCLR32(base, offset, mask)
Definition: mrfCommonIO.h:129
void setSyncSrc(bool)
Definition: evgAcTrig.cpp:70
void setDivider(epicsUInt32)
Definition: evgAcTrig.cpp:27
#define AcTrigControl_Bypass
Definition: evgRegMap.h:72
#define AcTrigControl_Phase_SHIFT
Definition: evgRegMap.h:76
epicsUInt32 getDivider() const
Definition: evgAcTrig.cpp:36
epicsFloat64 getPhase() const
Definition: evgAcTrig.cpp:51
Definition: flash.cpp:23
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119
#define AcTrigControl_Phase_MASK
Definition: evgRegMap.h:75
#define AcTrigMap_EvtSHIFT
Definition: evgRegMap.h:81
evgAcTrig(const std::string &, volatile epicsUInt8 *const)
Definition: evgAcTrig.cpp:18