今日のメモ

昨晩エントリでメモッたナニを色々盛り込んでみました。

  • 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 の初期化手続きの 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 なイベントは発生しておりません。屋内でヤッてるのも悪いんだけど、どうやって動作確認したものやら。