mirror of
https://github.com/eddyem/small_tel.git
synced 2026-05-07 13:27:06 +03:00
add dead sensors' reinit, gathering all fresh data, fixed some little bugs
This commit is contained in:
@@ -41,7 +41,7 @@ static const val_t values[NAMOUNT] = {
|
||||
static void *mainthread(void *s){
|
||||
FNAME();
|
||||
sensordata_t *sensor = (sensordata_t *)s;
|
||||
while(1){
|
||||
while(sensor->fdes > -1){
|
||||
if(check_shm_block(&sdat)){
|
||||
//DBG("Got next");
|
||||
time_t tnow = time(NULL);
|
||||
@@ -64,16 +64,13 @@ static void *mainthread(void *s){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, _U_ const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
s->PluginNo = N;
|
||||
if(pollt) s->tpoll = pollt;
|
||||
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 NULL;
|
||||
return FALSE;
|
||||
}
|
||||
s->values = MALLOC(val_t, NAMOUNT);
|
||||
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
|
||||
@@ -82,9 +79,9 @@ sensordata_t *sensor_new(int N, time_t pollt, _U_ const char *descr){
|
||||
if(pthread_create(&s->thread, NULL, mainthread, (void*)s)){
|
||||
WARN("Can't create main thread");
|
||||
s->kill(s);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
s->fdes = 0;
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ static void *mainthread(void *s){
|
||||
FNAME();
|
||||
double t0 = sl_dtime();
|
||||
sensordata_t *sensor = (sensordata_t *)s;
|
||||
while(1){
|
||||
while(sensor->fdes > -1){
|
||||
//DBG("locked");
|
||||
pthread_mutex_lock(&sensor->valmutex);
|
||||
float f = sensor->values[0].value.f + (drand48() - 0.5) / 2.;
|
||||
@@ -69,13 +69,11 @@ static void *mainthread(void *s){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, _U_ const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
if(!s) return FALSE;
|
||||
s->Nvalues = NS;
|
||||
strncpy(s->name, SENSOR_NAME, NAME_LEN);
|
||||
if(pollt) s->tpoll = pollt;
|
||||
s->values = MALLOC(val_t, NS);
|
||||
for(int i = 0; i < NS; ++i) s->values[i] = values[i];
|
||||
s->values[0].value.f = 1.;
|
||||
@@ -85,11 +83,10 @@ sensordata_t *sensor_new(int N, time_t pollt, _U_ const char *descr){
|
||||
s->values[4].value.f = 89.;
|
||||
s->values[5].value.u = 0;
|
||||
s->values[6].value.f = 4.5;
|
||||
s->PluginNo = N;
|
||||
if(pthread_create(&s->thread, NULL, mainthread, (void*)s)){
|
||||
s->kill(s);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
s->fdes = 0;
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -120,28 +120,24 @@ static void *mainthread(void *s){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
if(!descr || !*descr) return NULL;
|
||||
int fd = getFD(descr);
|
||||
if(fd < 0) return NULL;
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
if(!s) return FALSE;
|
||||
int fd = getFD(s->path);
|
||||
if(fd < 0) return FALSE;
|
||||
s->fdes = fd;
|
||||
s->PluginNo = N;
|
||||
if(pollt) s->tpoll = pollt;
|
||||
snprintf(s->name, NAME_LEN, "%s @ %s", SENSOR_NAME, descr);
|
||||
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
|
||||
s->values = MALLOC(val_t, NS);
|
||||
// don't use memcpy, as `values` could be aligned
|
||||
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 NULL;
|
||||
return FALSE;
|
||||
}
|
||||
if(pthread_create(&s->thread, NULL, mainthread, (void*)s)){
|
||||
s->kill(s);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -194,25 +194,21 @@ static void *mainthread(void *s){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
if(!descr || !*descr) return NULL;
|
||||
int fd = getFD(descr);
|
||||
if(fd < 0) return NULL;
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
snprintf(s->name, NAME_LEN, "%s @ %s", SENSOR_NAME, descr);
|
||||
if(!s) return FALSE;
|
||||
int fd = getFD(s->path);
|
||||
if(fd < 0) return FALSE;
|
||||
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
|
||||
s->fdes = fd;
|
||||
s->PluginNo = N;
|
||||
s->Nvalues = NAMOUNT;
|
||||
if(pollt) s->tpoll = pollt;
|
||||
s->values = MALLOC(val_t, NAMOUNT);
|
||||
// don't use memcpy, as `values` could be aligned
|
||||
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 NULL;
|
||||
return FALSE;
|
||||
}
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -111,8 +111,8 @@ static void *mainthread(void *s){
|
||||
time_t tnow = time(NULL);
|
||||
if(tnow - tpoll > sensor->tpoll){
|
||||
int dlen = sprintf(buf, "%s0\n%s1\n", commands[CMD_DISTANCE], commands[CMD_DISTANCE]);
|
||||
if(sl_tty_write(sensor->fdes, buf, dlen)){
|
||||
WARN("Can't ask new data");
|
||||
if(dlen != write(sensor->fdes, buf, dlen)){
|
||||
WARN("Can't ask new data from lightning monitor");
|
||||
break;
|
||||
}
|
||||
DBG("poll @%zd, pollt=%zd", tnow, sensor->tpoll);
|
||||
@@ -169,22 +169,24 @@ static void *mainthread(void *s){
|
||||
sensor->values[NLIGHTNING].time = tnow;
|
||||
}
|
||||
pthread_mutex_unlock(&sensor->valmutex);
|
||||
if(gotfresh && sensor->freshdatahandler) sensor->freshdatahandler(sensor);
|
||||
if(gotfresh) DBG("got fresh data");
|
||||
if(gotfresh && sensor->freshdatahandler){
|
||||
DBG("Run fresh data handler");
|
||||
sensor->freshdatahandler(sensor);
|
||||
}
|
||||
usleep(1000);
|
||||
}
|
||||
DBG("suicide");
|
||||
sensor->kill(sensor);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t _U_ pollt, const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
if(!descr || !*descr) return NULL;
|
||||
int fd = getFD(descr);
|
||||
if(fd < 0) return NULL;
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
snprintf(s->name, NAME_LEN, "%s @ %s", SENSOR_NAME, descr);
|
||||
s->PluginNo = N;
|
||||
if(!s) return FALSE;
|
||||
int fd = getFD(s->path);
|
||||
if(fd < 0) return FALSE;
|
||||
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
|
||||
s->fdes = fd;
|
||||
s->Nvalues = NAMOUNT;
|
||||
s->tpoll = TCHECK;
|
||||
@@ -193,7 +195,7 @@ sensordata_t *sensor_new(int N, time_t _U_ pollt, const char *descr){
|
||||
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
|
||||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
|
||||
s->kill(s);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ static void *mainthread(void *s){
|
||||
while(sensor->fdes > -1){
|
||||
time_t tnow = time(NULL);
|
||||
if(tnow - tpoll > sensor->tpoll){
|
||||
if(sl_tty_write(sensor->fdes, "?U\r\n", 4)){
|
||||
if(4 != write(sensor->fdes, "?U\r\n", 4)){
|
||||
WARN("Can't ask new data");
|
||||
break;
|
||||
}
|
||||
@@ -166,24 +166,20 @@ static void *mainthread(void *s){
|
||||
}
|
||||
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
if(!descr || !*descr) return NULL;
|
||||
int fd = getFD(descr);
|
||||
if(fd < 0) return NULL;
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
if(!s) return FALSE;
|
||||
int fd = getFD(s->path);
|
||||
if(fd < 0) return FALSE;
|
||||
s->Nvalues = NAMOUNT;
|
||||
s->PluginNo = N;
|
||||
s->fdes = fd;
|
||||
snprintf(s->name, NAME_LEN, "%s @ %s", SENSOR_NAME, descr);
|
||||
if(pollt) s->tpoll = pollt;
|
||||
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
|
||||
s->values = MALLOC(val_t, NAMOUNT);
|
||||
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 NULL;
|
||||
return FALSE;
|
||||
}
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -91,7 +91,6 @@ enum{
|
||||
static netsnmp_session *snmp_session;
|
||||
static oid anOID[OID_AMOUNT][MAX_OID_LEN];
|
||||
static size_t anOID_len[OID_AMOUNT];
|
||||
static int running = 1;
|
||||
|
||||
const char *oids[OID_AMOUNT] = {
|
||||
[OID_BATT_STATUS] = ".1.3.6.1.2.1.33.1.2.1.0",
|
||||
@@ -114,7 +113,7 @@ static void *mainthread(void *s){
|
||||
double t0 = sl_dtime();
|
||||
sensordata_t *sensor = (sensordata_t *)s;
|
||||
netsnmp_pdu *pdu, *response;
|
||||
while(running){
|
||||
while(sensor->fdes > -1){
|
||||
//DBG("run");
|
||||
pdu = snmp_pdu_create(SNMP_MSG_GET);
|
||||
for(int i = 0; i < OID_AMOUNT; ++i)
|
||||
@@ -123,19 +122,20 @@ static void *mainthread(void *s){
|
||||
//DBG("status = %d", status);
|
||||
if(status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR){
|
||||
time_t curt = time(NULL);
|
||||
netsnmp_variable_list *vars = response->variables;
|
||||
netsnmp_variable_list *vars = response->variables; // OID_BATT_STATUS
|
||||
pthread_mutex_lock(&sensor->valmutex);
|
||||
int ival = *vars->val.integer;
|
||||
if(ival > 0 && ival < BATT_STAT_AMOUNT)
|
||||
if(ival > 0 && ival < BATT_STAT_AMOUNT){
|
||||
snprintf(sensor->values[NBATSTAT].value.str, STRT_LEN+1, "%s", batt_stat[ival]);
|
||||
vars = vars->next_variable;
|
||||
}
|
||||
vars = vars->next_variable; // OID_BATT_SECONDS_ONBAT
|
||||
uint32_t tonbat = (uint32_t) *vars->val.integer;
|
||||
sensor->values[NTONBAT].value.u = tonbat;
|
||||
vars = vars->next_variable;
|
||||
vars = vars->next_variable; // OID_BATT_EST_MINUTES
|
||||
sensor->values[NTREMAIN].value.u = 60 * (uint32_t) *vars->val.integer;
|
||||
vars = vars->next_variable;
|
||||
vars = vars->next_variable; // OID_BATT_CAPACITY
|
||||
sensor->values[NBATCAP].value.u = (uint32_t) *vars->val.integer;
|
||||
vars = vars->next_variable;
|
||||
vars = vars->next_variable; // OID_OUTPUT_SOURCE
|
||||
ival = *vars->val.integer;
|
||||
if(ival > 0 && ival < SOURCE_AMOUNT)
|
||||
snprintf(sensor->values[NSOURCE].value.str, STRT_LEN+1, "%s", sources[ival]);
|
||||
@@ -144,6 +144,7 @@ static void *mainthread(void *s){
|
||||
}else sensor->values[NONBAT].value.u = 0;
|
||||
for(int i = 0; i < NAMOUNT; ++i)
|
||||
sensor->values[i].time = curt;
|
||||
//DBG("times updated to %zd", curt);
|
||||
pthread_mutex_unlock(&sensor->valmutex);
|
||||
if(sensor->freshdatahandler) sensor->freshdatahandler(sensor);
|
||||
}else DBG("Error in packet");
|
||||
@@ -156,15 +157,15 @@ static void *mainthread(void *s){
|
||||
}
|
||||
|
||||
static void snmp_kill(sensordata_t *s){
|
||||
running = 0;
|
||||
s->fdes = -1;
|
||||
pthread_join(s->thread, NULL);
|
||||
snmp_close(snmp_session);
|
||||
common_kill(s);
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
if(!descr || !*descr) return NULL;
|
||||
if(!s || !s->path[0]) return FALSE;
|
||||
|
||||
netsnmp_session session;
|
||||
init_snmp("snmpapp");
|
||||
@@ -174,29 +175,24 @@ sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
session.community = (u_char *)"public";
|
||||
session.community_len = strlen((const char *)session.community);
|
||||
|
||||
const char *colon = strchr(descr, ':');
|
||||
if(colon) descr = colon + 1; // omit "N:" in field "N:host"
|
||||
session.peername = strdup(descr);
|
||||
DBG("PATH: %s", s->path);
|
||||
|
||||
const char *colon = strchr(s->path, ':');
|
||||
if(colon) ++colon; // omit "N:" in field "N:host"
|
||||
session.peername = strdup(colon);
|
||||
|
||||
snmp_session = snmp_open(&session);
|
||||
if(!snmp_session){
|
||||
snmp_sess_perror("snmp_open", &session);
|
||||
FREE(session.peername);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sensordata_t *s = common_new();
|
||||
if(!s){
|
||||
snmp_close(snmp_session);
|
||||
return NULL;
|
||||
}
|
||||
s->kill = snmp_kill;
|
||||
|
||||
snprintf(s->name, NAME_LEN, "%s @ %s", SENSOR_NAME, descr);
|
||||
s->PluginNo = N;
|
||||
s->fdes = -1;
|
||||
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
|
||||
s->fdes = 0;
|
||||
s->Nvalues = NAMOUNT;
|
||||
if(pollt) s->tpoll = pollt;
|
||||
s->values = MALLOC(val_t, NAMOUNT);
|
||||
for(int i = 0; i < NAMOUNT; ++i) s->values[i] = values[i];
|
||||
|
||||
@@ -214,7 +210,7 @@ sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
if(!(s->ringbuffer = sl_RB_new(BUFSIZ)) ||
|
||||
pthread_create(&s->thread, NULL, mainthread, (void*)s)){
|
||||
s->kill(s);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ static void *mainthread(void *s){
|
||||
while(sensor->fdes > -1){
|
||||
time_t tnow = time(NULL);
|
||||
if(tnow - tpoll > sensor->tpoll){
|
||||
if(sl_tty_write(sensor->fdes, "!0R0\r\n", 6)){
|
||||
if(6 != write(sensor->fdes, "!0R0\r\n", 6)){
|
||||
WARN("Can't ask new data");
|
||||
break;
|
||||
}
|
||||
@@ -194,25 +194,21 @@ static void *mainthread(void *s){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sensordata_t *sensor_new(int N, time_t pollt, const char *descr){
|
||||
int sensor_init(sensordata_t *s){
|
||||
FNAME();
|
||||
if(!descr || !*descr) return NULL;
|
||||
int fd = getFD(descr);
|
||||
if(fd < 0) return NULL;
|
||||
sensordata_t *s = common_new();
|
||||
if(!s) return NULL;
|
||||
snprintf(s->name, NAME_LEN, "%s @ %s", SENSOR_NAME, descr);
|
||||
s->PluginNo = N;
|
||||
if(!s) return FALSE;
|
||||
int fd = getFD(s->path);
|
||||
if(fd < 0) return FALSE;
|
||||
snprintf(s->name, NAME_LEN, "%s", SENSOR_NAME);
|
||||
s->fdes = fd;
|
||||
s->Nvalues = NAMOUNT;
|
||||
if(pollt) s->tpoll = pollt;
|
||||
s->values = MALLOC(val_t, NAMOUNT);
|
||||
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 NULL;
|
||||
return FALSE;
|
||||
}
|
||||
return s;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user