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 な方向。