以下青文字【*.c】がファイル名、緑色がオリジナル、紫色が変更もしくは追加部分を示す。
【common.c】 [original] if ((menu.dispMode != DISP_TRACK) && (!vertical)) /* トラック表示モードでなければ */ text_put_lin(COL_RTC_CLK,datebuff); [modified] if (menu.dispMode != DISP_TRACK && menu.dispMode != DISP_CMPS && (!vertical)) text_put_lin(COL_RTC_CLK,datebuff); /* トラック、コンパス表示以外時間表示 */ --------------------------------------------------------------------- [original] if ((menu.dispMode != DISP_TRACK) && (!vertical)) /* トラック表示モードでなければ */ disp_header(); /* トラック表示以外総て共通のヘッダを表示 */ [modified] if (menu.dispMode != DISP_TRACK && menu.dispMode != DISP_CMPS && (!vertical)) disp_header(); /* トラック、コンパス表示以外総て共通のヘッダを表示 */ --------------------------------------------------------------------- [original] if ((menu.dispMode != DISP_TRACK) && (!vertical)) /* トラック表示モードでなければ */ text_put_lin(COL_RTC_CLK,datebuff); /* 上から二段目に出す */ [modified] if (menu.dispMode != DISP_TRACK && menu.dispMode != DISP_CMPS && (!vertical)) text_put_lin(COL_RTC_CLK,datebuff); /* 上から二段目に出す */ --------------------------------------------------------------------- #endif #ifdef USEDISPCMPS { if (menu.dispMode == DISP_CMPS) {/* コンパス画面表示 */ calc_rguide(); disp_compass(); } } #endif #ifdef USEDISPCMPS { if (menu.dispMode == DISP_GRAPH) { disp_graph(); } } #endif --------------------------------------------------------------------- 【disp.c】 [ファイルの最後に追加] /* ---------------------------------------------------- */ #ifdef USEDISPCMPS /* コンパス画面表示 */ #define CMPS_X (48-1) #define CMPS_Y (56-1) #define CMPS_R 30 #define WP_LINE 6 #define WP_LINE_S 2 #define WP_COMM 13 #define WP_DIST 23 #define FWD 0 #define BCK 1 #define OFST 3 static int pdirOld = -1; void disp_wp_guide(int line,int guide) { text_put_char(WP_COMM-1,line,guide); } void disp_wp_data(int i,int rev) { int offset; double xl,yl; int iDir; long iDst; char *p; unsigned u; int line; if(rev) { int shift = waypoint_num - menu.guidewp; if(shift<OFST+1) offset = WP_LINE - shift; else offset = WP_LINE - 1 - OFST; } else { if(menu.guidewp<OFST) offset = menu.guidewp; else offset = OFST; } line=offset+WP_LINE_S+i-menu.guidewp; if(line>=WP_LINE_S && line<WP_LINE_S+WP_LINE) { if(i>=0 && i<waypoint_num) { if(menu.guide==WPF_ROUTE) { if(i==menu.guidewps) disp_wp_guide(line,0x1F); if(i==menu.guidewpe) disp_wp_guide(line,0x1E); } if(i==menu.guidewp && (menu.guide==WPF_GOTO || menu.guide==WPF_ROUTE)) disp_wp_guide(line,0x10); if(i!=menu.guidewp && i!=menu.guidewps && i!=menu.guidewpe) disp_wp_guide(line,0x00); if (posdeg.lon == 0.0 && posdeg.lat == 0.0){ text_put_string(WP_DIST-4,line,"---°----k"); } else { calc_xy(i,&xl,&yl); if (xl == 0.0 && yl == 0.0){ iDir = 0; iDst = 0; } else { iDir = iround(atan2(xl, yl)*TODEG); if (iDir < 0) iDir += 360; iDst = (long)sqrt(xl*xl + yl*yl); } sprintf(p = msgbuff, "%u.%03d", u = (unsigned)(iDst/1000), (int)(iDst%1000)); if (u==0){ // .XXXK .999K ++p; } else { // X.XXK 9.99,99.9,999. */ msgbuff[4] = '\0'; } text_put_string(WP_DIST,line,p); text_put_string(WP_DIST+4,line,"k"); sprintf(msgbuff,"%3d°",(iDir + 360 - cnv.iHead) % 360); text_put_string(WP_DIST-4,line,msgbuff); } sprintf(msgbuff,"%-6s",waypoint[i].memo); text_put_string(WP_COMM,line,msgbuff); } else { text_put_string(WP_COMM-1,line," "); } } } void disp_bear(int pdir,char *bear) { int i; int px[] = {5,3,2,1,0,1,2,3,5,7,8,9,10,9,8,7}; int py[] = {1,2,3,4,6,8,9,10,11,10,9,8,6,4,3,2}; for(i=0;i<4;i++) { int p=(pdir+16+4*i) % 16; sprintf(msgbuff,"%c",*bear); disp_x22_str(px[p],py[p],msgbuff); bear++; } } void disp_compass(void) { int pdir; int wpt2iHead; long wptTim; int i,hour,secs; char *p; unsigned u; char *bear; graph_init(); font_set_color(CLR_LOCATE); /* 進行方向方位のコンパス表示 */ for(i=0;i<3;i++) { gl_circle(CMPS_X, CMPS_Y, CMPS_R+i, CLR_LOCATE, OPAQUE); } pdir = ((int)((cnv.iHead + 11.25) * 16 / 360)) % 16; if(pdir!=pdirOld) { disp_bear(pdirOld," "); pdirOld=pdir; } disp_bear(pdir,"NWSE"); /* 進行方向の数値表示 */ sprintf(msgbuff,"%3d`",cnv.iHead); disp_x22_str(15,15,msgbuff); /* 速度と高度と現在時間の表示 */ sprintf(msgbuff,"%3d",(cnv.iSpd10+5)/10); disp_x22_str(21,11,msgbuff); text_put_string(26,11,"Km"); text_put_string(26,12,"/h"); text_put_string(9,11,"Alt"); sprintf(msgbuff,"%5ld",round(dsppos.alt)); disp_x22_str(12,11,msgbuff); text_put_string(20,12,"m"); disp_x22_str(18,13,&datebuff[15]); /* Functionの表示[NONE/POINT/ROUTE] */ if(menu.guide==WPF_GOTO) text_put_string(13,10,"POINT"); else if(menu.guide==WPF_ROUTE) text_put_string(13,10,"ROUTE"); else text_put_string(13,10,"NONE "); /* 測位状態表示 */ #if defined(GARLOG) || defined(STFLOG) sprintf(msgbuff,"%d",cnv.fix); #endif #if defined(PNRLOG) sprintf(msgbuff,"%d",(cnv.fix >> 4)&7); #endif #if defined(NMELOG) || defined(IPSLOG) sprintf(msgbuff,"%d",cnv.rcvStat); #endif disp_x22_str(13,13,msgbuff); text_put_char(15,14,'D'); /* Function = POINT or ROUTE */ if(menu.wwpname[0]!='\0') { /* 次のWaypointの方向の計算 */ wpt2iHead = (wptDir + 360 - cnv.iHead) % 360; /* 進行方向に対するWaypointの方向の表示 */ sprintf(msgbuff,"%3d°",wpt2iHead); text_put_string(0,1,msgbuff); /* コンパス内に次のWaypointの方向の表示 */ disp_x22_arrow(4, 6, 1, wpt2iHead); /* 次のWaypointまでの時間の計算 */ /* 進行方向とWaypointの方向の差が90度未満で時速0.3km/h の場合のみ */ /* wptDst: m単位、 cnv.iSpd10: *10 km/h */ /* 36 = *3600(秒単位) *10(km/h単位) /1000(km単位) */ if((wpt2iHead < 90 || wpt2iHead > 270) && cnv.iSpd10 > 3) wptTim = wptDst * 36 / (cnv.iSpd10 * (cos(wpt2iHead * TORAD))); else wptTim = -1; /* 次のWaypointまでの距離と時間の表示 */ text_put_string(0,12,"Next"); text_put_string(0,15,"Dist"); if (posdeg.lon == 0.0 && posdeg.lat == 0.0){ disp_16x12_str(0,4,15,0,"----"); text_put_string(11,16,"km"); } else { sprintf(p = msgbuff, "%u.%03d", u = (unsigned)(wptDst/1000), (int)(wptDst%1000)); if (u==0){ // .XXXK .999K ++p; } else { // X.XXK 9.99,99.9,999. */ msgbuff[5] = '\0'; } disp_16x12_str(0,4,15,0,p); text_put_string(11,16,"km"); } hour = (int)(wptTim/3600); secs = (int)(wptTim%3600); text_put_string(0,13,"Time"); if(wptTim<0 || hour>99) { sprintf(msgbuff,"--:--"); } else { if(hour>0) sprintf(msgbuff,"%02d:%02d",hour,secs/60); /* 時分表示 */ else sprintf(msgbuff,"%02d:%02d",secs/60,secs%60); /* 分秒表示 */ } disp_x22_str(4,13,msgbuff); /* Waypointの方向の数値表示 */ text_put_string(21,15,"W"); text_put_string(21,16,"P"); sprintf(msgbuff,"%3d`",wptDir); disp_x22_str(22,15,msgbuff); /* 各Waypointの名前、方向、距離の表示 */ if (menu.guidewps <= menu.guidewpe) { for(i=menu.guidewp-OFST;i<menu.guidewp+WP_LINE;i++) {disp_wp_data(i,FWD);} } else { for(i=menu.guidewp+OFST;i>menu.guidewp-WP_LINE;i--) {disp_wp_data(i,BCK);} } /* WWP File名の表示 */ sprintf(msgbuff,"[%-14s]",menu.wwpname); text_put_string(12,9,msgbuff); sprintf(msgbuff,"[r%cm]",menu.wwpdir?'A':'O'); text_put_string(19,10,msgbuff); } } #endif // USEDISPCMPS --------------------------------------------------------------------- 【menu.c】 #endif #if defined(USEDISPCMPS) static void menu_inhCMPS(int code) { menu_inhsub(code, DISP_CMPS); } #endif #if defined(USEDISPCMPS) static void menu_inhCMPS(int code) { menu_inhsub(code, DISP_CMPS); } #endif --------------------------------------------------------------------- #endif #if defined(USEDISPCMPS) { menu_inhCMPS, "COMPASS Page" ,mnu_chk_all, 0, 7}, #endif #if defined(USEDISPTRIP) { menu_inhTRIP, "TRIP Page" ,mnu_chk_all, 0, 7}, #endif --------------------------------------------------------------------- 【userdeth.h】 /* 4*4フォントのデータ表示画面を使う */ #define USEDISPDATA44 /* コンパス表示画面を使う */ #define USEDISPCMPS /* 軌跡表示画面(データ付き)を使う */ #define USEDISPTRACK --------------------------------------------------------------------- 【wslogger.h】 enum { DISP_CFG, DISP_DATA, DISP_DATA44, DISP_CMPS, DISP_TRACK, DISP_GRAPH, DISP_SAT, DISP_TRIP, DISP_RAW, DISP_END }; --------------------------------------------------------------------- #endif #if !defined(USEDISPCMPS) #define BIT_DISP_CMPS |(1<<DISP_CMPS) #else #define BIT_DISP_CMPS #endif #if !defined(USEDISPTRACK) #define BIT_DISP_TRACK |(1<<DISP_TRACK) --------------------------------------------------------------------- #define DISP_MASK (0 BIT_DISP_DATA BIT_DISP_DATA44 BIT_DISP_CMPS BIT_DISP_TRACK BIT_DISP_SAT BIT_DISP_TRIP BIT_DISP_RAW) --------------------------------------------------------------------- extern void disp_waypoint_loc(int id, int y); extern void disp_compass(void);