Skip to content

Commit 56e33a9

Browse files
committedApr 1, 2023
[sensors] Add sensor error reporting capability
1 parent 732c1e1 commit 56e33a9

File tree

8 files changed

+134
-2
lines changed

8 files changed

+134
-2
lines changed
 

‎python/core/auto_generated/sensor/qgsabstractsensor.sip.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ Returns the latest captured data from the sensor.
114114
void setData( const QgsAbstractSensor::SensorData &data );
115115
%Docstring
116116
Sets the latest captured data from the sensor.
117+
%End
118+
119+
QString errorString() const;
120+
%Docstring
121+
Returns the last error message.
117122
%End
118123

119124
bool writeXml( QDomElement &parentElement, QDomDocument &document ) const;
@@ -163,6 +168,11 @@ Emitted when the sensor status has changed.
163168
void dataChanged();
164169
%Docstring
165170
Emitted when the captured sensor data has changed.
171+
%End
172+
173+
void errorOccurred( const QString &errorString );
174+
%Docstring
175+
Emitted when an error has occurred. The ``errorString`` describes the error.
166176
%End
167177

168178
protected:

‎python/core/auto_generated/sensor/qgssensormanager.sip.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ Emitted when a sensor status has changed.
131131
void sensorDataCaptured( const QString &id );
132132
%Docstring
133133
Emitted when newly captured data from a sensor has occurred.
134+
%End
135+
136+
void sensorErrorOccurred( const QString &id );
137+
%Docstring
138+
Emitted when a sensor error has occurred.
134139
%End
135140

136141
};

‎src/core/sensor/qgsabstractsensor.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ void QgsAbstractSensor::setData( const QgsAbstractSensor::SensorData &data )
6363
emit dataChanged();
6464
}
6565

