diff options
Diffstat (limited to 'anzeige.c')
-rw-r--r-- | anzeige.c | 153 |
1 files changed, 91 insertions, 62 deletions
@@ -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; } |