pva2pva  1.4.1-dev
demo.cpp
1 
2 #include <epicsMath.h>
3 #include <dbAccess.h>
4 #include <dbScan.h>
5 #include <dbLink.h>
6 #include <recGbl.h>
7 #include <alarm.h>
8 
9 #include <longinRecord.h>
10 #include <waveformRecord.h>
11 #include <menuFtype.h>
12 
13 #include <epicsExport.h>
14 
15 namespace {
16 
17 // pi/180
18 static const double pi_180 = 0.017453292519943295;
19 
20 int dummy;
21 
22 long init_spin(waveformRecord *prec)
23 {
24  if(prec->ftvl==menuFtypeDOUBLE)
25  prec->dpvt = &dummy;
26  return 0;
27 }
28 
29 long process_spin(waveformRecord *prec)
30 {
31  if(prec->dpvt != &dummy) {
32  (void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM);
33  return 0;
34  }
35 
36  const double freq = 360.0*pi_180/100; // rad/sample
37  double phase = 0;
38  double *val = static_cast<double*>(prec->bptr);
39 
40  long ret = dbGetLink(&prec->inp, DBF_DOUBLE, &phase, 0, 0);
41  if(ret) {
42  (void)recGblSetSevr(prec, LINK_ALARM, INVALID_ALARM);
43  return ret;
44  }
45 
46  phase *= pi_180; // deg -> rad
47 
48  for(size_t i=0, N=prec->nelm; i<N; i++)
49  val[i] = sin(freq*i+phase);
50 
51  prec->nord = prec->nelm;
52 
53 #ifdef DBRutag
54  prec->utag = (prec->utag+1u)&0x7fffffff;
55 #endif
56 
57  return 0;
58 }
59 
60 long process_utag(longinRecord *prec)
61 {
62  long status = dbGetLink(&prec->inp, DBR_LONG, &prec->val, 0, 0);
63 #ifdef DBRutag
64  prec->utag = prec->val;
65 #else
66  (void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM);
67 #endif
68  return status;
69 }
70 
71 template<typename REC>
72 struct dset5
73 {
74  long count;
75  long (*report)(int);
76  long (*init)(int);
77  long (*init_record)(REC *);
78  long (*get_ioint_info)(int, REC *, IOSCANPVT*);
79  long (*process)(REC *);
80 };
81 
82 dset5<waveformRecord> devWfPDBDemo = {5,0,0,&init_spin,0,&process_spin};
83 dset5<longinRecord> devLoPDBUTag = {5,0,0,0,0,&process_utag};
84 
85 } // namespace
86 
87 extern "C" {
88 epicsExportAddress(dset, devWfPDBDemo);
89 epicsExportAddress(dset, devLoPDBUTag);
90 }