bug fixes and enhancements related to evcontroller

This commit is contained in:
zolliker
2005-03-03 14:13:45 +00:00
parent 48da61421c
commit 0677ecfbe7
13 changed files with 474 additions and 204 deletions

77
eve.c
View File

@@ -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 = &empty;
@@ -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;