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