Fix for multicountersec coordination issues implemented
This commit is contained in:
29
countersec.c
29
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"));
|
||||
|
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user