garlog改造への道 10

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




 loggerシリーズは精力的にバージョンアップが行われており、H13.12.12現在Ver0.20のβ0版が gigoさんの掲示板にて公開されています。
 これは従来のVer0.10に比べ、

  ・割り込み処理の変更によるキー操作時の応答性の向上
  ・軌跡表示方法のリニューアルにより、一旦電源を切っても過去の軌跡が表示される
  ・ウェイポイントの登録・表示
  ・12×16ドット文字表示対応
  ・軌跡表示画面のデザイン変更(数字情報を右側に表示)
など、様々な機能改良がなされています。

 そこでこれに合わせて、例の風向風速機能を追加することにします。
 今回変更するのは、logger1210.zip内のcommoc.cです。(バージョンv0.20β0)

 まず最初の方にstatic変数宣言と風向風速計算関数を定義します。ソースの79行目あたりに以下を挿入します。

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

/* 風向風速計算用のグローバル変数定義 */
static int zoneSpd[8]={0,0,0,0,0,0,0,0};	/* 北、北東、東…の8方向の速度 */
static int windSpd,windDir;			/* 風速と風向(速度データの全体的なドリフト量) */
static char dir8str[]="N NEE SES SWW NWN ";	/* 風向表示用のアルファベットを配列宣言 */


/* 風向風速を求める関数を定義(8方向の速度の和から、全体的なドリフト量を計算) */
static void wind_carc()
{
	long wind_x;	/* 風(全体的なドリフト量)のx成分 */
	long wind_y;	/* 風(全体的なドリフト量)のy成分 */
/* 現在の進行方向に相当する変数に現在速度を代入 */
	zoneSpd[((cnv.iHead+23)%360)/45]=cnv.iSpd;
/* ドリフト量を出すためベクトル和。小数点以下にならないよう、sin,cosの値は100倍しています */
	wind_x = zoneSpd[0]*100 + zoneSpd[1]*71 + zoneSpd[2]*0 + zoneSpd[3]*-71 +
			 zoneSpd[4]*-100 + zoneSpd[5]*-71 + zoneSpd[6]*0 + zoneSpd[7]*71;
	wind_y = zoneSpd[0]*0 + zoneSpd[1]*71 + zoneSpd[2]*100 + zoneSpd[3]*71 +
			 zoneSpd[4]*0 + zoneSpd[5]*-71 + zoneSpd[6]*-100 + zoneSpd[7]*-71;
/* 風速を√(x^2 + y^2 )で求める。km/s→m/sへ変換するため3.6で割った。 */
/* ただしwindSpdは整数型なので√100^2倍=100倍から10倍相当にするため10で割る */
	windSpd = (int)(sqrt(wind_x*wind_x + wind_y*wind_y)/3.6/10 );
/* 風向を求める。0〜360°表示 */
	windDir = (int)(atan2(wind_x,wind_y )/TORAD + 360)%360;
	windDir = (windDir + 180 )%360;	/* 180°反転して風の吹いてくる方向にする */
}

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

 次に軌跡表示画面にて各種データを表示する部分を改造し、風向風速を始めとしたパラ向けのデータを表示するようにします。
 表示するデータは上から順番に、下表のようにします。

  オリジナル版 今回作成版 コメント
誤差と測位モード 同左 これのみメインルーチン内で表示させている。
現在時刻 同左  
高度 同左 GPSの絶対高度は見たい
対地速度 同左 GPSでしか得られない重要なデータ
最大速度 上昇・下降速度 GPSによる上下方向速度
平均速度 風向:風速 風速は小数点以下切り捨て
移動時間 同左 フライト時間がわかる
移動距離 同左 何かの参考に

 他にウェイポイントに関する表示(例えば設定したポイントまでの距離や所用時間、この高度と沈下率で届くかなど)など、追加してみたい項目はありますが、とりあえず最小限の改造にしておきます。

 改造部分は、common.c内で軌跡表示画面の右側にデータを表示するdisp_data_for_trk()内、1384行目あたりになります。


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

最高速度を表示している部分、
	sprintf(msgbuff,"%4dx",menu.maxSpeed);
	disp_16x12_str(0,21,9,msgbuff);

これをコメントアウトし、上昇・下降速度を表示するために

	{
	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(22,9,c);
	text_put_char(22,10,c);
	sprintf(msgbuff,"%1d.%dm",i/10,i%10);
		/* 0.0表示なので上昇/下降速度が10m/s以上だと表示が崩れてしまう。 */
		/* しかし通常はそんな速度にならないので、見てくれを優先した。 */
	disp_16x12_str(4,23,9,msgbuff);	/* 4dot オフセット */
	}

とします。

また、その下の平均速度を表示してる部分、
	text_put_char(20,12,' ');
	sprintf(msgbuff,"%4dr",avgSpd);
	disp_16x12_str(0,21,11,msgbuff);

これをコメントアウトし、風向と風速を表示するために

	wind_carc();	/* 風向風速計算実施 */
		/* 得られた風向windDirをN,NE,E...という文字列に変換。ポインタ演算子&を用い、 */
		/* 標準ライブラリstdlib.hのmemcpy関数でdir8strの対応する文字列をコピー。 */
	memcpy(msgbuff,&dir8str[(((windDir+23)%360)/45)*2],2);
	msgbuff[2]='\0';	/* NULLコード */
	disp_16x12_str(0,22,11,msgbuff);
		/* 風速を表示する。:0m/s表示、小数点以下切捨て */
	sprintf(msgbuff,":%dm",windSpd/10);
	disp_16x12_str(0,25,11,msgbuff);

とします。

--------------------------------------------------------------------------------
 最初は赤で示した大カッコ{ }を入れずにコンパイルしてみたのですが、上昇・下降速度を表示するために変数宣言をしている部分、
	char c = 0x20;
	int i = cnv.iUp100/10;
でエラーが出ます。変数名が重複したりしてマズイのかなと思って変えても結果は同じ。

 いろいろ考えながらcommon.cを眺めていると、同じdisp_data_for_trk()の最後の部分にヒントを見つけました。
 ここでもcharやint変数を宣言してるのですが、処理部分を{ }で囲んでいます。 これを真似して上のソースで赤で示した{ }を入れてみると、見事コンパイル成功となりました。
 このような{ }の使い方を初めて知りました。(^^;; 

 さて、表示画面はこうなりました。

 パラグライダーでのフライト中に使うには、数字が多くて見にくいような気もしますが、表示させる項目については今後検討していくつもりですので、とりあえずのバージョンということで...


 続く...(かも)



目次に戻る