mirror of
https://github.com/eddyem/tsys01.git
synced 2026-01-31 20:35:04 +03:00
add working through CAN-to-socket proxy
This commit is contained in:
parent
13de663270
commit
7344a6a332
@ -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)
|
||||
## 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!)
|
||||
- **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
|
||||
|
||||
@ -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
|
||||
};
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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()");
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user