*** empty log message ***
This commit is contained in:
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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'
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
|
@ -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) {
|
||||
|
@ -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 */
|
||||
|
||||
|
714
tecs/tecs.c
714
tecs/tecs.c
File diff suppressed because it is too large
Load Diff
107
tecs/tecs_cli.c
107
tecs/tecs_cli.c
@ -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;
|
||||
|
@ -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'
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user