garlog改造への道 2

ていうか個人的なメモです。(H13.10.31)



 前回の改造が見た感じうまくいったので、調子に乗ってさらにトラック画面表示をいじってみることにしました。

 パラグライダーで飛んでいる時はWonderSwanのボタン操作などをする余裕はないので、トラック画面のみで必要な情報を見れるようにした方がいいと思います。そこで、必要な情報は何かということを考えてみます。
 他画面を含めgarlogで表示されている使えそうな各種情報のうち、どれが特にフライト中に欲しい情報なのか○をつけてみます。私の主観だけでは何なので、友人にも聞いてみました。

  情報内容(単位) K氏評価 私の評価 コメント
高度(m)   バリオで得られるし、相対高度でないのでいまいち。が、何となく表示させたい。
速度(km/h) ○○ GPSでしか得られない対地速度は、ぜひ表示させたい。
上昇・下降速度(m/s) バリオで得られるが、最も重要な数字なので何となく欲しい。
進行方向(0〜360°or N,NNE…表示) ○○ 予期せぬ雲中飛行やクロカン時のコンパスがわり。
最高速度(km/h)     対地の最高速度は、フライト中に見る必要は無いかと。
平均速度(km/h)     クロカン・コンペ以外は不要、かな?
積算移動距離(m)     フライト中に見る必要はあまり無いかな?
最高高度(m) ○○   フライト中は特にいらないかな。バリオでも得られるし。
時刻(時:分:秒) 昼メシ時間になったらランディングするために必要かと。
10 トリップタイム(時:分:秒) ○○ ○○ フライト時間を知り、腹の減り具合を把握する。
11 ログ保存ポイント数(%)     使い切ってしまう心配はまず無いので、フライト中は不要。
12 トラック画面縮尺(何分の1)   ○○ 軌跡表示なので、やはり無いと寂しい。

 肝心の軌跡表示部分を狭くしたくないので、全部の情報を書くことはできません。でも、重要な情報は大きく表示させたいです。
 現状では、画面上部に1行、下部に2行ぶんの表示スペースがあります。(たぶん^^;)

 そこでこのうち、いちばん見易くする必要のある(と私が勝手に判断した)1の高度、2の速度、4の進行方向については2×2キャラクタで画面下部に書くこととします。なお高度については、初期設定メニューで上昇・下降速度アラームが設定されている場合(上昇と下降の両方とも0.0m/sでないことが条件)は、ここに高度ではなく3の上昇・下降速度を表示することにしました。

 画面上部の1行ぶんのスペースには、9の時刻と10のトリップタイムと12の縮尺を表示させることにしました。なお年月日と曜日の表示はスペース節約のためカットしました。
 トリップタイムは移動してる時のみカウントの進むタイマーで、loggerの標準機能に実装されています。パラで飛行中は常に移動していて、静止してることは普通ないですから、これはフライト時間の表示にぴったりです。(強い向かい風でのホバリング状態を想定すると対地速度ゼロも有り得ますが、そう長い時間続くことはないと思うので実用上問題ないかと。)
 おまけにテイクオフ寸前にスタートをかける必要がないので便利そうです。


 ではソースをいじってみます。ソースは見易く、作者gigoさんのご厚意でコメントも豊富につけられているので、私のようなCプログラミング超初心者でも似たようなことをしている部分をコピー&ペーストするだけで何とかなります。
 以下、logger1015.zip内のソースcommon.cのメインルーチンの前半(1217行目から)部分の抜粋です。
 ここでトラック画面上部の数字を書きます。

