diff --git a/src/download_thread.cpp b/src/download_thread.cpp index f82c8fd..8ba9b18 100644 --- a/src/download_thread.cpp +++ b/src/download_thread.cpp @@ -109,6 +109,116 @@ void DownloadThread::run() { qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) << " DownloadThread::run(): Filename:" << m_hw->dcDownloadFileName(); + QDateTime const start = QDateTime::currentDateTime(); + +#if 1 + QFile fn(m_hw->dcDownloadFileName()); + + if (!fn.exists()) { + // output via CONSOLE() etc + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << " DownloadThread::run(): Filename:" << m_hw->dcDownloadFileName() << "DOES NOT EXIST";; + } else { + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): DC-CONTROLLER SW-VERSION BEFORE" + << m_hw->dc_getSWversion(); + + // load binary device controller file into memory + QByteArray ba = loadBinaryDCFile(m_hw->dcDownloadFileName()); + if (ba.size() > 0) { + uint16_t const totalBlocks = (((ba.size())%64)==0) ? (ba.size()/64) : (ba.size()/64)+1; + m_hw->dcDownloadSetTotalBlockNumber(totalBlocks); + + // fill last block of data to be sent with 0xFF + ba = ba.leftJustified(totalBlocks*64, (char)(0xFF)); + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): TOTAL NUMBER OF BYTES TO SEND TO DC" << ba.size(); + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): TOTAL NUMBER OF BLOCKS" << totalBlocks; + + m_hw->dc_autoRequest(true); // turn auto-request setting on + + m_hw->request_DC2_HWversion(); + m_hw->request_DC2_SWversion(); + QThread::sleep(1); + + // m_hw->dc_autoRequest(false); // turn auto-request setting on + + resetDeviceController(); + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): RESET DEVICE-CONTROLLER"; + + if (startBootloader()) { + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): STARTED BOOT-LOADER"; + + m_hw->dc_autoRequest(false);// turn auto-request setting off for + // download of binary dc + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): TOTAL NUMBER OF FIRMWARE BLOCKS" << totalBlocks; + + int currentBlock = 0; // download of binary dc + DownloadResult res = DownloadResult::OK; + + while (res != DownloadResult::ERROR && currentBlock < totalBlocks) { + if ((res = sendNextAddress(currentBlock)) != DownloadResult::ERROR) { + if ((res = sendNextDataBlock(ba, currentBlock)) != DownloadResult::ERROR) { + m_hw->dcDownloadSetCurrentBlockNumber(currentBlock); + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): currentBlockNumber ..." << currentBlock; + + currentBlock += 1; + } + } + } + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << QString("DownloadThread::run(): last 64-byte block %1").arg(currentBlock); + + int const rest = ba.size() % 64; + int const offset = ba.size() - rest; + char const *startAddress = ba.constData() + offset; + + if (rest > 0) { + // SHOULD NEVER HAPPEN !!! + uint8_t local[66]; + memset(local, 0xFF, sizeof(local)); + memcpy(local, startAddress, rest); + qCritical() << "DownloadThread::run(): ERROR SEND REMAINING" << rest << "BYTES"; + m_hw->bl_sendDataBlock(64, local); + } else { + m_hw->bl_sendLastBlock(); + m_hw->dcDownloadSetCurrentBlockNumber(currentBlock); + + qCritical() << "DownloadThread::run(): currentBlockNumber" << currentBlock; + // QThread::msleep(250); + } + qCritical() << "DownloadThread::run(): last result" << (int)sendStatus(m_hw->bl_wasSendingDataOK()); + + stopBootloader(); // stop bootloader several times: if it + QThread::sleep(1); // is not stopped, then the PSA has to be + } + // restarted manually (!!!) + stopBootloader(); + QThread::sleep(1); + } + + qCritical() << QDateTime::currentDateTime().time().toString(Qt::ISODateWithMs) + << "DownloadThread::run(): STOPPED BOOT-LOADER"; + + stopBootloader(); // there is no harm in stopping the bootloader even + // if it was not started at all + + m_hw->dc_autoRequest(true); + } + +#else // test // load binary device controller file into memory QByteArray ba = loadBinaryDCFile(m_hw->dcDownloadFileName()); if (ba.size() > 0) {