/*--------------------------------------------------------------------------- lsc370driv.c Driver for the LakeShore Model 370 AC Resistance Bridge Markus Zolliker, July 2006 ----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "lscsupport.h" #include "fsm.h" #include "initializer.h" typedef struct { EaseDriv d; float t; float htr; } Lsc370; static ParClass lsc370Class = { "LSC370", sizeof(Lsc370) }; /*----------------------------------------------------------------------------*/ static void Lsc370ParDef(void *object) { Lsc370 *drv = ParCast(&lsc370Class, object); EaseBase *eab = object; ParName(""); ParTail("K"); ParFloat(&drv->t, PAR_NAN); EaseBasePar(drv); EaseSendPar(drv); EaseDrivPar(drv, "%.5g", "K"); ParStdDef(); EaseMsgPar(drv); } /*----------------------------------------------------------------------------*/ static long Lsc370Read(long pc, void *object) { Lsc370 *drv = ParCast(&lsc370Class, object); EaseBase *eab = object; switch (pc) { default: /* FSM BEGIN *******************************/ EaseWrite(eab, "RDGK?1"); return __LINE__; case __LINE__: /**********************************/ drv->t = atof(eab->ans); EaseWrite(eab, "HTR?"); return __LINE__; case __LINE__: /**********************************/ drv->htr = atof(eab->ans); ParLog(drv); fsm_quit: return 0; } /* FSM END *********************************/ } /*----------------------------------------------------------------------------*/ static long Lsc370Start(long pc, void *object) { Lsc370 *drv = ParCast(&lsc370Class, object); EaseBase *eab = object; switch (pc) { default: /* FSM BEGIN *******************************/ EaseWrite(eab, "*IDN?"); return __LINE__; case __LINE__: /**********************************/ if (0 != strncmp(eab->version, "LSCI,MODEL370", 13)) { snprintf(eab->msg, sizeof eab->msg, "unknown temperature controller version: %s", eab->version); ParPrintf(drv, eError, "ERROR: %s", eab->msg); EaseStop(eab); goto quit; } ParPrintf(drv, eStatus, "connected to %s", eab->version); FsmCall(Lsc370Read); return __LINE__; case __LINE__: /**********************************/ quit: return 0; } /* FSM END ********************************************/ } /*----------------------------------------------------------------------------*/ static long Lsc370Set(long pc, void *object) { Lsc370 *drv = ParCast(&lsc370Class, object); EaseBase *eab = object; char cmd[32]; int upd; switch (pc) { default: /* FSM BEGIN *******************************/ upd = EaseNextUpdate(drv); if (upd != EASE_RUN) goto quit; EaseWrite(eab, "MODE 1:MODE?"); /* remote mode */ return __LINE__; case __LINE__: /**********************************/ snprintf(cmd, sizeof cmd, "SETP %.5g:SETP?", drv->d.targetValue); EaseWrite(eab, cmd); return __LINE__; case __LINE__: /**********************************/ EaseWrite(eab, "MODE 0:MODE?"); /* local mode */ quit: return 0; } /* FSM END ********************************************/ } /*----------------------------------------------------------------------------*/ static int Lsc370Init(SConnection *con, int argc, char *argv[], int dynamic) { /* args: MakeObject objectname lsc370 MakeObject objectname lsc370 */ Lsc370 *drv; drv = EaseMakeDriv(con, &lsc370Class, argc, argv, dynamic, 7, Lsc370ParDef, LscHandler, Lsc370Start, NULL, Lsc370Read, Lsc370Set); if (drv == NULL) return 0; setRS232ReplyTerminator(drv->d.b.ser,"\n"); setRS232SendTerminator(drv->d.b.ser,"\n"); return 1; } /*----------------------------------------------------------------------------*/ void Lsc370Startup(void) { ParMakeClass(&lsc370Class, EaseDrivClass()); MakeDriver("LSC370", Lsc370Init, 0, "LakeShore 370 AC Resistance Bridge"); }