164efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar/* Copyright (c) 2012,2016, The Linux Foundation. All rights reserved.
2e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
3e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * Redistribution and use in source and binary forms, with or without
4e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * modification, are permitted provided that the following conditions are
5e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * met:
6e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *     * Redistributions of source code must retain the above copyright
7e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       notice, this list of conditions and the following disclaimer.
8e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *     * Redistributions in binary form must reproduce the above
9e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       copyright notice, this list of conditions and the following
10e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       disclaimer in the documentation and/or other materials provided
11e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       with the distribution.
12e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *     * Neither the name of The Linux Foundation nor the names of its
13e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       contributors may be used to endorse or promote products derived
14e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *       from this software without specific prior written permission.
15e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
16e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *
28e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti */
29e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
30e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#define LOG_NDDEBUG 0
31e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#define LOG_TAG "LocSvc_eng_nmea"
32e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <loc_eng.h>
33e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <loc_eng_nmea.h>
34e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <math.h>
35e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "log_util.h"
36e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
37e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
38e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_eng_nmea_send
39e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
40e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
41e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   send out NMEA sentence
42e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
43e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
44e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   NONE
45e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
46e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
47e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Total length of the nmea sentence
48e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
49e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
50e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
51e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
52e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
53e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p)
54e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
55e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    struct timeval tv;
56e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    gettimeofday(&tv, (struct timezone *) NULL);
57e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
58e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (loc_eng_data_p->nmea_cb != NULL)
59e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->nmea_cb(now, pNmea, length);
60e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    LOC_LOGD("NMEA <%s", pNmea);
61e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
62e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
63e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
64e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_eng_nmea_put_checksum
65e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
66e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
67e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Generate NMEA sentences generated based on position report
68e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
69e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
70e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   NONE
71e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
72e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
73e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Total length of the nmea sentence
74e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
75e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
76e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
77e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
78e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
79e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletiint loc_eng_nmea_put_checksum(char *pNmea, int maxSize)
80e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
81e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    uint8_t checksum = 0;
82e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int length = 0;
83e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
84e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pNmea++; //skip the $
85e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    while (*pNmea != '\0')
86e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
87e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        checksum ^= *pNmea++;
88e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length++;
89e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
90e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
91e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int checksumLength = snprintf(pNmea,(maxSize-length-1),"*%02X\r\n", checksum);
92e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    return (length + checksumLength);
93e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
94e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
95e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
96e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_eng_nmea_generate_pos
97e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
98e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
99e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Generate NMEA sentences generated based on position report
100e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
101e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
102e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   NONE
103e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
104e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
105e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   0
106e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
107e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
108e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
109e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
110e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
111e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p,
112e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                               const UlpLocation &location,
113e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                               const GpsLocationExtended &locationExtended,
114e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                               unsigned char generate_nmea)
115e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
116e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG();
117e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    time_t utcTime(location.gpsLocation.timestamp/1000);
118e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    tm * pTm = gmtime(&utcTime);
119e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (NULL == pTm) {
120e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        LOC_LOGE("gmtime failed");
121e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        return;
122e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
123e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
124e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0};
125e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    char* pMarker = sentence;
126e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int lengthRemaining = sizeof(sentence);
127e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int length = 0;
128e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int utcYear = pTm->tm_year % 100; // 2 digit year
129e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int utcMonth = pTm->tm_mon + 1; // tm_mon starts at zero
130e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int utcDay = pTm->tm_mday;
131e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int utcHours = pTm->tm_hour;
132e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int utcMinutes = pTm->tm_min;
133e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int utcSeconds = pTm->tm_sec;
134e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
135e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (generate_nmea) {
136e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
137e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------$GPGSA------
138e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
139e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
140e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        uint32_t svUsedCount = 0;
141e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        uint32_t svUsedList[32] = {0};
142e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        uint32_t mask = loc_eng_data_p->sv_used_mask;
143e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        for (uint8_t i = 1; mask > 0 && svUsedCount < 32; i++)
144e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
145e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (mask & 1)
146e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                svUsedList[svUsedCount++] = i;
147e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            mask = mask >> 1;
148e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
149e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // clear the cache so they can't be used again
150e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->sv_used_mask = 0;
151e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
152e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        char fixType;
153e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (svUsedCount == 0)
154e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            fixType = '1'; // no fix
155e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else if (svUsedCount <= 3)
156e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            fixType = '2'; // 2D fix
157e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
158e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            fixType = '3'; // 3D fix
159e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
160e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = snprintf(pMarker, lengthRemaining, "$GPGSA,A,%c,", fixType);
161e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
162e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
163e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
164e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
165e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
166e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
167e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
168e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
169e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
170e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        for (uint8_t i = 0; i < 12; i++) // only the first 12 sv go in sentence
171e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
172e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (i < svUsedCount)
173e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                length = snprintf(pMarker, lengthRemaining, "%02d,", svUsedList[i]);
174e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            else
175e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                length = snprintf(pMarker, lengthRemaining, ",");
176e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
177e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (length < 0 || length >= lengthRemaining)
178e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
179e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                LOC_LOGE("NMEA Error in string formatting");
180e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                return;
181e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
182e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pMarker += length;
183e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lengthRemaining -= length;
184e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
185e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
186e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
187e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {   // dop is in locationExtended, (QMI)
188e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f",
189e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              locationExtended.pdop,
190e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              locationExtended.hdop,
191e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              locationExtended.vdop);
192e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
193e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else if (loc_eng_data_p->pdop > 0 && loc_eng_data_p->hdop > 0 && loc_eng_data_p->vdop > 0)
194e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {   // dop was cached from sv report (RPC)
195e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f",
196e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              loc_eng_data_p->pdop,
197e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              loc_eng_data_p->hdop,
198e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              loc_eng_data_p->vdop);
199e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
200e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
201e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {   // no dop
202e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, ",,");
203e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
204e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
205e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
206e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
207e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
208e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
209e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------$GPVTG------
210e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
211e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
212e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker = sentence;
213e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining = sizeof(sentence);
214e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
215e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (location.gpsLocation.flags & GPS_LOCATION_HAS_BEARING)
216e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
217e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            float magTrack = location.gpsLocation.bearing;
218e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MAG_DEV)
219e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
220e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                float magTrack = location.gpsLocation.bearing - locationExtended.magneticDeviation;
221e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                if (magTrack < 0.0)
222e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    magTrack += 360.0;
223e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                else if (magTrack > 360.0)
224e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    magTrack -= 360.0;
225e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
226e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
227e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "$GPVTG,%.1lf,T,%.1lf,M,", location.gpsLocation.bearing, magTrack);
228e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
229e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
230e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
231e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "$GPVTG,,T,,M,");
232e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
233e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
234e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
235e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
236e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
237e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
238e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
239e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
240e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
241e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
242e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (location.gpsLocation.flags & GPS_LOCATION_HAS_SPEED)
243e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
244e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            float speedKnots = location.gpsLocation.speed * (3600.0/1852.0);
245e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            float speedKmPerHour = location.gpsLocation.speed * 3.6;
246e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
247e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1lf,N,%.1lf,K,", speedKnots, speedKmPerHour);
248e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
249e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
250e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
251e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, ",N,,K,");
252e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
253e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
254e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
255e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
256e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
257e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
258e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
259e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
260e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
261e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
262e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
263e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
264e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
265e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
266e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
267e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
268e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
269e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
270e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
271e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
272e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
273e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------$GPRMC------
274e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
275e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
276e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker = sentence;
277e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining = sizeof(sentence);
278e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
279e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = snprintf(pMarker, lengthRemaining, "$GPRMC,%02d%02d%02d,A," ,
280e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                          utcHours, utcMinutes, utcSeconds);
281e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
282e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
283e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
284e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
285e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
286e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
287e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
288e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
289e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
290e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)
291e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
292e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double latitude = location.gpsLocation.latitude;
293e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double longitude = location.gpsLocation.longitude;
294e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            char latHemisphere;
295e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            char lonHemisphere;
296e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double latMinutes;
297e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double lonMinutes;
298e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
299e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (latitude > 0)
300e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
301e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                latHemisphere = 'N';
302e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
303e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            else
304e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
305e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                latHemisphere = 'S';
306e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                latitude *= -1.0;
307e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
308e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
309e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (longitude < 0)
310e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
311e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                lonHemisphere = 'W';
312e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                longitude *= -1.0;
313e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
314e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            else
315e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
316e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                lonHemisphere = 'E';
317e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
318e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
319e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            latMinutes = fmod(latitude * 60.0 , 60.0);
320e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lonMinutes = fmod(longitude * 60.0 , 60.0);
321e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
322e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%02d%09.6lf,%c,%03d%09.6lf,%c,",
323e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              (uint8_t)floor(latitude), latMinutes, latHemisphere,
324e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              (uint8_t)floor(longitude),lonMinutes, lonHemisphere);
325e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
326e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
327e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
328e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining,",,,,");
329e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
330e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
331e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
332e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
333e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
334e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
335e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
336e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
337e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
338e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
339e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (location.gpsLocation.flags & GPS_LOCATION_HAS_SPEED)
340e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
341e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            float speedKnots = location.gpsLocation.speed * (3600.0/1852.0);
342e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1lf,", speedKnots);
343e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
344e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
345e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
346e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, ",");
347e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
348e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
349e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
350e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
351e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
352e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
353e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
354e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
355e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
356e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
357e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (location.gpsLocation.flags & GPS_LOCATION_HAS_BEARING)
358e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
359e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1lf,", location.gpsLocation.bearing);
360e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
361e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
362e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
363e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, ",");
364e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
365e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
366e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
367e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
368e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
369e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
370e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
371e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
372e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
373e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
374e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = snprintf(pMarker, lengthRemaining, "%2.2d%2.2d%2.2d,",
375e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                          utcDay, utcMonth, utcYear);
376e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
377e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
378e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
379e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
380e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
381e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
382e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
383e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
384e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
385e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MAG_DEV)
386e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
387e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            float magneticVariation = locationExtended.magneticDeviation;
388e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            char direction;
389e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (magneticVariation < 0.0)
390e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
391e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                direction = 'W';
392e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                magneticVariation *= -1.0;
393e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
394e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            else
395e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
396e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                direction = 'E';
397e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
398e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
399e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1lf,%c,",
400e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              magneticVariation, direction);
401e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
402e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
403e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
404e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, ",,");
405e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
406e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
407e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
408e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
409e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
410e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
411e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
412e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
413e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
414e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
415e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
416e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
417e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
418e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
419e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
420e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
421e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
422e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
423e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
424e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
425e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
426e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------$GPGGA------
427e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // ------------------
428e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
429e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker = sentence;
430e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining = sizeof(sentence);
431e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
432e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = snprintf(pMarker, lengthRemaining, "$GPGGA,%02d%02d%02d," ,
433e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                          utcHours, utcMinutes, utcSeconds);
434e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
435e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
436e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
437e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
438e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
439e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
440e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
441e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
442e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
443e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)
444e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
445e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double latitude = location.gpsLocation.latitude;
446e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double longitude = location.gpsLocation.longitude;
447e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            char latHemisphere;
448e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            char lonHemisphere;
449e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double latMinutes;
450e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            double lonMinutes;
451e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
452e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (latitude > 0)
453e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
454e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                latHemisphere = 'N';
455e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
456e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            else
457e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
458e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                latHemisphere = 'S';
459e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                latitude *= -1.0;
460e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
461e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
462e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (longitude < 0)
463e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
464e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                lonHemisphere = 'W';
465e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                longitude *= -1.0;
466e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
467e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            else
468e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
469e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                lonHemisphere = 'E';
470e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
471e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
472e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            latMinutes = fmod(latitude * 60.0 , 60.0);
473e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lonMinutes = fmod(longitude * 60.0 , 60.0);
474e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
475e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%02d%09.6lf,%c,%03d%09.6lf,%c,",
476e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              (uint8_t)floor(latitude), latMinutes, latHemisphere,
477e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              (uint8_t)floor(longitude),lonMinutes, lonHemisphere);
478e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
479e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
480e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
481e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining,",,,,");
482e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
483e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
484e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
485e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
486e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
487e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
488e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
489e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
490e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
491e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
492e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        char gpsQuality;
493e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
494e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            gpsQuality = '0'; // 0 means no fix
495e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
496e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            gpsQuality = '1'; // 1 means GPS fix
497e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
498e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            gpsQuality = '2'; // 2 means DGPS fix
499e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
500e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
501e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {   // dop is in locationExtended, (QMI)
502e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,",
503e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              gpsQuality, svUsedCount, locationExtended.hdop);
504e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
505e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else if (loc_eng_data_p->pdop > 0 && loc_eng_data_p->hdop > 0 && loc_eng_data_p->vdop > 0)
506e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {   // dop was cached from sv report (RPC)
507e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,",
508e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              gpsQuality, svUsedCount, loc_eng_data_p->hdop);
509e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
510e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
511e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {   // no hdop
512e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%c,%02d,,",
513e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              gpsQuality, svUsedCount);
514e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
515e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
516e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
517e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
518e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
519e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
520e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
521e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
522e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
523e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
524e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL)
525e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
526e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1lf,M,",
527e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              locationExtended.altitudeMeanSeaLevel);
528e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
529e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
530e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
531e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining,",,");
532e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
533e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
534e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if (length < 0 || length >= lengthRemaining)
535e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
536e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            LOC_LOGE("NMEA Error in string formatting");
537e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            return;
538e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
539e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        pMarker += length;
540e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        lengthRemaining -= length;
541e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
542e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        if ((location.gpsLocation.flags & GPS_LOCATION_HAS_ALTITUDE) &&
543e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL))
544e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
545e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "%.1lf,M,,",
546e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                              location.gpsLocation.altitude - locationExtended.altitudeMeanSeaLevel);
547e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
548e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        else
549e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
550e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining,",,,");
551e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
552e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
553e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
554e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
555e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
556e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
557e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    //Send blank NMEA reports for non-final fixes
558e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    else {
559e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence));
560e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
561e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
562e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
563e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence));
564e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
565e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
566e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
567e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N", sizeof(sentence));
568e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
569e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
570e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
571e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        strlcpy(sentence, "$GPGGA,,,,,,0,,,,,,,,", sizeof(sentence));
572e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
573e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
574e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
575e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // clear the dop cache so they can't be used again
576e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_data_p->pdop = 0;
577e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_data_p->hdop = 0;
578e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_eng_data_p->vdop = 0;
579e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
580e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    EXIT_LOG(%d, 0);
581e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
582e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
583e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
584e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
585e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
586e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_eng_nmea_generate_sv
587e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
588e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
589e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Generate NMEA sentences generated based on sv report
590e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
591e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
592e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   NONE
593e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
594e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
595e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   0
596e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
597e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
598e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
599e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
600e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
601e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
60264efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                              const GnssSvStatus &svStatus, const GpsLocationExtended &locationExtended)
603e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
604e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    ENTRY_LOG();
605e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
606e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0};
607e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    char* pMarker = sentence;
608e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int lengthRemaining = sizeof(sentence);
609e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int length = 0;
610e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int svCount = svStatus.num_svs;
611e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int sentenceCount = 0;
612e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int sentenceNumber = 1;
613e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int svNumber = 1;
614e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int gpsCount = 0;
615e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    int glnCount = 0;
616e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
617e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    //Count GPS SVs for saparating GPS from GLONASS and throw others
61864efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar    loc_eng_data_p->sv_used_mask = 0;
619e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    for(svNumber=1; svNumber <= svCount; svNumber++) {
62064efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar        if (GNSS_CONSTELLATION_GPS == svStatus.gnss_sv_list[svNumber - 1].constellation)
621e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
62264efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar            // cache the used in fix mask, as it will be needed to send $GPGSA
62364efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar            // during the position report
62464efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar            if (GNSS_SV_FLAGS_USED_IN_FIX == (svStatus.gnss_sv_list[svNumber - 1].flags & GNSS_SV_FLAGS_USED_IN_FIX))
62564efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar            {
62664efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                loc_eng_data_p->sv_used_mask |= (1 << (svStatus.gnss_sv_list[svNumber - 1].svid - 1));
62764efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar            }
628e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            gpsCount++;
629e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
63064efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar        else if (GNSS_CONSTELLATION_GLONASS == svStatus.gnss_sv_list[svNumber - 1].constellation)
631e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
632e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            glnCount++;
633e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }
634e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
635e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
636e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // ------------------
637e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // ------$GPGSV------
638e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // ------------------
639e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
640e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (gpsCount <= 0)
641e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
642e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // no svs in view, so just send a blank $GPGSV sentence
643e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        strlcpy(sentence, "$GPGSV,1,1,0,", sizeof(sentence));
644e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
645e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
646e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
647e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    else
648e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
649e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        svNumber = 1;
650e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        sentenceNumber = 1;
651e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        sentenceCount = gpsCount/4 + (gpsCount % 4 != 0);
652e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
653e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        while (sentenceNumber <= sentenceCount)
654e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
655e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pMarker = sentence;
656e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lengthRemaining = sizeof(sentence);
657e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
658e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "$GPGSV,%d,%d,%02d",
659e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                          sentenceCount, sentenceNumber, gpsCount);
660e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
661e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (length < 0 || length >= lengthRemaining)
662e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
663e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                LOC_LOGE("NMEA Error in string formatting");
664e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                return;
665e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
666e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pMarker += length;
667e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lengthRemaining -= length;
668e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
669e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            for (int i=0; (svNumber <= svCount) && (i < 4);  svNumber++)
670e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
67164efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                if (GNSS_CONSTELLATION_GPS == svStatus.gnss_sv_list[svNumber - 1].constellation)
672e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                {
673e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
67464efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                                      svStatus.gnss_sv_list[svNumber-1].svid,
67564efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                                      (int)(0.5 + svStatus.gnss_sv_list[svNumber-1].elevation), //float to int
67664efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                                      (int)(0.5 + svStatus.gnss_sv_list[svNumber-1].azimuth)); //float to int
677e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
678e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    if (length < 0 || length >= lengthRemaining)
679e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    {
680e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        LOC_LOGE("NMEA Error in string formatting");
681e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        return;
682e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    }
683e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    pMarker += length;
684e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    lengthRemaining -= length;
685e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
68664efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                    if (svStatus.gnss_sv_list[svNumber-1].c_n0_dbhz > 0)
687e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    {
688e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        length = snprintf(pMarker, lengthRemaining,"%02d",
68964efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                                         (int)(0.5 + svStatus.gnss_sv_list[svNumber-1].c_n0_dbhz)); //float to int
690e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
691e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        if (length < 0 || length >= lengthRemaining)
692e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        {
693e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                            LOC_LOGE("NMEA Error in string formatting");
694e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                            return;
695e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        }
696e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        pMarker += length;
697e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        lengthRemaining -= length;
698e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    }
699e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
700e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    i++;
701e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti               }
702e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
703e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
704e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
705e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
706e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            loc_eng_nmea_send(sentence, length, loc_eng_data_p);
707e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            sentenceNumber++;
708e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
709e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }  //while
710e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
711e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    } //if
712e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
713e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // ------------------
714e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // ------$GLGSV------
715e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // ------------------
716e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
717e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (glnCount <= 0)
718e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
719e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        // no svs in view, so just send a blank $GLGSV sentence
720e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        strlcpy(sentence, "$GLGSV,1,1,0,", sizeof(sentence));
721e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
722e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_nmea_send(sentence, length, loc_eng_data_p);
723e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
724e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    else
725e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
726e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        svNumber = 1;
727e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        sentenceNumber = 1;
728e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        sentenceCount = glnCount/4 + (glnCount % 4 != 0);
729e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
730e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        while (sentenceNumber <= sentenceCount)
731e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        {
732e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pMarker = sentence;
733e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lengthRemaining = sizeof(sentence);
734e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
735e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = snprintf(pMarker, lengthRemaining, "$GLGSV,%d,%d,%02d",
736e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                          sentenceCount, sentenceNumber, glnCount);
737e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
738e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            if (length < 0 || length >= lengthRemaining)
739e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
740e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                LOC_LOGE("NMEA Error in string formatting");
741e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                return;
742e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
743e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            pMarker += length;
744e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            lengthRemaining -= length;
745e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
746e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            for (int i=0; (svNumber <= svCount) && (i < 4);  svNumber++)
747e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            {
74864efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                if (GNSS_CONSTELLATION_GLONASS == svStatus.gnss_sv_list[svNumber - 1].constellation)
74964efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                {
750e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
751e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
75264efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                        svStatus.gnss_sv_list[svNumber - 1].svid,
75364efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                        (int)(0.5 + svStatus.gnss_sv_list[svNumber - 1].elevation), //float to int
75464efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                        (int)(0.5 + svStatus.gnss_sv_list[svNumber - 1].azimuth)); //float to int
755e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
756e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    if (length < 0 || length >= lengthRemaining)
757e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    {
758e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        LOC_LOGE("NMEA Error in string formatting");
759e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        return;
760e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    }
761e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    pMarker += length;
762e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    lengthRemaining -= length;
763e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
76464efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                    if (svStatus.gnss_sv_list[svNumber - 1].c_n0_dbhz > 0)
765e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    {
766e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        length = snprintf(pMarker, lengthRemaining,"%02d",
76764efbd901d2142e100b2f16f4879baedb7de6efeAjit Kumar                            (int)(0.5 + svStatus.gnss_sv_list[svNumber - 1].c_n0_dbhz)); //float to int
768e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
769e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        if (length < 0 || length >= lengthRemaining)
770e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        {
771e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                            LOC_LOGE("NMEA Error in string formatting");
772e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                            return;
773e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        }
774e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        pMarker += length;
775e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                        lengthRemaining -= length;
776e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    }
777e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
778e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                    i++;
779e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti               }
780e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
781e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            }
782e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
783e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
784e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            loc_eng_nmea_send(sentence, length, loc_eng_data_p);
785e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            sentenceNumber++;
786e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
787e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        }  //while
788e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
789e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }//if
790e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
791e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // For RPC, the DOP are sent during sv report, so cache them
792e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // now to be sent during position report.
793e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    // For QMI, the DOP will be in position report.
794e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
795e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
796e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->pdop = locationExtended.pdop;
797e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->hdop = locationExtended.hdop;
798e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->vdop = locationExtended.vdop;
799e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
800e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    else
801e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    {
802e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->pdop = 0;
803e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->hdop = 0;
804e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_eng_data_p->vdop = 0;
805e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    }
806e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
807e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    EXIT_LOG(%d, 0);
808e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
809