This commit is contained in:
zolliker
2012-06-18 13:37:11 +00:00
parent ee6c52450e
commit 6c69b59fce
3 changed files with 42 additions and 168 deletions

View File

@ -1,9 +1,10 @@
# Makefile for modifications to PGPLOT allowing for
# timeout on cursor input for the devices VMAC, XWINDOW and XSERVE
ORIG=/usr/local/distsrc/pgplot5.2.2
PGROOT=/afs/psi.ch/project/sinq/sl6
ORIG=$(PGROOT)/lib
FFLAGS=-g -Wimplicit -Wall -g -I$(ORIG)
FFLAGS=-g -Wimplicit -Wall -g -I$(PGROOT)/include
CFLAGS=-g -DPG_PPU -I. -I/usr/X11R6/include
include make_gen

View File

@ -173,7 +173,7 @@ int CocCreateSockAdr(
}
char* readWrite(int tmo, int skip, char *find) {
int lbuf, go, iret, n, shortTmo, l, socket;
int lbuf, go, n, shortTmo, l, socket;
Mode idx;
char *msg, *p, *q;
char chr;
@ -283,7 +283,7 @@ char* readWrite(int tmo, int skip, char *find) {
shortTmo = 0;
}
fflush(stdout);
if (iret==0) laststat=0;
if (result==NULL) laststat=0;
return result;
OnError: return NULL;
}

View File

