summaryrefslogtreecommitdiff
path: root/anzeige.c
blob: 52116bf4d50465b0faa8d0ad8d4287353789bfdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#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 <pthread.h>

#include "fonts.h"
#include "input_gadgets.h"
#include "multiplexer.h"

void drop_privileges();

int main(int argc, char **argv)
{
  pthread_t thread_id;
  t_display_data display_data;
  int ret_val;
  #define TEXT_BUFFER_LENGTH 256
  char *text_buffer;
  char *text_buffer_end;
  t_scroll_buffer scroll_buffers[2];

  // Set up gpi pointer for direct register access
  ret_val = multiplexer_setup_root();
  if (ret_val)
    exit(ret_val);

  // Drop root privileges
  drop_privileges();

 /************************************************************************\
  * You are about to change the GPIO settings of your computer.          *
  * Mess this up and it will stop working!                               *
  * It might be a good idea to 'sync' before running this program        *
  * so at least you still have your code changes written to the SD-card! *
 \************************************************************************/

  // configure the gpio pins and start the multiplexer thread
  thread_id = multiplexer_setup_non_root(&display_data);

  int i,j;

  text_buffer = malloc(TEXT_BUFFER_LENGTH);
  if (text_buffer == NULL) {
    fprintf(stderr, "malloc failed to allocate 24 bytes\n");
    exit(EXIT_FAILURE);
  }
  memset(text_buffer, 0, TEXT_BUFFER_LENGTH);

  text_buffer_end = text_buffer;

  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);
    return EXIT_FAILURE;
  }

  text_buffer_end = gadgets_retrieve_current_temperature(text_buffer_end,text_buffer + TEXT_BUFFER_LENGTH - text_buffer_end);
  if (text_buffer_end == NULL) {
    fprintf(stderr, "gadgets_retrieve_current_temperature failed\n");
    free(text_buffer);
    return EXIT_FAILURE;
  }

  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);
    return EXIT_FAILURE;
  }

  scroll_buffers[0].scroll_len = render(text_buffer, TEXT_BUFFER_LENGTH, scroll_buffers[0].buf, sizeof(scroll_buffers[0].buf), 1);

  for (i=0; i>=0; i++) {
    usleep(100000);
    for (j=0; j<40; j++)
      display_data.buf[(display_data.should_buf+1)%3][j] = scroll_buffers[0].buf[(i+j) % scroll_buffers[0].scroll_len];
    display_data.should_buf = (display_data.should_buf+1)%3;
  }

  free(text_buffer);
  display_data.keep_running = 0;
  pthread_join(thread_id, NULL);

  return 0;

} // main

//
// Drop (root) privileges
//
void drop_privileges()
{
   /*  Drop superuser privileges in correct order */

   if (setgid(99) == -1) {
      perror("can't drop group privileges");
      exit(-1);
   }
   if (setuid(99) == -1) {
      perror("can't drop user privileges");
      exit(-1);
   }
} // drop_root