There has been a continuous problem that the counter:CheckStatus function

called from the status task messed up count processing. This has now been
resolved in this way:
- A new function ReadStatus and  a lastStatus filed have been added
  to the countable interface.
- CountTaskFunc updates the lastStatus field.
- ReadStatus just returns that field.
- ReadStatus is now being called by the status task.
This commit is contained in:
2016-03-15 11:24:50 +01:00
parent 18816067db
commit 1b2022a5e9
4 changed files with 17 additions and 3 deletions

View File

@ -101,7 +101,16 @@ pIDrivable CreateDrivableInterface(void)
pRes->drivableStatus = HWIdle; pRes->drivableStatus = HWIdle;
return pRes; return pRes;
} }
/*-------------------------------------------------------------------------*/
static int DefaultReadStatus(void *self, SConnection *pCon)
{
pICountable pCount = GetCountableInterface(self);
if(pCount != NULL){
return pCount->lastStatus;
} else {
return HWFault;
}
}
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
pICountable CreateCountableInterface(void) pICountable CreateCountableInterface(void)
{ {
@ -113,6 +122,8 @@ pICountable CreateCountableInterface(void)
} }
memset(pRes, 0, sizeof(ICountable)); memset(pRes, 0, sizeof(ICountable));
pRes->ID = COUNTID; pRes->ID = COUNTID;
pRes->lastStatus = HWIdle;
pRes->ReadStatus = DefaultReadStatus;
return pRes; return pRes;
} }
@ -378,6 +389,7 @@ static int CountTaskFunc(void *data)
assert(taskData != NULL); assert(taskData != NULL);
status = taskData->pCount->CheckCountStatus(taskData->obj,taskData->pCon); status = taskData->pCount->CheckCountStatus(taskData->obj,taskData->pCon);
taskData->pCount->lastStatus = status;
if(status == HWBusy) { if(status == HWBusy) {
return 1; return 1;
} else if(status == HWNoBeam){ } else if(status == HWNoBeam){

View File

@ -62,11 +62,13 @@
typedef struct { typedef struct {
int ID; int ID;
int running; int running;
int lastStatus;
int (*Halt)(void *self); int (*Halt)(void *self);
void (*SetCountParameters)(void *self, float fPreset, void (*SetCountParameters)(void *self, float fPreset,
CounterMode eMode); CounterMode eMode);
int (*StartCount)(void *self, SConnection *pCon); int (*StartCount)(void *self, SConnection *pCon);
int (*CheckCountStatus)(void *self, SConnection *pCon); int (*CheckCountStatus)(void *self, SConnection *pCon);
int (*ReadStatus)(void *self, SConnection *pCon);
int (*Pause)(void *self, SConnection *pCon); int (*Pause)(void *self, SConnection *pCon);
int (*Continue)(void *self, SConnection *pCon); int (*Continue)(void *self, SConnection *pCon);
int (*TransferData)(void *self, SConnection *pCon); int (*TransferData)(void *self, SConnection *pCon);

View File

@ -21,7 +21,7 @@ SOBJ = network.o ifile.o conman.o SCinter.o splitter.o passwd.o \
danu.o nxdict.o varlog.o stptok.o nread.o trigd.o cell.o\ danu.o nxdict.o varlog.o stptok.o nread.o trigd.o cell.o\
scan.o fitcenter.o telnet.o token.o wwildcard.o hklmot.o\ scan.o fitcenter.o telnet.o token.o wwildcard.o hklmot.o\
tclev.o hkl.o integrate.o optimise.o dynstring.o nxutil.o \ tclev.o hkl.o integrate.o optimise.o dynstring.o nxutil.o \
uubuffer.o udpquieck.o fourtable.o \ uubuffer.o udpquieck.o fourtable.o hexString.o\
rmtrail.o help.o nxupdate.o confvirtualmot.o vector.o\ rmtrail.o help.o nxupdate.o confvirtualmot.o vector.o\
simchop.o choco.o chadapter.o trim.o scaldate.o tasub.o\ simchop.o choco.o chadapter.o trim.o scaldate.o tasub.o\
xytable.o exebuf.o exeman.o ubfour.o ubcalc.o\ xytable.o exebuf.o exeman.o ubfour.o ubcalc.o\

View File

@ -400,7 +400,7 @@ static int CheckCountStatus(void *message, void *userData)
for(it = TaskIteratorStart(pServ->pTasker); it != NULL; it = TaskIteratorNext(it)){ for(it = TaskIteratorStart(pServ->pTasker); it != NULL; it = TaskIteratorNext(it)){
countTask = (CountTaskData *)GetTaskData(it); countTask = (CountTaskData *)GetTaskData(it);
if(countTask != NULL && countTask->id == COUNTID){ if(countTask != NULL && countTask->id == COUNTID){
testStatus = countTask->pCount->CheckCountStatus(countTask->obj,pServ->dummyCon); testStatus = countTask->pCount->ReadStatus(countTask->obj,pServ->dummyCon);
if(testStatus == HWNoBeam){ if(testStatus == HWNoBeam){
*status = eOutOfBeam; *status = eOutOfBeam;
} }