ゑひと氏のをクラス化致した

GPS.cpp

Committer:
IKobayashi
Date:
2020-02-24
Revision:
0:f291337e7ce9

File content as of revision 0:f291337e7ce9:

#include "mbed.h"
#include "GPS.h"

GPS::GPS(PinName gpstx, PinName gpsrx) : _gps(gpstx, gpsrx)
{
    g_hour = 0, g_min = 0, g_sec = 0;
    g_hokui = 0, g_tokei = 0;
    stlgt = 0;
    date = 0;
    velocity = 0, direction = 0;
    w_time = 0, hokui = 0, tokei = 0;

    _gps.baud(GPSBAUD);
    _gps.attach(this, &GPS::getGPS);
}

void GPS::getGPS()
{
    c = _gps.getc();
    if (c == '$' || i == 256) {
        mode = 0;
        i = 0;
        for (int j = 0; j < 256; j++) {
            gps_data[j] = NULL;
        }
    }
    if (mode == 0) {
        if ((gps_data[i] = c) != '\r') {
            i++;
        } else {
            gps_data[i] = '\0';

            //pc.printf(gps_data);
            //pc.printf("\r\n");

            if (sscanf(gps_data, "$GPGGA,%f,%f,%c,%f,%c,%d,%d", &w_time, &hokui, &ns, &tokei, &ew, &rlock, &stlgt) >= 1) {
                if (rlock == 1) {
                    //logitude
                    d_tokei = int(tokei / 100);
                    m_tokei = (tokei - d_tokei * 100) / 60;
                    g_tokei = d_tokei + m_tokei;
                    //Latitude
                    d_hokui = int(hokui / 100);
                    m_hokui = (hokui - d_hokui * 100) / 60;
                    g_hokui = d_hokui + m_hokui;

                    float timenow = w_time;
                    int hour = timenow / 10000;
                    timenow = fmod(timenow, 10000);
                    int min = timenow / 100;
                    timenow = fmod(timenow, 100);
                    int sec = timenow / 1;
                    timenow = fmod(timenow, 1);

                    g_hour = hour;
                    g_min = min;
                    g_sec = sec;

                    // /*
                    // 10進法(google)
                    //pc.printf("世界標準時:%02dh%02dm%02ds 北緯:%.8f 東経:%.8f 状態:%d 使用衛星数:%d\r\n",
                    //          hour, min, sec, g_hokui, g_tokei, rlock, stlgt);
                    //  */
                    /*
                    // 60進法(x時y分z秒w)
                    pc.printf("s世界標準時:%02dh%02dm%02ds 北緯:%.8f 東経:%.8f 状態:%d 使用衛星数:%d\r\n",
                    hour, min, sec, hokui/100, tokei/100, rlock, stlgt);
                    */
                } else {
                    float timenow = w_time;
                    int hour = timenow / 10000;
                    timenow = fmod(timenow, 10000);
                    int min = timenow / 100;
                    timenow = fmod(timenow, 100);
                    int sec = timenow / 1;
                    timenow = fmod(timenow, 1);

                    g_hour = hour;
                    g_min = min;
                    g_sec = sec;

                    //pc.printf("# 世界標準時e:%02dh%02dm%02d 状態:%d 使用衛星数:%d\r\n",
                    //          hour, min, sec, rlock, stlgt);
                }
                sprintf(gps_data, "");
            } //if

            /* ------------------------------ */
            if (sscanf(gps_data, "$GPRMC,%f,%f,%f,%d", &w_time, &velocity, &direction, &date) >= 1) {
                if (rlock == 1) {

                    float timenow = w_time;
                    int hour = timenow / 10000;
                    timenow = fmod(timenow, 10000);
                    int min = timenow / 100;
                    timenow = fmod(timenow, 100);
                    int sec = timenow / 1;
                    timenow = fmod(timenow, 1);

                    float v_mps = velocity * 1852 / 3600;

                    // /*
                    // 10進法(google)
                    //pc.printf("世界標準時:%02dh%02dm%02ds 速度:%f[mps] 方位:%f, 日付:20%02d年%02d月%02d日\r\n",
                    //          hour, min, sec, v_mps, direction, date % 100, (date / 100) % 100, date / 10000);
                    //  */
                    /*
                    // 60進法(x時y分z秒w)
                    pc.printf("世界標準時:%02dh%02dm%02ds 速度:%f[mps] 方位:%f, 日付:20%02d年%02d月%02d日\r\n",
                    hour,min,sec,velocity,direction,date%100,(date/100)%100, date/10000);
                    */
                } else {
                    float timenow = w_time;
                    int hour = timenow / 10000;
                    timenow = fmod(timenow, 10000);
                    int min = timenow / 100;
                    timenow = fmod(timenow, 100);
                    int sec = timenow / 1;
                    timenow = fmod(timenow, 1);

                    //pc.printf("# 世界標準時:%02dh%02dm%02ds 速度:%f[knot] 方位:%f, 日付:20%02d年%02d月%02d日\r\n",
                    //          hour, min, sec, velocity, direction, date % 100, (date / 100) % 100, date / 10000);
                }
                sprintf(gps_data, "");
            } //if

            //pc.printf("\r\n");
        }
    }
}

/* --- 生データ取得用 --- */
/*
#include "mbed.h"

Serial gps(p9, p10);       // TX, RX
Serial pc(USBTX, USBRX);    // TX, RX
DigitalOut led1(LED1);

int main() {
    pc.baud(115200);
    pc.printf("PA6C DEMO\n");
    char gpsout[1024];
    while (1) {
        gpsout[0] = '\0';
        while (1) {
            char c = gps.getc();
            char s[2];
            s[0] = c;
            s[1] = '\0';
            strcat(gpsout, s);
            if (c == '\n') {
                break;
            }
        }
        pc.printf(gpsout);
        led1 = !led1;
    }
}
 */