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) int SecCtrInvokeFunction(pCounter self, SConnection *pCon, int code)
{ {
pHdb node = NULL; pHdb node = NULL, status = NULL;
hdbValue v; hdbValue v;
node = GetHipadabaNode(self->pDes->parNode, "control"); node = GetHipadabaNode(self->pDes->parNode, "control");
status = GetHipadabaNode(self->pDes->parNode, "status");
assert(node != NULL); assert(node != NULL);
assert(status != NULL);
v = MakeHdbFloat(code); v = MakeHdbFloat(code);
if(code != START && strcmp(status->value.v.text,"starting") == 0){
UpdateHipadabaPar(node,MakeHdbText("run"),NULL);
}
return SetHipadabaPar(node,v,pCon); return SetHipadabaPar(node,v,pCon);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int SecCtrHalt(void *pData) static int SecCtrHalt(void *pData)
{ {
pCounter self = (pCounter)pData; pCounter self = (pCounter)pData;
pHdb node = NULL;
assert(self != NULL); assert(self != NULL);
SecCtrInvokeFunction(self,pServ->dummyCon, STOP); 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); ReleaseCountLock(self->pCountInt);
return 1; return 1;
} }
@ -77,7 +89,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 +162,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) {
@ -562,6 +576,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)
{ {
@ -647,6 +683,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"));

View File

@ -17,6 +17,10 @@
#include <macro.h> #include <macro.h>
#include <status.h> #include <status.h>
#include "sicshipadaba.h" #include "sicshipadaba.h"
#define slaveSTARTING -100
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
typedef struct { typedef struct {
float fPreset; float fPreset;
@ -39,15 +43,18 @@ static void SecCounterSetError(pCounter self, char *text)
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
static void doCountCommand(pHdb self, SConnection *pCon, int command) static void doCountCommand(pHdb self, SConnection *pCon, int command)
{ {
pHdb master = NULL, slaves = NULL; pHdb master = NULL, slaves = NULL, status = NULL;
char *pPtr, name[80]; char *pPtr, name[80];
pICountable pCount = NULL; pICountable pCount = NULL;
void *data; void *data;
master = GetHipadabaNode(self,"master"); master = GetHipadabaNode(self,"master");
slaves = GetHipadabaNode(self,"slaves"); slaves = GetHipadabaNode(self,"slaves");
status = GetHipadabaNode(self,"status");
assert(master != NULL); assert(master != NULL);
assert(slaves != NULL); assert(slaves != NULL);
assert(status != NULL);
/* /*
treat master treat master
@ -61,7 +68,12 @@ static void doCountCommand(pHdb self, SConnection *pCon, int command)
pCount->Halt(data); pCount->Halt(data);
break; break;
case 1002: /*pause */ case 1002: /*pause */
pCount->Pause(data,pCon); if(strcmp(status->value.v.text,"starting") == 0){
SCWrite(pCon,"WARNINg: cannot pause when not yet started", eWarning);
return;
} else {
pCount->Pause(data,pCon);
}
break; break;
case 1003: /* continue */ case 1003: /* continue */
pCount->Continue(data,pCon); pCount->Continue(data,pCon);
@ -119,7 +131,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 +142,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 +186,76 @@ static void startMultiCounting(pHdb self, SConnection *pCon)
} }
} }
v = MakeHdbInt(slaveID);
UpdateHipadabaPar(sID,v,pCon);
v = MakeHdbInt(slaveSTARTING);
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 != slaveSTARTING){
return 1;
}
if(SCGetInterrupt(pCon) != eContinue) {
doCountCommand(self->objectNode,pCon,1001);
mID->value.v.intValue = -1;
return 0;
}
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 +264,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 +492,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;
} }

View File

@ -391,6 +391,11 @@ static int CheckCountStatus(void *message, void *userData)
pTaskHead it; pTaskHead it;
CountTaskData *countTask = NULL; CountTaskData *countTask = NULL;
/*
This function shall never induce an interrupt
*/
SCSetInterrupt(pServ->dummyCon,eContinue);
if(*status == eCounting){ if(*status == eCounting){
for(it = TaskIteratorStart(pServ->pTasker); it != NULL; it = TaskIteratorNext(it)){ for(it = TaskIteratorStart(pServ->pTasker); it != NULL; it = TaskIteratorNext(it)){
countTask = (CountTaskData *)GetTaskData(it); countTask = (CountTaskData *)GetTaskData(it);