*** empty log message ***

This commit is contained in:
cvs
2002-06-10 12:45:24 +00:00
parent 0daef05b2e
commit 267d16908a
20 changed files with 863 additions and 538 deletions

View File

@ -12,7 +12,7 @@ TECLI_LIB_alpha_osf1=-L/data/lnslib/lib -lpgplot -lX11 -lXm -so_archive
SYS_FILE_alpha_osf1=sys_aunix
#CFLAGS_alpha_osf1= -std1 -g -warnprotos -I../ -I. -I../hardsup -DFORTIFY
#---------- for Redhat linux (change redhat_linux to the corresponding $OSTYPE)
#---------- for Redhat linux (change i386_linux to the corresponding $OSTYPE)
CC_i386_linux= gcc
CFLAGS_i386_linux= -I/usr/local/include -I. -I../ -I../hardsup -DLINUX -g
TECS_PLOT_i386_linux=f77 -c -u -g tecs_plot.for
@ -61,8 +61,8 @@ bin/TecsClient: $(TECLI_OBJ)
f77 -o bin/TecsClient -g $(TECLI_OBJ) \
$(TECLI_LIB) -lreadline -ltermcap
six: six.c term.c sys_select.c $(LIBR_OBJ)
$(CC) $(CFLAGS) -o six six.c term.c sys_select.c $(LIBR_OBJ)
six: six.c term.c sys_select.c libtecsl.a
$(CC) $(CFLAGS) -o six six.c term.c sys_select.c -L. -ltecsl
rstart: rstart.c myc_str.o myc_err.o instr_hosts.o
$(CC) $(CFLAGS) -o rstart rstart.c myc_str.o myc_err.o instr_hosts.o

View File

