diff --git a/ease.c b/ease.c index 9b4fda6..bc5005d 100644 --- a/ease.c +++ b/ease.c @@ -67,6 +67,7 @@ void EaseWriteError(EaseBase *eab) { eab->p.name); break; case EASE_ILL_ANS: + if (eab->p.verbose < 1) break; l = strlen(eab->cmd); if (l > 0 && eab->cmd[l-1] < ' ') { l--; diff --git a/ighdriv.c b/ighdriv.c index 66a7195..b57418a 100644 --- a/ighdriv.c +++ b/ighdriv.c @@ -317,6 +317,7 @@ static long IghRead(long pc, void *object) { } EaseWrite(eab, "R0"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, SORBS_FLAG)) goto skip0; drv->sorbS = OxiGet(eab, 1, NULL, drv->sorbS); skip0: @@ -361,6 +362,7 @@ static long IghRead(long pc, void *object) { if (EaseGetUpdate(drv, MIXP_FLAG)) goto skip4; EaseWrite(eab, "R4"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, MIXP_FLAG)) goto skip4; drv->mixP = OxiGet(eab, 5 - drv->e, NULL, drv->mixP/10) * 10; skip4: @@ -369,6 +371,7 @@ static long IghRead(long pc, void *object) { if (EaseGetUpdate(drv, STILL_FLAG)) goto skip5; EaseWrite(eab, "R5"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, STILL_FLAG)) goto skip5; drv->stillP = OxiGet(eab, 1, NULL, drv->stillP); skip5: @@ -377,6 +380,7 @@ static long IghRead(long pc, void *object) { if (EaseGetUpdate(drv, SORBP_FLAG)) goto skip6; EaseWrite(eab, "R6"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, SORBP_FLAG)) goto skip6; drv->sorbP = OxiGet(eab, 3, NULL, drv->sorbP); skip6: @@ -385,6 +389,7 @@ static long IghRead(long pc, void *object) { if (EaseGetUpdate(drv, MOT_FLAGS+V6)) goto skip7; EaseWrite(eab, "R7"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, MOT_FLAGS+V6)) goto skip7; drv->mv[V6] = OxiGet(eab, 1, NULL, drv->mv[V6]); time(&now); delta = (now - drv->v6time) / 2.64; /* speed: 1/2.64 %/sec */ @@ -403,6 +408,7 @@ static long IghRead(long pc, void *object) { if (EaseGetUpdate(drv, MOT_FLAGS+V12A)) goto skip8; EaseWrite(eab, "R8"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, MOT_FLAGS+V12A)) goto skip8; drv->mv[V12A] = OxiGet(eab, 1, NULL, drv->mv[V12A]); skip8: @@ -411,6 +417,7 @@ static long IghRead(long pc, void *object) { if (EaseGetUpdate(drv, MOT_FLAGS+V1K)) goto skip9; EaseWrite(eab, "R9"); return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, MOT_FLAGS+V1K)) goto skip9; drv->mv[V1K] = OxiGet(eab, 1, NULL, drv->mv[V1K]); skip9: diff --git a/linadriv.c b/linadriv.c new file mode 100644 index 0000000..6ac651a --- /dev/null +++ b/linadriv.c @@ -0,0 +1,140 @@ +/*--------------------------------------------------------------------------- +linadriv.c + +Driver for the Lock IN Amplifier SIGNAL RECOVERY Model 7265 + +Markus Zolliker, Oct 2006 +----------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "linahdl.h" +#include "fsm.h" +#include "initializer.h" + +typedef struct { + EaseDriv d; + float x, y; +} Lina; + +static ParClass linaClass = { "LINA", sizeof(Lina) }; + +/*----------------------------------------------------------------------------*/ +static void LinaParDef(void *object) { + Lina *drv = ParCast(&linaClass, object); + EaseBase *eab = object; + + ParName(""); ParTail("units"); + ParFloat(&drv->x, PAR_NAN); + + ParName("x"); ParTail(""); + ParFloat(&drv->x, PAR_NAN); + + ParName("y"); ParTail(""); + ParFloat(&drv->y, PAR_NAN); + + EaseBasePar(drv); + EaseSendPar(drv); +/* + EaseDrivPar(drv, "%.5g", "K"); +*/ + ParStdDef(); + EaseMsgPar(drv); +} +/*----------------------------------------------------------------------------*/ +static long LinaRead(long pc, void *object) { + Lina *drv = ParCast(&linaClass, object); + EaseBase *eab = object; + char *p; + + switch (pc) { default: /* FSM BEGIN *******************************/ + EaseWrite(eab, "XY."); + return __LINE__; case __LINE__: /**********************************/ + p = strchr(eab->ans, ','); + if (p) { + *p='\0'; + p++; + drv->x = atof(eab->ans); + drv->y = atof(p); + } + ParLog(drv); + fsm_quit: return 0; } /* FSM END *********************************/ +} +/*----------------------------------------------------------------------------*/ +static long LinaStart(long pc, void *object) { + Lina *drv = ParCast(&linaClass, object); + EaseBase *eab = object; + + switch (pc) { default: /* FSM BEGIN *******************************/ + EaseWrite(eab, "ID"); + return __LINE__; case __LINE__: /**********************************/ + if (0 != strncmp(eab->version, "7265", 4)) { + snprintf(eab->msg, sizeof eab->msg, "unknown lock in amplifier version: %s", + eab->version); + ParPrintf(drv, eError, "ERROR: %s", eab->msg); + EaseStop(eab); + goto quit; + } + ParPrintf(drv, eStatus, "connected to %s", eab->version); + FsmCall(LinaRead); + return __LINE__; case __LINE__: /**********************************/ + + quit: + return 0; } /* FSM END ********************************************/ +} +/*----------------------------------------------------------------------------*/ +static long LinaSet(long pc, void *object) { + Lina *drv = ParCast(&linaClass, object); + EaseBase *eab = object; + char cmd[32]; + int upd; + + switch (pc) { default: /* FSM BEGIN *******************************/ + /* + snprintf(cmd, sizeof cmd, "SETP %.5g;SETP?", drv->d.targetValue); + EaseWrite(eab, cmd); + */ + quit: + return 0; } /* FSM END ********************************************/ +} +/*----------------------------------------------------------------------------*/ +static int LinaInit(SConnection *con, int argc, char *argv[], int dynamic) { + /* args: + MakeObject objectname lina + MakeObject objectname lina + */ + Lina *drv; + + drv = EaseMakeDriv(con, &linaClass, argc, argv, dynamic, 7, + LinaParDef, LinaHandler, LinaStart, NULL, LinaRead, + LinaSet); + if (drv == NULL) return 0; +/* + setRS232ReplyTerminator(drv->d.b.ser,"\n"); + setRS232SendTerminator(drv->d.b.ser,"\n"); +*/ + return 1; +} +/*----------------------------------------------------------------------------*/ +void LinaStartup(void) { + ParMakeClass(&linaClass, EaseDrivClass()); + MakeDriver("LINA", LinaInit, 0, "Lock in amplifier SIGNAL RECOVERY Model 7265"); +} diff --git a/linahdl.c b/linahdl.c new file mode 100644 index 0000000..290289f --- /dev/null +++ b/linahdl.c @@ -0,0 +1,81 @@ +/*--------------------------------------------------------------------------- +linahdl.c + +lina (signal recovery lock in amplifier model 7265) handler + +Markus Zolliker, Oct 2006 +---------------------------------------------------------------------------- + +there is no error return value, eab->errCode is used. On success, eab->errCode +is not changed, i.e. an existing errCode is not overwritten. +*/ + +#include +#include +#include +#include +#include +#include "sics.h" +#include "oxinst.h" + +/*----------------------------------------------------------------------------*/ +int LinaHandler(void *object) { + int iret, l; + EaseBase *eab = EaseBaseCast(object); + char *corr; + + if (eab->state < EASE_idle) goto quit; + if (availableNetRS232(eab->ser) || availableRS232(eab->ser)) { + eab->msg[0] = '\0'; + l = sizeof(eab->ans); + iret = readRS232TillTerm(eab->ser, eab->ans, &l); + if (eab->state != EASE_expect && eab->state != EASE_lost) { + if (iret == 1) { + ParPrintf(eab, eError, "unexpected answer: %s", eab->ans); + } + goto quit; + } + if (iret == 1) { + ParPrintf(eab, -2, "ans: %s", eab->ans); + if (eab->state == EASE_lost) { + goto quit; + } else if (strncmp(eab->cmd,"ID",2) == 0) { + if (strcmp(eab->ans, eab->version) == 0) { + /* we are still connected with the same device */ + } else if (*eab->version == '\0') { + strncat(eab->version, eab->ans, sizeof(eab->version)-1); + } else { /* version (and therefore device) changed */ + eab->errCode = EASE_DEV_CHANGED; + eab->state = EASE_idle; + goto error; + } + eab->state = EASE_idle; + goto quit; + } else { + eab->tmo = 120; + } + } + if (iret != 1) { + eab->errCode = iret; + eab->state = EASE_idle; + goto error; + } + eab->state = EASE_read; + } else if (eab->state == EASE_expect) { + if (time(NULL) > eab->cmdtime + eab->tmo) { + eab->state = EASE_lost; + } + } else if (eab->state == EASE_lost) { +/* + if (time(NULL) > eab->cmdtime) { + EaseWrite(eab, "RS"); + eab->state = EASE_lost; + } +*/ + } + goto quit; +error: + /* EaseWriteError(eab); */ +quit: + return EaseHandler(eab); +} diff --git a/linahdl.h b/linahdl.h new file mode 100644 index 0000000..1cc9e64 --- /dev/null +++ b/linahdl.h @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------- +linahdl.h + +lina (signal recovery lock in amplifier model 7265) handler + +Markus Zolliker, Oct 2006 +----------------------------------------------------------------------------*/ + +#ifndef LINAHDL_H +#define LINAHDL_H + +#include "ease.h" + +int LinaHandler(void *eab); + +#endif diff --git a/lsc370driv.c b/lsc370driv.c index 5ecb9f5..74f939e 100644 --- a/lsc370driv.c +++ b/lsc370driv.c @@ -46,6 +46,9 @@ static void Lsc370ParDef(void *object) { ParName(""); ParTail("K"); ParFloat(&drv->t, PAR_NAN); + ParName("htr"); ParTail("%"); + ParFloat(&drv->htr, PAR_NAN); + EaseBasePar(drv); EaseSendPar(drv); EaseDrivPar(drv, "%.5g", "K"); @@ -64,7 +67,13 @@ static long Lsc370Read(long pc, void *object) { EaseWrite(eab, "HTR?"); return __LINE__; case __LINE__: /**********************************/ drv->htr = atof(eab->ans); - + if (EaseGetUpdate(drv, EASE_RUN)) goto skipGetSet; + EaseWrite(eab, "SET?"); + return __LINE__; case __LINE__: /**********************************/ + if (EaseGetUpdate(drv, EASE_RUN)) goto skipGetSet; + drv->d.targetValue = atof(eab->ans); + + skipGetSet: ParLog(drv); fsm_quit: return 0; } /* FSM END *********************************/ } @@ -100,12 +109,12 @@ static long Lsc370Set(long pc, void *object) { switch (pc) { default: /* FSM BEGIN *******************************/ upd = EaseNextUpdate(drv); if (upd != EASE_RUN) goto quit; - EaseWrite(eab, "MODE 1:MODE?"); /* remote mode */ + EaseWrite(eab, "MODE 1;MODE?"); /* remote mode */ return __LINE__; case __LINE__: /**********************************/ - snprintf(cmd, sizeof cmd, "SETP %.5g:SETP?", drv->d.targetValue); + snprintf(cmd, sizeof cmd, "SETP %.5g;SETP?", drv->d.targetValue); EaseWrite(eab, cmd); return __LINE__; case __LINE__: /**********************************/ - EaseWrite(eab, "MODE 0:MODE?"); /* local mode */ + EaseWrite(eab, "MODE 0;MODE?"); /* local mode */ quit: return 0; } /* FSM END ********************************************/ } diff --git a/make_gen b/make_gen index 76a38bf..e8c7445 100644 --- a/make_gen +++ b/make_gen @@ -22,7 +22,7 @@ OBJ=psi.o buffer.o ruli.o dmc.o nxsans.o nextrics.o sps.o pimotor.o \ MZOBJ=fsm.o logger.o sugar.o pardef.o ease.o strobj.o oxinst.o logreader.o \ ipsdriv.o ilmdriv.o itcdriv.o ighdriv.o euro2kdriv.o modbus.o arrobj.o \ - lscsupport.o lsc370driv.o + lscsupport.o lsc370driv.o linadriv.o linahdl.o libpsi.a: $(OBJ) rm -f libpsi.a diff --git a/psi.c b/psi.c index d3ef58d..a6063fc 100644 --- a/psi.c +++ b/psi.c @@ -84,6 +84,7 @@ void SiteInit(void) { INIT(LogReaderInit); INIT(ArrayObjStartup); INIT(Lsc370Startup); + INIT(LinaStartup); }