1616
1717#include < QsLog.h>
1818
19+ static const int maxEventDelay = 1000 ;
20+
1921using namespace trikControl ;
2022
2123VectorSensorWorker::VectorSensorWorker (const QString &eventFile, DeviceState &state
2224 , const trikHal::HardwareAbstractionInterface &hardwareAbstraction)
2325 : mEventFile(hardwareAbstraction.createEventFile(eventFile))
2426 , mState(state)
2527{
28+ mState .start ();
29+
2630 mReading << 0 << 0 << 0 ;
2731 mReadingUnsynced = mReading ;
2832
29- mState .start ();
33+ mLastEventTimer .setInterval (maxEventDelay);
34+ mLastEventTimer .setSingleShot (false );
3035
3136 connect (mEventFile .data (), SIGNAL (newEvent (trikHal::EventFileInterface::EventType, int , int , trikKernel::TimeVal))
3237 , this , SLOT (onNewEvent (trikHal::EventFileInterface::EventType, int , int , trikKernel::TimeVal)));
3338
39+ connect (&mLastEventTimer , SIGNAL (timeout ()), this , SLOT (onSensorHanged ()));
40+
3441 mEventFile ->open ();
42+
43+ if (mEventFile ->isOpened ()) {
44+ mLastEventTimer .start ();
45+ }
3546}
3647
3748void VectorSensorWorker::onNewEvent (trikHal::EventFileInterface::EventType eventType, int code, int value
3849 , const trikKernel::TimeVal &eventTime)
3950{
51+ mLastEventTimer .start ();
52+
4053 switch (eventType) {
4154 case trikHal::EventFileInterface::EventType::evAbsX:
4255 mReadingUnsynced [0 ] = value;
@@ -52,7 +65,7 @@ void VectorSensorWorker::onNewEvent(trikHal::EventFileInterface::EventType event
5265 emit newData (mReading , eventTime);
5366 break ;
5467 default :
55- QLOG_ERROR () << " Unknown event type in vector sensor event file" << mEventFile ->fileName () << " :"
68+ QLOG_ERROR () << " Unknown event type in vector sensor event file" << mEventFile ->fileName () << " :"
5669 << static_cast <int >(eventType) << code << value;
5770 }
5871}
@@ -66,3 +79,24 @@ QVector<int> VectorSensorWorker::read()
6679 return {};
6780 }
6881}
82+
83+ void VectorSensorWorker::deinitialize ()
84+ {
85+ mLastEventTimer .stop ();
86+ }
87+
88+ void VectorSensorWorker::onSensorHanged ()
89+ {
90+ QLOG_WARN () << " Sensor" << mState .deviceName () << " hanged, reopening device file..." ;
91+ mLastEventTimer .stop ();
92+
93+ mEventFile ->close ();
94+ mEventFile ->open ();
95+
96+ if (!mEventFile ->isOpened ()) {
97+ mState .fail ();
98+ } else {
99+ QLOG_INFO () << " Sensor" << mState .deviceName () << " , device file reopened." ;
100+ mLastEventTimer .start ();
101+ }
102+ }
0 commit comments