@ -19,6 +19,11 @@
#define COC_NETTMO 5
#define COC_RESTMO 60
#define ARG_CHAR 1
#define ARG_INT 2
#define ARG_FLT 3
#define ARG_ARR 4
/*-------------------------------------------------------------------------*/
int CocConnect(CocConn *conn) {
@ -185,7 +190,7 @@ void CocReset(CocConn *conn) {
/*-------------------------------------------------------------------------*/
int CocPushArg(CocConn *conn, const char *name, void *value, int type) {
int CocPushArg(CocConn *conn, const char *name, void *value, int type, int size) {
StrBuf *buf;
int n;
@ -196,6 +201,7 @@ int CocPushArg(CocConn *conn, const char *name, void *value, int type) {
if (n>=sizeof(conn->args)) ERR_MSG("too many return arguments");
conn->args[n].adr=value;
conn->args[n].type=type;
conn->args[n].size=size;
conn->args[n].cmd=buf->buf + buf->wrpos;
conn->nargs=n+1;
if (value==NULL) {
@ -212,7 +218,7 @@ int CocPushArg(CocConn *conn, const char *name, void *value, int type) {
int CocPutStr(CocConn *conn, const char *name, const char *value) {
StrBuf *buf;
ERR_I(CocPushArg(conn, name, NULL, 4));
ERR_I(CocPushArg(conn, name, NULL, ARG_CHAR, 0));
ERR_I(StrPut(&conn->cmdbuf, value, COC_SEP));
return(0);
OnError: return(-1);
@ -222,7 +228,7 @@ int CocPutStr(CocConn *conn, const char *name, const char *value) {
int CocPutFloat(CocConn *conn, const char *name, float value) {
ERR_I(CocPushArg(conn, name, NULL, COC_FLT));
ERR_I(CocPushArg(conn, name, NULL, ARG_FLT, 0));
ERR_I(StrPutFloat(&conn->cmdbuf, value, COC_SEP));
return(0);
OnError: return(-1);
@ -230,9 +236,19 @@ int CocPutFloat(CocConn *conn, const char *name, float value) {
/*-------------------------------------------------------------------------*/
int CocPutArray(CocConn *conn, const char *name, float *value, int value_size) {
ERR_I(CocPushArg(conn, name, NULL, ARG_ARR, 0));
ERR_I(StrPutArray(&conn->cmdbuf, value, value_size));
return(0);
OnError: return(-1);
}
/*-------------------------------------------------------------------------*/
int CocPutInt(CocConn *conn, const char *name, int value) {
ERR_I(CocPushArg(conn, name, NULL, COC_INT));
ERR_I(CocPushArg(conn, name, NULL, ARG_INT, 0));
ERR_I(StrPutInt(&conn->cmdbuf, value, COC_SEP));
return(0);
OnError: return(-1);
@ -242,21 +258,28 @@ int CocPutInt(CocConn *conn, const char *name, int value) {
int CocGetStr(CocConn *conn, const char *name, char *value, int value_len) {
return(CocPushArg(conn, name, value, value_len));
return(CocPushArg(conn, name, value, ARG_CHAR, value_len));
}
/*-------------------------------------------------------------------------*/
int CocGetFloat(CocConn *conn, const char *name, float *value) {
return(CocPushArg(conn, name, value, COC_FLT));
return(CocPushArg(conn, name, value, ARG_FLT, 0));
}
/*-------------------------------------------------------------------------*/
int CocGetInt(CocConn *conn, const char *name, int *value) {
return(CocPushArg(conn, name, value, COC_INT));
return(CocPushArg(conn, name, value, ARG_INT, 0));
}
/*-------------------------------------------------------------------------*/
int CocGetArray(CocConn *conn, const char *name, float *value, int value_size) {
return(CocPushArg(conn, name, value, ARG_ARR, value_size));
}
/*-------------------------------------------------------------------------*/
@ -310,16 +333,19 @@ int CocDoIt(CocConn *conn, char *res, int res_len) {
} else {
str_ncat(res, a->cmd, res_len);
str_ncat(res, "=", res_len);
if (a->type==COC_INT) {
if (a->type==ARG_INT) {
ERR_I(StrGetInt(buf, (int *)a->adr, COC_SEP));
} else if (a->type==COC_FLT) {
} else if (a->type==ARG_FLT) {
ERR_I(StrGetFloat(buf, (float *)a->adr, COC_SEP));
} else if (a->type>1) {
ERR_P(StrNGet(buf, (char *)a->adr, a->type, COC_SEP));
} else if (a->type==ARG_ARR) {
ERR_I(StrGetArray(buf, (float *)a->adr, a->size));
resp="<array>";
} else if (a->type==ARG_CHAR) {
ERR_P(StrNGet(buf, (char *)a->adr, a->size, COC_SEP));
} else {
ERR_MSG("unknown type");
}
a->type=0;
a->type=0; /* done */
}
}
str_ncat(res, resp, res_len);

View File

@ -6,13 +6,14 @@
typedef struct {
void *adr;
int type;
int type, size;
char *cmd;
} CocArg;
typedef struct {
int fd;
/* private */
int fd, port;
int port;
StrBuf cmdbuf; /* for sending command */
StrBuf resbuf; /* for response */
char cmdbuf_[COC_CMD_LEN];
@ -37,9 +38,11 @@ void CocReset(CocConn *conn);
int CocPutStr(CocConn *conn, const char *name, const char *value);
int CocPutFloat(CocConn *conn, const char *name, float value);
int CocPutInt(CocConn *conn, const char *name, int value);
int CocPutArray(CocConn *conn, const char *name, float *value, int value_size);
int CocGetStr(CocConn *conn, const char *name, char *value, int value_len);
int CocGetFloat(CocConn *conn, const char *name, float *value);
int CocGetInt(CocConn *conn, const char *name, int *value);
int CocGetArray(CocConn *conn, const char *name, float *value, int value_size);
int CocDoIt(CocConn *conn, char *error, int error_len);
int CocCheck(CocConn *conn);

View File

@ -9,7 +9,8 @@
#include "myc_str.h"
static FILE *fil=NULL;
static char lnam[224]="", filnam[256]="";
static char lnam[224]="";
static char filnam[256]="";
static char ebuf[20000]="";
static char *statusBuf=NULL;
static int statusSize;
@ -93,9 +94,35 @@ char *logfileInit(char *path, int nodate, int use_stdout, int write_all) {
return(filnam);
}
void logfileStamp(char *text) {
int time, date, stamp;
time = mycNow();
date = mycDate(time); /* date in yyyymmdd decimal encoding */
time = time % (24*3600); /* seconds since midnight */
stamp=time / 60;
if (date != openDate ) { /* day has changed -> new logfile */
if (fil!=NULL) { fclose(fil); fil=NULL; }
lastpos=0;
lastline=1;
logfileOpen(1);
}
if (text==NULL) {
if (stamp>lastStamp+1) {
fprintf(fil, "---\t%02d:%02d:%02d\n", stamp / 60, stamp % 60, time % 60, text);
}
} else {
fprintf(fil, "\t%02d:%02d:%02d %s", stamp / 60, stamp % 60, time % 60, text);
}
dirty=0;
lastStamp=stamp;
}
void logfileOut(int mask, const char *fmt, ...)
{ va_list ap;
char buf[8192], *p;
int l;
va_start(ap, fmt);
@ -125,7 +152,7 @@ void logfileOut(int mask, const char *fmt, ...)
if (writeAll) {
vfprintf(fil, fmt, ap);
wrtMask=LOG_ALL;
} else {
} else if ((mask | LOG_NET) != LOG_NET) { /* do not store LOG_NET info */
if (eptr!=NULL) {
if (eptr-ebuf > sizeof(ebuf)-512) {
sprintf(eptr, "... buffer full ... \1\1");
@ -134,7 +161,12 @@ void logfileOut(int mask, const char *fmt, ...)
vsprintf(eptr, fmt, ap);
p=strchr(eptr, '\1');
if (p==NULL) {
eptr+=strlen(eptr);
l=strlen(eptr);
if (l>256) {
sprintf(buf, "unusual long output %.32s... (%d chars)\n", eptr, l);
logfileStamp(buf);
}
eptr+=l;
} else {
eptr=p; /* is in fact an error */
}
@ -153,31 +185,6 @@ void logfileMask(int mask) {
logMask=logMask | mask;
}
void logfileStamp(char *text) {
int time, date, stamp;
time = mycNow();
date = mycDate(time); /* date in yyyymmdd decimal encoding */
time = time % (24*3600); /* seconds since midnight */
stamp=time / 60;
if (date != openDate ) { /* day has changed -> new logfile */
if (fil!=NULL) { fclose(fil); fil=NULL; }
lastpos=0;
lastline=1;
logfileOpen(1);
}
if (text==NULL) {
if (stamp>lastStamp+1) {
fprintf(fil, "---\t%02d:%02d:%02d\n", stamp / 60, stamp % 60, time % 60, text);
}
} else {
fprintf(fil, "\t%02d:%02d:%02d %s", stamp / 60, stamp % 60, time % 60, text);
}
dirty=0;
lastStamp=stamp;
}
void logfileWrite0(int mask) {
char *s, *next;
@ -217,8 +224,8 @@ void logfileScan(int date, void (*scanLine)(void*, char*), void *arg) {
sFile=fil;
rewind(sFile);
} else {
sprintf(filnam, "%s%02d-%02d.log", lnam, date % 10000 / 100, date % 100);
sFile=fopen(filnam, "r+");
sprintf(buf, "%s%02d-%02d.log", lnam, date % 10000 / 100, date % 100);
sFile=fopen(buf, "r+");
if (sFile==NULL) return;
}
res=fgets(buf, sizeof(buf), sFile);

View File

@ -25,8 +25,9 @@ typedef struct _CocVar {
void *var;
int access;
int type;
int size;
void *strucType;
int (*hdl)(int, void *);
int (*hdl)(int, void *, int);
int pending;
} CocVar;
@ -76,8 +77,7 @@ void CocVarList(void **varList) {
}
}
void CocList() {
CocVar *p;
void CocList() { CocVar *p;
p=*varListHandle;
while (p!=NULL) {
@ -140,7 +140,7 @@ void *CocIntPtr(int *ptr) { return(ptr); }
void *CocFltPtr(float *ptr) { return(ptr); }
void *CocChrPtr(char *ptr) { return(ptr); }
void *CocDefVar(const char *name, void *var, int type, int access) {
void *CocDefVar(const char *name, void *var, int type, int size, int access) {
CocVar *p;
const char *f;
void *adr;
@ -153,6 +153,7 @@ void *CocDefVar(const char *name, void *var, int type, int access) {
*varListHandle=p;
str_copy(p->name, name);
p->type=type;
p->size=size;
} else {
assert(p->type==type);
}
@ -165,17 +166,22 @@ void *CocDefVar(const char *name, void *var, int type, int access) {
assert(0);
}
void CocHdl(int (*handler)(int, void *)) {
void CocHdl(int (*handler)(int, void *, int)) {
assert(lastDef!=NULL);
lastDef->hdl=handler;
}
int *CocSizePtr(void) {
assert(lastDef!=NULL && lastDef->type==COC_ARRAY);
return &lastDef->size;
}
void CocDefVarS(const char *name, const char *tname, void *var, int type) {
CocVar *p, *t;
assert(type==COC_PTR || type==COC_STRUCT);
p=CocDefVar(name, var, type, COC_RDONLY);
p->strucType=CocDefVar(tname, NULL, COC_TYPE, COC_RDONLY);
p=CocDefVar(name, var, type, 0, COC_RDONLY);
p->strucType=CocDefVar(tname, NULL, COC_TYPE, 0, COC_RDONLY);
}
char err_name[64];
@ -192,12 +198,14 @@ int CocGetThisVar(CocVar *var, void *base, StrBuf *buf, int separator) {
adr=(char *)base + (int)var->var;
}
/* printf("get %s %d\n", name, (int)adr); */
if (var->type==-1) {
if (var->type==COC_CHAR) {
ERR_P(StrNGet(buf, (char *)adr, var->size, separator));
} else if (var->type==COC_INT) {
ERR_I(StrGetInt(buf, (int *)adr, separator));
} else if (var->type==-2) {
} else if (var->type==COC_FLT) {
ERR_I(StrGetFloat(buf, (float *)adr, separator));
} else if (var->type>1) {
ERR_P(StrNGet(buf, (char *)adr, var->type, separator));
} else if (var->type==COC_ARRAY) {
ERR_I(StrGetArray(buf, (float *)adr, var->size));
} else {
ERR_MSG("unknown type");
}
@ -217,12 +225,14 @@ int CocPutThisVar(CocVar *var, void *base, StrBuf *buf, int separator) {
adr=(char *)base + (int)var->var;
}
/* printf("put %s %d\n", name, (int)adr); */
if (var->type==-1) {
ERR_I(StrPutInt(buf, *(int *)adr, separator));
} else if (var->type==-2) {
ERR_I(StrPutFloat(buf, *(float *)adr, separator));
} else if (var->type>1) {
if (var->type==COC_CHAR) {
ERR_I(StrPut(buf, adr, separator));
} else if (var->type==COC_INT) {
ERR_I(StrPutInt(buf, *(int *)adr, separator));
} else if (var->type==COC_FLT) {
ERR_I(StrPutFloat(buf, *(float *)adr, separator));
} else if (var->type==COC_ARRAY) {
ERR_I(StrPutArray(buf, (float *)adr, var->size));
} else {
ERR_MSG("unknown type");
}
@ -265,6 +275,32 @@ void CocFreeVarList(void) {
*varListHandle=NULL;
}
char *CocReadVars(char *str, char stop){
int i, l;
char *eql, *cr, buf[80];
StrBuf sbuf;
/* interprete variables until stop character appeares */
i=sscanf(str, "%79s%n", buf, &l);
while (i>0 && buf[0]!=stop) {
if (buf[0]=='!') {
cr=strchr(str, '\n');
if (cr==NULL) return strchr(str, '\0');
str=cr+1;
} else {
str+=l;
eql=strchr(buf,'=');
if (eql==NULL) ERR_MSG("syntax error");
*eql='\0';
StrLink(&sbuf, eql+1);
ERR_I(CocGetVar(buf, &sbuf, ' '));
}
i=sscanf(str, "%79s%n", buf, &l);
}
return str;
OnError: return NULL;
}
void CocToClients(int mask, char *str) {
int iret;
CocClient *cl;
@ -310,11 +346,11 @@ int CocInitServer(void *(*setDataRtn)(void *), int port) {
OnError: return(-1);
}
int CocHandleThis(CocVar *var, void *base, StrBuf *outBuf, int mode) {
int CocHandleThis(CocVar *var, void *base, StrBuf *outBuf, int mode, int fd) {
int iret;
if (var->hdl!=NULL) {
iret=var->hdl(mode, base);
iret=var->hdl(mode, base, fd);
if (iret<0) { /* error */
ErrShow(var->name);
ERR_I(StrPut(outBuf, "", COC_ERR)); /* signal error message */
@ -375,7 +411,7 @@ int CocCallHandlers(void) {
assert(var!=NULL && var->hdl!=NULL);
if (mode==COC_DWR) {
var->pending=0;
ERR_I(var->hdl(mode, p->base));
ERR_I(var->hdl(mode, p->base, cl->fd));
p->mode=0;
} else {
delayedRead=1;
@ -391,7 +427,7 @@ int CocCallHandlers(void) {
var=p->var;
assert(var!=NULL && var->hdl!=NULL);
if (mode==COC_DRD) {
iret=var->hdl(mode, p->base);
iret=var->hdl(mode, p->base, cl->fd);
if (iret<0) { /* error */
ERR_I(StrPut(&bufr, "", COC_ERR)); /* signal error message */
ERR_I(StrPut(&bufr, ErrMessage, COC_SEP));
@ -455,6 +491,7 @@ int CocHandle1Request(int tmo_msec, int fd) {
if (i==0) return(0); /* timeout */
if (FD_ISSET(mainFd, &rmask)) {
cadrlen=sizeof(cadr);
ERR_SI(newfd=accept(mainFd, (struct sockaddr *)&cadr, &cadrlen));
FD_SET(newfd, &mask);
if (newfd>=maxfd) maxfd=newfd+1;
@ -545,14 +582,14 @@ int CocHandle1Request(int tmo_msec, int fd) {
if (NULL!=strchr(loglist,'M')) lmask = lmask | LOG_MAIN;
ERR_I(StrPut(&bufo, "", COC_NUL)); /* o.k. */
} else {
ERR_I(iret=CocHandleThis(var, base, &bufo, COC_WR));
ERR_I(iret=CocHandleThis(var, base, &bufo, COC_WR, cl->fd));
if (iret) ERR_I(CocPushThisHandler(var, cl, base, iret));
}
modified=1;
}
} else {
ERR_P(StrGet(&buf, NULL, COC_NUL)); /* skip separator */
ERR_I(iret=CocHandleThis(var, base, &bufo, COC_RD));
ERR_I(iret=CocHandleThis(var, base, &bufo, COC_RD, cl->fd));
if (iret) ERR_I(CocPushThisHandler(var, cl, base, iret));
}
}

View File

@ -28,32 +28,44 @@ int CocGetVar(const char *name, StrBuf *buf, int separator);
get a variable named <name> of variable list <varList> from the buffer <buf>
*/
void CocHdl(int (*handler)(int, void *));
char *CocReadVars(char *str, char stop);
/*
read variables from the string str until a word starts with the stop character
the string has the form [ whitespace var=value ] whitespace stop-character
any text between an exclamation character and the next line break is treated as comment
*/
void CocHdl(int (*handler)(int, void *, int));
/*
define handler for last defined item
*/
int *CocSizePtr(void);
/*
get size pointer from last defined item (only valid when an array)
*/
void *CocIntPtr(int *ptr);
void *CocFltPtr(float *ptr);
void *CocChrPtr(char *ptr);
void *CocDefVar(const char *name, void *var, int type, int access);
void *CocDefVar(const char *name, void *var, int type, int size, int access);
void CocDefVarS(const char *name, const char *tname, void *var, int type);
/*
Define variables. Call this routines not directly, but through
one of the macros below.
*/
#define CocDefInt(V,A) CocDefVar(#V,CocIntPtr(&V),COC_INT,A)
#define CocDefFlt(V,A) CocDefVar(#V,CocFltPtr(&V),COC_FLT,A)
#define CocDefStr(V,A) CocDefVar(#V,CocChrPtr(V),sizeof(V),A)
#define CocDefPtr(V,S) CocDefVarS(#V,#S,&V,(V!=(S *)NULL,COC_PTR));
#define CocDefStruct(V,S) CocDefVarS(#V,#S,&V,(&V!=(S *)NULL,COC_STRUCT));
#define CocIntFld(S,V,A) CocDefVar(#S":"#V,CocIntPtr(&((S *)NULL)->V),COC_INT,A);
#define CocFltFld(S,V,A) CocDefVar(#S":"#V,CocFltPtr(&((S *)NULL)->V),COC_FLT,A);
#define CocStrFld(S,V,A) CocDefVar(#S":"#V,CocChrPtr(((S *)NULL)->V),sizeof(((S *)NULL)->V),A);
#define CocDefCmd(V) CocDefVar("$",V,sizeof(V),0)
#define CocDefStrPtr(V,S,A) CocDefVar(#V,V,S,A)
#define CocAlias(A,V) CocDefVar(#A, #V, COC_ALIAS,0);
#define CocDefInt(V,A) CocDefVar(#V,CocIntPtr(&V),COC_INT,0,A)
#define CocDefFlt(V,A) CocDefVar(#V,CocFltPtr(&V),COC_FLT,0,A)
#define CocDefStr(V,A) CocDefVar(#V,CocChrPtr(V),COC_CHAR,sizeof(V),A)
#define CocDefArr(V,A) CocDefVar(#V,CocFltPtr(V),COC_ARRAY,sizeof(V)/sizeof(float),A)
#define CocDefPtr(V,S) CocDefVarS(#V,#S,&V,(V!=(S *)NULL,0,COC_PTR));
#define CocDefStruct(V,S) CocDefVarS(#V,#S,&V,(&V!=(S *)NULL,0,COC_STRUCT));
#define CocIntFld(S,V,A) CocDefVar(#S":"#V,CocIntPtr(&((S *)NULL)->V),COC_INT,0,A);
#define CocFltFld(S,V,A) CocDefVar(#S":"#V,CocFltPtr(&((S *)NULL)->V),COC_FLT,0,A);
#define CocStrFld(S,V,A) CocDefVar(#S":"#V,CocChrPtr(((S *)NULL)->V),COC_CHAR,sizeof(((S *)NULL)->V),A);
#define CocArrFld(S,V,A) CocDefVar(#S":"#V,CocFltPtr(((S *)NULL)->V),COC_FLT,sizeof(((S *)NULL)->V)/sizeof(float),A);
#define CocAlias(A,V) CocDefVar(#A, #V, COC_ALIAS,0,0);
#define COC_RDONLY 3
#define COC_RDWR 2
@ -65,12 +77,14 @@ void CocDefVarS(const char *name, const char *tname, void *var, int type);
#define COC_DRD 4
#define COC_SHOW 5
#define COC_INT -1
#define COC_FLT -2
#define COC_PTR -3
#define COC_STRUCT -4
#define COC_TYPE -5
#define COC_ALIAS -6
#define COC_CHAR 1
#define COC_INT 2
#define COC_FLT 3
#define COC_ARRAY 4
#define COC_PTR 5
#define COC_STRUCT 6
#define COC_TYPE 7
#define COC_ALIAS 8
int CocInitServer(void *(*setDataRtn)(void *), int port);

View File

@ -5,7 +5,7 @@
#include "myc_buf.h"
#define COC_CMD_LEN 256
#define COC_RES_LEN 8192
#define COC_RES_LEN 16384
int CocCreateSockAdr(
struct sockaddr_in *sockaddrPtr, /* Socket address */
@ -32,10 +32,6 @@ int CocRecv(int fd, StrBuf *buf, int timeout, int *flag);
else *flag is set to zero between the select and the recv command
*/
#define COC_INT -1
#define COC_FLT -2
#define COC_PTR -3
#define COC_SEP '\0'
#define COC_DELAYED '\1'
#define COC_ERR '\2'

View File

@ -11,10 +11,11 @@ static Instrument list[]={
{ "TOPSI", "lnsa07.psi.ch", "TOPSI" , 1},
{ "SANS", "lnsa10.psi.ch", "SANS" , 1},
{ "HRPT", "lnsa11.psi.ch", "HRPT" , 1},
{ "TASP", "lnsa12.psi.ch", "TASP" , 1},
{ "TRICS", "lnsa18.psi.ch", "TRICS" , 1},
{ "AMOR", "lnsa14.psi.ch", "AMOR" , 1},
{ "FOCUS", "lnsa16.psi.ch", "FOCUS" , 1},
{ "TASP", "lnsa12.psi.ch", "TASP", 1},
{ "TASP0", "lnsa09.psi.ch", NULL , 0},
{ "RITA", "lnsa08.psi.ch", NULL , 0},
{ "PREP", "lnsa01.psi.ch", NULL , 0},
{ "TEST", "lnsa15.psi.ch", "lnslib", 2}
@ -68,8 +69,6 @@ int InstrHost(char *input, char *instr, char *host, char *user, char *pcod
#ifdef __VMS
#define instr_host_ instr_host
#elif defined __linux
#define instr_host_ instr_host__
#endif
int instr_host_(F_CHAR(input), F_CHAR(instr), F_CHAR(host), F_CHAR(user), F_CHAR(pcod)

View File

@ -216,3 +216,93 @@ void StrNLink(StrBuf *buf, char *str, int length) {
buf->wrpos=l;
buf->dsize=buf->wrpos;
}
#define TWO_23 8388608
#define EXP_OFFS 128
void flt_to_char4(double f, char buf[4]) {
double m;
int e, res, ir;
m=frexp(f, &e);
e=e+EXP_OFFS;
if (e<0 || m==0) {
res=0; m=0;
} else {
if (e>255) {
res=255*TWO_23+(TWO_23-1); /* max. representable number */
} else {
res=e*TWO_23+(int)(0.5+(fabs(m*2)-1.0)*TWO_23);
}
}
buf[0]=res % 256; res=res/256;
buf[1]=res % 256; res=res/256;
buf[2]=res % 256; res=res/256;
if (m<0) {
buf[3]=res-128;
} else {
buf[3]=res;
}
}
double flt_from_char4(char buf[4]) {
int s, i, b0, b1, b2, b3;
b0=buf[0]; if (b0<0) b0+=256;
b1=buf[1]; if (b1<0) b1+=256;
b2=buf[2]; if (b2<0) b2+=256;
b3=buf[3]; if (b3<0) b3+=256;
if (b3>=128) {
i=(b3-128)*(256*65536)+b2*65536+b1*256+b0;
if (i==0) return 0.0;
return -ldexp((i % TWO_23)*1.0/(TWO_23)*0.5+0.5, i/TWO_23-EXP_OFFS);
} else {
i=b3*(256*65536)+b2*65536+b1*256+b0;
if (i==0) return 0.0;
return ldexp((i % TWO_23)*1.0/(TWO_23)*0.5+0.5, i/TWO_23-EXP_OFFS);
}
}
int StrPutArray(StrBuf *buf, float val[], int size) {
int i, pos;
char *b;
pos=buf->wrpos;
if (pos < 0 || pos >= buf->dsize || buf->buf==NULL)
ERR_MSG("buffer corrupt");
if (pos+4*size >= buf->dsize)
ERR_MSG("buffer too short");
b=buf->buf+pos;
flt_to_char4((float)size, b);
b+=4;
for (i=0; i<size; i++) {
flt_to_char4(val[i], b);
b+=4;
}
buf->wrpos=b - buf->buf;
return(0);
OnError:
buf->wrpos=-1;
return(-1);
}
int StrGetArray(StrBuf *buf, float val[], int maxsize) {
int size, i;
char *b;
double gg;
if (buf->rdpos < 0 || buf->rdpos >= buf->dsize || buf->buf==NULL)
ERR_MSG("buffer corrupt");
b=buf->buf + buf->rdpos;
size=flt_from_char4(b); b+=4;
buf->rdpos+=4*(size+1);
if (maxsize<size) size=maxsize;
for (i=0; i<size; i++) {
gg=flt_from_char4(b); b+=4;
val[i]=gg;
}
return size;
OnError:
buf->rdpos=buf->dsize; /* illegal value */
return(-1);
}

View File

@ -19,6 +19,7 @@ typedef struct { char *buf; int dsize, rdpos, wrpos, seen; } StrBuf;
int StrPut(StrBuf *buf, const char *str, int sep);
int StrPutInt(StrBuf *buf, int val, int sep);
int StrPutFloat(StrBuf *buf, float val, int sep);
int StrPutArray(StrBuf *buf, float val[], int size);
/*------------------------------------------------------------------------
Read from the buffer until separator sep.
@ -31,6 +32,7 @@ char *StrNGet(StrBuf *buf, char *result, int reslen, int sep);
#define StrGet(BUF,RES,SEP) StrNGet(BUF,RES,sizeof(RES),SEP)
int StrGetInt(StrBuf *buf, int *res, int sep);
int StrGetFloat(StrBuf *buf, float *res, int sep);
int StrGetArray(StrBuf *buf, float val[], int maxsize);
#define StrEnd(BUF) ((BUF)->rdpos>=(BUF)->wrpos)
/*------------------------------------------------------------------------

View File

@ -110,14 +110,6 @@ void ERR_EXIT(char *text) {
#define err_msg_ err_msg
#define err_set_outrtn_ err_set_outrtn
#define err_short_ err_short
#elif defined __linux
#define err_show_ err_show__
#define err_txt_ err_txt__
#define err_msg_ err_msg__
#define err_set_outrtn_ err_set_outrtn__
#define err_short_ err_short__
#endif
void err_show_(F_CHAR(text), int text_len) {

View File

@ -24,8 +24,8 @@
typedef struct { short size, dummy; char *text; } SysVmsChar;
#define F_CHAR(VAR) SysVmsChar *VAR##_desc
#define STR_TO_C(DST,SRC) str_ntrim(DST, SRC##_desc->text, sizeof(DST), SRC##_len=SRC##_desc->size)
#define STR_TO_F(DST,SRC) str_npad(DST##_desc->text, SRC, DST##_len=DST##_desc->size)
#define STR_TO_C(DST,SRC) str_ntrim(DST, SRC##_desc->text, sizeof(DST), SRC##_desc->size)
#define STR_TO_F(DST,SRC) str_npad(DST##_desc->text, SRC, DST##_desc->size)
typedef size_t sys_adr_len; /* argument of accept and gethostbyadr */

File diff suppressed because it is too large Load Diff

View File

@ -123,22 +123,6 @@ void TeccClose(pTecsClient conn) {
#define tecs_date_ tecs_date
#define tecs_time_ tecs_time
#define tecs_rights_ tecs_rights
#elif defined __linux
#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;
@ -271,82 +255,13 @@ int tecs_watch_log_(F_CHAR(list), int list_len) {
OnError: return(-1);
}
static char *encode=DATA_CODE;
int DataDecode(float *data, int dataSize, char *coded, int *retSize) {
int i, p, gap, dig1, dig2;
float minD, range;
char ch, *q;
static int decode[256];
static int init=1;
if (coded[0] == '\0') {
*retSize=0;
return 0;
}
if (init) {
init=0;
for (i=0; i<256; i++) {
decode[i]=-1;
}
i=0;
while (encode[i]!=0) {
decode[encode[i]]=i;
i++;
}
}
p=0;
ERR_SI(sscanf(coded, "%d %e %e %n", retSize, &minD, &range, &p)-3);
if (*retSize < dataSize) dataSize = *retSize;
i=0;
while (i < dataSize) {
ch=coded[p++];
dig1=decode[ch];
if (dig1 < 0) { /* code is no 64-digit */
if (ch=='\0' || ch==',') break;
if (ch=='/') {
data[i++] = DATA_UNDEF;
} else if (ch=='.') {
data[i++] = DATA_GAP;
}
} else {
ch=coded[p++];
dig2=decode[ch];
while (dig2<0) {
if (ch=='\0' || ch==',') break;
ch=coded[p++];
dig2=decode[ch];
}
if (ch=='\0' || ch==',') break;
data[i++] = (dig1 + dig2 * 64) / 4095.0 * range + minD;
}
}
while (i < dataSize) {
data[i++] = DATA_UNDEF;
}
if (ch=='\0') {
return p-1;
} else if (ch!=',') {
q=strchr(coded+p, ',');
if (q==NULL) return strlen(coded);
return q-coded+1;
}
return p;
OnError:
*retSize=0;
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];
char res[COC_RES_LEN];
char *cod;
float offset, fact, *py;
int i, j, k, l, iret, retSize;
float offset, fact, *py, data[8192];
int i, j, k, l, iret;
if (*endTime - *startTime > *step * (*maxLen-1)) {
printf("maxLen too small\n");
@ -358,34 +273,34 @@ int tecs_get_data_(F_CHAR(names), int *startTime, int *endTime, int *step, int *
sprintf(str, "%d %d %d %s", *startTime, *endTime, *step, nam);
CocReset(conn);
ERR_I(CocPutStr(conn, "pltdata", str));
ERR_I(CocGetStr(conn, "pltdata", res, sizeof(res)));
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);
cod=res;
py=data;
for (i=0; i < *width; i++) {
py = ydata + i * *maxLen;
ERR_I(l=DataDecode(py, *maxLen, cod, retLen+i));
if (retLen[i]>0) {
fact = (float)(*endTime - *startTime) / retLen[i];
l=*py; py++;
if (l>0) {
fact = (float)(*endTime - *startTime) / l;
}
offset = *startTime - *tbase;
k = i * *maxLen;
for (j=0; j<retLen[i]; j++) {
for (j=0; j<l; j++) {
if (py[j] != DATA_GAP) {
ydata[k] = py[j];
xdata[k] = offset + j * fact;
k++;
}
}
py+=l;
retLen[i] = k - i * *maxLen;
cod+=l;
}
return 0;
OnError:
return -1;
}
/*
float tecs_date_(time_t *time) {
struct tm tim;

View File

@ -29,7 +29,7 @@
if (line(1:l) .eq. 'off' .or. line(1:l) .eq. 'OFF') then
call tecs_open(0, ' ', iret)
if (iret .lt. 0) goto 91
iret=tecs_quit_server(0)
iret=tecs_quit_server(0)
if (iret .lt. 0) goto 91
goto 99
endif
@ -217,6 +217,8 @@
3 continue ! command with parameter
defcmd='status'
if (cmd .eq. 'log') then
if (show_log(par) .gt. 0) then
defcmd='log'

View File

@ -443,61 +443,18 @@ void Load(Base *base, int from, int to, int stdStep) {
}
}
static char *encode=DATA_CODE;
int DataEncode(float *data, int dataSize, char *coded, int codedLen) {
int i, n, p, gap;
float minD, maxD, range;
if (dataSize >= (codedLen-26)/2) ERR_MSG("codedLen too small");
minD=DATA_UNDEF;
maxD=DATA_UNDEF;
for (i=0; i<dataSize; i++) {
if (data[i]!=DATA_UNDEF) {
if (maxD==DATA_UNDEF) {
maxD=data[i]; minD=data[i];
} else {
if (data[i] > maxD) maxD=data[i];
if (data[i] < minD) minD=data[i];
}
}
}
range = maxD - minD;
if (range == 0) range=1;
ERR_SI(p=sprintf(coded, "%d %5g %5g ", dataSize, minD, range));
gap=0;
for (i=0; i<dataSize; i++) {
if ( data[i] == DATA_UNDEF ) {
coded[p++]='/';
} else if ( data[i] == DATA_GAP ) {
coded[p++]='.';
} else {
n=( (data[i] - minD) * 4095 ) / range + 0.5;
assert(n>=0 && n <4096);
coded[p++]=encode[n % 64];
coded[p++]=encode[n / 64];
}
}
coded[p++]=',';
coded[p]='\0';
assert(p < codedLen);
return p;
OnError:
return -1;
}
int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep, char *coded, int codedLen) {
int DataGetMult(char *names, int startTime, int endTime, int step, int stdStep, float *data, int data_len) {
Base base;
Set *set, *s;
int stp, minStep, period, s1;
char *nams, nam[32];
int p, l, n, i, j, siz1, siz2, halfsiz, start;
float data[SET_LEN];
base.head = NULL;
period = endTime - startTime;
if (period<=0) period=1;
n=0; nams = names;
while (nams != NULL) {
while (nams != NULL) { /* count names */
nams = str_split(nam, nams, ' ');
if (nam[0] != '\0') n++;
}
@ -505,7 +462,7 @@ int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep,
stp=step;
if (stp<stdStep) stp=stdStep;
nams=names;
while (nams!=NULL) {
while (nams!=NULL) { /* create sets for data not in memory */
nams=str_split(nam, nams, ' ');
if (nam[0]!='\0') {
set=FindSet(&database, nam);
@ -520,12 +477,11 @@ int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep,
}
}
}
if (base.head != NULL) {
if (base.head != NULL) { /* load if needed */
Load(&base, startTime, endTime, stdStep);
}
p=0;
nams=names;
coded[0]='\0';
while (nams!=NULL) {
nams=str_split(nam, nams, ' ');
if (nam[0]!='\0') {
@ -550,9 +506,8 @@ int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep,
}
}
}
if (s1 == 0) {
data[0]=DATA_UNDEF;
ERR_I(l=DataEncode(data, 1, coded+p, codedLen-p));
if (s1 == 0) { /* empty array */
data[p++]=0;
} else {
minStep = s->step;
stp = step;
@ -560,40 +515,44 @@ int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep,
if (startTime + minStep * halfsiz * 2 > endTime) {
if (stp < minStep) stp = minStep;
halfsiz = period / (2 * stp) + 1;
if (halfsiz * 2 > SET_LEN) halfsiz = SET_LEN / 2;
if (halfsiz * 4 + 32 * n > codedLen) {
halfsiz = ((codedLen - p) / n - 32) / 4;
if (halfsiz * 2 + n > data_len) { /* check if enough space */
halfsiz = ((data_len - p) / n - 1) / 2;
}
}
siz1 = (s1 - startTime) * halfsiz / period * 2;
siz2 = halfsiz * 2 - siz1;
s1 = startTime + (siz1 * period + halfsiz) / halfsiz / 2;
p++;
if (siz1 > 0) {
halfsiz = (s1 - startTime) / set->step / 2;
if (halfsiz * 2 < siz1 && halfsiz > 0) {
ERR_I(GetSet(set, startTime, s1, halfsiz*2, data));
ERR_I(GetSet(set, startTime, s1, halfsiz*2, data+p));
j = siz1 - 1;
for (i = halfsiz * 2-1; i >= 0; i--) { /* expand data */
while (j > siz1 / 2 * i / halfsiz) {
data[j]=DATA_GAP; j--;
data[p+j]=DATA_GAP; j--;
}
data[j]=data[i]; j--;
data[p+j]=data[p+i]; j--;
}
} else {
ERR_I(GetSet(set, startTime, s1, siz1, data));
ERR_I(GetSet(set, startTime, s1, siz1, data+p));
}
l=siz1;
} else {
l=0;
}
if (siz2 > 0) {
ERR_I(GetSet(s, s1, endTime, siz2, data+siz1));
ERR_I(GetSet(s, s1, endTime, siz2, data+p+siz1));
l+=siz2;
}
ERR_I(l=DataEncode(data, siz1+siz2, coded+p, codedLen-p));
data[p-1]=l;
p+=l;
}
p+=l;
n--;
}
}
FreeBase(&base);
return (0);
return p;
OnError:
return(-1);
return -1;
}

View File

@ -35,14 +35,15 @@ int DataPutAll(DataBase *dBase, int time);
put all variables in a set to their dataset
*/
int DataDecode(float *data, int dataSize, char *coded, int *retLen);
int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep, char *coded, int codedLen);
int DataGetMult(char *names, int startTime, int endTime, int step, int stdStep, float *data, int data_len);
/*
get multiple datasets
*/
/*
define DATA_UNDEF as a binary and decimal well defined, hopefully rarely used number
*/
#define DATA_UNDEF MYC_NAN
#define DATA_GAP (MYC_NAN*2)
#define DATA_CODE "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz"
#endif /* TECS_DATA_H_ */

View File

@ -2,7 +2,7 @@ subroutine tecs_plot(auxpar)
character(len=*) auxpar
integer, parameter :: dmax=800, nmax=5, tmax=4, amax=3, nmenu=13, chartperiod=5, naux=1
integer, parameter :: dmax=400, nmax=9, tmax=8, amax=3, nmenu=13, chartperiod=5, naux=1
integer, parameter :: minRange=60, maxRange=7*24*3600
integer, parameter :: oneDay = 24*3600
integer, parameter :: zoom=1, right=2, live=3
@ -15,7 +15,7 @@ subroutine tecs_plot(auxpar)
integer l,j,i,n,t,leng,i1,i2,rl,startday,thisday
integer ncol, nset, mode
integer first,last,step,tbase,lastj
integer colorList(nmax)/5,3,2,4,8/
integer colorList(nmax)/5,3,2,4,6,8,14,15,8/
integer color(nmax)
integer retLen(nmax)
integer sel/0/, sel1, sel2, auxsel/1/
@ -36,7 +36,7 @@ subroutine tecs_plot(auxpar)
,'q' ,'quit'/
character weekdays(7)*4/'Mon','Tue','Wed','Thu','Fri','Sat','Sun'/
character buf*8, device*8, name*40, filnam*128, numb*16, title*64, pars*64
character(len=4) tpar(tmax)/'Te', 'Tr', 'Tm', 'Ts'/
character(len=4) tpar(tmax)/'Te', 'Tr', 'Tm', 'Ts', 'T1', 'T2', 'T3', 'T4'/
character(len=4) apar(amax)/'P', 'He', 'Aux'/
character(len=16) parnam(nmax)
logical gap, done
@ -44,7 +44,7 @@ subroutine tecs_plot(auxpar)
integer iret, lund, numl, mon, day
! functions
integer sys_gmt_off, myc_now, myc_time, myc_date, tecs_get_data, tecs_get_mult, tecs_get_par
integer sys_gmt_off, myc_now, myc_time, myc_date, get_data, tecs_get_mult, tecs_get_par
data window/0./
@ -74,6 +74,7 @@ subroutine tecs_plot(auxpar)
endif
call pgask(.false.)
call pgupdt
l=0
x1=0
step=0
@ -92,7 +93,7 @@ subroutine tecs_plot(auxpar)
pars=trim(pars)//' '//parnam(nset)
enddo
nset=nset+1
color(nset)=colorList(5)
color(nset)=colorList(3)
parnam(nset)=apar(auxsel)
pars=trim(pars)//' '//parnam(nset)
@ -104,23 +105,34 @@ subroutine tecs_plot(auxpar)
window=maxRange
first=t-min(dmax*step-1,maxRange-step)
else if (mode >= right) then
step=window/(dmax-1)+0.99
step=window/(dmax-2)+0.99
last=t
first=t-min(dmax*step-1,nint(window)-step)
first=t-min(dmax*step-1,nint(window))
else
if (mode==zoom) then
x2=(x1+x2+window)/2
x1=x2-window
endif
if (x1 .gt. x2-minRange) x1=x2-minRange
step=(x2-x1)/(dmax-1)+0.99
last=nint(x2)+tbase
first=nint(x1)+tbase
step=(x2-x1)/(dmax-2)+0.99
last=x2+tbase
first=x1-step+tbase
endif
if (step == 0) step=1
if (step>60) then ! normalize step
step=(step+59)/60*60
else if (step>30) then
step=60
elseif (step>20) then
step=30
else
step=(step+4)/5*5
endif
first=last-(last-first+step-1)/step*step ! round first
! print *,step,last-first
tbase=first-mod(first,7*oneDay)
iret=tecs_get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retLen)
iret=get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retLen)
if (iret < 0) goto 99
x2 = last - tbase
@ -216,6 +228,7 @@ subroutine tecs_plot(auxpar)
do i=i1,i2
call pgsci(color(i))
l=0
lastj=1
do j=1,retLen(i)
if (yd(j,i)==undef) then
@ -223,9 +236,12 @@ subroutine tecs_plot(auxpar)
call pgline(j-lastj, xd(lastj,i), yd(lastj,i))
endif
lastj=j+1
else
l=j
endif
enddo
if (retLen(i) > lastj) call pgline(retLen(i)+1-lastj, xd(lastj,i), yd(lastj,i))
retLen(i)=l
enddo
call pgsci(1)
if (rl == 1) then
@ -635,3 +651,42 @@ subroutine set_win(rl, x1, x2, y1, y2)
call pgswin(x1,x2,y1,y2)
end subroutine
integer function get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retlen)
character pars*(*)
integer first, last, step, tbase, dmax, nmax, retlen(nmax)
real*4 xd(dmax,nmax), yd(dmax,nmax)
integer, parameter :: oneDay = 24*3600, maxn=9
integer tecs_get_data
integer i,j,rl(maxn),m,k,n,mm
if (nmax > maxn) stop 'get_data: nmax>maxn'
if (last-first <= oneDay) then
get_data=tecs_get_data(pars, first, last, step, tbase, xd, yd, dmax, nmax, retLen)
else
do j=1,nmax
retlen(j)=0
enddo
m=0
do i=first/oneDay,last/oneDay
get_data=tecs_get_data(pars, max(first,i*oneDay), min(last,(i+1)*oneDay-step), step, tbase &
, xd(m+1, 1), yd(m+1, 1), dmax, nmax, rl)
if (get_data<0) return
mm=0
do j=1,nmax
n=retlen(j)
do k=m+1,m+rl(j)
n=n+1
xd(n,j)=xd(k,j)
yd(n,j)=yd(k,j)
enddo
retlen(j)=n
mm=max(mm,n)
enddo
! print *,mm-m,' points read'
m=mm
enddo
endif
end function

View File

@ -82,10 +82,7 @@ SerChannel *SerOpen(const char *hostPort, int msecTmo, int (*idleHdl)(int,int))
if (iret==1) {
iret=AsynSrv_Config(&aser->asyn_info, "msecTmo", msecTmo, "idleHdl", idleHdl, NULL);
}
if (iret!=1) {
SerA_error();
goto OnError;
}
if (iret!=1) { SerA_error(); goto OnError; }
time(&t2);
ecnt=0;
logfileOut(LOG_MAIN, "connection to %s:%d/%d opened (%d sec)\n",
@ -102,10 +99,6 @@ SerChannel *SerOpen(const char *hostPort, int msecTmo, int (*idleHdl)(int,int))
}
ERR_I(CocCreateSockAdr(&sadr, host, atoi(p)));
ERR_SI(tser->fd=socket(AF_INET, SOCK_STREAM, 0));
/* do we need this really as a client ?
i = 1;
ERR_SI(setsockopt(conn->fd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(int)));
*/ /* allow quick port reuse */
ERR_SI(connect(tser->fd, (struct sockaddr *)&sadr, sizeof(sadr)));
time(&t2);
ecnt=0;
@ -121,6 +114,23 @@ SerChannel *SerOpen(const char *hostPort, int msecTmo, int (*idleHdl)(int,int))
return(NULL);
}
int SerSetTmo(SerChannel *serch, int msecTmo) {
AsynSrvChan *aser;
TermSrvChan *tser;
int iret;
if (serch->type==ASYNSRV_TYPE) {
aser=(AsynSrvChan *)serch;
iret=AsynSrv_Config(&aser->asyn_info, "msecTmo", msecTmo, NULL);
if (iret!=1) { SerA_error(); goto OnError; }
} else if (serch->type==TERMSRV_TYPE) {
tser=(TermSrvChan *)serch;
tser->tmo=msecTmo;
}
return 0;
OnError: return -1;
}
void SerClose(SerChannel *serch) {
AsynSrvChan *aser;
TermSrvChan *tser;

View File

@ -10,6 +10,7 @@ typedef struct {
SerChannel *SerOpen(const char *host, int msecTmo, int (*idleHdl)(int,int));
char *SerCmd(SerChannel *ser, char *cmnd);
int SerSetTmo(SerChannel *ser, int msecTmo);
SerChannel *SerCheck(SerChannel *ser);
void SerClose(SerChannel *ser);