/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "FixLocationParser.h" namespace android { namespace hardware { namespace gnss { namespace common { using aidl::android::hardware::gnss::ElapsedRealtime; using aidl::android::hardware::gnss::GnssLocation; std::unique_ptr FixLocationParser::getLocationFromInputStr( const std::string& locationStr) { /* * Fix,Provider,LatitudeDegrees,LongitudeDegrees,AltitudeMeters,SpeedMps, * AccuracyMeters,BearingDegrees,UnixTimeMillis,SpeedAccuracyMps,BearingAccuracyDegrees, * elapsedRealtimeNanos */ if (locationStr.empty()) { return nullptr; } std::vector locationStrRecords; ParseUtils::splitStr(locationStr, LINE_SEPARATOR, locationStrRecords); if (locationStrRecords.empty()) { return nullptr; } std::vector locationValues; ParseUtils::splitStr(locationStrRecords[0], COMMA_SEPARATOR, locationValues); if (locationValues.size() < 12) { return nullptr; } ElapsedRealtime elapsedRealtime = { .flags = ElapsedRealtime::HAS_TIMESTAMP_NS | ElapsedRealtime::HAS_TIME_UNCERTAINTY_NS, .timestampNs = ::android::elapsedRealtimeNano(), // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks. // In an actual implementation provide an estimate of the synchronization uncertainty // or don't set the field. .timeUncertaintyNs = 1020400}; GnssLocation location = { .gnssLocationFlags = 0xFF, .latitudeDegrees = ParseUtils::tryParseDouble(locationValues[2], 0), .longitudeDegrees = ParseUtils::tryParseDouble(locationValues[3], 0), .altitudeMeters = ParseUtils::tryParseDouble(locationValues[4], 0), .speedMetersPerSec = ParseUtils::tryParseDouble(locationValues[5], 0), .bearingDegrees = ParseUtils::tryParseDouble(locationValues[7], 0), .horizontalAccuracyMeters = ParseUtils::tryParseDouble(locationValues[6], 0), .verticalAccuracyMeters = ParseUtils::tryParseDouble(locationValues[6], 0), .speedAccuracyMetersPerSecond = ParseUtils::tryParseDouble(locationValues[9], 0), .bearingAccuracyDegrees = ParseUtils::tryParseDouble(locationValues[10], 0), .timestampMillis = ParseUtils::tryParseLongLong(locationValues[8], 0), .elapsedRealtime = elapsedRealtime}; return std::make_unique(location); } } // namespace common } // namespace gnss } // namespace hardware } // namespace android