Device Configuration

SitePoint GPS devices support multiple operational modes and configuration options to meet different positioning requirements.

This chapter explains device modes, how to select the appropriate mode for your use case, and how to configure device settings.

Device Modes Overview

The GPS receiver can operate in five distinct modes, each optimized for specific use cases:

Mode

Accuracy

Description

DEVICE_MODE_ROVER

~2 meters

Standard rover without corrections. Uses autonomous GPS positioning.

DEVICE_MODE_ROVER_NTRIP

~2 cm

Rover with NTRIP corrections via BLE. Corrections streamed from host application.

DEVICE_MODE_ROVER_NEAREST

~2 cm

Rover with Tripod network corrections. Device connects to nearest base via radio.

DEVICE_MODE_FIXED_BASE

N/A

Fixed base station. Transmits corrections to rovers via radio.

DEVICE_MODE_FIXED_BASE_BROADCAST

N/A

Fixed base with wider broadcast range. Higher power consumption.

Mode Selection Guidelines

DEVICE_MODE_ROVER

Use When:

  • No RTK corrections are available

  • Accuracy requirements are 2-10 meters

  • Testing GPS functionality without correction infrastructure

  • Operating in areas without NTRIP or Tripod coverage

Characteristics:

  • Lowest power consumption

  • No external correction data required

  • Position updates at 8-10 Hz

  • Solution type: Autonomous GPS (type 1)

Code Example:

bleManager->sendModeChangeCommand(DEVICE_MODE_ROVER);

DEVICE_MODE_ROVER_NTRIP

Use When:

  • Internet connection is available (WiFi, cellular)

  • NTRIP caster account is available

  • Host application can stream corrections via BLE

  • Operating in areas without Tripod coverage

  • Centimeter-level accuracy is required

Characteristics:

  • Host application must stream RTCM corrections

  • Requires active NTRIP connection

  • Position accuracy: 1-5 cm (RTK fixed)

  • Correction latency: network-dependent (50-500 ms typical)

Prerequisites:

  1. NTRIP caster account (host, port, mountpoint, credentials)

  2. NTRIPManager configured and connected

  3. RTCM messages queued to BLEManager

Complete Setup Example:

// Step 1: Connect to device
bleManager->connectToDevice("12:34:56:78:9A:BC");

// Step 2: Wait for connection
connect(bleManager, &BLEManager::deviceConnected, [=]() {

    // Step 3: Set device to NTRIP rover mode
    bleManager->sendModeChangeCommand(DEVICE_MODE_ROVER_NTRIP);

    // Step 4: Connect to NTRIP caster
    ntripManager->connectToNtrip("rtk.example.com", 2101,
                                 "RTCM3", "user", "pass");
});

// Step 5: Stream corrections to device
connect(ntripManager, &NTRIPManager::rtcmDataReceived,
    [=](const QByteArray &rtcmData) {
        bleManager->queueRTCMMessage(rtcmData);
    });

DEVICE_MODE_ROVER_NEAREST

Use When:

  • Operating within Tripod network coverage

  • No internet connection is available

  • Host application does not need to manage corrections

  • Centimeter-level accuracy is required

Characteristics:

  • Device automatically connects to nearest Tripod base station

  • No NTRIP configuration required in host application

  • Position accuracy: 1-5 cm (RTK fixed)

  • Correction latency: <100 ms typical (radio link)

Code Example:

// Device handles correction reception automatically
bleManager->sendModeChangeCommand(DEVICE_MODE_ROVER_NEAREST);

// Monitor correction status
connect(bleManager, &BLEManager::statusDataChanged, [=]() {
    SqspStatus_t status = bleManager->getStatusData();

    if (status.aidingBins & (1 << 4)) {
        qDebug() << "Receiving Tripod corrections";
        qDebug() << "Correction age:" << status.correctionAge << "ms";
    }
});

DEVICE_MODE_FIXED_BASE

Use When:

  • Establishing a local RTK base station

  • Providing corrections to nearby rovers via Tripod radio

  • Operating in areas without NTRIP coverage

  • Baseline distances < 10 km to rovers

Characteristics:

  • Device position must be surveyed or manually entered

  • Transmits RTCM corrections via radio

  • Supports multiple rovers simultaneously

  • Normal transmit power (10-15 km range typical)

