summaryrefslogtreecommitdiff
path: root/libloragw/tst/test_loragw_gps.c
blob: 77e5325ea91f7cb1a7f9b5efeec96228d1c748c5 (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/*
 / _____)             _              | |
( (____  _____ ____ _| |_ _____  ____| |__
 \____ \| ___ |    (_   _) ___ |/ ___)  _ \
 _____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
    ©2013 Semtech-Cycleo

Description:
	Minimum test program for the loragw_gps 'library'

License: Revised BSD License, see LICENSE.TXT file include in the project
Maintainer: Sylvain Miermont
*/


/* -------------------------------------------------------------------------- */
/* --- DEPENDANCIES --------------------------------------------------------- */

/* fix an issue between POSIX and C99 */
#if __STDC_VERSION__ >= 199901L
	#define _XOPEN_SOURCE 600
#else
	#define _XOPEN_SOURCE 500
#endif

#include <stdint.h>		/* C99 types */
#include <stdbool.h>	/* bool type */
#include <stdio.h>		/* printf */
#include <string.h>		/* memset */
#include <signal.h>		/* sigaction */
#include <stdlib.h>		/* exit */
#include <unistd.h>		/* read */

#include "loragw_hal.h"
#include "loragw_gps.h"
#include "loragw_aux.h"

/* -------------------------------------------------------------------------- */
/* --- PRIVATE VARIABLES ---------------------------------------------------- */

static int exit_sig = 0; /* 1 -> application terminates cleanly (shut down hardware, close open files, etc) */
static int quit_sig = 0; /* 1 -> application terminates without shutting down the hardware */

/* -------------------------------------------------------------------------- */
/* --- PRIVATE FUNCTIONS DECLARATION ---------------------------------------- */

static void sig_handler(int sigio);

/* -------------------------------------------------------------------------- */
/* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */

static void sig_handler(int sigio) {
	if (sigio == SIGQUIT) {
		quit_sig = 1;;
	} else if ((sigio == SIGINT) || (sigio == SIGTERM)) {
		exit_sig = 1;
	}
}

/* -------------------------------------------------------------------------- */
/* --- MAIN FUNCTION -------------------------------------------------------- */

int main()
{
	struct sigaction sigact; /* SIGQUIT&SIGINT&SIGTERM signal handling */
	
	int i;
	char tmp_str[80];
	
	/* serial variables */
	char serial_buff[128]; /* buffer to receive GPS data */
	ssize_t nb_char;
	int gps_tty_dev; /* file descriptor to the serial port of the GNSS module */
	
	/* NMEA variables */
	enum gps_msg latest_msg; /* keep track of latest NMEA message parsed */
	
	/* variables for PPM pulse GPS synchronization */
	uint32_t ppm_tstamp;
	struct timespec ppm_utc;
	struct tref ppm_ref;
	
	/* variables for timestamp <-> UTC conversions */
	uint32_t x, z;
	struct timespec y;
	
	/* configure signal handling */
	sigemptyset(&sigact.sa_mask);
	sigact.sa_flags = 0;
	sigact.sa_handler = sig_handler;
	sigaction(SIGQUIT, &sigact, NULL);
	sigaction(SIGINT, &sigact, NULL);
	sigaction(SIGTERM, &sigact, NULL);
	
	/* Intro message and library information */
	printf("Beginning of test for loragw_gps.c\n");
	printf("*** Library version information ***\n%s\n***\n", lgw_version_info());
	
	/* Open and configure GPS */
	i = lgw_gps_enable("/dev/ttyACM0", NULL, 0, &gps_tty_dev);
	if (i != LGW_GPS_SUCCESS) {
		printf("ERROR: IMPOSSIBLE TO ENABLE GPS\n");
		exit(EXIT_FAILURE);
	}
	
	/* start concentrator */
	lgw_start();
	
	/* initialize some variables before loop */
	memset(serial_buff, 0, sizeof serial_buff);
	memset(&ppm_ref, 0, sizeof ppm_ref);
	
	/* loop until user action */
	while ((quit_sig != 1) && (exit_sig != 1)) {
		/* blocking canonical read on serial port */
		nb_char = read(gps_tty_dev, serial_buff, sizeof(serial_buff)-1);
		if (nb_char <= 0) {
			printf("Warning: read() returned value <= 0\n");
			continue;
		} else {
			serial_buff[nb_char] = 0;
		}
		
		/* parse the received NMEA */
		latest_msg = lgw_parse_nmea(serial_buff, sizeof(serial_buff));
		
		if (latest_msg == NMEA_RMC) {
			
			printf("\n~~ RMC NMEA sentence, triggering synchronization attempt ~~\n");
			
			/* get UTC time for synchronization */
			i = lgw_gps_get(&ppm_utc, NULL, NULL);
			if (i != LGW_GPS_SUCCESS) {
				printf("    No valid reference UTC time available, synchronization impossible.\n");
				continue;
			}
			/* get timestamp for synchronization */
			i = lgw_get_trigcnt(&ppm_tstamp);
			if (i != LGW_HAL_SUCCESS) {
				printf("    Failed to read timestamp, synchronization impossible.\n");
				continue;
			}
			/* try to update synchronize time reference with the new UTC & timestamp */
			i = lgw_gps_sync(&ppm_ref, ppm_tstamp, ppm_utc);
			if (i != LGW_GPS_SUCCESS) {
				printf("    Synchronization error.\n");
				continue;
			}
			/* display result */
			printf("    * Synchronization successful *\n");
			strftime(tmp_str, sizeof(tmp_str), "%F %T", gmtime(&(ppm_ref.utc.tv_sec)));
			printf("    UTC reference time: %s.%09ldZ\n", tmp_str, ppm_ref.utc.tv_nsec);
			printf("    Internal counter reference value: %u\n", ppm_ref.count_us);
			printf("    Clock error: %.9f\n", ppm_ref.xtal_err);
			
			x = ppm_tstamp + 500000;
			printf("    * Test of timestamp counter <-> UTC value conversion *\n");
			printf("    Test value: %u\n", x);
			lgw_cnt2utc(ppm_ref, x, &y);
			strftime(tmp_str, sizeof(tmp_str), "%F %T", gmtime(&(y.tv_sec)));
			printf("    Conversion to UTC: %s.%09ldZ\n", tmp_str, y.tv_nsec);
			lgw_utc2cnt(ppm_ref, y, &z);
			printf("    Converted back: %u\n", z);
		}
	}
	
	/* clean up before leaving */
	if (exit_sig == 1) {
		lgw_stop();
	}
	
	printf("\nEnd of test for loragw_gps.c\n");
	exit(EXIT_SUCCESS);
}

/* --- EOF ------------------------------------------------------------------ */