1eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* 2eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Copyright (C) 2016 The Android Open Source Project 3eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 4eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Licensed under the Apache License, Version 2.0 (the "License"); 5eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * you may not use this file except in compliance with the License. 6eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * You may obtain a copy of the License at 7eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 8eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * http://www.apache.org/licenses/LICENSE-2.0 9eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 10eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Unless required by applicable law or agreed to in writing, software 11eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * distributed under the License is distributed on an "AS IS" BASIS, 12eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * See the License for the specific language governing permissions and 14eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * limitations under the License. 15eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 16eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 17eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOG_TAG "LocSvc_GnssDebugInterface" 18eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 19eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <log/log.h> 20eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <log_util.h> 21eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "Gnss.h" 22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "GnssDebug.h" 23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include "LocationUtil.h" 24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace android { 26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace hardware { 27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace gnss { 28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace V1_0 { 29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace implementation { 30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhusing ::android::hardware::hidl_vec; 32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000ULL) // 1/1/2017 00:00 GMT 34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns 35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss) 37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* 41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * This methods requests position, time and satellite ephemeris debug information 42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * from the HAL. 43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * @return void 45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh*/ 46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhReturn<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb) 47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh DebugData data = { }; 51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if((nullptr == mGnss) || (nullptr == mGnss->getGnssInterface())){ 53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("GnssDebug - Null GNSS interface"); 54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh _hidl_cb(data); 55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return Void(); 56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // get debug report snapshot via hal interface 59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssDebugReport reports = { }; 60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnss->getGnssInterface()->getDebugReport(reports); 61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // location block 63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (reports.mLocation.mValid) { 64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.valid = true; 65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.latitudeDegrees = reports.mLocation.mLocation.latitude; 66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.longitudeDegrees = reports.mLocation.mLocation.longitude; 67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.altitudeMeters = reports.mLocation.mLocation.altitude; 68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.speedMetersPerSec = 70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mLocation.mLocation.speed); 71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.bearingDegrees = 72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mLocation.mLocation.bearing); 73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.horizontalAccuracyMeters = 74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mLocation.mLocation.accuracy); 75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.verticalAccuracyMeters = 76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.verticalAccuracyMeters; 77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.speedAccuracyMetersPerSecond = 78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.speedAccuracyMetersPerSecond; 79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.bearingAccuracyDegrees = 80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.bearingAccuracyDegrees; 81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh timeval tv_now, tv_report; 83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh tv_report.tv_sec = reports.mLocation.mUtcReported.tv_sec; 84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh tv_report.tv_usec = reports.mLocation.mUtcReported.tv_nsec / 1000ULL; 85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gettimeofday(&tv_now, NULL); 86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.ageSeconds = 87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (tv_now.tv_sec - tv_report.tv_sec) + 88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (float)((tv_now.tv_usec - tv_report.tv_usec)) / 1000000; 89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.position.valid = false; 92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // time block 95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (reports.mTime.mValid) { 96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.time.timeEstimate = reports.mTime.timeEstimate; 97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.time.timeUncertaintyNs = reports.mTime.timeUncertaintyNs; 98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.time.frequencyUncertaintyNsPerSec = 99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mTime.frequencyUncertaintyNsPerSec; 100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME; 103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.time.timeUncertaintyNs = (float)(GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC); 104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.time.frequencyUncertaintyNsPerSec = 0; 105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // satellite data block 108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SatelliteData s = { }; 109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh std::vector<SatelliteData> s_array = { }; 110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (uint32_t i=0; i<reports.mSatelliteInfo.size(); i++) { 112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh memset(&s, 0, sizeof(s)); 113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.svid = reports.mSatelliteInfo[i].svid; 114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertGnssConstellationType( 115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].constellation, s.constellation); 116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertGnssEphemerisType( 117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].mEphemerisType, s.ephemerisType); 118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertGnssEphemerisSource( 119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].mEphemerisSource, s.ephemerisSource); 120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertGnssEphemerisHealth( 121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].mEphemerisHealth, s.ephemerisHealth); 122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.ephemerisAgeSeconds = 124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].ephemerisAgeSeconds; 125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.serverPredictionIsAvailable = 126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].serverPredictionIsAvailable; 127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.serverPredictionAgeSeconds = 128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mSatelliteInfo[i].serverPredictionAgeSeconds; 129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s_array.push_back(s); 131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh data.satelliteDataArray = s_array; 133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // callback HIDL with collected debug data 135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh _hidl_cb(data); 136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return Void(); 137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace implementation 140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace V1_0 141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace gnss 142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace hardware 143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} // namespace android 144