mrfioc2  2.3.0
devObjBinary.cpp
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2011 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 <biRecord.h>
12 #include <boRecord.h>
13 
14 #include "devObj.h"
15 
16 using namespace mrf;
17 
18 /************** bi *************/
19 
20 template<typename T>
21 static long read_bi_from_integer(biRecord* prec)
22 {
23 if (!prec->dpvt) {(void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM); return -1; }
24 CurrentRecord cur(prec);
25 try {
26  addr<T> *priv=(addr<T>*)prec->dpvt;
27 
28  {
29  scopedLock<mrf::Object> g(*priv->O);
30  prec->rval = priv->P->get();
31  if(prec->mask) prec->rval &= prec->mask;
32  }
33 
34  return 0;
35 }CATCH(S_dev_badArgument)
36 }
37 
38 // bi uint32
39 
40 OBJECT_DSET(BIFromUINT32,
41  (&add_record_inp<biRecord,epicsUInt32>),
42  &del_record_property,
43  &init_record_empty,
44  &read_bi_from_integer<epicsUInt32>,
45  NULL);
46 
47 // bi uint16
48 
49 OBJECT_DSET(BIFromUINT16,
50  (&add_record_inp<biRecord,epicsUInt16>),
51  &del_record_property,
52  &init_record_empty,
53  &read_bi_from_integer<epicsUInt16>,
54  NULL);
55 
56 // bi bool
57 
58 OBJECT_DSET(BIFromBool,
59  (&add_record_inp<biRecord,bool>),
60  &del_record_property,
61  &init_record_empty,
62  &read_bi_from_integer<bool>,
63  NULL);
64 
65 
66 // bo uint32
67 
68 template<typename I>
69 static long write_bo_from_integer(boRecord* prec)
70 {
71 if (!prec->dpvt) {(void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM); return -1; }
72 CurrentRecord cur(prec);
73 try {
74  addr<I> *priv=(addr<I>*)prec->dpvt;
75 
76  {
77  scopedLock<mrf::Object> g(*priv->O);
78  priv->P->set((prec->rval != 0));
79 
80  prec->rbv = priv->P->get();
81  }
82  if(priv->rbv) {
83  prec->rval = prec->rbv;
84  if (prec->mask) {
85  if(prec->rval & prec->mask)
86  prec->val=1;
87  else
88  prec->val=0;
89  } else
90  prec->val = !!prec->rval;
91  }
92 
93  return 0;
94 }CATCH(S_dev_badArgument)
95 }
96 
97 
98 OBJECT_DSET(BOFromUINT32,
99  (&add_record_out<boRecord,epicsUInt32>),
100  &del_record_property,
101  &init_record_return2,
102  &write_bo_from_integer<epicsUInt32>,
103  NULL);
104 
105 // bo uint16
106 
107 
108 OBJECT_DSET(BOFromUINT16,
109  (&add_record_out<boRecord,epicsUInt16>),
110  &del_record_property,
111  &init_record_return2,
112  &write_bo_from_integer<epicsUInt16>,
113  NULL);
114 
115 // bo bool
116 
117 
118 OBJECT_DSET(BOFromBool,
119  (&add_record_out<boRecord,bool>),
120  &del_record_property,
121  &init_record_return2,
122  &write_bo_from_integer<bool>,
123  NULL);
124 
125 #include <epicsExport.h>
126 extern "C" {
127  OBJECT_DSET_EXPORT(BIFromUINT32);
128  OBJECT_DSET_EXPORT(BIFromUINT16);
129  OBJECT_DSET_EXPORT(BIFromBool);
130  OBJECT_DSET_EXPORT(BOFromUINT32);
131  OBJECT_DSET_EXPORT(BOFromUINT16);
132  OBJECT_DSET_EXPORT(BOFromBool);
133 }
OBJECT_DSET(BIFromUINT32,(&add_record_inp< biRecord, epicsUInt32 >), &del_record_property, &init_record_empty, &read_bi_from_integer< epicsUInt32 >, NULL)
Definition: devObj.h:97
mrf::Object * O
Definition: devObj.h:90
OBJECT_DSET_EXPORT(BIFromUINT32)
mrf::auto_ptr< mrf::property< T > > P
Definition: devObj.h:98
#define CATCH(RET)
Definition: devObj.h:31
Definition: flash.cpp:23
int rbv
Definition: devObj.h:89