Multiple bug fixes

- Arrayutil was not summing correctly
- Added interest to motorsec in order to support old status clients
- core dump because of bad free in devser
- fixed transferring of count time in multicounter
- added stack debugging to sllinux_def
- Modifications to tasdrive to wait for finish of monochromator properly
This commit is contained in:
2014-05-05 13:52:00 +02:00
parent b466a2d427
commit 72f9e59150
8 changed files with 156 additions and 13 deletions

View File

@ -36,11 +36,18 @@ long sumWindow(int *data, int xstart, int xend, int xlength,
} }
for(j = ystart; j < yend; j++){ /* for(j = ystart; j < yend; j++){ */
row = data + j*xlength; /* row = data + j*xlength; */
/* for(i = xstart; i < xend; i++){ */
/* result += row[i]; */
/* } */
/* } */
for(i = xstart; i < xend; i++){ for(i = xstart; i < xend; i++){
result += row[i]; row = data + i*ylength;
for(j = ystart; j < yend; j++){
result += row[j];
} }
} }
return result; return result;
} }

View File

@ -835,7 +835,8 @@ int CountAction(SConnection * pCon, SicsInterp * pSics, void *pData,
{"getpar", 2, {FUPATEXT, FUPAOPT}}, {"getpar", 2, {FUPATEXT, FUPAOPT}},
{"getnmon", 0, {0, 0}}, {"getnmon", 0, {0, 0}},
{"state", 0, {0, 0}}, {"state", 0, {0, 0}},
{"error", 0, {0, 0}} {"error", 0, {0, 0}},
{"countstatus", 0, {0, 0}}
}; };
char *pMode[] = { char *pMode[] = {
"timer", "timer",
@ -852,7 +853,7 @@ int CountAction(SConnection * pCon, SicsInterp * pSics, void *pData,
argtolower(argc, argv); argtolower(argc, argv);
argx = &argv[1]; argx = &argv[1];
iRet = iRet =
EvaluateFuPa((pFuncTemplate) & ActionTemplate, 25, argc - 1, argx, EvaluateFuPa((pFuncTemplate) & ActionTemplate, 26, argc - 1, argx,
&PaRes); &PaRes);
if (iRet < 0) { if (iRet < 0) {
snprintf(pBueffel, 255,"%s", PaRes.pError); snprintf(pBueffel, 255,"%s", PaRes.pError);
@ -961,6 +962,7 @@ int CountAction(SConnection * pCon, SicsInterp * pSics, void *pData,
SCSendOK(pCon); SCSendOK(pCon);
return 1; return 1;
case 11: /* status */ case 11: /* status */
case 25:
self->pCountInt->TransferData(self, pCon); self->pCountInt->TransferData(self, pCon);
if (GetCounterMode(self) == ePreset) { if (GetCounterMode(self) == ePreset) {
lVal = GetCounterPreset(self); lVal = GetCounterPreset(self);

View File

@ -9,6 +9,7 @@
* *
* Mark Koennecke, February 2009 * Mark Koennecke, February 2009
*/ */
#include <math.h>
#include <time.h> #include <time.h>
#include <sics.h> #include <sics.h>
#include <counter.h> #include <counter.h>
@ -507,6 +508,41 @@ static int InterestCmd(pSICSOBJ ccmd, SConnection * con,
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
static int CountStatusCmd(pSICSOBJ ccmd, SConnection * con,
Hdb * cmdNode, Hdb * par[], int nPar)
{
float preset, done;
int exponent;
pHdb node, data;
node = GetHipadabaNode(ccmd->objectNode,"preset");
assert(node != NULL);
preset = node->value.v.doubleValue;
node = GetHipadabaNode(ccmd->objectNode,"mode");
assert(node != NULL);
strtolower(node->value.v.text);
if(strcmp(node->value.v.text,"timer") == 0) {
data = GetHipadabaNode(ccmd->objectNode,"time");
assert(data != NULL);
done = data->value.v.doubleValue;
} else {
data = GetHipadabaNode(ccmd->objectNode,"values");
assert(data != NULL);
done = data->value.v.intArray[0];
data = GetHipadabaNode(ccmd->objectNode,"exponent");
assert(data != NULL);
exponent = data->value.v.intValue;
if(exponent != 0){
done /= pow(10,exponent);
}
}
SCPrintf(con,eValue,"%s.CountStatus = %f %f",
ccmd->objectNode->name, preset, done);
return 1;
}
/*--------------------------------------------------------------------------*/
pCounter CreateSecCounter(SConnection *pCon, char *type, char *name, int length) pCounter CreateSecCounter(SConnection *pCon, char *type, char *name, int length)
{ {
pCounter pRes = NULL; pCounter pRes = NULL;
@ -634,6 +670,7 @@ pCounter CreateSecCounter(SConnection *pCon, char *type, char *name, int length)
child = AddSICSHdbPar(node,"pause", usUser, MakeSICSFunc(PauseCmd)); child = AddSICSHdbPar(node,"pause", usUser, MakeSICSFunc(PauseCmd));
child = AddSICSHdbPar(node,"continue", usUser, MakeSICSFunc(ContinueCmd)); child = AddSICSHdbPar(node,"continue", usUser, MakeSICSFunc(ContinueCmd));
child = AddSICSHdbPar(node,"interest", usUser, MakeSICSFunc(InterestCmd)); child = AddSICSHdbPar(node,"interest", usUser, MakeSICSFunc(InterestCmd));
child = AddSICSHdbPar(node,"countstatus", usUser, MakeSICSFunc(CountStatusCmd));
return pRes; return pRes;
} }

View File

@ -333,7 +333,8 @@ static void DevReset(DevSer * devser)
devser->current->kill(devser->current->data); devser->current->kill(devser->current->data);
} }
devser->killCurrent = 0; devser->killCurrent = 0;
/* free(devser->current); */ free(devser->current);
devser->current = NULL;
} }
} }

View File

@ -47,6 +47,7 @@
#define ABS(x) (x < 0 ? -(x) : (x)) #define ABS(x) (x < 0 ? -(x) : (x))
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static void SecMotorSetError(pMotor self, char *text) static void SecMotorSetError(pMotor self, char *text)
{ {
@ -655,6 +656,80 @@ static hdbCallbackReturn SecMotorZeroCallback(pHdb node, void *userData,
return hdbContinue; return hdbContinue;
} }
/*--------------------------------------------------------------------------*/
typedef struct {
char *pName;
SConnection *pCon;
float lastValue;
} MotInfo, *pMotInfo;
/*--------------------------------------------------------------------------*/
static void KillInfo(void *pData)
{
pMotInfo self = NULL;
assert(pData);
self = (pMotInfo) pData;
if (self->pName) {
free(self->pName);
}
if (self->pCon != NULL) {
SCDeleteConnection(self->pCon);
}
free(self);
}
/*-------------------------------------------------------------------------*/
static hdbCallbackReturn InterestCallback(pHdb node, void *userData,
pHdbMessage message)
{
pHdbDataMessage mm = NULL;
pMotor self = (pMotor) userData;
float fVal;
hdbValue v;
pMotInfo priv = (pMotInfo)userData;
assert(self != NULL);
mm = GetHdbUpdateMessage(message);
if (mm != NULL) {
v = *mm->v;
if(!SCisConnected(priv->pCon)){
return hdbKill;
}
if(ABS(v.v.doubleValue - priv->lastValue) > .1) {
SCPrintf(priv->pCon,eValue,"%s.position = %f",
priv->pName, v.v.doubleValue);
priv->lastValue = v.v.doubleValue;
}
return hdbContinue;
}
return hdbContinue;
}
/*---------------------------------------------------------------------------*/
static int InterestCmd(pSICSOBJ ccmd, SConnection * con,
Hdb * cmdNode, Hdb * par[], int nPar)
{
pMotInfo priv = NULL;
priv = malloc(sizeof(MotInfo));
if(priv == NULL){
SCWrite(con,"ERROR: out of memory registering interest",eError);
return 0;
}
if(nPar >= 1 && (strcmp(par[0]->value.v.text,"UNKNOWN") != 0)) {
priv->pName = strdup(par[0]->value.v.text);
} else {
priv->pName = strdup(ccmd->objectNode->name);
}
priv->lastValue = .0;
priv->pCon = SCCopyConnection(con);
AppendHipadabaCallback(ccmd->objectNode,
MakeHipadabaCallback(InterestCallback,priv,KillInfo));
SCSendOK(con);
return 1;
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
pMotor SecMotorInit(char *name) pMotor SecMotorInit(char *name)
{ {
@ -793,6 +868,10 @@ pMotor SecMotorInit(char *name)
child = MakeHipadabaNode("error", HIPTEXT, 1); child = MakeHipadabaNode("error", HIPTEXT, 1);
AddHipadabaChild(node, child, NULL); AddHipadabaChild(node, child, NULL);
child = AddSICSHdbPar(node,"interest", usUser, MakeSICSFunc(InterestCmd));
AddSICSHdbPar(child, "name", usUser, MakeHdbText("UNKNOWN"));
pM->endScriptID = 0; pM->endScriptID = 0;
/* initialise Drivable interface */ /* initialise Drivable interface */

View File

@ -134,6 +134,7 @@ static void startMultiCounting(pHdb self, SConnection *pCon)
assert(sID != NULL); assert(sID != NULL);
assert(mID != NULL); assert(mID != NULL);
strtolower(mode->value.v.text);
if(strcmp(mode->value.v.text,"timer") == 0) { if(strcmp(mode->value.v.text,"timer") == 0) {
eMode = eTimer; eMode = eTimer;
} else { } else {
@ -234,12 +235,12 @@ static hdbCallbackReturn MultiSecControllCallback(pHdb node,
/*-------------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------------*/
static int isMultiMasterRunning(pCounter self, SConnection *pCon, int *status) static int isMultiMasterRunning(pCounter self, SConnection *pCon, int *status)
{ {
pHdb mID, master, myStatus, control, ccd, stopTime; pHdb mID, master, myStatus, control, ccd, stopTime, timeNode;
hdbValue v; hdbValue v;
long mlID; long mlID;
void *data; void *data;
pICountable pCount; pICountable pCount;
float controlVal; float controlVal, tVal;
mID = GetHipadabaNode(self->objectNode,"masterID"); mID = GetHipadabaNode(self->objectNode,"masterID");
master = GetHipadabaNode(self->objectNode,"master"); master = GetHipadabaNode(self->objectNode,"master");
@ -247,12 +248,14 @@ static int isMultiMasterRunning(pCounter self, SConnection *pCon, int *status)
control = GetHipadabaNode(self->objectNode,"control"); control = GetHipadabaNode(self->objectNode,"control");
ccd = GetHipadabaNode(self->objectNode,"ccd"); ccd = GetHipadabaNode(self->objectNode,"ccd");
stopTime = GetHipadabaNode(self->objectNode,"stopTime"); stopTime = GetHipadabaNode(self->objectNode,"stopTime");
timeNode = GetHipadabaNode(self->objectNode,"time");
assert(mID != NULL); assert(mID != NULL);
assert(master != NULL); assert(master != NULL);
assert(myStatus != NULL); assert(myStatus != NULL);
assert(control != NULL); assert(control != NULL);
assert(ccd != NULL); assert(ccd != NULL);
assert(stopTime != NULL); assert(stopTime != NULL);
assert(timeNode != NULL);
mlID = mID->value.v.intValue; mlID = mID->value.v.intValue;
@ -269,6 +272,8 @@ static int isMultiMasterRunning(pCounter self, SConnection *pCon, int *status)
*status = pCount->CheckCountStatus(data,pCon); *status = pCount->CheckCountStatus(data,pCon);
controlVal = GetControlValue((pCounter)data); controlVal = GetControlValue((pCounter)data);
UpdateHipadabaPar(control,MakeHdbFloat(controlVal),pCon); UpdateHipadabaPar(control,MakeHdbFloat(controlVal),pCon);
tVal = GetCountTime((pCounter)data,pCon);
UpdateHipadabaPar(timeNode,MakeHdbFloat(tVal),pCon);
SecCounterSetError(self,"None"); SecCounterSetError(self,"None");
switch(*status){ switch(*status){
case HWFault: case HWFault:
@ -296,6 +301,8 @@ static int isMultiMasterRunning(pCounter self, SConnection *pCon, int *status)
*status = HWBusy; *status = HWBusy;
UpdateHipadabaPar(myStatus,MakeHdbText("run"),pCon); UpdateHipadabaPar(myStatus,MakeHdbText("run"),pCon);
UpdateHipadabaPar(stopTime,MakeHdbInt(time(NULL)),pCon); UpdateHipadabaPar(stopTime,MakeHdbInt(time(NULL)),pCon);
tVal = GetCountTime((pCounter)data,pCon);
UpdateHipadabaPar(timeNode,MakeHdbFloat(tVal),pCon);
if(ccd->value.v.intValue != 1) { if(ccd->value.v.intValue != 1) {
doCountCommand(self->objectNode,pCon,1011); doCountCommand(self->objectNode,pCon,1011);
} }

View File

@ -12,4 +12,4 @@ MFLAGS=-f makefile_linux$(DUMMY)
HDFROOT=/afs/psi.ch/project/sinq/sl6 HDFROOT=/afs/psi.ch/project/sinq/sl6
TCLINC=. TCLINC=.
DBG= -g DBG= -g -fstack-protector-all

View File

@ -352,6 +352,7 @@ static int startMotors(ptasMot self, tasAngles angles,
{ {
double curve; double curve;
int status, silent, stopFixed; int status, silent, stopFixed;
long monoID;
silent = self->math->silent; silent = self->math->silent;
stopFixed = self->math->stopFixed; stopFixed = self->math->stopFixed;
@ -374,6 +375,14 @@ static int startMotors(ptasMot self, tasAngles angles,
} else { } else {
AddTaskToGroup(pServ->pTasker, self->math->monoTaskID, self->math->groupID); AddTaskToGroup(pServ->pTasker, self->math->monoTaskID, self->math->groupID);
} }
/* monoID = StartDriveTask(self->math->monoData, pCon,"mono", */
/* angles.monochromator_two_theta); */
/* self->math->mono->CheckStatus(self->math->monoData,pCon); */
/* if(monoID < 0){ */
/* SCWrite(pCon,"ERROR: failed to start monochromator",eLogError); */
/* } else { */
/* AddTaskToGroup(pServ->pTasker,monoID, self->math->groupID); */
/* } */
/* /*
analyzer analyzer
@ -588,7 +597,8 @@ static int checkMotors(ptasMot self, SConnection * pCon)
{ {
self->math->mustRecalculate = 1; self->math->mustRecalculate = 1;
if(isTaskGroupRunning(pServ->pTasker,self->math->groupID)){ if(isTaskGroupRunning(pServ->pTasker,self->math->groupID) ||
isTaskGroupRunning(pServ->pTasker,self->math->monoTaskID)){
return HWBusy; return HWBusy;
} else { } else {
return HWIdle; return HWIdle;