*** 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 SYS_FILE_alpha_osf1=sys_aunix
#CFLAGS_alpha_osf1= -std1 -g -warnprotos -I../ -I. -I../hardsup -DFORTIFY #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 CC_i386_linux= gcc
CFLAGS_i386_linux= -I/usr/local/include -I. -I../ -I../hardsup -DLINUX -g CFLAGS_i386_linux= -I/usr/local/include -I. -I../ -I../hardsup -DLINUX -g
TECS_PLOT_i386_linux=f77 -c -u -g tecs_plot.for 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) \ f77 -o bin/TecsClient -g $(TECLI_OBJ) \
$(TECLI_LIB) -lreadline -ltermcap $(TECLI_LIB) -lreadline -ltermcap
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 $(LIBR_OBJ) $(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 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 $(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_NETTMO 5
#define COC_RESTMO 60 #define COC_RESTMO 60
#define ARG_CHAR 1
#define ARG_INT 2
#define ARG_FLT 3
#define ARG_ARR 4
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
int CocConnect(CocConn *conn) { 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; StrBuf *buf;
int n; 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"); if (n>=sizeof(conn->args)) ERR_MSG("too many return arguments");
conn->args[n].adr=value; conn->args[n].adr=value;
conn->args[n].type=type; conn->args[n].type=type;
conn->args[n].size=size;
conn->args[n].cmd=buf->buf + buf->wrpos; conn->args[n].cmd=buf->buf + buf->wrpos;
conn->nargs=n+1; conn->nargs=n+1;
if (value==NULL) { 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) { int CocPutStr(CocConn *conn, const char *name, const char *value) {
StrBuf *buf; 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)); ERR_I(StrPut(&conn->cmdbuf, value, COC_SEP));
return(0); return(0);
OnError: return(-1); 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) { 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)); ERR_I(StrPutFloat(&conn->cmdbuf, value, COC_SEP));
return(0); return(0);
OnError: return(-1); 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) { 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)); ERR_I(StrPutInt(&conn->cmdbuf, value, COC_SEP));
return(0); return(0);
OnError: return(-1); 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) { 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) { 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) { 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 { } else {
str_ncat(res, a->cmd, res_len); str_ncat(res, a->cmd, res_len);
str_ncat(res, "=", 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)); 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)); ERR_I(StrGetFloat(buf, (float *)a->adr, COC_SEP));
} else if (a->type>1) { } else if (a->type==ARG_ARR) {
ERR_P(StrNGet(buf, (char *)a->adr, a->type, COC_SEP)); 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 { } else {
ERR_MSG("unknown type"); ERR_MSG("unknown type");
} }
a->type=0; a->type=0; /* done */
} }
} }
str_ncat(res, resp, res_len); str_ncat(res, resp, res_len);

View File

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

View File

