diff --git a/interface.c b/interface.c index c8b9bc4e..1fe00113 100644 --- a/interface.c +++ b/interface.c @@ -250,7 +250,7 @@ long StartDriveTask(void *obj, SConnection *pCon, char *name, float fTarget) pDriv = GetDrivableInterface(obj); if(pDriv == NULL){ SCPrintf(pCon,eError,"ERROR: %s is not drivable", name); - return 1; + return -1; } if(pDriv->CheckLimits(obj,fTarget,error,sizeof(error)) != OKOK){ SCPrintf(pCon,eError,"ERROR: %s cannot reach %f, reason %s", name, diff --git a/tasdrive.c b/tasdrive.c index 852dc1e0..4ba2144f 100644 --- a/tasdrive.c +++ b/tasdrive.c @@ -364,6 +364,11 @@ static int startMotors(ptasMot self, tasAngles angles, */ status = self->math->mono->SetValue(self->math->monoData, pCon,angles.monochromator_two_theta); + /* + The call to CheckStatus is necessary because the eiger monochromator may not + start until then. Deferred until all parameters are known. + */ + self->math->mono->CheckStatus(self->math->monoData,pCon); if(status != OKOK){ return status; } else { diff --git a/task.c b/task.c index ad93c6d9..be911cdc 100644 --- a/task.c +++ b/task.c @@ -24,6 +24,8 @@ #define READY 1 #define WAITING 2 #define YIELDING 3 + +#define IDUNDEFINED 0L /*--------------------------------------------------------------------------*/ typedef struct __TaskHead { long lID; @@ -46,8 +48,12 @@ typedef struct __TaskMan { pTaskHead pCurrent; /* Think trice before you interfere with this! */ pTaskHead pHead; } TaskMan; -/*---------------------------------------------------------------------------*/ -static long lIDMama = 0L; +/*--------------------------------------------------------------------------- +The 7 below solves a subtle bug which occurs when a groupID in user code +has been initialized to 0 and starting fails. Then it seems as if this +group keeps running. As there will always be some task running at 0. + ----------------------------------------------------------------------------*/ +static long lIDMama = 7L; #define TASKERID 123399 /*---------------------------------------------------------------------------*/ @@ -71,9 +77,10 @@ static pTaskHead MakeTaskHead(char *name, TaskFunc pTask, SignalFunc pSignal, lIDMama++; pNew->lID = lIDMama; pNew->iStatus = READY; + pNew->groupID = IDUNDEFINED; if(lIDMama < 0){ - lIDMama = 0; + lIDMama = 7; } return pNew; @@ -529,7 +536,7 @@ long GetTaskID(pTaskHead it) /*------------------------------------------------------------------------------*/ long GetGroupID(pTaskHead it) { - return it-> groupID; + return it->groupID; } /*------------------------------------------------------------------------------*/ const char * GetTaskName(pTaskHead it) @@ -569,13 +576,15 @@ int isTaskGroupRunning(pTaskMan self, long groupID) pTaskHead pCurrent, pNext; if (self == NULL) return 0; + if (groupID == IDUNDEFINED) return 0; + assert(self->iID == TASKERID); pNext = self->pHead->pNext; /* skip dummy task */ while (pNext != NULL) { pCurrent = pNext; pNext = pCurrent->pNext; - if (pCurrent->groupID == groupID) { + if (pCurrent->groupID != IDUNDEFINED && pCurrent->groupID == groupID) { return 1; } }