25 #include <mbboRecord.h> 26 #include <waveformRecord.h> 27 #include <menuFtype.h> 35 #include <netinet/in.h> 36 #include <arpa/inet.h> 39 #define DATABUF_H_INC_LEVEL2 40 #include <epicsExport.h> 54 void datarx(
void *, epicsStatus , epicsUInt32 ,
const epicsUInt8* );
67 const epicsUInt8*
buf;
81 static long add_record_waveform(dbCommon *praw)
83 waveformRecord *prec=(waveformRecord*)praw;
87 assert(prec->inp.type==INST_IO);
89 mrf::auto_ptr<s_priv> paddr(
new s_priv);
92 paddr->proto = 0xff00;
96 if (
linkOptionsStore(eventdef, paddr.get(), prec->inp.value.instio.string, 0))
97 throw std::runtime_error(
"Couldn't parse link string");
101 errlogPrintf(
"%s: failed to find object '%s'\n", prec->name, paddr->obj);
106 throw std::runtime_error(
"Failed to lookup device");
108 paddr->priv->dataRxAddReceive(datarx, praw);
113 prec->dpvt = (
void*)paddr.release();
117 }
catch(std::runtime_error& e) {
118 recGblRecordError(S_dev_noDevice, (
void*)prec, e.what());
120 }
catch(std::exception& e) {
121 recGblRecordError(S_db_noMemory, (
void*)prec, e.what());
128 static long del_record_waveform(dbCommon *praw)
131 if (!praw->dpvt)
return 0;
133 mrf::auto_ptr<s_priv> paddr(static_cast<s_priv*>(praw->dpvt));
136 paddr->priv->dataRxDeleteReceive(datarx, praw);
138 }
catch(std::runtime_error& e) {
139 recGblRecordError(S_dev_noDevice, (
void*)praw, e.what());
141 }
catch(std::exception& e) {
142 recGblRecordError(S_db_noMemory, (
void*)praw, e.what());
149 void datarx(
void *arg, epicsStatus ok,
150 epicsUInt32 len,
const epicsUInt8*
buf)
152 waveformRecord* prec=(waveformRecord*)arg;
156 if (paddr->
proto != 0xff00 && paddr->
proto != buf[0])
return;
157 if (paddr->
proto16 && paddr->
proto16 != ntohs(((epicsUInt16*)buf)[0]))
return;
158 if (paddr->
proto32 && paddr->
proto32 != ntohl(((epicsUInt32*)buf)[0]))
return;
160 dbScanLock((dbCommon*)prec);
162 if (ok || !prec->dpvt) {
171 rset *prset=(rset*)prec->rset;
172 (*(long (*)(waveformRecord*))prset->process)(prec);
177 dbScanUnlock((dbCommon*)prec);
180 static long write_waveform(waveformRecord* prec)
182 if (!prec->dpvt) {(void)recGblSetSevr(prec, COMM_ALARM, INVALID_ALARM);
return -1; }
188 (void)recGblSetSevr(prec, READ_ALARM, MAJOR_ALARM);
192 long esize = dbValueSize(prec->ftvl);
193 epicsUInt32 capacity=prec->nelm*esize;
195 if (paddr->
blen > capacity) {
196 paddr->
blen=capacity;
197 (void)recGblSetSevr(prec, READ_ALARM, INVALID_ALARM);
200 if(esize==1 || esize>8)
201 memcpy(prec->bptr, paddr->
buf, paddr->
blen);
203 epicsUInt8 *
buf=(epicsUInt8*)prec->bptr;
204 for(
size_t i=0; i<paddr->
blen; i+=esize) {
207 *(epicsUInt16*)(buf+i) = htons( *(epicsUInt16*)(paddr->
buf+i) );
210 *(epicsUInt32*)(buf+i) = htonl( *(epicsUInt32*)(paddr->
buf+i) );
213 #if EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG 214 *(epicsUInt32*)(buf+i) = *(epicsUInt32*)(paddr->
buf+i);
215 *(epicsUInt32*)(buf+i+4) = *(epicsUInt32*)(paddr->
buf+i+4);
217 *(epicsUInt32*)(buf+i+4) = htonl( *(epicsUInt32*)(paddr->
buf+i) );
218 *(epicsUInt32*)(buf+i) = htonl( *(epicsUInt32*)(paddr->
buf+i+4) );
225 prec->nord = paddr->
blen/dbValueSize(prec->ftvl);
229 }
catch(std::exception& e) {
230 recGblRecordError(S_db_noMemory, (
void*)prec, e.what());
231 return S_db_noMemory;
244 dset_cast(&init_dset<&dxtwaveforminBufTx>),
245 (DEVSUPFUN) &init_record_empty,
247 dset_cast(&write_waveform),
epicsExportAddress(dset, devwaveformindataBufRx)
static Object * getObject(const std::string &name)
int epicsShareAPI linkOptionsStore(const linkOptionDef *opts, void *user, const char *str, int options)
Parse a string a store the result.
#define linkInt32(Struct, Member, Name, Req, Over)
Hardware link parsing and storage.
#define linkString(Struct, Member, Name, Req, Over)