1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include "GnssRawMeasurementParser.h"
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker namespace android {
20*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
21*4d7e907cSAndroid Build Coastguard Worker namespace gnss {
22*4d7e907cSAndroid Build Coastguard Worker namespace common {
23*4d7e907cSAndroid Build Coastguard Worker
24*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::ElapsedRealtime;
25*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::GnssClock;
26*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::GnssConstellationType;
27*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::GnssData;
28*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::GnssMeasurement;
29*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::GnssMultipathIndicator;
30*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::gnss::GnssSignalType;
31*4d7e907cSAndroid Build Coastguard Worker
32*4d7e907cSAndroid Build Coastguard Worker using ParseUtils = ::android::hardware::gnss::common::ParseUtils;
33*4d7e907cSAndroid Build Coastguard Worker
getColumnIdNameMappingFromHeader(const std::string & header)34*4d7e907cSAndroid Build Coastguard Worker std::unordered_map<std::string, int> GnssRawMeasurementParser::getColumnIdNameMappingFromHeader(
35*4d7e907cSAndroid Build Coastguard Worker const std::string& header) {
36*4d7e907cSAndroid Build Coastguard Worker std::vector<std::string> columnNames;
37*4d7e907cSAndroid Build Coastguard Worker std::unordered_map<std::string, int> columnNameIdMapping;
38*4d7e907cSAndroid Build Coastguard Worker std::string s = header;
39*4d7e907cSAndroid Build Coastguard Worker // Trim left spaces
40*4d7e907cSAndroid Build Coastguard Worker s.erase(s.begin(),
41*4d7e907cSAndroid Build Coastguard Worker std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); }));
42*4d7e907cSAndroid Build Coastguard Worker // Trim right spaces
43*4d7e907cSAndroid Build Coastguard Worker s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); })
44*4d7e907cSAndroid Build Coastguard Worker .base(),
45*4d7e907cSAndroid Build Coastguard Worker s.end());
46*4d7e907cSAndroid Build Coastguard Worker // Remove comment symbol, start from `Raw`.
47*4d7e907cSAndroid Build Coastguard Worker s = s.substr(s.find("Raw"));
48*4d7e907cSAndroid Build Coastguard Worker
49*4d7e907cSAndroid Build Coastguard Worker ParseUtils::splitStr(s, COMMA_SEPARATOR, columnNames);
50*4d7e907cSAndroid Build Coastguard Worker int columnId = 0;
51*4d7e907cSAndroid Build Coastguard Worker for (auto& name : columnNames) {
52*4d7e907cSAndroid Build Coastguard Worker columnNameIdMapping[name] = columnId++;
53*4d7e907cSAndroid Build Coastguard Worker }
54*4d7e907cSAndroid Build Coastguard Worker
55*4d7e907cSAndroid Build Coastguard Worker return columnNameIdMapping;
56*4d7e907cSAndroid Build Coastguard Worker }
57*4d7e907cSAndroid Build Coastguard Worker
getClockFlags(const std::vector<std::string> & rawMeasurementRecordValues,const std::unordered_map<std::string,int> & columnNameIdMapping)58*4d7e907cSAndroid Build Coastguard Worker int GnssRawMeasurementParser::getClockFlags(
59*4d7e907cSAndroid Build Coastguard Worker const std::vector<std::string>& rawMeasurementRecordValues,
60*4d7e907cSAndroid Build Coastguard Worker const std::unordered_map<std::string, int>& columnNameIdMapping) {
61*4d7e907cSAndroid Build Coastguard Worker int clockFlags = 0;
62*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("LeapSecond")].empty()) {
63*4d7e907cSAndroid Build Coastguard Worker clockFlags |= GnssClock::HAS_LEAP_SECOND;
64*4d7e907cSAndroid Build Coastguard Worker }
65*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("FullBiasNanos")].empty()) {
66*4d7e907cSAndroid Build Coastguard Worker clockFlags |= GnssClock::HAS_FULL_BIAS;
67*4d7e907cSAndroid Build Coastguard Worker }
68*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("BiasNanos")].empty()) {
69*4d7e907cSAndroid Build Coastguard Worker clockFlags |= GnssClock::HAS_BIAS;
70*4d7e907cSAndroid Build Coastguard Worker }
71*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("BiasUncertaintyNanos")].empty()) {
72*4d7e907cSAndroid Build Coastguard Worker clockFlags |= GnssClock::HAS_BIAS_UNCERTAINTY;
73*4d7e907cSAndroid Build Coastguard Worker }
74*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("DriftNanosPerSecond")].empty()) {
75*4d7e907cSAndroid Build Coastguard Worker clockFlags |= GnssClock::HAS_DRIFT;
76*4d7e907cSAndroid Build Coastguard Worker }
77*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("DriftUncertaintyNanosPerSecond")]
78*4d7e907cSAndroid Build Coastguard Worker .empty()) {
79*4d7e907cSAndroid Build Coastguard Worker clockFlags |= GnssClock::HAS_DRIFT_UNCERTAINTY;
80*4d7e907cSAndroid Build Coastguard Worker }
81*4d7e907cSAndroid Build Coastguard Worker return clockFlags;
82*4d7e907cSAndroid Build Coastguard Worker }
83*4d7e907cSAndroid Build Coastguard Worker
getElapsedRealtimeFlags(const std::vector<std::string> & rawMeasurementRecordValues,const std::unordered_map<std::string,int> & columnNameIdMapping)84*4d7e907cSAndroid Build Coastguard Worker int GnssRawMeasurementParser::getElapsedRealtimeFlags(
85*4d7e907cSAndroid Build Coastguard Worker const std::vector<std::string>& rawMeasurementRecordValues,
86*4d7e907cSAndroid Build Coastguard Worker const std::unordered_map<std::string, int>& columnNameIdMapping) {
87*4d7e907cSAndroid Build Coastguard Worker int elapsedRealtimeFlags = ElapsedRealtime::HAS_TIMESTAMP_NS;
88*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("TimeUncertaintyNanos")].empty()) {
89*4d7e907cSAndroid Build Coastguard Worker elapsedRealtimeFlags |= ElapsedRealtime::HAS_TIME_UNCERTAINTY_NS;
90*4d7e907cSAndroid Build Coastguard Worker }
91*4d7e907cSAndroid Build Coastguard Worker return elapsedRealtimeFlags;
92*4d7e907cSAndroid Build Coastguard Worker }
93*4d7e907cSAndroid Build Coastguard Worker
getRawMeasurementFlags(const std::vector<std::string> & rawMeasurementRecordValues,const std::unordered_map<std::string,int> & columnNameIdMapping)94*4d7e907cSAndroid Build Coastguard Worker int GnssRawMeasurementParser::getRawMeasurementFlags(
95*4d7e907cSAndroid Build Coastguard Worker const std::vector<std::string>& rawMeasurementRecordValues,
96*4d7e907cSAndroid Build Coastguard Worker const std::unordered_map<std::string, int>& columnNameIdMapping) {
97*4d7e907cSAndroid Build Coastguard Worker int rawMeasurementFlags = 0;
98*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("SnrInDb")].empty()) {
99*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_SNR;
100*4d7e907cSAndroid Build Coastguard Worker }
101*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("CarrierFrequencyHz")].empty()) {
102*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_CARRIER_FREQUENCY;
103*4d7e907cSAndroid Build Coastguard Worker }
104*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("CarrierCycles")].empty()) {
105*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_CARRIER_CYCLES;
106*4d7e907cSAndroid Build Coastguard Worker }
107*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("CarrierPhase")].empty()) {
108*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_CARRIER_PHASE;
109*4d7e907cSAndroid Build Coastguard Worker }
110*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("CarrierPhaseUncertainty")].empty()) {
111*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_CARRIER_PHASE_UNCERTAINTY;
112*4d7e907cSAndroid Build Coastguard Worker }
113*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("AgcDb")].empty()) {
114*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_AUTOMATIC_GAIN_CONTROL;
115*4d7e907cSAndroid Build Coastguard Worker }
116*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("FullInterSignalBiasNanos")].empty()) {
117*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_FULL_ISB;
118*4d7e907cSAndroid Build Coastguard Worker }
119*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("FullInterSignalBiasUncertaintyNanos")]
120*4d7e907cSAndroid Build Coastguard Worker .empty()) {
121*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_FULL_ISB_UNCERTAINTY;
122*4d7e907cSAndroid Build Coastguard Worker }
123*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at("SatelliteInterSignalBiasNanos")]
124*4d7e907cSAndroid Build Coastguard Worker .empty()) {
125*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_SATELLITE_ISB;
126*4d7e907cSAndroid Build Coastguard Worker }
127*4d7e907cSAndroid Build Coastguard Worker if (!rawMeasurementRecordValues[columnNameIdMapping.at(
128*4d7e907cSAndroid Build Coastguard Worker "SatelliteInterSignalBiasUncertaintyNanos")]
129*4d7e907cSAndroid Build Coastguard Worker .empty()) {
130*4d7e907cSAndroid Build Coastguard Worker rawMeasurementFlags |= GnssMeasurement::HAS_SATELLITE_ISB_UNCERTAINTY;
131*4d7e907cSAndroid Build Coastguard Worker }
132*4d7e907cSAndroid Build Coastguard Worker // HAS_SATELLITE_PVT and HAS_CORRELATION_VECTOR fields currently not in rawmeasurement
133*4d7e907cSAndroid Build Coastguard Worker // output, need add them later.
134*4d7e907cSAndroid Build Coastguard Worker return rawMeasurementFlags;
135*4d7e907cSAndroid Build Coastguard Worker }
136*4d7e907cSAndroid Build Coastguard Worker
getGnssConstellationType(int constellationType)137*4d7e907cSAndroid Build Coastguard Worker GnssConstellationType GnssRawMeasurementParser::getGnssConstellationType(int constellationType) {
138*4d7e907cSAndroid Build Coastguard Worker GnssConstellationType gnssConstellationType =
139*4d7e907cSAndroid Build Coastguard Worker aidl::android::hardware::gnss::GnssConstellationType::UNKNOWN;
140*4d7e907cSAndroid Build Coastguard Worker
141*4d7e907cSAndroid Build Coastguard Worker switch (constellationType) {
142*4d7e907cSAndroid Build Coastguard Worker case 1:
143*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::GPS;
144*4d7e907cSAndroid Build Coastguard Worker break;
145*4d7e907cSAndroid Build Coastguard Worker case 2:
146*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::SBAS;
147*4d7e907cSAndroid Build Coastguard Worker break;
148*4d7e907cSAndroid Build Coastguard Worker case 3:
149*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::GLONASS;
150*4d7e907cSAndroid Build Coastguard Worker break;
151*4d7e907cSAndroid Build Coastguard Worker case 4:
152*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::QZSS;
153*4d7e907cSAndroid Build Coastguard Worker break;
154*4d7e907cSAndroid Build Coastguard Worker case 5:
155*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::BEIDOU;
156*4d7e907cSAndroid Build Coastguard Worker break;
157*4d7e907cSAndroid Build Coastguard Worker case 6:
158*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::GALILEO;
159*4d7e907cSAndroid Build Coastguard Worker break;
160*4d7e907cSAndroid Build Coastguard Worker default:
161*4d7e907cSAndroid Build Coastguard Worker gnssConstellationType = aidl::android::hardware::gnss::GnssConstellationType::UNKNOWN;
162*4d7e907cSAndroid Build Coastguard Worker }
163*4d7e907cSAndroid Build Coastguard Worker
164*4d7e907cSAndroid Build Coastguard Worker return gnssConstellationType;
165*4d7e907cSAndroid Build Coastguard Worker }
166*4d7e907cSAndroid Build Coastguard Worker
getMeasurementFromStrs(std::string & rawMeasurementStr)167*4d7e907cSAndroid Build Coastguard Worker std::unique_ptr<GnssData> GnssRawMeasurementParser::getMeasurementFromStrs(
168*4d7e907cSAndroid Build Coastguard Worker std::string& rawMeasurementStr) {
169*4d7e907cSAndroid Build Coastguard Worker /*
170*4d7e907cSAndroid Build Coastguard Worker * Raw,utcTimeMillis,TimeNanos,LeapSecond,TimeUncertaintyNanos,FullBiasNanos,BiasNanos,
171*4d7e907cSAndroid Build Coastguard Worker * BiasUncertaintyNanos,DriftNanosPerSecond,DriftUncertaintyNanosPerSecond,
172*4d7e907cSAndroid Build Coastguard Worker * HardwareClockDiscontinuityCount,Svid,TimeOffsetNanos,State,ReceivedSvTimeNanos,
173*4d7e907cSAndroid Build Coastguard Worker * ReceivedSvTimeUncertaintyNanos,Cn0DbHz,PseudorangeRateMetersPerSecond,
174*4d7e907cSAndroid Build Coastguard Worker * PseudorangeRateUncertaintyMetersPerSecond,AccumulatedDeltaRangeState,
175*4d7e907cSAndroid Build Coastguard Worker * AccumulatedDeltaRangeMeters,AccumulatedDeltaRangeUncertaintyMeters,CarrierFrequencyHz,
176*4d7e907cSAndroid Build Coastguard Worker * CarrierCycles,CarrierPhase,CarrierPhaseUncertainty,MultipathIndicator,SnrInDb,
177*4d7e907cSAndroid Build Coastguard Worker * ConstellationType,AgcDb,BasebandCn0DbHz,FullInterSignalBiasNanos,
178*4d7e907cSAndroid Build Coastguard Worker * FullInterSignalBiasUncertaintyNanos,SatelliteInterSignalBiasNanos,
179*4d7e907cSAndroid Build Coastguard Worker * SatelliteInterSignalBiasUncertaintyNanos,CodeType,ChipsetElapsedRealtimeNanos
180*4d7e907cSAndroid Build Coastguard Worker */
181*4d7e907cSAndroid Build Coastguard Worker ALOGD("Parsing %zu bytes rawMeasurementStr.", rawMeasurementStr.size());
182*4d7e907cSAndroid Build Coastguard Worker if (rawMeasurementStr.empty()) {
183*4d7e907cSAndroid Build Coastguard Worker return nullptr;
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker std::vector<std::string> rawMeasurementStrRecords;
186*4d7e907cSAndroid Build Coastguard Worker ParseUtils::splitStr(rawMeasurementStr, LINE_SEPARATOR, rawMeasurementStrRecords);
187*4d7e907cSAndroid Build Coastguard Worker if (rawMeasurementStrRecords.size() <= 1) {
188*4d7e907cSAndroid Build Coastguard Worker ALOGE("Raw GNSS Measurements parser failed. (No records) ");
189*4d7e907cSAndroid Build Coastguard Worker return nullptr;
190*4d7e907cSAndroid Build Coastguard Worker }
191*4d7e907cSAndroid Build Coastguard Worker
192*4d7e907cSAndroid Build Coastguard Worker // Get the column name mapping from the header.
193*4d7e907cSAndroid Build Coastguard Worker std::unordered_map<std::string, int> columnNameIdMapping =
194*4d7e907cSAndroid Build Coastguard Worker getColumnIdNameMappingFromHeader(rawMeasurementStrRecords[0]);
195*4d7e907cSAndroid Build Coastguard Worker
196*4d7e907cSAndroid Build Coastguard Worker if (columnNameIdMapping.size() < 37 || !ParseUtils::isValidHeader(columnNameIdMapping)) {
197*4d7e907cSAndroid Build Coastguard Worker ALOGE("Raw GNSS Measurements parser failed. (No header or missing columns.) ");
198*4d7e907cSAndroid Build Coastguard Worker return nullptr;
199*4d7e907cSAndroid Build Coastguard Worker }
200*4d7e907cSAndroid Build Coastguard Worker
201*4d7e907cSAndroid Build Coastguard Worker // Set GnssClock from 1st record.
202*4d7e907cSAndroid Build Coastguard Worker std::size_t pointer = 1;
203*4d7e907cSAndroid Build Coastguard Worker std::vector<std::string> firstRecordValues;
204*4d7e907cSAndroid Build Coastguard Worker ParseUtils::splitStr(rawMeasurementStrRecords[pointer], COMMA_SEPARATOR, firstRecordValues);
205*4d7e907cSAndroid Build Coastguard Worker GnssClock clock = {
206*4d7e907cSAndroid Build Coastguard Worker .gnssClockFlags = getClockFlags(firstRecordValues, columnNameIdMapping),
207*4d7e907cSAndroid Build Coastguard Worker .timeNs = ParseUtils::tryParseLongLong(
208*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("TimeNanos")], 0),
209*4d7e907cSAndroid Build Coastguard Worker .fullBiasNs = ParseUtils::tryParseLongLong(
210*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("FullBiasNanos")], 0),
211*4d7e907cSAndroid Build Coastguard Worker .biasNs = ParseUtils::tryParseDouble(
212*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("BiasNanos")], 0),
213*4d7e907cSAndroid Build Coastguard Worker .biasUncertaintyNs = ParseUtils::tryParseDouble(
214*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("BiasUncertaintyNanos")], 0),
215*4d7e907cSAndroid Build Coastguard Worker .driftNsps = ParseUtils::tryParseDouble(
216*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("DriftNanosPerSecond")], 0),
217*4d7e907cSAndroid Build Coastguard Worker .driftUncertaintyNsps = ParseUtils::tryParseDouble(
218*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("DriftNanosPerSecond")], 0),
219*4d7e907cSAndroid Build Coastguard Worker .hwClockDiscontinuityCount = ParseUtils::tryParseInt(
220*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("HardwareClockDiscontinuityCount")],
221*4d7e907cSAndroid Build Coastguard Worker 0)};
222*4d7e907cSAndroid Build Coastguard Worker
223*4d7e907cSAndroid Build Coastguard Worker ElapsedRealtime timestamp = {
224*4d7e907cSAndroid Build Coastguard Worker .flags = getElapsedRealtimeFlags(firstRecordValues, columnNameIdMapping),
225*4d7e907cSAndroid Build Coastguard Worker .timestampNs = ParseUtils::tryParseLongLong(
226*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("ChipsetElapsedRealtimeNanos")]),
227*4d7e907cSAndroid Build Coastguard Worker .timeUncertaintyNs = ParseUtils::tryParseDouble(
228*4d7e907cSAndroid Build Coastguard Worker firstRecordValues[columnNameIdMapping.at("TimeUncertaintyNanos")], 0)};
229*4d7e907cSAndroid Build Coastguard Worker
230*4d7e907cSAndroid Build Coastguard Worker std::vector<GnssMeasurement> measurementsVec;
231*4d7e907cSAndroid Build Coastguard Worker for (pointer = 1; pointer < rawMeasurementStrRecords.size(); pointer++) {
232*4d7e907cSAndroid Build Coastguard Worker std::vector<std::string> rawMeasurementValues;
233*4d7e907cSAndroid Build Coastguard Worker std::string line = rawMeasurementStrRecords[pointer];
234*4d7e907cSAndroid Build Coastguard Worker ParseUtils::splitStr(line, COMMA_SEPARATOR, rawMeasurementValues);
235*4d7e907cSAndroid Build Coastguard Worker GnssSignalType signalType = {
236*4d7e907cSAndroid Build Coastguard Worker .constellation = getGnssConstellationType(ParseUtils::tryParseInt(
237*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("ConstellationType")], 0)),
238*4d7e907cSAndroid Build Coastguard Worker .carrierFrequencyHz = ParseUtils::tryParseDouble(
239*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("CarrierFrequencyHz")], 0),
240*4d7e907cSAndroid Build Coastguard Worker .codeType = rawMeasurementValues[columnNameIdMapping.at("CodeType")],
241*4d7e907cSAndroid Build Coastguard Worker };
242*4d7e907cSAndroid Build Coastguard Worker GnssMeasurement measurement = {
243*4d7e907cSAndroid Build Coastguard Worker .flags = getRawMeasurementFlags(rawMeasurementValues, columnNameIdMapping),
244*4d7e907cSAndroid Build Coastguard Worker .svid = ParseUtils::tryParseInt(
245*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("Svid")], 0),
246*4d7e907cSAndroid Build Coastguard Worker .signalType = signalType,
247*4d7e907cSAndroid Build Coastguard Worker .receivedSvTimeInNs = ParseUtils::tryParseLongLong(
248*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("ReceivedSvTimeNanos")], 0),
249*4d7e907cSAndroid Build Coastguard Worker .receivedSvTimeUncertaintyInNs =
250*4d7e907cSAndroid Build Coastguard Worker ParseUtils::tryParseLongLong(rawMeasurementValues[columnNameIdMapping.at(
251*4d7e907cSAndroid Build Coastguard Worker "ReceivedSvTimeUncertaintyNanos")],
252*4d7e907cSAndroid Build Coastguard Worker 0),
253*4d7e907cSAndroid Build Coastguard Worker .antennaCN0DbHz = ParseUtils::tryParseDouble(
254*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("Cn0DbHz")], 0),
255*4d7e907cSAndroid Build Coastguard Worker .basebandCN0DbHz = ParseUtils::tryParseDouble(
256*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("BasebandCn0DbHz")], 0),
257*4d7e907cSAndroid Build Coastguard Worker .agcLevelDb = ParseUtils::tryParseDouble(
258*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("AgcDb")], 0),
259*4d7e907cSAndroid Build Coastguard Worker .pseudorangeRateMps =
260*4d7e907cSAndroid Build Coastguard Worker ParseUtils::tryParseDouble(rawMeasurementValues[columnNameIdMapping.at(
261*4d7e907cSAndroid Build Coastguard Worker "PseudorangeRateMetersPerSecond")],
262*4d7e907cSAndroid Build Coastguard Worker 0),
263*4d7e907cSAndroid Build Coastguard Worker .pseudorangeRateUncertaintyMps = ParseUtils::tryParseDouble(
264*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at(
265*4d7e907cSAndroid Build Coastguard Worker "PseudorangeRateUncertaintyMetersPerSecond")],
266*4d7e907cSAndroid Build Coastguard Worker 0),
267*4d7e907cSAndroid Build Coastguard Worker .accumulatedDeltaRangeState = ParseUtils::tryParseInt(
268*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("AccumulatedDeltaRangeState")],
269*4d7e907cSAndroid Build Coastguard Worker 0),
270*4d7e907cSAndroid Build Coastguard Worker .accumulatedDeltaRangeM = ParseUtils::tryParseDouble(
271*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("AccumulatedDeltaRangeMeters")],
272*4d7e907cSAndroid Build Coastguard Worker 0),
273*4d7e907cSAndroid Build Coastguard Worker .accumulatedDeltaRangeUncertaintyM = ParseUtils::tryParseDouble(
274*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at(
275*4d7e907cSAndroid Build Coastguard Worker "AccumulatedDeltaRangeUncertaintyMeters")],
276*4d7e907cSAndroid Build Coastguard Worker 0),
277*4d7e907cSAndroid Build Coastguard Worker .multipathIndicator = GnssMultipathIndicator::UNKNOWN, // Not in GnssLogger yet.
278*4d7e907cSAndroid Build Coastguard Worker .state = ParseUtils::tryParseInt(
279*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("State")], 0),
280*4d7e907cSAndroid Build Coastguard Worker .fullInterSignalBiasNs = ParseUtils::tryParseDouble(rawMeasurementValues[31], 0),
281*4d7e907cSAndroid Build Coastguard Worker .fullInterSignalBiasUncertaintyNs = ParseUtils::tryParseDouble(
282*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at("FullInterSignalBiasNanos")],
283*4d7e907cSAndroid Build Coastguard Worker 0),
284*4d7e907cSAndroid Build Coastguard Worker .satelliteInterSignalBiasNs =
285*4d7e907cSAndroid Build Coastguard Worker ParseUtils::tryParseDouble(rawMeasurementValues[columnNameIdMapping.at(
286*4d7e907cSAndroid Build Coastguard Worker "SatelliteInterSignalBiasNanos")],
287*4d7e907cSAndroid Build Coastguard Worker 0),
288*4d7e907cSAndroid Build Coastguard Worker .satelliteInterSignalBiasUncertaintyNs = ParseUtils::tryParseDouble(
289*4d7e907cSAndroid Build Coastguard Worker rawMeasurementValues[columnNameIdMapping.at(
290*4d7e907cSAndroid Build Coastguard Worker "SatelliteInterSignalBiasUncertaintyNanos")],
291*4d7e907cSAndroid Build Coastguard Worker 0),
292*4d7e907cSAndroid Build Coastguard Worker .satellitePvt = {},
293*4d7e907cSAndroid Build Coastguard Worker .correlationVectors = {}};
294*4d7e907cSAndroid Build Coastguard Worker measurementsVec.push_back(measurement);
295*4d7e907cSAndroid Build Coastguard Worker }
296*4d7e907cSAndroid Build Coastguard Worker
297*4d7e907cSAndroid Build Coastguard Worker GnssData gnssData = {
298*4d7e907cSAndroid Build Coastguard Worker .measurements = measurementsVec, .clock = clock, .elapsedRealtime = timestamp};
299*4d7e907cSAndroid Build Coastguard Worker return std::make_unique<GnssData>(gnssData);
300*4d7e907cSAndroid Build Coastguard Worker }
301*4d7e907cSAndroid Build Coastguard Worker
302*4d7e907cSAndroid Build Coastguard Worker } // namespace common
303*4d7e907cSAndroid Build Coastguard Worker } // namespace gnss
304*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware
305*4d7e907cSAndroid Build Coastguard Worker } // namespace android
306