From 1b2022a5e9b4c7f63d67fa9c13eed4cf301e435d Mon Sep 17 00:00:00 2001 From: Koennecke Mark Date: Tue, 15 Mar 2016 11:24:50 +0100 Subject: [PATCH] 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. --- interface.c | 14 +++++++++++++- interface.h | 2 ++ make_gen | 2 +- status.c | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/interface.c b/interface.c index bd6bd70f..4cb59ea9 100644 --- a/interface.c +++ b/interface.c @@ -101,7 +101,16 @@ pIDrivable CreateDrivableInterface(void) pRes->drivableStatus = HWIdle; 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) { @@ -113,6 +122,8 @@ pICountable CreateCountableInterface(void) } memset(pRes, 0, sizeof(ICountable)); pRes->ID = COUNTID; + pRes->lastStatus = HWIdle; + pRes->ReadStatus = DefaultReadStatus; return pRes; } @@ -378,6 +389,7 @@ static int CountTaskFunc(void *data) assert(taskData != NULL); status = taskData->pCount->CheckCountStatus(taskData->obj,taskData->pCon); + taskData->pCount->lastStatus = status; if(status == HWBusy) { return 1; } else if(status == HWNoBeam){ diff --git a/interface.h b/interface.h index 3af14a9c..db99c1f0 100644 --- a/interface.h +++ b/interface.h @@ -62,11 +62,13 @@ typedef struct { int ID; int running; + int lastStatus; int (*Halt)(void *self); void (*SetCountParameters)(void *self, float fPreset, CounterMode eMode); int (*StartCount)(void *self, SConnection *pCon); int (*CheckCountStatus)(void *self, SConnection *pCon); + int (*ReadStatus)(void *self, SConnection *pCon); int (*Pause)(void *self, SConnection *pCon); int (*Continue)(void *self, SConnection *pCon); int (*TransferData)(void *self, SConnection *pCon); diff --git a/make_gen b/make_gen index b2b60a46..f4f8cad0 100644 --- a/make_gen +++ b/make_gen @@ -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\ scan.o fitcenter.o telnet.o token.o wwildcard.o hklmot.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\ simchop.o choco.o chadapter.o trim.o scaldate.o tasub.o\ xytable.o exebuf.o exeman.o ubfour.o ubcalc.o\ diff --git a/status.c b/status.c index 32556b6e..6b55e785 100644 --- a/status.c +++ b/status.c @@ -400,7 +400,7 @@ static int CheckCountStatus(void *message, void *userData) for(it = TaskIteratorStart(pServ->pTasker); it != NULL; it = TaskIteratorNext(it)){ countTask = (CountTaskData *)GetTaskData(it); 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){ *status = eOutOfBeam; }