diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index aa51c85a..e7a9f5e5 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -98,6 +98,41 @@ static bool serialGPSFlag = false; static SFE_UBLOX_GNSS ublox_GNSS; #endif +class RAK12500LocationProvider : public LocationProvider { + long _lat = 0; + long _lng = 0; + long _alt = 0; + int _sats = 0; + long _epoch = 0; + bool _fix = false; +public: + long getLatitude() override { return _lat; } + long getLongitude() override { return _lng; } + long getAltitude() override { return _alt; } + long satellitesCount() override { return _sats; } + bool isValid() override { return _fix; } + long getTimestamp() override { return _epoch; } + void sendSentence(const char * sentence) override { } + void reset() override { } + void begin() override { } + void stop() override { } + void loop() override { + if (ublox_GNSS.getGnssFixOk(8)) { + _fix = true; + _lat = ublox_GNSS.getLatitude(2) / 10; + _lng = ublox_GNSS.getLongitude(2) / 10; + _alt = ublox_GNSS.getAltitude(2); + _sats = ublox_GNSS.getSIV(2); + } else { + _fix = false; + } + _epoch = ublox_GNSS.getUnixEpoch(2); + } + bool isEnabled() override { return true; } +}; + +static RAK12500LocationProvider RAK12500_provider; + bool EnvironmentSensorManager::begin() { #if ENV_INCLUDE_GPS #ifdef RAK_WISBLOCK_GPS @@ -521,12 +556,22 @@ bool EnvironmentSensorManager::gpsIsAwake(uint8_t ioPin){ //Try to init RAK12500 on I2C if (ublox_GNSS.begin(Wire) == true){ MESH_DEBUG_PRINTLN("RAK12500 GPS init correctly with pin %i",ioPin); - ublox_GNSS.setI2COutput(COM_TYPE_NMEA); + ublox_GNSS.setI2COutput(COM_TYPE_UBX); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_GPS); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_GALILEO); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_GLONASS); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_SBAS); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_BEIDOU); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_IMES); + ublox_GNSS.enableGNSS(true, SFE_UBLOX_GNSS_ID_QZSS); + ublox_GNSS.setMeasurementRate(1000); ublox_GNSS.saveConfigSelective(VAL_CFG_SUBSEC_IOPORT); gpsResetPin = ioPin; i2cGPSFlag = true; gps_active = true; gps_detected = true; + + _location = &RAK12500_provider; return true; } else if(Serial1){ @@ -583,14 +628,7 @@ void EnvironmentSensorManager::loop() { if (millis() > next_gps_update) { if(gps_active){ #ifdef RAK_WISBLOCK_GPS - if(i2cGPSFlag){ - node_lat = ((double)ublox_GNSS.getLatitude())/10000000.; - node_lon = ((double)ublox_GNSS.getLongitude())/10000000.; - MESH_DEBUG_PRINTLN("lat %f lon %f", node_lat, node_lon); - node_altitude = ((double)ublox_GNSS.getAltitude()) / 1000.0; - MESH_DEBUG_PRINTLN("lat %f lon %f alt %f", node_lat, node_lon, node_altitude); - } - else if (serialGPSFlag && _location->isValid()) { + if ((i2cGPSFlag || serialGPSFlag) && _location->isValid()) { node_lat = ((double)_location->getLatitude())/1000000.; node_lon = ((double)_location->getLongitude())/1000000.; MESH_DEBUG_PRINTLN("lat %f lon %f", node_lat, node_lon);