今日のメモ
いやはや、ようやく 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 使う」な設定項目にはチェックが入ってるのを確認してたりして。
別途
順を追う形で整理したエントリ投入します。