ゑひと氏のをクラス化致した
GPS.cpp@0:f291337e7ce9, 2020-02-24 (annotated)
- Committer:
- IKobayashi
- Date:
- Mon Feb 24 09:58:22 2020 +0000
- Revision:
- 0:f291337e7ce9
GO is GOD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
IKobayashi | 0:f291337e7ce9 | 1 | #include "mbed.h" |
IKobayashi | 0:f291337e7ce9 | 2 | #include "GPS.h" |
IKobayashi | 0:f291337e7ce9 | 3 | |
IKobayashi | 0:f291337e7ce9 | 4 | GPS::GPS(PinName gpstx, PinName gpsrx) : _gps(gpstx, gpsrx) |
IKobayashi | 0:f291337e7ce9 | 5 | { |
IKobayashi | 0:f291337e7ce9 | 6 | g_hour = 0, g_min = 0, g_sec = 0; |
IKobayashi | 0:f291337e7ce9 | 7 | g_hokui = 0, g_tokei = 0; |
IKobayashi | 0:f291337e7ce9 | 8 | stlgt = 0; |
IKobayashi | 0:f291337e7ce9 | 9 | date = 0; |
IKobayashi | 0:f291337e7ce9 | 10 | velocity = 0, direction = 0; |
IKobayashi | 0:f291337e7ce9 | 11 | w_time = 0, hokui = 0, tokei = 0; |
IKobayashi | 0:f291337e7ce9 | 12 | |
IKobayashi | 0:f291337e7ce9 | 13 | _gps.baud(GPSBAUD); |
IKobayashi | 0:f291337e7ce9 | 14 | _gps.attach(this, &GPS::getGPS); |
IKobayashi | 0:f291337e7ce9 | 15 | } |
IKobayashi | 0:f291337e7ce9 | 16 | |
IKobayashi | 0:f291337e7ce9 | 17 | void GPS::getGPS() |
IKobayashi | 0:f291337e7ce9 | 18 | { |
IKobayashi | 0:f291337e7ce9 | 19 | c = _gps.getc(); |
IKobayashi | 0:f291337e7ce9 | 20 | if (c == '$' || i == 256) { |
IKobayashi | 0:f291337e7ce9 | 21 | mode = 0; |
IKobayashi | 0:f291337e7ce9 | 22 | i = 0; |
IKobayashi | 0:f291337e7ce9 | 23 | for (int j = 0; j < 256; j++) { |
IKobayashi | 0:f291337e7ce9 | 24 | gps_data[j] = NULL; |
IKobayashi | 0:f291337e7ce9 | 25 | } |
IKobayashi | 0:f291337e7ce9 | 26 | } |
IKobayashi | 0:f291337e7ce9 | 27 | if (mode == 0) { |
IKobayashi | 0:f291337e7ce9 | 28 | if ((gps_data[i] = c) != '\r') { |
IKobayashi | 0:f291337e7ce9 | 29 | i++; |
IKobayashi | 0:f291337e7ce9 | 30 | } else { |
IKobayashi | 0:f291337e7ce9 | 31 | gps_data[i] = '\0'; |
IKobayashi | 0:f291337e7ce9 | 32 | |
IKobayashi | 0:f291337e7ce9 | 33 | //pc.printf(gps_data); |
IKobayashi | 0:f291337e7ce9 | 34 | //pc.printf("\r\n"); |
IKobayashi | 0:f291337e7ce9 | 35 | |
IKobayashi | 0:f291337e7ce9 | 36 | if (sscanf(gps_data, "$GPGGA,%f,%f,%c,%f,%c,%d,%d", &w_time, &hokui, &ns, &tokei, &ew, &rlock, &stlgt) >= 1) { |
IKobayashi | 0:f291337e7ce9 | 37 | if (rlock == 1) { |
IKobayashi | 0:f291337e7ce9 | 38 | //logitude |
IKobayashi | 0:f291337e7ce9 | 39 | d_tokei = int(tokei / 100); |
IKobayashi | 0:f291337e7ce9 | 40 | m_tokei = (tokei - d_tokei * 100) / 60; |
IKobayashi | 0:f291337e7ce9 | 41 | g_tokei = d_tokei + m_tokei; |
IKobayashi | 0:f291337e7ce9 | 42 | //Latitude |
IKobayashi | 0:f291337e7ce9 | 43 | d_hokui = int(hokui / 100); |
IKobayashi | 0:f291337e7ce9 | 44 | m_hokui = (hokui - d_hokui * 100) / 60; |
IKobayashi | 0:f291337e7ce9 | 45 | g_hokui = d_hokui + m_hokui; |
IKobayashi | 0:f291337e7ce9 | 46 | |
IKobayashi | 0:f291337e7ce9 | 47 | float timenow = w_time; |
IKobayashi | 0:f291337e7ce9 | 48 | int hour = timenow / 10000; |
IKobayashi | 0:f291337e7ce9 | 49 | timenow = fmod(timenow, 10000); |
IKobayashi | 0:f291337e7ce9 | 50 | int min = timenow / 100; |
IKobayashi | 0:f291337e7ce9 | 51 | timenow = fmod(timenow, 100); |
IKobayashi | 0:f291337e7ce9 | 52 | int sec = timenow / 1; |
IKobayashi | 0:f291337e7ce9 | 53 | timenow = fmod(timenow, 1); |
IKobayashi | 0:f291337e7ce9 | 54 | |
IKobayashi | 0:f291337e7ce9 | 55 | g_hour = hour; |
IKobayashi | 0:f291337e7ce9 | 56 | g_min = min; |
IKobayashi | 0:f291337e7ce9 | 57 | g_sec = sec; |
IKobayashi | 0:f291337e7ce9 | 58 | |
IKobayashi | 0:f291337e7ce9 | 59 | // /* |
IKobayashi | 0:f291337e7ce9 | 60 | // 10進法(google) |
IKobayashi | 0:f291337e7ce9 | 61 | //pc.printf("世界標準時:%02dh%02dm%02ds 北緯:%.8f 東経:%.8f 状態:%d 使用衛星数:%d\r\n", |
IKobayashi | 0:f291337e7ce9 | 62 | // hour, min, sec, g_hokui, g_tokei, rlock, stlgt); |
IKobayashi | 0:f291337e7ce9 | 63 | // */ |
IKobayashi | 0:f291337e7ce9 | 64 | /* |
IKobayashi | 0:f291337e7ce9 | 65 | // 60進法(x時y分z秒w) |
IKobayashi | 0:f291337e7ce9 | 66 | pc.printf("s世界標準時:%02dh%02dm%02ds 北緯:%.8f 東経:%.8f 状態:%d 使用衛星数:%d\r\n", |
IKobayashi | 0:f291337e7ce9 | 67 | hour, min, sec, hokui/100, tokei/100, rlock, stlgt); |
IKobayashi | 0:f291337e7ce9 | 68 | */ |
IKobayashi | 0:f291337e7ce9 | 69 | } else { |
IKobayashi | 0:f291337e7ce9 | 70 | float timenow = w_time; |
IKobayashi | 0:f291337e7ce9 | 71 | int hour = timenow / 10000; |
IKobayashi | 0:f291337e7ce9 | 72 | timenow = fmod(timenow, 10000); |
IKobayashi | 0:f291337e7ce9 | 73 | int min = timenow / 100; |
IKobayashi | 0:f291337e7ce9 | 74 | timenow = fmod(timenow, 100); |
IKobayashi | 0:f291337e7ce9 | 75 | int sec = timenow / 1; |
IKobayashi | 0:f291337e7ce9 | 76 | timenow = fmod(timenow, 1); |
IKobayashi | 0:f291337e7ce9 | 77 | |
IKobayashi | 0:f291337e7ce9 | 78 | g_hour = hour; |
IKobayashi | 0:f291337e7ce9 | 79 | g_min = min; |
IKobayashi | 0:f291337e7ce9 | 80 | g_sec = sec; |
IKobayashi | 0:f291337e7ce9 | 81 | |
IKobayashi | 0:f291337e7ce9 | 82 | //pc.printf("# 世界標準時e:%02dh%02dm%02d 状態:%d 使用衛星数:%d\r\n", |
IKobayashi | 0:f291337e7ce9 | 83 | // hour, min, sec, rlock, stlgt); |
IKobayashi | 0:f291337e7ce9 | 84 | } |
IKobayashi | 0:f291337e7ce9 | 85 | sprintf(gps_data, ""); |
IKobayashi | 0:f291337e7ce9 | 86 | } //if |
IKobayashi | 0:f291337e7ce9 | 87 | |
IKobayashi | 0:f291337e7ce9 | 88 | /* ------------------------------ */ |
IKobayashi | 0:f291337e7ce9 | 89 | if (sscanf(gps_data, "$GPRMC,%f,%f,%f,%d", &w_time, &velocity, &direction, &date) >= 1) { |
IKobayashi | 0:f291337e7ce9 | 90 | if (rlock == 1) { |
IKobayashi | 0:f291337e7ce9 | 91 | |
IKobayashi | 0:f291337e7ce9 | 92 | float timenow = w_time; |
IKobayashi | 0:f291337e7ce9 | 93 | int hour = timenow / 10000; |
IKobayashi | 0:f291337e7ce9 | 94 | timenow = fmod(timenow, 10000); |
IKobayashi | 0:f291337e7ce9 | 95 | int min = timenow / 100; |
IKobayashi | 0:f291337e7ce9 | 96 | timenow = fmod(timenow, 100); |
IKobayashi | 0:f291337e7ce9 | 97 | int sec = timenow / 1; |
IKobayashi | 0:f291337e7ce9 | 98 | timenow = fmod(timenow, 1); |
IKobayashi | 0:f291337e7ce9 | 99 | |
IKobayashi | 0:f291337e7ce9 | 100 | float v_mps = velocity * 1852 / 3600; |
IKobayashi | 0:f291337e7ce9 | 101 | |
IKobayashi | 0:f291337e7ce9 | 102 | // /* |
IKobayashi | 0:f291337e7ce9 | 103 | // 10進法(google) |
IKobayashi | 0:f291337e7ce9 | 104 | //pc.printf("世界標準時:%02dh%02dm%02ds 速度:%f[mps] 方位:%f, 日付:20%02d年%02d月%02d日\r\n", |
IKobayashi | 0:f291337e7ce9 | 105 | // hour, min, sec, v_mps, direction, date % 100, (date / 100) % 100, date / 10000); |
IKobayashi | 0:f291337e7ce9 | 106 | // */ |
IKobayashi | 0:f291337e7ce9 | 107 | /* |
IKobayashi | 0:f291337e7ce9 | 108 | // 60進法(x時y分z秒w) |
IKobayashi | 0:f291337e7ce9 | 109 | pc.printf("世界標準時:%02dh%02dm%02ds 速度:%f[mps] 方位:%f, 日付:20%02d年%02d月%02d日\r\n", |
IKobayashi | 0:f291337e7ce9 | 110 | hour,min,sec,velocity,direction,date%100,(date/100)%100, date/10000); |
IKobayashi | 0:f291337e7ce9 | 111 | */ |
IKobayashi | 0:f291337e7ce9 | 112 | } else { |
IKobayashi | 0:f291337e7ce9 | 113 | float timenow = w_time; |
IKobayashi | 0:f291337e7ce9 | 114 | int hour = timenow / 10000; |
IKobayashi | 0:f291337e7ce9 | 115 | timenow = fmod(timenow, 10000); |
IKobayashi | 0:f291337e7ce9 | 116 | int min = timenow / 100; |
IKobayashi | 0:f291337e7ce9 | 117 | timenow = fmod(timenow, 100); |
IKobayashi | 0:f291337e7ce9 | 118 | int sec = timenow / 1; |
IKobayashi | 0:f291337e7ce9 | 119 | timenow = fmod(timenow, 1); |
IKobayashi | 0:f291337e7ce9 | 120 | |
IKobayashi | 0:f291337e7ce9 | 121 | //pc.printf("# 世界標準時:%02dh%02dm%02ds 速度:%f[knot] 方位:%f, 日付:20%02d年%02d月%02d日\r\n", |
IKobayashi | 0:f291337e7ce9 | 122 | // hour, min, sec, velocity, direction, date % 100, (date / 100) % 100, date / 10000); |
IKobayashi | 0:f291337e7ce9 | 123 | } |
IKobayashi | 0:f291337e7ce9 | 124 | sprintf(gps_data, ""); |
IKobayashi | 0:f291337e7ce9 | 125 | } //if |
IKobayashi | 0:f291337e7ce9 | 126 | |
IKobayashi | 0:f291337e7ce9 | 127 | //pc.printf("\r\n"); |
IKobayashi | 0:f291337e7ce9 | 128 | } |
IKobayashi | 0:f291337e7ce9 | 129 | } |
IKobayashi | 0:f291337e7ce9 | 130 | } |
IKobayashi | 0:f291337e7ce9 | 131 | |
IKobayashi | 0:f291337e7ce9 | 132 | /* --- 生データ取得用 --- */ |
IKobayashi | 0:f291337e7ce9 | 133 | /* |
IKobayashi | 0:f291337e7ce9 | 134 | #include "mbed.h" |
IKobayashi | 0:f291337e7ce9 | 135 | |
IKobayashi | 0:f291337e7ce9 | 136 | Serial gps(p9, p10); // TX, RX |
IKobayashi | 0:f291337e7ce9 | 137 | Serial pc(USBTX, USBRX); // TX, RX |
IKobayashi | 0:f291337e7ce9 | 138 | DigitalOut led1(LED1); |
IKobayashi | 0:f291337e7ce9 | 139 | |
IKobayashi | 0:f291337e7ce9 | 140 | int main() { |
IKobayashi | 0:f291337e7ce9 | 141 | pc.baud(115200); |
IKobayashi | 0:f291337e7ce9 | 142 | pc.printf("PA6C DEMO\n"); |
IKobayashi | 0:f291337e7ce9 | 143 | char gpsout[1024]; |
IKobayashi | 0:f291337e7ce9 | 144 | while (1) { |
IKobayashi | 0:f291337e7ce9 | 145 | gpsout[0] = '\0'; |
IKobayashi | 0:f291337e7ce9 | 146 | while (1) { |
IKobayashi | 0:f291337e7ce9 | 147 | char c = gps.getc(); |
IKobayashi | 0:f291337e7ce9 | 148 | char s[2]; |
IKobayashi | 0:f291337e7ce9 | 149 | s[0] = c; |
IKobayashi | 0:f291337e7ce9 | 150 | s[1] = '\0'; |
IKobayashi | 0:f291337e7ce9 | 151 | strcat(gpsout, s); |
IKobayashi | 0:f291337e7ce9 | 152 | if (c == '\n') { |
IKobayashi | 0:f291337e7ce9 | 153 | break; |
IKobayashi | 0:f291337e7ce9 | 154 | } |
IKobayashi | 0:f291337e7ce9 | 155 | } |
IKobayashi | 0:f291337e7ce9 | 156 | pc.printf(gpsout); |
IKobayashi | 0:f291337e7ce9 | 157 | led1 = !led1; |
IKobayashi | 0:f291337e7ce9 | 158 | } |
IKobayashi | 0:f291337e7ce9 | 159 | } |
IKobayashi | 0:f291337e7ce9 | 160 | */ |