@Jeff-Barnes
#include "jtagclient.h"
#include <unistd.h>
#include <QSerialPortInfo>
#include <QTimer>
QString JtagClient::m_usbDevice = "ttyUSB0";
JtagClient::JtagClient(QObject *parent)
: QObject(parent)
{
m_serialPort = new QSerialPort(m_usbDevice);
}
void JtagClient::run()
{
if (!m_serialPort->open(QIODevice::ReadWrite))
{
emit usbDeviceStatus("Could not open serial port");
return;
}
QTimer *tm = new QTimer;
QTimer *retmr = new QTimer;
tm->setInterval(500);
tm->setSingleShot(false);
retmr->setInterval(500);
retmr->setSingleShot(false);
QObject::connect(this, &JtagClient::stopDisconnectTimer, tm, &QTimer::stop);
QObject::connect(this, &JtagClient::stopReconnectTimer, retmr, &QTimer::stop);
QObject::connect(this, SIGNAL(startReconnectTimer()), retmr, SLOT(start()));
QObject::connect(this, &JtagClient::finished, tm, &QTimer::deleteLater);
QObject::connect(this, &JtagClient::finished, retmr, &QTimer::deleteLater);
QObject::connect(tm, &QTimer::timeout, [&]() {
bool found = false;
foreach (QSerialPortInfo inf, QSerialPortInfo::availablePorts())
{
if (m_usbDevice == inf.portName())
{
emit usbDeviceStatus("Waiting for usb serial disconnect");
found = true;
break;
}
}
if (!found)
{
m_serialPort->close();
m_serialPort->deleteLater();
emit usbDeviceStatus("Cable removed");
emit stopDisconnectTimer();
emit startReconnectTimer();
}
});
QObject::connect(retmr, &QTimer::timeout, [&]() {
bool found = false;
foreach (QSerialPortInfo inf, QSerialPortInfo::availablePorts())
{
if (m_usbDevice == inf.portName())
{
found = true;
//500000 causes a Permission denied error, presumably the kernel hasn't finished the inode
//750000 causes a Permission denied error for ReadWrite, but works for ReadOnly
//usleep(750000);
sleep(1);
m_serialPort = new QSerialPort(m_usbDevice);
if (!m_serialPort->open(QIODevice::ReadWrite))
{
emit usbDeviceStatus(QString("Could not re-open device: %1").arg(m_serialPort->errorString()));
}
else
{
emit usbDeviceStatus("Connection re-established");
}
break;
}
}
if (found)
{
emit stopReconnectTimer();
emit finished();
}
else
emit usbDeviceStatus("Waiting for re-connect");
});
tm->start();
}