diff --git a/multicounter.c b/multicounter.c index a1cf907a..266d121f 100644 --- a/multicounter.c +++ b/multicounter.c @@ -108,11 +108,18 @@ static int MMCCStart(void *pData, SConnection *pCon) } /*-------------------------------------------------------------------------*/ static int MMCCStatus(void *pData, SConnection *pCon){ - int status, slaveStatus, i, controlMonitor; - pCounter pCountController = NULL; + int status, ctrStatus, i, controlMonitor; + pCounter pCountController = NULL, pSlaveCounter = NULL; pCounter pCount = NULL; pMultiCounter self = NULL; pDummy pDum = NULL; + enum { + eIdle, + eBusy, + ePause, + eNoBeam, + eFault + } statusLevel; pCount = (pCounter)pData; if(pCount != NULL){ @@ -127,20 +134,40 @@ static int MMCCStatus(void *pData, SConnection *pCon){ controlMonitor = GetControlMonitor((pCounter)pCount); pCountController = (pCounter)self->slaveData[controlMonitor]; - if ( pCountController->pDriv->eMode == ePreset ) { - status = self->slaves[controlMonitor]->CheckCountStatus(pCountController,pCon); - } else { - status = HWIdle; - for(i = 0; i < self->nSlaves; i++){ - slaveStatus = self->slaves[i]->CheckCountStatus(pCountController,pCon); - if (slaveStatus == HWFault) { - status = HWFault; - break; - } else if (slaveStatus != HWIdle) { - status = slaveStatus; - break; + + /* counter states = HWIdle, HWBusy, HWPause, HWNoBeam, HWFault */ + status = HWIdle; + statusLevel = eIdle; + for (i = 0; i < self->nSlaves; i++) { + pSlaveCounter = (pCounter)self->slaveData[i]; + ctrStatus = self->slaves[i]->CheckCountStatus(pSlaveCounter,pCon); + if (statusLevel >= eFault) + continue; + switch (ctrStatus) { + case HWFault: + statusLevel = eFault; + status = HWFault; + break; + case HWNoBeam: + if (statusLevel < eNoBeam) + statusLevel = eNoBeam; + status = HWNoBeam; + break; + case HWPause: + if (statusLevel < ePause) + statusLevel = ePause; + status = HWPause; + break; + default: + if ( pCountController->pDriv->eMode == ePreset && i == controlMonitor && ctrStatus == HWIdle) { + statusLevel = eBusy; /* Allow transition to HWPause or higher */ + status = HWIdle; + } else if (statusLevel < eBusy && ctrStatus != HWIdle) { + /* ffr: We expect !HWIdle means HWBusy, if not the existing code should handle the exception */ + statusLevel = eBusy; + status = ctrStatus; + } } - } } if(status == HWIdle || status == HWFault){ /*