static int _gpsdClientReadLoop(void) // start gpsd client - loop forever // return TRUE if main is exiting { int ret = 0; // debug //gps_enable_debug(3, stderr); //gps_enable_debug(8, stderr); // heart of the client for (;;) { GMUTEXLOCK(&_ais_list_mutex); if (NULL == _ais_list) { g_print("s52ais:_gpsdClientRead() no AIS list .. main exited .. terminate gpsRead thread\n"); ret = TRUE; goto exit; } GMUTEXUNLOCK(&_ais_list_mutex); if (FALSE == gps_waiting(&_gpsdata, 500*1000)) { // wait 0.5 sec (500*1000 uSec) //g_print("s52ais:_gpsdClientRead():gps_waiting() timed out\n"); GMUTEXLOCK(&_ais_list_mutex); _updateTimeTag(); GMUTEXUNLOCK(&_ais_list_mutex); } else { errno = 0; ret = gps_read(&_gpsdata); if (0 < ret) { // no error //g_print("s52ais:_gpsdClientRead():gps_read() ..\n"); // handle AIS data GMUTEXLOCK(&_ais_list_mutex); _updateAISdata(&_gpsdata); GMUTEXUNLOCK(&_ais_list_mutex); continue; } if (0 == ret) { g_print("s52ais:_gpsdClientRead():gps_read(): NO DATA .. [ret=0, errno=%i]\n", errno); continue; } else { g_print("s52ais:_gpsdClientRead():gps_read(): socket error 4 .. GPSD died [ret=%i, errno=%i]\n", ret, errno); goto exit; } } } exit: // exit thread GMUTEXUNLOCK(&_ais_list_mutex); return ret; }
static gpointer _gpsdClientRead(gpointer dummy) // start gpsd client - loop forever // return if _ais_list is NULL or 10 failed attempt to connect { int nWait = 0; g_print("s52ais:_gpsdClientRead(): start looping ..\n"); __builtin_bzero(&_gpsdata, sizeof(_gpsdata)); //* while (0 != gps_open(GPSD_HOST, GPSD_PORT, &_gpsdata)) { // android (gpsd 2.96) g_print("s52ais:_gpsdClientRead(): no gpsd running or network error, wait 1 sec: %d, %s\n", errno, gps_errstr(errno)); // try to connect to GPSD server, bailout after 10 failed attempt g_static_mutex_lock(&_ais_list_mutex); if ((NULL==_ais_list) || (10 <= ++nWait)) { g_print("s52ais:_gpsdClientRead() no AIS list (main exited) or no GPSD server.. terminate _gpsClientRead thread\n"); g_static_mutex_unlock(&_ais_list_mutex); return NULL; } g_static_mutex_unlock(&_ais_list_mutex); g_usleep(1000 * 1000); // 1.0 sec } if (-1 == gps_stream(&_gpsdata, WATCH_ENABLE|WATCH_NEWSTYLE, NULL)) { g_print("s52ais:_gpsdClientRead():gps_stream() failed .. exiting\n"); return NULL; } //*/ // debug //gps_enable_debug(3, stderr); //gps_enable_debug(8, stderr); // heart of the client for (;;) { g_static_mutex_lock(&_ais_list_mutex); if (NULL == _ais_list) { g_print("s52ais:_gpsdClientRead() no AIS list .. main exited .. terminate gpsRead thread\n"); goto exit; } g_static_mutex_unlock(&_ais_list_mutex); if (FALSE == gps_waiting(&_gpsdata, 500*1000)) { // wait 0.5 sec (500*1000 uSec) //g_print("s52ais:_gpsdClientRead():gps_waiting() timed out\n"); g_static_mutex_lock(&_ais_list_mutex); _updateTimeTag(); g_static_mutex_unlock(&_ais_list_mutex); } else { errno = 0; int ret = gps_read(&_gpsdata); if (0 < ret) { // no error //g_print("s52ais:_gpsdClientRead():gps_read() ..\n"); // handle AIS data g_static_mutex_lock(&_ais_list_mutex); _updateAISdata(&_gpsdata); g_static_mutex_unlock(&_ais_list_mutex); continue; } if (0 == ret) { g_print("s52ais:_gpsdClientRead():gps_read(): NO DATA .. [ret=0, errno=%i]\n", errno); continue; } else { g_print("s52ais:_gpsdClientRead():gps_read(): socket error 4 .. GPSD died [ret=%i, errno=%i]\n", ret, errno); goto exit; } } } exit: // exit thread g_static_mutex_unlock(&_ais_list_mutex); gps_stream(&_gpsdata, WATCH_DISABLE, NULL); gps_close(&_gpsdata); return dummy; }