static long getIoIntInfo(int cmd, dbCommon *pr, IOSCANPVT *iopvt) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; asynStatus status; const char *sizeString; /* If initCommon failed then pPvt->pint32 is NULL, return error */ if (!pPvt->pint32) return -1; if (cmd == 0) { /* Add to scan list. Register interrupts */ asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, "%s devAsynInt32::getIoIntInfo registering interrupt\n", pr->name); if (!pPvt->ringBuffer) { DBENTRY *pdbentry = dbAllocEntry(pdbbase); pPvt->ringBufferSize = DEFAULT_RING_BUFFER_SIZE; status = dbFindRecord(pdbentry, pr->name); if (status) asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32::getIoIntInfo error finding record\n", pr->name); sizeString = dbGetInfo(pdbentry, "FIFO"); if (sizeString) pPvt->ringBufferSize = atoi(sizeString); pPvt->ringBuffer = epicsRingBytesCreate(pPvt->ringBufferSize*sizeof(epicsInt32)); if (!pPvt->ringBuffer) asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32::getIoIntInfo error creating ring buffer\n", pr->name); else asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, "%s devAsynInt32::getIoIntInfo created ring buffer, size=%d\n", pr->name, pPvt->ringBufferSize); } status = pPvt->pint32->registerInterruptUser( pPvt->int32Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { printf("%s devAsynInt32 registerInterruptUser %s\n", pr->name,pPvt->pasynUser->errorMessage); } } else { asynPrint(pPvt->pasynUser, ASYN_TRACE_FLOW, "%s devAsynInt32::getIoIntInfo cancelling interrupt\n", pr->name); status = pPvt->pint32->cancelInterruptUser(pPvt->int32Pvt, pPvt->pasynUser,pPvt->registrarPvt); if(status!=asynSuccess) { printf("%s devAsynInt32 cancelInterruptUser %s\n", pr->name,pPvt->pasynUser->errorMessage); } } *iopvt = pPvt->ioScanPvt; return 0; }
static long createRingBuffer(dbCommon *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; const char *sizeString; if (!pPvt->ringBuffer) { DBENTRY *pdbentry = dbAllocEntry(pdbbase); pPvt->ringSize = DEFAULT_RING_BUFFER_SIZE; status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynFloat64::createRingBufffer error finding record\n", pr->name); return -1; } sizeString = dbGetInfo(pdbentry, "asyn:FIFO"); if (sizeString) pPvt->ringSize = atoi(sizeString); pPvt->ringBuffer = callocMustSucceed(pPvt->ringSize+1, sizeof *pPvt->ringBuffer, "devAsynFloat64::createRingBuffer"); } return asynSuccess; }
static void dbRecordHead(char *recordType,char *name, int visible) { DBENTRY *pdbentry; long status; pdbentry = dbAllocEntry(pdbbase); if(ellCount(&tempList)) yyerrorAbort("dbRecordHead: tempList not empty"); allocTemp(pdbentry); status = dbFindRecordType(pdbentry,recordType); if(status) { epicsPrintf("Record \"%s\" is of unknown type \"%s\" - ", name, recordType); yyerrorAbort(NULL); return; } /*Duplicate records ok if the same type */ status = dbCreateRecord(pdbentry,name); if(status==S_dbLib_recExists) { if(strcmp(recordType,dbGetRecordTypeName(pdbentry))!=0) { epicsPrintf("Record %s already defined with different type %s\n", name, dbGetRecordTypeName(pdbentry)); yyerror(NULL); duplicate = TRUE; return; } else if (dbRecordsOnceOnly) { epicsPrintf("Record \"%s\" already defined (dbRecordsOnceOnly is set)\n", name); yyerror(NULL); duplicate = TRUE; } } else if(status) { epicsPrintf("Can't create record \"%s\" of type \"%s\"\n", name, recordType); yyerrorAbort(NULL); } if(visible) dbVisibleRecord(pdbentry); }
static long initCommon(dbCommon *pr, DBLINK *plink, userCallback processCallback,interruptCallbackFloat64 interruptCallback) { devPvt *pPvt; asynStatus status; asynUser *pasynUser; asynInterface *pasynInterface; pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynFloat64::initCommon"); pr->dpvt = pPvt; pPvt->pr = pr; /* Create asynUser */ pasynUser = pasynManager->createAsynUser(processCallback, 0); pasynUser->userPvt = pPvt; pPvt->pasynUser = pasynUser; pPvt->ringBufferLock = epicsMutexCreate(); /* Parse the link to get addr and port */ status = pasynEpicsUtils->parseLink(pasynUser, plink, &pPvt->portName, &pPvt->addr,&pPvt->userParam); if (status != asynSuccess) { printf("%s devAsynFloat64::initCommon %s\n", pr->name, pasynUser->errorMessage); goto bad; } /* Connect to device */ status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr); if (status != asynSuccess) { printf("%s devAsynFloat64::initCommon connectDevice failed %s\n", pr->name, pasynUser->errorMessage); goto bad; } status = pasynManager->canBlock(pPvt->pasynUser, &pPvt->canBlock); if (status != asynSuccess) { printf("%s devAsynFloat64::initCommon canBlock failed %s\n", pr->name, pasynUser->errorMessage); goto bad; } /*call drvUserCreate*/ pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1); if(pasynInterface && pPvt->userParam) { asynDrvUser *pasynDrvUser; void *drvPvt; pasynDrvUser = (asynDrvUser *)pasynInterface->pinterface; drvPvt = pasynInterface->drvPvt; status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0); if(status!=asynSuccess) { printf("%s devAsynFloat64::initCommon drvUserCreate %s\n", pr->name, pasynUser->errorMessage); goto bad; } } /* Get interface asynFloat64 */ pasynInterface = pasynManager->findInterface(pasynUser, asynFloat64Type, 1); if (!pasynInterface) { printf("%s devAsynFloat64::initCommon findInterface asynFloat64Type %s\n", pr->name,pasynUser->errorMessage); goto bad; } pPvt->pfloat64 = pasynInterface->pinterface; pPvt->float64Pvt = pasynInterface->drvPvt; /* Initialize synchronous interface */ status = pasynFloat64SyncIO->connect(pPvt->portName, pPvt->addr, &pPvt->pasynUserSync, pPvt->userParam); if (status != asynSuccess) { printf("%s devAsynFloat64::initCommon Float64SyncIO->connect failed %s\n", pr->name, pPvt->pasynUserSync->errorMessage); goto bad; } scanIoInit(&pPvt->ioScanPvt); pPvt->interruptCallback = interruptCallback; /* If the info field "asyn:READBACK" is 1 and interruptCallback is not NULL * then register for callbacks on output records */ if (interruptCallback) { int enableCallbacks=0; const char *callbackString; DBENTRY *pdbentry = dbAllocEntry(pdbbase); status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynFloat64::initCommon error finding record\n", pr->name); goto bad; } callbackString = dbGetInfo(pdbentry, "asyn:READBACK"); if (callbackString) enableCallbacks = atoi(callbackString); if (enableCallbacks) { status = createRingBuffer(pr); if (status!=asynSuccess) goto bad; status = pPvt->pfloat64->registerInterruptUser( pPvt->float64Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,&pPvt->registrarPvt); if(status!=asynSuccess) { printf("%s devAsynFloat64::initRecord error calling registerInterruptUser %s\n", pr->name,pPvt->pasynUser->errorMessage); } } } return INIT_OK; bad: recGblSetSevr(pr,LINK_ALARM,INVALID_ALARM); pr->pact=1; return INIT_ERROR; }
static long initCommon(dbCommon *pr, DBLINK *plink, userCallback processCallback,interruptCallbackUInt32Digital interruptCallback, interruptCallbackEnum callbackEnum, int maxEnums, char *pFirstString, int *pFirstValue, epicsEnum16 *pFirstSeverity) { devPvt *pPvt; asynStatus status; asynUser *pasynUser; asynInterface *pasynInterface; pPvt = callocMustSucceed(1, sizeof(*pPvt), "devAsynUInt32Digital::initCommon"); pr->dpvt = pPvt; pPvt->pr = pr; /* Create asynUser */ pasynUser = pasynManager->createAsynUser(processCallback, 0); pasynUser->userPvt = pPvt; pPvt->pasynUser = pasynUser; pPvt->ringBufferLock = epicsMutexCreate(); /* Parse the link to get addr and port */ status = pasynEpicsUtils->parseLinkMask(pasynUser, plink, &pPvt->portName, &pPvt->addr, &pPvt->mask,&pPvt->userParam); if (status != asynSuccess) { printf("%s devAsynUInt32Digital::initCommon %s\n", pr->name, pasynUser->errorMessage); goto bad; } /* Connect to device */ status = pasynManager->connectDevice(pasynUser, pPvt->portName, pPvt->addr); if (status != asynSuccess) { printf("%s devAsynUInt32Digital::initCommon connectDevice failed %s\n", pr->name, pasynUser->errorMessage); goto bad; } status = pasynManager->canBlock(pPvt->pasynUser, &pPvt->canBlock); if (status != asynSuccess) { printf("%s devAsynUInt32Digital::initCommon canBlock failed %s\n", pr->name, pasynUser->errorMessage); goto bad; } /*call drvUserCreate*/ pasynInterface = pasynManager->findInterface(pasynUser,asynDrvUserType,1); if(pasynInterface && pPvt->userParam) { asynDrvUser *pasynDrvUser; void *drvPvt; pasynDrvUser = (asynDrvUser *)pasynInterface->pinterface; drvPvt = pasynInterface->drvPvt; status = pasynDrvUser->create(drvPvt,pasynUser,pPvt->userParam,0,0); if(status!=asynSuccess) { printf("%s devAsynUInt32Digital::initCommon drvUserCreate %s\n", pr->name, pasynUser->errorMessage); goto bad; } } /* Get interface asynUInt32Digital */ pasynInterface = pasynManager->findInterface(pasynUser, asynUInt32DigitalType, 1); if (!pasynInterface) { printf("%s devAsynUInt32Digital::initCommon " "findInterface asynUInt32DigitalType %s\n", pr->name,pasynUser->errorMessage); goto bad; } pPvt->puint32 = pasynInterface->pinterface; pPvt->uint32Pvt = pasynInterface->drvPvt; /* Initialize synchronous interface */ status = pasynUInt32DigitalSyncIO->connect(pPvt->portName, pPvt->addr, &pPvt->pasynUserSync, pPvt->userParam); if (status != asynSuccess) { printf("%s devAsynUInt32Digital::initCommon UInt32DigitalSyncIO->connect failed %s\n", pr->name, pPvt->pasynUserSync->errorMessage); goto bad; } pPvt->interruptCallback = interruptCallback; scanIoInit(&pPvt->ioScanPvt); /* Initialize asynEnum interfaces */ pasynInterface = pasynManager->findInterface(pPvt->pasynUser,asynEnumType,1); if (pasynInterface && (maxEnums > 0)) { size_t numRead; asynEnum *pasynEnum = pasynInterface->pinterface; void *registrarPvt; status = pasynEnumSyncIO->connect(pPvt->portName, pPvt->addr, &pPvt->pasynUserEnumSync, pPvt->userParam); if (status != asynSuccess) { printf("%s devAsynUInt32Digital::initCommon EnumSyncIO->connect failed %s\n", pr->name, pPvt->pasynUserEnumSync->errorMessage); goto bad; } status = pasynEnumSyncIO->read(pPvt->pasynUserEnumSync, pPvt->enumStrings, pPvt->enumValues, pPvt->enumSeverities, maxEnums, &numRead, pPvt->pasynUser->timeout); if (status == asynSuccess) { setEnums(pFirstString, pFirstValue, pFirstSeverity, pPvt->enumStrings, pPvt->enumValues, pPvt->enumSeverities, numRead, maxEnums); } status = pasynEnum->registerInterruptUser( pasynInterface->drvPvt, pPvt->pasynUser, callbackEnum, pPvt, ®istrarPvt); if(status!=asynSuccess) { printf("%s devAsynUInt32Digital enum registerInterruptUser %s\n", pr->name,pPvt->pasynUser->errorMessage); } } /* If the info field "asyn:READBACK" is 1 and interruptCallback is not NULL * then register for callbacks on output records */ if (interruptCallback) { int enableCallbacks=0; const char *callbackString; DBENTRY *pdbentry = dbAllocEntry(pdbbase); status = dbFindRecord(pdbentry, pr->name); if (status) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynUInt32Digital::initCommon error finding record\n", pr->name); goto bad; } callbackString = dbGetInfo(pdbentry, "asyn:READBACK"); if (callbackString) enableCallbacks = atoi(callbackString); if (enableCallbacks) { status = createRingBuffer(pr); if (status!=asynSuccess) goto bad; status = pPvt->puint32->registerInterruptUser( pPvt->uint32Pvt,pPvt->pasynUser, pPvt->interruptCallback,pPvt,pPvt->mask, &pPvt->registrarPvt); if(status!=asynSuccess) { printf("%s devAsynUInt32Digital::initRecord error calling registerInterruptUser %s\n", pr->name,pPvt->pasynUser->errorMessage); } } } return INIT_OK; bad: recGblSetSevr(pr,LINK_ALARM,INVALID_ALARM); pr->pact=1; return INIT_ERROR; }