@ -9,7 +9,8 @@
#include "myc_str.h" #include "myc_str.h"
static FILE *fil=NULL; static FILE *fil=NULL;
static char lnam[224]="", filnam[256]=""; static char lnam[224]="";
static char filnam[256]="";
static char ebuf[20000]=""; static char ebuf[20000]="";
static char *statusBuf=NULL; static char *statusBuf=NULL;
static int statusSize; static int statusSize;
@ -93,9 +94,35 @@ char *logfileInit(char *path, int nodate, int use_stdout, int write_all) {
return(filnam); 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, ...) void logfileOut(int mask, const char *fmt, ...)
{ va_list ap; { va_list ap;
char buf[8192], *p; char buf[8192], *p;
int l;
va_start(ap, fmt); va_start(ap, fmt);
@ -125,7 +152,7 @@ void logfileOut(int mask, const char *fmt, ...)
if (writeAll) { if (writeAll) {
vfprintf(fil, fmt, ap); vfprintf(fil, fmt, ap);
wrtMask=LOG_ALL; wrtMask=LOG_ALL;
} else { } else if ((mask | LOG_NET) != LOG_NET) { /* do not store LOG_NET info */
if (eptr!=NULL) { if (eptr!=NULL) {
if (eptr-ebuf > sizeof(ebuf)-512) { if (eptr-ebuf > sizeof(ebuf)-512) {
sprintf(eptr, "... buffer full ... \1\1"); sprintf(eptr, "... buffer full ... \1\1");
@ -134,7 +161,12 @@ void logfileOut(int mask, const char *fmt, ...)
vsprintf(eptr, fmt, ap); vsprintf(eptr, fmt, ap);
p=strchr(eptr, '\1'); p=strchr(eptr, '\1');
if (p==NULL) { 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 { } else {
eptr=p; /* is in fact an error */ eptr=p; /* is in fact an error */
} }
@ -153,31 +185,6 @@ void logfileMask(int mask) {
logMask=logMask | 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) { void logfileWrite0(int mask) {
char *s, *next; char *s, *next;
@ -217,8 +224,8 @@ void logfileScan(int date, void (*scanLine)(void*, char*), void *arg) {
sFile=fil; sFile=fil;
rewind(sFile); rewind(sFile);
} else { } else {
sprintf(filnam, "%s%02d-%02d.log", lnam, date % 10000 / 100, date % 100); sprintf(buf, "%s%02d-%02d.log", lnam, date % 10000 / 100, date % 100);
sFile=fopen(filnam, "r+"); sFile=fopen(buf, "r+");
if (sFile==NULL) return; if (sFile==NULL) return;
} }
res=fgets(buf, sizeof(buf), sFile); res=fgets(buf, sizeof(buf), sFile);

View File

@ -25,8 +25,9 @@ typedef struct _CocVar {
void *var; void *var;
int access; int access;
int type; int type;
int size;
void *strucType; void *strucType;
int (*hdl)(int, void *); int (*hdl)(int, void *, int);
int pending; int pending;
} CocVar; } CocVar;
@ -76,8 +77,7 @@ void CocVarList(void **varList) {
} }
} }
void CocList() { void CocList() { CocVar *p;
CocVar *p;
p=*varListHandle; p=*varListHandle;
while (p!=NULL) { while (p!=NULL) {
@ -140,7 +140,7 @@ void *CocIntPtr(int *ptr) { return(ptr); }
void *CocFltPtr(float *ptr) { return(ptr); } void *CocFltPtr(float *ptr) { return(ptr); }
void *CocChrPtr(char *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; CocVar *p;
const char *f; const char *f;
void *adr; void *adr;
@ -153,6 +153,7 @@ void *CocDefVar(const char *name, void *var, int type, int access) {
*varListHandle=p; *varListHandle=p;
str_copy(p->name, name); str_copy(p->name, name);
p->type=type; p->type=type;
p->size=size;
} else { } else {
assert(p->type==type); assert(p->type==type);
} }
@ -165,17 +166,22 @@ void *CocDefVar(const char *name, void *var, int type, int access) {
assert(0); assert(0);
} }
void CocHdl(int (*handler)(int, void *)) { void CocHdl(int (*handler)(int, void *, int)) {
assert(lastDef!=NULL); assert(lastDef!=NULL);
lastDef->hdl=handler; 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) { void CocDefVarS(const char *name, const char *tname, void *var, int type) {
CocVar *p, *t; CocVar *p, *t;
assert(type==COC_PTR || type==COC_STRUCT); assert(type==COC_PTR || type==COC_STRUCT);
p=CocDefVar(name, var, type, COC_RDONLY); p=CocDefVar(name, var, type, 0, COC_RDONLY);
p->strucType=CocDefVar(tname, NULL, COC_TYPE, COC_RDONLY); p->strucType=CocDefVar(tname, NULL, COC_TYPE, 0, COC_RDONLY);
} }
char err_name[64]; char err_name[64];
@ -192,12 +198,14 @@ int CocGetThisVar(CocVar *var, void *base, StrBuf *buf, int separator) {
adr=(char *)base + (int)var->var; adr=(char *)base + (int)var->var;
} }
/* printf("get %s %d\n", name, (int)adr); */ /* 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)); 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)); ERR_I(StrGetFloat(buf, (float *)adr, separator));
} else if (var->type>1) { } else if (var->type==COC_ARRAY) {
ERR_P(StrNGet(buf, (char *)adr, var->type, separator)); ERR_I(StrGetArray(buf, (float *)adr, var->size));
} else { } else {
ERR_MSG("unknown type"); ERR_MSG("unknown type");
} }
@ -217,12 +225,14 @@ int CocPutThisVar(CocVar *var, void *base, StrBuf *buf, int separator) {
adr=(char *)base + (int)var->var; adr=(char *)base + (int)var->var;
} }
/* printf("put %s %d\n", name, (int)adr); */ /* printf("put %s %d\n", name, (int)adr); */
if (var->type==-1) { if (var->type==COC_CHAR) {
ERR_I(StrPutInt(buf, *(int *)adr, separator));
} else if (var->type==-2) {
ERR_I(StrPutFloat(buf, *(float *)adr, separator));
} else if (var->type>1) {
ERR_I(StrPut(buf, adr, separator)); 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 { } else {
ERR_MSG("unknown type"); ERR_MSG("unknown type");
} }
@ -265,6 +275,32 @@ void CocFreeVarList(void) {
*varListHandle=NULL; *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) { void CocToClients(int mask, char *str) {
int iret; int iret;
CocClient *cl; CocClient *cl;
@ -310,11 +346,11 @@ int CocInitServer(void *(*setDataRtn)(void *), int port) {
OnError: return(-1); 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; int iret;
if (var->hdl!=NULL) { if (var->hdl!=NULL) {
iret=var->hdl(mode, base); iret=var->hdl(mode, base, fd);
if (iret<0) { /* error */ if (iret<0) { /* error */
ErrShow(var->name); ErrShow(var->name);
ERR_I(StrPut(outBuf, "", COC_ERR)); /* signal error message */ ERR_I(StrPut(outBuf, "", COC_ERR)); /* signal error message */
@ -375,7 +411,7 @@ int CocCallHandlers(void) {
assert(var!=NULL && var->hdl!=NULL); assert(var!=NULL && var->hdl!=NULL);
if (mode==COC_DWR) { if (mode==COC_DWR) {
var->pending=0; var->pending=0;
ERR_I(var->hdl(mode, p->base)); ERR_I(var->hdl(mode, p->base, cl->fd));
p->mode=0; p->mode=0;
} else { } else {
delayedRead=1; delayedRead=1;
@ -391,7 +427,7 @@ int CocCallHandlers(void) {
var=p->var; var=p->var;
assert(var!=NULL && var->hdl!=NULL); assert(var!=NULL && var->hdl!=NULL);
if (mode==COC_DRD) { if (mode==COC_DRD) {
iret=var->hdl(mode, p->base); iret=var->hdl(mode, p->base, cl->fd);
if (iret<0) { /* error */ if (iret<0) { /* error */
ERR_I(StrPut(&bufr, "", COC_ERR)); /* signal error message */ ERR_I(StrPut(&bufr, "", COC_ERR)); /* signal error message */
ERR_I(StrPut(&bufr, ErrMessage, COC_SEP)); 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 (i==0) return(0); /* timeout */
if (FD_ISSET(mainFd, &rmask)) { if (FD_ISSET(mainFd, &rmask)) {
cadrlen=sizeof(cadr);
ERR_SI(newfd=accept(mainFd, (struct sockaddr *)&cadr, &cadrlen)); ERR_SI(newfd=accept(mainFd, (struct sockaddr *)&cadr, &cadrlen));
FD_SET(newfd, &mask); FD_SET(newfd, &mask);
if (newfd>=maxfd) maxfd=newfd+1; 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; if (NULL!=strchr(loglist,'M')) lmask = lmask | LOG_MAIN;
ERR_I(StrPut(&bufo, "", COC_NUL)); /* o.k. */ ERR_I(StrPut(&bufo, "", COC_NUL)); /* o.k. */
} else { } 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)); if (iret) ERR_I(CocPushThisHandler(var, cl, base, iret));
} }
modified=1; modified=1;
} }
} else { } else {
ERR_P(StrGet(&buf, NULL, COC_NUL)); /* skip separator */ 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)); 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> 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 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 *CocIntPtr(int *ptr);
void *CocFltPtr(float *ptr); void *CocFltPtr(float *ptr);
void *CocChrPtr(char *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); void CocDefVarS(const char *name, const char *tname, void *var, int type);
/* /*
Define variables. Call this routines not directly, but through Define variables. Call this routines not directly, but through
one of the macros below. one of the macros below.
*/ */
#define CocDefInt(V,A) CocDefVar(#V,CocIntPtr(&V),COC_INT,A) #define CocDefInt(V,A) CocDefVar(#V,CocIntPtr(&V),COC_INT,0,A)
#define CocDefFlt(V,A) CocDefVar(#V,CocFltPtr(&V),COC_FLT,A) #define CocDefFlt(V,A) CocDefVar(#V,CocFltPtr(&V),COC_FLT,0,A)
#define CocDefStr(V,A) CocDefVar(#V,CocChrPtr(V),sizeof(V),A) #define CocDefStr(V,A) CocDefVar(#V,CocChrPtr(V),COC_CHAR,sizeof(V),A)
#define CocDefPtr(V,S) CocDefVarS(#V,#S,&V,(V!=(S *)NULL,COC_PTR)); #define CocDefArr(V,A) CocDefVar(#V,CocFltPtr(V),COC_ARRAY,sizeof(V)/sizeof(float),A)
#define CocDefStruct(V,S) CocDefVarS(#V,#S,&V,(&V!=(S *)NULL,COC_STRUCT)); #define CocDefPtr(V,S) CocDefVarS(#V,#S,&V,(V!=(S *)NULL,0,COC_PTR));
#define CocIntFld(S,V,A) CocDefVar(#S":"#V,CocIntPtr(&((S *)NULL)->V),COC_INT,A); #define CocDefStruct(V,S) CocDefVarS(#V,#S,&V,(&V!=(S *)NULL,0,COC_STRUCT));
#define CocFltFld(S,V,A) CocDefVar(#S":"#V,CocFltPtr(&((S *)NULL)->V),COC_FLT,A); #define CocIntFld(S,V,A) CocDefVar(#S":"#V,CocIntPtr(&((S *)NULL)->V),COC_INT,0,A);
#define CocStrFld(S,V,A) CocDefVar(#S":"#V,CocChrPtr(((S *)NULL)->V),sizeof(((S *)NULL)->V),A); #define CocFltFld(S,V,A) CocDefVar(#S":"#V,CocFltPtr(&((S *)NULL)->V),COC_FLT,0,A);
#define CocDefCmd(V) CocDefVar("$",V,sizeof(V),0) #define CocStrFld(S,V,A) CocDefVar(#S":"#V,CocChrPtr(((S *)NULL)->V),COC_CHAR,sizeof(((S *)NULL)->V),A);
#define CocDefStrPtr(V,S,A) CocDefVar(#V,V,S,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); #define CocAlias(A,V) CocDefVar(#A, #V, COC_ALIAS,0,0);
#define COC_RDONLY 3 #define COC_RDONLY 3
#define COC_RDWR 2 #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_DRD 4
#define COC_SHOW 5 #define COC_SHOW 5
#define COC_INT -1 #define COC_CHAR 1
#define COC_FLT -2 #define COC_INT 2
#define COC_PTR -3 #define COC_FLT 3
#define COC_STRUCT -4 #define COC_ARRAY 4
#define COC_TYPE -5 #define COC_PTR 5
#define COC_ALIAS -6 #define COC_STRUCT 6
#define COC_TYPE 7
#define COC_ALIAS 8
int CocInitServer(void *(*setDataRtn)(void *), int port); int CocInitServer(void *(*setDataRtn)(void *), int port);

View File

@ -5,7 +5,7 @@
#include "myc_buf.h" #include "myc_buf.h"
#define COC_CMD_LEN 256 #define COC_CMD_LEN 256
#define COC_RES_LEN 8192 #define COC_RES_LEN 16384
int CocCreateSockAdr( int CocCreateSockAdr(
struct sockaddr_in *sockaddrPtr, /* Socket address */ 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 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_SEP '\0'
#define COC_DELAYED '\1' #define COC_DELAYED '\1'
#define COC_ERR '\2' #define COC_ERR '\2'

View File

@ -11,10 +11,11 @@ static Instrument list[]={
{ "TOPSI", "lnsa07.psi.ch", "TOPSI" , 1}, { "TOPSI", "lnsa07.psi.ch", "TOPSI" , 1},
{ "SANS", "lnsa10.psi.ch", "SANS" , 1}, { "SANS", "lnsa10.psi.ch", "SANS" , 1},
{ "HRPT", "lnsa11.psi.ch", "HRPT" , 1}, { "HRPT", "lnsa11.psi.ch", "HRPT" , 1},
{ "TASP", "lnsa12.psi.ch", "TASP" , 1},
{ "TRICS", "lnsa18.psi.ch", "TRICS" , 1}, { "TRICS", "lnsa18.psi.ch", "TRICS" , 1},
{ "AMOR", "lnsa14.psi.ch", "AMOR" , 1}, { "AMOR", "lnsa14.psi.ch", "AMOR" , 1},
{ "FOCUS", "lnsa16.psi.ch", "FOCUS" , 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}, { "RITA", "lnsa08.psi.ch", NULL , 0},
{ "PREP", "lnsa01.psi.ch", NULL , 0}, { "PREP", "lnsa01.psi.ch", NULL , 0},
{ "TEST", "lnsa15.psi.ch", "lnslib", 2} { "TEST", "lnsa15.psi.ch", "lnslib", 2}
@ -68,8 +69,6 @@ int InstrHost(char *input, char *instr, char *host, char *user, char *pcod
#ifdef __VMS #ifdef __VMS
#define instr_host_ instr_host #define instr_host_ instr_host
#elif defined __linux
#define instr_host_ instr_host__
#endif #endif
int instr_host_(F_CHAR(input), F_CHAR(instr), F_CHAR(host), F_CHAR(user), F_CHAR(pcod) 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->wrpos=l;
buf->dsize=buf->wrpos; 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 StrPut(StrBuf *buf, const char *str, int sep);
int StrPutInt(StrBuf *buf, int val, int sep); int StrPutInt(StrBuf *buf, int val, int sep);
int StrPutFloat(StrBuf *buf, float 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. 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) #define StrGet(BUF,RES,SEP) StrNGet(BUF,RES,sizeof(RES),SEP)
int StrGetInt(StrBuf *buf, int *res, int sep); int StrGetInt(StrBuf *buf, int *res, int sep);
int StrGetFloat(StrBuf *buf, float *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) #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_msg_ err_msg
#define err_set_outrtn_ err_set_outrtn #define err_set_outrtn_ err_set_outrtn
#define err_short_ err_short #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 #endif
void err_show_(F_CHAR(text), int text_len) { void err_show_(F_CHAR(text), int text_len) {

View File

@ -24,8 +24,8 @@
typedef struct { short size, dummy; char *text; } SysVmsChar; typedef struct { short size, dummy; char *text; } SysVmsChar;
#define F_CHAR(VAR) SysVmsChar *VAR##_desc #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_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##_len=DST##_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 */ 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_date_ tecs_date
#define tecs_time_ tecs_time #define tecs_time_ tecs_time
#define tecs_rights_ tecs_rights #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 #endif
static pTecsClient conn=NULL; static pTecsClient conn=NULL;
@ -271,82 +255,13 @@ int tecs_watch_log_(F_CHAR(list), int list_len) {
OnError: return(-1); 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 int tecs_get_data_(F_CHAR(names), int *startTime, int *endTime, int *step, int *tbase
, float xdata[], float ydata[], int *maxLen, int *width , float xdata[], float ydata[], int *maxLen, int *width
, int retLen[], int names_len) { , int retLen[], int names_len) {
char nam[64]; char nam[64];
char str[128]; char str[128];
char res[COC_RES_LEN]; float offset, fact, *py, data[8192];
char *cod; int i, j, k, l, iret;
float offset, fact, *py;
int i, j, k, l, iret, retSize;
if (*endTime - *startTime > *step * (*maxLen-1)) { if (*endTime - *startTime > *step * (*maxLen-1)) {
printf("maxLen too small\n"); 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); sprintf(str, "%d %d %d %s", *startTime, *endTime, *step, nam);
CocReset(conn); CocReset(conn);
ERR_I(CocPutStr(conn, "pltdata", str)); ERR_I(CocPutStr(conn, "grapar", str));
ERR_I(CocGetStr(conn, "pltdata", res, sizeof(res))); ERR_I(CocGetArray(conn, "gradata", data, sizeof(data)/sizeof(float)));
ERR_I(iret=CocDoIt(conn, response, sizeof(response))); ERR_I(iret=CocDoIt(conn, response, sizeof(response)));
if (iret) ERR_MSG(response); if (iret) ERR_MSG(response);
cod=res; py=data;
for (i=0; i < *width; i++) { for (i=0; i < *width; i++) {
py = ydata + i * *maxLen; l=*py; py++;
ERR_I(l=DataDecode(py, *maxLen, cod, retLen+i)); if (l>0) {
if (retLen[i]>0) { fact = (float)(*endTime - *startTime) / l;
fact = (float)(*endTime - *startTime) / retLen[i];
} }
offset = *startTime - *tbase; offset = *startTime - *tbase;
k = i * *maxLen; k = i * *maxLen;
for (j=0; j<retLen[i]; j++) { for (j=0; j<l; j++) {
if (py[j] != DATA_GAP) { if (py[j] != DATA_GAP) {
ydata[k] = py[j]; ydata[k] = py[j];
xdata[k] = offset + j * fact; xdata[k] = offset + j * fact;
k++; k++;
} }
} }
py+=l;
retLen[i] = k - i * *maxLen; retLen[i] = k - i * *maxLen;
cod+=l;
} }
return 0; return 0;
OnError: OnError:
return -1; return -1;
} }
/* /*
float tecs_date_(time_t *time) { float tecs_date_(time_t *time) {
struct tm tim; struct tm tim;

View File

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

View File

@ -443,61 +443,18 @@ void Load(Base *base, int from, int to, int stdStep) {
} }
} }
static char *encode=DATA_CODE; int DataGetMult(char *names, int startTime, int endTime, int step, int stdStep, float *data, int data_len) {
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) {
Base base; Base base;
Set *set, *s; Set *set, *s;
int stp, minStep, period, s1; int stp, minStep, period, s1;
char *nams, nam[32]; char *nams, nam[32];
int p, l, n, i, j, siz1, siz2, halfsiz, start; int p, l, n, i, j, siz1, siz2, halfsiz, start;
float data[SET_LEN];
base.head = NULL; base.head = NULL;
period = endTime - startTime; period = endTime - startTime;
if (period<=0) period=1;
n=0; nams = names; n=0; nams = names;
while (nams != NULL) { while (nams != NULL) { /* count names */
nams = str_split(nam, nams, ' '); nams = str_split(nam, nams, ' ');
if (nam[0] != '\0') n++; if (nam[0] != '\0') n++;
} }
@ -505,7 +462,7 @@ int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep,
stp=step; stp=step;
if (stp<stdStep) stp=stdStep; if (stp<stdStep) stp=stdStep;
nams=names; nams=names;
while (nams!=NULL) { while (nams!=NULL) { /* create sets for data not in memory */
nams=str_split(nam, nams, ' '); nams=str_split(nam, nams, ' ');
if (nam[0]!='\0') { if (nam[0]!='\0') {
set=FindSet(&database, nam); 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); Load(&base, startTime, endTime, stdStep);
} }
p=0; p=0;
nams=names; nams=names;
coded[0]='\0';
while (nams!=NULL) { while (nams!=NULL) {
nams=str_split(nam, nams, ' '); nams=str_split(nam, nams, ' ');
if (nam[0]!='\0') { if (nam[0]!='\0') {
@ -550,9 +506,8 @@ int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep,
} }
} }
} }
if (s1 == 0) { if (s1 == 0) { /* empty array */
data[0]=DATA_UNDEF; data[p++]=0;
ERR_I(l=DataEncode(data, 1, coded+p, codedLen-p));
} else { } else {
minStep = s->step; minStep = s->step;
stp = 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 (startTime + minStep * halfsiz * 2 > endTime) {
if (stp < minStep) stp = minStep; if (stp < minStep) stp = minStep;
halfsiz = period / (2 * stp) + 1; halfsiz = period / (2 * stp) + 1;
if (halfsiz * 2 > SET_LEN) halfsiz = SET_LEN / 2; if (halfsiz * 2 + n > data_len) { /* check if enough space */
if (halfsiz * 4 + 32 * n > codedLen) { halfsiz = ((data_len - p) / n - 1) / 2;
halfsiz = ((codedLen - p) / n - 32) / 4;
} }
} }
siz1 = (s1 - startTime) * halfsiz / period * 2; siz1 = (s1 - startTime) * halfsiz / period * 2;
siz2 = halfsiz * 2 - siz1; siz2 = halfsiz * 2 - siz1;
s1 = startTime + (siz1 * period + halfsiz) / halfsiz / 2; s1 = startTime + (siz1 * period + halfsiz) / halfsiz / 2;
p++;
if (siz1 > 0) { if (siz1 > 0) {
halfsiz = (s1 - startTime) / set->step / 2; halfsiz = (s1 - startTime) / set->step / 2;
if (halfsiz * 2 < siz1 && halfsiz > 0) { 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; j = siz1 - 1;
for (i = halfsiz * 2-1; i >= 0; i--) { /* expand data */ for (i = halfsiz * 2-1; i >= 0; i--) { /* expand data */
while (j > siz1 / 2 * i / halfsiz) { 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 { } 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) { 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--; n--;
} }
} }
FreeBase(&base); FreeBase(&base);
return (0); return p;
OnError: 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 put all variables in a set to their dataset
*/ */
int DataDecode(float *data, int dataSize, char *coded, int *retLen); int DataGetMult(char *names, int startTime, int endTime, int step, int stdStep, float *data, int data_len);
int DataGetCoded(char *names, int startTime, int endTime, int step, int stdStep, char *coded, int codedLen); /*
get multiple datasets
*/
/* /*
define DATA_UNDEF as a binary and decimal well defined, hopefully rarely used number define DATA_UNDEF as a binary and decimal well defined, hopefully rarely used number
*/ */
#define DATA_UNDEF MYC_NAN #define DATA_UNDEF MYC_NAN
#define DATA_GAP (MYC_NAN*2) #define DATA_GAP (MYC_NAN*2)
#define DATA_CODE "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz"
#endif /* TECS_DATA_H_ */ #endif /* TECS_DATA_H_ */

View File

@ -2,7 +2,7 @@ subroutine tecs_plot(auxpar)
character(len=*) 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 :: minRange=60, maxRange=7*24*3600
integer, parameter :: oneDay = 24*3600 integer, parameter :: oneDay = 24*3600
integer, parameter :: zoom=1, right=2, live=3 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 l,j,i,n,t,leng,i1,i2,rl,startday,thisday
integer ncol, nset, mode integer ncol, nset, mode
integer first,last,step,tbase,lastj 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 color(nmax)
integer retLen(nmax) integer retLen(nmax)
integer sel/0/, sel1, sel2, auxsel/1/ integer sel/0/, sel1, sel2, auxsel/1/
@ -36,7 +36,7 @@ subroutine tecs_plot(auxpar)
,'q' ,'quit'/ ,'q' ,'quit'/
character weekdays(7)*4/'Mon','Tue','Wed','Thu','Fri','Sat','Sun'/ 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 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=4) apar(amax)/'P', 'He', 'Aux'/
character(len=16) parnam(nmax) character(len=16) parnam(nmax)
logical gap, done logical gap, done
@ -44,7 +44,7 @@ subroutine tecs_plot(auxpar)
integer iret, lund, numl, mon, day integer iret, lund, numl, mon, day
! functions ! 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./ data window/0./
@ -74,6 +74,7 @@ subroutine tecs_plot(auxpar)
endif endif
call pgask(.false.) call pgask(.false.)
call pgupdt
l=0 l=0
x1=0 x1=0
step=0 step=0
@ -92,7 +93,7 @@ subroutine tecs_plot(auxpar)
pars=trim(pars)//' '//parnam(nset) pars=trim(pars)//' '//parnam(nset)
enddo enddo
nset=nset+1 nset=nset+1
color(nset)=colorList(5) color(nset)=colorList(3)
parnam(nset)=apar(auxsel) parnam(nset)=apar(auxsel)
pars=trim(pars)//' '//parnam(nset) pars=trim(pars)//' '//parnam(nset)
@ -104,23 +105,34 @@ subroutine tecs_plot(auxpar)
window=maxRange window=maxRange
first=t-min(dmax*step-1,maxRange-step) first=t-min(dmax*step-1,maxRange-step)
else if (mode >= right) then else if (mode >= right) then
step=window/(dmax-1)+0.99 step=window/(dmax-2)+0.99
last=t last=t
first=t-min(dmax*step-1,nint(window)-step) first=t-min(dmax*step-1,nint(window))
else else
if (mode==zoom) then if (mode==zoom) then
x2=(x1+x2+window)/2 x2=(x1+x2+window)/2
x1=x2-window x1=x2-window
endif endif
if (x1 .gt. x2-minRange) x1=x2-minRange if (x1 .gt. x2-minRange) x1=x2-minRange
step=(x2-x1)/(dmax-1)+0.99 step=(x2-x1)/(dmax-2)+0.99
last=nint(x2)+tbase last=x2+tbase
first=nint(x1)+tbase first=x1-step+tbase
endif endif
if (step == 0) step=1 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) 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 if (iret < 0) goto 99
x2 = last - tbase x2 = last - tbase
@ -216,6 +228,7 @@ subroutine tecs_plot(auxpar)
do i=i1,i2 do i=i1,i2
call pgsci(color(i)) call pgsci(color(i))
l=0
lastj=1 lastj=1
do j=1,retLen(i) do j=1,retLen(i)
if (yd(j,i)==undef) then if (yd(j,i)==undef) then
@ -223,9 +236,12 @@ subroutine tecs_plot(auxpar)
call pgline(j-lastj, xd(lastj,i), yd(lastj,i)) call pgline(j-lastj, xd(lastj,i), yd(lastj,i))
endif endif
lastj=j+1 lastj=j+1
else
l=j
endif endif
enddo enddo
if (retLen(i) > lastj) call pgline(retLen(i)+1-lastj, xd(lastj,i), yd(lastj,i)) if (retLen(i) > lastj) call pgline(retLen(i)+1-lastj, xd(lastj,i), yd(lastj,i))
retLen(i)=l
enddo enddo
call pgsci(1) call pgsci(1)
if (rl == 1) then if (rl == 1) then
@ -635,3 +651,42 @@ subroutine set_win(rl, x1, x2, y1, y2)
call pgswin(x1,x2,y1,y2) call pgswin(x1,x2,y1,y2)
end subroutine 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) { if (iret==1) {
iret=AsynSrv_Config(&aser->asyn_info, "msecTmo", msecTmo, "idleHdl", idleHdl, NULL); iret=AsynSrv_Config(&aser->asyn_info, "msecTmo", msecTmo, "idleHdl", idleHdl, NULL);
} }
if (iret!=1) { if (iret!=1) { SerA_error(); goto OnError; }
SerA_error();
goto OnError;
}
time(&t2); time(&t2);
ecnt=0; ecnt=0;
logfileOut(LOG_MAIN, "connection to %s:%d/%d opened (%d sec)\n", 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_I(CocCreateSockAdr(&sadr, host, atoi(p)));
ERR_SI(tser->fd=socket(AF_INET, SOCK_STREAM, 0)); 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))); ERR_SI(connect(tser->fd, (struct sockaddr *)&sadr, sizeof(sadr)));
time(&t2); time(&t2);
ecnt=0; ecnt=0;
@ -121,6 +114,23 @@ SerChannel *SerOpen(const char *hostPort, int msecTmo, int (*idleHdl)(int,int))
return(NULL); 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) { void SerClose(SerChannel *serch) {
AsynSrvChan *aser; AsynSrvChan *aser;
TermSrvChan *tser; TermSrvChan *tser;

View File

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