/*--------------------------------------------------------------------------- oxinst.c Communication routines for Oxford Instruments equipment Markus Zolliker, March 2005 ---------------------------------------------------------------------------- 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 OxiHandler(void *object) { int iret, l; EaseBase *eab = EaseBaseCast(object); 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 (strcmp(eab->ans, "??ck") == 0) { if (eab->state == EASE_lost) { EaseWrite(eab, "V"); goto quit; } } else if (eab->state == EASE_lost) { goto quit; } else if (eab->cmd[0] == 'V') { 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 if (eab->cmd[2] == 'k') { /* ?ck */ } else if (eab->cmd[0] != eab->ans[0]) { iret = EASE_ILL_ANS; } } 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+20) { eab->state = EASE_lost; } } else if (eab->state == EASE_lost) { if (time(NULL) > eab->cmdtime) { EaseWrite(eab, "?ck"); eab->state = EASE_lost; } } goto quit; error: /* EaseWriteError(eab); */ quit: return EaseHandler(eab); } double OxiGet(EaseBase *eab, int dig, int *pdig) { char *endp, *p; double val; if (eab->state != EASE_read) { /* eab->errCode = EASE_ILL_ANS; */ return 0.0; } p = strchr(eab->ans, '.'); if (p) { if (pdig != NULL) { *pdig = strlen(eab->ans) - (p - eab->ans) - 1; } val=strtod(eab->ans+1, &endp); if (*endp != '\0') { eab->errCode = EASE_ILL_ANS; return 0.0; } } else { val=strtol(eab->ans+1, &endp, 10); if (*endp != '\0') { eab->errCode = EASE_ILL_ANS; return 0.0; } if (eab->syntax <= 0) { /* old style format */ for (; dig > 0; dig--) val=val*0.1; } } return val; } void OxiSet(EaseBase *eab, char *cmd, double val, int dig) { char buf[64]; int l; if (eab->syntax <= 0) { snprintf(buf, sizeof(buf), "%s%.*f", cmd, dig, val); } else { snprintf(buf, sizeof(buf), "%s%f", cmd, val); } EaseWrite(eab, buf); }