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を繋いで、飛んで、検証していきたいと思います。
(実際のフライトで使ってやる、という物好きな方がいましたら、ぜひご連絡ください。)
続く...(かも)
目次に戻る