gps_freerunner.c (4)
main thread を起こす gps_state_thread 手続きをもう少し確認。
基本的に epoll なナニを使って
- start, stop, quit な callback 経由のメセジを処理
- gps なデバイスからの入力の対応
をしている模様。例えば start な callback 経由であれば
static void gps_state_start( GpsState* s ) { char cmd = CMD_START; int ret; do { ret=write( s->control[0], &cmd, 1 ); } while (ret < 0 && errno == EINTR); if (ret != 1) D("%s: could not send CMD_START command: ret=%d: %s", __FUNCTION__, ret, strerror(errno)); }
が呼ばれて socketpair な片側に CMD_START を write してます。これを受けて gps_state_thread な epoll_wait が反応して以下が動くはず。
else if (cmd == CMD_START) { if (!started) { D("gps thread starting location_cb=%p", state->callbacks.location_cb); started = 1; gps_dev_start(gps_fd); GPS_STATUS_CB(state->callbacks, GPS_STATUS_SESSION_BEGIN); state->init = STATE_START; if ( pthread_create( &state->tmr_thread, NULL, gps_timer_thread, state ) != 0 ) { LOGE("could not create gps timer thread: %s", strerror(errno)); started = 0; state->init = STATE_INIT; goto Exit; } } }
詳細は省きますが、android_location_GpsLocationProvider.cpp な callback を呼び出しつつ諸々の処理をしてる模様。start なので gps_timer_thread も kick してます。この thread も非常に興味深いんですが、現時点ではスルー。
とは言え
gps なデバイスから随時読み出しつつ nmea_reader_addc 手続きに処理をお願いしては GpsLocation なナニに変換して gps_timer_thread なソレ経由にて android_location_GpsLocationProvider.cpp 方面に戻してますな。
とりあえず
nmea なパーザをちゃんと見てないんですけど、ソースに明快な矛盾は無いように見えます。てか、明日には盛り込んで make な方向。