mrfioc2  2.3.0
devObjWf.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 <cstdio>
12 
13 #include <waveformRecord.h>
14 #include <menuFtype.h>
15 
16 #include "devObj.h"
17 
18 using namespace mrf;
19 
20 static inline
21 long add_record_waveform(dbCommon *pcom)
22 {
23  waveformRecord *prec=(waveformRecord*)pcom;
24  switch(prec->ftvl) {
25  case menuFtypeCHAR:
26  return add_record_property<epicsInt8[1]>(pcom, &prec->inp);
27  case menuFtypeUCHAR:
28  return add_record_property<epicsUInt8[1]>(pcom, &prec->inp);
29  case menuFtypeSHORT:
30  return add_record_property<epicsInt16[1]>(pcom, &prec->inp);
31  case menuFtypeUSHORT:
32  return add_record_property<epicsUInt16[1]>(pcom, &prec->inp);
33  case menuFtypeLONG:
34  return add_record_property<epicsInt32[1]>(pcom, &prec->inp);
35  case menuFtypeULONG:
36  return add_record_property<epicsUInt32[1]>(pcom, &prec->inp);
37  case menuFtypeFLOAT:
38  return add_record_property<float[1]>(pcom, &prec->inp);
39  case menuFtypeDOUBLE:
40  return add_record_property<double[1]>(pcom, &prec->inp);
41  case menuFtypeSTRING:
42  default:
43  printf("%s: Ftype not supported\n", prec->name);
44  return S_db_errArg;
45  }
46 }
47 
48 template<typename T>
49 static void
50 readop(waveformRecord* prec)
51 {
52  addr<T[1]> *priv=(addr<T[1]>*)prec->dpvt;
53  scopedLock<mrf::Object> g(*priv->O);
54  prec->nord = priv->P->get((T*)prec->bptr, prec->nelm);
55 }
56 
57 static long read_waveform(waveformRecord* prec)
58 {
59 if (!prec->dpvt) {(void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM); return -1; }
60 CurrentRecord cur(prec);
61 try {
62  switch(prec->ftvl) {
63  case menuFtypeCHAR:
64  readop<epicsInt8>(prec); break;
65  case menuFtypeUCHAR:
66  readop<epicsUInt8>(prec); break;
67  case menuFtypeSHORT:
68  readop<epicsInt16>(prec); break;
69  case menuFtypeUSHORT:
70  readop<epicsUInt16>(prec); break;
71  case menuFtypeLONG:
72  readop<epicsInt32>(prec); break;
73  case menuFtypeULONG:
74  readop<epicsUInt32>(prec); break;
75  case menuFtypeFLOAT:
76  readop<float>(prec); break;
77  case menuFtypeDOUBLE:
78  readop<double>(prec); break;
79  case menuFtypeSTRING:
80  default:
81  printf("%s: Ftype not supported\n", prec->name);
82  return S_db_errArg;
83  }
84 
85  return 0;
86 }CATCH(S_dev_badArgument)
87 }
88 
89 OBJECT_DSET(WFIn,
90  &add_record_waveform,
91  &del_record_property,
92  &init_record_empty,
93  &read_waveform,
94  NULL);
95 
96 template<typename T>
97 static void
98 writeop(waveformRecord* prec)
99 {
100  addr<T[1]> *priv=(addr<T[1]>*)prec->dpvt;
101  scopedLock<mrf::Object> g(*priv->O);
102  priv->P->set((const T*)prec->bptr, prec->nord);
103 }
104 
105 static long write_waveform(waveformRecord* prec)
106 {
107 if (!prec->dpvt) {(void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM); return -1; }
108 CurrentRecord cur(prec);
109 try {
110 
111  switch(prec->ftvl) {
112  case menuFtypeCHAR:
113  writeop<epicsInt8>(prec); break;
114  case menuFtypeUCHAR:
115  writeop<epicsUInt8>(prec); break;
116  case menuFtypeSHORT:
117  writeop<epicsInt16>(prec); break;
118  case menuFtypeUSHORT:
119  writeop<epicsUInt16>(prec); break;
120  case menuFtypeLONG:
121  writeop<epicsInt32>(prec); break;
122  case menuFtypeULONG:
123  writeop<epicsUInt32>(prec); break;
124  case menuFtypeFLOAT:
125  writeop<float>(prec); break;
126  case menuFtypeDOUBLE:
127  writeop<double>(prec); break;
128  case menuFtypeSTRING:
129  default:
130  printf("%s: Ftype not supported\n", prec->name);
131  return S_db_errArg;
132  }
133 
134  return 0;
135 }CATCH(S_dev_badArgument)
136 }
137 
138 OBJECT_DSET(WFOut,
139  &add_record_waveform,
140  &del_record_property,
141  &init_record_empty,
142  &write_waveform,
143  NULL);
144 
145 #include <epicsExport.h>
146 extern "C" {
147  OBJECT_DSET_EXPORT(WFIn);
148  OBJECT_DSET_EXPORT(WFOut);
149 }
OBJECT_DSET_EXPORT(WFIn)
Definition: devObj.h:97
mrf::Object * O
Definition: devObj.h:90
mrf::auto_ptr< mrf::property< T > > P
Definition: devObj.h:98
OBJECT_DSET(WFIn, &add_record_waveform, &del_record_property, &init_record_empty, &read_waveform, NULL)
#define CATCH(RET)
Definition: devObj.h:31
Definition: flash.cpp:23