bug fixes and enhancements related to evcontroller
This commit is contained in:
77
eve.c
77
eve.c
@@ -26,9 +26,9 @@ Markus Zolliker, Sept 2004
|
||||
#define ILLNUM -1456
|
||||
#define ILLARGC -1457
|
||||
#define AMBIGUOS -1458
|
||||
#define UNCHANGEABLE -1459
|
||||
#define ILLPRIV -1460
|
||||
#define BADLOG -1461
|
||||
#define BUSY -1462
|
||||
|
||||
typedef enum {
|
||||
cntAction, iniAction, parAction, listAction,
|
||||
@@ -140,9 +140,7 @@ char *EveInt2Text(char *list[], int num) {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int EveCheckRights(EveParArg *arg, int access) {
|
||||
|
||||
if (access == usInternal) {
|
||||
arg->ret = UNCHANGEABLE;
|
||||
} else if (SCMatchRights(arg->pCon,access)) {
|
||||
if (SCMatchRights(arg->pCon,access)) {
|
||||
return 1;
|
||||
} else {
|
||||
arg->ret = ILLPRIV;
|
||||
@@ -181,10 +179,9 @@ EvePar *EveThisPar(EveParArg *arg, char *name, int flags) {
|
||||
if (!eve->par) return NULL;
|
||||
assert(arg->idx < eve->npar);
|
||||
par = eve->par + arg->idx;
|
||||
/* arg->idx ++ */
|
||||
if (par->name == NULL) {
|
||||
par->name = name;
|
||||
if (flags & 2) { /* first time: default logger */
|
||||
if (flags & EVE_LOGPAR) { /* first time: default logger */
|
||||
EveSwitchLog(eve, par, 1);
|
||||
}
|
||||
} else {
|
||||
@@ -252,12 +249,12 @@ ArgOp EveOp(EveParArg *arg, char *name, char **fmt, int access, int flags) {
|
||||
arg->idx ++;
|
||||
return noOp;
|
||||
case listAction:
|
||||
if (flags & 1) {
|
||||
if (flags & EVE_ACTPAR) {
|
||||
return fmtOp;
|
||||
}
|
||||
return noOp;
|
||||
case logAction:
|
||||
if (flags & 1) {
|
||||
if (flags & EVE_ACTPAR) {
|
||||
op = fmtOp;
|
||||
break; /* reduce fmt */
|
||||
}
|
||||
@@ -295,7 +292,7 @@ ArgOp EveOp(EveParArg *arg, char *name, char **fmt, int access, int flags) {
|
||||
}
|
||||
return noOp;
|
||||
case saveAction:
|
||||
if (flags & 4) {
|
||||
if (flags & EVE_SAVEPAR) {
|
||||
op = fmtOp;
|
||||
break; /* reduce fmt */
|
||||
}
|
||||
@@ -320,8 +317,10 @@ ArgOp EveOp(EveParArg *arg, char *name, char **fmt, int access, int flags) {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void EveOut(EveParArg *arg, char *name, char *buf) {
|
||||
EvePar *par;
|
||||
int l, i, j, m, ln, lp;
|
||||
int l, i, j, m, ln, lp, iret;
|
||||
char *p, *q, *tab;
|
||||
char buffer[256];
|
||||
char *dot;
|
||||
|
||||
switch (arg->action) {
|
||||
case listAction:
|
||||
@@ -367,7 +366,16 @@ void EveOut(EveParArg *arg, char *name, char *buf) {
|
||||
par = EveThisPar(arg, name, 0);
|
||||
arg->idx ++;
|
||||
if (par->log) {
|
||||
LoggerWrite(par->log, arg->now, arg->period, buf);
|
||||
iret = LoggerWrite(par->log, arg->now, arg->period, buf);
|
||||
if (iret) {
|
||||
if (*name) {
|
||||
dot = ".";
|
||||
} else {
|
||||
dot = "";
|
||||
}
|
||||
snprintf(buffer, sizeof buffer, "%s%s%s = %s", arg->evc->pName, dot, name, buf);
|
||||
InvokeCallBack(arg->evc->pCall, VALUECHANGE, buffer);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case saveAction:
|
||||
@@ -394,6 +402,7 @@ void EveFloatPar(EveParArg *arg, char *name, float *value, char *fmt,
|
||||
break;
|
||||
}
|
||||
*value = f;
|
||||
SCparChange(arg->pCon);
|
||||
/* fall through */
|
||||
case fmtOp:
|
||||
snprintf(buf, sizeof buf, fmt, *value);
|
||||
@@ -419,6 +428,7 @@ void EveIntPar(EveParArg *arg, char *name, int *value, int access, int flags) {
|
||||
break;
|
||||
}
|
||||
*value = i;
|
||||
SCparChange(arg->pCon);
|
||||
/* fall through */
|
||||
case fmtOp:
|
||||
snprintf(buf, sizeof buf, "%d", *value);
|
||||
@@ -438,6 +448,7 @@ void EveStrPar(EveParArg *arg, char *name, char **value, int maxsize, int access
|
||||
} else { /* fixed string */
|
||||
EveArg2Text(arg->argc, arg->argv, *value, maxsize);
|
||||
}
|
||||
SCparChange(arg->pCon);
|
||||
/* fall through */
|
||||
case fmtOp:
|
||||
if (*value == NULL) value = ∅
|
||||
@@ -465,6 +476,7 @@ void EveObPar(EveParArg *arg, int index, char *fmt, int flags) {
|
||||
} else {
|
||||
arg->evc->pParam[index].fVal = f;
|
||||
}
|
||||
SCparChange(arg->pCon);
|
||||
/* fall through */
|
||||
case fmtOp:
|
||||
snprintf(buf, sizeof buf, fmt, arg->evc->pParam[index].fVal);
|
||||
@@ -492,6 +504,7 @@ void EveObParEnum(EveParArg *arg, int index, char *list[], int flags) {
|
||||
} else {
|
||||
arg->evc->pParam[index].fVal = i;
|
||||
}
|
||||
SCparChange(arg->pCon);
|
||||
/* fall through */
|
||||
case fmtOp:
|
||||
i = (int)ObVal(arg->evc->pParam, index);
|
||||
@@ -517,6 +530,7 @@ void EveEnumPar(EveParArg *arg, char *name, int *value, char *list[], int access
|
||||
arg->ret = ILLNUM;
|
||||
} else {
|
||||
*value = i;
|
||||
SCparChange(arg->pCon);
|
||||
}
|
||||
/* fall through */
|
||||
case fmtOp:
|
||||
@@ -540,6 +554,20 @@ void EveCmd(EveParArg *arg, char *name, EveSubCmd subcmd, int access) {
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void EveFloatCmd(EveParArg *arg, char *name, float *value, char *fmt,
|
||||
FsmFunc fsmFunc, int access, int flags) {
|
||||
Eve *eve;
|
||||
EveFloatPar(arg, name, value, fmt, access, flags);
|
||||
if (arg->action == parAction && arg->argc == 2 && 0==strcasecmp(name, arg->argv[0])) {
|
||||
eve = (Eve *)arg->evc->pDriv->pPrivate;
|
||||
if (eve->todo) {
|
||||
arg->ret = BUSY;
|
||||
} else {
|
||||
eve->todo = fsmFunc;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define A EVE_ACTPAR
|
||||
#define L EVE_LOGPAR
|
||||
#define S EVE_SAVEPAR
|
||||
@@ -580,6 +608,10 @@ SConnection *EveArgConn(EveParArg *arg) {
|
||||
return arg->pCon;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int EveUserAction(EveParArg *arg) {
|
||||
return (arg->action == parAction || arg->action == listAction);
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int EveWrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]) {
|
||||
pEVControl evc = pData;
|
||||
@@ -620,9 +652,6 @@ error:
|
||||
case AMBIGUOS:
|
||||
SCPrintf(pCon, eError, "ERROR: doubly defined parameter %s.%s", evc->pName, argv[1]);
|
||||
break;
|
||||
case UNCHANGEABLE:
|
||||
SCPrintf(pCon, eError, "ERROR: %s.%s is not changeable", evc->pName, argv[1]);
|
||||
break;
|
||||
case ILLPRIV:
|
||||
SCPrintf(pCon, eError, "ERROR: Insufficient privilege to change %s.%s", evc->pName, argv[1]);
|
||||
break;
|
||||
@@ -635,6 +664,9 @@ error:
|
||||
case BADLOG:
|
||||
SCPrintf(pCon, eError, "ERROR: can not create log directory for %s %s", evc->pName, argv[1]);
|
||||
break;
|
||||
case BUSY:
|
||||
SCPrintf(pCon, eError, "ERROR: %s busy", evc->pName);
|
||||
break;
|
||||
default:
|
||||
return arg.ret;
|
||||
}
|
||||
@@ -740,7 +772,7 @@ int EveIdle(long pc, Eve *eve) {
|
||||
rd:
|
||||
if (eve->hwstate == HWBusy) eve->hwstate = HWIdle;
|
||||
FSM_CALL(eve->read);
|
||||
EveLog(eve);
|
||||
EveLog(eve); /* just for the case EveLog was not included in the read function */
|
||||
if (eve->logtime == 0) eve->logtime = 1;
|
||||
if (eve->todo) goto doit;
|
||||
/*
|
||||
@@ -856,19 +888,17 @@ int EveDontFix(pEVDriver driver, int iError) {
|
||||
return(DEVFAULT); /* severe */
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int EveSaveStatus(void *data, char *name, FILE *fil)
|
||||
int EveSavePars(pEVDriver driver, FILE *fil)
|
||||
{
|
||||
pEVControl evc = data;
|
||||
Eve *eve = evc->pDriv->pPrivate;
|
||||
Eve *eve = driver->pPrivate;
|
||||
EveParArg arg;
|
||||
|
||||
EVSaveStatus(data, name, fil);
|
||||
arg.action = saveAction;
|
||||
arg.pCon = NULL;
|
||||
arg.evc = evc;
|
||||
arg.evc = eve->evc;
|
||||
arg.fil = fil;
|
||||
eve->pardef(eve, &arg);
|
||||
return 1;
|
||||
return 2; /* no (duplicate) save of standard parameters ! */
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void EveKill(void *pData) {
|
||||
@@ -880,7 +910,9 @@ void EveKill(void *pData) {
|
||||
assert(eve);
|
||||
KillRS232(eve->ser);
|
||||
for (i=0; i<eve->npar; i++) {
|
||||
LoggerKill(eve->par[i].log);
|
||||
if (eve->par[i].log) {
|
||||
LoggerKill(eve->par[i].log);
|
||||
}
|
||||
eve->par[i].log = NULL;
|
||||
}
|
||||
free(eve);
|
||||
@@ -982,6 +1014,7 @@ pEVControl MakeEveEVC(int argc, char *argv[], Eve *eve, SConnection *pCon) {
|
||||
driver->Send = EveSend;
|
||||
driver->GetError = EveGetError;
|
||||
driver->TryFixIt = EveDontFix;
|
||||
driver->SavePars = EveSavePars;
|
||||
driver->Init = EveInit;
|
||||
driver->Close = EveClose;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user