26 QVariant operator()(
Fact* fact)
32 const QList<Fact*>& facts()
const {
return _facts; }
40 CorrectionsConfig configuration;
41 const int source =
read(settings->correctionSource()).toInt();
45 qCWarning(GPSSettingsBindingsLog) <<
"Invalid correction source; using automatic selection";
47 configuration.udpInput.enabled =
read(settings->rtcmUdpInputEnabled()).toBool();
48 configuration.udpInput.port =
read(settings->rtcmUdpInputPort()).value<quint16>();
49 configuration.udpOutput.enabled =
read(settings->rtcmUdpOutputEnabled()).toBool();
50 configuration.udpOutput.address =
read(settings->rtcmUdpOutputAddress()).toString().trimmed();
51 configuration.udpOutput.port =
read(settings->rtcmUdpOutputPort()).value<quint16>();
55NTRIPConfig ntripFromSettings(
NTRIPSettings* settings, FactReader& read)
57 NTRIPConfig configuration;
58 configuration.enabled =
read(settings->ntripServerConnectEnabled()).toBool();
60 connection.
host =
read(settings->ntripServerHostAddress()).toString();
61 connection.
port =
read(settings->ntripServerPort()).toInt();
62 connection.
username =
read(settings->ntripUsername()).toString();
63 connection.
password =
read(settings->ntripPassword()).toString();
64 connection.
mountpoint =
read(settings->ntripMountpoint()).toString();
65 connection.
useTls =
read(settings->ntripUseTls()).toBool();
68 configuration.filter.whitelist =
read(settings->ntripWhitelist()).toString();
69 configuration.gga.source =
71 configuration.gga.interval = std::chrono::seconds(
read(settings->ntripGgaIntervalSec()).toUInt());
79 const auto mode =
static_cast<Mode
>(
read(settings->useFixedBasePosition()).toInt());
82 .longitudeDegrees =
read(settings->fixedBasePositionLongitude()).toDouble(),
83 .altitudeMeters =
read(settings->fixedBasePositionAltitude()).toDouble()},
84 .accuracyMeters =
read(settings->fixedBasePositionAccuracy()).toFloat()};
86 .accuracyMeters =
read(settings->surveyInAccuracyLimit()).toDouble(),
87 .duration = std::chrono::seconds(
read(settings->surveyInMinObservationDuration()).value<int64_t>())};
89 .
maximumDuration = std::chrono::seconds(
read(settings->receiverAveragingDuration()).value<uint32_t>())};
96 case Mode::BaseReceiverAveraging:
97 base.mode = averaging;
99 case Mode::BaseSurveyIn:
103 qCWarning(GPSSettingsBindingsLog) <<
"Invalid base mode; using survey-in";
110ReceiverConfig receiverFromSettings(
RTKSettings* settings, FactReader& read)
112 ReceiverConfig configuration;
114 configuration.forwardReceiverRtcm =
read(settings->forwardReceiverRtcm()).toBool();
115 configuration.baseReceiverManufacturer =
read(settings->baseReceiverManufacturers()).toInt();
117 configuration.tcpHost =
read(settings->tcpHost()).toString();
118 configuration.tcpPort =
read(settings->tcpPort()).toUInt();
119 configuration.udpPort =
read(settings->udpPort()).toUInt();
120 configuration.serialDevice =
read(settings->serialDevice()).toString();
121 configuration.serialBaudRate =
read(settings->serialBaudRate()).toUInt();
122 configuration.base = baseStationFromSettings(settings, read);
123 configuration.autoConnect =
read(settings->autoConnect()).toBool();
124 return configuration;
127PositionConfig positionFromSettings(
RTKSettings* settings, FactReader& read)
133bool redacted(
const Fact* fact)
135 static const QSet<QString> names{
136 QString::fromLatin1(NTRIPSettings::ntripPasswordName),
137 QString::fromLatin1(RTKSettings::fixedBasePositionLatitudeName),
138 QString::fromLatin1(RTKSettings::fixedBasePositionLongitudeName),
139 QString::fromLatin1(RTKSettings::fixedBasePositionAltitudeName),
141 return names.contains(fact->
name());
144void logSetting(
const Fact* fact)
146 const QString value = fact->
rawValue().toString();
147 const QString shown =
148 !redacted(fact) ? value : (value.isEmpty() ? QStringLiteral(
"<empty>") : QStringLiteral(
"<set>"));
149 qCDebug(GPSSettingsBindingsLog).noquote() << fact->
name() <<
"=" << shown;
152template <
typename Settings,
typename Configuration>
153QList<Fact*> readFacts(Settings* settings, Configuration (*build)(Settings*, FactReader&))
156 (void) build(settings, reader);
157 return reader.facts();
161template <
typename Settings,
typename Configuration,
typename Target>
162void bind(Settings* settings, Configuration (*build)(Settings*, FactReader&), Target* target,
163 void (Target::*setter)(const Configuration&))
165 const auto apply = [settings, build, target, setter]() {
167 (target->*setter)(build(settings, reader));
168 return reader.facts();
170 for (
Fact*
const fact : apply()) {
183 return readFacts(settings, correctionsFromSettings);
186QList<Fact*> GPSSettingsBindings::_boundFacts(
NTRIPSettings* settings)
188 return readFacts(settings, ntripFromSettings);
191QList<Fact*> GPSSettingsBindings::_boundFacts(
RTKSettings* settings)
193 return readFacts(settings, receiverFromSettings) + readFacts(settings, positionFromSettings);
198 if (!settings || !corrections) {
206 if (!settings || !ntrip) {
213 [settings]() { settings->ntripServerConnectEnabled()->setRawValue(
true); }, Qt::QueuedConnection);
216 [settings](
const QString& pin) { settings->ntripPinnedCertificate()->setRawValue(pin); }, Qt::QueuedConnection);
222 if (!settings || !receiver) {
230 if (!settings || !positions) {
constexpr int GPS_CORRECTION_SOURCE_COUNT
#define QGC_LOGGING_CATEGORY(name, categoryStr)
A Fact is used to hold a single value within the system.
void rawValueChanged(const QVariant &value)
QVariant rawValue() const
void setConfiguration(const Configuration &configuration)
Applies the parts that changed; ignored after shutdown().
CorrectionSource
Persisted values of correctionSource. The storage type keeps any saved value a valid enum value.
GPSReceiverConfiguration Configuration
void setConfiguration(const Configuration &configuration)
static void bindReceiver(RTKSettings *settings, GPSReceiver *receiver)
static void bindPosition(RTKSettings *settings, PositionManager *positions)
static void bindCorrections(GPSCorrectionSettings *settings, GPSCorrectionManager *corrections)
Applies the correction settings to corrections now and whenever they change.
static void bindNtrip(NTRIPSettings *settings, NTRIPManager *ntrip)
void setConfiguration(const Configuration &configuration)
void certificatePinChanged(const QString &pin)
The trusted self-signed caster certificate changed, or was forgotten (empty); the settings should sto...
void enableRequested()
Retrying after an error turns the saved connection on.
void setConfiguration(const Configuration &configuration)
Ignored after shutdown().
SourceMode
Values of RTKSettings::gcsPositionSource.
ConnectionType
Persisted values of connectionType. The storage type keeps any saved value a valid enum value.
ReceiverRole
Persisted values of receiverRole. The storage type keeps any saved value a valid enum value.
QByteArray read(int deviceId, int length, int timeout)
GPSCommandSequence base(QByteArrayView port, const GPSBaseStationConfig &base)
Streams RTCM3 corrections and the PVTGeodetic survey status over port in the mode base selects.
ValsetBatch surveyIn(const GPSBaseStationConfig::SurveyIn &survey)
GPSEllipsoidPosition position
std::chrono::seconds maximumDuration
Maximum receiver-managed time, not a minimum duration or an accuracy guarantee.
Configuration used only by the RTK base-station role.
The correction settings as values; the application's settings binding supplies them.
bool allowSelfSignedCerts
QString pinnedCertificate
"host:port|sha256-hex" of the self-signed certificate trusted on first use; other endpoints ignore it...
The NTRIP settings as values; the application's settings binding supplies them.