#include "reporting_thread.h" #include "shared_mem_buffer.h" #include "hwapi.h" #include #include ReportingThread::ReportingThread(hwapi *hw) : m_hw(hw) , m_fileToDownload(m_hw->dcDownloadFileName()) { } ReportingThread::~ReportingThread() { } // download thread running in ca-slave sends reports of download process to // each component which has connects for the corresponding signals. void ReportingThread::run() { qCritical() << QDateTime::currentDateTime() << "START DOWNLOAD THREAD"; static QString report(""); int cnt = 5; while (!m_hw->dcDownloadGetRunning()) { if (--cnt > 0) { report = QString("%1 waiting for download to start %2") .arg(QDateTime::currentDateTime().toString(Qt::ISODate)) .arg(cnt); qCritical() << __LINE__ << "STATUS" << report; emit m_hw->hwapi_reportDCDownloadStatus(report); QThread::sleep(1); } else break; } #if 0 if (cnt == 0) { m_hw->dcDownloadResetRequest(); status = QString("%1 reset download request") .arg(QDateTime::currentDateTime().toString(Qt::ISODate)); qCritical() << __LINE__ << "STATUS" << status; emit m_hw->hwapi_reportDCDownloadStatus(status); cnt = 5; while (!m_hw->dcDownloadRunning()) { if (--cnt > 0) { QThread::sleep(1); } else break; } if (cnt == 0) { status = QString("%1 download request failure") .arg(QDateTime::currentDateTime().toString(Qt::ISODate)); qCritical() << __LINE__ << "STATUS" << status; emit m_hw->hwapi_reportDCDownloadFailure(status); return; } } uint16_t const tnr = 1750; uint16_t cnr = 0; while (cnr <= tnr) { QThread::msleep(100); QString report(""); if (cnr > 0) { double percent = ((double)cnr / (double)tnr) * 100.0; report = QString(": total blocks %1, current block %2 [%3]") .arg(tnr).arg(cnr).arg(percent, 0, 'f', 2); } else { report = QString(": total blocks %1, current block %2 [0]") .arg(tnr).arg(cnr); } status = QDateTime::currentDateTime().toString(Qt::ISODate) + report; qCritical() << "STATUS" << status; emit m_hw->hwapi_reportDCDownloadStatus(status); cnr += 1; } if (tnr == cnr) { m_hw->hwapi_reportDCDownloadSuccess( QString("SUCCESS DOWNLOADING") + m_fileToDownload); } else { m_hw->hwapi_reportDCDownloadFailure( QString("ERROR DOWNLOADING %1 (total blocks=%2, sent blocks=%3)") .arg(m_fileToDownload).arg(tnr).arg(cnr)); } #endif uint16_t const totalBlocks = m_hw->dcDownloadGetTotalBlockNumber(); qCritical() << QDateTime::currentDateTime() << "TOTAL BLOCKS" << totalBlocks; if (totalBlocks) { qint64 const start = QDateTime::currentMSecsSinceEpoch(); double durationMillis = 0; uint16_t currentBlockNumber = 0; while (m_hw->dcDownloadGetRunning()) { currentBlockNumber = m_hw->dcDownloadGetCurrentBlockNumber(); durationMillis += QDateTime::currentMSecsSinceEpoch() - start; double const timeAveragePerBlock = (currentBlockNumber > 0) ? (durationMillis / currentBlockNumber) : durationMillis; double const estimatedSecondsLeft = (timeAveragePerBlock * (totalBlocks - currentBlockNumber)) / 1000.0; double percent = ((double)currentBlockNumber / (double)totalBlocks) * 100.0; report = QString(": total blocks %1, current block %2 [%3] (est. time left: %4s)") .arg(totalBlocks) .arg(currentBlockNumber) .arg(percent, 0, 'f', 2) .arg(estimatedSecondsLeft, 0, 'f', 2); qCritical() << "RT report" << report; emit m_hw->hwapi_reportDCDownloadStatus(report); QThread::msleep(100); } QThread::msleep(100); if (totalBlocks == currentBlockNumber) { m_hw->hwapi_reportDCDownloadSuccess( QString("SUCCESS DOWNLOADING") + m_fileToDownload); } else { m_hw->hwapi_reportDCDownloadFailure( QString("ERROR DOWNLOADING %1 (total blocks=%2, sent blocks=%3)") .arg(m_fileToDownload).arg(totalBlocks).arg(currentBlockNumber)); } } qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ << QString("line=%1 REPORT THREAD ABOUT TO FINISH").arg(__LINE__); cnt = 10; bool running = m_hw->dcDownloadGetRunning(); bool finished = m_hw->dcDownloadGetFinished(); while (--cnt > 0 && (running && !finished)) { qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ << QString("line=%1 REPORT THREAD: WAIT FOR END OF DOWNLOAD THREAD %2 %3 (%4)") .arg(__LINE__).arg(running).arg(finished).arg(cnt); QThread::sleep(1); running = m_hw->dcDownloadGetRunning(); finished = m_hw->dcDownloadGetFinished(); } qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ << QString("line=%1 FINISH REPORT THREAD").arg(__LINE__); }