Merge lp:~thomas-voss/platform-api/retry-loading-of-gps-hal into lp:platform-api

Proposed by Thomas Voß
Status: Merged
Approved by: Alfonso Sanchez-Beato
Approved revision: 326
Merged at revision: 322
Proposed branch: lp:~thomas-voss/platform-api/retry-loading-of-gps-hal
Merge into: lp:platform-api
Diff against target: 395 lines (+133/-140)
1 file modified
android/hybris/ubuntu_application_gps_for_hybris.cpp (+133/-140)
To merge this branch: bzr merge lp:~thomas-voss/platform-api/retry-loading-of-gps-hal
Reviewer Review Type Date Requested Status
Alfonso Sanchez-Beato Approve
Simon Fels Approve
PS Jenkins bot continuous-integration Pending
Review via email: mp+295216@code.launchpad.net

Commit message

Description of the change

To post a comment you must log in.
Revision history for this message
Simon Fels (morphis) wrote :

LGTM

Revision history for this message
Simon Fels (morphis) :
review: Approve
Revision history for this message
Alfonso Sanchez-Beato (alfonsosanchezbeato) wrote :

See inline comment.

review: Needs Information
Revision history for this message
Alfonso Sanchez-Beato (alfonsosanchezbeato) wrote :

Still crashing for me, unfortunately :-/

review: Needs Fixing
321. By Thomas Voß

Wait for 10 seconds in total, sampling roughly 5 times per second if the HAL is ready, yet.

322. By Thomas Voß

Make sure that the gnss_sv_status_callback is not NULL as the HAL implementation does not
check if the callback is NULL.

323. By Thomas Voß

Merge with remote branch.

324. By Thomas Voß

Fix typo.

325. By Thomas Voß

Place callback functions in anonymous namespace.

326. By Thomas Voß

Clean up scope of callback function definition.

Revision history for this message
Alfonso Sanchez-Beato (alfonsosanchezbeato) wrote :

