blob: 98a79ee27f9e784f670a88aa4bc423367aa72aff [file] [log] [blame]
Yu-Han Yang73f16ad2018-02-24 10:05:32 -08001#define LOG_TAG "Gnss"
2
Yu-Han Yang73f16ad2018-02-24 10:05:32 -08003#include <log/log.h>
Yu-Han Yang584ad322018-03-01 16:10:27 -08004
5#include "Gnss.h"
Yu-Han Yang73f16ad2018-02-24 10:05:32 -08006#include "GnssConfiguration.h"
7#include "GnssMeasurement.h"
8
9namespace android {
10namespace hardware {
11namespace gnss {
12namespace V1_1 {
13namespace implementation {
14
Yu-Han Yang584ad322018-03-01 16:10:27 -080015const uint32_t MIN_INTERVAL_MILLIS = 100;
16sp<::android::hardware::gnss::V1_1::IGnssCallback> Gnss::sGnssCallback = nullptr;
17
18Gnss::Gnss() : mMinIntervalMs(1000) {}
19
20Gnss::~Gnss() {
21 stop();
22}
23
Yu-Han Yang73f16ad2018-02-24 10:05:32 -080024// Methods from ::android::hardware::gnss::V1_0::IGnss follow.
25Return<bool> Gnss::setCallback(const sp<::android::hardware::gnss::V1_0::IGnssCallback>&) {
Yu-Han Yang584ad322018-03-01 16:10:27 -080026 // Mock handles only new callback (see setCallback1_1) coming from Android P+
27 return false;
Yu-Han Yang73f16ad2018-02-24 10:05:32 -080028}
29
30Return<bool> Gnss::start() {
Yu-Han Yang584ad322018-03-01 16:10:27 -080031 if (mIsActive) {
32 ALOGW("Gnss has started. Restarting...");
33 stop();
34 }
35
36 mIsActive = true;
37 mThread = std::thread([this]() {
38 while (mIsActive == true) {
39 V1_0::GnssLocation location = this->getMockLocation();
40 this->reportLocation(location);
41
42 std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMs));
43 }
44 });
45
46 return true;
Yu-Han Yang73f16ad2018-02-24 10:05:32 -080047}
48
49Return<bool> Gnss::stop() {
Yu-Han Yang584ad322018-03-01 16:10:27 -080050 mIsActive = false;
51 if (mThread.joinable()) {
52 mThread.join();
53 }
54 return true;
Yu-Han Yang73f16ad2018-02-24 10:05:32 -080055}
56
57Return<void> Gnss::cleanup() {
58 // TODO implement
59 return Void();
60}
61
62Return<bool> Gnss::injectTime(int64_t, int64_t, int32_t) {
63 // TODO implement
64 return bool{};
65}
66
67Return<bool> Gnss::injectLocation(double, double, float) {
68 // TODO implement
69 return bool{};
70}
71
72Return<void> Gnss::deleteAidingData(::android::hardware::gnss::V1_0::IGnss::GnssAidingData) {
73 // TODO implement
74 return Void();
75}
76
77Return<bool> Gnss::setPositionMode(::android::hardware::gnss::V1_0::IGnss::GnssPositionMode,
78 ::android::hardware::gnss::V1_0::IGnss::GnssPositionRecurrence,
79 uint32_t, uint32_t, uint32_t) {
80 // TODO implement
81 return bool{};
82}
83
84Return<sp<::android::hardware::gnss::V1_0::IAGnssRil>> Gnss::getExtensionAGnssRil() {
85 // TODO implement
86 return ::android::sp<::android::hardware::gnss::V1_0::IAGnssRil>{};
87}
88
89Return<sp<::android::hardware::gnss::V1_0::IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
90 // TODO implement
91 return ::android::sp<::android::hardware::gnss::V1_0::IGnssGeofencing>{};
92}
93
94Return<sp<::android::hardware::gnss::V1_0::IAGnss>> Gnss::getExtensionAGnss() {
95 // TODO implement
96 return ::android::sp<::android::hardware::gnss::V1_0::IAGnss>{};
97}
98
99Return<sp<::android::hardware::gnss::V1_0::IGnssNi>> Gnss::getExtensionGnssNi() {
100 // TODO implement
101 return ::android::sp<::android::hardware::gnss::V1_0::IGnssNi>{};
102}
103
104Return<sp<::android::hardware::gnss::V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
105 // TODO implement
106 return new GnssMeasurement();
107}
108
109Return<sp<::android::hardware::gnss::V1_0::IGnssNavigationMessage>>
110Gnss::getExtensionGnssNavigationMessage() {
111 // TODO implement
112 return ::android::sp<::android::hardware::gnss::V1_0::IGnssNavigationMessage>{};
113}
114
115Return<sp<::android::hardware::gnss::V1_0::IGnssXtra>> Gnss::getExtensionXtra() {
116 // TODO implement
117 return ::android::sp<::android::hardware::gnss::V1_0::IGnssXtra>{};
118}
119
120Return<sp<::android::hardware::gnss::V1_0::IGnssConfiguration>>
121Gnss::getExtensionGnssConfiguration() {
122 // TODO implement
123 return new GnssConfiguration();
124}
125
126Return<sp<::android::hardware::gnss::V1_0::IGnssDebug>> Gnss::getExtensionGnssDebug() {
127 // TODO implement
128 return ::android::sp<::android::hardware::gnss::V1_0::IGnssDebug>{};
129}
130
131Return<sp<::android::hardware::gnss::V1_0::IGnssBatching>> Gnss::getExtensionGnssBatching() {
132 // TODO implement
133 return ::android::sp<::android::hardware::gnss::V1_0::IGnssBatching>{};
134}
135
136// Methods from ::android::hardware::gnss::V1_1::IGnss follow.
Yu-Han Yang584ad322018-03-01 16:10:27 -0800137Return<bool> Gnss::setCallback_1_1(
138 const sp<::android::hardware::gnss::V1_1::IGnssCallback>& callback) {
139 if (callback == nullptr) {
140 ALOGE("%s: Null callback ignored", __func__);
141 return false;
142 }
143
144 sGnssCallback = callback;
145
146 uint32_t capabilities = 0x0;
147 auto ret = sGnssCallback->gnssSetCapabilitesCb(capabilities);
148 if (!ret.isOk()) {
149 ALOGE("%s: Unable to invoke callback", __func__);
150 }
151
152 IGnssCallback::GnssSystemInfo gnssInfo = {.yearOfHw = 2018};
153
154 ret = sGnssCallback->gnssSetSystemInfoCb(gnssInfo);
155 if (!ret.isOk()) {
156 ALOGE("%s: Unable to invoke callback", __func__);
157 }
158
159 auto gnssName = "Google Mock GNSS Implementation v1.1";
160 ret = sGnssCallback->gnssNameCb(gnssName);
161 if (!ret.isOk()) {
162 ALOGE("%s: Unable to invoke callback", __func__);
163 }
164
165 return true;
Yu-Han Yang73f16ad2018-02-24 10:05:32 -0800166}
167
168Return<bool> Gnss::setPositionMode_1_1(
169 ::android::hardware::gnss::V1_0::IGnss::GnssPositionMode,
Yu-Han Yang584ad322018-03-01 16:10:27 -0800170 ::android::hardware::gnss::V1_0::IGnss::GnssPositionRecurrence, uint32_t minIntervalMs,
171 uint32_t, uint32_t, bool) {
172 mMinIntervalMs = (minIntervalMs < MIN_INTERVAL_MILLIS) ? MIN_INTERVAL_MILLIS : minIntervalMs;
173 return true;
Yu-Han Yang73f16ad2018-02-24 10:05:32 -0800174}
175
176Return<sp<::android::hardware::gnss::V1_1::IGnssConfiguration>>
177Gnss::getExtensionGnssConfiguration_1_1() {
178 // TODO implement
179 return new GnssConfiguration();
180}
181
182Return<sp<::android::hardware::gnss::V1_1::IGnssMeasurement>>
183Gnss::getExtensionGnssMeasurement_1_1() {
184 // TODO implement
185 return new GnssMeasurement();
186}
187
188Return<bool> Gnss::injectBestLocation(const ::android::hardware::gnss::V1_0::GnssLocation&) {
189 // TODO implement
190 return bool{};
191}
192
Yu-Han Yang584ad322018-03-01 16:10:27 -0800193Return<V1_0::GnssLocation> Gnss::getMockLocation() {
194 V1_0::GnssLocation location = {.gnssLocationFlags = 0xFF,
195 .latitudeDegrees = 37.4219999,
196 .longitudeDegrees = -122.0840575,
197 .altitudeMeters = 1.60062531,
198 .speedMetersPerSec = 0,
199 .bearingDegrees = 0,
200 .horizontalAccuracyMeters = 5,
201 .verticalAccuracyMeters = 5,
202 .speedAccuracyMetersPerSecond = 1,
203 .bearingAccuracyDegrees = 90,
204 .timestamp = 1519930775453L};
205 return location;
206}
207
208Return<void> Gnss::reportLocation(const V1_0::GnssLocation& location) {
209 std::unique_lock<std::mutex> lock(mMutex);
210 if (sGnssCallback == nullptr) {
211 ALOGE("%s: sGnssCallback is null.", __func__);
212 return Void();
213 }
214 sGnssCallback->gnssLocationCb(location);
215 return Void();
216}
Yu-Han Yang73f16ad2018-02-24 10:05:32 -0800217
218} // namespace implementation
219} // namespace V1_1
220} // namespace gnss
221} // namespace hardware
222} // namespace android