1 /*
2  * Copyright (C) 2020 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  */
16 
17 // Define LOG_TAG before <log/log.h> to overwrite the default value.
18 #define LOG_TAG "GnssMeasurementJni"
19 
20 #include "GnssMeasurement.h"
21 #include "Utils.h"
22 
23 using android::hardware::hidl_vec;
24 using android::hardware::Return;
25 
26 using IGnssMeasurementInterface = android::hardware::gnss::IGnssMeasurementInterface;
27 using IGnssMeasurement_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurement;
28 using IGnssMeasurement_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurement;
29 using IGnssMeasurement_V2_0 = android::hardware::gnss::V2_0::IGnssMeasurement;
30 using IGnssMeasurement_V2_1 = android::hardware::gnss::V2_1::IGnssMeasurement;
31 
32 namespace {
checkGnssMeasurementStatus(const IGnssMeasurement_V1_0::GnssMeasurementStatus & status)33 jboolean checkGnssMeasurementStatus(const IGnssMeasurement_V1_0::GnssMeasurementStatus& status) {
34     if (status != IGnssMeasurement_V1_0::GnssMeasurementStatus::SUCCESS) {
35         ALOGE("An error has been found on GnssMeasurementInterface::init, status=%d",
36               static_cast<int32_t>(status));
37         return JNI_FALSE;
38     } else {
39         ALOGD("gnss measurement infc has been enabled");
40         return JNI_TRUE;
41     }
42 }
43 } // anonymous namespace
44 
45 namespace android::gnss {
46 
47 // Implementation of GnssMeasurement
48 
GnssMeasurement(const sp<IGnssMeasurementInterface> & iGnssMeasurement)49 GnssMeasurement::GnssMeasurement(const sp<IGnssMeasurementInterface>& iGnssMeasurement)
50       : mIGnssMeasurement(iGnssMeasurement) {}
51 
setCallback(const std::unique_ptr<GnssMeasurementCallback> & callback,bool enableFullTracking,bool enableCorrVecOutputs)52 jboolean GnssMeasurement::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
53                                       bool enableFullTracking, bool enableCorrVecOutputs) {
54     auto status = mIGnssMeasurement->setCallback(callback->getAidl(), enableFullTracking,
55                                                  enableCorrVecOutputs);
56     return checkAidlStatus(status, "IGnssMeasurement setCallback() failed.");
57 }
58 
close()59 jboolean GnssMeasurement::close() {
60     auto status = mIGnssMeasurement->close();
61     return checkAidlStatus(status, "IGnssMeasurement close() failed.");
62 }
63 
64 // Implementation of GnssMeasurement_V1_0
65 
GnssMeasurement_V1_0(const sp<IGnssMeasurement_V1_0> & iGnssMeasurement)66 GnssMeasurement_V1_0::GnssMeasurement_V1_0(const sp<IGnssMeasurement_V1_0>& iGnssMeasurement)
67       : mIGnssMeasurement_V1_0(iGnssMeasurement) {}
68 
setCallback(const std::unique_ptr<GnssMeasurementCallback> & callback,bool enableFullTracking,bool enableCorrVecOutputs)69 jboolean GnssMeasurement_V1_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
70                                            bool enableFullTracking, bool enableCorrVecOutputs) {
71     if (enableFullTracking == true) {
72         ALOGW("Full tracking mode is not supported in 1.0 GNSS HAL.");
73     }
74     if (enableCorrVecOutputs == true) {
75         ALOGW("Correlation vector output is not supported in 1.0 GNSS HAL.");
76     }
77     auto status = mIGnssMeasurement_V1_0->setCallback(callback->getHidl());
78     if (!checkHidlReturn(status, "IGnssMeasurement setCallback() failed.")) {
79         return JNI_FALSE;
80     }
81 
82     return checkGnssMeasurementStatus(status);
83 }
84 
close()85 jboolean GnssMeasurement_V1_0::close() {
86     auto result = mIGnssMeasurement_V1_0->close();
87     return checkHidlReturn(result, "IGnssMeasurement close() failed.");
88 }
89 
90 // Implementation of GnssMeasurement_V1_1
91 
GnssMeasurement_V1_1(const sp<IGnssMeasurement_V1_1> & iGnssMeasurement)92 GnssMeasurement_V1_1::GnssMeasurement_V1_1(const sp<IGnssMeasurement_V1_1>& iGnssMeasurement)
93       : GnssMeasurement_V1_0{iGnssMeasurement}, mIGnssMeasurement_V1_1(iGnssMeasurement) {}
94 
setCallback(const std::unique_ptr<GnssMeasurementCallback> & callback,bool enableFullTracking,bool enableCorrVecOutputs)95 jboolean GnssMeasurement_V1_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
96                                            bool enableFullTracking, bool enableCorrVecOutputs) {
97     if (enableCorrVecOutputs == true) {
98         ALOGW("Correlation vector output is not supported in 1.1 GNSS HAL.");
99     }
100     auto status = mIGnssMeasurement_V1_1->setCallback_1_1(callback->getHidl(), enableFullTracking);
101     if (!checkHidlReturn(status, "IGnssMeasurement setCallback_V1_1() failed.")) {
102         return JNI_FALSE;
103     }
104 
105     return checkGnssMeasurementStatus(status);
106 }
107 
108 // Implementation of GnssMeasurement_V2_0
109 
GnssMeasurement_V2_0(const sp<IGnssMeasurement_V2_0> & iGnssMeasurement)110 GnssMeasurement_V2_0::GnssMeasurement_V2_0(const sp<IGnssMeasurement_V2_0>& iGnssMeasurement)
111       : GnssMeasurement_V1_1{iGnssMeasurement}, mIGnssMeasurement_V2_0(iGnssMeasurement) {}
112 
setCallback(const std::unique_ptr<GnssMeasurementCallback> & callback,bool enableFullTracking,bool enableCorrVecOutputs)113 jboolean GnssMeasurement_V2_0::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
114                                            bool enableFullTracking, bool enableCorrVecOutputs) {
115     if (enableCorrVecOutputs == true) {
116         ALOGW("Correlation vector output is not supported in 2.0 GNSS HAL.");
117     }
118     auto status = mIGnssMeasurement_V2_0->setCallback_2_0(callback->getHidl(), enableFullTracking);
119     if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_0() failed.")) {
120         return JNI_FALSE;
121     }
122 
123     return checkGnssMeasurementStatus(status);
124 }
125 
126 // Implementation of GnssMeasurement_V2_1
127 
GnssMeasurement_V2_1(const sp<IGnssMeasurement_V2_1> & iGnssMeasurement)128 GnssMeasurement_V2_1::GnssMeasurement_V2_1(const sp<IGnssMeasurement_V2_1>& iGnssMeasurement)
129       : GnssMeasurement_V2_0{iGnssMeasurement}, mIGnssMeasurement_V2_1(iGnssMeasurement) {}
130 
setCallback(const std::unique_ptr<GnssMeasurementCallback> & callback,bool enableFullTracking,bool enableCorrVecOutputs)131 jboolean GnssMeasurement_V2_1::setCallback(const std::unique_ptr<GnssMeasurementCallback>& callback,
132                                            bool enableFullTracking, bool enableCorrVecOutputs) {
133     if (enableCorrVecOutputs == true) {
134         ALOGW("Correlation vector output is not supported in 2.1 GNSS HAL.");
135     }
136     auto status = mIGnssMeasurement_V2_1->setCallback_2_1(callback->getHidl(), enableFullTracking);
137     if (!checkHidlReturn(status, "IGnssMeasurement setCallback_2_1() failed.")) {
138         return JNI_FALSE;
139     }
140 
141     return checkGnssMeasurementStatus(status);
142 }
143 
144 } // namespace android::gnss