1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "GnssMeasurement" 17*4d7e907cSAndroid Build Coastguard Worker 18*4d7e907cSAndroid Build Coastguard Worker #include "GnssMeasurement.h" 19*4d7e907cSAndroid Build Coastguard Worker #include "Utils.h" 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker #include <log/log.h> 22*4d7e907cSAndroid Build Coastguard Worker #include <utils/SystemClock.h> 23*4d7e907cSAndroid Build Coastguard Worker 24*4d7e907cSAndroid Build Coastguard Worker namespace android { 25*4d7e907cSAndroid Build Coastguard Worker namespace hardware { 26*4d7e907cSAndroid Build Coastguard Worker namespace gnss { 27*4d7e907cSAndroid Build Coastguard Worker namespace V2_0 { 28*4d7e907cSAndroid Build Coastguard Worker namespace implementation { 29*4d7e907cSAndroid Build Coastguard Worker 30*4d7e907cSAndroid Build Coastguard Worker using GnssConstellationType = V2_0::GnssConstellationType; 31*4d7e907cSAndroid Build Coastguard Worker using GnssMeasurementFlags = V1_0::IGnssMeasurementCallback::GnssMeasurementFlags; 32*4d7e907cSAndroid Build Coastguard Worker using GnssMeasurementState = V2_0::IGnssMeasurementCallback::GnssMeasurementState; 33*4d7e907cSAndroid Build Coastguard Worker using Utils = common::Utils; 34*4d7e907cSAndroid Build Coastguard Worker 35*4d7e907cSAndroid Build Coastguard Worker sp<V2_0::IGnssMeasurementCallback> GnssMeasurement::sCallback = nullptr; 36*4d7e907cSAndroid Build Coastguard Worker GnssMeasurement()37*4d7e907cSAndroid Build Coastguard WorkerGnssMeasurement::GnssMeasurement() : mMinIntervalMillis(1000) {} 38*4d7e907cSAndroid Build Coastguard Worker ~GnssMeasurement()39*4d7e907cSAndroid Build Coastguard WorkerGnssMeasurement::~GnssMeasurement() { 40*4d7e907cSAndroid Build Coastguard Worker stop(); 41*4d7e907cSAndroid Build Coastguard Worker } 42*4d7e907cSAndroid Build Coastguard Worker 43*4d7e907cSAndroid Build Coastguard Worker // Methods from V1_0::IGnssMeasurement follow. setCallback(const sp<V1_0::IGnssMeasurementCallback> &)44*4d7e907cSAndroid Build Coastguard WorkerReturn<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback( 45*4d7e907cSAndroid Build Coastguard Worker const sp<V1_0::IGnssMeasurementCallback>&) { 46*4d7e907cSAndroid Build Coastguard Worker // TODO implement 47*4d7e907cSAndroid Build Coastguard Worker return V1_0::IGnssMeasurement::GnssMeasurementStatus{}; 48*4d7e907cSAndroid Build Coastguard Worker } 49*4d7e907cSAndroid Build Coastguard Worker close()50*4d7e907cSAndroid Build Coastguard WorkerReturn<void> GnssMeasurement::close() { 51*4d7e907cSAndroid Build Coastguard Worker ALOGD("close"); 52*4d7e907cSAndroid Build Coastguard Worker stop(); 53*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex); 54*4d7e907cSAndroid Build Coastguard Worker sCallback = nullptr; 55*4d7e907cSAndroid Build Coastguard Worker return Void(); 56*4d7e907cSAndroid Build Coastguard Worker } 57*4d7e907cSAndroid Build Coastguard Worker 58*4d7e907cSAndroid Build Coastguard Worker // Methods from V1_1::IGnssMeasurement follow. setCallback_1_1(const sp<V1_1::IGnssMeasurementCallback> &,bool)59*4d7e907cSAndroid Build Coastguard WorkerReturn<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1( 60*4d7e907cSAndroid Build Coastguard Worker const sp<V1_1::IGnssMeasurementCallback>&, bool) { 61*4d7e907cSAndroid Build Coastguard Worker // TODO implement 62*4d7e907cSAndroid Build Coastguard Worker return V1_0::IGnssMeasurement::GnssMeasurementStatus{}; 63*4d7e907cSAndroid Build Coastguard Worker } 64*4d7e907cSAndroid Build Coastguard Worker 65*4d7e907cSAndroid Build Coastguard Worker // Methods from V2_0::IGnssMeasurement follow. setCallback_2_0(const sp<V2_0::IGnssMeasurementCallback> & callback,bool)66*4d7e907cSAndroid Build Coastguard WorkerReturn<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0( 67*4d7e907cSAndroid Build Coastguard Worker const sp<V2_0::IGnssMeasurementCallback>& callback, bool) { 68*4d7e907cSAndroid Build Coastguard Worker ALOGD("setCallback_2_0"); 69*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex); 70*4d7e907cSAndroid Build Coastguard Worker sCallback = callback; 71*4d7e907cSAndroid Build Coastguard Worker 72*4d7e907cSAndroid Build Coastguard Worker if (mIsActive) { 73*4d7e907cSAndroid Build Coastguard Worker ALOGW("GnssMeasurement callback already set. Resetting the callback..."); 74*4d7e907cSAndroid Build Coastguard Worker stop(); 75*4d7e907cSAndroid Build Coastguard Worker } 76*4d7e907cSAndroid Build Coastguard Worker start(); 77*4d7e907cSAndroid Build Coastguard Worker 78*4d7e907cSAndroid Build Coastguard Worker return V1_0::IGnssMeasurement::GnssMeasurementStatus::SUCCESS; 79*4d7e907cSAndroid Build Coastguard Worker } 80*4d7e907cSAndroid Build Coastguard Worker start()81*4d7e907cSAndroid Build Coastguard Workervoid GnssMeasurement::start() { 82*4d7e907cSAndroid Build Coastguard Worker ALOGD("start"); 83*4d7e907cSAndroid Build Coastguard Worker mIsActive = true; 84*4d7e907cSAndroid Build Coastguard Worker mThread = std::thread([this]() { 85*4d7e907cSAndroid Build Coastguard Worker while (mIsActive == true) { 86*4d7e907cSAndroid Build Coastguard Worker auto measurement = Utils::getMockMeasurementV2_0(); 87*4d7e907cSAndroid Build Coastguard Worker this->reportMeasurement(measurement); 88*4d7e907cSAndroid Build Coastguard Worker 89*4d7e907cSAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMillis)); 90*4d7e907cSAndroid Build Coastguard Worker } 91*4d7e907cSAndroid Build Coastguard Worker }); 92*4d7e907cSAndroid Build Coastguard Worker } 93*4d7e907cSAndroid Build Coastguard Worker stop()94*4d7e907cSAndroid Build Coastguard Workervoid GnssMeasurement::stop() { 95*4d7e907cSAndroid Build Coastguard Worker ALOGD("stop"); 96*4d7e907cSAndroid Build Coastguard Worker mIsActive = false; 97*4d7e907cSAndroid Build Coastguard Worker if (mThread.joinable()) { 98*4d7e907cSAndroid Build Coastguard Worker mThread.join(); 99*4d7e907cSAndroid Build Coastguard Worker } 100*4d7e907cSAndroid Build Coastguard Worker } 101*4d7e907cSAndroid Build Coastguard Worker reportMeasurement(const GnssData & data)102*4d7e907cSAndroid Build Coastguard Workervoid GnssMeasurement::reportMeasurement(const GnssData& data) { 103*4d7e907cSAndroid Build Coastguard Worker ALOGD("reportMeasurement()"); 104*4d7e907cSAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mMutex); 105*4d7e907cSAndroid Build Coastguard Worker if (sCallback == nullptr) { 106*4d7e907cSAndroid Build Coastguard Worker ALOGE("%s: GnssMeasurement::sCallback is null.", __func__); 107*4d7e907cSAndroid Build Coastguard Worker return; 108*4d7e907cSAndroid Build Coastguard Worker } 109*4d7e907cSAndroid Build Coastguard Worker sCallback->gnssMeasurementCb_2_0(data); 110*4d7e907cSAndroid Build Coastguard Worker } 111*4d7e907cSAndroid Build Coastguard Worker 112*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation 113*4d7e907cSAndroid Build Coastguard Worker } // namespace V2_0 114*4d7e907cSAndroid Build Coastguard Worker } // namespace gnss 115*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 116*4d7e907cSAndroid Build Coastguard Worker } // namespace android 117