This is Unofficial EPICS BASE Doxygen Site
demo.cpp
Go to the documentation of this file.
1 
2 #include <epicsMath.h>
3 #include <dbAccess.h>
4 #include <dbScan.h>
5 #include <recGbl.h>
6 #include <alarm.h>
7 
8 #include <waveformRecord.h>
9 #include <menuFtype.h>
10 
11 #include <epicsExport.h>
12 
13 namespace {
14 
15 // pi/180
16 static const double pi_180 = 0.017453292519943295;
17 
18 int dummy;
19 
20 long init_spin(waveformRecord *prec)
21 {
22  if(prec->ftvl==menuFtypeDOUBLE)
23  prec->dpvt = &dummy;
24  return 0;
25 }
26 
27 long process_spin(waveformRecord *prec)
28 {
29  if(prec->dpvt != &dummy) {
30  (void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM);
31  return 0;
32  }
33 
34  const double freq = 360.0*pi_180/100; // rad/sample
35  double phase = 0;
36  double *val = static_cast<double*>(prec->bptr);
37 
38  long ret = dbGetLink(&prec->inp, DBF_DOUBLE, &phase, 0, 0);
39  if(ret) {
40  (void)recGblSetSevr(prec, LINK_ALARM, INVALID_ALARM);
41  return ret;
42  }
43 
44  phase *= pi_180; // deg -> rad
45 
46  for(size_t i=0, N=prec->nelm; i<N; i++)
47  val[i] = sin(freq*i+phase);
48 
49  prec->nord = prec->nelm;
50 
51  return 0;
52 }
53 
54 template<typename REC>
55 struct dset5
56 {
57  long count;
58  long (*report)(int);
59  long (*init)(int);
60  long (*init_record)(REC *);
61  long (*get_ioint_info)(int, REC *, IOSCANPVT*);
62  long (*process)(REC *);
63 };
64 
65 dset5<waveformRecord> devWfPDBDemo = {5,0,0,&init_spin,0,&process_spin};
66 
67 } // namespace
68 
69 extern "C" {
70 epicsExportAddress(dset, devWfPDBDemo);
71 }
epicsExportAddress(dset, devWfPDBDemo)
int i
Definition: scan.c:967
#define init_record
struct ioscan_head * IOSCANPVT
Definition: devSup.h:28
Definition: devSup.h:140
#define report
Definition: aaiRecord.c:53
#define LINK_ALARM
Definition: alarm.h:105
epics::pvData::PVStructurePtr dummy
Definition: pvAccess.cpp:72
int prec
Definition: reader.c:29
#define INVALID_ALARM
Definition: alarm.h:53
#define COMM_ALARM
Definition: alarm.h:100
Exporting IOC objects.