u-blox UBX library for I2C
Dependencies: Vector3
It will not work
GPSUBX.cpp@0:6256752abece, 2021-09-12 (annotated)
- Committer:
- cocorlow
- Date:
- Sun Sep 12 16:38:51 2021 +0000
- Revision:
- 0:6256752abece
TIMEUTC test
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cocorlow | 0:6256752abece | 1 | #include "GPSUBX.hpp" |
cocorlow | 0:6256752abece | 2 | #include "mbed.h" |
cocorlow | 0:6256752abece | 3 | |
cocorlow | 0:6256752abece | 4 | GPSUBX::GPSUBX(PinName sda, PinName scl, char address = GPS_ADDRESS, int timedifference = 9, int hz = 100000) |
cocorlow | 0:6256752abece | 5 | :i2c(sda, scl), Address(address), TimeDifference(timedifference) |
cocorlow | 0:6256752abece | 6 | { |
cocorlow | 0:6256752abece | 7 | i2c.frequency(hz); |
cocorlow | 0:6256752abece | 8 | } |
cocorlow | 0:6256752abece | 9 | |
cocorlow | 0:6256752abece | 10 | void GPSUBX::Checksum(char payload[], int n, char* ck_a, char* ck_b) |
cocorlow | 0:6256752abece | 11 | { |
cocorlow | 0:6256752abece | 12 | int ca = 0; |
cocorlow | 0:6256752abece | 13 | int cb = 0; |
cocorlow | 0:6256752abece | 14 | for (int i = 0; i < n+4; i++) |
cocorlow | 0:6256752abece | 15 | { |
cocorlow | 0:6256752abece | 16 | ca += (unsigned char)payload[i+2]; |
cocorlow | 0:6256752abece | 17 | cb += ca; |
cocorlow | 0:6256752abece | 18 | } |
cocorlow | 0:6256752abece | 19 | *ck_a = (char)(ca & 0xff); |
cocorlow | 0:6256752abece | 20 | *ck_b = (char)(cb & 0xff); |
cocorlow | 0:6256752abece | 21 | } |
cocorlow | 0:6256752abece | 22 | |
cocorlow | 0:6256752abece | 23 | int GPSUBX::GetGPSData(GPSData* pdata) |
cocorlow | 0:6256752abece | 24 | { |
cocorlow | 0:6256752abece | 25 | POSLLH posllh; |
cocorlow | 0:6256752abece | 26 | char command[8] = {0xb5, 0x62, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00}; |
cocorlow | 0:6256752abece | 27 | Checksum(command, 0, &command[6], &command[7]); |
cocorlow | 0:6256752abece | 28 | |
cocorlow | 0:6256752abece | 29 | i2c.write(Address << 1, command, 8); |
cocorlow | 0:6256752abece | 30 | i2c.read(Address << 1 | 1, posllh.byte_data, POSLLH_LEN+8); |
cocorlow | 0:6256752abece | 31 | |
cocorlow | 0:6256752abece | 32 | for (int i = 0; i < POSLLH_LEN+8; i++) |
cocorlow | 0:6256752abece | 33 | { |
cocorlow | 0:6256752abece | 34 | pc.printf("%x ", posllh.byte_data[i]); |
cocorlow | 0:6256752abece | 35 | } |
cocorlow | 0:6256752abece | 36 | pc.printf("\r\n"); |
cocorlow | 0:6256752abece | 37 | if (posllh.data.sync == UBX_SYNC && posllh.data.m_class == 0x01 && posllh.data.m_id == 0x02 && posllh.data.pay_len == POSLLH_LEN) |
cocorlow | 0:6256752abece | 38 | { |
cocorlow | 0:6256752abece | 39 | char ca, cb; |
cocorlow | 0:6256752abece | 40 | Checksum(posllh.byte_data, POSLLH_LEN, &ca, &cb); |
cocorlow | 0:6256752abece | 41 | if (posllh.data.check_a == ca && posllh.data.check_b == cb) |
cocorlow | 0:6256752abece | 42 | { |
cocorlow | 0:6256752abece | 43 | pdata->Longitude = (float)posllh.data.lon * 1e-7f; |
cocorlow | 0:6256752abece | 44 | pdata->Latitude = (float)posllh.data.lat * 1e-7f; |
cocorlow | 0:6256752abece | 45 | pdata->Height = (float)posllh.data.height / 1000.0f; |
cocorlow | 0:6256752abece | 46 | pc.printf("%f, %f, %f\r\n", pdata->Longitude, pdata->Latitude, pdata->Height); |
cocorlow | 0:6256752abece | 47 | } |
cocorlow | 0:6256752abece | 48 | else |
cocorlow | 0:6256752abece | 49 | { |
cocorlow | 0:6256752abece | 50 | pc.printf("#1\r\n"); |
cocorlow | 0:6256752abece | 51 | return 0; |
cocorlow | 0:6256752abece | 52 | } |
cocorlow | 0:6256752abece | 53 | pc.printf("#2\r\n"); |
cocorlow | 0:6256752abece | 54 | return 1; |
cocorlow | 0:6256752abece | 55 | } |
cocorlow | 0:6256752abece | 56 | else |
cocorlow | 0:6256752abece | 57 | { |
cocorlow | 0:6256752abece | 58 | pc.printf("#3\r\n"); |
cocorlow | 0:6256752abece | 59 | return 0; |
cocorlow | 0:6256752abece | 60 | } |
cocorlow | 0:6256752abece | 61 | } |
cocorlow | 0:6256752abece | 62 | |
cocorlow | 0:6256752abece | 63 | int GPSUBX::GetTimeData(GPSData* pdata) |
cocorlow | 0:6256752abece | 64 | { |
cocorlow | 0:6256752abece | 65 | TIMEUTC timeutc; |
cocorlow | 0:6256752abece | 66 | char command[8] = {0xb5, 0x62, 0x01, 0x21, 0x00, 0x00, 0x00, 0x00}; |
cocorlow | 0:6256752abece | 67 | Checksum(command, 0, &command[6], &command[7]); |
cocorlow | 0:6256752abece | 68 | |
cocorlow | 0:6256752abece | 69 | i2c.write(Address << 1, command, 8); |
cocorlow | 0:6256752abece | 70 | i2c.read(Address << 1 | 1, timeutc.byte_data, TIMEUTC_LEN+8); |
cocorlow | 0:6256752abece | 71 | |
cocorlow | 0:6256752abece | 72 | for (int i = 0; i < TIMEUTC_LEN+8; i++) |
cocorlow | 0:6256752abece | 73 | { |
cocorlow | 0:6256752abece | 74 | pc.printf("%x ", timeutc.byte_data[i]); |
cocorlow | 0:6256752abece | 75 | } |
cocorlow | 0:6256752abece | 76 | pc.printf("\r\n"); |
cocorlow | 0:6256752abece | 77 | if (timeutc.data.sync == UBX_SYNC && timeutc.data.m_class == 0x01 && timeutc.data.m_id == 0x21 && timeutc.data.pay_len == TIMEUTC_LEN) |
cocorlow | 0:6256752abece | 78 | { |
cocorlow | 0:6256752abece | 79 | char ca, cb; |
cocorlow | 0:6256752abece | 80 | Checksum(timeutc.byte_data, TIMEUTC_LEN, &ca, &cb); |
cocorlow | 0:6256752abece | 81 | if (timeutc.data.check_a == ca && timeutc.data.check_b == cb) |
cocorlow | 0:6256752abece | 82 | { |
cocorlow | 0:6256752abece | 83 | pdata->Year = timeutc.data.year; |
cocorlow | 0:6256752abece | 84 | pdata->Month = timeutc.data.month; |
cocorlow | 0:6256752abece | 85 | pdata->Day = timeutc.data.day; |
cocorlow | 0:6256752abece | 86 | pdata->Hours = timeutc.data.hour; |
cocorlow | 0:6256752abece | 87 | pdata->Minutes = timeutc.data.min; |
cocorlow | 0:6256752abece | 88 | pdata->Seconds = timeutc.data.sec; |
cocorlow | 0:6256752abece | 89 | pc.printf("%4d/%2d/%2d %2d:%2d %2d\r\n", pdata->Year, pdata->Month, pdata->Day, pdata->Hours, pdata->Minutes, pdata->Seconds); |
cocorlow | 0:6256752abece | 90 | } |
cocorlow | 0:6256752abece | 91 | else |
cocorlow | 0:6256752abece | 92 | { |
cocorlow | 0:6256752abece | 93 | pc.printf("#4\r\n"); |
cocorlow | 0:6256752abece | 94 | return 0; |
cocorlow | 0:6256752abece | 95 | } |
cocorlow | 0:6256752abece | 96 | pc.printf("#5\r\n"); |
cocorlow | 0:6256752abece | 97 | return 1; |
cocorlow | 0:6256752abece | 98 | } |
cocorlow | 0:6256752abece | 99 | else |
cocorlow | 0:6256752abece | 100 | { |
cocorlow | 0:6256752abece | 101 | pc.printf("#6\r\n"); |
cocorlow | 0:6256752abece | 102 | return 0; |
cocorlow | 0:6256752abece | 103 | } |
cocorlow | 0:6256752abece | 104 | } |