Browse Source

gps: add generic nmea driver

master
Beat Küng 4 years ago committed by Daniel Agar
parent
commit
4b49f9261e
  1. 1
      src/drivers/drv_sensor.h
  2. 1
      src/drivers/gps/CMakeLists.txt
  3. 2
      src/drivers/gps/devices
  4. 21
      src/drivers/gps/gps.cpp
  5. 2
      src/drivers/gps/params.c

1
src/drivers/drv_sensor.h

@ -193,6 +193,7 @@
#define DRV_GPS_DEVTYPE_UBX_8 0xA8 #define DRV_GPS_DEVTYPE_UBX_8 0xA8
#define DRV_GPS_DEVTYPE_UBX_9 0xA9 #define DRV_GPS_DEVTYPE_UBX_9 0xA9
#define DRV_GPS_DEVTYPE_UBX_F9P 0xAA #define DRV_GPS_DEVTYPE_UBX_F9P 0xAA
#define DRV_GPS_DEVTYPE_NMEA 0xAB
#define DRV_GPS_DEVTYPE_SIM 0xAF #define DRV_GPS_DEVTYPE_SIM 0xAF

1
src/drivers/gps/CMakeLists.txt

@ -48,6 +48,7 @@ px4_add_module(
devices/src/rtcm.cpp devices/src/rtcm.cpp
devices/src/emlid_reach.cpp devices/src/emlid_reach.cpp
devices/src/femtomes.cpp devices/src/femtomes.cpp
devices/src/nmea.cpp
MODULE_CONFIG MODULE_CONFIG
module.yaml module.yaml
DEPENDS DEPENDS

2
src/drivers/gps/devices

@ -1 +1 @@
Subproject commit 6815e1d3b294cd6ea583294ebadf191321e4beba Subproject commit 8af5336d3f112278fd321e2c512453f23a350540

21
src/drivers/gps/gps.cpp

@ -68,6 +68,7 @@
# include "devices/src/emlid_reach.h" # include "devices/src/emlid_reach.h"
# include "devices/src/mtk.h" # include "devices/src/mtk.h"
# include "devices/src/femtomes.h" # include "devices/src/femtomes.h"
# include "devices/src/nmea.h"
#endif // CONSTRAINED_FLASH #endif // CONSTRAINED_FLASH
#include "devices/src/ubx.h" #include "devices/src/ubx.h"
@ -85,7 +86,8 @@ enum class gps_driver_mode_t {
MTK, MTK,
ASHTECH, ASHTECH,
EMLIDREACH, EMLIDREACH,
FEMTOMES FEMTOMES,
NMEA
}; };
enum class gps_dump_comm_mode_t : int32_t { enum class gps_dump_comm_mode_t : int32_t {
@ -321,6 +323,8 @@ GPS::GPS(const char *path, gps_driver_mode_t mode, GPSHelper::Interface interfac
case 4: _mode = gps_driver_mode_t::EMLIDREACH; break; case 4: _mode = gps_driver_mode_t::EMLIDREACH; break;
case 5: _mode = gps_driver_mode_t::FEMTOMES; break; case 5: _mode = gps_driver_mode_t::FEMTOMES; break;
case 6: _mode = gps_driver_mode_t::NMEA; break;
#endif // CONSTRAINED_FLASH #endif // CONSTRAINED_FLASH
} }
} }
@ -793,6 +797,11 @@ GPS::run()
_helper = new GPSDriverFemto(&GPS::callback, this, &_report_gps_pos, _p_report_sat_info, heading_offset); _helper = new GPSDriverFemto(&GPS::callback, this, &_report_gps_pos, _p_report_sat_info, heading_offset);
set_device_type(DRV_GPS_DEVTYPE_FEMTOMES); set_device_type(DRV_GPS_DEVTYPE_FEMTOMES);
break; break;
case gps_driver_mode_t::NMEA:
_helper = new GPSDriverNMEA(&GPS::callback, this, &_report_gps_pos, _p_report_sat_info, heading_offset);
set_device_type(DRV_GPS_DEVTYPE_NMEA);
break;
#endif // CONSTRAINED_FLASH #endif // CONSTRAINED_FLASH
default: default:
@ -953,6 +962,7 @@ GPS::run()
break; break;
case gps_driver_mode_t::FEMTOMES: case gps_driver_mode_t::FEMTOMES:
case gps_driver_mode_t::NMEA: // skip NMEA for auto-detection to avoid false positive matching
#endif // CONSTRAINED_FLASH #endif // CONSTRAINED_FLASH
_mode = gps_driver_mode_t::UBX; _mode = gps_driver_mode_t::UBX;
px4_usleep(500000); // tried all possible drivers. Wait a bit before next round px4_usleep(500000); // tried all possible drivers. Wait a bit before next round
@ -1009,6 +1019,10 @@ GPS::print_status()
case gps_driver_mode_t::FEMTOMES: case gps_driver_mode_t::FEMTOMES:
PX4_INFO("protocol: FEMTOMES"); PX4_INFO("protocol: FEMTOMES");
break; break;
case gps_driver_mode_t::NMEA:
PX4_INFO("protocol: NMEA");
break;
#endif // CONSTRAINED_FLASH #endif // CONSTRAINED_FLASH
default: default:
@ -1175,7 +1189,7 @@ $ gps reset warm
PRINT_MODULE_USAGE_PARAM_STRING('i', "uart", "spi|uart", "GPS interface", true); PRINT_MODULE_USAGE_PARAM_STRING('i', "uart", "spi|uart", "GPS interface", true);
PRINT_MODULE_USAGE_PARAM_STRING('j', "uart", "spi|uart", "secondary GPS interface", true); PRINT_MODULE_USAGE_PARAM_STRING('j', "uart", "spi|uart", "secondary GPS interface", true);
PRINT_MODULE_USAGE_PARAM_STRING('p', nullptr, "ubx|mtk|ash|eml|fem", "GPS Protocol (default=auto select)", true); PRINT_MODULE_USAGE_PARAM_STRING('p', nullptr, "ubx|mtk|ash|eml|fem|nmea", "GPS Protocol (default=auto select)", true);
PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); PRINT_MODULE_USAGE_DEFAULT_COMMANDS();
PRINT_MODULE_USAGE_COMMAND_DESCR("reset", "Reset GPS device"); PRINT_MODULE_USAGE_COMMAND_DESCR("reset", "Reset GPS device");
@ -1319,6 +1333,9 @@ GPS *GPS::instantiate(int argc, char *argv[], Instance instance)
} else if (!strcmp(myoptarg, "fem")) { } else if (!strcmp(myoptarg, "fem")) {
mode = gps_driver_mode_t::FEMTOMES; mode = gps_driver_mode_t::FEMTOMES;
} else if (!strcmp(myoptarg, "nmea")) {
mode = gps_driver_mode_t::NMEA;
#endif // CONSTRAINED_FLASH #endif // CONSTRAINED_FLASH
} else { } else {
PX4_ERR("unknown protocol: %s", myoptarg); PX4_ERR("unknown protocol: %s", myoptarg);

2
src/drivers/gps/params.c

@ -127,6 +127,7 @@ PARAM_DEFINE_FLOAT(GPS_YAW_OFFSET, 0.f);
* @value 3 Ashtech / Trimble * @value 3 Ashtech / Trimble
* @value 4 Emlid Reach * @value 4 Emlid Reach
* @value 5 Femtomes * @value 5 Femtomes
* @value 6 NMEA (generic)
* *
* @reboot_required true * @reboot_required true
* @group GPS * @group GPS
@ -148,6 +149,7 @@ PARAM_DEFINE_INT32(GPS_1_PROTOCOL, 1);
* @value 3 Ashtech / Trimble * @value 3 Ashtech / Trimble
* @value 4 Emlid Reach * @value 4 Emlid Reach
* @value 5 Femtomes * @value 5 Femtomes
* @value 6 NMEA (generic)
* *
* @reboot_required true * @reboot_required true
* @group GPS * @group GPS

Loading…
Cancel
Save