211 lines
4.2 KiB
C
211 lines
4.2 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "sys_util.h"
|
|
#include "err_handling.h"
|
|
#include "str_util.h"
|
|
#include "tecs_cli.h"
|
|
|
|
static char device[80], command[80];
|
|
static int readTemp, configuring;
|
|
static float tempX, tempP, tempC;
|
|
|
|
pTecsClient TeccInit(char *startcmd, int port) {
|
|
CocConn *conn;
|
|
|
|
NEW(conn);
|
|
ERR_I(CocInitClient(conn, "", port, "#rwacs", 0, startcmd));
|
|
CocDefFlt(tempC, CocRD);
|
|
CocDefFlt(tempP, CocRD);
|
|
CocDefFlt(tempX, CocRD);
|
|
CocDefStr(device, CocWR);
|
|
CocDefInt(configuring, CocRD);
|
|
CocDefInt(readTemp, CocWR);
|
|
CocDefCmd(command);
|
|
|
|
return((pTecsClient)conn);
|
|
OnError: return(NULL);
|
|
}
|
|
|
|
int TeccGet3(pTecsClient conn, float *tC, float *tX, float *tP) {
|
|
readTemp=1;
|
|
ERR_I(CocCmd(conn, "tempC,tempX,tempP,[readTemp],configuring"));
|
|
*tC=tempC;
|
|
*tX=tempX;
|
|
*tP=tempP;
|
|
return(configuring);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int TeccGet(pTecsClient conn, float *temp) {
|
|
readTemp=1;
|
|
ERR_I(CocCmd(conn, "tempP,[readTemp],configuring"));
|
|
*temp=tempP;
|
|
return(configuring);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int TeccWait(pTecsClient conn) {
|
|
int last, cnt;
|
|
last=0;
|
|
cnt=0;
|
|
do {
|
|
CocDelay(250);
|
|
ERR_I(CocCmd(conn, "configuring"));
|
|
if (configuring==last || configuring>1000) {
|
|
cnt++;
|
|
if (cnt>20) ERR_MSG("configuring timeout");
|
|
} else {
|
|
cnt=0;
|
|
last=configuring;
|
|
}
|
|
} while (configuring>0);
|
|
return(0);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int TeccSet(pTecsClient conn, float temp) {
|
|
tempC=temp;
|
|
ERR_I(CocCmd(conn, "[tempC]"));
|
|
return(0);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int TeccSend(pTecsClient conn, char *cmd, char *reply, int replyLen) {
|
|
char *res;
|
|
int cnt;
|
|
|
|
str_copy(command, cmd);
|
|
ERR_I(CocCmd(conn, "[$]"));
|
|
cnt=40;
|
|
CocDelay(100);
|
|
while (cnt>0) {
|
|
ERR_I(CocCmd(conn, "$"));
|
|
if (command[0]!='\0') {
|
|
str_ncpy(reply, command, replyLen);
|
|
return(0);
|
|
}
|
|
CocDelay(250);
|
|
cnt--;
|
|
}
|
|
str_ncpy(reply, "<no response>", replyLen);
|
|
return(0);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int TeccQuitServer(pTecsClient conn) {
|
|
int iret, cnt;
|
|
|
|
ERR_I(iret=CocCheck(conn));
|
|
if (iret==0) {
|
|
ERR_I(CocSet(conn, "quit", "1"));
|
|
cnt=50;
|
|
while (iret==0 && cnt>0) {
|
|
CocDelay(100);
|
|
ERR_I(iret=CocCheck(conn));
|
|
cnt--;
|
|
}
|
|
}
|
|
if (iret==1) return(0);
|
|
ERR_MSG("Does not quit within 5 seconds");
|
|
OnError:
|
|
return(-1);
|
|
}
|
|
|
|
void TeccClose(pTecsClient conn) {
|
|
if (conn!=NULL) {
|
|
CocCloseClient(conn);
|
|
my_free(conn);
|
|
}
|
|
}
|
|
|
|
/* fortran wrappers --------------------------------------------------
|
|
|
|
reduced functionality:
|
|
connection is static, so only one connection at a time may be opened
|
|
|
|
*/
|
|
|
|
#ifdef __VMS
|
|
#define tecs_get_par_ tecs_get_par
|
|
#define tecs_set_par_ tecs_set_par
|
|
#define tecs_send_ tecs_send
|
|
#define tecs_init_ tecs_init
|
|
#define tecs_get3_ tecs_get3
|
|
#define tecs_set_ tecs_set
|
|
#define tecs_wait_ tecs_wait
|
|
#define tecs_is_open_ tecs_is_open
|
|
#define tecs_close_ tecs_close
|
|
#define tecs_quit_server_ tecs_quit_server
|
|
#endif
|
|
|
|
static pTecsClient conn=NULL;
|
|
|
|
int tecs_set_par_(F_CHAR(name), F_CHAR(par), int name_len, int par_len) {
|
|
char nbuf[64], pbuf[256];
|
|
|
|
STR_TO_C(nbuf, name);
|
|
STR_TO_C(pbuf, par);
|
|
|
|
ERR_I(CocSet(conn, nbuf, pbuf));
|
|
|
|
return(0);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int tecs_get_par_(F_CHAR(name), F_CHAR(par), int name_len, int par_len) {
|
|
char nbuf[64], pbuf[256];
|
|
|
|
STR_TO_C(nbuf, name);
|
|
ERR_I(CocGet(conn, nbuf, pbuf));
|
|
return(STR_TO_F(par, pbuf));
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int tecs_send_(F_CHAR(cmd), F_CHAR(reply), int cmd_len, int reply_len) {
|
|
char cbuf[80], rbuf[80];
|
|
|
|
STR_TO_C(cbuf, cmd);
|
|
ERR_I(TeccSend(conn, cbuf, rbuf, sizeof(rbuf)));
|
|
return(STR_TO_F(reply, rbuf));
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int tecs_init_(F_CHAR(startcmd), int *port, int startcmd_len) {
|
|
char sbuf[132];
|
|
|
|
STR_TO_C(sbuf, startcmd);
|
|
ERR_P(conn=TeccInit(sbuf, *port));
|
|
return(0);
|
|
OnError: return(-1);
|
|
}
|
|
|
|
int tecs_get_(float *temp) {
|
|
return(TeccGet(conn, temp));
|
|
}
|
|
|
|
int tecs_get3_(float *t1, float *t2, float *t3) {
|
|
return(TeccGet3(conn, t1, t2, t3));
|
|
}
|
|
|
|
int tecs_set_(float *temp) {
|
|
return(TeccSet(conn, *temp));
|
|
}
|
|
|
|
int tecs_wait_(void) {
|
|
return(TeccWait(conn));
|
|
}
|
|
|
|
int tecs_is_open_() {
|
|
return(conn!=NULL);
|
|
}
|
|
|
|
void tecs_close_(void) {
|
|
TeccClose(conn);
|
|
conn=NULL;
|
|
}
|
|
|
|
int tecs_quit_server_(void) {
|
|
return(TeccQuitServer(conn));
|
|
}
|
|
|