トップページへ

GPS TRACK LOGGER for WonderWitch の改造1

以下青文字【*.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&lt;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 &gt;&gt; 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 &lt; 90 || wpt2iHead &gt; 270) && cnv.iSpd10 &gt; 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&lt;0 || hour&gt;99) {
            sprintf(msgbuff,"--:--");
        } else {
            if(hour&gt;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 &lt;= menu.guidewpe) {
            for(i=menu.guidewp-OFST;i&lt;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&lt;&lt;DISP_CMPS)
#else
#define BIT_DISP_CMPS
#endif
#if !defined(USEDISPTRACK)
#define BIT_DISP_TRACK  |(1&lt;&lt;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);