mrfioc2  2.3.0
drvemInput.cpp
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2010 Brookhaven Science Associates, as Operator of
3 * Brookhaven National Laboratory.
4 * mrfioc2 is distributed subject to a Software License Agreement found
5 * in file LICENSE that is included with this distribution.
6 \*************************************************************************/
7 /*
8  * Author: Michael Davidsaver <mdavidsaver@gmail.com>
9  */
10 
11 #include <stdexcept>
12 #include <epicsInterrupt.h>
13 
14 #include <mrfCommonIO.h>
15 #include <mrfBitOps.h>
16 
17 #include "evrRegMap.h"
18 #include "drvemInput.h"
19 
20 MRMInput::MRMInput(const std::string& n, volatile unsigned char *b, size_t i)
21  :Input(n)
22  ,base(b)
23  ,idx(i)
24 {
25 }
26 
27 void
28 MRMInput::dbusSet(epicsUInt16 v)
29 {
30  epicsUInt32 val;
31 
32  val = READ32(base, InputMapFP(idx) );
33  val &= ~InputMapFP_dbus_mask;
34  val |= v << InputMapFP_dbus_shft;
35  WRITE32(base, InputMapFP(idx), val);
36 }
37 
38 epicsUInt16
40 {
41  epicsUInt32 val;
42  val = READ32(base, InputMapFP(idx) );
43  val &= InputMapFP_dbus_mask;
44  val >>= InputMapFP_dbus_shft;
45  return val;
46 }
47 
48 void
50 {
51  if(v)
52  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_lvl);
53  else
54  BITSET(NAT,32, base, InputMapFP(idx), InputMapFP_lvl);
55 }
56 
57 bool
59 {
60  return !(READ32(base,InputMapFP(idx)) & InputMapFP_lvl);
61 }
62 
63 bool
65 {
66  return (READ32(base,InputMapFP(idx)) & InputMapFP_state);
67 }
68 
69 void
71 {
72  if(v)
73  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_edge);
74  else
75  BITSET(NAT,32, base, InputMapFP(idx), InputMapFP_edge);
76 }
77 
78 bool
80 {
81  return !(READ32(base,InputMapFP(idx)) & InputMapFP_edge);
82 }
83 
84 void
86 {
87  switch(m){
88  case TrigNone:
89  // Disable both level and edge
90  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_eedg);
91  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_elvl);
92  break;
93  case TrigLevel:
94  // disable edge, enable level
95  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_eedg);
96  BITSET(NAT,32, base, InputMapFP(idx), InputMapFP_elvl);
97  break;
98  case TrigEdge:
99  // disable level, enable edge
100  BITSET(NAT,32, base, InputMapFP(idx), InputMapFP_eedg);
101  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_elvl);
102  break;
103  }
104 }
105 
106 TrigMode
108 {
109  epicsUInt32 v=READ32(base, InputMapFP(idx));
110 
111  bool e = (v&InputMapFP_eedg) != 0;
112  bool l = (v&InputMapFP_elvl) != 0;
113 
114  if(!e && !l)
115  return TrigNone;
116  else if(e && !l)
117  return TrigEdge;
118  else if(!e && l)
119  return TrigLevel;
120  else
121  throw std::runtime_error("External mode cannot be set to both Edge and Level at the same time.");
122 }
123 
124 void
125 MRMInput::extEvtSet(epicsUInt32 e)
126 {
127  if(e>255)
128  throw std::out_of_range("Event code # out of range. Range: 0 - 255");
129 
130  int key=epicsInterruptLock();
131 
132  epicsUInt32 val;
133 
134  val = READ32(base, InputMapFP(idx) );
135  val &= ~InputMapFP_ext_mask;
136  val |= e << InputMapFP_ext_shft;
137  WRITE32(base, InputMapFP(idx), val);
138 
139  epicsInterruptUnlock(key);
140 }
141 
142 epicsUInt32
144 {
145  epicsUInt32 val;
146  val = READ32(base, InputMapFP(idx) );
147  val &= InputMapFP_ext_mask;
148  val >>= InputMapFP_ext_shft;
149  return val;
150 }
151 
152 void
154 {
155  switch(m){
156  case TrigNone:
157  // Disable both level and edge
158  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_bedg);
159  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_blvl);
160  break;
161  case TrigLevel:
162  // disable edge, enable level
163  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_bedg);
164  BITSET(NAT,32, base, InputMapFP(idx), InputMapFP_blvl);
165  break;
166  case TrigEdge:
167  // disable level, enable edge
168  BITSET(NAT,32, base, InputMapFP(idx), InputMapFP_bedg);
169  BITCLR(NAT,32, base, InputMapFP(idx), InputMapFP_blvl);
170  break;
171  }
172 }
173 
174 TrigMode
176 {
177  epicsUInt32 v=READ32(base, InputMapFP(idx));
178 
179  bool e = (v&InputMapFP_bedg) != 0;
180  bool l = (v&InputMapFP_blvl) != 0;
181 
182  if(!e && !l)
183  return TrigNone;
184  else if(e && !l)
185  return TrigEdge;
186  else if(!e && l)
187  return TrigLevel;
188  else
189  throw std::runtime_error("Backwards mode cannot be set to both Edge and Level at the same time.");
190 }
191 
192 void
193 MRMInput::backEvtSet(epicsUInt32 e)
194 {
195  if(e>255)
196  throw std::out_of_range("Event code # out of range. Range: 0 - 255");
197 
198  int key=epicsInterruptLock();
199 
200  epicsUInt32 val;
201 
202  val = READ32(base, InputMapFP(idx) );
203  val &= ~InputMapFP_back_mask;
204  val |= e << InputMapFP_back_shft;
205  WRITE32(base, InputMapFP(idx), val);
206 
207  epicsInterruptUnlock(key);
208 }
209 
210 epicsUInt32
212 {
213  epicsUInt32 val;
214  val = READ32(base, InputMapFP(idx) );
215  val &= InputMapFP_back_mask;
216  val >>= InputMapFP_back_shft;
217  return val;
218 }
virtual void extModeSet(TrigMode) OVERRIDE FINAL
Set external (local) event trigger mode.
Definition: drvemInput.cpp:85
virtual bool levelHigh() const OVERRIDE FINAL
Definition: drvemInput.cpp:58
#define BITCLR(ord, len, base, offset, mask)
Definition: mrfBitOps.h:26
#define READ32(base, offset)
Definition: mrfCommonIO.h:114
#define InputMapFP_edge
Definition: evrRegMap.h:265
#define InputMapFP_dbus_mask
Definition: evrRegMap.h:268
#define InputMapFP_elvl
Definition: evrRegMap.h:264
#define InputMapFP_ext_mask
Definition: evrRegMap.h:272
#define InputMapFP_state
Definition: evrRegMap.h:261
virtual void dbusSet(epicsUInt16) OVERRIDE FINAL
Set mask of dbus bits are driven by this input.
Definition: drvemInput.cpp:28
#define InputMapFP_back_mask
Definition: evrRegMap.h:270
virtual bool edgeRise() const OVERRIDE FINAL
Definition: drvemInput.cpp:79
#define InputMapFP_bedg
Definition: evrRegMap.h:266
Definition: input.h:24
#define InputMapFP_eedg
Definition: evrRegMap.h:267
virtual TrigMode backMode() const OVERRIDE FINAL
Definition: drvemInput.cpp:175
Definition: input.h:21
virtual void backEvtSet(epicsUInt32) OVERRIDE FINAL
Set the event code sent by an a backwards event.
Definition: drvemInput.cpp:193
#define InputMapFP_blvl
Definition: evrRegMap.h:263
virtual bool state() const OVERRIDE FINAL
Definition: drvemInput.cpp:64
#define InputMapFP_back_shft
Definition: evrRegMap.h:271
virtual void extEvtSet(epicsUInt32) OVERRIDE FINAL
Set the event code sent by an externel (local) event.
Definition: drvemInput.cpp:125
#define InputMapFP_ext_shft
Definition: evrRegMap.h:273
virtual void edgeRiseSet(bool) OVERRIDE FINAL
Set active rise/fall when using edge trigger mode.
Definition: drvemInput.cpp:70
virtual TrigMode extMode() const OVERRIDE FINAL
Definition: drvemInput.cpp:107
virtual epicsUInt32 backEvt() const OVERRIDE FINAL
Definition: drvemInput.cpp:211
virtual void backModeSet(TrigMode) OVERRIDE FINAL
Set the backwards event trigger mode.
Definition: drvemInput.cpp:153
Definition: input.h:19
virtual epicsUInt32 extEvt() const OVERRIDE FINAL
Definition: drvemInput.cpp:143
#define InputMapFP_dbus_shft
Definition: evrRegMap.h:269
#define BITSET(ord, len, base, offset, mask)
Definition: mrfBitOps.h:21
virtual epicsUInt16 dbus() const OVERRIDE FINAL
Definition: drvemInput.cpp:39
TrigMode
Definition: input.h:18
#define WRITE32(base, offset, value)
Definition: mrfCommonIO.h:119
#define InputMapFP_lvl
Definition: evrRegMap.h:262
MRMInput(const std::string &n, volatile unsigned char *, size_t)
Definition: drvemInput.cpp:20
virtual void levelHighSet(bool) OVERRIDE FINAL
Set active high/low when using level trigger mode.
Definition: drvemInput.cpp:49