blob: af75802871195922efc278c3a287f5653375bd2f [file] [log] [blame]
Michael Bestas3a0209e2023-05-04 01:15:47 +03001/*
2 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
3 * Not a Contribution
4 */
5/*
6 * Copyright (C) 2016 The Android Open Source Project
7 *
8 * Licensed under the Apache License, Version 2_0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2_0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21#define LOG_TAG "LocSvc_GnssMeasurementInterface"
22
23#include <log_util.h>
24#include "GnssMeasurement.h"
25#include "MeasurementAPIClient.h"
26
27namespace android {
28namespace hardware {
29namespace gnss {
30namespace V2_1 {
31namespace implementation {
32
33void GnssMeasurement::GnssMeasurementDeathRecipient::serviceDied(
34 uint64_t cookie, const wp<IBase>& who) {
35 LOC_LOGE("%s] service died. cookie: %llu, who: %p",
36 __FUNCTION__, static_cast<unsigned long long>(cookie), &who);
37 if (mGnssMeasurement != nullptr) {
38 mGnssMeasurement->close();
39 }
40}
41
42GnssMeasurement::GnssMeasurement() {
43 mGnssMeasurementDeathRecipient = new GnssMeasurementDeathRecipient(this);
44 mApi = new MeasurementAPIClient();
45}
46
47GnssMeasurement::~GnssMeasurement() {
48 if (mApi) {
49 mApi->destroy();
50 mApi = nullptr;
51 }
52}
53
54// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
55Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
56 const sp<V1_0::IGnssMeasurementCallback>& callback) {
57
58 Return<GnssMeasurement::GnssMeasurementStatus> ret =
59 IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
60 if (mGnssMeasurementCbIface != nullptr) {
61 LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
62 return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
63 }
64
65 if (callback == nullptr) {
66 LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
67 return ret;
68 }
69 if (mApi == nullptr) {
70 LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
71 return ret;
72 }
73
74 clearInterfaces();
75
76 mGnssMeasurementCbIface = callback;
77 mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
78
79 return mApi->measurementSetCallback(callback);
80}
81
82void GnssMeasurement::clearInterfaces() {
83 if (mGnssMeasurementCbIface != nullptr) {
84 mGnssMeasurementCbIface->unlinkToDeath(mGnssMeasurementDeathRecipient);
85 mGnssMeasurementCbIface = nullptr;
86 }
87 if (mGnssMeasurementCbIface_1_1 != nullptr) {
88 mGnssMeasurementCbIface_1_1->unlinkToDeath(mGnssMeasurementDeathRecipient);
89 mGnssMeasurementCbIface_1_1 = nullptr;
90 }
91 if (mGnssMeasurementCbIface_2_0 != nullptr) {
92 mGnssMeasurementCbIface_2_0->unlinkToDeath(mGnssMeasurementDeathRecipient);
93 mGnssMeasurementCbIface_2_0 = nullptr;
94 }
95 if (mGnssMeasurementCbIface_2_1 != nullptr) {
96 mGnssMeasurementCbIface_2_1->unlinkToDeath(mGnssMeasurementDeathRecipient);
97 mGnssMeasurementCbIface_2_1 = nullptr;
98 }
99}
100
101Return<void> GnssMeasurement::close() {
102 if (mApi == nullptr) {
103 LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
104 return Void();
105 }
106
107 clearInterfaces();
108 mApi->measurementClose();
109
110 return Void();
111}
112
113// Methods from ::android::hardware::gnss::V1_1::IGnssMeasurement follow.
114Return<GnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_1_1(
115 const sp<V1_1::IGnssMeasurementCallback>& callback, bool enableFullTracking) {
116
117 Return<GnssMeasurement::GnssMeasurementStatus> ret =
118 IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
119 if (mGnssMeasurementCbIface_1_1 != nullptr) {
120 LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
121 return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
122 }
123
124 if (callback == nullptr) {
125 LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
126 return ret;
127 }
128 if (nullptr == mApi) {
129 LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
130 return ret;
131 }
132
133 clearInterfaces();
134
135 mGnssMeasurementCbIface_1_1 = callback;
136 mGnssMeasurementCbIface_1_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
137
138 GnssPowerMode powerMode = enableFullTracking?
139 GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
140
141 return mApi->measurementSetCallback_1_1(callback, powerMode);
142}
143// Methods from ::android::hardware::gnss::V2_0::IGnssMeasurement follow.
144Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_0(
145 const sp<V2_0::IGnssMeasurementCallback>& callback,
146 bool enableFullTracking) {
147
148 Return<GnssMeasurement::GnssMeasurementStatus> ret =
149 IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
150 if (mGnssMeasurementCbIface_2_0 != nullptr) {
151 LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
152 return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
153 }
154
155 if (callback == nullptr) {
156 LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
157 return ret;
158 }
159 if (nullptr == mApi) {
160 LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
161 return ret;
162 }
163
164 clearInterfaces();
165
166 mGnssMeasurementCbIface_2_0 = callback;
167 mGnssMeasurementCbIface_2_0->linkToDeath(mGnssMeasurementDeathRecipient, 0);
168
169 GnssPowerMode powerMode = enableFullTracking ?
170 GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
171
172 return mApi->measurementSetCallback_2_0(callback, powerMode);
173}
174
175// Methods from ::android::hardware::gnss::V2_1::IGnssMeasurement follow.
176Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback_2_1(
177 const sp<::android::hardware::gnss::V2_1::IGnssMeasurementCallback>& callback,
178 bool enableFullTracking) {
179 Return<GnssMeasurement::GnssMeasurementStatus> ret =
180 IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
181 if (mGnssMeasurementCbIface_2_1 != nullptr) {
182 LOC_LOGE("%s]: GnssMeasurementCallback is already set", __FUNCTION__);
183 return IGnssMeasurement::GnssMeasurementStatus::ERROR_ALREADY_INIT;
184 }
185
186 if (callback == nullptr) {
187 LOC_LOGE("%s]: callback is nullptr", __FUNCTION__);
188 return ret;
189 }
190 if (nullptr == mApi) {
191 LOC_LOGE("%s]: mApi is nullptr", __FUNCTION__);
192 return ret;
193 }
194
195 clearInterfaces();
196
197 mGnssMeasurementCbIface_2_1 = callback;
198 mGnssMeasurementCbIface_2_1->linkToDeath(mGnssMeasurementDeathRecipient, 0);
199
200 GnssPowerMode powerMode = enableFullTracking ?
201 GNSS_POWER_MODE_M1 : GNSS_POWER_MODE_M2;
202
203 return mApi->measurementSetCallback_2_1(callback, powerMode);
204
205}
206
207} // namespace implementation
208} // namespace V2_1
209} // namespace gnss
210} // namespace hardware
211} // namespace android