blob: d778d508cd5e4396ec28878ad0073260d706ee2b [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"
Yu-Han Yangc06b5362019-10-25 14:14:35 -070019#include "Utils.h"
Pierre Fite-Georgel12ac2b52019-01-17 16:56:17 -080020
Yu-Han Yang030d0332018-12-09 10:47:42 -080021#include <log/log.h>
Pierre Fite-Georgel12ac2b52019-01-17 16:56:17 -080022#include <utils/SystemClock.h>
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080023
24namespace android {
25namespace hardware {
26namespace gnss {
27namespace V2_0 {
28namespace implementation {
29
Yu-Han Yang6999a0f2019-03-14 11:08:43 -070030using GnssConstellationType = V2_0::GnssConstellationType;
Yu-Han Yang030d0332018-12-09 10:47:42 -080031using GnssMeasurementFlags = V1_0::IGnssMeasurementCallback::GnssMeasurementFlags;
Yu-Han Yang031738b2019-02-01 19:58:04 -080032using GnssMeasurementState = V2_0::IGnssMeasurementCallback::GnssMeasurementState;
Yu-Han Yangc06b5362019-10-25 14:14:35 -070033using Utils = common::Utils;
Yu-Han Yang030d0332018-12-09 10:47:42 -080034
35sp<V2_0::IGnssMeasurementCallback> GnssMeasurement::sCallback = nullptr;
36
37GnssMeasurement::GnssMeasurement() : mMinIntervalMillis(1000) {}
38
39GnssMeasurement::~GnssMeasurement() {
40 stop();
41}
42
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080043// Methods from V1_0::IGnssMeasurement follow.
44Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
45 const sp<V1_0::IGnssMeasurementCallback>&) {
46 // TODO implement
47 return V1_0::IGnssMeasurement::GnssMeasurementStatus{};
48}
49
50Return<void> GnssMeasurement::close() {
Yu-Han Yang6999a0f2019-03-14 11:08:43 -070051 ALOGD("close");
Yu-Han Yang030d0332018-12-09 10:47:42 -080052 std::unique_lock<std::mutex> lock(mMutex);
53 stop();
54 sCallback = nullptr;
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080055 return Void();
56}
57
58// Methods from V1_1::IGnssMeasurement follow.
59Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
60 const sp<V1_1::IGnssMeasurementCallback>&, bool) {
61 // TODO implement
62 return V1_0::IGnssMeasurement::GnssMeasurementStatus{};
63}
64
65// Methods from V2_0::IGnssMeasurement follow.
66Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
Yu-Han Yang030d0332018-12-09 10:47:42 -080067 const sp<V2_0::IGnssMeasurementCallback>& callback, bool) {
Yu-Han Yang6999a0f2019-03-14 11:08:43 -070068 ALOGD("setCallback_2_0");
Yu-Han Yang030d0332018-12-09 10:47:42 -080069 std::unique_lock<std::mutex> lock(mMutex);
70 sCallback = callback;
71
72 if (mIsActive) {
73 ALOGW("GnssMeasurement callback already set. Resetting the callback...");
74 stop();
75 }
76 start();
77
78 return V1_0::IGnssMeasurement::GnssMeasurementStatus::SUCCESS;
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080079}
80
Yu-Han Yang030d0332018-12-09 10:47:42 -080081void GnssMeasurement::start() {
Yu-Han Yang6999a0f2019-03-14 11:08:43 -070082 ALOGD("start");
Yu-Han Yang030d0332018-12-09 10:47:42 -080083 mIsActive = true;
84 mThread = std::thread([this]() {
85 while (mIsActive == true) {
Yu-Han Yangc06b5362019-10-25 14:14:35 -070086 auto measurement = Utils::getMockMeasurementV2_0();
Yu-Han Yang030d0332018-12-09 10:47:42 -080087 this->reportMeasurement(measurement);
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -080088
Yu-Han Yang030d0332018-12-09 10:47:42 -080089 std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMillis));
90 }
91 });
92}
93
94void GnssMeasurement::stop() {
Yu-Han Yang6999a0f2019-03-14 11:08:43 -070095 ALOGD("stop");
Yu-Han Yang030d0332018-12-09 10:47:42 -080096 mIsActive = false;
97 if (mThread.joinable()) {
98 mThread.join();
99 }
100}
101
Yu-Han Yang030d0332018-12-09 10:47:42 -0800102void GnssMeasurement::reportMeasurement(const GnssData& data) {
103 ALOGD("reportMeasurement()");
104 std::unique_lock<std::mutex> lock(mMutex);
105 if (sCallback == nullptr) {
106 ALOGE("%s: GnssMeasurement::sCallback is null.", __func__);
107 return;
108 }
109 sCallback->gnssMeasurementCb_2_0(data);
110}
111
Yu-Han Yang9c6c20b2018-11-06 14:12:49 -0800112} // namespace implementation
113} // namespace V2_0
114} // namespace gnss
115} // namespace hardware
116} // namespace android