blob: a62c2dd27e150ec689bea98ddcdd9b44210e6b00 [file] [log] [blame]
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -08001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Yu-Han Yang030d0332018-12-09 10:47:42 -080016#define LOG_TAG "GnssMeasurement"
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080017
18#include "GnssMeasurement.h"
Pierre Fite-Georgel12ac2b52019-01-17 16:56:17 -080019
Yu-Han Yang030d0332018-12-09 10:47:42 -080020#include <log/log.h>
Pierre Fite-Georgel12ac2b52019-01-17 16:56:17 -080021#include <utils/SystemClock.h>
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080022
23namespace android {
24namespace hardware {
25namespace gnss {
26namespace V2_0 {
27namespace implementation {
28
Yu-Han Yang030d0332018-12-09 10:47:42 -080029using GnssConstellationType = V1_0::GnssConstellationType;
30using GnssMeasurementFlags = V1_0::IGnssMeasurementCallback::GnssMeasurementFlags;
Yu-Han Yang031738b2019-02-01 19:58:04 -080031using GnssMeasurementState = V2_0::IGnssMeasurementCallback::GnssMeasurementState;
Yu-Han Yang030d0332018-12-09 10:47:42 -080032
33sp<V2_0::IGnssMeasurementCallback> GnssMeasurement::sCallback = nullptr;
34
35GnssMeasurement::GnssMeasurement() : mMinIntervalMillis(1000) {}
36
37GnssMeasurement::~GnssMeasurement() {
38 stop();
39}
40
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080041// Methods from V1_0::IGnssMeasurement follow.
42Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
43 const sp<V1_0::IGnssMeasurementCallback>&) {
44 // TODO implement
45 return V1_0::IGnssMeasurement::GnssMeasurementStatus{};
46}
47
48Return<void> GnssMeasurement::close() {
Yu-Han Yang030d0332018-12-09 10:47:42 -080049 std::unique_lock<std::mutex> lock(mMutex);
50 stop();
51 sCallback = nullptr;
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080052 return Void();
53}
54
55// Methods from V1_1::IGnssMeasurement follow.
56Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
57 const sp<V1_1::IGnssMeasurementCallback>&, bool) {
58 // TODO implement
59 return V1_0::IGnssMeasurement::GnssMeasurementStatus{};
60}
61
62// Methods from V2_0::IGnssMeasurement follow.
63Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
Yu-Han Yang030d0332018-12-09 10:47:42 -080064 const sp<V2_0::IGnssMeasurementCallback>& callback, bool) {
65 std::unique_lock<std::mutex> lock(mMutex);
66 sCallback = callback;
67
68 if (mIsActive) {
69 ALOGW("GnssMeasurement callback already set. Resetting the callback...");
70 stop();
71 }
72 start();
73
74 return V1_0::IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080075}
76
Yu-Han Yang030d0332018-12-09 10:47:42 -080077void GnssMeasurement::start() {
78 mIsActive = true;
79 mThread = std::thread([this]() {
80 while (mIsActive == true) {
81 auto measurement = this->getMockMeasurement();
82 this->reportMeasurement(measurement);
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080083
Yu-Han Yang030d0332018-12-09 10:47:42 -080084 std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMillis));
85 }
86 });
87}
88
89void GnssMeasurement::stop() {
90 mIsActive = false;
91 if (mThread.joinable()) {
92 mThread.join();
93 }
94}
95
96GnssData GnssMeasurement::getMockMeasurement() {
97 V1_0::IGnssMeasurementCallback::GnssMeasurement measurement_1_0 = {
98 .flags = (uint32_t)GnssMeasurementFlags::HAS_CARRIER_FREQUENCY,
99 .svid = (int16_t)6,
100 .constellation = GnssConstellationType::GLONASS,
101 .timeOffsetNs = 0.0,
Yu-Han Yang030d0332018-12-09 10:47:42 -0800102 .receivedSvTimeInNs = 8195997131077,
103 .receivedSvTimeUncertaintyInNs = 15,
104 .cN0DbHz = 30.0,
105 .pseudorangeRateMps = -484.13739013671875,
106 .pseudorangeRateUncertaintyMps = 1.0379999876022339,
107 .accumulatedDeltaRangeState = (uint32_t)
108 V1_0::IGnssMeasurementCallback::GnssAccumulatedDeltaRangeState::ADR_STATE_UNKNOWN,
109 .accumulatedDeltaRangeM = 0.0,
110 .accumulatedDeltaRangeUncertaintyM = 0.0,
111 .carrierFrequencyHz = 1.59975e+09,
112 .multipathIndicator =
113 V1_0::IGnssMeasurementCallback::GnssMultipathIndicator::INDICATOR_UNKNOWN};
114 V1_1::IGnssMeasurementCallback::GnssMeasurement measurement_1_1 = {.v1_0 = measurement_1_0};
Yu-Han Yang031738b2019-02-01 19:58:04 -0800115 V2_0::IGnssMeasurementCallback::GnssMeasurement measurement_2_0 = {
116 .v1_1 = measurement_1_1,
Yu-Han Yang221a85e2019-03-11 19:06:10 -0700117 .codeType = "C",
Yu-Han Yang031738b2019-02-01 19:58:04 -0800118 .state = GnssMeasurementState::STATE_CODE_LOCK | GnssMeasurementState::STATE_BIT_SYNC |
119 GnssMeasurementState::STATE_SUBFRAME_SYNC |
120 GnssMeasurementState::STATE_TOW_DECODED |
121 GnssMeasurementState::STATE_GLO_STRING_SYNC |
122 GnssMeasurementState::STATE_GLO_TOD_DECODED};
Yu-Han Yang030d0332018-12-09 10:47:42 -0800123
124 hidl_vec<IGnssMeasurementCallback::GnssMeasurement> measurements(1);
125 measurements[0] = measurement_2_0;
126 V1_0::IGnssMeasurementCallback::GnssClock clock = {.timeNs = 2713545000000,
127 .fullBiasNs = -1226701900521857520,
128 .biasNs = 0.59689998626708984,
129 .biasUncertaintyNs = 47514.989972114563,
130 .driftNsps = -51.757811607455452,
131 .driftUncertaintyNsps = 310.64968328491528,
132 .hwClockDiscontinuityCount = 1};
Pierre Fite-Georgel12ac2b52019-01-17 16:56:17 -0800133
134 ElapsedRealtime timestamp = {
135 .flags = ElapsedRealtimeFlags::HAS_TIMESTAMP_NS |
136 ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS,
137 .timestampNs = static_cast<uint64_t>(::android::elapsedRealtimeNano()),
138 // This is an hardcoded value indicating a 1ms of uncertainty between the two clocks.
139 // In an actual implementation provide an estimate of the synchronization uncertainty
140 // or don't set the field.
141 .timeUncertaintyNs = 1000000};
142
143 GnssData gnssData = {
144 .measurements = measurements, .clock = clock, .elapsedRealtime = timestamp};
Yu-Han Yang030d0332018-12-09 10:47:42 -0800145 return gnssData;
146}
147
148void GnssMeasurement::reportMeasurement(const GnssData& data) {
149 ALOGD("reportMeasurement()");
150 std::unique_lock<std::mutex> lock(mMutex);
151 if (sCallback == nullptr) {
152 ALOGE("%s: GnssMeasurement::sCallback is null.", __func__);
153 return;
154 }
155 sCallback->gnssMeasurementCb_2_0(data);
156}
157
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -0800158} // namespace implementation
159} // namespace V2_0
160} // namespace gnss
161} // namespace hardware
162} // namespace android