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