summaryrefslogtreecommitdiff
path: root/input_gadgets.c
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2020-02-07 14:42:40 +0100
committerErich Eckner <git@eckner.net>2020-02-07 14:42:40 +0100
commit4f52dda6e8795ff98ee6cb579f754219f66f41be (patch)
tree0e028501f4df77fcdd312dd0ae93d1ba16302de9 /input_gadgets.c
parent1f40d334b2c39feb6dcc02ae31ae1a74fc4bc322 (diff)
downloadanzeige-4f52dda6e8795ff98ee6cb579f754219f66f41be.tar.xz
fully threaded, now
Diffstat (limited to 'input_gadgets.c')
-rw-r--r--input_gadgets.c205
1 files changed, 187 insertions, 18 deletions
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 <string.h>
-#include <stdlib.h>
+#define _GNU_SOURCE
+
#include <curl/curl.h>
-#include <regex.h>
-#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
-#include <time.h>
#include <math.h>
+#include <netdb.h>
+#include <regex.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
#include <zip.h>
#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; i<zip_get_num_entries(za, 0); i++) {
zip_stat_index(za, i, 0, &zs);
@@ -972,13 +1055,48 @@ char *gadgets_retrieve_weather_warnings(char *output, int max_len)
return ende;
}
-char *gadgets_retrieve_humidity(char *output, int max_len, double fh_temperature, double fh_humidity)
+void *gadgets_watch_weather_warnings(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_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;
+}