Setup Process:

  1. Place device at known location or survey position

  2. Set device to fixed base mode

  3. Configure base position (if known) or use survey mode

  4. Device begins transmitting corrections

Survey Mode Example:

// Set to fixed base mode with auto-survey
bleManager->sendModeChangeCommand(DEVICE_MODE_FIXED_BASE);

// Monitor survey progress
connect(bleManager, &BLEManager::configDataChanged, [=]() {
    SqspLbConfig_t config = bleManager->getConfigData();

    qDebug() << "Survey duration:" << config.duration << "seconds";
    qDebug() << "Base position:";
    qDebug() << "  Lat:" << config.latitude;
    qDebug() << "  Lon:" << config.longitude;
    qDebug() << "  Height:" << config.hMSL << "m";

    // Survey typically runs 60-180 seconds
    // Longer survey = better base position accuracy
});

DEVICE_MODE_FIXED_BASE_BROADCAST

Use When:

  • Extended range is required (up to 20-30 km)

  • Base station has reliable power source

  • Covering large survey areas

  • Operating in challenging RF environments

Characteristics:

  • Higher transmit power than standard fixed base

  • Increased power consumption (~2x standard base)

  • Extended range: 20-30 km typical (vs 10-15 km)

  • Same setup process as DEVICE_MODE_FIXED_BASE

Code Example:

// Use broadcast mode for extended range
bleManager->sendModeChangeCommand(DEVICE_MODE_FIXED_BASE_BROADCAST);

Mode Comparison

Mode

Accuracy

Corrections

Power

Use Case

ROVER

2-10 m

None

Low

Basic positioning

ROVER_NTRIP

1-5 cm

Via BLE

Medium

Internet available

ROVER_NEAREST

1-5 cm

Via radio

Medium

Tripod coverage

FIXED_BASE

N/A

Transmits

High

Local base station

FIXED_BASE_BROADCAST

N/A

Transmits

Very High

Extended range base

Configuration Data

The device configuration is accessed via the SqspLbConfig_t structure, which contains base station position and survey information.

Reading Configuration

connect(bleManager, &BLEManager::configDataChanged, [=]() {
    SqspLbConfig_t config = bleManager->getConfigData();

    // Base station position (double precision)
    qDebug() << "Latitude:" << config.latitude << "degrees";
    qDebug() << "Longitude:" << config.longitude << "degrees";
    qDebug() << "Height (WGS84):" << config.height << "m";
    qDebug() << "Height (MSL):" << config.hMSL << "m";

    // Survey information
    qDebug() << "Survey duration:" << config.duration << "seconds";
});

Configuration Fields

Field

Type

Description

latitude

double

Base station latitude in degrees (-90 to +90)

longitude

double

Base station longitude in degrees (-180 to +180)

height

double

Height above WGS84 ellipsoid in meters

hMSL

double

Height above mean sea level in meters

duration

int32_t

Survey duration in seconds (if auto-surveyed)

Survey Duration Guidelines

When using auto-survey mode for base stations, the survey duration affects the accuracy of the determined base position:

Duration

Base Position Accuracy

Recommended Use

60 seconds

~10 cm

Quick setup, short sessions

180 seconds

~5 cm

Standard surveying

300+ seconds

~2-3 cm

High-accuracy applications

600+ seconds

~1-2 cm

Permanent base stations

Important: The base station position accuracy directly affects rover positioning accuracy. A 10 cm error in base position causes a 10 cm error in rover position.

Mode Change Timing

Understanding when mode changes take effect is important for application logic.

Mode Change Sequence

When sendModeChangeCommand() is called:

  1. Command is packaged as SQTP frame

  2. Frame is written to characteristic 0x0105

  3. Device processes command (typically < 100 ms)

  4. Device resets GPS engine and reconfigures

  5. Device begins operating in new mode

  6. Configuration data may be updated (triggers configDataChanged())

Total time: Typically 1-3 seconds for complete mode change

Monitoring Mode Changes:

bleManager->sendModeChangeCommand(DEVICE_MODE_ROVER_NTRIP);

