*** 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
|
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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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'
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
|
||||||
/*------------------------------------------------------------------------
|
/*------------------------------------------------------------------------
|
||||||
|
@ -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) {
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
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_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;
|
||||||
|
@ -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'
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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_ */
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user