Merge branch 'multicounter' into develop
This commit is contained in:
43
countersec.c
43
countersec.c
@ -45,21 +45,33 @@ static void SecCounterSetError(pCounter self, char *text)
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int SecCtrInvokeFunction(pCounter self, SConnection *pCon, int code)
|
||||
{
|
||||
pHdb node = NULL;
|
||||
pHdb node = NULL, status = NULL;
|
||||
hdbValue v;
|
||||
|
||||
node = GetHipadabaNode(self->pDes->parNode, "control");
|
||||
status = GetHipadabaNode(self->pDes->parNode, "status");
|
||||
assert(node != NULL);
|
||||
assert(status != NULL);
|
||||
v = MakeHdbFloat(code);
|
||||
if(code != START && strcmp(status->value.v.text,"starting") == 0){
|
||||
UpdateHipadabaPar(node,MakeHdbText("run"),NULL);
|
||||
}
|
||||
return SetHipadabaPar(node,v,pCon);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int SecCtrHalt(void *pData)
|
||||
{
|
||||
pCounter self = (pCounter)pData;
|
||||
pHdb node = NULL;
|
||||
|
||||
assert(self != NULL);
|
||||
|
||||
SecCtrInvokeFunction(self,pServ->dummyCon, STOP);
|
||||
node = GetHipadabaNode(self->pDes->parNode, "status");
|
||||
assert(node != NULL);
|
||||
if(strcmp(node->value.v.text,"starting") == 0){
|
||||
UpdateHipadabaPar(node,MakeHdbText("run"),NULL);
|
||||
}
|
||||
ReleaseCountLock(self->pCountInt);
|
||||
return 1;
|
||||
}
|
||||
@ -77,7 +89,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 +162,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) {
|
||||
@ -562,6 +576,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)
|
||||
{
|
||||
@ -647,6 +683,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"));
|
||||
|
Reference in New Issue
Block a user