static long processAo(aoRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; if (getCallbackValue(pPvt)) { if (pPvt->result.status == asynSuccess) { pr->val = pPvt->result.value; pr->udf = 0; } } else if(pr->pact == 0) { pPvt->result.value = pr->oval; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if(pPvt->result.status == asynSuccess) { return 0; } else { pPvt->result.status = asynSuccess; return -1; } }
static long processLo(longoutRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; if(getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->val = pPvt->result.value & pPvt->mask; pr->udf = 0; } } else if(pr->pact == 0) { pPvt->result.value = pr->val & pPvt->mask; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } if(pPvt->result.status != asynSuccess) { pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->alarmStat, INVALID_ALARM, &pPvt->alarmSevr); recGblSetSevr(pr, pPvt->alarmStat, pPvt->alarmSevr); } return 0; }
static long processMbbo(mbboRecord *pr) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; int status; getCallbackValue(pPvt); if(pPvt->gotValue) { /* This code is for I/O Intr scanned output records, which are not tested yet. */ unsigned long rval = pPvt->value & pr->mask; pr->rval = rval; if(pr->shft>0) rval >>= pr->shft; if(pr->sdef){ epicsUInt32 *pstate_values; int i; pstate_values = &(pr->zrvl); pr->val = 65535; /* initalize to unknown state*/ for (i = 0; i < 16; i++){ if (*pstate_values == rval){ pr->val = i; break; } pstate_values++; } }else{ /* the raw is the desired val */ pr->val = (unsigned short)rval; } pr->udf = FALSE; } else if(pr->pact == 0) {
static long processBo(boRecord *pr) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; int status; getCallbackValue(pPvt); if(pPvt->gotValue) { /* This code is for I/O Intr scanned output records, which are not tested yet. */ pr->rval = pPvt->value; pr->val = (pr->rval) ? 1 : 0; pr->udf = 0; } else if(pr->pact == 0) { pPvt->value = pr->rval; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; if(status != asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32::processCommon, error queuing request %s\n", pr->name,pPvt->pasynUser->errorMessage); recGblSetSevr(pr, WRITE_ALARM, INVALID_ALARM); } } pPvt->gotValue = 0; return 0; }
static long processMbbi(mbbiRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; int status; if(!getCallbackValue(pPvt) && !pr->pact) { if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } pr->rval = pPvt->result.value & pr->mask; pr->time = pPvt->result.time; if(pPvt->result.status==asynSuccess) { pr->udf=0; } else { pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, READ_ALARM, &pPvt->alarmStat, INVALID_ALARM, &pPvt->alarmSevr); recGblSetSevr(pr, pPvt->alarmStat, pPvt->alarmSevr); } pPvt->result.status = asynSuccess; return 0; }
static void outputCallbackCallback(CALLBACK *pcb) { devPvt *pPvt; static const char *functionName="outputCallbackCallback"; callbackGetUser(pPvt, pcb); { dbCommon *pr = pPvt->pr; dbScanLock(pr); epicsMutexLock(pPvt->devPvtLock); pPvt->newOutputCallbackValue = 1; dbProcess(pr); if (pPvt->newOutputCallbackValue != 0) { /* We called dbProcess but the record did not process, perhaps because PACT was 1 * Need to remove ring buffer element */ asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s %s::%s warning dbProcess did not process record, PACT=%d\n", pr->name, driverName, functionName,pr->pact); getCallbackValue(pPvt); pPvt->newOutputCallbackValue = 0; } epicsMutexUnlock(pPvt->devPvtLock); dbScanUnlock(pr); } }
static long processAi(aiRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; if (!getCallbackValue(pPvt) && !pr->pact) { if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } pr->time = pPvt->result.time; pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, READ_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if(pPvt->result.status==asynSuccess) { epicsFloat64 val64 = pPvt->result.value; /* ASLO/AOFF conversion */ if (pr->aslo != 0.0) val64 *= pr->aslo; val64 += pr->aoff; /* Smoothing */ if (pr->smoo == 0.0 || pr->udf || !finite(pr->val)) pr->val = val64; else pr->val = pr->val * pr->smoo + val64 * (1.0 - pr->smoo); pr->udf = 0; return 2; } else { return -1; } }
static long processMbbo(mbboRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { unsigned long rval = pPvt->result.value & pr->mask; pr->rval = rval; if(pr->shft>0) rval >>= pr->shft; if(pr->sdef){ epicsUInt32 *pstate_values; int i; pstate_values = &(pr->zrvl); pr->val = 65535; /* initalize to unknown state*/ for (i=0; i<16; i++){ if (*pstate_values == rval){ pr->val = i; break; } pstate_values++; } } else { /* the raw is the desired val */ pr->val = (unsigned short)rval; } pr->udf = FALSE; } } else if(pr->pact == 0) {
static long processAo(aoRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; if (!getCallbackValue(pPvt) && !pr->pact) { pPvt->result.value = pr->oval; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; if(status != asynSuccess) { pPvt->result.status = status; asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynFloat64:process error queuing request %s\n", pr->name,pPvt->pasynUser->errorMessage); } } if(pPvt->result.status != asynSuccess) { pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->alarmStat, INVALID_ALARM, &pPvt->alarmSevr); recGblSetSevr(pr, pPvt->alarmStat, pPvt->alarmSevr); } return 0; }
static long processBo(boRecord *pr) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; int status; if(getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->rval = pPvt->result.value; pr->val = (pr->rval) ? 1 : 0; pr->udf = 0; } } else if(pr->pact == 0) { pPvt->result.value = pr->rval; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } if(pPvt->result.status == asynSuccess) { return 0; } else { pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->alarmStat, INVALID_ALARM, &pPvt->alarmSevr); (void)recGblSetSevr(pr, pPvt->alarmStat, pPvt->alarmSevr); pPvt->result.status = asynSuccess; return -1; } }
static long processAo(aoRecord *pr) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; asynStatus status; double value; if (getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->rval = pPvt->result.value; pr->udf = 0; value = (double)pr->rval + (double)pr->roff; if(pr->aslo!=0.0) value *= pr->aslo; value += pr->aoff; if (pr->linr == menuConvertNO_CONVERSION){ ; /*do nothing*/ } else if ((pr->linr == menuConvertLINEAR) || (pr->linr == menuConvertSLOPE)) { value = value*pr->eslo + pr->eoff; } else { if(cvtRawToEngBpt(&value,pr->linr,pr->init, (void *)&pr->pbrk,&pr->lbrk)!=0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32 cvtRawToEngBpt failed\n", pr->name); (void)recGblSetSevr(pr, WRITE_ALARM, INVALID_ALARM); return -1; } } pr->val = value; pr->udf = isnan(value); } } else if(pr->pact == 0) { pPvt->result.value = pr->rval; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } if(pPvt->result.status == asynSuccess) { return 0; } else { pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->alarmStat, INVALID_ALARM, &pPvt->alarmSevr); (void)recGblSetSevr(pr, pPvt->alarmStat, pPvt->alarmSevr); pPvt->result.status = asynSuccess; return -1; } }
static long processAo(aoRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; epicsMutexLock(pPvt->devPvtLock); if (pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { if (pPvt->result.status == asynSuccess) { epicsFloat64 val64 = pPvt->result.value; /* ASLO/AOFF conversion */ if (pr->aslo != 0.0) val64 *= pr->aslo; val64 += pr->aoff; pr->val = val64; pr->udf = 0; } } else if(pr->pact == 0) { /* ASLO/AOFF conversion */ epicsFloat64 val64 = pr->oval - pr->aoff; if (pr->aslo != 0.0) val64 /= pr->aslo; pPvt->result.value = val64; if(pPvt->canBlock) { pr->pact = 1; pPvt->asyncProcessingActive = 1; } epicsMutexUnlock(pPvt->devPvtLock); status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; epicsMutexLock(pPvt->devPvtLock); reportQueueRequestStatus(pPvt, status); } pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if (pPvt->numDeferredOutputCallbacks > 0) { callbackRequest(&pPvt->outputCallback); pPvt->numDeferredOutputCallbacks--; } pPvt->newOutputCallbackValue = 0; pPvt->asyncProcessingActive = 0; epicsMutexUnlock(pPvt->devPvtLock); if(pPvt->result.status == asynSuccess) { return 0; } else { pPvt->result.status = asynSuccess; return -1; } }
static long processAo(aoRecord *pr) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; asynStatus status; double value; getCallbackValue(pPvt); if(pPvt->gotValue) { /* This code is for I/O Intr scanned output records, which are not tested yet. */ pr->rval = pPvt->value; pr->udf = 0; value = (double)pr->rval + (double)pr->roff; if(pr->aslo!=0.0) value *= pr->aslo; value += pr->aoff; if (pr->linr == menuConvertNO_CONVERSION){ ; /*do nothing*/ } else if ((pr->linr == menuConvertLINEAR) || (pr->linr == menuConvertSLOPE)) { value = value*pr->eslo + pr->eoff; }else{ if(cvtRawToEngBpt(&value,pr->linr,pr->init, (void *)&pr->pbrk,&pr->lbrk)!=0) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32 cvtRawToEngBpt failed\n", pr->name); recGblSetSevr(pr, READ_ALARM, INVALID_ALARM); goto done; } } pr->val = value; pr->udf = isnan(value); } else if(pr->pact == 0) { pPvt->value = pr->rval; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; if(status != asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32 queueRequest %s\n", pr->name,pPvt->pasynUser->errorMessage); recGblSetSevr(pr, WRITE_ALARM, INVALID_ALARM); } } done: pPvt->gotValue = 0; return 0; }
static long processAiAverage(aiRecord *pai) { devPvt *pPvt = (devPvt *)pai->dpvt; double dval; static const char *functionName="processAiAverage"; epicsMutexLock(pPvt->devPvtLock); if (getCallbackValue(pPvt)) { /* Record is I/O Intr scanned and the average has been put in the ring buffer */ dval = pPvt->result.value; pai->time = pPvt->result.time; } else { if (pPvt->numAverage == 0) { recGblSetSevr(pai, UDF_ALARM, INVALID_ALARM); pai->udf = 1; epicsMutexUnlock(pPvt->devPvtLock); return -2; } dval = pPvt->sum/pPvt->numAverage; pPvt->numAverage = 0; pPvt->sum = 0.; } epicsMutexUnlock(pPvt->devPvtLock); pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, READ_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pai, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if (pPvt->result.status == asynSuccess) { /* ASLO/AOFF conversion */ if (pai->aslo != 0.0) dval *= pai->aslo; dval += pai->aoff; /* Smoothing */ if (pai->smoo == 0.0 || pai->udf || !finite(pai->val)) pai->val = dval; else pai->val = pai->val * pai->smoo + dval * (1.0 - pai->smoo); pai->udf = 0; asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE, "%s %s::%s val=%f\n", pai->name, driverName, functionName,pai->val); return 2; } else { pPvt->result.status = asynSuccess; return -1; } }
static long processBo(boRecord *pr) { devPvt *pPvt = (devPvt *)pr->dpvt; asynStatus status; if(pPvt->newOutputCallbackValue && getCallbackValue(pPvt)) { /* We got a callback from the driver */ if (pPvt->result.status == asynSuccess) { pr->rval = pPvt->result.value & pr->mask; pr->val = (pr->rval) ? 1 : 0; pr->udf = 0; } } else if(pr->pact == 0) { pPvt->result.value = pr->rval;; if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; reportQueueRequestStatus(pPvt, status); } pasynEpicsUtils->asynStatusToEpicsAlarm(pPvt->result.status, WRITE_ALARM, &pPvt->result.alarmStatus, INVALID_ALARM, &pPvt->result.alarmSeverity); recGblSetSevr(pr, pPvt->result.alarmStatus, pPvt->result.alarmSeverity); if (pPvt->numDeferredOutputCallbacks > 0) { callbackRequest(&pPvt->outputCallback); pPvt->numDeferredOutputCallbacks--; } pPvt->newOutputCallbackValue = 0; if(pPvt->result.status == asynSuccess) { return 0; } else { pPvt->result.status = asynSuccess; return -1; } }
static long processMbbi(mbbiRecord *pr) { devInt32Pvt *pPvt = (devInt32Pvt *)pr->dpvt; int status; getCallbackValue(pPvt); if(!pPvt->gotValue && !pr->pact) { if(pPvt->canBlock) pr->pact = 1; status = pasynManager->queueRequest(pPvt->pasynUser, 0, 0); if((status==asynSuccess) && pPvt->canBlock) return 0; if(pPvt->canBlock) pr->pact = 0; if(status != asynSuccess) { asynPrint(pPvt->pasynUser, ASYN_TRACE_ERROR, "%s devAsynInt32 queueRequest %s\n", pr->name,pPvt->pasynUser->errorMessage); recGblSetSevr(pr, READ_ALARM, INVALID_ALARM); } } if(pPvt->status==asynSuccess) { pr->rval = pPvt->value & pr->mask; pr->udf=0; } pPvt->gotValue = 0; pPvt->status = asynSuccess; return 0; }