improvements:
- added is_running to driveable ease objects - ighdriv.c: try <maxtry> times when status reply failes - ipsdriv.c: fix trainedTo parameter - reduced SEA version of SICS
This commit is contained in:
81
ighdriv.c
81
ighdriv.c
@ -89,6 +89,10 @@ typedef struct {
|
||||
int pumpoff; /* pump signal after overpressure switch */
|
||||
float upperN2; /* LN2 trap sensor */
|
||||
float lowerN2;
|
||||
char lastans[64];
|
||||
int badcnt;
|
||||
int maxtry;
|
||||
int pumpoffcnt;
|
||||
} Igh;
|
||||
|
||||
static ParClass ighClass = { "IGH", sizeof(Igh) };
|
||||
@ -308,6 +312,11 @@ static void IghParDef(void *object)
|
||||
if (drv->extVersion != 0) ParTail("K");
|
||||
ParFloat(&drv->lowerN2, PAR_NAN);
|
||||
|
||||
ParName("maxtry");
|
||||
ParAccess(usUser);
|
||||
ParSave(1);
|
||||
ParInt(&drv->maxtry, 0);
|
||||
|
||||
EaseBasePar(drv);
|
||||
EaseSendPar(drv);
|
||||
if (eab->syntax != OLDIGH) {
|
||||
@ -318,7 +327,7 @@ static void IghParDef(void *object)
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void IghStatus(Igh * drv)
|
||||
int IghStatus(Igh * drv)
|
||||
{
|
||||
char *ans;
|
||||
int *code;
|
||||
@ -326,7 +335,7 @@ void IghStatus(Igh * drv)
|
||||
int i;
|
||||
|
||||
if (drv->d.b.state != EASE_read)
|
||||
return;
|
||||
return 1;
|
||||
|
||||
if (drv->opentime > 0 &&
|
||||
DoubleTime() > drv->opentime + (double)drv->closedelay - 1) {
|
||||
@ -334,22 +343,46 @@ void IghStatus(Igh * drv)
|
||||
drv->d.b.todo = drv->d.b.doit;
|
||||
}
|
||||
|
||||
ans = drv->d.b.ans;
|
||||
code = &drv->d.b.errCode;
|
||||
ans = drv->d.b.ans;
|
||||
if (drv->maxtry > 0 && strcmp(ans, drv->lastans) != 0) {
|
||||
strlcpy(drv->lastans, ans, sizeof(drv->lastans));
|
||||
drv->badcnt++;
|
||||
if (drv->badcnt >= drv->maxtry) {
|
||||
drv->badcnt = 0;
|
||||
ParPrintf(drv, eError, "inconsistent status response: %s", ans);
|
||||
*code = EASE_FAULT;
|
||||
return 1;
|
||||
}
|
||||
return 0; /* try again */
|
||||
}
|
||||
strlcpy(drv->lastans, ans, sizeof(drv->lastans));
|
||||
if (ans[0] != 'X' ||
|
||||
ans[2] != 'A' ||
|
||||
ans[4] != 'C' ||
|
||||
ans[6] != 'P' ||
|
||||
ans[15] != 'S' || ans[17] != 'O' || ans[19] != 'E') {
|
||||
ParPrintf(drv, eError, "illegal status response: %s", ans);
|
||||
drv->badcnt++;
|
||||
if (drv->badcnt < drv->maxtry) {
|
||||
return 0; /* try again */
|
||||
}
|
||||
ParPrintf(drv, eError, "illegal status response (dil maxtry 10 might help): %s", ans);
|
||||
*code = EASE_FAULT;
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
if (sscanf(ans + 7, "%lx", &mask) <= 0) {
|
||||
drv->badcnt++;
|
||||
if (drv->badcnt < drv->maxtry) {
|
||||
return 0; /* try again */
|
||||
}
|
||||
ParPrintf(drv, eError, "illegal valve status response");
|
||||
*code = EASE_FAULT;
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
if (drv->badcnt > drv->maxtry / 2) {
|
||||
ParPrintf(drv, eError, "needed %d retries for getting dil status", drv->badcnt);
|
||||
}
|
||||
drv->badcnt = 0;
|
||||
p = 1;
|
||||
for (i = 0; i < n_VALVES; i++) {
|
||||
if (!EaseGetUpdate(drv, VALVE_FLAGS + i)) {
|
||||
@ -376,9 +409,10 @@ void IghStatus(Igh * drv)
|
||||
ParPrintf(drv, eError, "IGH switched to local");
|
||||
*code = EASE_FAULT;
|
||||
drv->remote = 1;
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -401,10 +435,11 @@ static long IghRead(long pc, void *object)
|
||||
switch (pc) {
|
||||
default: /* FSM BEGIN ****************************** */
|
||||
EasePchk(drv);
|
||||
redo1:
|
||||
EaseWrite(eab, "X");
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
IghStatus(drv);
|
||||
if (!IghStatus(drv)) goto redo1;
|
||||
if (!drv->remote)
|
||||
goto skiprmt;
|
||||
EaseWrite(eab, "C0");
|
||||
@ -532,8 +567,14 @@ static long IghRead(long pc, void *object)
|
||||
delta = (now - drv->v6time) / 2.64; /* speed: 1/2.64 %/sec */
|
||||
drv->v6time = now;
|
||||
if (drv->v6pos > drv->mv[V6] + delta) {
|
||||
if (drv->v6pos > 99.9) {
|
||||
drv->v6pos = 99.9;
|
||||
}
|
||||
drv->v6pos -= delta;
|
||||
} else if (drv->v6pos < drv->mv[V6] - delta) {
|
||||
if (drv->v6pos < 0) {
|
||||
drv->v6pos = 0;
|
||||
}
|
||||
drv->v6pos += delta;
|
||||
} else {
|
||||
drv->v6pos = drv->mv[V6];
|
||||
@ -609,6 +650,8 @@ static long IghRead(long pc, void *object)
|
||||
if (EaseCheckDoit(eab) || drv->extVersion == 0)
|
||||
goto quit;
|
||||
|
||||
drv->pumpoffcnt = 0;
|
||||
redo2:
|
||||
EaseWrite(eab, "{r}");
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
@ -625,11 +668,18 @@ static long IghRead(long pc, void *object)
|
||||
drv->lowerN2 = PAR_NAN;
|
||||
}
|
||||
if (!switched_off) goto quit;
|
||||
/* veryfy pump control */
|
||||
if (drv->extVersion == 2) {
|
||||
ParPrintf(eab, eLogError,
|
||||
"ERROR: overpressure after 3He pump (IGNORED!)");
|
||||
goto quit;
|
||||
}
|
||||
/* verify pump control */
|
||||
EaseWrite(eab, "X");
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
IghStatus(drv);
|
||||
if (!IghStatus(drv)) goto redo2;
|
||||
drv->pumpoffcnt++;
|
||||
if (drv->pumpoffcnt < 3) goto redo2;
|
||||
if (drv->v[HE3] == 0) goto quit; /* switched off intentionally */
|
||||
/* overpressure switch activated: we switch pump control off */
|
||||
EaseWrite(eab, "C3");
|
||||
@ -740,10 +790,11 @@ static long IghSet(long pc, void *object)
|
||||
OxiSet(eab, "K", drv->sorbS, 1);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
redo1:
|
||||
EaseWrite(eab, "X");
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
IghStatus(drv);
|
||||
if (!IghStatus(drv)) goto redo1;
|
||||
if (drv->o == 2 || drv->o == 3)
|
||||
goto loop;
|
||||
if (drv->o % 2) {
|
||||
@ -756,10 +807,11 @@ static long IghSet(long pc, void *object)
|
||||
goto loop;
|
||||
|
||||
set_sorb_pow:
|
||||
redo2:
|
||||
EaseWrite(eab, "X");
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
IghStatus(drv);
|
||||
if (!IghStatus(drv)) goto redo2;
|
||||
if (drv->o <= 1)
|
||||
goto skipSetO;
|
||||
if (drv->o % 2) {
|
||||
@ -790,10 +842,11 @@ static long IghSet(long pc, void *object)
|
||||
OxiSet(eab, "S", drv->stillP, 1);
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
redo3:
|
||||
EaseWrite(eab, "X");
|
||||
return __LINE__;
|
||||
case __LINE__: /**********************************/
|
||||
IghStatus(drv);
|
||||
if (!IghStatus(drv)) goto redo3;
|
||||
snprintf(buf, sizeof buf, "O%d", drv->o | 1);
|
||||
EaseWrite(eab, buf);
|
||||
return __LINE__;
|
||||
@ -941,6 +994,8 @@ static int IghInit(SConnection * con, int argc, char *argv[], int dynamic)
|
||||
if (drv == NULL)
|
||||
return 0;
|
||||
drv->opentime = 0;
|
||||
drv->badcnt = 0;
|
||||
drv->pumpoffcnt = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user