// Wait for device to settle in new mode
QTimer::singleShot(3000, [=]() {
    qDebug() << "Device should be in new mode";

    // Check status to verify corrections are active
    SqspStatus_t status = bleManager->getStatusData();
    if (status.aidingBins & (1 << 4)) {
        qDebug() << "RTCM corrections confirmed active";
    }
});

Best Practices

Mode Selection Strategy

  1. Start with DEVICE_MODE_ROVER for initial testing

  2. Verify basic GPS reception before attempting RTK

  3. Ensure good satellite visibility (minimum 8 satellites)

  4. Check HDOP < 2.0 before expecting RTK fix

  5. Monitor correction age (should be < 30 seconds for RTK)

Power Management

Mode

Power Consumption (approximate)

ROVER

150-200 mA (baseline)

ROVER_NTRIP

200-250 mA (+BLE data transfer)

ROVER_NEAREST

250-300 mA (+radio reception)

FIXED_BASE

350-450 mA (+radio transmission)

FIXED_BASE_BROADCAST

600-800 mA (+high-power transmission)

Battery Life Considerations:

  • Rover modes: 8-12 hours typical (2000 mAh battery)

  • Base modes: 3-6 hours typical (2000 mAh battery)

  • Broadcast mode: 2-3 hours typical (2000 mAh battery)

Baseline Distance

The distance between base station and rover affects positioning accuracy:

Baseline Distance

Expected Accuracy

Fix Acquisition Time

< 5 km

1-2 cm

10-30 seconds

5-10 km

2-3 cm

30-60 seconds

10-20 km

3-5 cm

60-120 seconds

20-30 km

5-10 cm

120-180 seconds

> 30 km

Degraded

May not achieve RTK fix

Recommendation: Keep baseline distances < 10 km for optimal performance.

Troubleshooting

No RTK Fix

Symptoms: Device remains in GPS mode (solution type 1) instead of RTK

Possible Causes:

  1. No corrections received

    • Check correctionAge in status data

    • Verify NTRIP connection is active

    • Verify RTCM messages are being queued

  2. Corrections too old

    • Check network latency

    • Verify NTRIP caster is sending data

    • Check for RTCM queue overflow

  3. Poor satellite visibility

    • Check numSatellites (minimum 8 required)

    • Check HDOP (should be < 2.0)

    • Ensure clear view of sky

  4. Baseline too long

    • Check distance to base station

    • Consider using closer base or network service

Debugging Example:

connect(bleManager, &BLEManager::statusDataChanged, [=]() {
    SqspStatus_t status = bleManager->getStatusData();
    SqspLla_t lla = bleManager->getLlaData();

    qDebug() << "Solution type:" << lla.solutionType;
    qDebug() << "Satellites:" << status.numSatellites;
    qDebug() << "HDOP:" << status.hdop;
    qDebug() << "Correction age:" << status.correctionAge << "ms";
    qDebug() << "RTCM active:" << (status.aidingBins & (1 << 4) ? "YES" : "NO");

    // RTK fix troubleshooting
    if (lla.solutionType != 4) {  // Not RTK fixed
        if (!(status.aidingBins & (1 << 4))) {
            qWarning() << "No RTCM corrections detected";
        } else if (status.correctionAge > 30000) {
            qWarning() << "Corrections too old";
        } else if (status.numSatellites < 8) {
            qWarning() << "Insufficient satellites";
        } else if (status.hdop > 2.0) {
            qWarning() << "Poor satellite geometry";
        }
    }
});

Frequent Mode Changes

Symptoms: Application changes modes frequently or unexpectedly

Possible Causes:

  1. Multiple mode change commands sent

    • Ensure only one mode change per user action

    • Add debouncing to UI controls

  2. Mode change during initialization

    • Wait for deviceConnected() signal before sending mode change

    • Delay mode change 1-2 seconds after connection

Prevention Example:

bool modeChangeInProgress = false;

void setDeviceMode(int newMode)
{
    if (modeChangeInProgress) {
        qWarning() << "Mode change already in progress";
        return;
    }

    modeChangeInProgress = true;
    bleManager->sendModeChangeCommand(newMode);

    // Clear flag after mode change settles
    QTimer::singleShot(3000, [=]() {
        modeChangeInProgress = false;
    });
}

Next Steps