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");
|
statusNode = GetHipadabaNode(self->pDes->parNode, "status");
|
||||||
UpdateHipadabaPar(statusNode,MakeHdbText("run"), pCon);
|
UpdateHipadabaPar(statusNode,MakeHdbText("starting"), pCon);
|
||||||
status = SecCtrInvokeFunction(self,pCon, START);
|
status = SecCtrInvokeFunction(self,pCon, START);
|
||||||
self->haltFixFlag = 0;
|
self->haltFixFlag = 0;
|
||||||
if(status == 1){
|
if(status == 1){
|
||||||
@ -150,6 +150,8 @@ static int SecCtrCheckStatus(void *pData, SConnection *pCon)
|
|||||||
status = HWIdle;
|
status = HWIdle;
|
||||||
} else if (strstr(v.v.text, "run") != NULL) {
|
} else if (strstr(v.v.text, "run") != NULL) {
|
||||||
status = HWBusy;
|
status = HWBusy;
|
||||||
|
} else if (strstr(v.v.text, "starting") != NULL) {
|
||||||
|
status = HWBusy;
|
||||||
} else if (strstr(v.v.text, "nobeam") != NULL) {
|
} else if (strstr(v.v.text, "nobeam") != NULL) {
|
||||||
status = HWNoBeam;
|
status = HWNoBeam;
|
||||||
} else if (strstr(v.v.text, "pause") != NULL) {
|
} else if (strstr(v.v.text, "pause") != NULL) {
|
||||||
@ -559,6 +561,28 @@ static int CountStatusCmd(pSICSOBJ ccmd, SConnection * con,
|
|||||||
|
|
||||||
return 1;
|
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)
|
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) {
|
if (child == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
AppendHipadabaCallback(child,
|
||||||
|
MakeHipadabaCallback(SecStatusCallback, NULL,
|
||||||
|
NULL));
|
||||||
AddHipadabaChild(node, child, NULL);
|
AddHipadabaChild(node, child, NULL);
|
||||||
|
|
||||||
child = MakeSICSHdbPar("error", usInternal, MakeHdbText("None"));
|
child = MakeSICSHdbPar("error", usInternal, MakeHdbText("None"));
|
||||||
|
@ -119,7 +119,7 @@ static void copyExponent(pHdb self, void *data)
|
|||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
static void startMultiCounting(pHdb self, SConnection *pCon)
|
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;
|
pHdb sID, mID;
|
||||||
char *pPtr, name[80];
|
char *pPtr, name[80];
|
||||||
pICountable pCount = NULL;
|
pICountable pCount = NULL;
|
||||||
@ -130,13 +130,11 @@ static void startMultiCounting(pHdb self, SConnection *pCon)
|
|||||||
|
|
||||||
mode = GetHipadabaNode(self,"mode");
|
mode = GetHipadabaNode(self,"mode");
|
||||||
preset = GetHipadabaNode(self,"preset");
|
preset = GetHipadabaNode(self,"preset");
|
||||||
master = GetHipadabaNode(self,"master");
|
|
||||||
slaves = GetHipadabaNode(self,"slaves");
|
slaves = GetHipadabaNode(self,"slaves");
|
||||||
sID = GetHipadabaNode(self,"slaveID");
|
sID = GetHipadabaNode(self,"slaveID");
|
||||||
mID = GetHipadabaNode(self,"masterID");
|
mID = GetHipadabaNode(self,"masterID");
|
||||||
assert(mode != NULL);
|
assert(mode != NULL);
|
||||||
assert(preset != NULL);
|
assert(preset != NULL);
|
||||||
assert(master != NULL);
|
|
||||||
assert(slaves != NULL);
|
assert(slaves != NULL);
|
||||||
assert(sID != NULL);
|
assert(sID != NULL);
|
||||||
assert(mID != 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);
|
data = FindCommandData(pServ->pSics,master->value.v.text,NULL);
|
||||||
if(data != NULL){
|
if(data != NULL){
|
||||||
pCount = GetCountableInterface(data);
|
pCount = GetCountableInterface(data);
|
||||||
if(pCount != NULL){
|
if(pCount != NULL){
|
||||||
copyExponent(self,data);
|
copyExponent(self->objectNode,data);
|
||||||
pCount->SetCountParameters(data,preset->value.v.doubleValue,
|
pCount->SetCountParameters(data,preset->value.v.doubleValue,
|
||||||
eMode);
|
eMode);
|
||||||
masterID = StartCountTask(data,pCon,master->value.v.text);
|
masterID = StartCountTask(data,pCon,master->value.v.text);
|
||||||
@ -193,9 +246,8 @@ static void startMultiCounting(pHdb self, SConnection *pCon)
|
|||||||
|
|
||||||
v = MakeHdbInt(masterID);
|
v = MakeHdbInt(masterID);
|
||||||
UpdateHipadabaPar(mID,v,pCon);
|
UpdateHipadabaPar(mID,v,pCon);
|
||||||
v = MakeHdbInt(slaveID);
|
|
||||||
UpdateHipadabaPar(sID,v,pCon);
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
static hdbCallbackReturn MultiSecControllCallback(pHdb node,
|
static hdbCallbackReturn MultiSecControllCallback(pHdb node,
|
||||||
@ -422,6 +474,10 @@ static int MultiSecStatus(void *pData, SConnection * pCon)
|
|||||||
pCounter self = (pCounter)pData;
|
pCounter self = (pCounter)pData;
|
||||||
|
|
||||||
|
|
||||||
|
if(!checkSlavesStarted(self,pCon)) {
|
||||||
|
return HWBusy;
|
||||||
|
}
|
||||||
|
|
||||||
if(isMultiMasterRunning(self,pCon, &status)){
|
if(isMultiMasterRunning(self,pCon, &status)){
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user