今日のメモ
昨晩エントリでメモッたナニを色々盛り込んでみました。
- vendor/sola/a500fx/BoardConfig.mk
- BOARD_GPS_LIBRARIES に libfreerunner_gps 代入
- BOARD_HAVE_FREERUNNER_GPS に true 代入
- build/core/prelink-linux-arm.map
- libfreerunner_gps.so なエントリを末端に追加
後は freerunner なブランチを作って baud rate とかの盛り込みが必要。
とりあえず
external 配下に clone
$ git clone git://gitorious.org/android-on-freerunner/freerunner_platform_hardware_hw.git
修正を盛り込む前に初期化な手続きの呼び出し sequence を整理。まず freerunner_gps_init 手続き以降のソレですが
- gps_state_init 手続き呼び出し
- gps_state_thread を kick
- gps_dev_init 手続き呼び出し
- gps_state_thread を kick
で、gps_state_thread の初期化手続きの gps_dev_init ですが
- gps_dev_power 手続き呼び出し
- gps.power_on なプロパティに設定されたデバイス (i/f?) に state が 1 なら '1'、0 なら '0' を書き込む。プロパティが設定されていなければ何もしない
- gps_dev_stop 手続き呼び出し
- gps_dev_set_message_rate 手続き呼び出し
- gps_dev_set_nmea_message_rate 手続き呼び出し
- gps_dev_set_nmea_message_rate 手続き呼び出し
- コマンドとしては $PSRF103 出力となる。
- フォーマットとしては GGA 10 秒とすると
$PSRF103,00,00,10,01*xx (xx はチェックサム)
関連手続きを以下の形で修正、なのかどうか。
static void gps_dev_set_message_rate(int fd, int rate) { unsigned int i; char *msg[] = { "00", /* GGA */ "01", /* GLL */ "02", /* GSA */ "03", /* GSV */ "04", /* RMC */ "05", /* VTG */ "08", /* ZDA */ /* "GGA", "GLL", "ZDA", "VTG", "GSA", "GSV", "RMC" */ }; for (i = 0; i < sizeof(msg)/sizeof(msg[0]); ++i) { gps_dev_set_nmea_message_rate(fd, msg[i], rate); } return; } static void gps_dev_set_nmea_message_rate(int fd, char *msg, int rate) { char buff[50]; int i; /* sprintf(buff, "$PUBX,40,%s,%d,%d,%d,0*", msg, rate, rate, rate); */ sprintf(buff, "$PSRF103,%s,00,%02d,01*", msg, rate); i = strlen(buff); sprintf((buff + i), "%02x\r\n", gps_dev_calc_nmea_csum(buff)); gps_dev_send(fd, buff); D("gps sent to device: %s", buff); return; }
あと、gps_dev_init 手続きからは gps_dev_set_baud_rate 手続きも呼び出さないと微妙なはず。修正も必要。
static void gps_dev_set_baud_rate(int fd, int baud) { char buff[50]; int i, u; /* for (u = 0; u < 3; ++u) { sprintf(buff, "$PUBX,41,%d,0003,0003,%d,0*", u, baud); */ sprintf(buff, "$PSRF100,1,%d,8,1,0*", baud); i = strlen(buff); sprintf((buff + i), "%02x\r\n", gps_dev_calc_nmea_csum(buff)); gps_dev_send(fd, buff); D("gps sent to device: %s", buff); } return; }
チェックサムの計算とか大丈夫なはず、と見てるんですがどうなんだろうか。
で
上記を盛り込んで mm でコンパイルして動作確認してたりしたんですが
- 修正盛り込んだソースツリーが別な場所にあったり
- GPS_DEBUG を 1 にしてもデバッグプリントが出ない
- D を DFR に書き直しても出ない
- そもそもコマンド出力文字列が直ってない
- PSRF を PRSF って書いてたり
- 何故か mode が GPS_POSITION_MODE_STANDALONE でないと叱られたり
などなどの事由にてのたうち回っておりました。しまいには動作していたイメージで起動しなくなってしまい自宅でソースを確認する事にして今に至るんですが体調微妙。
動作について
ログを確認した所では動いてそげに見えるんですが、コンテンツアプリ上で onLocationChange なイベントは発生しておりません。屋内でヤッてるのも悪いんだけど、どうやって動作確認したものやら。