static loaded_msg_t * htsmsg_store_obtain(const char *key, int create) { char errbuf[512]; htsmsg_t *r = NULL; loaded_msg_t *lm; LIST_FOREACH(lm, &loaded_msgs, lm_link) if(!strcmp(lm->lm_key, key)) return lm; buf_t *b = persistent_load("settings", key, errbuf, sizeof(errbuf)); if(b == NULL) { if(!create) { return NULL; } } else { r = htsmsg_json_deserialize(buf_cstr(b)); buf_release(b); if(r == NULL && !create) return NULL; } if(r == NULL) r = htsmsg_create_map(); lm = calloc(1, sizeof(loaded_msg_t)); atomic_set(&lm->lm_refcount, 1); lm->lm_key = strdup(key); LIST_INSERT_HEAD(&loaded_msgs, lm, lm_link); lm->lm_msg = r; callout_arm_managed(&lm->lm_timer, htsmsg_store_timer_cb, lm, SETTINGS_CACHE_DELAY, htsmsg_store_lockmgr); return lm; }
void init() { /* Load persistent settings, or set the default values. */ if(persistent_load() == -1) { wanted_temperature = TEMP_DEF; wanted_humidity = HUM_DEF; } i2c_init(); httpd_init(); logs_init(); pid_init(); struct sigaction sa = (struct sigaction) { .sa_handler = &reload, .sa_flags = 0, .sa_restorer = NULL }; sigemptyset(&(sa.sa_mask)); sigaddset(&(sa.sa_mask), SIGUSR1); sigaddset(&(sa.sa_mask), SIGINT); sigaddset(&(sa.sa_mask), SIGTERM); if(sigaction(SIGUSR1, &sa, NULL) < 0) { fprintf(stderr, "Couldn't install signal handler.\n"); exit(1); } sa.sa_handler = &end; if(sigaction(SIGTERM, &sa, NULL) < 0 || sigaction(SIGINT, &sa, NULL) < 0) { fprintf(stderr, "Couldn't install signal handler.\n"); exit(1); } } void reload(int signal) { httpd_reload(); } int main(int argc, char **argv) { float data[2]; init(); struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); for(;;) { if(!read_data(data)) { continue; } log_values(data[1], data[0]); pid_control(data[1], data[0]); stats(); if(logstdout(data) == EOF) { break; } delay_ns(&ts, PERIOD_S, 0); } end(); }