garlog改造への道 7

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



 前回気づいた、風向が逆になる件については、

windDir = (windDir + 180 )%360;

 として、180°反転させてやればいいと思います。
 早速これを追加します。
 また今回は、風向を0〜360°の数字でなく、N,NE,E…の文字で表そうと思ったので、そのための配列を最初に宣言しておきます。
 幸い、LOGGERシリーズには標準でN,NNE,NE,ENE…の16方向の進行方向を表示させるコンパイルオプションがあるので、それを参考にして8方向のdir8str[]を作りました。
(北,北東,東…と、漢字で出すことも考えたのですが、手本となる曜日表示でそれをやってる部分を見ると「 * 」とか「 -> 」とか、私をビビらせる文字が見えたので、今回は先送りにしました(^-^;; )

 下にcommon.c冒頭部分の関数の定義と、風向風速計算関数wind_carc()をまとめてみました。 太字が今回追加した部分です。

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

/* 風向風速計算用のグローバル変数定義 */
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°反転して風の吹いてくる方向にする */
}

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

 次に、メインルーチン内の、軌跡表示画面での画面下部データ表示部分です。 太字が今回追加した部分です。
 2×2キャラクタで、風向を文字で表示します。

 文字列の中から任意の文字を取り出すためには、初心者の難関と言われているポインタ(それもWonderWitchのそれは癖があるらしい)を使うのかなどうしよう...と思って見本となる部分をcommon.cから探すと、FreyaOSの標準ライブラリmemcpyを使っていました。早速参考にさせていただき、風向をアルファベットで表示させます。

 風速は、そのままtext_put_stringで表示させます。
 それ以外のデータについては表示スペースの都合上、多少レイアウトを変えています。

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

/* 風向風速を表示 */
	wind_carc();	/* 風向風速計算実施 */
	/* 得られた風向windDirをN,NE,E...という文字列に変換。ポインタ演算子&を用い、 */
	/* 標準ライブラリstdlib.hのmemcpy関数でdir8strの対応する文字列をコピー。 */
	memcpy(msgbuff,&dir8str[(((windDir+23)%360)/45)*2],2);
	msgbuff[2]='\0';	/* NULLコード */
	disp_x22_str(0,15,msgbuff);

	/* 風速を表示する。00.0m/s表示 */
	sprintf(msgbuff,"%2d.%dm/s",windSpd/10,windSpd%10);
	text_put_string(4,16,msgbuff);

/* 下部中央に速度を16×16dotで表示 */
	sprintf(msgbuff,"%3d",cnv.iSpd);
	disp_x22_str(11,15,msgbuff);
	text_put_string(17,15,"Km");
	text_put_string(17,16,"/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(20,15,c);
	text_put_char(20,16,c);
	sprintf(msgbuff,"%1d.%d",i/10,i%10);
		/* 0.0表示なので上昇/下降速度が10m/s以上だと表示が崩れてしまう。 */
		/* しかし通常はそんな速度にならないので、見てくれを優先した。 */
	disp_x22_str(21,15,msgbuff);
	text_put_string(26,15,"m ");
	text_put_string(26,16,"/s");
} else {			/* 設定されてなかったら最高&現在高度を4桁で表示 */
	if (menu.maxHeight != -32768) {
		sprintf(msgbuff,"最高 %4dm",menu.maxHeight);
		text_put_string(20,15,msgbuff);
		sprintf(msgbuff,"現在 %4dm",(int)dsppos.alt);
		text_put_string(20,16,msgbuff);
	} else {
		text_fill_char(20,15,8,CHAR_SPACE);
	}
}

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

 ではコンパイルです。

 .....

 うまくいきました。
 (ところでエラーが出るたび思うのですが、Digital Mars C++コンパイラって英語版だと思ったけど、なんでエラーは日本語で出るのかな? )

 ではstflogを使って動作検証です!

 ムム、まあまあの表示です。(^^)
 ちゃんと風向と風速らしきものが左下に出ています。

 ただ実際のフライトデータから得たstf形式のログをハイパーターミナルで送り込んで見ている限りでは、ちょっと風速の表示が不安定な印象でした。(2m/s程度の時もあるかと思えば、10m/s以上になったりする)
 実際にGPSを繋いで、飛んで、検証していきたいと思います。

(実際のフライトで使ってやる、という物好きな方がいましたら、ぜひご連絡ください。)



 続く...(かも)



目次に戻る