blob: 2d98f4280a4f209748d4d8a1cd858704fd0cc7df [file] [log] [blame]
Michael Bestas3a0209e2023-05-04 01:15:47 +03001/* Copyright (c) 2012-2013, 2015-2020 The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30#ifndef LOC_ENG_NMEA_H
31#define LOC_ENG_NMEA_H
32
33#include <gps_extended.h>
34#include <vector>
35#include <string>
36#define NMEA_SENTENCE_MAX_LENGTH 200
37
38/** gnss datum type */
39#define LOC_GNSS_DATUM_WGS84 0
40#define LOC_GNSS_DATUM_PZ90 1
41
42/* len of semi major axis of ref ellips*/
43#define MAJA (6378137.0)
44/* flattening coef of ref ellipsoid*/
45#define FLAT (1.0/298.2572235630)
46/* 1st eccentricity squared*/
47#define ESQR (FLAT*(2.0 - FLAT))
48/*1 minus eccentricity squared*/
49#define OMES (1.0 - ESQR)
50#define MILARCSEC2RAD (4.848136811095361e-09)
51/*semi major axis */
52#define C_PZ90A (6378136.0)
53/*semi minor axis */
54#define C_PZ90B (6356751.3618)
55/* Transformation from WGS84 to PZ90
56 * Cx,Cy,Cz,Rs,Rx,Ry,Rz,C_SYS_A,C_SYS_B*/
57const double DatumConstFromWGS84[9] =
58 {+0.003, +0.001, 0.000, (1.0+(0.000*1E-6)), (-0.019*MILARCSEC2RAD),
59 (+0.042*MILARCSEC2RAD), (-0.002*MILARCSEC2RAD), C_PZ90A, C_PZ90B};
60
61/** Represents a LTP*/
62typedef struct {
63 double lat;
64 double lon;
65 double alt;
66} LocLla;
67
68/** Represents a ECEF*/
69typedef struct {
70 double X;
71 double Y;
72 double Z;
73} LocEcef;
74
75void loc_nmea_generate_sv(const GnssSvNotification &svNotify,
76 std::vector<std::string> &nmeaArraystr);
77
78void loc_nmea_generate_pos(const UlpLocation &location,
79 const GpsLocationExtended &locationExtended,
80 const LocationSystemInfo &systemInfo,
81 unsigned char generate_nmea,
82 bool custom_gga_fix_quality,
83 std::vector<std::string> &nmeaArraystr,
84 int& indexOfGGA,
85 bool isTagBlockGroupingEnabled);
86
87#define DEBUG_NMEA_MINSIZE 6
88#define DEBUG_NMEA_MAXSIZE 4096
89inline bool loc_nmea_is_debug(const char* nmea, int length) {
90 return ((nullptr != nmea) &&
91 (length >= DEBUG_NMEA_MINSIZE) && (length <= DEBUG_NMEA_MAXSIZE) &&
92 (nmea[0] == '$') && (nmea[1] == 'P') && (nmea[2] == 'Q') && (nmea[3] == 'W'));
93}
94
95#endif // LOC_ENG_NMEA_H