----------------------------------------------------------------------------------------------------------


	if (cnv.rcvStat>1) {	/* 2D以上のデータ */
		if (menu.dispMode != DISP_TRACK) {	/* トラック表示モードでなければ */
			text_fill_char(0, COL_RECV_STAT, TEXT_SCREEN_WIDTH, CHAR_SPACE);  /* 正常なのでエラー行消去 */
			disp_header();			/* トラック表示以外総て共通のヘッダを表示 */
		} else {

/* 以下オリジナル部分(コメントアウト)
			text_put_lin(COL_RECV_STAT,datebuff);
			if (disableLogging)
				strcpy(msgbuff," Err");
			else if (menu.maxFblock==0)
				strcpy(msgbuff," ---");
			else
				sprintf(msgbuff,"%3d%%",gage);
			text_put_string(24,COL_RECV_STAT,msgbuff);
*/

/* 以下今回改造部分 */

/* 上部左側に縮尺を「0万分の1」または「0000分の1」で表示 */
			if (mapzoom>=10000)
				sprintf(msgbuff,"1/%3d万",mapzoom/10000);
			else
				sprintf(msgbuff,"1/%4d",mapzoom);
			text_put_lin(1,msgbuff);

/* 上部中央に移動時間を表示 */
			hour = menu.totalMovTime/3600; secs = menu.totalMovTime%3600;
			sprintf(msgbuff,"[%2d:%02d:%02d]",hour,secs/60,secs%60);
			text_put_string(9,1,msgbuff);

/* 上部右側に時刻を表示 */
			text_put_string(20,1,&datebuff[15]);
/* 改造部分おわり */

		}

----------------------------------------------------------------------------------------------------------

縮尺は1/1000000〜1/5000までと変化量が大きいため、このまま表示すると場所をとります。そこで分母が1万以上のときは、「1/○万」と表示させることにして表示場所を節約しました。


では次にメインルーチンの後半(1353行目から)部分です。
ここでトラック画面下部の数字を2×2キャラクタ(16×16dot)で書きます。


---------------------------------------------------------------------------------------------------------



	if (menu.dispMode == DISP_TRIP)	/* (総ての処理が終わったので)トリップ画面モードなら */
		disp_trip();	/* トリップ画面表示(有効データがなくても初期化後など表示が必要) */
	if (menu.dispMode == DISP_TRACK) {/* トラック画面モードなら */
		disp_track();	/* トラック画面表示(有効データがなくても書き残しの処理などで呼び出し必要) */

/* 以下オリジナル部分(コメントアウト)
		sprintf(msgbuff,"1/%07ld %4dm %3dKm/h",mapzoom,(int)dsppos.alt, cnv.iSpd);
		text_put_lin(COL_FILE_TMP,msgbuff);
*/

/* 以下今回改造部分 */
/* 下部左側に進行方向を16×16dotで表示 */
#ifdef USEDIRSTR
		memcpy(msgbuff,&dir16str[((cnv.iHead*4+45)/90)*3],3);
		msgbuff[3]='\0';
#else
		sprintf(msgbuff,"%3d`",cnv.iHead);
#endif
		disp_x22_str(0,15,msgbuff);

/* 下部中央に速度を16×16dotで表示 */
		sprintf(msgbuff,"%3d",cnv.iSpd);
		disp_x22_str(8,15,msgbuff);
		text_put_string(14,16,"Km/h");

/* 下部右側に上昇/下降速度または高度を16×16dotで表示 */
	if (menu.alUpLim && menu.alDwnLim) {	/* 上昇/下降速度アラームが設定されていたら */
		char c = 0x20;
		int i = cnv.iUp100/10;
		if (i > 0)
			c = 0x18;	/* up allow */
		else if (i < 0) {
			c = 0x19;	/* down allow */
			i = -i;
		}
		text_put_char(19,15,c);
		text_put_char(19,16,c);
		sprintf(msgbuff,"%1d.%d",i/10,i%10);
			/* 0.0表示なので上昇/下降速度が10m/s以上だと表示が崩れてしまう。 */
			/* しかし通常はそんな速度にならないので、見てくれを優先した。 */
		disp_x22_str(20,15,msgbuff);
		text_put_string(25,16,"m/s");
	} else {				/* 設定されてなかったら高度を4桁で表示 */
		sprintf(msgbuff,"%4d",(int)dsppos.alt);
		disp_x22_str(19,15,msgbuff);
		text_put_char(27,16,'m');
	}
/* 改造部分おわり */

    }

--------------------------------------------------------------------------------------------------------

 いちばん目立つ画面下部中央に対地速度を配置します。今回は速度が3ケタになっても表示が崩れないようにしました。

 さて、書き換えたcommon.cをbmpsaverをリンクさせてコンパイルします。
 Summitをデモ設定にして接続し、出したトラック画面です。

 やりました! 今回も(見た感じだけは)大成功です。(^^)
 あとはちゃんと各数字が表示されるかテストするだけです。 でもこんどの休みはパラに行けないし、高度関係はチャリンコテストではツライものがあります。どうしよう...
gigoさんから

テスト方法はgarlogだと面倒なのでstflogにして既存のログファイルの速度情報をテキスト
エディタで加工してPCからターミナルソフトで送り込むのが良さそうです。
なお、他のloggerでは上下方向速度は取得できません。
というアドバイスをいただいたので、stflogを使ってこれに成功すれば過去のパラのGPSログをSwanに流し込んでやることでリアルなトラック画面がキャプチャーできそうです...
 ただ、TeraTermProをどう設定して送り込めばいいのかという点や、STF(Garmin Simple Text Format)形式をどうやって作ればいいのか悩み中(とりあえずGPSLogCvでTRK形式→STF形式をやってみるもうまくいかず)です。



目次に戻る