# include "tools/cabana/streams/devicestream.h"
# include <QButtonGroup>
# include <QFormLayout>
# include <QRadioButton>
# include <QRegularExpression>
# include <QRegularExpressionValidator>
// 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 ( 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 ;
}