66+
QString QgsAbstractSensor::errorString() const
67+
{
68+
return mErrorString;
69+
}
70+
6671
void QgsAbstractSensor::connectSensor()
6772
{
6873
setStatus( Qgis::DeviceConnectionStatus::Connecting );

‎src/core/sensor/qgsabstractsensor.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ class CORE_EXPORT QgsAbstractSensor : public QObject
143143
*/
144144
void setData( const QgsAbstractSensor::SensorData &data );
145145

146+
/**
147+
* Returns the last error message.
148+
*/
149+
QString errorString() const;
150+
146151
/**
147152
* Write generic sensor properties into a DOM element.
148153
* \param parentElement parent DOM element (e.g 'Sensors' element)
@@ -182,6 +187,9 @@ class CORE_EXPORT QgsAbstractSensor : public QObject
182187
//! Emitted when the captured sensor data has changed.
183188
void dataChanged();
184189

190+
//! Emitted when an error has occurred. The \a errorString describes the error.
191+
void errorOccurred( const QString &errorString );
192+
185193
protected:
186194

187195
/**
@@ -197,6 +205,7 @@ class CORE_EXPORT QgsAbstractSensor : public QObject
197205
virtual void handleDisconnect() = 0;
198206

199207
QgsAbstractSensor::SensorData mData;
208+
QString mErrorString;
200209

201210
private:
202211

‎src/core/sensor/qgsiodevicesensor.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ QgsTcpSocketSensor::QgsTcpSocketSensor( QObject *parent )
5757
, mTcpSocket( new QTcpSocket() )
5858
{
5959
connect( mTcpSocket, &QAbstractSocket::stateChanged, this, &QgsTcpSocketSensor::socketStateChanged );
60+
61+
#if QT_VERSION < QT_VERSION_CHECK( 5, 15, 0 )
62+
connect( mTcpSocket, qOverload<QAbstractSocket::SocketError>( &QAbstractSocket::error ), this, &QgsTcpSocketSensor::handleError );
63+
#else
64+
connect( mTcpSocket, qOverload<QAbstractSocket::SocketError>( &QAbstractSocket::errorOccurred ), this, &QgsTcpSocketSensor::handleError );
65+
#endif
66+
6067
initIODevice( mTcpSocket );
6168
}
6269

@@ -112,6 +119,27 @@ void QgsTcpSocketSensor::handleDisconnect()
112119
mTcpSocket->close();
113120
}
114121

122+
void QgsTcpSocketSensor::handleError( QAbstractSocket::SocketError error )
123+
{
124+
switch ( error )
125+
{
126+
case QAbstractSocket::HostNotFoundError:
127+
mErrorString = tr( "Could not find the remote host" );
128+
break;
129+
case QAbstractSocket::NetworkError:
130+
mErrorString = tr( "Attempt to read or write from socket returned an error" );
131+
break;
132+
case QAbstractSocket::ConnectionRefusedError:
133+
mErrorString = tr( "The connection was refused by the remote host" );
134+
break;
135+
default:
136+
mErrorString = tr( "%1" ).arg( QMetaEnum::fromType<QAbstractSocket::SocketError>().valueToKey( error ) );
137+
break;
138+
}
139+
140+
emit errorOccurred( mErrorString );
141+
}
142+
115143
void QgsTcpSocketSensor::socketStateChanged( const QAbstractSocket::SocketState socketState )
116144
{
117145
switch ( socketState )
@@ -178,6 +206,12 @@ QgsUdpSocketSensor::QgsUdpSocketSensor( QObject *parent )
178206
}
179207
} );
180208

209+
#if QT_VERSION < QT_VERSION_CHECK( 5, 15, 0 )
210+
connect( mUdpSocket.get(), qOverload<QAbstractSocket::SocketError>( &QAbstractSocket::error ), this, &QgsUdpSocketSensor::handleError );
211+
#else
212+
connect( mUdpSocket.get(), qOverload<QAbstractSocket::SocketError>( &QAbstractSocket::errorOccurred ), this, &QgsUdpSocketSensor::handleError );
213+
#endif
214+
181215
initIODevice( mBuffer );
182216
}
183217

@@ -236,6 +270,27 @@ void QgsUdpSocketSensor::handleDisconnect()
236270
mBuffer->close();
237271
}
238272

273+
void QgsUdpSocketSensor::handleError( QAbstractSocket::SocketError error )
274+
{
275+
switch ( error )
276+
{
277+
case QAbstractSocket::HostNotFoundError:
278+
mErrorString = tr( "Could not find the remote host" );
279+
break;
280+
case QAbstractSocket::NetworkError:
281+
mErrorString = tr( "Attempt to read or write from socket returned an error" );
282+
break;
283+
case QAbstractSocket::ConnectionRefusedError:
284+
mErrorString = tr( "The connection was refused by the remote host" );
285+
break;
286+
default:
287+
mErrorString = tr( "%1" ).arg( QMetaEnum::fromType<QAbstractSocket::SocketError>().valueToKey( error ) );
288+
break;
289+
}
290+
291+
emit errorOccurred( mErrorString );
292+
}
293+
239294
void QgsUdpSocketSensor::socketStateChanged( const QAbstractSocket::SocketState socketState )
240295
{
241296
switch ( socketState )
@@ -279,6 +334,8 @@ QgsSerialPortSensor::QgsSerialPortSensor( QObject *parent )
279334
: QgsIODeviceSensor( parent )
280335
, mSerialPort( new QSerialPort() )
281336
{
337+
connect( mSerialPort, qOverload<QSerialPort::SerialPortError>( &QSerialPort::errorOccurred ), this, &QgsSerialPortSensor::handleError );
338+
282339
initIODevice( mSerialPort );
283340
}
284341

@@ -324,6 +381,32 @@ void QgsSerialPortSensor::handleDisconnect()
324381
mSerialPort->close();
325382
}
326383

384+
void QgsSerialPortSensor::handleError( QSerialPort::SerialPortError error )
385+
{
386+
if ( error == QSerialPort::NoError )
387+
{
388+
return;
389+
}
390+
391+
switch ( error )
392+
{
393+
case QSerialPort::DeviceNotFoundError:
394+
mErrorString = tr( "Could not find the serial port device" );
395+
break;
396+
case QSerialPort::ReadError:
397+
mErrorString = tr( "Attempt to read from the serial port returned an error" );
398+
break;
399+
case QSerialPort::PermissionError:
400+
mErrorString = tr( "The connection was refused due to not having enough permission" );
401+
break;
402+
default:
403+
mErrorString = tr( "%1" ).arg( QMetaEnum::fromType<QSerialPort::SerialPortError>().valueToKey( error ) );
404+
break;
405+
}
406+
407+
emit errorOccurred( mErrorString );
408+
}
409+
327410
bool QgsSerialPortSensor::writePropertiesToElement( QDomElement &element, QDomDocument & ) const
328411
{
329412
element.setAttribute( QStringLiteral( "portName" ), mPortName );

‎src/core/sensor/qgsiodevicesensor.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ class CORE_EXPORT QgsTcpSocketSensor : public QgsIODeviceSensor
135135

136136
private slots:
137137

138-
virtual void socketStateChanged( const QAbstractSocket::SocketState socketState );
138+
void socketStateChanged( const QAbstractSocket::SocketState socketState );
139+
void handleError( QAbstractSocket::SocketError error );
139140

140141
private:
141142

@@ -205,7 +206,8 @@ class CORE_EXPORT QgsUdpSocketSensor : public QgsIODeviceSensor
205206

206207
private slots:
207208

208-
virtual void socketStateChanged( const QAbstractSocket::SocketState socketState );
209+
void socketStateChanged( const QAbstractSocket::SocketState socketState );
210+
void handleError( QAbstractSocket::SocketError error );
209211

210212
private:
211213

@@ -266,6 +268,10 @@ class CORE_EXPORT QgsSerialPortSensor : public QgsIODeviceSensor
266268
void handleConnect() override;
267269
void handleDisconnect() override;
268270

271+
private slots:
272+
273+
void handleError( QSerialPort::SerialPortError error );
274+
269275
private:
270276

271277
QSerialPort *mSerialPort = nullptr;

‎src/core/sensor/qgssensormanager.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ void QgsSensorManager::addSensor( QgsAbstractSensor *sensor )
8888
connect( sensor, &QgsAbstractSensor::nameChanged, this, &QgsSensorManager::handleSensorNameChanged );
8989
connect( sensor, &QgsAbstractSensor::statusChanged, this, &QgsSensorManager::handleSensorStatusChanged );
9090
connect( sensor, &QgsAbstractSensor::dataChanged, this, &QgsSensorManager::captureSensorData );
91+
connect( sensor, &QgsAbstractSensor::errorOccurred, this, &QgsSensorManager::handleSensorErrorOccurred );
9192
mSensors << sensor;
9293

9394
emit sensorAdded( sensor->id() );
@@ -147,6 +148,15 @@ void QgsSensorManager::captureSensorData()
147148
emit sensorDataCaptured( sensor->id() );
148149
}
149150

151+
void QgsSensorManager::handleSensorErrorOccurred( const QString & )
152+
{
153+
const QgsAbstractSensor *sensor = qobject_cast<QgsAbstractSensor *>( sender() );
154+
if ( !sensor )
155+
return;
156+
157+
emit sensorErrorOccurred( sensor->id() );
158+
}
159+
150160
bool QgsSensorManager::readXml( const QDomElement &element, const QDomDocument &document )
151161
{
152162
clear();

‎src/core/sensor/qgssensormanager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,15 @@ class CORE_EXPORT QgsSensorManager : public QObject
131131
//! Emitted when newly captured data from a sensor has occurred.
132132
void sensorDataCaptured( const QString &id );
133133

134+
//! Emitted when a sensor error has occurred.
135+
void sensorErrorOccurred( const QString &id );
136+
134137
private slots:
135138

136139
void handleSensorNameChanged();
137140
void handleSensorStatusChanged();
138141
void captureSensorData();
142+
void handleSensorErrorOccurred( const QString &errorMessage );
139143

140144
private:
141145

0 commit comments

Comments
 (0)
Please sign in to comment.