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

Commit c12b3b69 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add TestGnssMeasurementCodeType VTS test"

parents 623ffca9 030d033b
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "Gnss.h"
#include <log/log.h>
#include "AGnssRil.h"
#include "GnssMeasurement.h"

namespace android {
namespace hardware {
@@ -93,8 +94,8 @@ Return<sp<V1_0::IGnssNi>> Gnss::getExtensionGnssNi() {
}

Return<sp<V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
    // TODO implement
    return sp<V1_0::IGnssMeasurement>{};
    // Not supported
    return nullptr;
}

Return<sp<V1_0::IGnssNavigationMessage>> Gnss::getExtensionGnssNavigationMessage() {
@@ -132,7 +133,7 @@ Return<bool> Gnss::setCallback_1_1(const sp<V1_1::IGnssCallback>& callback) {

    sGnssCallback_1_1 = callback;

    uint32_t capabilities = 0x0;
    uint32_t capabilities = (uint32_t)V1_0::IGnssCallback::Capabilities::MEASUREMENTS;
    auto ret = sGnssCallback_1_1->gnssSetCapabilitesCb(capabilities);
    if (!ret.isOk()) {
        ALOGE("%s: Unable to invoke callback", __func__);
@@ -167,8 +168,8 @@ Return<sp<V1_1::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration_1_1() {
}

Return<sp<V1_1::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_1_1() {
    // TODO implement
    return sp<V1_1::IGnssMeasurement>{};
    ALOGD("Gnss::getExtensionGnssMeasurement_1_1");
    return new GnssMeasurement();
}

Return<bool> Gnss::injectBestLocation(const V1_0::GnssLocation&) {
@@ -182,8 +183,8 @@ Return<sp<V2_0::IAGnssRil>> Gnss::getExtensionAGnssRil_2_0() {
}

Return<sp<V2_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement_2_0() {
    // TODO implement
    return sp<V2_0::IGnssMeasurement>{};
    ALOGD("Gnss::getExtensionGnssMeasurement_2_0");
    return new GnssMeasurement();
}

Return<sp<measurement_corrections::V1_0::IMeasurementCorrections>>
+97 −9
Original line number Diff line number Diff line
@@ -13,8 +13,10 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#define LOG_TAG "GnssMeasurement"

#include "GnssMeasurement.h"
#include <log/log.h>

namespace android {
namespace hardware {
@@ -22,6 +24,18 @@ namespace gnss {
namespace V2_0 {
namespace implementation {

using GnssConstellationType = V1_0::GnssConstellationType;
using GnssMeasurementFlags = V1_0::IGnssMeasurementCallback::GnssMeasurementFlags;
using GnssMeasurementState = V1_0::IGnssMeasurementCallback::GnssMeasurementState;

sp<V2_0::IGnssMeasurementCallback> GnssMeasurement::sCallback = nullptr;

GnssMeasurement::GnssMeasurement() : mMinIntervalMillis(1000) {}

GnssMeasurement::~GnssMeasurement() {
    stop();
}

// Methods from V1_0::IGnssMeasurement follow.
Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
    const sp<V1_0::IGnssMeasurementCallback>&) {
@@ -30,7 +44,9 @@ Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallba
}

Return<void> GnssMeasurement::close() {
    // TODO implement
    std::unique_lock<std::mutex> lock(mMutex);
    stop();
    sCallback = nullptr;
    return Void();
}

@@ -43,17 +59,89 @@ Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallba

// Methods from V2_0::IGnssMeasurement follow.
Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
    const sp<V2_0::IGnssMeasurementCallback>&, bool) {
    // TODO implement
    return V1_0::IGnssMeasurement::GnssMeasurementStatus{};
    const sp<V2_0::IGnssMeasurementCallback>& callback, bool) {
    std::unique_lock<std::mutex> lock(mMutex);
    sCallback = callback;

    if (mIsActive) {
        ALOGW("GnssMeasurement callback already set. Resetting the callback...");
        stop();
    }
    start();

    return V1_0::IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
}

void GnssMeasurement::start() {
    mIsActive = true;
    mThread = std::thread([this]() {
        while (mIsActive == true) {
            auto measurement = this->getMockMeasurement();
            this->reportMeasurement(measurement);

// Methods from ::android::hidl::base::V1_0::IBase follow.
            std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMillis));
        }
    });
}

void GnssMeasurement::stop() {
    mIsActive = false;
    if (mThread.joinable()) {
        mThread.join();
    }
}

GnssData GnssMeasurement::getMockMeasurement() {
    V1_0::IGnssMeasurementCallback::GnssMeasurement measurement_1_0 = {
        .flags = (uint32_t)GnssMeasurementFlags::HAS_CARRIER_FREQUENCY,
        .svid = (int16_t)6,
        .constellation = GnssConstellationType::GLONASS,
        .timeOffsetNs = 0.0,
        .state = GnssMeasurementState::STATE_CODE_LOCK | GnssMeasurementState::STATE_BIT_SYNC |
                 GnssMeasurementState::STATE_SUBFRAME_SYNC |
                 GnssMeasurementState::STATE_TOW_DECODED |
                 GnssMeasurementState::STATE_GLO_STRING_SYNC |
                 GnssMeasurementState::STATE_GLO_TOD_DECODED,
        .receivedSvTimeInNs = 8195997131077,
        .receivedSvTimeUncertaintyInNs = 15,
        .cN0DbHz = 30.0,
        .pseudorangeRateMps = -484.13739013671875,
        .pseudorangeRateUncertaintyMps = 1.0379999876022339,
        .accumulatedDeltaRangeState = (uint32_t)
            V1_0::IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_UNKNOWN,
        .accumulatedDeltaRangeM = 0.0,
        .accumulatedDeltaRangeUncertaintyM = 0.0,
        .carrierFrequencyHz = 1.59975e+09,
        .multipathIndicator =
            V1_0::IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN};
    V1_1::IGnssMeasurementCallback::GnssMeasurement measurement_1_1 = {.v1_0 = measurement_1_0};
    V2_0::IGnssMeasurementCallback::GnssMeasurement measurement_2_0 = {
        .v1_1 = measurement_1_1,
        .codeType = IGnssMeasurementCallback::GnssMeasurementCodeType::CODE_TYPE_C};

    hidl_vec<IGnssMeasurementCallback::GnssMeasurement> measurements(1);
    measurements[0] = measurement_2_0;
    V1_0::IGnssMeasurementCallback::GnssClock clock = {.timeNs = 2713545000000,
                                                       .fullBiasNs = -1226701900521857520,
                                                       .biasNs = 0.59689998626708984,
                                                       .biasUncertaintyNs = 47514.989972114563,
                                                       .driftNsps = -51.757811607455452,
                                                       .driftUncertaintyNsps = 310.64968328491528,
                                                       .hwClockDiscontinuityCount = 1};
    GnssData gnssData = {.measurements = measurements, .clock = clock};
    return gnssData;
}

void GnssMeasurement::reportMeasurement(const GnssData& data) {
    ALOGD("reportMeasurement()");
    std::unique_lock<std::mutex> lock(mMutex);
    if (sCallback == nullptr) {
        ALOGE("%s: GnssMeasurement::sCallback is null.", __func__);
        return;
    }
    sCallback->gnssMeasurementCb_2_0(data);
}

// IGnssMeasurement* HIDL_FETCH_IGnssMeasurement(const char* /* name */) {
// return new GnssMeasurement();
//}
//
}  // namespace implementation
}  // namespace V2_0
}  // namespace gnss
+19 −0
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@
#include <android/hardware/gnss/2.0/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <atomic>
#include <mutex>
#include <thread>

namespace android {
namespace hardware {
@@ -35,7 +38,11 @@ using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;

using GnssData = V2_0::IGnssMeasurementCallback::GnssData;

struct GnssMeasurement : public IGnssMeasurement {
    GnssMeasurement();
    ~GnssMeasurement();
    // Methods from V1_0::IGnssMeasurement follow.
    Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> setCallback(
        const sp<V1_0::IGnssMeasurementCallback>& callback) override;
@@ -48,6 +55,18 @@ struct GnssMeasurement : public IGnssMeasurement {
    // Methods from V2_0::IGnssMeasurement follow.
    Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> setCallback_2_0(
        const sp<V2_0::IGnssMeasurementCallback>& callback, bool enableFullTracking) override;

   private:
    void start();
    void stop();
    GnssData getMockMeasurement();
    void reportMeasurement(const GnssData&);

    static sp<IGnssMeasurementCallback> sCallback;
    std::atomic<long> mMinIntervalMillis;
    std::atomic<bool> mIsActive;
    std::thread mThread;
    mutable std::mutex mMutex;
};

}  // namespace implementation
+16 −0
Original line number Diff line number Diff line
@@ -38,6 +38,13 @@ void GnssHalTest::SetUp() {
}

void GnssHalTest::TearDown() {
    // Reset counters
    info_called_count_ = 0;
    capabilities_called_count_ = 0;
    location_called_count_ = 0;
    name_called_count_ = 0;
    measurement_called_count_ = 0;

    if (gnss_hal_ != nullptr) {
        gnss_hal_->cleanup();
    }
@@ -127,3 +134,12 @@ Return<void> GnssHalTest::GnssCallback::gnssSvStatusCb(
    parent_.list_gnss_sv_status_.emplace_back(svStatus);
    return Void();
}

Return<void> GnssHalTest::GnssMeasurementCallback::gnssMeasurementCb_2_0(
    const IGnssMeasurementCallback_2_0::GnssData& data) {
    ALOGD("GnssMeasurement received. Size = %d", (int)data.measurements.size());
    parent_.measurement_called_count_++;
    parent_.last_measurement_ = data;
    parent_.notify();
    return Void();
}
+32 −5
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ using android::hardware::gnss::V1_0::GnssLocation;
using android::hardware::gnss::V1_0::GnssLocationFlags;
using android::hardware::gnss::V1_1::IGnssCallback;
using android::hardware::gnss::V2_0::IGnss;
using IGnssMeasurementCallback_1_0 = android::hardware::gnss::V1_0::IGnssMeasurementCallback;
using IGnssMeasurementCallback_1_1 = android::hardware::gnss::V1_1::IGnssMeasurementCallback;
using IGnssMeasurementCallback_2_0 = android::hardware::gnss::V2_0::IGnssMeasurementCallback;

using android::sp;

@@ -100,6 +103,27 @@ class GnssHalTest : public ::testing::VtsHalHidlTargetTestBase {
        Return<void> gnssSvStatusCb(const IGnssCallback::GnssSvStatus& svStatus) override;
    };

    /* Callback class for GnssMeasurement. */
    class GnssMeasurementCallback : public IGnssMeasurementCallback_2_0 {
       public:
        GnssHalTest& parent_;
        GnssMeasurementCallback(GnssHalTest& parent) : parent_(parent){};
        virtual ~GnssMeasurementCallback() = default;

        // Methods from V1_0::IGnssMeasurementCallback follow.
        Return<void> GnssMeasurementCb(const IGnssMeasurementCallback_1_0::GnssData&) override {
            return Void();
        }

        // Methods from V1_1::IGnssMeasurementCallback follow.
        Return<void> gnssMeasurementCb(const IGnssMeasurementCallback_1_1::GnssData&) override {
            return Void();
        }

        // Methods from V2_0::IGnssMeasurementCallback follow.
        Return<void> gnssMeasurementCb_2_0(const IGnssMeasurementCallback_2_0::GnssData&) override;
    };

    /*
     * SetUpGnssCallback:
     *   Set GnssCallback and verify the result.
@@ -113,16 +137,19 @@ class GnssHalTest : public ::testing::VtsHalHidlTargetTestBase {
     * test.)
     */
    int info_called_count_;
    IGnssCallback::GnssSystemInfo last_info_;
    uint32_t last_capabilities_;
    int capabilities_called_count_;
    int location_called_count_;
    GnssLocation last_location_;
    list<IGnssCallback::GnssSvStatus> list_gnss_sv_status_;

    int measurement_called_count_;
    int name_called_count_;

    IGnssCallback::GnssSystemInfo last_info_;
    uint32_t last_capabilities_;
    GnssLocation last_location_;
    IGnssMeasurementCallback_2_0::GnssData last_measurement_;
    android::hardware::hidl_string last_name_;

    list<IGnssCallback::GnssSvStatus> list_gnss_sv_status_;

   private:
    std::mutex mtx_;
    std::condition_variable cv_;
Loading