diff --git a/src/drivers/drv_sensor.h b/src/drivers/drv_sensor.h index c3c1069d9a..1013f2781b 100644 --- a/src/drivers/drv_sensor.h +++ b/src/drivers/drv_sensor.h @@ -193,6 +193,7 @@ #define DRV_GPS_DEVTYPE_UBX_8 0xA8 #define DRV_GPS_DEVTYPE_UBX_9 0xA9 #define DRV_GPS_DEVTYPE_UBX_F9P 0xAA +#define DRV_GPS_DEVTYPE_NMEA 0xAB #define DRV_GPS_DEVTYPE_SIM 0xAF diff --git a/src/drivers/gps/CMakeLists.txt b/src/drivers/gps/CMakeLists.txt index 46c41c8792..85d8910a53 100644 --- a/src/drivers/gps/CMakeLists.txt +++ b/src/drivers/gps/CMakeLists.txt @@ -48,6 +48,7 @@ px4_add_module( devices/src/rtcm.cpp devices/src/emlid_reach.cpp devices/src/femtomes.cpp + devices/src/nmea.cpp MODULE_CONFIG module.yaml DEPENDS diff --git a/src/drivers/gps/devices b/src/drivers/gps/devices index 6815e1d3b2..8af5336d3f 160000 --- a/src/drivers/gps/devices +++ b/src/drivers/gps/devices @@ -1 +1 @@ -Subproject commit 6815e1d3b294cd6ea583294ebadf191321e4beba +Subproject commit 8af5336d3f112278fd321e2c512453f23a350540 diff --git a/src/drivers/gps/gps.cpp b/src/drivers/gps/gps.cpp index 9d74fed36e..21cc20fbef 100644 --- a/src/drivers/gps/gps.cpp +++ b/src/drivers/gps/gps.cpp @@ -68,6 +68,7 @@ # include "devices/src/emlid_reach.h" # include "devices/src/mtk.h" # include "devices/src/femtomes.h" +# include "devices/src/nmea.h" #endif // CONSTRAINED_FLASH #include "devices/src/ubx.h" @@ -85,7 +86,8 @@ enum class gps_driver_mode_t { MTK, ASHTECH, EMLIDREACH, - FEMTOMES + FEMTOMES, + NMEA }; 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 5: _mode = gps_driver_mode_t::FEMTOMES; break; + + case 6: _mode = gps_driver_mode_t::NMEA; break; #endif // CONSTRAINED_FLASH } } @@ -793,6 +797,11 @@ GPS::run() _helper = new GPSDriverFemto(&GPS::callback, this, &_report_gps_pos, _p_report_sat_info, heading_offset); set_device_type(DRV_GPS_DEVTYPE_FEMTOMES); 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 default: @@ -953,6 +962,7 @@ GPS::run() break; 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 _mode = gps_driver_mode_t::UBX; 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: PX4_INFO("protocol: FEMTOMES"); break; + + case gps_driver_mode_t::NMEA: + PX4_INFO("protocol: NMEA"); + break; #endif // CONSTRAINED_FLASH 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('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_COMMAND_DESCR("reset", "Reset GPS device"); @@ -1319,6 +1333,9 @@ GPS *GPS::instantiate(int argc, char *argv[], Instance instance) } else if (!strcmp(myoptarg, "fem")) { mode = gps_driver_mode_t::FEMTOMES; + + } else if (!strcmp(myoptarg, "nmea")) { + mode = gps_driver_mode_t::NMEA; #endif // CONSTRAINED_FLASH } else { PX4_ERR("unknown protocol: %s", myoptarg); diff --git a/src/drivers/gps/params.c b/src/drivers/gps/params.c index eac81dea3d..ba5dd5f69b 100644 --- a/src/drivers/gps/params.c +++ b/src/drivers/gps/params.c @@ -127,6 +127,7 @@ PARAM_DEFINE_FLOAT(GPS_YAW_OFFSET, 0.f); * @value 3 Ashtech / Trimble * @value 4 Emlid Reach * @value 5 Femtomes + * @value 6 NMEA (generic) * * @reboot_required true * @group GPS @@ -148,6 +149,7 @@ PARAM_DEFINE_INT32(GPS_1_PROTOCOL, 1); * @value 3 Ashtech / Trimble * @value 4 Emlid Reach * @value 5 Femtomes + * @value 6 NMEA (generic) * * @reboot_required true * @group GPS