From 4f52dda6e8795ff98ee6cb579f754219f66f41be Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Fri, 7 Feb 2020 14:42:40 +0100 Subject: fully threaded, now --- input_gadgets.c | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 187 insertions(+), 18 deletions(-) (limited to 'input_gadgets.c') diff --git a/input_gadgets.c b/input_gadgets.c index 5c7376e..7121682 100644 --- a/input_gadgets.c +++ b/input_gadgets.c @@ -1,13 +1,16 @@ -#define _XOPEN_SOURCE -#include -#include +#define _GNU_SOURCE + #include -#include -#include #include #include -#include #include +#include +#include +#include +#include +#include +#include +#include #include #include "input_gadgets.h" @@ -230,6 +233,49 @@ char *gadgets_retrieve_current_temperature(char *output, int max_len, double *te return ende; } +void *gadgets_watch_current_temperature(void *param) +{ + t_input_thread *p = param; + time_t next_update = 0; + time_t next_dns_query = 0; + p->text_output = malloc(MAX_TEXT_OUTPUT_LEN); + p->double_output = malloc(sizeof(double)*2); + if ((p->text_output == NULL) || (p->double_output == NULL)) { + fprintf(stderr, "malloc failed\n"); + return NULL; + } + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + memset(p->double_output, 0, sizeof(double)*2); + while (p->keep_running) { + if (((time(NULL) >= next_update) || (p->force_update)) && (!p->output_ready)) { + next_update = time(NULL) + 600; // 10 minutes ahead + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + if (!gadgets_retrieve_current_temperature( + p->text_output, + MAX_TEXT_OUTPUT_LEN-1, + &p->double_output[0], + &p->double_output[1] + )) { + fprintf(stderr, "gadgets_retrieve_current_temperature failed\n"); + snprintf(p->text_output, MAX_TEXT_OUTPUT_LEN, "gadgets_retrieve_current_temperature failed"); + p->double_output[0] = 0; + p->double_output[1] = 0; + } + p->force_update = 0; + p->output_ready = 1; + } + if (time(NULL) >= next_dns_query) { + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + gethostbyname("wetter.mb.fh-jena.de"); + } + usleep(100000); + } + free(p->text_output); + free(p->double_output); + return NULL; +} + xmlNode *xml_find_node_by_name(xmlNode *cur_node, char *name) { while (cur_node) { @@ -394,6 +440,42 @@ char *gadgets_retrieve_weather_forecast(char *output, int max_len) return output; } +void *gadgets_watch_weather_forecast(void *param) +{ + t_input_thread *p = param; + time_t next_update = 0; + time_t next_dns_query = 0; + p->text_output = malloc(MAX_TEXT_OUTPUT_LEN); + if (p->text_output == NULL) { + fprintf(stderr, "malloc failed\n"); + return NULL; + } + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + while (p->keep_running) { + if (((time(NULL) >= next_update) || (p->force_update)) && (!p->output_ready)) { + next_update = time(NULL) + 600; // 10 minutes ahead + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + if (!gadgets_retrieve_weather_forecast( + p->text_output, + MAX_TEXT_OUTPUT_LEN-1 + )) { + fprintf(stderr, "gadgets_retrieve_weather_forecast failed\n"); + snprintf(p->text_output, MAX_TEXT_OUTPUT_LEN, "gadgets_retrieve_weather_forecast failed"); + } + p->force_update = 0; + p->output_ready = 1; + } + if (time(NULL) >= next_dns_query) { + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + gethostbyname("api.met.no"); + } + usleep(100000); + } + free(p->text_output); + return NULL; +} + char *gadgets_retrieve_weather_warnings(char *output, int max_len) { CURL *curl_handle; @@ -484,6 +566,7 @@ char *gadgets_retrieve_weather_warnings(char *output, int max_len) free(chunk.memory); return NULL; } + memset(warnings, 0, sizeof(warning_t)); for (int i=0; itext_output = malloc(MAX_TEXT_OUTPUT_LEN); + if (p->text_output == NULL) { + fprintf(stderr, "malloc failed\n"); + return NULL; + } + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + while (p->keep_running) { + if (((time(NULL) >= next_update) || (p->force_update)) && (!p->output_ready)) { + next_update = time(NULL) + 600; // 10 minutes ahead + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + if (!gadgets_retrieve_weather_warnings( + p->text_output, + MAX_TEXT_OUTPUT_LEN-1 + )) { + fprintf(stderr, "gadgets_retrieve_weather_warnings failed\n"); + snprintf(p->text_output, MAX_TEXT_OUTPUT_LEN, "gadgets_retrieve_weather_warnings failed"); + } + p->force_update = 0; + p->output_ready = 1; + } + if (time(NULL) >= next_dns_query) { + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + gethostbyname("opendata.dwd.de"); + } + usleep(100000); + } + free(p->text_output); + return NULL; +} + +char *gadgets_retrieve_humidity(char *output, int max_len, double *temperature, double *humidity) { CURL *curl_handle; CURLcode res; MemoryStruct chunk; int ret_val; - double temperature, humidity; char *ende = output; chunk.memory = malloc(1); @@ -1034,20 +1152,29 @@ char *gadgets_retrieve_humidity(char *output, int max_len, double fh_temperature char tmp_str[12]; snprintf(tmp_str, 11, "%.*s", (int)(rm[1].rm_eo - rm[1].rm_so), (char*)(chunk.memory + rm[1].rm_so)); - humidity = atof(tmp_str) / 100.; + *humidity = atof(tmp_str) / 100.; snprintf(tmp_str, 11, "%.*s", (int)(rm[2].rm_eo - rm[2].rm_so), (char*)(chunk.memory + rm[2].rm_so)); - temperature = atof(tmp_str); + *temperature = atof(tmp_str); + free(chunk.memory); - humidity *= maximale_luftfeuchte(temperature); - fh_humidity *= maximale_luftfeuchte(fh_temperature); + return ende; +} - if ((output + max_len - ende > 0) && (temperature <= taupunkt(fh_humidity)+2)) - ende += snprintf(ende, max_len, "!TPa %.1f K; ", taupunkt(fh_humidity) - temperature); - if ((output + max_len - ende > 0) && (temperature <= taupunkt(humidity)+2)) - ende += snprintf(ende, max_len, "!TPi %.1f K; ", taupunkt(humidity) - temperature); +char *gadgets_calculate_humidity_level(char *output, int max_len, double outside_temperature, double outside_humidity, double inside_temperature, double inside_humidity) +{ + char *ende; + + ende = output; + + inside_humidity *= maximale_luftfeuchte(inside_temperature); + outside_humidity *= maximale_luftfeuchte(outside_temperature); + + if ((output + max_len - ende > 0) && (inside_temperature <= taupunkt(outside_humidity)+2)) + ende += snprintf(ende, max_len, "!TPa %.1f K; ", taupunkt(outside_humidity) - inside_temperature); + if ((output + max_len - ende > 0) && (inside_temperature <= taupunkt(inside_humidity)+2)) + ende += snprintf(ende, max_len, "!TPi %.1f K; ", taupunkt(inside_humidity) - inside_temperature); if (output + max_len - ende > 0) - ende += snprintf(ende, max_len, "%.0f %%", humidity * 100 / fh_humidity); - free(chunk.memory); + ende += snprintf(ende, max_len, "%.0f %%", inside_humidity * 100 / outside_humidity); while (output < ende) { if (*output == '.') @@ -1057,3 +1184,45 @@ char *gadgets_retrieve_humidity(char *output, int max_len, double fh_temperature return ende; } + +void *gadgets_watch_humidity(void *param) +{ + t_input_thread *p = param; + time_t next_update = 0; + time_t next_dns_query = 0; + p->text_output = malloc(MAX_TEXT_OUTPUT_LEN); + p->double_output = malloc(sizeof(double)*2); + if ((p->text_output == NULL) || (p->double_output == NULL)) { + fprintf(stderr, "malloc failed\n"); + return NULL; + } + memset(p->text_output, 0, MAX_TEXT_OUTPUT_LEN); + memset(p->double_output, 0, sizeof(double)*2); + while (p->keep_running) { + if (((time(NULL) >= next_update) || (p->force_update)) && (!p->output_ready)) { + next_update = time(NULL) + 600; // 10 minutes ahead + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + if (!gadgets_retrieve_humidity( + p->text_output, + MAX_TEXT_OUTPUT_LEN-1, + &p->double_output[0], + &p->double_output[1] + )) { + fprintf(stderr, "gadgets_retrieve_humidity failed\n"); + snprintf(p->text_output, MAX_TEXT_OUTPUT_LEN, "gadgets_retrieve_humidity failed\n"); + p->double_output[0]=0; + p->double_output[1]=0; + } + p->force_update = 0; + p->output_ready = 1; + } + if (time(NULL) >= next_dns_query) { + next_dns_query = time(NULL) + 30; // 1/2 minute ahead + gethostbyname("kpi.ddns.eckner.net"); + } + usleep(100000); + } + free(p->text_output); + free(p->double_output); + return NULL; +} -- cgit v1.2.3-54-g00ecf