diff --git a/BTA_modbusmeteo/Makefile b/BTA_modbusmeteo/Makefile index 0fd0569..158228e 100644 --- a/BTA_modbusmeteo/Makefile +++ b/BTA_modbusmeteo/Makefile @@ -3,7 +3,7 @@ LDFLAGS = -lcrypt SRCS = $(wildcard *.c) CC = gcc DEFINES = -D_XOPEN_SOURCE=1111 -D_GNU_SOURCE -DEFINES += -DEBUG +#DEFINES += -DEBUG CXX = gcc CFLAGS = -std=gnu99 -Wall -Werror -Wextra $(DEFINES) -pthread OBJS = $(SRCS:.c=.o) diff --git a/BTA_modbusmeteo/bta_meteo_modbus.c b/BTA_modbusmeteo/bta_meteo_modbus.c index c2068f3..4d17cd5 100644 --- a/BTA_modbusmeteo/bta_meteo_modbus.c +++ b/BTA_modbusmeteo/bta_meteo_modbus.c @@ -82,12 +82,18 @@ static int crc_check(uint8_t *buffer, int length){ uint8_t byte; uint16_t crc = 0xFFFF; int valid_crc; + #ifdef EBUG + printf("buffer: "); + for(int i = 0; i < length; ++i) printf("%02x ", buffer[i]); + printf("\n"); + #endif while (length-- > 2) { byte = *buffer++ ^ crc; crc >>= 8; crc ^= crc16_table[byte]; } valid_crc = (crc >> 8) == buffer[1] && (crc & 0xFF) == buffer[0]; + DBG("CRC %s", valid_crc ? "OK" : "bad"); return valid_crc; } @@ -155,11 +161,15 @@ params_ans check_meteo_params(){ timeout.tv_sec = 0; timeout.tv_usec = 1500; // 1.5ms pause - if((res = select(portfd + 1, &set, NULL, NULL, &timeout)) < 0 && errno != EINTR) + if((res = select(portfd + 1, &set, NULL, NULL, &timeout)) < 0 && errno != EINTR){ + WARN("lost connection (select)"); return ANS_LOSTCONN; + } if(res > 0){ - if ((n_bytes = read(portfd, buffer + size, MODBUS_MAX_PACKET_SIZE - size)) < 0) + if ((n_bytes = read(portfd, buffer + size, MODBUS_MAX_PACKET_SIZE - size)) < 0){ + WARN("lost connection (read)"); return ANS_LOSTCONN; + } size += n_bytes; if(n_bytes) continue; } @@ -176,9 +186,9 @@ params_ans check_meteo_params(){ DBG("wind speed"); meteoflags |= WSFLAG; if(gotsegm && !(MeteoMode & INPUT_WND)){ // not entered by hands - DBG("oldvnd"); val_Wnd = f; - MeteoMode |= (SENSOR_WND|NET_WND); + MeteoMode &= ~NET_WND; + MeteoMode |= SENSOR_WND; } break; case REG_WDIR: @@ -190,7 +200,8 @@ params_ans check_meteo_params(){ meteoflags |= TFLAG; if(gotsegm && !(MeteoMode & INPUT_T1)){ val_T1 = f; - MeteoMode |= (SENSOR_WND|NET_WND); + MeteoMode &= ~NET_T1; + MeteoMode |= SENSOR_T1; } break; case REG_HUM: @@ -198,7 +209,8 @@ params_ans check_meteo_params(){ meteoflags |= HFLAG; if(gotsegm && !(MeteoMode & INPUT_HMD)){ val_Hmd = f; - MeteoMode |= (SENSOR_HMD|NET_HMD); + MeteoMode &= ~NET_HMD; + MeteoMode |= SENSOR_HMD; } break; case REG_DEW: @@ -210,7 +222,8 @@ params_ans check_meteo_params(){ meteoflags |= PFLAG; if(gotsegm && !(MeteoMode & INPUT_B)){ val_B = f; - MeteoMode |= (SENSOR_B|NET_B); + MeteoMode &= ~NET_B; + MeteoMode |= SENSOR_B; } break; default: diff --git a/BTA_modbusmeteo/bta_meteo_modbus.creator.user b/BTA_modbusmeteo/bta_meteo_modbus.creator.user index 4eb12ec..248e476 100644 --- a/BTA_modbusmeteo/bta_meteo_modbus.creator.user +++ b/BTA_modbusmeteo/bta_meteo_modbus.creator.user @@ -1,10 +1,10 @@ - + EnvironmentId - {7bd84e39-ca37-46d3-be9d-99ebea85bc0d} + {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} ProjectExplorer.Project.ActiveTarget @@ -37,56 +37,63 @@ true true 1 - true + false + false false - 0 + 1 true true 0 8 true - 1 + false + 2 true - false + true true - false + *.md, *.MD, Makefile + true + true ProjectExplorer.Project.PluginSettings - - true + + true + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + ProjectExplorer.Project.Target.0 + Desktop Desktop Desktop - {65a14f9e-e008-4c1b-89df-4eaa4774b6e3} + {91347f2c-5221-46a7-80b1-0a054ca02f79} 0 0 0 - /Big/Data/00-BTAmirtemp + /home/eddy/Docs/SAO/BTA/Meteostation_new/BTA_modbusmeteo all - false - - - false true - Сборка - GenericProjectManager.GenericMakeStep 1 Сборка - + Сборка ProjectExplorer.BuildSteps.Build @@ -94,24 +101,19 @@ clean - false - - - false true - Сборка - GenericProjectManager.GenericMakeStep 1 Очистка - + Очистка ProjectExplorer.BuildSteps.Clean 2 false + + false - По умолчанию По умолчанию GenericProjectManager.GenericBuildConfiguration @@ -119,38 +121,26 @@ 0 - Установка - + Развёртывание + Развёртывание ProjectExplorer.BuildSteps.Deploy 1 - Конфигурация установки - + + false ProjectExplorer.DefaultDeployConfiguration 1 - - false - false - 1000 - - true + 2 - - Особая программа - ProjectExplorer.CustomExecutableRunConfiguration - - 3768 + false true - false false true - - 1 @@ -161,10 +151,10 @@ ProjectExplorer.Project.Updater.FileVersion - 20 + 22 Version - 20 + 22 diff --git a/BTA_modbusmeteo/main.c b/BTA_modbusmeteo/main.c index ceb777e..59c9444 100644 --- a/BTA_modbusmeteo/main.c +++ b/BTA_modbusmeteo/main.c @@ -28,29 +28,9 @@ int gotsegm = 0; // used also in bta_meteo_modbus.c static pid_t childpid = 0; void clear_flags(){ - WARNX("Clear flags"); LOG("Clear flags"); if(!gotsegm) return; - if(MeteoMode & NET_HMD){ // humidity now isn't from net - MeteoMode &= ~NET_HMD; - if(MeteoMode & SENSOR_HMD) - MeteoMode &= ~SENSOR_HMD; - } - if(MeteoMode & NET_WND){ // wind - MeteoMode &= ~NET_WND; - if(MeteoMode & SENSOR_WND) - MeteoMode &= ~SENSOR_WND; - } - if(MeteoMode & NET_B){ // pressure - MeteoMode &= ~NET_B; - if(MeteoMode & SENSOR_B) - MeteoMode &= ~SENSOR_B; - } - if(MeteoMode & NET_T1){ // ext. temperature - MeteoMode &= ~NET_T1; - if(MeteoMode & SENSOR_T1) - MeteoMode &= ~SENSOR_T1; - } + MeteoMode &= ~(SENSOR_HMD | SENSOR_WND | SENSOR_B | SENSOR_T1); } void signals(int sig){ @@ -69,8 +49,8 @@ void signals(int sig){ case SIGSEGV: case SIGTERM: signal(SIGALRM, SIG_IGN); - LOG("%s - Stop!", strsignal(sig)); if(childpid){ // master process + LOG("%s - Stop!", strsignal(sig)); clear_flags(); } exit(sig); @@ -104,7 +84,7 @@ int main(int argc, char *argv[]){ LOG("create child with PID %d", childpid); wait(NULL); LOG("child %d died\n", childpid); - sleep(1); + sleep(30); }else{ prctl(PR_SET_PDEATHSIG, SIGTERM); // send SIGTERM to child when parent dies break; // go out to normal functional @@ -118,7 +98,6 @@ int main(int argc, char *argv[]){ } time_t tlast = time(NULL); - int errlogged = FALSE; while(1){ if(!gotsegm){ sdat.mode |= 0200; @@ -126,15 +105,13 @@ int main(int argc, char *argv[]){ gotsegm = get_shm_block(&sdat, ClientSide); if(!gotsegm){ LOG("Can't find SHM segment"); + signals(SIGTERM); }else get_cmd_queue(&ocmd, ClientSide); } if(time(NULL) - tlast > 60){ // no signal for 5 minutes - clear flags - if(!errlogged){ - LOG("5 minutes - no signal!"); - errlogged = TRUE; - } - tlast = time(NULL); + LOG("1 minute - no signal!"); clear_flags(); // return to Z1000 meteo + return 1; } params_ans a = check_meteo_params(); if(a == ANS_LOSTCONN){ @@ -142,7 +119,6 @@ int main(int argc, char *argv[]){ return 1; } if(a == ANS_OK){ - errlogged = FALSE; tlast = time(NULL); } } diff --git a/BTA_modbusmeteo/olddaemon/bta_meteo_can.c b/BTA_modbusmeteo/olddaemon/bta_meteo_can.c index b723e4c..44f4c38 100644 --- a/BTA_modbusmeteo/olddaemon/bta_meteo_can.c +++ b/BTA_modbusmeteo/olddaemon/bta_meteo_can.c @@ -21,6 +21,8 @@ const double zeroV = 1.0; const double scaleT = 50.0/(5.-1.); /* New: 1:5V -> -20:+30dgr */ const double zeroT2 = -19.1; /* -20.0 + 0.9 Tind (16.11.2012)*/ +#define RK_Precipitations 0x000008 /*Din RK: ( ) */ + static int stop_prog = 0; static char *myname; @@ -301,6 +303,33 @@ int main (int argc, char *argv[]) ctm=0; } tlast=t; + }else if(idr==0x21){ /* RK PEP- */ + static double off_time = 0.; + static double last_msg_time = 0.; + static char msg[30] = " ."; + static int o_rcode = 0; + rcode = ((unsigned int)rdata[0]<<16)|((unsigned int)rdata[1]<<8)|rdata[2]; + if(rcode & RK_Precipitations){ + if(o_rcode & RK_Precipitations){ // - + if(fabs(M_time-Precip_time>60.)){ // 2 + if(Tel_State!=Stopping && Dome_State!=D_Off && fabs(M_time-last_msg_time>30.)){ // + *msg = MesgFault; // + SendMessage(msg); + last_msg_time = M_time; + } + if(fabs(M_time-off_time)>3.){ // 3 + Precip_time = M_time; /* */ + } + } + }else{ // + if(fabs(M_time-last_msg_time>600.)){ // 10 + *msg = MesgWarn; + SendMessage(msg); + last_msg_time = M_time; + } + } + }else off_time = M_time; + o_rcode = rcode; } fflush(stdout); }