#include #include #include #include "myc_mem.h" #include "myc_err.h" #include "myc_str.h" #include "myc_time.h" #include "sys_util.h" #include "coc_util.h" #include "tecs_cli.h" #include "tecs_data.h" static char response[COC_RES_LEN]; static char *rwCode="rwacs"; static char *rdCode="rdacs"; pTecsClient TeccInit(char *startcmd, int port) { CocConn *conn; NEW(conn, CocConn); if (startcmd[0]=='#') { ERR_I(CocInitClient(conn, startcmd+1, port, rdCode, 0, "")); } else { ERR_I(CocInitClient(conn, "", port, rwCode, 0, startcmd)); } return((pTecsClient)conn); OnError: return(NULL); } int TeccGet3(pTecsClient conn, float *tC, float *tX, float *tP) { int iret; CocReset(conn); ERR_I(CocGetFloat(conn, "set", tC)); ERR_I(CocGetFloat(conn, "tempX", tX)); ERR_I(CocGetFloat(conn, "tempP", tP)); ERR_I(CocPutInt(conn, "readTemp", 1)); ERR_I(iret=CocDoIt(conn, response, sizeof(response))); if (iret) ERR_MSG(response); return(0); OnError: return(-1); } int TeccGet(pTecsClient conn, float *temp) { int iret; CocReset(conn); ERR_I(CocGetFloat(conn, "tempP", temp)); ERR_I(CocPutInt(conn, "readTemp", 1)); ERR_I(iret=CocDoIt(conn, response, sizeof(response))); if (iret) ERR_MSG(response); return(0); OnError: return(-1); } int TeccSet(pTecsClient conn, float temp) { int iret; CocReset(conn); ERR_I(CocPutFloat(conn, "set", temp)); ERR_I(iret=CocDoIt(conn, response, sizeof(response))); if (iret) ERR_MSG(response); return(0); OnError: return(-1); } int TeccQuitServer(pTecsClient conn, int kill) { int iret, cnt; ERR_I(iret=CocCheck(conn)); if (iret>0) return iret; CocReset(conn); ERR_I(CocPutInt(conn, "quit", 1+kill)); ERR_I(iret=CocDoIt(conn, response, sizeof(response))); if (iret) ERR_MSG(response); cnt=50; while (iret==0 && cnt>0) { CocDelay(100); ERR_I(iret=CocCheck(conn)); cnt--; } if (iret==0) ERR_MSG("Does not quit within 5 seconds"); return 0; OnError: return(-1); } int TeccSend(pTecsClient conn, char *cmd, char *reply, int replyLen) { return(CocSetGetN(conn, "send", cmd, reply, replyLen)); } void TeccClose(pTecsClient conn) { if (conn!=NULL) { CocCloseClient(conn); FREE(conn); } } /* fortran wrappers -------------------------------------------------- reduced functionality: connection is static, so only one connection at a time may be opened */ #ifdef F_CHAR /* compile only when fortran c interface stuff is defined */ #ifdef __VMS #define tecs_get_par_ tecs_get_par #define tecs_get_mult_ tecs_get_mult #define tecs_set_par_ tecs_set_par #define tecs_init_ tecs_init #define tecs_get3_ tecs_get3 #define tecs_get_ tecs_get #define tecs_set_ tecs_set #define tecs_is_open_ tecs_is_open #define tecs_close_ tecs_close #define tecs_quit_server_ tecs_quit_server #define tecs_watch_log_ tecs_watch_log #define tecs_get_data_ tecs_get_data #define tecs_date_ tecs_date #define tecs_time_ tecs_time #define tecs_rights_ tecs_rights #endif static pTecsClient conn=NULL; int tecs_set_par_(F_CHAR(name), F_CHAR(par), int *show, int name_len, int par_len) { char nbuf[64], pbuf[COC_CMD_LEN]; int iret=-1; STR_TO_C(nbuf, name); STR_TO_C(pbuf, par); CocReset(conn); ERR_I(CocPutStr(conn, nbuf, pbuf)); ERR_I(CocDoIt(conn, response, sizeof(response))); if (*show) { printf("%s", response); } return(0); OnError: return(-1); } int tecs_get_par_(F_CHAR(name), F_CHAR(par), int *show, int name_len, int par_len) { char *b, nbuf[64], pbuf[COC_RES_LEN]; int iret=-1; STR_TO_C(nbuf, name); CocReset(conn); ERR_I(CocGetStr(conn, nbuf, pbuf, sizeof(pbuf))); ERR_I(CocDoIt(conn, response, sizeof(response))); if (*show==2) { b=response; } else { b=strchr(response,'='); if (b==NULL) { b=response; } else { b++; } } if (*show) { printf("%s", b); } return(STR_TO_F(par, pbuf)); OnError: return(-1); } int tecs_get_mult_(F_CHAR(names), int *time, int *nvalues, float values[], int names_len) { char *b, nbuf[64], pbuf[COC_RES_LEN]; char *nams, nam[32]; int i; STR_TO_C(nbuf, names); CocReset(conn); ERR_I(CocGetInt(conn, "rdTim", time)); i=0; nams=nbuf; while (nams!=NULL && i < *nvalues) { nams=str_split(nam, nams, ' '); if (nam[0]!='\0') { ERR_I(CocGetFloat(conn, nam, values+i)); i++; } } ERR_I(CocDoIt(conn, response, sizeof(response))); return(0); 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_rights_(int write) { if (write) { ERR_I(CocSendMagic(conn, rwCode)); } else { ERR_I(CocSendMagic(conn, rdCode)); } return(0); OnError: return(-1); } int tecs_get_(float *temp) { ERR_I(TeccGet(conn, temp)); return(0); OnError: return(-1); } int tecs_get3_(float *t1, float *t2, float *t3) { ERR_I(TeccGet3(conn, t1, t2, t3)); return(0); OnError: return(-1); } int tecs_set_(float *temp) { ERR_I(TeccSet(conn, *temp)); return(0); OnError: return(-1); } int tecs_is_open_() { return(conn!=NULL); } void tecs_close_(void) { TeccClose(conn); conn=NULL; } int tecs_quit_server_(int *kill) { int iret; ERR_I(iret=TeccQuitServer(conn, *kill)); return(iret); OnError: return(-1); } int tecs_watch_log_(F_CHAR(list), int list_len) { char buf[16]; STR_TO_C(buf, list); ERR_I(CocWatchLog(conn, buf)); return(0); OnError: return(-1); } int tecs_get_data_(F_CHAR(names), int *startTime, int *endTime, int *step, int *tbase , float xdata[], float ydata[], int *maxLen, int *width , int retLen[], int names_len) { char nam[64]; char str[128]; float offset, fact, *py, data[8192]; int i, j, k, l, iret; if (*endTime - *startTime > *step * (*maxLen-1)) { printf("maxLen too small\n"); } STR_TO_C(nam, names); if (*step <= 0) { *step = 60; } sprintf(str, "%d %d %d %s", *startTime, *endTime, *step, nam); CocReset(conn); ERR_I(CocPutStr(conn, "grapar", str)); ERR_I(CocGetArray(conn, "gradata", data, sizeof(data)/sizeof(float))); ERR_I(iret=CocDoIt(conn, response, sizeof(response))); if (iret) ERR_MSG(response); py=data; for (i=0; i < *width; i++) { l=*py; py++; if (l>0) { fact = (float)(*endTime - *startTime) / l; } offset = *startTime - *tbase; k = i * *maxLen; for (j=0; j 0) tim.tm_mon=m-1; t=mktime(&tim); if (t > now) { tim.tm_year--; t=mktime(&tim); } return t; } */ #endif