Merge branch 'multicounter' into develop

This commit is contained in:
2016-01-15 15:19:50 +01:00
3 changed files with 129 additions and 11 deletions

View File

@ -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"));