diff --git a/tecs/coc_server.c b/tecs/coc_server.c index 7e3abe8..71f42b5 100644 --- a/tecs/coc_server.c +++ b/tecs/coc_server.c @@ -649,13 +649,15 @@ int CocHandleRequests(int tmo_msec, int fd) { void CocCloseServer() { CocClient *cl, *cl0; - cl=cList->next; - while (cl!=NULL) { - close(cl->fd); - cl0=cl; - cl=cl->next; - FREE(cl0); + if (cList) { + cl=cList->next; + while (cl!=NULL) { + close(cl->fd); + cl0=cl; + cl=cl->next; + FREE(cl0); + } + FREE(cList); } - FREE(cList); close(mainFd); } diff --git a/tecs/instr_hosts.c b/tecs/instr_hosts.c index 81bc539..faaa09c 100644 --- a/tecs/instr_hosts.c +++ b/tecs/instr_hosts.c @@ -11,7 +11,7 @@ static Instrument list[]={ { "DMC", "pc4629.psi.ch", 9753, "dmc" , 1}, { "MORPHEUS", "pc4120.psi.ch", 9753, "morpheus" , 1}, { "SANS", "pc4122.psi.ch", 9753, "sans" , 1}, - { "SANS2", "sans2.psi.ch", 9753, "SANS2" , 1}, + { "SANS2", "sans2.psi.ch", 9753, "sans2" , 1}, { "HRPT", "pc4630.psi.ch", 9753, "hrpt" , 1}, { "TRICS", "trics.psi.ch", 9753, "trics" , 1}, { "AMOR", "amor.psi.ch", 9753, "amor" , 1}, diff --git a/tecs/make_gen b/tecs/make_gen index b06a83a..f4297b2 100644 --- a/tecs/make_gen +++ b/tecs/make_gen @@ -10,7 +10,7 @@ LIBR_OBJ =coc_util.o myc_err.o myc_str.o myc_buf.o myc_time.o SERV_OBJ =tecs.o coc_server.o tecs_lsc.o tecs_serial.o coc_logfile.o \ - tecs_data.o $(LIBR_OBJ) + tecs_data.o logger_tecs.o $(LIBR_OBJ) CLI_OBJ =tecs_cli.o coc_client.o $(LIBR_OBJ) TCLI_OBJ =sys_getenv.o sys_env.o myc_tmp.o sys_cmdpar.o \ sys_date.o sys_wait.o sys_lun.o sys_rdline.o \ @@ -71,6 +71,9 @@ keep_running: keep_running.c six: six.c term.o sys_select.o libtecsl.a $(CC) $(CFLAGS) -o $@ $Q $(FORTIFYOBJ) +tt: tt.c term.o sys_select.o libtecsl.a + $(CC) $(CFLAGS) -o $@ $Q $(FORTIFYOBJ) + rexstart: rstart.c myc_str.o myc_err.o instr_hosts.o $(CC) $(CFLAGS) -o $@ $Q $(FORTIFYOBJ) @ echo "$(PWD)/rstart" diff --git a/tecs/myc_time.c b/tecs/myc_time.c index 867d096..ee62645 100644 --- a/tecs/myc_time.c +++ b/tecs/myc_time.c @@ -35,6 +35,10 @@ int mycNow(void) { return (int)(now-my_base); } +time_t mycUnixTime(int myTime) { + return myTime+my_base; +} + int mycMsecSince(int since) { #if __VMS struct timeb now; diff --git a/tecs/myc_time.h b/tecs/myc_time.h index f9f5c70..1dc1e74 100644 --- a/tecs/myc_time.h +++ b/tecs/myc_time.h @@ -29,6 +29,8 @@ int mycTime(int date); if day, month or year is undefined (zero) */ +time_t mycUnixTime(int myTime); + /* the following subroutines are to be called from FORTRAN integer function myc_now() diff --git a/tecs/sys_select.c b/tecs/sys_select.c index 3298978..0d60d92 100644 --- a/tecs/sys_select.c +++ b/tecs/sys_select.c @@ -34,7 +34,7 @@ void sys_keys_off(void) { } } -int sys_select_or_key(fd_set *mask, int msecTmo, char *key) { +int sys_select_or_key(fd_set *mask, int msecTmo, int *key) { int fd, iret, fd1, chr; struct timeval tmo, tmo0={0,0}; fd_set rmask; diff --git a/tecs/sys_select.h b/tecs/sys_select.h index 645532b..051350d 100644 --- a/tecs/sys_select.h +++ b/tecs/sys_select.h @@ -3,7 +3,7 @@ #include -int sys_select_or_key(fd_set *mask, int msecTmo, char *key); +int sys_select_or_key(fd_set *mask, int msecTmo, int *key); /* wait for read event on sockets included in mask or from keyboard or a timeout result is negative for timeout, diff --git a/tecs/tecs.c b/tecs/tecs.c index 5e38e2b..aff78a3 100644 --- a/tecs/tecs.c +++ b/tecs/tecs.c @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include #include "myc_mem.h" #include "myc_err.h" #include "coc_util.h" @@ -14,6 +17,7 @@ #include "myc_time.h" #include "tecs_lsc.h" #include "tecs_data.h" +#include "logger.h" /* --- non ANSI signal --- */ #ifndef SIGPIPE @@ -170,7 +174,7 @@ static int lockAlarm, cntError; -int tim, rdTim; /* actual time, read Time */ +static int tim, rdTim; /* actual time, read Time */ static int decod[8]={21,20,17,16,5,4,1,0}; /* for code conversion */ @@ -2840,6 +2844,7 @@ int main(int argc, char *argv[]) { int i, iret; char *inistr; char buf[256], opt; + char loggerDir[256]; signal(SIGPIPE, ignore_forever); @@ -3060,8 +3065,18 @@ int main(int argc, char *argv[]) { str_copy(statusBuf, "starting up"); logfileStatusBuf(statusBuf); - str_copy(buf, logDir); - str_append(buf, serverId); + if (logDir[0] == '/') { + str_copy(buf, logDir); + } else { + getcwd(buf, sizeof buf); + str_append(buf, "/"); + ERR_I(str_append(buf, logDir)); + } + ERR_I(str_append(buf, serverId)); + ERR_I(str_copy(loggerDir, buf)); + mkdir(loggerDir, S_IRWXU+S_IRGRP+S_IXGRP+S_IROTH+S_IXOTH); + /* do not check return value */ + LoggerSetDir(loggerDir); logfile=logfileInit(buf, logIt, use_stdout, logIt && use_stdout); CocDefStr(logfile, RD); logfileOut(LOG_MAIN ,"\n"); diff --git a/tecs/tecs_data.c b/tecs/tecs_data.c index 13f2e89..192c016 100644 --- a/tecs/tecs_data.c +++ b/tecs/tecs_data.c @@ -8,6 +8,7 @@ #include "myc_time.h" #include "coc_logfile.h" #include "tecs_data.h" +#include "logger.h" #define RUN_SIZE 1024 #define SET_LEN 1024 @@ -34,6 +35,7 @@ typedef struct _Set { float *var; Run *runs; Summary sum; + Logger *log; } Set; typedef struct { @@ -125,6 +127,7 @@ Set *CreateSet(Base *base, char *name, float *var, int step, int lifetime, int s s->start = start; s->step = step; s->var = var; + s->log = LoggerMake(name, step); ResetSum(&s->sum); return s; OnError: @@ -267,7 +270,8 @@ int DataPut(DataSet *set, int time, float value) { int DataPutAll(DataBase *base, int time) { Set *s; - + char value[32]; + if (base == NULL) { s=database.head; } else { @@ -276,6 +280,10 @@ int DataPutAll(DataBase *base, int time) { while (s!=NULL) { if (s->var!=NULL) { ERR_I(Put(s, time, *s->var)); + if (s->log != NULL) { + snprintf(value, sizeof value, "%f", *s->var); + LoggerWrite(s->log, mycUnixTime(time), s->step, value); + } } s=s->next; } diff --git a/tecs/term.h b/tecs/term.h index 5d74610..93abddf 100644 --- a/tecs/term.h +++ b/tecs/term.h @@ -9,7 +9,7 @@ void term_reg_socket(int socket); void term_unr_socket(int socket); /* unregister socket */ -int term_raw_key(char *key, int msecTmo); +int term_raw_key(int *key, int msecTmo); int term_wait_socket(int socket, int msecTmo); /* wait for a read event on socket or timeout @@ -18,14 +18,14 @@ int term_wait_socket(int socket, int msecTmo); or 0 for timeout */ -int term_get_key(char *key, int msecTmo); +int term_get_key(int *key, int msecTmo); void term_clear(void); int term_get_line(char *buf, int size, int *pos, char *prompt, fd_set *mask); -FILE *term_open_pref(char *head, char *mode); -/* open a user specific preferences file */ +FILE *term_open_pref(int temp, char *head, char *mode); +/* open a user specific preferences or temporary file */ char *term_fgets(char *buf, int size, FILE *fil); /* fgets without newline */ @@ -38,4 +38,12 @@ void term_save_hist(int trimlast); void term_off(void); +void term_define_key(char *cmd, int keyArg); + +void term_save_keys(FILE *fil, void (*out)(char *)); +/* save keys on file */ + +void term_load_keys(FILE *fil, void (*out)(char *)); +/* load keys on file */ + #endif /* TERM_H_ */