2020-04-06 23:48:08 +08:00
# include " pm3process.h "
2020-04-21 19:12:44 +08:00
PM3Process : : PM3Process ( QThread * thread , QObject * parent ) : QProcess ( parent )
2020-04-06 23:48:08 +08:00
{
2020-04-21 19:12:44 +08:00
moveToThread ( thread ) ;
2020-04-07 18:16:00 +08:00
setProcessChannelMode ( PM3Process : : MergedChannels ) ;
2020-04-22 23:13:00 +08:00
isRequiringOutput = false ;
requiredOutput = new QString ( ) ;
serialListener = new QTimer ( ) ; // if using new QTimer(this), the debug output will show "Cannot create children for a parent that is in a different thread."
2020-04-21 19:12:44 +08:00
serialListener - > moveToThread ( this - > thread ( ) ) ; // I've tried many ways to creat a QTimer instance, but all of the instances are in the main thread(UI thread), so I have to move it manually
2020-04-18 02:01:42 +08:00
serialListener - > setInterval ( 1000 ) ;
serialListener - > setTimerType ( Qt : : VeryCoarseTimer ) ;
2020-04-22 23:13:00 +08:00
connect ( serialListener , & QTimer : : timeout , this , & PM3Process : : onTimeout ) ;
connect ( this , & PM3Process : : readyRead , this , & PM3Process : : onReadyRead ) ;
2020-04-07 18:16:00 +08:00
}
2020-04-06 23:48:08 +08:00
2020-04-21 19:12:44 +08:00
void PM3Process : : connectPM3 ( const QString path , const QString port )
2020-04-07 18:16:00 +08:00
{
2020-04-21 19:12:44 +08:00
setRequiringOutput ( true ) ;
2020-04-06 23:48:08 +08:00
2020-04-07 18:16:00 +08:00
// using "-f" option to make the client output flushed after every print.
2020-04-22 23:13:00 +08:00
start ( path , QStringList ( ) < < port < < " -f " , QProcess : : Unbuffered | QProcess : : ReadWrite ) ;
2020-04-21 19:12:44 +08:00
if ( waitForStarted ( 10000 ) )
2020-04-18 02:01:42 +08:00
{
2020-04-21 19:12:44 +08:00
while ( waitForReadyRead ( 1000 ) )
;
setRequiringOutput ( false ) ;
QString result = * requiredOutput ;
2020-04-22 23:13:00 +08:00
if ( result . indexOf ( " os: " ) ! = - 1 ) // make sure the PM3 is connected
2020-04-21 19:12:44 +08:00
{
result = result . mid ( result . indexOf ( " os: " ) ) ;
result = result . left ( result . indexOf ( " \r \n " ) ) ;
result = result . mid ( 3 , result . lastIndexOf ( " " ) - 3 ) ;
2020-04-22 23:13:00 +08:00
emit PM3StatedChanged ( true , result ) ;
setSerialListener ( port , true ) ;
2020-04-21 19:12:44 +08:00
}
else
kill ( ) ;
2020-04-18 02:01:42 +08:00
}
2020-04-06 23:48:08 +08:00
}
2020-04-11 23:53:06 +08:00
void PM3Process : : setRequiringOutput ( bool st )
{
2020-04-22 23:13:00 +08:00
isRequiringOutput = st ;
2020-04-11 23:53:06 +08:00
if ( isRequiringOutput )
requiredOutput - > clear ( ) ;
}
2020-04-15 00:38:43 +08:00
bool PM3Process : : waitForReadyRead ( int msecs )
{
return QProcess : : waitForReadyRead ( msecs ) ;
}
2020-04-16 00:39:10 +08:00
2020-04-22 23:13:00 +08:00
void PM3Process : : setSerialListener ( const QString & name , bool state )
2020-04-18 02:01:42 +08:00
{
if ( state )
{
2020-04-22 23:13:00 +08:00
portInfo = new QSerialPortInfo ( name ) ;
2020-04-18 02:01:42 +08:00
serialListener - > start ( ) ;
2020-04-22 23:13:00 +08:00
qDebug ( ) < < serialListener - > thread ( ) ;
2020-04-18 02:01:42 +08:00
}
else
{
serialListener - > stop ( ) ;
delete portInfo ;
}
}
2020-04-22 21:14:33 +08:00
void PM3Process : : onTimeout ( ) //when the proxmark3 client is unexpectedly terminated or the PM3 hardware is removed, the isBusy() will return false(only tested on Windows);
2020-04-18 02:01:42 +08:00
{
2020-04-22 23:13:00 +08:00
// qDebug()<<portInfo->isBusy();
2020-04-18 02:01:42 +08:00
if ( ! portInfo - > isBusy ( ) )
{
2020-04-21 19:12:44 +08:00
kill ( ) ;
emit PM3StatedChanged ( false ) ;
2020-04-22 23:13:00 +08:00
setSerialListener ( " " , false ) ;
2020-04-18 02:01:42 +08:00
}
}
2020-04-21 19:12:44 +08:00
void PM3Process : : testThread ( )
{
2020-04-22 23:13:00 +08:00
qDebug ( ) < < " PM3: " < < QThread : : currentThread ( ) ;
2020-04-21 19:12:44 +08:00
}
2020-04-22 16:00:56 +08:00
qint64 PM3Process : : write ( QString data )
{
return QProcess : : write ( data . toLatin1 ( ) ) ;
}
2020-04-22 16:42:58 +08:00
void PM3Process : : onReadyRead ( )
{
2020-04-22 21:14:33 +08:00
QString out = readAll ( ) ;
if ( isRequiringOutput )
requiredOutput - > append ( out ) ;
if ( out ! = " " )
{
2020-04-23 17:50:20 +08:00
// qDebug() << "PM3Process::onReadyRead:" << out;
2020-04-22 21:14:33 +08:00
emit newOutput ( out ) ;
}
2020-04-22 16:42:58 +08:00
}