LGTM, working without crashing now.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'android/hybris/ubuntu_application_gps_for_hybris.cpp'
2--- android/hybris/ubuntu_application_gps_for_hybris.cpp 2016-02-02 09:04:07 +0000
3+++ android/hybris/ubuntu_application_gps_for_hybris.cpp 2016-05-20 12:05:12 +0000
4@@ -23,6 +23,8 @@
5 #include <hardware/gps.h>
6 #include <hardware_legacy/power.h>
7
8+#include <unistd.h>
9+
10 #define WAKE_LOCK_NAME "U_HARDWARE_GPS"
11
12 struct UHardwareGps_
13@@ -78,78 +80,74 @@
14 namespace
15 {
16 UHardwareGps hybris_gps_instance = NULL;
17-}
18-
19-static void location_callback(GpsLocation* location)
20-{
21- if (!hybris_gps_instance)
22- return;
23-
24- hybris_gps_instance->location_cb(
25- reinterpret_cast<UHardwareGpsLocation*>(location),
26- hybris_gps_instance->context);
27-}
28-
29-static void status_callback(GpsStatus* status)
30-{
31- if (!hybris_gps_instance)
32- return;
33-
34- hybris_gps_instance->status_cb(status->status, hybris_gps_instance->context);
35-}
36-
37-static void sv_status_callback(GpsSvStatus* sv_status)
38-{
39- if (!hybris_gps_instance)
40- return;
41-
42- hybris_gps_instance->sv_status_cb(
43+
44+namespace cb
45+{
46+static void location(GpsLocation* location)
47+{
48+ if (hybris_gps_instance && hybris_gps_instance->location_cb)
49+ hybris_gps_instance->location_cb(
50+ reinterpret_cast<UHardwareGpsLocation*>(location),
51+ hybris_gps_instance->context);
52+}
53+
54+static void status(GpsStatus* status)
55+{
56+ if (hybris_gps_instance && hybris_gps_instance->status_cb)
57+ hybris_gps_instance->status_cb(status->status, hybris_gps_instance->context);
58+}
59+
60+static void sv_status(GpsSvStatus* sv_status)
61+{
62+ if (hybris_gps_instance && hybris_gps_instance->sv_status_cb)
63+ hybris_gps_instance->sv_status_cb(
64 reinterpret_cast<UHardwareGpsSvStatus*>(sv_status),
65 hybris_gps_instance->context);
66 }
67
68-static void nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)
69-{
70- if (!hybris_gps_instance)
71- return;
72-
73- hybris_gps_instance->nmea_cb(timestamp, nmea, length, hybris_gps_instance->context);
74-}
75-
76-static void set_capabilities_callback(uint32_t capabilities)
77-{
78- if (!hybris_gps_instance)
79- return;
80-
81- hybris_gps_instance->set_capabilities_cb(capabilities, hybris_gps_instance->context);
82-}
83-
84-static void acquire_wakelock_callback()
85+#ifdef BOARD_HAS_GNSS_STATUS_CALLBACK
86+static void gnss_sv_status(GnssSvStatus*)
87+{
88+ // Empty on purpose. We do not expose status information about
89+ // other satellites networks, yet.
90+}
91+#endif
92+
93+static void nmea(GpsUtcTime timestamp, const char* nmea, int length)
94+{
95+ if (hybris_gps_instance && hybris_gps_instance->nmea_cb)
96+ hybris_gps_instance->nmea_cb(timestamp, nmea, length, hybris_gps_instance->context);
97+}
98+
99+static void set_capabilities(uint32_t capabilities)
100+{
101+ if (hybris_gps_instance && hybris_gps_instance->set_capabilities_cb)
102+ hybris_gps_instance->set_capabilities_cb(capabilities, hybris_gps_instance->context);
103+}
104+
105+static void acquire_wakelock()
106 {
107 acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_NAME);
108 }
109
110-static void release_wakelock_callback()
111+static void release_wakelock()
112 {
113 release_wake_lock(WAKE_LOCK_NAME);
114 }
115
116-static void request_utc_time_callback()
117+static void request_utc_time()
118 {
119- if (!hybris_gps_instance)
120- return;
121-
122- hybris_gps_instance->request_utc_time_cb(hybris_gps_instance->context);
123+ if (hybris_gps_instance && hybris_gps_instance->request_utc_time_cb)
124+ hybris_gps_instance->request_utc_time_cb(hybris_gps_instance->context);
125 }
126
127-
128 typedef struct
129 {
130 void (*func)(void *);
131 void *arg;
132 } FuncAndArg;
133
134-static void * thread_start_wrapper(void* arg)
135+static void* thread_start_wrapper(void* arg)
136 {
137 FuncAndArg *func_and_arg = reinterpret_cast<FuncAndArg*>(arg);
138 func_and_arg->func(func_and_arg->arg);
139@@ -157,7 +155,7 @@
140 return NULL;
141 }
142
143-static pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg)
144+static pthread_t create_thread(const char* name, void (*start)(void *), void* arg)
145 {
146 pthread_t thread;
147
148@@ -169,92 +167,82 @@
149 return thread;
150 }
151
152-GpsCallbacks gps_callbacks =
153+GpsCallbacks gps =
154 {
155 sizeof(GpsCallbacks),
156- location_callback,
157- status_callback,
158- sv_status_callback,
159+ cb::location,
160+ cb::status,
161+ cb::sv_status,
162 #ifdef BOARD_HAS_GNSS_STATUS_CALLBACK
163- NULL,
164+ cb::gnss_sv_status,
165 #endif
166- nmea_callback,
167- set_capabilities_callback,
168- acquire_wakelock_callback,
169- release_wakelock_callback,
170- create_thread_callback,
171- request_utc_time_callback,
172+ cb::nmea,
173+ cb::set_capabilities,
174+ cb::acquire_wakelock,
175+ cb::release_wakelock,
176+ cb::create_thread,
177+ cb::request_utc_time,
178 };
179
180-static void xtra_download_request_callback()
181+static void xtra_download_request()
182 {
183- if (hybris_gps_instance)
184+ if (hybris_gps_instance && hybris_gps_instance->xtra_download_request_cb)
185 hybris_gps_instance->xtra_download_request_cb(hybris_gps_instance->context);
186 }
187
188-GpsXtraCallbacks gps_xtra_callbacks =
189+GpsXtraCallbacks gps_xtra =
190 {
191- xtra_download_request_callback,
192- create_thread_callback,
193+ cb::xtra_download_request,
194+ cb::create_thread,
195 };
196
197-static void agps_status_cb(AGpsStatus* agps_status)
198+static void agps_status(AGpsStatus* agps_status)
199 {
200- if (!hybris_gps_instance)
201- return;
202-
203- /*
204- uint32_t ipaddr;
205- // ipaddr field was not included in original AGpsStatus
206- if (agps_status->size >= sizeof(AGpsStatus))
207- ipaddr = agps_status->ipaddr;
208- else
209- ipaddr = 0xFFFFFFFF;
210- */
211-
212- hybris_gps_instance->agps_status_cb(
213- reinterpret_cast<UHardwareGpsAGpsStatus*>(agps_status), hybris_gps_instance->context);
214+ if (hybris_gps_instance && hybris_gps_instance->agps_status_cb)
215+ hybris_gps_instance->agps_status_cb(
216+ reinterpret_cast<UHardwareGpsAGpsStatus*>(agps_status), hybris_gps_instance->context);
217 }
218
219-AGpsCallbacks agps_callbacks =
220+AGpsCallbacks agps =
221 {
222- agps_status_cb,
223- create_thread_callback,
224+ cb::agps_status,
225+ cb::create_thread
226 };
227
228-static void gps_ni_notify_cb(GpsNiNotification *notification)
229+static void gps_ni_notify(GpsNiNotification *notification)
230 {
231- if (hybris_gps_instance)
232+ if (hybris_gps_instance && hybris_gps_instance->gps_ni_notify_cb)
233 hybris_gps_instance->gps_ni_notify_cb(
234 reinterpret_cast<UHardwareGpsNiNotification*>(notification),
235 hybris_gps_instance->context);
236 }
237
238-GpsNiCallbacks gps_ni_callbacks =
239+GpsNiCallbacks gps_ni =
240 {
241- gps_ni_notify_cb,
242- create_thread_callback,
243+ cb::gps_ni_notify,
244+ cb::create_thread,
245 };
246
247 static void agps_request_set_id(uint32_t flags)
248 {
249- if (hybris_gps_instance)
250+ if (hybris_gps_instance && hybris_gps_instance->request_setid_cb)
251 hybris_gps_instance->request_setid_cb(flags, hybris_gps_instance->context);
252 }
253
254 static void agps_request_ref_location(uint32_t flags)
255 {
256- if (hybris_gps_instance)
257+ if (hybris_gps_instance && hybris_gps_instance->request_refloc_cb)
258 hybris_gps_instance->request_refloc_cb(flags, hybris_gps_instance->context);
259 }
260
261-AGpsRilCallbacks agps_ril_callbacks =
262+AGpsRilCallbacks agps_ril =
263 {
264- agps_request_set_id,
265- agps_request_ref_location,
266- create_thread_callback,
267+ cb::agps_request_set_id,
268+ cb::agps_request_ref_location,
269+ cb::create_thread,
270 };
271-
272+}
273+}
274
275 UHardwareGps_::UHardwareGps_(UHardwareGpsParams* params)
276 : gps_interface(NULL),
277@@ -276,57 +264,56 @@
278 request_refloc_cb(params->request_refloc_cb),
279 context(params->context)
280 {
281+
282+}
283+
284+UHardwareGps_::~UHardwareGps_()
285+{
286+ if (gps_interface)
287+ gps_interface->cleanup();
288+}
289+
290+bool UHardwareGps_::init()
291+{
292 int err;
293 hw_module_t* module;
294
295 err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
296- if (err == 0)
297- {
298- hw_device_t* device;
299- err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);
300- if (err == 0)
301- {
302- gps_device_t* gps_device = (gps_device_t *)device;
303- gps_interface = gps_device->get_gps_interface(gps_device);
304- }
305- }
306- if (gps_interface)
307- {
308- gps_xtra_interface =
309+
310+ if (err != 0) return false;
311+
312+ hw_device_t* device;
313+ err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device);
314+
315+ if (err != 0) return false;
316+
317+ gps_device_t* gps_device = (gps_device_t *)device;
318+ gps_interface = gps_device->get_gps_interface(gps_device);
319+
320+ if (not gps_interface) return false;
321+ if (gps_interface->init(&cb::gps) != 0) return false;
322+
323+ gps_xtra_interface =
324 (const GpsXtraInterface*)gps_interface->get_extension(GPS_XTRA_INTERFACE);
325- agps_interface =
326+ agps_interface =
327 (const AGpsInterface*)gps_interface->get_extension(AGPS_INTERFACE);
328- gps_ni_interface =
329+ gps_ni_interface =
330 (const GpsNiInterface*)gps_interface->get_extension(GPS_NI_INTERFACE);
331- gps_debug_interface =
332+ gps_debug_interface =
333 (const GpsDebugInterface*)gps_interface->get_extension(GPS_DEBUG_INTERFACE);
334- agps_ril_interface =
335+ agps_ril_interface =
336 (const AGpsRilInterface*)gps_interface->get_extension(AGPS_RIL_INTERFACE);
337- }
338-}
339-
340-UHardwareGps_::~UHardwareGps_()
341-{
342- if (gps_interface)
343- gps_interface->cleanup();
344-}
345-
346-bool UHardwareGps_::init()
347-{
348- // fail if the main interface fails to initialize
349- if (!gps_interface || gps_interface->init(&gps_callbacks) != 0)
350- return false;
351-
352+
353 // if XTRA initialization fails we will disable it by gps_Xtra_interface to null,
354 // but continue to allow the rest of the GPS interface to work.
355- if (gps_xtra_interface && gps_xtra_interface->init(&gps_xtra_callbacks) != 0)
356+ if (gps_xtra_interface && gps_xtra_interface->init(&cb::gps_xtra) != 0)
357 gps_xtra_interface = NULL;
358 if (agps_interface)
359- agps_interface->init(&agps_callbacks);
360+ agps_interface->init(&cb::agps);
361 if (gps_ni_interface)
362- gps_ni_interface->init(&gps_ni_callbacks);
363+ gps_ni_interface->init(&cb::gps_ni);
364 if (agps_ril_interface)
365- agps_ril_interface->init(&agps_ril_callbacks);
366+ agps_ril_interface->init(&cb::agps_ril);
367
368 return true;
369 }
370@@ -430,13 +417,19 @@
371 UHardwareGps u_hardware_gps = new UHardwareGps_(params);
372 hybris_gps_instance = u_hardware_gps;
373
374- if (!u_hardware_gps->init())
375- {
376- delete u_hardware_gps;
377- u_hardware_gps = NULL;
378- }
379+ // Try ten times to initialize the GPS HAL interface,
380+ // sleeping for 200ms per iteration in case of issues.
381+ for (unsigned int i = 0; i < 50; i++)
382+ if (u_hardware_gps->init())
383+ return hybris_gps_instance = u_hardware_gps;
384+ else
385+ // Sleep for some time and leave some time for the system
386+ // to finish initialization.
387+ ::usleep(200 * 1000);
388
389- return u_hardware_gps;
390+ // This is the error case, as we did not succeed in initializing the GPS interface.
391+ delete u_hardware_gps;
392+ return hybris_gps_instance;
393 }
394
395 void u_hardware_gps_delete(UHardwareGps handle)

Subscribers

People subscribed via source and target branches