xref: /aosp_15_r20/hardware/interfaces/gnss/common/utils/default/GnssRawMeasurementParser.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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