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)
|
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"));
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
5
status.c
5
status.c
@ -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);
|
||||||
|
Reference in New Issue
Block a user