15QGCAmbientTemperature* QGCAmbientTemperature::instance()
17 return s_ambientTemperature();
20QGCAmbientTemperature::QGCAmbientTemperature(QObject* parent)
22 , _ambientTemperature(
new QAmbientTemperatureSensor(
this))
23 , _ambientTemperatureFilter(std::make_shared<QGCAmbientTemperatureFilter>())
25 connect(_ambientTemperature, &QAmbientTemperatureSensor::sensorError,
this, [](
int error) {
26 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"QAmbientTemperature error:" <<
error;
30 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Error Initializing Ambient Temperature Sensor";
33 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
36QGCAmbientTemperature::~QGCAmbientTemperature()
38 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
41bool QGCAmbientTemperature::init()
43 _ambientTemperature->addFilter(_ambientTemperatureFilter.get());
45 const bool connected = _ambientTemperature->connectToBackend();
47 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Failed to connect to ambient temperature backend";
50 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Connected to ambient temperature backend:" << _ambientTemperature->identifier();
53 if (_ambientTemperature->isFeatureSupported(QSensor::SkipDuplicates)) {
54 _ambientTemperature->setSkipDuplicates(
true);
57 const qrangelist dataRates = _ambientTemperature->availableDataRates();
58 if (!dataRates.isEmpty()) {
59 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Available Data Rates:" << dataRates;
61 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Selected Data Rate:" << _ambientTemperature->dataRate();
64 const qoutputrangelist outputRanges = _ambientTemperature->outputRanges();
65 if (!outputRanges.isEmpty()) {
68 const int outputRangeIndex = _ambientTemperature->outputRange();
69 if (outputRangeIndex < outputRanges.size()) {
70 const qoutputrange outputRange = outputRanges.at(_ambientTemperature->outputRange());
71 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Selected Output Range:" << outputRange.minimum << outputRange.maximum << outputRange.accuracy;
75 _readingChangedConnection = connect(_ambientTemperature, &QAmbientTemperatureSensor::readingChanged,
this, [
this]() {
76 QAmbientTemperatureReading* reading = _ambientTemperature->reading();
81 _temperatureC = reading->temperature();
83 emit temperatureUpdated(_temperatureC);
87 const bool started = _ambientTemperature->start();
89 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Failed to start ambient temperature";
96void QGCAmbientTemperature::quit()
99 _ambientTemperature->stop();
100 _ambientTemperature->disconnect(_readingChangedConnection);
103QGCAmbientTemperatureFilter::QGCAmbientTemperatureFilter()
104 : QAmbientTemperatureFilter()
106 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
109QGCAmbientTemperatureFilter::~QGCAmbientTemperatureFilter()
111 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
114bool QGCAmbientTemperatureFilter::filter(QAmbientTemperatureReading *reading)
120 const qreal temperature = reading->temperature();
121 return ((temperature >= s_minValidTemperatureC) && (temperature <= s_maxValidTemperatureC));
128QGCPressure* QGCPressure::instance()
133QGCPressure::QGCPressure(QObject* parent)
135 , _pressure(
new QPressureSensor(
this))
136 , _pressureFilter(std::make_shared<QGCPressureFilter>())
138 connect(_pressure, &QPressureSensor::sensorError,
this, [](
int error) {
139 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"QPressure error:" <<
error;
143 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Error Initializing Pressure Sensor";
146 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
149QGCPressure::~QGCPressure()
151 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
154bool QGCPressure::init()
156 _pressure->addFilter(_pressureFilter.get());
158 const bool connected = _pressure->connectToBackend();
160 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Failed to connect to pressure backend";
163 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Connected to pressure backend:" << _pressure->identifier();
166 if (_pressure->isFeatureSupported(QSensor::SkipDuplicates)) {
167 _pressure->setSkipDuplicates(
true);
170 const qrangelist dataRates = _pressure->availableDataRates();
171 if (!dataRates.isEmpty()) {
172 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Available Data Rates:" << dataRates;
174 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Selected Data Rate:" << _pressure->dataRate();
177 const qoutputrangelist outputRanges = _pressure->outputRanges();
178 if (!outputRanges.isEmpty()) {
181 const int outputRangeIndex = _pressure->outputRange();
182 if (outputRangeIndex < outputRanges.size()) {
183 const qoutputrange outputRange = outputRanges.at(_pressure->outputRange());
184 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Selected Output Range:" << outputRange.minimum << outputRange.maximum << outputRange.accuracy;
188 _readingChangedConnection = connect(_pressure, &QPressureSensor::readingChanged,
this, [
this]() {
189 QPressureReading* reading = _pressure->reading();
194 _temperatureC = reading->temperature();
195 _pressurePa = reading->pressure();
196 emit pressureUpdated(_pressurePa, _temperatureC);
200 const bool started = _pressure->start();
202 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Failed to start pressure";
209void QGCPressure::quit()
213 _pressure->disconnect(_readingChangedConnection);
216QGCPressureFilter::QGCPressureFilter()
219 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
222QGCPressureFilter::~QGCPressureFilter()
224 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
227bool QGCPressureFilter::filter(QPressureReading *reading)
233 const qreal temperature = reading->temperature();
234 if ((temperature < s_minValidTemperatureC) || (temperature > s_maxValidTemperatureC)) {
238 const qreal pressure = reading->pressure();
239 if ((pressure < s_minValidPressurePa) || (pressure > s_maxValidPressurePa)) {
250QGCCompass* QGCCompass::instance()
255QGCCompass::QGCCompass(QObject* parent)
257 , _compass(
new QCompass(
this))
258 , _compassFilter(std::make_shared<QGCCompassFilter>())
262 (void) connect(_compass, &QCompass::sensorError,
this, [](
int error) {
263 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Compass error:" <<
error;
267 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Error Initializing Compass Sensor";
271QGCCompass::~QGCCompass()
276bool QGCCompass::init()
278 _compass->addFilter(_compassFilter.get());
280 const bool connected = _compass->connectToBackend();
282 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Failed to connect to compass backend";
285 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Connected to compass backend:" << _compass->identifier();
288 if (_compass->isFeatureSupported(QSensor::SkipDuplicates)) {
289 _compass->setSkipDuplicates(
true);
292 const qrangelist dataRates = _compass->availableDataRates();
293 if (!dataRates.isEmpty()) {
294 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Available Data Rates:" << dataRates;
296 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Selected Data Rate:" << _compass->dataRate();
299 const qoutputrangelist outputRanges = _compass->outputRanges();
300 if (!outputRanges.isEmpty()) {
303 const int outputRangeIndex = _compass->outputRange();
304 if (outputRangeIndex < outputRanges.size()) {
305 const qoutputrange outputRange = outputRanges.at(_compass->outputRange());
306 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Selected Output Range:" << outputRange.minimum << outputRange.maximum << outputRange.accuracy;
310 _readingChangedConnection = connect(_compass, &QCompass::readingChanged,
this, [
this]() {
311 QCompassReading*
const reading = _compass->reading();
316 _calibrationLevel = reading->calibrationLevel();
317 _azimuth = reading->azimuth();
319 emit compassUpdated(_azimuth);
321 QGeoPositionInfo update;
322 update.setAttribute(QGeoPositionInfo::Attribute::Direction, _azimuth);
323 update.setAttribute(QGeoPositionInfo::Attribute::DirectionAccuracy, _calibrationLevel);
324 update.setTimestamp(QDateTime::currentDateTimeUtc());
325 emit positionUpdated(update);
329 const bool started = _compass->start();
331 qCWarning(QGCDeviceInfoLog) << Q_FUNC_INFO <<
"Failed to start compass";
338void QGCCompass::quit()
342 _compass->disconnect(_readingChangedConnection);
345QGCCompassFilter::QGCCompassFilter()
348 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
351QGCCompassFilter::~QGCCompassFilter()
353 qCDebug(QGCDeviceInfoLog) << Q_FUNC_INFO <<
this;
356bool QGCCompassFilter::filter(QCompassReading *reading)
362 const qreal calibration = reading->calibrationLevel();
363 return (calibration >= s_minCompassCalibrationLevel);