|  |  |  | #include "tools/cabana/streams/devicestream.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QButtonGroup>
 | 
					
						
							|  |  |  | #include <QFormLayout>
 | 
					
						
							|  |  |  | #include <QRadioButton>
 | 
					
						
							|  |  |  | #include <QRegularExpression>
 | 
					
						
							|  |  |  | #include <QRegularExpressionValidator>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DeviceStream
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DeviceStream::DeviceStream(QObject *parent, QString address) : zmq_address(address), LiveStream(parent) {
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DeviceStream::streamThread() {
 | 
					
						
							|  |  |  |   zmq_address.isEmpty() ? unsetenv("ZMQ") : setenv("ZMQ", "1", 1);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   std::unique_ptr<Context> context(Context::create());
 | 
					
						
							|  |  |  |   std::string address = zmq_address.isEmpty() ? "127.0.0.1" : zmq_address.toStdString();
 | 
					
						
							|  |  |  |   std::unique_ptr<SubSocket> 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<QAbstractButton *, bool>(&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;
 | 
					
						
							|  |  |  | }
 |