/* devNetdev.c * Device support: drvNetdev <-> ai record * * Note that most of this is copied from EPICS base's * src/dev/soft/devAiSoftRaw.c */ /* System */ #include #include #include /* EPICS base */ #include "alarm.h" #include "dbDefs.h" #include "dbAccess.h" #include "dbEvent.h" #include "recGbl.h" #include "recSup.h" #include "devSup.h" #include "link.h" #include "aiRecord.h" #include "epicsExport.h" /* Driver */ #include "drvNetdev.h" static long init_record(aiRecord *rec) { if (rec->inp.type == INST_IO) { /* We expect INP=":port". * Init. driver, park the driver info pointer * in the "device private" member of the record. */ rec->dpvt = drvNetdev_init(rec->inp.value.instio.string); } else { recGblRecordError(S_db_badField, rec, "devAiNetdev (init_record) Illegal INP field"); return S_db_badField; } return 0; } static long read_ai(aiRecord *rec) { drvNetdev *drv = (drvNetdev *)rec->dpvt; if (drv) { epicsMutexLock(drv->mutex); if (drv->is_valid) { rec->rval = drv->value; rec->udf = 0; } else { recGblSetSevr(rec, READ_ALARM, INVALID_ALARM); } epicsMutexUnlock(drv->mutex); } return 0; } /* Create the dset for devAiSoftRaw */ struct { long number; DEVSUPFUN report; DEVSUPFUN init; DEVSUPFUN init_record; DEVSUPFUN get_ioint_info; DEVSUPFUN read_ai; DEVSUPFUN special_linconv; } devAiNetdev = { 6, NULL, NULL, init_record, NULL, read_ai, NULL }; /* For DBD: device(ai,INST_IO,devAiNetdev,"Netdev") */ epicsExportAddress(dset,devAiNetdev);