summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2017-05-12 15:46:22 +0200
committerStanislaw Halik <sthalik@misaki.pl>2017-05-12 15:48:17 +0200
commit5e5dc9ec086eb277828abd6bade93dd0faabb9de (patch)
treee08f6c56140c70b754f841dfe9e1e5d4158a4329
parenteebafd92fc40f303cef38746a4007b0554a49299 (diff)
tracker/hatire: try to fix busy-looping harder
Need discussion in: #139
-rw-r--r--tracker-hatire/thread.cpp60
1 files changed, 49 insertions, 11 deletions
diff --git a/tracker-hatire/thread.cpp b/tracker-hatire/thread.cpp
index fa09e5da..9dd22c9d 100644
--- a/tracker-hatire/thread.cpp
+++ b/tracker-hatire/thread.cpp
@@ -89,6 +89,7 @@ hatire_thread::~hatire_thread()
hatire_thread::hatire_thread()
{
data_read.reserve(65536);
+ com_port.setReadBufferSize(2048);
connect(this, &QThread::finished, this, &hatire_thread::teardown_serial, Qt::DirectConnection);
connect(this, &hatire_thread::init_serial_port, this, &hatire_thread::init_serial_port_impl, Qt::QueuedConnection);
@@ -303,34 +304,71 @@ void hatire_thread::serial_info_impl()
void hatire_thread::on_serial_read()
{
+ static char buf[256];
+ int sz;
+
+#if !defined HATIRE_DEBUG_LOGFILE
+ bool error = false, empty = false;
+#endif
+
{
QMutexLocker lck(&data_mtx);
+
#ifndef HATIRE_DEBUG_LOGFILE
- data_read += com_port.readAll();
+ sz = com_port.read(buf, sizeof(buf));
+ error |= sz < 0;
+ empty |= sz == 0;
#else
- QByteArray tmp = com_port.read(30);
- data_read += tmp;
- if (tmp.length() == 0 && read_timer.isActive())
+ const int sz = com_port.read(buf, sizeof(buf));
+
+ if (sz <= 0 && read_timer.isActive())
{
+ if (sz < 0)
+ qDebug() << "hatire: debug file read error" << com_port.errorString();
qDebug() << "eof";
read_timer.stop();
+ return;
}
#endif
}
- stat.input(timer.elapsed_ms());
- timer.start();
+#if !defined HATIRE_DEBUG_LOGFILE
+ if (error || com_port.error() != QSerialPort::NoError)
+ {
+ once_only(qDebug() << "hatire serial: error num" << com_port.error() << "num2" << error);
+ com_port.clearError(); // XXX must test it
+ }
+ else if (empty)
+ once_only(qDebug() << "hatire serial: empty");
+ else
+ goto ok;
+#endif
+
+ goto fail;
+
+ok:
+ data_read.append(buf, sz);
+
+ using namespace time_units;
- if (throttle_timer.elapsed_ms() >= 3000)
+ stat.input(prog1(timer.elapsed<ms>().count(), timer.start()));
+
+ if (throttle_timer.elapsed_seconds() >= 1)
{
throttle_timer.start();
- qDebug() << "stat:" << "avg" << stat.avg() << "stddev" << stat.stddev();
+ qDebug() << "hatire stat:" << "avg" << stat.avg() << "stddev" << stat.stddev();
}
- if (s.serial_bug_workaround)
+ if (!s.serial_bug_workaround)
+ return;
+
+fail:
+ // qt can fire QSerialPort::readyRead() needlessly, causing a busy loop.
+ // see https://github.com/opentrack/opentrack/issues/327#issuecomment-207941003
+
+ once_only(qDebug() << "hatire: sleeping due to error, pinout:" << int(com_port.pinoutSignals()));
+
{
- // qt can fire QSerialPort::readyRead() needlessly, causing a busy loop.
- // see https://github.com/opentrack/opentrack/issues/327#issuecomment-207941003
constexpr int hz = 90;
constexpr int ms = 1000/hz;
portable::sleep(ms);