今日のメモ

いやはや、ようやく NMEA なソレを確認できました。
以下にメモをいくつか。

起動しないケイス

たまにループした風な状態で正常起動しないケイスが何度かあったんですが、元の tar.gz を解凍して作り直してあげれば良いらしい事が分かりました。
ちなみに最近は SDCard やら SSD なファイルの書き込み時に、二回くらい sync してたりしますが、転送する時に問題が出るのではなくて、上記の通り、shutdown しないママ電源遮断 (せざるを得ないんですが) した時に何らかの影響が出てるんだと思います。
armadillo な Android の電源遮断の最適な方法って何なんだろ (何

出発点

今日時点の状態が以下だった模様。

  • コマンド書式
    • 初期化時に SiRF binary モードになっていた
  • nmea_reader_parse 手続きに入ってるかどうか確認必要
    • この時点では呼び出されている様子ではなかった
    • 呼び出し直前に DFR 入れてみたんですが何も出ず
    • nmea_reader_addc 呼び出し元でバッファを DFR してみた
      • 文字化け
      • $PSRF100,1 に変更 (SiRF binary から NMEA モードに)
      • 挙動変わらず

この時点で Set Serial Port なコマンドからではなくて、stty が必要なのか、という事に気づきましたorz
結果的にこれで NMEA な文字列なデバッグプリントの出力が確認できております。ただし、緯度経度な情報は入ってきてなかったんですが、窓際な場所に移動して試験してみた所、値が取れているのを確認しております。

ちなみに

現状は SSD なナニを mount してそこに保存されている Android なイメージで chroot 起動してるんですが、以下な形で起動してます。

# mount /dev/sda1 /mnt
# stty -F /dev/ttyUSB0 4800
# chroot /mnt/android /init

stty する時にどかっと微妙なメセジがカーネルバッファに出力される時があります。

GpsPositionMode の件

今日のM001他の中の人にコメント頂いた部分について確認してみました。
とりあえず起点(?) が GpsLocationProvider.java で以下の部分。

    public void startNavigating() {
        if (!mStarted) {
            if (DEBUG) Log.d(TAG, "startNavigating");
            mStarted = true;
            int positionMode;
            if (Settings.Secure.getInt(mContext.getContentResolver(),
                    Settings.Secure.ASSISTED_GPS_ENABLED, 1) != 0) {
                positionMode = GPS_POSITION_MODE_MS_BASED;
            } else {
                positionMode = GPS_POSITION_MODE_STANDALONE;
            }

            if (!native_start(positionMode, false, mFixInterval)) {

native_start 手続きは jni で android_location_GpsLocationProvider.cpp の以下の手続き。

static jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj, jint positionMode,
        jboolean singleFix, jint fixFrequency)
{
    int result = sGpsInterface->set_position_mode(positionMode, (singleFix ? 0 : fixFrequency));
    if (result) {
        return false;
    }

    return (sGpsInterface->start() == 0);
}

set_position_mode 手続きは freerunner_gps.c の以下になります。

static int freerunner_gps_set_position_mode(GpsPositionMode mode, int fix_frequency)
{
    GpsState*  s = _gps_state;
    
    // only standalone supported for now.

    if (mode != GPS_POSITION_MODE_STANDALONE)
        DFR("%s: called with bad GpsPositionMode !!", __FUNCTION__);
        return -1;

ええと、java 側で ASSISTED_GPS_ENABLED な設定値が 0 じゃないと駄目らしい。色々掘じくりマワしてたら settings.db なソレを確認云々な情報あり。実機で確認してみたら以下。

# sqlite3 /data/data/com.android.providers.settings/databases/settings.db
sqlite> select * from system;
1|volume_music|11
3|volume_system|7
4|volume_voice|4
5|volume_alarm|6
6|volume_notification|5
7|mode_ringer|2
8|vibrate_on|4
9|mode_ringer_streams_affected|166
10|mute_streams_affected|46
11|dim_screen|1
12|stay_on_while_plugged_in|0
13|screen_off_timeout|60000
14|emergency_tone|0
15|call_auto_retry|0
16|dtmf_tone_type|0
17|hearing_aid|0
18|tty_mode|0
19|airplane_mode_on|0
20|airplane_mode_radios|cell,bluetooth,wifi
21|airplane_mode_toggleable_radios|wifi
22|auto_time|1
23|screen_brightness|102
24|screen_brightness_mode|0
25|window_animation_scale|1.0
26|transition_animation_scale|1.0
27|accelerometer_rotation|1
28|haptic_feedback_enabled|1
29|notification_light_pulse|1
31|volume_ring|5
32|volume_ring_last_audible|5
34|next_alarm_formatted|
38|font_scale|1.0
sqlite> 

ええと、assisted_gps_enable なエントリが無い。この件、もう少し色々確認してみたいと思います。実機側の設定では「GPS 使う」な設定項目にはチェックが入ってるのを確認してたりして。

別途

順を追う形で整理したエントリ投入します。