mrfioc2  2.3.0
devEvrStringIO.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 <stdlib.h>
12 #include <string.h>
13 #include <epicsExport.h>
14 #include <dbAccess.h>
15 #include <devSup.h>
16 #include <recGbl.h>
17 #include <devLib.h> // For S_dev_*
18 #include <alarm.h>
19 #include <errlog.h>
20 #include "linkoptions.h"
21 #include "devObj.h"
22 
23 #include <stringinRecord.h>
24 
25 #include "evr/evr.h"
26 
27 #include <stdexcept>
28 #include <string>
29 
30 struct ts_priv {
31  EVR* evr;
32  char obj[30];
33  epicsUInt32 code;
34  epicsUInt32 last_bad;
35 };
36 
37 static const
38 linkOptionDef eventdef[] =
39 {
40  linkString (ts_priv, obj , "OBJ" , 1, 0),
41  linkInt32 (ts_priv, code , "Code" , 0, 0),
43 };
44 
45 /***************** Stringin (Timestamp) *****************/
46 
47 static
48 long stringin_add(dbCommon *praw)
49 {
50  stringinRecord *prec=(stringinRecord*)(praw);
51  long ret=0;
52 try {
53  assert(prec->inp.type==INST_IO);
54  mrf::auto_ptr<ts_priv> priv(new ts_priv);
55  priv->code=0;
56  priv->last_bad=0;
57 
58  if (linkOptionsStore(eventdef, priv.get(), prec->inp.value.instio.string, 0))
59  throw std::runtime_error("Couldn't parse link string");
60 
61  mrf::Object *O=mrf::Object::getObject(priv->obj);
62  if(!O) {
63  errlogPrintf("%s: failed to find object '%s'\n", praw->name, priv->obj);
64  return S_db_errArg;
65  }
66  priv->evr=dynamic_cast<EVR*>(O);
67  if(!priv->evr)
68  throw std::runtime_error("Failed to lookup device");
69 
70  prec->dpvt=(void*)priv.release();
71 
72  return 0;
73 
74 } catch(std::runtime_error& e) {
75  recGblRecordError(S_dev_noDevice, (void*)prec, e.what());
76  ret=S_dev_noDevice;
77 } catch(std::exception& e) {
78  recGblRecordError(S_db_noMemory, (void*)prec, e.what());
79  ret=S_db_noMemory;
80 }
81  return ret;
82 }
83 
84 
85 static long read_si(stringinRecord* prec)
86 {
87  if(!prec->dpvt)
88  return S_db_errArg;
89 try {
90  ts_priv *priv=static_cast<ts_priv*>(prec->dpvt);
91  if(!priv)
92  return -2;
93 
94  epicsTimeStamp ts;
95 
96  if(!priv->evr->getTimeStamp(&ts,priv->code)){
97  strncpy(prec->val,"EVR time unavailable",sizeof(prec->val));
98  return S_dev_deviceTMO;
99  }
100 
101  if (ts.secPastEpoch==priv->last_bad)
102  return 0;
103 
104  size_t r=epicsTimeToStrftime(prec->val,
105  sizeof(prec->val),
106  "%a, %d %b %Y %H:%M:%S %z",
107  &ts);
108  if(r==0||r==sizeof(prec->val)){
109  recGblRecordError(S_dev_badArgument, (void*)prec,
110  "Format string resulted in error");
111  priv->last_bad=ts.secPastEpoch;
112  return S_dev_badArgument;
113  }
114 
115  if(prec->tse==epicsTimeEventDeviceTime) {
116  prec->time = ts;
117  }
118 
119  return 0;
120 } catch(std::exception& e) {
121  recGblRecordError(S_db_noMemory, (void*)prec, e.what());
122  return S_db_noMemory;
123 }
124 }
125 
126 extern "C" {
127 
128 dsxt dxtSIEVR={&stringin_add,&del_record_delete<ts_priv>};
129 static
130 common_dset devSIEVR = {
131  5,
132  NULL,
133  dset_cast(&init_dset<&dxtSIEVR>),
134  (DEVSUPFUN) init_record_empty,
135  NULL,
136  (DEVSUPFUN) read_si,
137  NULL
138 };
139 epicsExportAddress(dset,devSIEVR);
140 
141 
142 };
epicsUInt32 code
dsxt dxtSIEVR
#define linkOptionEnd
Definition: linkoptions.h:111
Base object inspection.
Definition: object.h:378
static Object * getObject(const std::string &name)
Definition: object.cpp:107
int epicsShareAPI linkOptionsStore(const linkOptionDef *opts, void *user, const char *str, int options)
Parse a string a store the result.
Definition: linkoptions.c:135
epicsUInt32 last_bad
#define linkInt32(Struct, Member, Name, Req, Over)
Definition: linkoptions.h:99
epicsExportAddress(dset, devSIEVR)
Base interface for EVRs.
Definition: evr.h:45
Hardware link parsing and storage.
#define linkString(Struct, Member, Name, Req, Over)
Definition: linkoptions.h:105
char obj[30]
virtual bool getTimeStamp(epicsTimeStamp *ts, epicsUInt32 event)=0