@ -61,19 +61,14 @@ typedef struct {
char typ;
} SensorT;
enum Sensors { A, B, C, D, A0, A1, A2, A3, A4, N_SENSORS };
enum Sensors { A, B, C, D, N_SENSORS };
static SensorT
sensA={"A"},
sensB={"B"},
sensC={"C"},
sensD={"D"},
sensA0={"A0", DATA_UNDEF},
sensA1={"A1", DATA_UNDEF},
sensA2={"A2", DATA_UNDEF},
sensA3={"A3", DATA_UNDEF},
sensA4={"A4", DATA_UNDEF},
*sensors[N_SENSORS]={&sensA, &sensB, &sensC, &sensD, &sensA0, &sensA1, &sensA2, &sensA3, &sensA4 },
*sensors[N_SENSORS]={&sensA, &sensB, &sensC, &sensD},
*ctlSens=NULL, /* control sensor */
*heliumSens=NULL,
*auxSens=NULL,
@ -145,6 +140,7 @@ static float
still=0,
linearPower=0, /* normally 0. Maximum power when loop=2 and the power linear to the output */
shiftUp, shiftLow, /* upper and lower limit of tShift correction */
maxpower2=1.0,
state,
mout;
@ -180,16 +176,15 @@ static int
tim0, /* msec Time */
per, /* effective period */
mmInt, mmTime, /* interval and time for next min-max logging */
nScan=0, /* number of scanned channels */
iScan=1, /* actual scan channel */
alarmListSize=0,
keepT=0, /* keep control over power-up */
swRangeOn=60, /* when not happen several times within less than 60 sec. delay,
switch heater range on when controller switched it off */
initMaxPower=0, /* set MaxPower for the first time */
unit=1, /* 1: Kelvin, 2: Celsius */
autoconfig=1,
autoconfig=0, /* automatic configuration 1: inside tecs, 0: done by SEA */
lockAlarm,
stickhtr=-1,
cntError;
static int tim, rdTim; /* actual time, read Time */
@ -444,12 +439,7 @@ int InstalCurve(SensorT *sensor, char *devArg) {
str_upcase(head, chead);
ERR_P(LscCmd(ser, "CRVHDR [num]:[head]"));
}
if (chan[1]>'1') { /* scanned inputs A2...A4 */
ERR_P(LscCmd(ser, "INCRV?[chan]>buf2;INSET?[chan]>buf3"));
str_copy(buf1, intype);
} else {
ERR_P(LscCmd(ser, "INTYPE?[chan]>buf1;INCRV?[chan]>buf2;INSET?[chan]>buf3"));
}
ERR_P(LscCmd(ser, "INTYPE?[chan]>buf1;INCRV?[chan]>buf2;INSET?[chan]>buf3"));
if (!LscEqPar(buf1, intype) || atoi(buf2)!=num || buf3[0]!='1') {
ERR_P(LscCmd(ser, "ANALOG 2:0,3;INSET [chan],1"));
if (chan[1]<='1') ERR_P(LscCmd(ser, "RANGE:0;INTYPE [chan]:[intype]"));
@ -628,10 +618,10 @@ again:
twoloops=0;
initMaxPower=1;
resist=10;
nScan=0;
unit=1;
empty=0;
full = -1;
stickhtr = -1;
} else {
InitSensor(&sensC);
if (strcasecmp(nam, "none") == 0) {
@ -646,10 +636,6 @@ again:
}
}
for (i=5;i<9;i++) {
InitSensor(sensors[i]);
}
dev[0]='\0';
str_copy(heUnits, "%");
@ -662,17 +648,6 @@ again:
j=2;
}
str_copy(plug->descr, dev);
if (sensA.type[0]>'0' && sensA.type[0]<='4') {
nScan=sensA.type[0]-'0';
for (i=5;i<5+nScan;i++) {
s=sensors[i];
s->present=-1;
s->band=10;
if (s->scale==0.0) s->scale=1.0;
s->typ='1'+i-5;
}
sensA.type[0]='\0';
}
if (tLimit==0.0) {
if (tMaxLimit==0.0) {
tLimit=310;
@ -707,14 +682,6 @@ again:
}
}
for (i=5;i<9;i++) {
s=sensors[i];
if (s->type[0] != '\0') {
s->present=-1;
}
s->typ=s->type[0];
}
if (!plug->devcmd) { /* set device name */
str_copy(plug->device, nam);
ConcatDevice();
@ -873,16 +840,9 @@ void LogMinMax(int new) {
sprintf(buf1, " Tk %.5g", tk);
str_append(buf, buf1);
}
} else if (nScan==0) {
} else {
return;
}
for (i=5; i<5+nScan; i++) {
s1=sensors[i];
if (s1->t!=DATA_UNDEF) {
sprintf(buf1, " T%c %.5g", s1->ch[1], s1->t);
str_append(buf, buf1);
}
}
if (power!=DATA_UNDEF) {
sprintf(buf1, " P %.4g", power);
str_append(buf, buf1);
@ -997,41 +957,13 @@ int ReadTemp(void) {
int i, doit, stat;
int tfill, dfill;
static time_t lastRead=0;
time_t now;
float hlev;
SensorT *s;
readTemp=0;
doit=0;
if (nScan>0) {
time(&now);
if (lastRead == 0) {
lastRead = now;
} else if (now/30 != lastRead/30) {
s=sensors[iScan+4];
str_copy(chan, s->ch);
/* find next sensor s2 */
for (i = iScan; i < iScan - 1 + nScan; i++) {
sens = sensors[i % nScan + 5];
if (sens->present >= 1) {
iScan = i % nScan + 1;
break;
}
}
ibuf = iScan-1;
if (unit == CELSIUS) {
ERR_P(LscCmd(ser, "CRDG?[chan]>fbuf;DOUT 3,[ibuf];XSCAN 1,[iScan];DISPFLD [sens.dispfld],[chan],[unit]"));
} else {
ERR_P(LscCmd(ser, "KRDG?[chan]>fbuf;DOUT 3,[ibuf];XSCAN 1,[iScan];DISPFLD [sens.dispfld],[chan],[unit]"));
}
lastRead = now;
s->t = fbuf;
s->readStat = 0;
}
} else {
lastRead = 0;
}
lastRead = 0;
for (i=0; i<4; i++) {
s=sensors[i];
s->stat1=0;
@ -1174,7 +1106,7 @@ int ReadTemp(void) {
if (samp.temp==DATA_UNDEF) {
samp.temp=cryo.temp;
}
} else if (nScan==0) {
} else {
tm=(rdTim % 3600) * 1.0e-4;
ts=(rdTim % 60) * 60.0e-4+0.5;
}
@ -1242,7 +1174,7 @@ int ReadHeater(int full) {
} else {
if (twoloops) {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay;RANGE?>ibuf;AOUT?2>fbuf"));
power2 = fbuf*fbuf*1e-5;
power2 = fbuf*fbuf*1e-4*maxpower2;
} else {
ERR_P(LscCmd(ser, "HTR?>htr;HTRST?>htrst;RELAYST?1>relay;RANGE?>ibuf"));
}
@ -1346,7 +1278,7 @@ int SetTemp(int switchOn) {
mout=0;
ERR_P(LscCmd(ser, "CSET [loop]:[chan],[unit],1,[keepT];MOUT [loop],0"));
if (twoloops) {
ERR_P(LscCmd(ser, "CSET 2:D,[unit],1,[keepT];MOUT [loop],0"));
ERR_P(LscCmd(ser, "CSET 2:C,[unit],1,[keepT];MOUT 2,0"));
}
if (loop==1) {
ERR_P(LscCmd(ser, "RANGE:0"));
@ -1386,17 +1318,17 @@ int SetTemp(int switchOn) {
}
}
ERR_P(LscCmd(ser, "SETP?[loop]>fbuf"));
if (fabsf(setH-fbuf) >= (fbuf+setH)*1.0e-5 || twoloops) {
if (fabsf(setH-fbuf) >= (fbuf+setH)*1.0e-5) {
ERR_P(LscCmd(ser, "SETP [loop]:[setH]"));
if (twoloops) {
ERR_P(LscCmd(ser, "SETP 2:[set2]"));
}
if (!doubleControl && !showSet) {
logfileOut(LOG_MAIN, "set %g (on %s) (was changed %g -> %g)\n", set, ctlSens->ch, fbuf, setH);
}
} else {
setH=fbuf;
}
if (twoloops) {
ERR_P(LscCmd(ser, "SETP 2:[set2]"));
}
tr=TrueScale(ctlSens, setH);
if (showSet) {
logfileOut(LOG_MAIN, "set %g (on %s)\n", set, ctlSens->ch);
@ -1675,7 +1607,7 @@ int ConfigAlarms(float genLimit) {
ERR_P(LscCmd(ser, "RELAY 1:1;BEEP:0"));
relay=0;
k=0;
for (i=0;i<5+nScan;i++) {
for (i=0;i<4;i++) {
s=sensors[i];
str_copy(buf1, s->ch);
if (s->customAlarm==0 && genLimit>0.0) s->alarm=genLimit;
@ -1738,7 +1670,7 @@ void AssignTypes(void) {
auxSens=NULL;
testSens=NULL;
test2Sens=NULL;
for (i=0; i<5+nScan; i++) {
for (i=0; i<4; i++) {
s=sensors[i];
if (s->present==1) {
typ=s->typ;
@ -1789,7 +1721,7 @@ int Settings(void) {
SensorT *s;
SensorT *fields[8];
char *cfg, *p;
int i,k,l,kk;
int i,k,l;
if (remoteMode!=2) {
remoteMode=2; /* set to remote mode */
@ -1799,7 +1731,7 @@ int Settings(void) {
} else {
ERR_P(LscCmd(ser, "PID [loop],[prop],[integ],[deriv]"));
}
for (i=0; i<5+nScan; i++) {
for (i=0; i<4; i++) {
s=sensors[i];
if (i<4) {
plug=plugs[i/2];
@ -1808,24 +1740,9 @@ int Settings(void) {
}
if (s->present < 0) {
if (settingsFlag) return 0;
/*
if (i==4) {
ERR_P(LscCmd(ser, "DOUT:2;XSCAN:2,,2"));
}
*/
ERR_I(InstalCurve(s, plug->device));
}
}
if (nScan>0) {
for (out1=nScan+1;out1<=4;out1++) {
ERR_P(LscCmd(ser, "INSET A[out1],0"));
}
ERR_P(LscCmd(ser, "INSET A5,0;INSET A6,0;INSET A7,0;INSET A8,0"));
ERR_P(LscCmd(ser, "INSET A9,0;INSET A10,0;INSET A11,0;INSET A12,0"));
ERR_P(LscCmd(ser, "INSET A13,0;INSET A14,0;INSET A15,0;INSET A16,0"));
} else {
ERR_P(LscCmd(ser, "XSCAN:0"));
}
AssignTypes();
@ -1861,16 +1778,6 @@ int Settings(void) {
DisplayFmt(testSens, fields, &k);
DisplayFmt(test2Sens, fields, &k);
DisplayFmt(auxSens, fields, &k);
if (nScan>0) {
i=0;
kk=k;
while (i<nScan && DisplayFmt(sensors[i+5], fields, &k)) {
if (k>4) k=kk;
i++;
}
/* k = kk + nScan + 1; */
if (k > 4) k = 5;
}
maxfld=k-1;
/* fields 5-8 standard raw data */
@ -1934,6 +1841,7 @@ int ConfigByCode(int plugNr) {
logfileOut(LOG_MAIN ,"reset inputs on plug%d\n", plugNr);
plug->sensor1->present=0;
plug->sensor2->present=0;
settingsFlag=1;
} else {
if (plugNr == 0) {
str_copy(devname0, "none");
@ -1965,6 +1873,7 @@ int ConfigByCode(int plugNr) {
str_append(buf, nam);
str_append(buf, "'");
ERR_I(PrepInput(buf));
settingsFlag=1;
} else {
logfileOut(LOG_MAIN+LOG_STAT ,"%s on plug%d (code %d)\n", nam, plugNr, plug->code);
if (plugNr == 0) {
@ -1975,7 +1884,6 @@ int ConfigByCode(int plugNr) {
}
}
}
settingsFlag=1;
return 0;
OnError: return -1;
}
@ -2251,13 +2159,13 @@ int PeriodicTask(void) {
/*
static float shiftTarget=0;
*/
if (nScan==0) {
if (stickhtr < 0) {
ERR_P(LscCmd(ser, "DIOST?>cod1,out1;DOUT 3,29;BUSY?>busy"));
} else {
cod1=0;
ERR_P(LscCmd(ser, "BUSY?>busy"));
ERR_P(LscCmd(ser, "DOUT 3,0;BUSY?>busy"));
}
if ((plug0.codDefined && plug1.codDefined) || nScan>0) {
if ((plug0.codDefined && plug1.codDefined)) {
per=period; /* no timeout on above command and codes are defined: normal period */
if (per>logPeriod*1000) per=logPeriod*1000;
}
@ -2412,7 +2320,7 @@ int PeriodicTask(void) {
if (rdTim>=logTime) {
ERR_I(DataPutAll(NULL, rdTim));
logTime=(rdTim / logPeriod + 1) * logPeriod;
if (rdTim>mmTime && (cryo.sensor1 != NULL || nScan>0)) LogMinMax(0);
if (rdTim>mmTime && (cryo.sensor1 != NULL)) LogMinMax(0);
}
if (set!=0 && remoteMode==2) {
t=ctlSens->t;
@ -2439,7 +2347,7 @@ int PeriodicTask(void) {
}
if (htr == 100.0 && mout > 0) {
mstep = 0.2;
while (htr == 0 && mout > 0) {
while (htr == 100.0 && mout > 0) {
mstep *= 2;
mout -= mstep;
ERR_P(LscCmd(ser, "MOUT [loop],[mout]"));
@ -2560,13 +2468,13 @@ int PeriodicTask(void) {
}
oldSet = set;
if (nScan==0) {
if (stickhtr < 0) {
ERR_P(LscCmd(ser, "KEYST?>key;DIOST?>cod2,out2;DOUT 3,30"));
} else {
ERR_P(LscCmd(ser, "KEYST?>key"));
}
if (busy==0) {
if (nScan==0) {
if (stickhtr < 0) {
if (out1!=30) {
ERR_P(LscCmd(ser, "DOUT:3,30"));
ERR_P(LscCmd(ser, "DIOST?>cod1,out1"));
@ -2575,34 +2483,14 @@ int PeriodicTask(void) {
ERR_P(LscCmd(ser, "DOUT:3,29"));
ERR_P(LscCmd(ser, "DIOST?>cod2,out2;DOUT 3,30"));
}
} else {
out1=0;
out2=0;
}
/* obsolete
* if ((plug0.code1 & 0x2a) == 0x20) {
* sensA0.t = DATA_UNDEF;
* sensA1.t = DATA_UNDEF;
* sensA2.t = DATA_UNDEF;
* sensA3.t = DATA_UNDEF;
* switch ((int)scanChan) {
* case 0: sensA0.t = te; break;
* case 1: sensA1.t = te; break;
* case 2: sensA2.t = te; break;
* case 3: sensA3.t = te; break;
* default: break;
* }
* }
*/
if (out1==30 && out2==29) {
/* code conversion */
plug0.code1=3*decod[cod2 % 8] ^ 2*decod[cod1 % 8]; /* ^ is exclusive OR */
/* obsolete, for external switch (MA09)
* if ((plug0.code1 & 0x2a) == 0x20) {
* scanChan = cod1 & 0x03;
* plug0.code1 = plug0.code1 & 0x30;
* } else {
* scanChan = DATA_UNDEF;
* }
*/
plug1.code1=-(3*decod[cod2 / 8] ^ 2*decod[cod1 / 8]);
for (i=0; i<2; i++) {
plug=plugs[i];
@ -3203,7 +3091,7 @@ int StatusHdl(int mode, void *base, int fd) {
}
ERR_I(ShowSensor(&buf, samp.sensor2, "T", "K", '<'));
}
if (testSens!=NULL || test2Sens!=NULL || nScan>0) {
if (testSens!=NULL || test2Sens!=NULL) {
ERR_I(StrPut(&buf, "\ntest", ':'));
}
if (testSens!=NULL) {
@ -3212,7 +3100,7 @@ int StatusHdl(int mode, void *base, int fd) {
if (test2Sens!=NULL) {
ERR_I(ShowSensor(&buf, test2Sens, "T", "K", 0));
}
for (i=5; i<5+nScan; i++) {
for (i=5; i<4; i++) {
ERR_I(ShowSensor(&buf, sensors[i], "T", "K", 0));
}
if (auxSens!=NULL) {
@ -3405,11 +3293,6 @@ int main(int argc, char *argv[]) {
CocDefStruct(sensB, SensorT);
CocDefStruct(sensC, SensorT);
CocDefStruct(sensD, SensorT);
CocDefStruct(sensA0, SensorT);
CocDefStruct(sensA1, SensorT);
CocDefStruct(sensA2, SensorT);
CocDefStruct(sensA3, SensorT);
CocDefStruct(sensA4, SensorT);
CocDefPtr(sens, SensorT);
CocFltFld(SensorT, t, RD);
@ -3468,6 +3351,7 @@ int main(int argc, char *argv[]) {
CocDefFlt(r2, RD);
CocDefFlt(tShift, RW);
CocDefFlt(linearPower, RW);
CocDefFlt(maxpower2, RW);
CocDefFlt(scanChan, RW);
CocDefFlt(shiftUp, RW);
@ -3535,8 +3419,7 @@ int main(int argc, char *argv[]) {
CocDefInt(busy, RD);
CocDefInt(serialNo, RD);
CocDefInt(quit, RW);
CocDefInt(nScan, RD);
CocDefInt(iScan, RW);
CocDefInt(stickhtr, RW);
CocDefInt(keepT, RW);
CocDefInt(swRangeOn, RW);
CocDefInt(doubleControl, RW);
@ -3555,11 +3438,6 @@ int main(int argc, char *argv[]) {
CocAlias(Tb,sensB.t);
CocAlias(Tc,sensC.t);
CocAlias(Td,sensD.t);
CocAlias(T0,sensA0.t);
CocAlias(T1,sensA1.t);
CocAlias(T2,sensA2.t);
CocAlias(T3,sensA3.t);
CocAlias(T4,sensA4.t);
CocAlias(P,power);
CocAlias(tempC, set);
CocAlias(int,integ);
@ -3590,7 +3468,7 @@ int main(int argc, char *argv[]) {
use_stdout=1;
opt=' ';
} else if ('a'==opt) {
autoconfig=0;
autoconfig=1;
opt=' ';
} else if ('n'==opt) {
i++;
@ -3683,11 +3561,6 @@ int main(int argc, char *argv[]) {
ERR_P(DataCreateSet(NULL, "Te", &te, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "Tk", &tk, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "He", &he, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "T0", &sensA0.t, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "T1", &sensA1.t, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "T2", &sensA2.t, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "T3", &sensA3.t, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "T4", &sensA4.t, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "Aux", &aux, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "P", &power, logPeriod, LOGLIFETIME, tim));
ERR_P(DataCreateSet(NULL, "power2", &power2, logPeriod, LOGLIFETIME, tim));