Exemple #1
0
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;
}
Exemple #2
0
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();
}