1 /* Copyright (c) 2012-2013, 2015-2017 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*/
57 const 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*/
62 typedef struct {
63 double lat;
64 double lon;
65 double alt;
66 } LocLla;
67
68 /** Represents a ECEF*/
69 typedef struct {
70 double X;
71 double Y;
72 double Z;
73 } LocEcef;
74
75 void loc_nmea_generate_sv(const GnssSvNotification &svNotify,
76 std::vector<std::string> &nmeaArraystr);
77
78 void loc_nmea_generate_pos(const UlpLocation &location,
79 const GpsLocationExtended &locationExtended,
80 const LocationSystemInfo &systemInfo,
81 unsigned char generate_nmea,
82 std::vector<std::string> &nmeaArraystr);
83
84 #define DEBUG_NMEA_MINSIZE 6
85 #define DEBUG_NMEA_MAXSIZE 4096
loc_nmea_is_debug(const char * nmea,int length)86 inline bool loc_nmea_is_debug(const char* nmea, int length) {
87 return ((nullptr != nmea) &&
88 (length >= DEBUG_NMEA_MINSIZE) && (length <= DEBUG_NMEA_MAXSIZE) &&
89 (nmea[0] == '$') && (nmea[1] == 'P') && (nmea[2] == 'Q') && (nmea[3] == 'W'));
90 }
91
92 #endif // LOC_ENG_NMEA_H
93