LOCAL long devLiGP307_read_li(longinRecord *precord) { devGP307dpvt *pdevGP307dpvt = (devGP307dpvt*)precord->dpvt; drvGP307Config *pdrvGP307Config = (drvGP307Config*)pdevGP307dpvt->pdrvGP307Config; GP307_read *pGP307_read = (GP307_read*) pdrvGP307Config->pGP307_read; switch(pdevGP307dpvt->param) { case GP307DEVPARAM_STATUSCBCOUNT: epicsMutexLock(pdrvGP307Config->lock); precord->val = pdrvGP307Config->cbCount; epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSTIMEOUTCOUNT: epicsMutexLock(pdrvGP307Config->lock); precord->val = pdrvGP307Config->timeoutCount; epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSRECONNCOUNT: epicsMutexLock(pdrvGP307Config->lock); precord->val = pdrvGP307Config->reconnCount; epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSASYNSCANLOSTCNT: epicsMutexLock(pdrvGP307Config->lock); precord->val = pdrvGP307Config->asynScanLostCount; epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSASYNREQUESTLOSTCNT: epicsMutexLock(pdrvGP307Config->lock); precord->val = pdrvGP307Config->asynRequestLostCount; epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSQCBRNGBUFFREEBYTES: epicsMutexLock(pdrvGP307Config->lock); precord->val = epicsRingBytesFreeBytes(pdrvGP307Config->queueCallbackRingBytesId); epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSQCBRNGBUFFREEEVENTS: epicsMutexLock(pdrvGP307Config->lock); precord->val = epicsRingBytesFreeBytes(pdrvGP307Config->queueCallbackRingBytesId)/sizeof(drvGP307CallbackQueueBuf); epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSPCBRNGBUFFREEBYTES: epicsMutexLock(pdrvGP307Config->lock); precord->val = epicsRingBytesFreeBytes(pdrvGP307Config->postCallbackRingBytesId); epicsMutexUnlock(pdrvGP307Config->lock); break; case GP307DEVPARAM_STATUSPCBRNGBUFFREEEVENTS: epicsMutexLock(pdrvGP307Config->lock); precord->val = epicsRingBytesFreeBytes(pdrvGP307Config->postCallbackRingBytesId)/sizeof(drvGP307CallbackQueueBuf); epicsMutexUnlock(pdrvGP307Config->lock); break; } return 2; }
static void check(epicsRingBytesId ring, int expectedFree) { int expectedUsed = RINGSIZE - expectedFree; int expectedEmpty = (expectedUsed == 0); int expectedFull = (expectedFree == 0); int nFree = epicsRingBytesFreeBytes(ring); int nUsed = epicsRingBytesUsedBytes(ring); int isEmpty = epicsRingBytesIsEmpty(ring); int isFull = epicsRingBytesIsFull(ring); testOk(nFree == expectedFree, "Free: %d == %d", nFree, expectedFree); testOk(nUsed == expectedUsed, "Used: %d == %d", nUsed, expectedUsed); testOk(isEmpty == expectedEmpty, "Empty: %d == %d", isEmpty, expectedEmpty); testOk(isFull == expectedFull, "Full: %d == %d", isFull, expectedFull); }
/** This function computes the sums, diffs and positions, and does callbacks * \param[in] raw Array of raw current readings */ void drvQuadEM::computePositions(epicsFloat64 raw[QE_MAX_INPUTS]) { int i; int count; int numAverage; int ringOverflows; int geometry; epicsFloat64 currentOffset[QE_MAX_INPUTS]; epicsFloat64 currentScale[QE_MAX_INPUTS]; epicsFloat64 positionOffset[2]; epicsFloat64 positionScale[2]; epicsInt32 intData[QE_MAX_DATA]; epicsFloat64 doubleData[QE_MAX_DATA]; epicsFloat64 denom; static const char *functionName = "computePositions"; getIntegerParam(P_Geometry, &geometry); // If the ring buffer is full then remove the oldest entry if (epicsRingBytesFreeBytes(ringBuffer_) < (int)sizeof(doubleData)) { count = epicsRingBytesGet(ringBuffer_, (char *)&doubleData, sizeof(doubleData)); ringCount_--; getIntegerParam(P_RingOverflows, &ringOverflows); ringOverflows++; setIntegerParam(P_RingOverflows, ringOverflows); } for (i=0; i<QE_MAX_INPUTS; i++) { getDoubleParam(i, P_CurrentOffset, ¤tOffset[i]); getDoubleParam(i, P_CurrentScale, ¤tScale[i]); doubleData[i] = raw[i]*currentScale[i] - currentOffset[i]; } for (i=0; i<2; i++) { getDoubleParam(i, P_PositionOffset, &positionOffset[i]); getDoubleParam(i, P_PositionScale, &positionScale[i]); } doubleData[QESumAll] = doubleData[QECurrent1] + doubleData[QECurrent2] + doubleData[QECurrent3] + doubleData[QECurrent4]; if (geometry == QEGeometrySquare) { doubleData[QESumX] = doubleData[QESumAll]; doubleData[QESumY] = doubleData[QESumAll]; doubleData[QEDiffX] = (doubleData[QECurrent2] + doubleData[QECurrent3]) - (doubleData[QECurrent1] + doubleData[QECurrent4]); doubleData[QEDiffY] = (doubleData[QECurrent1] + doubleData[QECurrent2]) - (doubleData[QECurrent3] + doubleData[QECurrent4]); } else { doubleData[QESumX] = doubleData[QECurrent1] + doubleData[QECurrent2]; doubleData[QESumY] = doubleData[QECurrent3] + doubleData[QECurrent4]; doubleData[QEDiffX] = doubleData[QECurrent2] - doubleData[QECurrent1]; doubleData[QEDiffY] = doubleData[QECurrent4] - doubleData[QECurrent3]; } denom = doubleData[QESumX]; if (denom == 0.) denom = 1.; doubleData[QEPositionX] = (positionScale[0] * doubleData[QEDiffX] / denom) - positionOffset[0]; denom = doubleData[QESumY]; if (denom == 0.) denom = 1.; doubleData[QEPositionY] = (positionScale[1] * doubleData[QEDiffY] / denom) - positionOffset[1]; count = epicsRingBytesPut(ringBuffer_, (char *)&doubleData, sizeof(doubleData)); ringCount_++; if (count != sizeof(doubleData)) { asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, "%s:%s: error writing ring buffer, count=%d, should be %d\n", driverName, functionName, count, (int)sizeof(doubleData)); } getIntegerParam(P_NumAverage, &numAverage); if (numAverage > 0) { if (ringCount_ >= numAverage) { triggerCallbacks(); } } for (i=0; i<QE_MAX_DATA; i++) { intData[i] = (epicsInt32)doubleData[i]; setDoubleParam(i, P_DoubleData, doubleData[i]); callParamCallbacks(i); } doCallbacksInt32Array(intData, QE_MAX_DATA, P_IntArrayData, 0); }
epicsShareFunc int epicsShareAPI epicsRingBytesIsFull(epicsRingBytesId id) { return (epicsRingBytesFreeBytes(id) <= 0); }
epicsShareFunc int epicsShareAPI epicsRingBytesUsedBytes(epicsRingBytesId id) { ringPvt *pring = (ringPvt *)id; return pring->size - epicsRingBytesFreeBytes(id) - SLOP; }