#include "tools/cabana/streams/devicestream.h" #include #include #include #include #include // DeviceStream DeviceStream::DeviceStream(QObject *parent, QString address) : zmq_address(address), LiveStream(parent) { startStreamThread(); } void DeviceStream::streamThread() { if (!zmq_address.isEmpty()) { setenv("ZMQ", "1", 1); } std::unique_ptr context(Context::create()); std::string address = zmq_address.isEmpty() ? "127.0.0.1" : zmq_address.toStdString(); std::unique_ptr sock(SubSocket::create(context.get(), "can", address)); assert(sock != NULL); sock->setTimeout(50); // run as fast as messages come in while (!QThread::currentThread()->isInterruptionRequested()) { Message *msg = sock->receive(true); if (!msg) { QThread::msleep(50); continue; } handleEvent(msg->getData(), msg->getSize()); delete msg; } } AbstractOpenStreamWidget *DeviceStream::widget(AbstractStream **stream) { return new OpenDeviceWidget(stream); } // OpenDeviceWidget OpenDeviceWidget::OpenDeviceWidget(AbstractStream **stream) : AbstractOpenStreamWidget(stream) { QRadioButton *msgq = new QRadioButton(tr("MSGQ")); QRadioButton *zmq = new QRadioButton(tr("ZMQ")); ip_address = new QLineEdit(this); ip_address->setPlaceholderText(tr("Enter device Ip Address")); QString ip_range = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"; QString pattern("^" + ip_range + "\\." + ip_range + "\\." + ip_range + "\\." + ip_range + "$"); QRegularExpression re(pattern); ip_address->setValidator(new QRegularExpressionValidator(re, this)); group = new QButtonGroup(this); group->addButton(msgq, 0); group->addButton(zmq, 1); QFormLayout *form_layout = new QFormLayout(this); form_layout->addRow(msgq); form_layout->addRow(zmq, ip_address); QObject::connect(group, qOverload(&QButtonGroup::buttonToggled), [=](QAbstractButton *button, bool checked) { ip_address->setEnabled(button == zmq && checked); }); zmq->setChecked(true); } bool OpenDeviceWidget::open() { QString ip = ip_address->text().isEmpty() ? "127.0.0.1" : ip_address->text(); bool msgq = group->checkedId() == 0; *stream = new DeviceStream(qApp, msgq ? "" : ip); return true; }