1 /*
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 
27 namespace android {
28 namespace hardware {
29 namespace gnss {
30 namespace V2_1 {
31 namespace implementation {
32 
serviceDied(uint64_t cookie,const wp<IBase> & who)33 void 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 
GnssMeasurement()42 GnssMeasurement::GnssMeasurement() {
43     mGnssMeasurementDeathRecipient = new GnssMeasurementDeathRecipient(this);
44     mApi = new MeasurementAPIClient();
45 }
46 
~GnssMeasurement()47 GnssMeasurement::~GnssMeasurement() {
48     if (mApi) {
49         mApi->destroy();
50         mApi = nullptr;
51     }
52 }
53 
54 // Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
setCallback(const sp<V1_0::IGnssMeasurementCallback> & callback)55 Return<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 
clearInterfaces()82 void 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 
close()101 Return<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.
setCallback_1_1(const sp<V1_1::IGnssMeasurementCallback> & callback,bool enableFullTracking)114 Return<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.
setCallback_2_0(const sp<V2_0::IGnssMeasurementCallback> & callback,bool enableFullTracking)144 Return<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.
setCallback_2_1(const sp<::android::hardware::gnss::V2_1::IGnssMeasurementCallback> & callback,bool enableFullTracking)176 Return<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
212