diff --git a/countersec.c b/countersec.c index 2ec4f3e8..d2f5229d 100644 --- a/countersec.c +++ b/countersec.c @@ -77,7 +77,7 @@ static int SecStartCount(void *pData, SConnection *pCon) } statusNode = GetHipadabaNode(self->pDes->parNode, "status"); - UpdateHipadabaPar(statusNode,MakeHdbText("run"), pCon); + UpdateHipadabaPar(statusNode,MakeHdbText("starting"), pCon); status = SecCtrInvokeFunction(self,pCon, START); self->haltFixFlag = 0; if(status == 1){ @@ -150,6 +150,8 @@ static int SecCtrCheckStatus(void *pData, SConnection *pCon) status = HWIdle; } else if (strstr(v.v.text, "run") != NULL) { status = HWBusy; + } else if (strstr(v.v.text, "starting") != NULL) { + status = HWBusy; } else if (strstr(v.v.text, "nobeam") != NULL) { status = HWNoBeam; } else if (strstr(v.v.text, "pause") != NULL) { @@ -559,6 +561,28 @@ static int CountStatusCmd(pSICSOBJ ccmd, SConnection * con, return 1; } +/*-------------------------------------------------------------------------- + Disallows status changes from starting to anything else but run or + error +----------------------------------------------------------------------------*/ +static hdbCallbackReturn SecStatusCallback(pHdb node, void *userData, + pHdbMessage message) +{ + pHdbDataMessage mm = NULL; + hdbValue v; + + mm = GetHdbUpdateMessage(message); + if (mm != NULL) { + if(strcmp(node->value.v.text,"starting") == 0) { + v = *mm->v; + if(strstr(v.v.text,"run") == 0 && strstr(v.v.text,"error") == 0) { + return hdbAbort; + } + } + } + + return hdbContinue; +} /*--------------------------------------------------------------------------*/ pCounter CreateSecCounter(SConnection *pCon, char *type, char *name, int length) { @@ -644,6 +668,9 @@ pCounter CreateSecCounter(SConnection *pCon, char *type, char *name, int length) if (child == NULL) { return NULL; } + AppendHipadabaCallback(child, + MakeHipadabaCallback(SecStatusCallback, NULL, + NULL)); AddHipadabaChild(node, child, NULL); child = MakeSICSHdbPar("error", usInternal, MakeHdbText("None")); diff --git a/multicountersec.c b/multicountersec.c index c94b2c0f..dc477ddd 100644 --- a/multicountersec.c +++ b/multicountersec.c @@ -119,7 +119,7 @@ static void copyExponent(pHdb self, void *data) /*---------------------------------------------------------------------------------*/ static void startMultiCounting(pHdb self, SConnection *pCon) { - pHdb mode = NULL, preset = NULL, master = NULL, slaves = NULL; + pHdb mode = NULL, preset = NULL, slaves = NULL; pHdb sID, mID; char *pPtr, name[80]; pICountable pCount = NULL; @@ -130,13 +130,11 @@ static void startMultiCounting(pHdb self, SConnection *pCon) mode = GetHipadabaNode(self,"mode"); preset = GetHipadabaNode(self,"preset"); - master = GetHipadabaNode(self,"master"); slaves = GetHipadabaNode(self,"slaves"); sID = GetHipadabaNode(self,"slaveID"); mID = GetHipadabaNode(self,"masterID"); assert(mode != NULL); assert(preset != NULL); - assert(master != NULL); assert(slaves != NULL); assert(sID != NULL); assert(mID != NULL); @@ -176,15 +174,70 @@ static void startMultiCounting(pHdb self, SConnection *pCon) } } + v = MakeHdbInt(slaveID); + UpdateHipadabaPar(sID,v,pCon); + + v = MakeHdbInt(-100); + UpdateHipadabaPar(mID,v,pCon); + +} +/*---------------------------------------------------------------------------------*/ +static int checkSlavesStarted(pCounter self, SConnection *pCon) +{ + char *pPtr, name[80]; + pHdb slaves = NULL, status = NULL, preset = NULL, master = NULL, mode = NULL, mID = NULL; + pDummy data = NULL; + pICountable pCount = NULL; + CounterMode eMode; + long masterID; + hdbValue v; + + mID = GetHipadabaNode(self->objectNode,"masterID"); + assert(mID != NULL); + + if(mID->value.v.intValue != -100){ + return 1; + } + + + slaves = GetHipadabaNode(self->objectNode,"slaves"); + assert(slaves != NULL); + + pPtr = slaves->value.v.text; + while((pPtr = stptok(pPtr,name,sizeof(name),",")) != NULL){ + data = FindCommandData(pServ->pSics,name,NULL); + if(data != NULL){ + status = GetHipadabaNode(data->pDescriptor->parNode,"status"); + if(status != NULL){ + if(strstr(status->value.v.text,"starting") != NULL){ + return 0; + } + } + } + } /* - start master + when we are here all HM were started and we can start master */ + mode = GetHipadabaNode(self->objectNode,"mode"); + preset = GetHipadabaNode(self->objectNode,"preset"); + master = GetHipadabaNode(self->objectNode,"master"); + assert(master != NULL); + assert(mode != NULL); + assert(preset != NULL); + + strtolower(mode->value.v.text); + if(strcmp(mode->value.v.text,"timer") == 0) { + eMode = eTimer; + } else { + eMode = ePreset; + } + data = FindCommandData(pServ->pSics,master->value.v.text,NULL); if(data != NULL){ pCount = GetCountableInterface(data); if(pCount != NULL){ - copyExponent(self,data); + copyExponent(self->objectNode,data); pCount->SetCountParameters(data,preset->value.v.doubleValue, eMode); masterID = StartCountTask(data,pCon,master->value.v.text); @@ -193,9 +246,8 @@ static void startMultiCounting(pHdb self, SConnection *pCon) v = MakeHdbInt(masterID); UpdateHipadabaPar(mID,v,pCon); - v = MakeHdbInt(slaveID); - UpdateHipadabaPar(sID,v,pCon); + return 0; } /*---------------------------------------------------------------------------------*/ static hdbCallbackReturn MultiSecControllCallback(pHdb node, @@ -422,6 +474,10 @@ static int MultiSecStatus(void *pData, SConnection * pCon) pCounter self = (pCounter)pData; + if(!checkSlavesStarted(self,pCon)) { + return HWBusy; + } + if(isMultiMasterRunning(self,pCon, &status)){ return status; }