Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fcb7bf3 authored by Yu-Han Yang's avatar Yu-Han Yang
Browse files

Add GNSS HAL v3.0 (hardware/interfaces)

Bug: 158518085

Test: atest VtsHalGnssV3_0TargetTest
      atest VtsHalGnssV2_1TargetTest
      atest VtsHalGnssV2_0TargetTest
      atest VtsHalGnssV1_1TargetTest
      atest VtsHalGnssV1_0TargetTest

Change-Id: Id4ac1e31207da7cfff3f1885c84748785bec19ba
parent 30158806
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -203,6 +203,7 @@
    <hal format="hidl" optional="true">
        <name>android.hardware.gnss</name>
        <version>2.0-1</version>
        <version>3.0</version>
        <interface>
            <name>IGnss</name>
            <instance>default</instance>
+3 −2
Original line number Diff line number Diff line
@@ -12,13 +12,13 @@ hidl_interface {
        "IGnssAntennaInfo.hal",
        "IGnssAntennaInfoCallback.hal",
        "IGnssCallback.hal",
        "IGnssConfiguration.hal",
        "IGnssMeasurement.hal",
        "IGnssMeasurementCallback.hal",
        "IGnssConfiguration.hal",
    ],
    interfaces: [
        "android.hardware.gnss.measurement_corrections@1.1",
        "android.hardware.gnss.measurement_corrections@1.0",
        "android.hardware.gnss.measurement_corrections@1.1",
        "android.hardware.gnss.visibility_control@1.0",
        "android.hardware.gnss@1.0",
        "android.hardware.gnss@1.1",
@@ -26,4 +26,5 @@ hidl_interface {
        "android.hidl.base@1.0",
    ],
    gen_java: true,
    gen_java_constants: true,
}
+0 −6
Original line number Diff line number Diff line
@@ -21,12 +21,6 @@ cc_binary {
    vendor: true,
    vintf_fragments: ["android.hardware.gnss@2.1-service.xml"],
    srcs: [
        "Gnss.cpp",
        "GnssAntennaInfo.cpp",
        "GnssDebug.cpp",
        "GnssMeasurement.cpp",
        "GnssMeasurementCorrections.cpp",
        "GnssConfiguration.cpp",
        "service.cpp",
    ],
    shared_libs: [

gnss/2.1/default/Gnss.h

deleted100644 → 0
+0 −128
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.
 */

#pragma once

#include <android/hardware/gnss/2.1/IGnss.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <atomic>
#include <mutex>
#include <thread>
#include "GnssAntennaInfo.h"
#include "GnssConfiguration.h"
#include "NmeaFixInfo.h"

namespace android {
namespace hardware {
namespace gnss {
namespace V2_1 {

using GnssSvInfo = IGnssCallback::GnssSvInfo;
using ::android::hardware::gnss::common::NmeaFixInfo;

namespace implementation {

constexpr int INPUT_BUFFER_SIZE = 128;
constexpr char CMD_GET_LOCATION[] = "CMD_GET_LOCATION";
constexpr char GNSS_PATH[] = "/dev/gnss0";

struct Gnss : public IGnss {
    Gnss();
    ~Gnss();
    // Methods from V1_0::IGnss follow.
    Return<bool> setCallback(const sp<V1_0::IGnssCallback>& callback) override;
    Return<bool> start() override;
    Return<bool> stop() override;
    Return<void> cleanup() override;
    Return<bool> injectTime(int64_t timeMs, int64_t timeReferenceMs,
                            int32_t uncertaintyMs) override;
    Return<bool> injectLocation(double latitudeDegrees, double longitudeDegrees,
                                float accuracyMeters) override;
    Return<void> deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) override;
    Return<bool> setPositionMode(V1_0::IGnss::GnssPositionMode mode,
                                 V1_0::IGnss::GnssPositionRecurrence recurrence,
                                 uint32_t minIntervalMs, uint32_t preferredAccuracyMeters,
                                 uint32_t preferredTimeMs) override;
    Return<sp<V1_0::IAGnssRil>> getExtensionAGnssRil() override;
    Return<sp<V1_0::IGnssGeofencing>> getExtensionGnssGeofencing() override;
    Return<sp<V1_0::IAGnss>> getExtensionAGnss() override;
    Return<sp<V1_0::IGnssNi>> getExtensionGnssNi() override;
    Return<sp<V1_0::IGnssMeasurement>> getExtensionGnssMeasurement() override;
    Return<sp<V1_0::IGnssNavigationMessage>> getExtensionGnssNavigationMessage() override;
    Return<sp<V1_0::IGnssXtra>> getExtensionXtra() override;
    Return<sp<V1_0::IGnssConfiguration>> getExtensionGnssConfiguration() override;
    Return<sp<V1_0::IGnssDebug>> getExtensionGnssDebug() override;
    Return<sp<V1_0::IGnssBatching>> getExtensionGnssBatching() override;

    // Methods from V1_1::IGnss follow.
    Return<bool> setCallback_1_1(const sp<V1_1::IGnssCallback>& callback) override;
    Return<bool> setPositionMode_1_1(V1_0::IGnss::GnssPositionMode mode,
                                     V1_0::IGnss::GnssPositionRecurrence recurrence,
                                     uint32_t minIntervalMs, uint32_t preferredAccuracyMeters,
                                     uint32_t preferredTimeMs, bool lowPowerMode) override;
    Return<sp<V1_1::IGnssConfiguration>> getExtensionGnssConfiguration_1_1() override;
    Return<sp<V1_1::IGnssMeasurement>> getExtensionGnssMeasurement_1_1() override;
    Return<bool> injectBestLocation(const V1_0::GnssLocation& location) override;

    // Methods from V2_0::IGnss follow.
    Return<bool> setCallback_2_0(const sp<V2_0::IGnssCallback>& callback) override;
    Return<sp<V2_0::IGnssConfiguration>> getExtensionGnssConfiguration_2_0() override;
    Return<sp<V2_0::IGnssDebug>> getExtensionGnssDebug_2_0() override;
    Return<sp<V2_0::IAGnss>> getExtensionAGnss_2_0() override;
    Return<sp<V2_0::IAGnssRil>> getExtensionAGnssRil_2_0() override;
    Return<sp<V2_0::IGnssMeasurement>> getExtensionGnssMeasurement_2_0() override;
    Return<sp<measurement_corrections::V1_0::IMeasurementCorrections>>
    getExtensionMeasurementCorrections() override;
    Return<sp<visibility_control::V1_0::IGnssVisibilityControl>> getExtensionVisibilityControl()
            override;
    Return<sp<V2_0::IGnssBatching>> getExtensionGnssBatching_2_0() override;
    Return<bool> injectBestLocation_2_0(const V2_0::GnssLocation& location) override;

    // Methods from V2_1::IGnss follow.
    Return<bool> setCallback_2_1(const sp<V2_1::IGnssCallback>& callback) override;
    Return<sp<V2_1::IGnssMeasurement>> getExtensionGnssMeasurement_2_1() override;
    Return<sp<V2_1::IGnssConfiguration>> getExtensionGnssConfiguration_2_1() override;
    Return<sp<measurement_corrections::V1_1::IMeasurementCorrections>>
    getExtensionMeasurementCorrections_1_1() override;
    Return<sp<V2_1::IGnssAntennaInfo>> getExtensionGnssAntennaInfo() override;

  private:
    std::unique_ptr<V2_0::GnssLocation> getLocationFromHW();
    void reportLocation(const V2_0::GnssLocation&) const;
    void reportLocation(const V1_0::GnssLocation&) const;
    void reportSvStatus(const hidl_vec<GnssSvInfo>&) const;

    static sp<V2_1::IGnssCallback> sGnssCallback_2_1;
    static sp<V2_0::IGnssCallback> sGnssCallback_2_0;
    static sp<V1_1::IGnssCallback> sGnssCallback_1_1;
    static sp<V1_0::IGnssCallback> sGnssCallback_1_0;
    std::atomic<long> mMinIntervalMs;
    sp<GnssConfiguration> mGnssConfiguration;
    std::atomic<bool> mIsActive;
    std::atomic<bool> mHardwareModeOn;
    std::atomic<int> mGnssFd;
    std::thread mThread;

    mutable std::mutex mMutex;
    hidl_vec<GnssSvInfo> filterBlacklistedSatellitesV2_1(hidl_vec<GnssSvInfo> gnssSvInfoList);
};

}  // namespace implementation
}  // namespace V2_1
}  // namespace gnss
}  // namespace hardware
}  // namespace android
+3 −3
Original line number Diff line number Diff line
@@ -18,17 +18,17 @@

#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
#include "Gnss.h"
#include "v2_1/GnssTemplate.h"

using ::android::OK;
using ::android::sp;
using ::android::hardware::configureRpcThreadpool;
using ::android::hardware::joinRpcThreadpool;
using ::android::hardware::gnss::common::implementation::GnssTemplate;
using ::android::hardware::gnss::V2_1::IGnss;
using ::android::hardware::gnss::V2_1::implementation::Gnss;

int main(int /* argc */, char* /* argv */[]) {
    sp<IGnss> gnss = new Gnss();
    sp<IGnss> gnss = new GnssTemplate<IGnss>();
    configureRpcThreadpool(1, true /* will join */);
    if (gnss->registerAsService() != OK) {
        ALOGE("Could not register gnss 2.1 service.");
Loading