- various improvements in SE drivers

This commit is contained in:
zolliker
2006-08-17 15:39:37 +00:00
parent 928738dbd8
commit ce25823567
19 changed files with 301 additions and 100 deletions

139
ighdriv.c
View File

@ -34,11 +34,12 @@ Markus Zolliker, May 2005
#define OLDIGH -8
#define SORBS_FLAG 1
#define MIXP_FLAG 2
#define STILL_FLAG 3
#define SORBP_FLAG 4
#define MOT_FLAGS 5
#define VALVE_FLAGS 8
#define MAX_FLAG 31
#define MAXP_FLAG 3
#define STILL_FLAG 4
#define SORBP_FLAG 5
#define MOT_FLAGS 6
#define VALVE_FLAGS 9
#define MAX_FLAG 32
static char *valves[]={"V9", "V8", "V7", "V11A", "V13A", "V13B", "V11B", "V12B",
" He4", "V1", "V5", "V4", "V3", "V14", "V10", "V2",
@ -60,6 +61,7 @@ static char *closedOrOpen[]={"closed", "open", NULL};
typedef struct {
EaseDriv d;
float setT;
float sorbS;
float mixT;
float onekT;
@ -69,6 +71,8 @@ typedef struct {
float sorbP;
float press[n_PRESS];
float mv[n_MOTOR];
float v6pos;
time_t v6time;
int pdig;
int v[n_VALVES];
int e; /* heater range */
@ -82,12 +86,40 @@ static ParClass ighClass = { "IGH", sizeof(Igh) };
static long IghSet(long pc, void *object);
/*----------------------------------------------------------------------------*/
static int IghPower2Range(float p) {
int e;
if (p <= 0) return 0;
for (e = 1; e < 5; e++) {
if (p < 1.9994) break;
p /= 10;
}
return e;
}
/*----------------------------------------------------------------------------*/
static float IghRange2Max(int e) {
static float elist[]={0,2,20,200,2000,20000};
if (e < 0) {
e = 0;
} else if (e > 5) {
e = 5;
}
return elist[e];
}
/*----------------------------------------------------------------------------*/
static void IghParDef(void *object) {
Igh *drv = ParCast(&ighClass, object);
EaseBase *eab = object;
int i, flag, l, changed;
char *vPos;
char *vPos, *val;
char fmt[8], vList[80];
float maxP;
ParName(""); ParTail("K"); ParFmt("%.4f");
ParFloat(&drv->mixT, PAR_NAN);
ParName("Tset"); ParTail("K"); ParFmt("%.4f");
if (eab->syntax == OLDIGH) ParList("all");
ParFloat(&drv->setT, PAR_NAN);
ParName("TsorbSet");
EaseUpdate(SORBS_FLAG); ParTail("K"); ParFmt("%.1f");
@ -106,8 +138,7 @@ static void IghParDef(void *object) {
ParFloat(&drv->sorbT, PAR_NAN);
ParName("Pmix");
if (drv->e < 1 || drv->e > 5) drv->e=1;
if (drv->e == 5) {
if (drv->e >= 5 || drv->e < 1) {
strcpy(fmt, "%.0f");
} else {
snprintf(fmt, sizeof fmt, "%%.%df", 4 - drv->e);
@ -115,6 +146,14 @@ static void IghParDef(void *object) {
EaseUpdate(MIXP_FLAG); ParTail("uW"); ParFmt(fmt);
ParFloat(&drv->mixP, PAR_NAN);
ParName("Pmax");
EaseUpdate(MAXP_FLAG); ParTail("uW"); ParFmt("%g");
if ((val = ParGetValueArg())) {
drv->e = IghPower2Range(atof(val) * 0.9);
}
maxP = IghRange2Max(drv->e);
ParFloat(&maxP, PAR_NAN);
ParName("Pstill");
EaseUpdate(STILL_FLAG); ParTail("mW"); ParFmt("%.3f");
ParFloat(&drv->stillP, PAR_NAN);
@ -144,11 +183,16 @@ static void IghParDef(void *object) {
flag = MOT_FLAGS;
for (i=0; i<n_MOTOR; i++) {
ParName(motorValves[i]);
ParFmt("%.1f");
ParTail("%");
if (i == V1K) ParList("all");
EaseUpdate(flag); flag++;
ParFloat(&drv->mv[i], PAR_NAN);
}
ParName("v6pos"); ParFmt("%.1f"); ParTail("%");
ParFloat(&drv->v6pos, PAR_NAN);
assert(flag == VALVE_FLAGS);
l = 0;
for (i=0; i<n_VALVES; i++) {
@ -229,7 +273,13 @@ void IghStatus(Igh *drv) {
drv->a = ans[3] - '0';
drv->s = ans[16] - '0';
drv->o = ans[18] - '0';
drv->e = ans[20] - '0';
if (EaseGetUpdate(drv, MAXP_FLAG) == 0) {
if (drv->a == 0) {
drv->e = 0;
} else {
drv->e = ans[20] - '0';
}
}
if (ans[5] != '3' && drv->remote == 2) {
ParPrintf(drv, eError, "IGH switched to local");
*code = EASE_FAULT;
@ -243,7 +293,8 @@ static long IghRead(long pc, void *object) {
EaseBase *eab = object;
char *p;
int l;
time_t thisPeriod;
time_t now;
float delta;
switch (pc) { default: /* FSM BEGIN *******************************/
EaseWrite(eab, "X");
@ -285,6 +336,12 @@ static long IghRead(long pc, void *object) {
}
if (EaseCheckDoit(eab)) goto quit;
if (eab->syntax == OLDIGH) goto noSetTemp;
EaseWrite(eab, "R33");
return __LINE__; case __LINE__: /**********************************/
drv->setT = OxiGet(eab, 4, NULL, drv->setT);
noSetTemp:
EaseWrite(eab, "R1");
return __LINE__; case __LINE__: /**********************************/
drv->sorbT = OxiGet(eab, 1, NULL, drv->sorbT);
@ -297,6 +354,10 @@ static long IghRead(long pc, void *object) {
if (EaseCheckDoit(eab)) goto quit;
if (drv->e == 0) {
drv->mixP = 0;
goto skip4;
}
if (EaseGetUpdate(drv, MIXP_FLAG)) goto skip4;
EaseWrite(eab, "R4");
return __LINE__; case __LINE__: /**********************************/
@ -325,6 +386,16 @@ static long IghRead(long pc, void *object) {
EaseWrite(eab, "R7");
return __LINE__; case __LINE__: /**********************************/
drv->mv[V6] = OxiGet(eab, 1, NULL, drv->mv[V6]);
time(&now);
delta = (now - drv->v6time) / 2.64; /* speed: 1/2.64 %/sec */
drv->v6time = now;
if (drv->v6pos > drv->mv[V6] + delta) {
drv->v6pos -= delta;
} else if (drv->v6pos < drv->mv[V6] - delta) {
drv->v6pos += delta;
} else {
drv->v6pos = drv->mv[V6];
}
skip7:
if (EaseCheckDoit(eab)) goto quit;
@ -424,6 +495,7 @@ static long IghSet(long pc, void *object) {
if (upd == EASE_RUN) goto set_temp;
if (upd == SORBS_FLAG) goto set_sorb_temp;
if (upd == MIXP_FLAG) goto set_mix_pow;
if (upd == MAXP_FLAG) goto set_max_pow;
if (upd == STILL_FLAG) goto set_still_pow;
if (upd == SORBP_FLAG) goto set_sorb_pow;
goto finish;
@ -482,33 +554,44 @@ static long IghSet(long pc, void *object) {
goto loop;
set_mix_pow:
EaseWrite(eab, "A0");
return __LINE__; case __LINE__: /**********************************/
if (drv->e <= 1) goto skipe;
EaseWrite(eab, "E1");
return __LINE__; case __LINE__: /**********************************/
skipe:
if (drv->mixP > 0) {
mp = drv->mixP * 0.1;
for (i=2; i<6; i++) {
if (mp > 199) {
break;
}
mp = mp * 10;
}
if (mp > 1999) mp = 1999;
drv->e = 7-i;
drv->e = IghPower2Range(drv->mixP);
mp = drv->mixP / IghRange2Max(drv->e) * 2000;
} else {
mp = 0;
mp = 0; /* range unchanged for external heater signal */
}
OxiSet(eab, "M", mp, 0);
return __LINE__; case __LINE__: /**********************************/
if (drv->e == 0) goto loop;
EaseWrite(eab, "A1");
return __LINE__; case __LINE__: /**********************************/
set_max_pow:
if (drv->e == 0) goto seta0;
snprintf(buf, sizeof buf, "E%d", drv->e);
EaseWrite(eab, buf);
return __LINE__; case __LINE__: /**********************************/
EaseWrite(eab, "A1");
goto loop;
seta0:
EaseWrite(eab, "A0");
return __LINE__; case __LINE__: /**********************************/
goto loop;
set_temp:
/* unknown yet */
goto loop;
EaseWrite(eab, "A2");
return __LINE__; case __LINE__: /**********************************/
if (drv->d.targetValue < 0) drv->d.targetValue = 0;
if (drv->d.targetValue > 1.999) drv->d.targetValue = 1.999;
OxiSet(eab, "T", drv->d.targetValue, 4);
return __LINE__; case __LINE__: /**********************************/
goto loop;
@ -521,6 +604,11 @@ static long IghSet(long pc, void *object) {
set_mot:
i = upd - MOT_FLAGS;
if (drv->mv[i] > 99.9) {
drv->mv[i]=99.9;
} else if (drv->mv[i] < 0) {
drv->mv[i]=0;
}
OxiSet(eab, motorCommands[i], drv->mv[i], 1);
return __LINE__; case __LINE__: /**********************************/
goto loop;
@ -544,11 +632,10 @@ static int IghInit(SConnection *con, int argc, char *argv[], int dynamic) {
IghParDef, OxiHandler, IghStart, NULL, IghRead,
IghSet);
if (drv == NULL) return 0;
ParPrintf(drv, eValue, "OI Gas Handling System");
return 1;
}
/*----------------------------------------------------------------------------*/
void IghStartup(void) {
ParMakeClass(&ighClass, EaseDrivClass());
MakeDriver("IGH", IghInit, 0);
MakeDriver("IGH", IghInit, 0, "OI Gas Handling System");
}