MultiCounterSec revised now passes self test
This commit is contained in:
14
countersec.c
14
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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
@ -177,7 +189,7 @@ static void startMultiCounting(pHdb self, SConnection *pCon)
|
|||||||
v = MakeHdbInt(slaveID);
|
v = MakeHdbInt(slaveID);
|
||||||
UpdateHipadabaPar(sID,v,pCon);
|
UpdateHipadabaPar(sID,v,pCon);
|
||||||
|
|
||||||
v = MakeHdbInt(-100);
|
v = MakeHdbInt(slaveSTARTING);
|
||||||
UpdateHipadabaPar(mID,v,pCon);
|
UpdateHipadabaPar(mID,v,pCon);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -195,10 +207,16 @@ static int checkSlavesStarted(pCounter self, SConnection *pCon)
|
|||||||
mID = GetHipadabaNode(self->objectNode,"masterID");
|
mID = GetHipadabaNode(self->objectNode,"masterID");
|
||||||
assert(mID != NULL);
|
assert(mID != NULL);
|
||||||
|
|
||||||
if(mID->value.v.intValue != -100){
|
if(mID->value.v.intValue != slaveSTARTING){
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(SCGetInterrupt(pCon) != eContinue) {
|
||||||
|
doCountCommand(self->objectNode,pCon,1001);
|
||||||
|
mID->value.v.intValue = -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
slaves = GetHipadabaNode(self->objectNode,"slaves");
|
slaves = GetHipadabaNode(self->objectNode,"slaves");
|
||||||
assert(slaves != NULL);
|
assert(slaves != NULL);
|
||||||
|
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