75 lines
3.1 KiB
C++
75 lines
3.1 KiB
C++
/*
|
|
* 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<GnssLocation> 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<std::string> locationStrRecords;
|
|
ParseUtils::splitStr(locationStr, LINE_SEPARATOR, locationStrRecords);
|
|
if (locationStrRecords.empty()) {
|
|
return nullptr;
|
|
}
|
|
|
|
std::vector<std::string> 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<GnssLocation>(location);
|
|
}
|
|
|
|
} // namespace common
|
|
} // namespace gnss
|
|
} // namespace hardware
|
|
} // namespace android
|