summaryrefslogtreecommitdiff
path: root/anzeige.c
diff options
context:
space:
mode:
Diffstat (limited to 'anzeige.c')
-rw-r--r--anzeige.c153
1 files changed, 91 insertions, 62 deletions
diff --git a/anzeige.c b/anzeige.c
index a1ad81f..1beb796 100644
--- a/anzeige.c
+++ b/anzeige.c
@@ -1,17 +1,18 @@
#define _GNU_SOURCE
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <unistd.h>
#include <errno.h>
-#include <string.h>
+#include <fcntl.h>
+#include <netdb.h>
#include <pthread.h>
#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
#include <time.h>
-#include <netdb.h>
+#include <unistd.h>
+#include "anzeige.h"
#include "fonts.h"
#include "input_gadgets.h"
#include "multiplexer.h"
@@ -20,15 +21,14 @@ void drop_privileges();
void handle_signals(int signo);
t_scroll_data scroll_data;
-time_t next_update = 0;
-time_t next_dns_query = 0;
+t_input_thread input_threads[THREAD_IDX_MAX];
int main(int argc, char **argv)
{
int ret_val;
- #define TEXT_BUFFER_LENGTH SCROLL_BUF_LEN / 5
- char *text_buffer;
- char *text_buffer_end;
+
+ memset(&scroll_data, 0, sizeof(t_scroll_data));
+ memset(&input_threads, 0, sizeof(t_input_thread) * THREAD_IDX_MAX);
// Set up gpi pointer for direct register access
ret_val = multiplexer_setup_root();
@@ -64,69 +64,98 @@ int main(int argc, char **argv)
// configure the gpio pins and start the multiplexer thread
multiplexer_setup_scroll(&scroll_data);
+ #define TEXT_BUFFER_LENGTH SCROLL_BUF_LEN / 5
+ char *text_buffer;
+ char *text_buffer_end;
+ char text_buffers[OUTPUT_IDX_MAX][MAX_TEXT_OUTPUT_LEN];
+ char humidity_text_buffer[MAX_TEXT_OUTPUT_LEN];
+ double outside_temperature = 0, outside_humidity = 0, inside_temperature = 0, inside_humidity = 0;
+ int updated = 0;
+
+ memset(humidity_text_buffer, 0 ,MAX_TEXT_OUTPUT_LEN);
text_buffer = malloc(TEXT_BUFFER_LENGTH);
if (text_buffer == NULL) {
fprintf(stderr, "malloc failed to allocate %d bytes\n", TEXT_BUFFER_LENGTH);
turn_off_display();
return EXIT_FAILURE;
}
+ memset(text_buffer, 0, TEXT_BUFFER_LENGTH);
+ memset(text_buffers, 0, OUTPUT_IDX_MAX * MAX_TEXT_OUTPUT_LEN);
- scroll_data . shine_until = time(NULL) + 10;
+ for (int i=0; i<THREAD_IDX_MAX; i++)
+ input_threads[i].keep_running = 1;
- int i=0;
+ pthread_create(&input_threads[THREAD_IDX_WARNINGS].thread_id, NULL, gadgets_watch_weather_warnings, &input_threads[THREAD_IDX_WARNINGS]);
+ pthread_create(&input_threads[THREAD_IDX_OUTSIDE].thread_id, NULL, gadgets_watch_current_temperature, &input_threads[THREAD_IDX_OUTSIDE]);
+ pthread_create(&input_threads[THREAD_IDX_FORECAST].thread_id, NULL, gadgets_watch_weather_forecast, &input_threads[THREAD_IDX_FORECAST]);
+ pthread_create(&input_threads[THREAD_IDX_INSIDE].thread_id, NULL, gadgets_watch_humidity, &input_threads[THREAD_IDX_INSIDE]);
+
+ scroll_data . shine_until = time(NULL) + 1000000;
while (scroll_data . keep_running) {
if (got_input()) {
- next_update = 0; // update now!
scroll_data . shine_until = time(NULL) + 60;
+ for (int i=0; i<THREAD_IDX_MAX; i++)
+ input_threads[i].force_update = 1;
}
- if ((time(NULL) >= next_update) && (scroll_data . update == 0)) {
- next_update = time(NULL) + 600; // 10 minutes ahead
- next_dns_query = time(NULL) + 30; // 1/2 minute ahead
+ for (int i=0; i<THREAD_IDX_MAX; i++)
+ if (input_threads[i].output_ready) {
+ if (strcmp(text_buffers[i], input_threads[i].text_output)) {
+ strcpy(text_buffers[i], input_threads[i].text_output);
+ updated = 1;
+ }
+ if (i == THREAD_IDX_OUTSIDE) {
+ if (outside_temperature != input_threads[i].double_output[0])
+ outside_temperature = input_threads[i].double_output[0];
+ if (outside_humidity != input_threads[i].double_output[1])
+ outside_humidity = input_threads[i].double_output[1];
+ }
+ if (i == THREAD_IDX_INSIDE) {
+ if (inside_temperature != input_threads[i].double_output[0])
+ inside_temperature = input_threads[i].double_output[0];
+ if (inside_humidity != input_threads[i].double_output[1])
+ inside_humidity = input_threads[i].double_output[1];
+ }
+ if (((i == THREAD_IDX_OUTSIDE) || (i == THREAD_IDX_INSIDE)) &&
+ ((outside_temperature!=0) || (outside_humidity!=0)) &&
+ ((inside_temperature!=0) || (inside_humidity!=0))) {
+ gadgets_calculate_humidity_level(
+ humidity_text_buffer,
+ MAX_TEXT_OUTPUT_LEN,
+ outside_temperature,
+ outside_humidity,
+ inside_temperature,
+ inside_humidity
+ );
+ if (strcmp(text_buffers[THREAD_IDX_INSIDE], humidity_text_buffer)) {
+ strcpy(text_buffers[THREAD_IDX_INSIDE], humidity_text_buffer);
+ updated = 1;
+ }
+ }
+ input_threads[i].output_ready = 0;
+ }
+ if (updated) {
+ updated = 0;
memset(text_buffer, 0, TEXT_BUFFER_LENGTH);
text_buffer_end = text_buffer;
- double temperature, humidity;
-
- text_buffer_end = gadgets_retrieve_weather_warnings(text_buffer_end,text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end);
- if (text_buffer_end == NULL) {
- fprintf(stderr, "gadgets_retrieve_weather_warnings failed\n");
- free(text_buffer);
- turn_off_display();
- return EXIT_FAILURE;
- }
- if (text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end > 0)
- text_buffer_end += snprintf(text_buffer_end, text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end, "; ");
- text_buffer_end = gadgets_retrieve_current_temperature(text_buffer_end, text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end, &temperature, &humidity);
- if (text_buffer_end == NULL) {
- fprintf(stderr, "gadgets_retrieve_current_temperature failed\n");
- free(text_buffer);
- turn_off_display();
- return EXIT_FAILURE;
- }
- if (text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end > 0)
- text_buffer_end += snprintf(text_buffer_end, text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end, "; ");
- text_buffer_end = gadgets_retrieve_weather_forecast(text_buffer_end,text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end);
- if (text_buffer_end == NULL) {
- fprintf(stderr, "gadgets_retrieve_weather_forecast failed\n");
- free(text_buffer);
- turn_off_display();
- return EXIT_FAILURE;
- }
- if (text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end > 0)
- text_buffer_end += snprintf(text_buffer_end, text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end, "; ");
- text_buffer_end = gadgets_retrieve_humidity(text_buffer_end, text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end, temperature, humidity);
- if (text_buffer_end == NULL) {
- fprintf(stderr, "gadgets_retrieve_humidity failed\n");
- free(text_buffer);
- turn_off_display();
- return EXIT_FAILURE;
+ for (int i=0; i<OUTPUT_IDX_MAX; i++) {
+ if ((text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end > 0) && (*text_buffers[i]))
+ text_buffer_end += snprintf(
+ text_buffer_end,
+ text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end,
+ "%s; ",
+ text_buffers[i]
+ );
}
+
struct tm time_struct;
+ time_t now;
memset(&time_struct, 0, sizeof(time_struct));
- localtime_r(&next_update, &time_struct);
+ now = time(NULL);
+ localtime_r(&now, &time_struct);
for (int i = 0; i < (time_struct . tm_wday + 6) % 7 + 1; i++) {
if (text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end <= 0)
break;
@@ -151,21 +180,20 @@ int main(int argc, char **argv)
);
scroll_data . update = 1;
}
- if (time(NULL) >= next_dns_query) {
- next_dns_query = time(NULL) + 30; // 1/2 minute ahead
- gethostbyname("wetter.mb.fh-jena.de");
- gethostbyname("api.met.no");
- gethostbyname("opendata.dwd.de");
- gethostbyname("kpi.ddns.eckner.net");
- }
usleep(100000);
}
+ for (int i=0; i<THREAD_IDX_MAX; i++)
+ input_threads[i].keep_running = 0;
+
free(text_buffer);
pthread_join(scroll_data . thread_id, NULL);
turn_off_display();
+ for (int i=0; i<THREAD_IDX_MAX; i++)
+ pthread_join(input_threads[i].thread_id, NULL);
+
return EXIT_SUCCESS;
} // main
@@ -201,7 +229,8 @@ void handle_signals(int signo)
scroll_data . keep_running = 0;
break;
case SIGUSR1:
- next_update = 0;
+ for (int i=0; i<THREAD_IDX_MAX; i++)
+ input_threads[i] . force_update = 1;
scroll_data . shine_until = time(NULL) + 60;
break;
}