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                                bool custom_gga_fix_quality,
83                                std::vector<std::string> &nmeaArraystr);
84 
85 #define DEBUG_NMEA_MINSIZE 6
86 #define DEBUG_NMEA_MAXSIZE 4096
loc_nmea_is_debug(const char * nmea,int length)87 inline bool loc_nmea_is_debug(const char* nmea, int length) {
88     return ((nullptr != nmea) &&
89             (length >= DEBUG_NMEA_MINSIZE) && (length <= DEBUG_NMEA_MAXSIZE) &&
90             (nmea[0] == '$') && (nmea[1] == 'P') && (nmea[2] == 'Q') && (nmea[3] == 'W'));
91 }
92 
93 #endif // LOC_ENG_NMEA_H
94