u-blox UBX library for I2C

Dependencies:   Vector3

It will not work

Committer:
cocorlow
Date:
Sun Sep 12 16:38:51 2021 +0000
Revision:
0:6256752abece
TIMEUTC test

Who changed what in which revision?

UserRevisionLine numberNew 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 }