fixed some bugs, check @ real system

This commit is contained in:
2026-05-14 16:23:43 +03:00
parent a31d809c2e
commit bb2af2965a
18 changed files with 135 additions and 81 deletions

View File

@@ -64,3 +64,7 @@ if(LIGHTNING)
endif()
install(TARGETS ${LIBS} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(CODE [===[
message(STATUS "Run ldconfig")
execute_process(COMMAND ldconfig)
]===])

View File

@@ -59,8 +59,6 @@ static void *mainthread(void *s){
}else break; // no connection?
sleep(1);
}
DBG("Lost connection -> suicide");
sensor->kill(sensor);
return NULL;
}
@@ -69,7 +67,6 @@ int sensor_init(sensordata_t *s){
if(!s) return FALSE;
if(!get_shm_block(&sdat, ClientSide)){
WARNX("Can't get BTA shared memory block or create main thread");
s->kill(s);
return FALSE;
}
s->values = MALLOC(val_t, NAMOUNT);
@@ -78,7 +75,6 @@ int sensor_init(sensordata_t *s){
strncpy(s->name, SENSOR_NAME, NAME_LEN);
if(pthread_create(&s->thread, NULL, mainthread, (void*)s)){
WARN("Can't create main thread");
s->kill(s);
return FALSE;
}
s->fdes = 0;

View File

@@ -84,7 +84,6 @@ int sensor_init(sensordata_t *s){
s->values[5].value.u = 0;
//s->values[6].value.f = 4.5;
if(pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
s->fdes = 0;

View File

@@ -115,8 +115,7 @@ static void *mainthread(void *s){
}
}
}
DBG("OOOOps!");
sensor->kill(sensor);
// newer use `kill` here! Master will run it after main thread death
return NULL;
}
@@ -132,11 +131,9 @@ int sensor_init(sensordata_t *s){
for(int i = 0; i < NS; ++i) s->values[i] = values[i];
if(!(s->ringbuffer = sl_RB_new(BUFSIZ))){
WARNX("Can't init ringbuffer!");
s->kill(s);
return FALSE;
}
if(pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
return TRUE;

View File

@@ -99,11 +99,11 @@ enum{
static const val_t values[NAMOUNT] = { // fields `name` and `comment` have no sense until value meaning is `IS_OTHER`
[NPRECIP] = {.sense = VAL_OBLIGATORY, .type = VALT_UINT, .meaning = IS_PRECIP},
[NPRECIP_LEVEL] = {.sense = VAL_RECOMMENDED, .type = VALT_FLOAT, .meaning = IS_PRECIP_LEVEL},
[NSINCERN] = {.sense = VAL_UNNECESSARY, .type = VALT_UINT, .meaning = IS_OTHER, .name = "TSINCERN", .comment = "Minutes since rain (20 means a lot of)"},
[NPOW] = {.sense = VAL_UNNECESSARY, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RAINPOW", .comment = "Rain strength, 0..255"},
[NAVG] = {.sense = VAL_UNNECESSARY, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RAINAVG", .comment = "Average rain strength, 0..255"},
[NAMBL] = {.sense = VAL_UNNECESSARY, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RSAMBL", .comment = "Ambient light by rain sensor, 0..255"},
[NFREEZ] = {.sense = VAL_UNNECESSARY, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RSFREEZ", .comment = "Rain sensor is freezed"},
[NSINCERN] = {.sense = VAL_RECOMMENDED, .type = VALT_UINT, .meaning = IS_OTHER, .name = "TSINCERN", .comment = "Minutes since rain (20 means a lot of)"},
[NPOW] = {.sense = VAL_RECOMMENDED, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RAINPOW", .comment = "Rain strength, 0..255"},
[NAVG] = {.sense = VAL_RECOMMENDED, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RAINAVG", .comment = "Average rain strength, 0..255"},
[NAMBL] = {.sense = VAL_RECOMMENDED, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RSAMBL", .comment = "Ambient light by rain sensor, 0..255"},
[NFREEZ] = {.sense = VAL_RECOMMENDED, .type = VALT_UINT, .meaning = IS_OTHER, .name = "RSFREEZ", .comment = "Rain sensor is freezed"},
};
static int getv(char s, uint8_t *v){
@@ -119,7 +119,7 @@ static int getv(char s, uint8_t *v){
}
static int encodepacket(const char *buf, int len, rg11 *Rregs, slowregs *Sregs){
DBG("got buffer: %s[%d]", buf, len);
// DBG("got buffer: %s[%d]", buf, len);
uint8_t databuf[REGLEN/2] = {0};
static slowregs slow = {0};
if(len != REGMINLEN && len != REGLEN){
@@ -172,7 +172,7 @@ static void *mainthread(void *s){
if(got > 0){
buf[--got] = 0;
if(encodepacket(buf, got, &Rregs, &Sregs)){
DBG("refresh...");
//DBG("refresh...");
pthread_mutex_lock(&sensor->valmutex);
for(int i = 0; i < NAMOUNT; ++i)
sensor->values[i].time = tnow;
@@ -189,8 +189,6 @@ static void *mainthread(void *s){
}
}
}
DBG("OOOOps!");
sensor->kill(sensor);
return NULL;
}
@@ -207,7 +205,6 @@ int sensor_init(sensordata_t *s){
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
return TRUE;

View File

@@ -176,8 +176,6 @@ static void *mainthread(void *s){
}
usleep(1000);
}
DBG("suicide");
sensor->kill(sensor);
return NULL;
}
@@ -194,7 +192,6 @@ int sensor_init(sensordata_t *s){
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
return TRUE;

View File

@@ -39,9 +39,9 @@ enum{
static const val_t values[NAMOUNT] = {
[NWIND] = {.sense = VAL_RECOMMENDED, .type = VALT_FLOAT, .meaning = IS_WIND},
[NWINDDIR] = {.sense = VAL_RECOMMENDED,.type = VALT_FLOAT, .meaning = IS_WINDDIR},
[NHUMIDITY] = {.sense = VAL_BROKEN, .type = VALT_FLOAT, .meaning = IS_HUMIDITY},
[NHUMIDITY] = {.sense = VAL_BROKEN, .type = VALT_FLOAT, .meaning = IS_HUMIDITY}, // broken on our meteostation
[NAMB_TEMP] = {.sense = VAL_RECOMMENDED, .type = VALT_FLOAT, .meaning = IS_AMB_TEMP},
[NPRESSURE] = {.sense = VAL_BROKEN, .type = VALT_FLOAT, .meaning = IS_PRESSURE},
[NPRESSURE] = {.sense = VAL_BROKEN, .type = VALT_FLOAT, .meaning = IS_PRESSURE}, // broken on our meteostation
[NCLOUDS] = {.sense = VAL_OBLIGATORY, .type = VALT_FLOAT, .meaning = IS_CLOUDS},
[NPRECIP] = {.sense = VAL_RECOMMENDED, .type = VALT_UINT, .meaning = IS_PRECIP},
[NPRECIPLVL]= {.sense = VAL_UNNECESSARY,.type = VALT_FLOAT, .meaning = IS_PRECIP_LEVEL},
@@ -161,7 +161,6 @@ static void *mainthread(void *s){
if(sensor->freshdatahandler) sensor->freshdatahandler(sensor);
}
}
sensor->kill(sensor);
return NULL;
}
@@ -178,7 +177,6 @@ int sensor_init(sensordata_t *s){
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
return TRUE;

View File

@@ -192,9 +192,9 @@ int sensor_init(sensordata_t *s){
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
s->fdes = 0;
s->Nvalues = NAMOUNT;
s->values = MALLOC(val_t, NAMOUNT);
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
s->Nvalues = NAMOUNT;
DBG("init OIDs");
for(int i = 0; i < OID_AMOUNT; ++i){
@@ -209,7 +209,6 @@ int sensor_init(sensordata_t *s){
DBG("Start main thread");
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
return TRUE;

View File

@@ -43,9 +43,9 @@ static const val_t values[NAMOUNT] = {
[NHUMIDITY] = {.sense = VAL_OBLIGATORY, .type = VALT_FLOAT, .meaning = IS_HUMIDITY},
[NAMB_TEMP] = {.sense = VAL_OBLIGATORY, .type = VALT_FLOAT, .meaning = IS_AMB_TEMP},
[NPRESSURE] = {.sense = VAL_OBLIGATORY, .type = VALT_FLOAT, .meaning = IS_PRESSURE},
[NPRECIP] = {.sense = VAL_OBLIGATORY, .type = VALT_UINT, .meaning = IS_PRECIP},
[NPRECIPLVL]= {.sense = VAL_RECOMMENDED,.type = VALT_FLOAT, .meaning = IS_PRECIP_LEVEL},
[NPRECIPINT]= {.sense = VAL_RECOMMENDED,.type = VALT_FLOAT, .meaning = IS_OTHER, .name = "PRECRATE", .comment = "Precipitation rate, mm/h"},
[NPRECIP] = {.sense = VAL_UNNECESSARY, .type = VALT_UINT, .meaning = IS_PRECIP}, // this sensor lies
[NPRECIPLVL]= {.sense = VAL_UNNECESSARY,.type = VALT_FLOAT, .meaning = IS_PRECIP_LEVEL},
[NPRECIPINT]= {.sense = VAL_UNNECESSARY,.type = VALT_FLOAT, .meaning = IS_OTHER, .name = "PRECRATE", .comment = "Precipitation rate, mm/h"},
};
typedef struct{
@@ -106,7 +106,7 @@ static int parseans(char *str){
}else{
*el->weatherpar = strtod(token, &endptr);
if(endptr == token){
DBG("Wrong double value %s", token);
// DBG("Wrong double value %s", token);
}else ++ncollected;
}
break;
@@ -115,7 +115,7 @@ static int parseans(char *str){
}
token = strtok(NULL, ",");
}
DBG("Got %d values", ncollected);
// DBG("Got %d values", ncollected);
return ncollected;
}
@@ -131,7 +131,7 @@ static void *mainthread(void *s){
WARN("Can't ask new data");
break;
}
DBG("poll @%zd, pollt=%zd", tnow, sensor->tpoll);
// DBG("poll @%zd, pollt=%zd", tnow, sensor->tpoll);
tpoll = tnow;
}
int canread = sl_canread(sensor->fdes);
@@ -190,7 +190,7 @@ static void *mainthread(void *s){
if(sensor->freshdatahandler) sensor->freshdatahandler(sensor);
}
}
sensor->kill(sensor);
// newer use `kill` here! Master will run it after main thread death
return NULL;
}
@@ -201,12 +201,11 @@ int sensor_init(sensordata_t *s){
if(fd < 0) return FALSE;
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
s->fdes = fd;
s->Nvalues = NAMOUNT;
s->values = MALLOC(val_t, NAMOUNT);
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
s->Nvalues = NAMOUNT;
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
s->kill(s);
return FALSE;
}
return TRUE;