Blame view

orbimote/field_test_device/uart.c 1.52 KB
ca223e024   Jean-Michel Friedt   orbimote avec sof...
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
  /*
  
  Manage UART: implement stdio and fetch GPS data.
  
  Copyright (C) 2019, ENSIMAG students
  This project is under the MIT license
  
  */
  
  #if GPS == 1
  
  #include "app.h"
  #include "gps.h"
  
  #include <periph/uart.h>
  #include <xtimer.h>
  
  #include <stdio.h>
  #include <string.h>
  
  #define ENABLE_DEBUG (0)
  
  
  // UART configuration.
  #define STD_DEV      UART_DEV(0)
  
  #ifndef STD_BAUDRATE
  #define STD_BAUDRATE 9600
  #endif
  
  // Debug a GPS data.
  #define DEBUG(...) if (ENABLE_DEBUG) printf(__VA_ARGS__)
  
  
  // Unique instance of UART info structure.
  uart_info_t uart_info;
  
  
  // Handle interruption from UART.
  static void uart_isr(uart_info_t *info, char c)
  {
      if (info->line_length >= 127)
          info->line_length = 0;
  
      if (c != '$')
          goto store_c;
      if (strncmp(info->line, "$GPGGA", 6) != 0)
          goto reset_line;
  
      gps_parse_data((int8_t *)info->line, info->line_length);
      DEBUG("[uart] gps data: lat = %ld, lon = %ld, alt = %d
  ",
          gps_data.latitude_bin, gps_data.longitude_bin, gps_data.altitude);
  
  reset_line:
      info->line_length = 0;
  store_c:
      info->line[info->line_length++] = c;
  }
  
  
  // STDIN is disabled in our application.
  ssize_t stdio_read(void *buffer, size_t count)
  {
      (void)buffer;  (void)count;
      return 0;
  }
  
  // Write STDOUT data to serial port 0.
  ssize_t stdio_write(const void *buffer, size_t len)
  {
      uart_write(STD_DEV, (const uint8_t *)buffer, len);
      return len;
  }
  
  // Initialize STDIO module.
  void stdio_init(void)
  {
      uart_init(STD_DEV, STD_BAUDRATE, (uart_rx_cb_t)uart_isr, &uart_info);
  }
  
  #endif