Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
/** 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, &currentOffset[i]);
        getDoubleParam(i, P_CurrentScale,  &currentScale[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);
}
Пример #4
0
epicsShareFunc int epicsShareAPI epicsRingBytesIsFull(epicsRingBytesId id)
{
    return (epicsRingBytesFreeBytes(id) <= 0);
}
Пример #5
0
epicsShareFunc int epicsShareAPI epicsRingBytesUsedBytes(epicsRingBytesId id)
{
    ringPvt *pring = (ringPvt *)id;

    return pring->size - epicsRingBytesFreeBytes(id) - SLOP;
}