summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/socketcan/libsocketcan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/canbus/socketcan/libsocketcan.cpp')
-rw-r--r--src/plugins/canbus/socketcan/libsocketcan.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/plugins/canbus/socketcan/libsocketcan.cpp b/src/plugins/canbus/socketcan/libsocketcan.cpp
index ca63391..c6144db 100644
--- a/src/plugins/canbus/socketcan/libsocketcan.cpp
+++ b/src/plugins/canbus/socketcan/libsocketcan.cpp
@@ -66,11 +66,22 @@ struct can_bittiming {
quint32 brp = 0; /* Bit-rate prescaler */
};
+enum can_state {
+ CAN_STATE_ERROR_ACTIVE = 0, /* RX/TX error count < 96 */
+ CAN_STATE_ERROR_WARNING, /* RX/TX error count < 128 */
+ CAN_STATE_ERROR_PASSIVE, /* RX/TX error count < 256 */
+ CAN_STATE_BUS_OFF, /* RX/TX error count >= 256 */
+ CAN_STATE_STOPPED, /* Device is stopped */
+ CAN_STATE_SLEEPING, /* Device is sleeping */
+ CAN_STATE_MAX
+};
+
GENERATE_SYMBOL(int, can_do_restart, const char * /* name */)
GENERATE_SYMBOL(int, can_do_stop, const char * /* name */)
GENERATE_SYMBOL(int, can_do_start, const char * /* name */)
GENERATE_SYMBOL(int, can_set_bitrate, const char * /* name */, quint32 /* bitrate */)
GENERATE_SYMBOL(int, can_get_bittiming, const char * /* name */, struct can_bittiming * /* bt */)
+GENERATE_SYMBOL(int, can_get_state, const char * /* name */, int * /* state */)
LibSocketCan::LibSocketCan(QString *errorString)
{
@@ -87,6 +98,7 @@ LibSocketCan::LibSocketCan(QString *errorString)
RESOLVE_SYMBOL(can_do_restart);
RESOLVE_SYMBOL(can_set_bitrate);
RESOLVE_SYMBOL(can_get_bittiming);
+ RESOLVE_SYMBOL(can_get_state);
return true;
};
@@ -190,4 +202,37 @@ bool LibSocketCan::setBitrate(const QString &interface, quint32 bitrate)
return ::can_set_bitrate(interface.toLatin1().constData(), bitrate) == 0;
}
+bool LibSocketCan::hasBusStatus() const
+{
+ return ::can_get_state != nullptr;
+}
+
+QCanBusDevice::CanBusStatus LibSocketCan::busStatus(const QString &interface) const
+{
+ if (!::can_get_state) {
+ qCWarning(QT_CANBUS_PLUGINS_SOCKETCAN, "Function can_get_state() is not available.");
+ return QCanBusDevice::CanBusStatus::Unknown;
+ }
+
+ int status = 0;
+ int result = ::can_get_state(interface.toLatin1().constData(), &status);
+
+ if (result < 0)
+ return QCanBusDevice::CanBusStatus::Unknown;
+
+ switch (status) {
+ case CAN_STATE_ERROR_ACTIVE:
+ return QCanBusDevice::CanBusStatus::Good;
+ case CAN_STATE_ERROR_WARNING:
+ return QCanBusDevice::CanBusStatus::Warning;
+ case CAN_STATE_ERROR_PASSIVE:
+ return QCanBusDevice::CanBusStatus::Error;
+ case CAN_STATE_BUS_OFF:
+ return QCanBusDevice::CanBusStatus::BusOff;
+ default:
+ // Device is stopped or sleeping, so status is unknown
+ return QCanBusDevice::CanBusStatus::Unknown;
+ }
+}
+
QT_END_NAMESPACE