项目作者: pilotak

项目描述 :
Ublox GPS I2C async library for mbed
高级语言: C++
项目地址: git://github.com/pilotak/UbxGpsI2C.git
创建时间: 2018-07-11T19:40:19Z
项目社区:https://github.com/pilotak/UbxGpsI2C

开源协议:MIT License

下载


UbxGpsI2C

Framework Badge mbed

Ublox GPS I2C async library for mbed.

Example

  1. #include "mbed.h"
  2. #include "UbxGpsI2C.h"
  3. #define GPS_READ_INTERVAL 1s
  4. UbxGpsI2C gps(GPS_SDA, GPS_SCL);
  5. Ticker ticker;
  6. volatile bool poll_gps = true;
  7. volatile bool read_gps = false;
  8. struct gps_data_t {
  9. uint32_t itow;
  10. uint16_t year;
  11. uint8_t month;
  12. uint8_t day;
  13. uint8_t hour;
  14. uint8_t min;
  15. uint8_t sec;
  16. uint8_t valid;
  17. uint32_t tAcc;
  18. int32_t nano;
  19. uint8_t fixType;
  20. uint8_t flags;
  21. uint8_t flags2;
  22. uint8_t numSv;
  23. int32_t lon;
  24. int32_t lat;
  25. int32_t height;
  26. int32_t hMSL;
  27. uint32_t hAcc;
  28. uint32_t vAcc;
  29. int32_t velN;
  30. int32_t velE;
  31. int32_t velD;
  32. int32_t gSpeed;
  33. int32_t headMot;
  34. uint32_t sAcc;
  35. uint32_t headAcc;
  36. uint16_t pDOP;
  37. uint8_t reserved1[6];
  38. int32_t headVeh;
  39. uint8_t reserved2[4];
  40. } gps_data;
  41. struct odo_data_t {
  42. uint8_t version;
  43. uint8_t reserved1[3];
  44. uint32_t iTOW;
  45. uint32_t distance;
  46. uint32_t totalDistance;
  47. uint32_t distanceStd;
  48. } odo_data;
  49. void gpsPVT() {
  50. memcpy(&gps_data, gps.msg.data.get(), sizeof(gps_data_t));
  51. printf("fix: %u lat: %li lon: %li\n", gps_data.fixType, gps_data.lat, gps_data.lon);
  52. }
  53. void gpsOdo() {
  54. memcpy(&odo_data, gps.msg.data.get(), sizeof(odo_data_t));
  55. printf("Odo: %lu\n", odo_data.distance);
  56. }
  57. void pollGps() { // ISR
  58. poll_gps = true;
  59. }
  60. void readGps() { // ISR
  61. read_gps = true;
  62. }
  63. int main() {
  64. while (!gps.init(readGps)) {
  65. ThisThread::sleep_for(1s);
  66. }
  67. if (!gps.set_output_rate(GPS_READ_INTERVAL)) {
  68. printf("PVT rate FAILED\n");
  69. return 0;
  70. }
  71. if (!gps.set_odometer(true, UbxGpsI2C::ODO_RUNNING)) {
  72. printf("Odo FAILED\n");
  73. return 0;
  74. }
  75. if (!gps.auto_send(UbxGpsI2C::UBX_NAV, UBX_NAV_PVT, 1, gpsPVT)) {
  76. printf("Auto pvt FAILED\n");
  77. return 0;
  78. }
  79. if (!gps.auto_send(UbxGpsI2C::UBX_NAV, UBX_NAV_ODO, 1, gpsOdo)) {
  80. printf("Auto odo FAILED\n");
  81. return 0;
  82. }
  83. UbxGpsI2C::cfg_sbas_t cfg_sbas = {
  84. .mode = 1, // enable
  85. .usage = 0b111, // integrity, diffCorr, range
  86. .maxSBAS = 3,
  87. .scanmode2 = 0,
  88. .scanmode1 = 0b100001011001 // EGNOS: PRN131, PRN126, PRN124, PRN123, PRN120
  89. };
  90. if (!gps.send_ack(UbxGpsI2C::UBX_CFG, UBX_CFG_SBAS, &cfg_sbas, sizeof(UbxGpsI2C::cfg_sbas_t))) {
  91. printf("SBAS FAILED\n");
  92. return 0;
  93. }
  94. ticker.attach(&pollGps, GPS_READ_INTERVAL);
  95. printf("GPS OK\n");
  96. while (1) {
  97. if (read_gps) {
  98. read_gps = false;
  99. gps.process();
  100. poll_gps = true; // check for rest of the data
  101. }
  102. if (poll_gps) {
  103. poll_gps = false;
  104. if (!gps.poll()) {
  105. printf("Request failed\n");
  106. }
  107. }
  108. }
  109. MBED_ASSERT(false);
  110. }

Example with enabled debug

mbed_app.json

  1. {
  2. "config": {
  3. "trace-level": {
  4. "help": "Options are TRACE_LEVEL_ERROR,TRACE_LEVEL_WARN,TRACE_LEVEL_INFO,TRACE_LEVEL_DEBUG",
  5. "macro_name": "MBED_TRACE_MAX_LEVEL",
  6. "value": "TRACE_LEVEL_DEBUG"
  7. }
  8. },
  9. "target_overrides": {
  10. "*": {
  11. "mbed-trace.enable": true,
  12. "ubxgps.debug": true
  13. }
  14. }
  15. }
  1. #include "mbed.h"
  2. #include "UbxGpsI2C.h"
  3. #if MBED_CONF_MBED_TRACE_ENABLE
  4. #include "mbed-trace/mbed_trace.h"
  5. static Mutex trace_mutex;
  6. static void trace_wait() {
  7. trace_mutex.lock();
  8. }
  9. static void trace_release() {
  10. trace_mutex.unlock();
  11. }
  12. void trace_init() {
  13. mbed_trace_init();
  14. // mbed_trace_exclude_filters_set(const_cast<char*>("UBX "));
  15. mbed_trace_mutex_wait_function_set(trace_wait);
  16. mbed_trace_mutex_release_function_set(trace_release);
  17. }
  18. #endif
  19. int main() {
  20. #if MBED_CONF_MBED_TRACE_ENABLE
  21. trace_init();
  22. #endif
  23. while (!gps.init(readGps)) {
  24. ThisThread::sleep_for(1s);
  25. }
  26. ...
  27. }