diff --git a/src/netdaemon/Commands_list b/src/netdaemon/Commands_list index e13169b..2b2cc4a 100644 --- a/src/netdaemon/Commands_list +++ b/src/netdaemon/Commands_list @@ -1,26 +1,30 @@ -### Serial interface commands (ends with '\n'), small letter for only -local processing: -- **0...7** send message to Nth controller, not broadcast (after numb -er should be CAN command) -- **a** get raw ADC values -- **B** send dummy CAN messages to broadcast address -- **c** show coefficients for all thermosensors -- **D** send dummy CAN messages to master (0) address +## Serial interface commands (ends with '\n'), small letter for only local processing: +- **0...7** send message to Nth controller, not broadcast (after number should be CAN command) +- **@** set/reset debug mode +- **a** get raw ADC values +- **B** send dummy CAN messages to broadcast address +- **b** get/set CAN bus baudrate +- **c** show coefficients for all thermosensors +- **D** send dummy CAN messages to master (0) address +- **d** get current CAN address of device - **Ee** end temperature scan - **Ff** turn sensors off -- **g** get last CAN address +- **g** group (sniffer) CAN mode (print to USB terminal all incoming CAN messages with alien IDs) - **Hh** switch I2C to high speed (100kHz) -- **i** reinit CAN with new address (if changed) +- **Ii** (re)init sensors - **Jj** get MCU temperature - **Kk** get values of U and I - **Ll** switch I2C to low speed (default, 10kHz) - **Mm** change master id to 0 (**m**) / broadcast (**M**) -- **Oo** turn onboard diagnostic LEDs **O**n or **o**ff (both commands - are local!) -- **P** ping everyone over CAN +- **N** get build number +- **Oo** turn onboard diagnostic LEDs **O**n or **o**ff (both commands are local!) +- **P** ping everyone over CAN +- **Qq** get system time - **Rr** reinit I2C -- **Ss** start temperature scan +- **s** send CAN message (format: ID data[0..8], dec, 0x - hex, 0b - binary) - **Tt** start single temperature measurement -- **u** check CAN bus status for errors +- **u** unique ID (default) CAN mode - **Vv** very low speed -- **Z** get sensors state over CAN +- **Xx** go into temperature scan mode +- **Yy** get sensors state over CAN (data format: 3 - state, 4,5 - presense mask [0,1], 6 - npresent, 7 - ntempmeasured +- **z** check CAN status for errors diff --git a/src/netdaemon/cmdlnopts.c b/src/netdaemon/cmdlnopts.c index 92669cf..bba4083 100644 --- a/src/netdaemon/cmdlnopts.c +++ b/src/netdaemon/cmdlnopts.c @@ -62,6 +62,7 @@ static myoption cmdlnopts[] = { {"testadjfile",NO_ARGS, NULL, 'T', arg_int, APTR(&G.testadjfile),_("test format of file with T adjustements")}, {"adjname", NEED_ARG, NULL, 'N', arg_string, APTR(&G.adjfilename),_("name of adjustements file (default: tempadj.txt)")}, {"pidfile", NEED_ARG, NULL, 'P', arg_string, APTR(&G.pidfilename),_("name of PID file (default: " DEFAULT_PIDFILE ")")}, + {"verbose", NO_ARGS, NULL, 'v', arg_none, APTR(&G.verblevel), _("increase log file verbose level (default: warn)")}, //{"dumpoff", NO_ARGS, NULL, 'd', arg_string, APTR(&G.dumpoff), _("dump sensors data & turn all OFF until next request")}, end_option }; diff --git a/src/netdaemon/cmdlnopts.h b/src/netdaemon/cmdlnopts.h index f1b295a..4b75a3a 100644 --- a/src/netdaemon/cmdlnopts.h +++ b/src/netdaemon/cmdlnopts.h @@ -27,17 +27,16 @@ * here are some typedef's for global data */ typedef struct{ - char *sockname; // server's UNIX socket name - char *port; // port to connect - //int terminal; // run as terminal - char *savepath; // path where data & graphical files would be saved int makegraphs; // ==1 to make graphics with gnuplot int rest_pars_num; // number of rest parameters - char** rest_pars; // the rest parameters: array of char* (path to logfile and thrash) int testadjfile; // test format of file with adjustments + int verblevel; // increase log file verbose level (default: warn) + char *sockname; // server's UNIX socket name + char *port; // port to connect + char *savepath; // path where data & graphical files would be saved char *adjfilename; // name of adjustements file char *pidfilename; // name of PID file - //int dumpoff; // dump sensors data & turn all OFF until next request + char **rest_pars; // the rest parameters: array of char* (path to logfile and thrash) } glob_pars; diff --git a/src/netdaemon/main.c b/src/netdaemon/main.c index c14369e..41205f8 100644 --- a/src/netdaemon/main.c +++ b/src/netdaemon/main.c @@ -93,8 +93,11 @@ int main(int argc, char **argv){ } return 1; } - if(G->rest_pars_num) - OPENLOG(G->rest_pars[0], LOGLEVEL_DBG, 1); + if(G->rest_pars_num){ + sl_loglevel loglevel = LOGLEVEL_WARN + G->verblevel; // default log level + if(loglevel > LOGLEVEL_ANY) loglevel = LOGLEVEL_ANY; + OPENLOG(G->rest_pars[0], loglevel, 1); + } // ignore almost all possible signals for(int sig = 0; sig < 256; ++sig) signal(sig, repsig); signal(SIGTERM, signals); // kill (-15) - quit @@ -106,9 +109,9 @@ int main(int argc, char **argv){ signal(SIGUSR1, refreshAdj); // refresh adjustements signal(SIGUSR2, logT); // print all current temperatures into logfile and turn off sensors #ifndef EBUG - if(daemon(1, 0)){ + /* if(daemon(1, 0)){ ERR("daemon()"); - } + }*/ while(1){ // guard for dead processes childpid = fork(); if(childpid){ @@ -124,7 +127,7 @@ int main(int argc, char **argv){ } #endif DBG("sockname: %s", G->sockname); - if(!try_connect(G->sockname)) ERR("Can't connect to UNIX socket"); + if(!try_connect(G->sockname)) ERRX("Can't connect to UNIX socket"); if(check_sensors()){ LOGWARN("No CAN-controllers detected"); if(!poll_sensors(0)){ // there's not main controller connected to given terminal diff --git a/src/netdaemon/socket.c b/src/netdaemon/socket.c index 30143b1..1f4c4b3 100644 --- a/src/netdaemon/socket.c +++ b/src/netdaemon/socket.c @@ -326,16 +326,23 @@ static void process_T(){ // calculate mean double Tmed = quick_select(arr, Num); double Tbot = Tmed - 10., Ttop = Tmed + 10.; - DBG("Got %d values, Tmed=%g", Num, Tmed); + DBG("Got %d values, Tmed=%g, tmeasmax=%zd", Num, Tmed, tmeasmax); // throw out all more than +-10degrC and calculate meanT Num = 0; double Tsum = 0.; + // remove bad/old values of N2 controller + for(p = 0; p < 2; ++p) for(N = 0; N <= NCHANNEL_MAX; ++N){ + if(tmeasmax - tmeasured[p][N][0] > OLDESTTM){ // not longer than 3 minutes ago! + t_last[p][N][0] = -300.; + } + } for(i = 1; i <= NCTRLR_MAX; ++i){ for(p = 0; p < 2; ++p) for(N = 0; N <= NCHANNEL_MAX; ++N){ double T = t_last[p][N][i]; - if(T > Ttop || T < Tbot || tmeasmax - tmeasured[p][N][i] > 1800){ // not longer than 3 minutes ago! + if(T > Ttop || T < Tbot || tmeasmax - tmeasured[p][N][i] > OLDESTTM){ // not longer than 3 minutes ago! t_last[p][N][i] = -300.; }else{ + DBG("t_last[%d][%d][%d]=%.1f, measuredt=%zd", p, N, i, T, tmeasured[p][N][i]); ++Num; Tsum += T; Tmean[p][N][i] += T; ++Nmean[p][N][i]; @@ -371,6 +378,7 @@ static void daemon_(int sock){ ERR("pthread_create()"); } double tgot = 0.;//, tlastoff = dtime(); + char bufs[3][BUFLEN]; // temporary buffers: T0, T1, T2 do{ if(pthread_kill(sock_thread, 0) == ESRCH){ // died WARNX("Sockets thread died"); @@ -383,17 +391,13 @@ static void daemon_(int sock){ if(TurnOff){ TurnOff = FALSE; turn_all_off(); - //tlastoff = dtime(); - }/* - if(dtime() - tlastoff > T_OFF_INTERVAL){ - turn_all_off(); - tlastoff = dtime(); - }*/ + } if(dtime() - tgot < T_INTERVAL) continue; // get data int i; - char bufs[3][BUFLEN]; // temporary buffers: T0, T1, T2 - char *ptrs[3] = {bufs[0], bufs[1], bufs[2]}; + char *bptrs[3] = {bufs[0], bufs[1], bufs[2]}; + bzero(bufs, sizeof(bufs)); + DBG("STARTING vals: BUF0:\n%s\nBUF1:\n%s\nBUF2:\n%s", bufs[0],bufs[1],bufs[2]); size_t lens[3] = {BUFLEN, BUFLEN, BUFLEN}; // free space tgot = dtime(); process_T(); // get new temperatures & throw out bad results @@ -403,18 +407,18 @@ static void daemon_(int sock){ double T = t_last[p][N][i]; char **buf; size_t *len; - //DBG("T%d [%d][%d] = %g",i, p,N,T); if(T > -100. && T < 100.){ // fill buffer + DBG("T%d [%d][%d] = %g",i, p,N,T); size_t l; if(i == 0){ - buf = &ptrs[2]; len = &lens[2]; + buf = &bptrs[2]; len = &lens[2]; // Nsens Npair T time l = snprintf(*buf, *len, "%d\t%d\t%.2f\t%ld\n", N, p, T, tmeasured[p][N][i]); }else{ const sensor_data *sdata = get_sensor_location(i, N, p); if(!sdata) continue; // wrong sensor number??? - buf = &ptrs[sdata->Z]; len = &lens[sdata->Z]; + buf = &bptrs[sdata->Z]; len = &lens[sdata->Z]; // iNp x y T(corrected) time l = snprintf(*buf, *len, "%d%d%d\t%d\t%d\t%.2f\t%ld\n", i, N, p, sdata->X, sdata->Y, T - sdata->dt - sdata->Tadj, tmeasured[p][N][i]); @@ -424,7 +428,7 @@ static void daemon_(int sock){ } } } - //DBG("BUF0:\n%s\nBUF1:\n%s\nBUF2:\n%s", bufs[0],bufs[1],bufs[2]); + DBG("BUF0:\n%s\nBUF1:\n%s\nBUF2:\n%s", bufs[0],bufs[1],bufs[2]); // copy temporary buffers to main pthread_mutex_lock(&mutex); memcpy(strT, bufs, sizeof(strT)); diff --git a/src/netdaemon/term.c b/src/netdaemon/term.c index 3f401be..8580424 100644 --- a/src/netdaemon/term.c +++ b/src/netdaemon/term.c @@ -102,7 +102,15 @@ int try_connect(char *path){ if(!path) return FALSE; struct sockaddr_un saddr = {0}; saddr.sun_family = AF_UNIX; - strncpy(saddr.sun_path, path, 106); // if sun_path[0] == 0 we don't create a file + if(*path == 0){ // if sun_path[0] == 0 then don't create a file + DBG("convert name"); + saddr.sun_path[0] = 0; + strncpy(saddr.sun_path+1, path+1, 106); + }else if(strncmp("\\0", path, 2) == 0){ + DBG("convert name"); + saddr.sun_path[0] = 0; + strncpy(saddr.sun_path+1, path+2, 105); + }else strncpy(saddr.sun_path, path, 107); if((sock = socket(AF_UNIX, SOCK_SEQPACKET, 0)) < 0){ // or SOCK_STREAM? WARN("socket()"); LOGERR("socket()"); diff --git a/src/netdaemon/term.h b/src/netdaemon/term.h index 5ea2f0a..42bdb43 100644 --- a/src/netdaemon/term.h +++ b/src/netdaemon/term.h @@ -30,12 +30,12 @@ #define WAIT_TMOUT (0.5) // Main controller polling timeout - 1 second #define POLLING_TMOUT (1.0) -// Thermal polling timeout: 5 seconds -#define T_POLLING_TMOUT (5.0) +// Thermal polling timeout: 1.5 seconds +#define T_POLLING_TMOUT (1.5) // T measurement time interval - 30 seconds #define T_INTERVAL (30.0) -// Interval of turning sensors off - 3 days -#define T_OFF_INTERVAL (259200.) +// interval (in seconds) to remove too old measurements (if sensor not available now) +#define OLDESTTM (180) // amount of measurement to plot mean graphs #define GRAPHS_AMOUNT (15)