summaryrefslogtreecommitdiff
path: root/libloragw/tst/test_loragw_gps.c
blob: 994c0ad55620573d329304b3c4f9f1463cd10dc4 (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
/*
 / _____)             _              | |
( (____  _____ ____ _| |_ _____  ____| |__
 \____ \| ___ |    (_   _) ___ |/ ___)  _ \
 _____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
  (C)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: Michael Coracin
*/


/* -------------------------------------------------------------------------- */
/* --- 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 <gps.h>
#include <gpsd.h>

#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 */
static struct gps_data_t gpsdata;
static struct fixsource_t source;
struct tref ppm_ref;

/* -------------------------------------------------------------------------- */
/* --- 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;

    /* concentrator variables */
    struct lgw_conf_board_s boardconf;
    struct lgw_conf_rxrf_s rfconf;

    /* serial variables */
    char serial_buff[128]; /* buffer to receive GPS data */

    /* NMEA/UBX variables */
    static struct tref time_reference_gps; /* time reference used for GPS <-> timestamp conversion */

    /* 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(&gpsdata, &source);
    if (i != LGW_GPS_SUCCESS) {
        printf("ERROR: IMPOSSIBLE TO ENABLE GPS\n");
        exit(EXIT_FAILURE);
    }

    /* start concentrator (default conf for IoT SK) */
    /* board config */
    memset(&boardconf, 0, sizeof(boardconf));
    boardconf.lorawan_public = true;
    boardconf.clksrc = 1;
    lgw_board_setconf(boardconf);

    /* RF config */
    memset(&rfconf, 0, sizeof(rfconf));
    rfconf.enable = true;
    rfconf.freq_hz = 868000000;
    rfconf.rssi_offset = 0.0;
    rfconf.type = LGW_RADIO_TYPE_SX1257;
    rfconf.tx_enable = true;
    lgw_rxrf_setconf(0, rfconf);

    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)) {
        wait_ms(100);
        int r = gps_read(&gpsdata, 0, 0);
        if (r!= -1 && (gpsdata.status != STATUS_NO_FIX) &&
                (gpsdata.fix.mode == MODE_2D || gpsdata.fix.mode == MODE_3D) &&
                !isnan(gpsdata.fix.latitude) &&
                !isnan(gpsdata.fix.longitude)) {


            uint32_t trig_tstamp; /* concentrator timestamp associated with PPM pulse */

            i = lgw_get_trigcnt(&trig_tstamp);
            lgw_gps_sync(&time_reference_gps, trig_tstamp, gpsdata.fix.time);

            printf("\n--- GPS ---\n");
            printf("Set:             %lld\n", gpsdata.set);
            printf("Online:  %10.0f\n", gpsdata.online);
            printf("Status:          %d\n", gpsdata.status);
            printf("Satellites Used: %d\n", gpsdata.satellites_used);
            printf("Mode:            %d\n", gpsdata.fix.mode);
            printf("UTC time:        %lld.%09ld\n", (long long)time_reference_gps.utc.tv_sec, time_reference_gps.utc.tv_nsec);
            printf("GPS time:        %lld.%09ld\n", (long long)time_reference_gps.gps.tv_sec, time_reference_gps.gps.tv_nsec);
            printf("Latitude:        %f\n", gpsdata.fix.latitude);
            printf("Longitude:       %f\n", gpsdata.fix.longitude);
            printf("Altitude:        %fm\n", gpsdata.fix.altitude);
            printf("Speed:           %f\n", gpsdata.fix.speed);
            printf("Track:           %f\n", gpsdata.fix.track);
            printf("Pdop:            %f\n", gpsdata.dop.pdop);
        }
    }

    /* clean up before leaving */
    if (exit_sig == 1) {
        lgw_gps_disable(&gpsdata);
        lgw_stop();
    }

    printf("\nEnd of test for loragw_gps.c\n");
    exit(EXIT_SUCCESS);
}

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