Commit 7a3fdac0e0161dffd5a95799e8f262a6f956b947
1 parent
7dd7d47be4
Exists in
master
and in
2 other branches
설정 프로그램 다운로드 기능 개발
- 설정 프로그램 다운로드 기능 개발 완료
Showing
4 changed files
with
298 additions
and
2 deletions
Show diff stats
app/gui/oven_control/fileprocessdlg.cpp
| ... | ... | @@ -14,6 +14,185 @@ |
| 14 | 14 | #define ERROR_LOG_FILE_TOTAL "/TotalError.csv" |
| 15 | 15 | #define SERVICE_DATA_FILE "/ServiceData.csv" |
| 16 | 16 | |
| 17 | + | |
| 18 | +ProgramCopyWorker::ProgramCopyWorker(){ | |
| 19 | + m_bStop = false; | |
| 20 | +} | |
| 21 | + | |
| 22 | + | |
| 23 | +ProgramCopyWorker::ProgramCopyWorker(QString strDest){ | |
| 24 | + m_strDestDir = strDest; | |
| 25 | +} | |
| 26 | + | |
| 27 | +void ProgramCopyWorker::setDestPath(QString strDest){ | |
| 28 | + m_strDestDir = strDest; | |
| 29 | +} | |
| 30 | + | |
| 31 | +void ProgramCopyWorker::workerMain(){ | |
| 32 | + quint64 nTotalFileSize=0; | |
| 33 | + quint64 nCpyFileSize=0; | |
| 34 | + uint16_t nCurProgress=0; | |
| 35 | + int nRemainSec = 0; | |
| 36 | + QStringList strdirlist; | |
| 37 | + QStringList strFilelist; | |
| 38 | + QString srcFilepath; | |
| 39 | + QString destFilePath; | |
| 40 | + | |
| 41 | + int i; | |
| 42 | + | |
| 43 | + //make destination folder | |
| 44 | + QDir destdir(m_strDestDir); | |
| 45 | + if(!destdir.isRoot() && destdir.exists()==false){ | |
| 46 | + destdir.mkpath(m_strDestDir); | |
| 47 | + } | |
| 48 | + qDebug() << "Target Path is " << m_strDestDir; | |
| 49 | + | |
| 50 | + | |
| 51 | + foreach(QString filepath, m_arrSrcFileList){ | |
| 52 | + QFileInfo finfo(filepath); | |
| 53 | + nTotalFileSize+= finfo.size(); | |
| 54 | + } | |
| 55 | + | |
| 56 | + foreach(QString srcpath, m_arrSrcDirList){ | |
| 57 | + nTotalFileSize += FileProcessor::getDirSize(srcpath); | |
| 58 | + } | |
| 59 | + qDebug()<<"Total Size : " << nTotalFileSize; | |
| 60 | + | |
| 61 | + foreach(QString filepath, m_arrSrcFileList){ | |
| 62 | + QFileInfo finfo(filepath); | |
| 63 | + srcFilepath = filepath; | |
| 64 | + destFilePath = QString("%1/%2").arg(m_strDestDir).arg(finfo.fileName()); | |
| 65 | + if(QFile::exists(destFilePath)){ | |
| 66 | + QFile::rename(destFilePath, QString("%1.bak").arg(destFilePath)); | |
| 67 | + } | |
| 68 | + QFile::copy(srcFilepath,destFilePath); | |
| 69 | + nCpyFileSize += finfo.size(); | |
| 70 | + nCurProgress = (nCpyFileSize *100) / nTotalFileSize; | |
| 71 | + nRemainSec = (nTotalFileSize-nCpyFileSize)/200000; | |
| 72 | + emit progressed(nCurProgress,nRemainSec); | |
| 73 | + if(QThread::currentThread()->isInterruptionRequested()){ | |
| 74 | + sync(); | |
| 75 | + emit finished(); | |
| 76 | + QThread::currentThread()->quit(); | |
| 77 | + break; | |
| 78 | + } | |
| 79 | + QThread::currentThread()->msleep(10); | |
| 80 | + } | |
| 81 | + | |
| 82 | + if(QThread::currentThread()->isInterruptionRequested() == false){ | |
| 83 | + foreach(QString srcpath, m_arrSrcDirList){ | |
| 84 | + qDebug() << "src dir : " << srcpath; | |
| 85 | + | |
| 86 | + QDir srcdir(srcpath); | |
| 87 | + strdirlist.append(srcpath); | |
| 88 | + FileProcessor::getAllDirList(srcdir, strdirlist); | |
| 89 | + qDebug() << "dir size : " <<strdirlist.size(); | |
| 90 | + | |
| 91 | + QString targetpath =QString("%1%2").arg(m_strDestDir).arg(srcpath.mid(srcpath.lastIndexOf('/'))); | |
| 92 | + qDebug() << "target dir : " << targetpath; | |
| 93 | + | |
| 94 | + QDir destDir(targetpath); | |
| 95 | + if(destDir.exists()) { | |
| 96 | + qDebug() << "remove target path"; | |
| 97 | + QDir().rename(targetpath, QString("%1_").arg(targetpath)); | |
| 98 | + } | |
| 99 | + | |
| 100 | + foreach(QString strDir, strdirlist){ | |
| 101 | + QDir srcItem(strDir); | |
| 102 | + srcItem.mkpath( QString(strDir).replace(srcpath,targetpath)); | |
| 103 | + qDebug() << "make path : " << QString(strDir).replace(srcpath,targetpath); | |
| 104 | + strFilelist = srcItem.entryList(QDir::NoDotAndDotDot | QDir::Files ); | |
| 105 | + foreach(QString filename, strFilelist){ | |
| 106 | + srcFilepath = QString("%1/%2").arg(strDir).arg(filename); | |
| 107 | + destFilePath = QString("%1/%2").arg(QString(strDir).replace(srcpath,targetpath)).arg(filename); | |
| 108 | + QFile::copy(srcFilepath, destFilePath); | |
| 109 | + qDebug() << srcFilepath << destFilePath; | |
| 110 | + QFileInfo finfo(srcFilepath); | |
| 111 | + nCpyFileSize += finfo.size(); | |
| 112 | + nCurProgress = (nCpyFileSize *100) / nTotalFileSize; | |
| 113 | + nRemainSec = (nTotalFileSize-nCpyFileSize)/200000; | |
| 114 | + emit progressed(nCurProgress,nRemainSec); | |
| 115 | + if(QThread::currentThread()->isInterruptionRequested()){ | |
| 116 | + sync(); | |
| 117 | + emit finished(); | |
| 118 | + break; | |
| 119 | + } | |
| 120 | + QThread::currentThread()->msleep(100); | |
| 121 | + } | |
| 122 | + if(QThread::currentThread()->isInterruptionRequested()) break; | |
| 123 | + } | |
| 124 | + strdirlist.clear(); | |
| 125 | + if(QThread::currentThread()->isInterruptionRequested()) break; | |
| 126 | + } | |
| 127 | + } | |
| 128 | + | |
| 129 | + if(QThread::currentThread()->isInterruptionRequested()){ | |
| 130 | + foreach(QString filepath, m_arrSrcFileList){ | |
| 131 | + QFileInfo finfo(filepath); | |
| 132 | + srcFilepath = filepath; | |
| 133 | + destFilePath = QString("%1/%2").arg(m_strDestDir).arg(finfo.fileName()); | |
| 134 | + if(QFile::exists( QString("%1.bak").arg(destFilePath))){ | |
| 135 | + QFile::remove(destFilePath); | |
| 136 | + QFile::rename(QString("%1.bak").arg(destFilePath), destFilePath); | |
| 137 | + nCpyFileSize -= finfo.size(); | |
| 138 | + nCurProgress = (nCpyFileSize *100) / nTotalFileSize; | |
| 139 | + emit progressed(nCurProgress, nRemainSec); | |
| 140 | + } | |
| 141 | + QThread::currentThread()->msleep(1); | |
| 142 | + } | |
| 143 | + foreach(QString srcpath, m_arrSrcDirList){ | |
| 144 | + qDebug() << "src dir : " << srcpath; | |
| 145 | + | |
| 146 | + QDir srcdir(srcpath); | |
| 147 | + QString targetpath =QString("%1%2").arg(m_strDestDir).arg(srcpath.mid(srcpath.lastIndexOf('/'))); | |
| 148 | + qDebug() << "target dir : " << targetpath; | |
| 149 | + | |
| 150 | + QDir destDir(targetpath); | |
| 151 | + QDir renameDir(QString("%1_").arg(targetpath)); | |
| 152 | + if(renameDir.exists()) { | |
| 153 | + qDebug() << "remove target path"; | |
| 154 | + destDir.removeRecursively(); | |
| 155 | + QDir().rename(QString("%1_").arg(targetpath), targetpath); | |
| 156 | + } | |
| 157 | + emit progressed(0, 0); | |
| 158 | + } | |
| 159 | + } | |
| 160 | + else{ | |
| 161 | + foreach(QString srcpath, m_arrSrcDirList){ | |
| 162 | + qDebug() << "src dir : " << srcpath; | |
| 163 | + | |
| 164 | + QDir srcdir(srcpath); | |
| 165 | + | |
| 166 | + QString targetpath =QString("%1%2").arg(m_strDestDir).arg(srcpath.mid(srcpath.lastIndexOf('/'))); | |
| 167 | + qDebug() << "target dir : " << targetpath; | |
| 168 | + | |
| 169 | + QDir destDir(targetpath); | |
| 170 | + QDir renameDir(QString("%1_").arg(targetpath)); | |
| 171 | + if(renameDir.exists()) { | |
| 172 | + renameDir.removeRecursively(); | |
| 173 | + } | |
| 174 | + emit progressed(0, 0); | |
| 175 | + } | |
| 176 | + } | |
| 177 | + sync(); | |
| 178 | + emit finished(); | |
| 179 | +} | |
| 180 | + | |
| 181 | +void ProgramCopyWorker::addSrcDir(QString strDirPath){ | |
| 182 | + m_arrSrcDirList.append(strDirPath); | |
| 183 | +} | |
| 184 | + | |
| 185 | +void ProgramCopyWorker::addSrcFile(QString strfilename){ | |
| 186 | + m_arrSrcFileList.append(strfilename); | |
| 187 | +} | |
| 188 | + | |
| 189 | +void ProgramCopyWorker::workerStop(){ | |
| 190 | + //QMutexLocker locker(&m_mutex); | |
| 191 | + // qDebug() << "stop thread"; | |
| 192 | + m_bStop = true; | |
| 193 | +} | |
| 194 | + | |
| 195 | + | |
| 17 | 196 | FileProcessDlg::FileProcessDlg(QWidget *parent, ConfigType type, bool isDown) : |
| 18 | 197 | QDialog(parent), |
| 19 | 198 | ui(new Ui::FileProcessDlg) |
| ... | ... | @@ -64,7 +243,10 @@ FileProcessDlg::~FileProcessDlg() |
| 64 | 243 | |
| 65 | 244 | void FileProcessDlg::on_ctrBtnCancel_clicked() |
| 66 | 245 | { |
| 67 | - close(); | |
| 246 | + | |
| 247 | + //emit stopcopy(); | |
| 248 | + programCopyThd.requestInterruption(); | |
| 249 | + //close(); | |
| 68 | 250 | } |
| 69 | 251 | |
| 70 | 252 | void FileProcessDlg::saveHistoryLineData(QTextStream &out, uint16_t i, uint16_t fired_cnt, time_t first_fired, time_t last_fried){ |
| ... | ... | @@ -115,6 +297,8 @@ void FileProcessDlg::saveHistoryTotalData(QTextStream &out){ |
| 115 | 297 | |
| 116 | 298 | } |
| 117 | 299 | |
| 300 | + | |
| 301 | + | |
| 118 | 302 | void FileProcessDlg::infodataDownload(){ |
| 119 | 303 | QString strUsbPath; |
| 120 | 304 | QString strFile; |
| ... | ... | @@ -346,7 +530,49 @@ void FileProcessDlg::servicedataDownload(){ |
| 346 | 530 | } |
| 347 | 531 | |
| 348 | 532 | void FileProcessDlg::programDownload(){ |
| 533 | + QString strDescPath; | |
| 534 | + QString strSrcPath; | |
| 535 | + | |
| 536 | + if(FileProcessor::detectUSB(strDescPath)){ | |
| 537 | + worker.setDestPath(QString("%1").arg(strDescPath)); | |
| 538 | + worker.addSrcDir("/prime/cookbook"); | |
| 539 | + worker.moveToThread(&programCopyThd); | |
| 540 | + | |
| 541 | + connect(&programCopyThd,SIGNAL(started()), &worker, SLOT(workerMain())); | |
| 542 | + connect(&worker, SIGNAL(progressed(int,int)), this, SLOT(onProgressed(int,int))); | |
| 543 | + connect(this, SIGNAL(stopcopy()), &worker, SLOT(workerStop())); | |
| 544 | + connect(&worker, SIGNAL(finished()), &programCopyThd,SLOT(quit())); | |
| 545 | + connect(&programCopyThd, SIGNAL(finished()), this, SLOT(onProgressFinished())); | |
| 546 | + //connect(ui->ctrBtnCancel, SIGNAL(clicked(bool)), &worker, SLOT(workerStop())); | |
| 547 | + | |
| 548 | + programCopyThd.start(); | |
| 549 | + qDebug() << "thread start"; | |
| 550 | + } | |
| 551 | + else{ | |
| 552 | + ui->ctrLbRemainTime->setText(tr("USB 인식을 실패하였습니다.")); | |
| 553 | + QTimer::singleShot(1000,this,SLOT(close())); | |
| 554 | + } | |
| 555 | +} | |
| 349 | 556 | |
| 557 | +void FileProcessDlg::onProgressFinished(){ | |
| 558 | + ui->ctrLbRemainTime->setText(tr("완료")); | |
| 559 | + QTimer::singleShot(1000,this, SLOT(close())); | |
| 560 | +} | |
| 561 | + | |
| 562 | +void FileProcessDlg::onProgressed(int progress, int sec){ | |
| 563 | + int min, _sec; | |
| 564 | + QString strTemp; | |
| 565 | + ui->ctrWjProcess->setValue(progress); | |
| 566 | + min = sec/60; | |
| 567 | + _sec = sec%60; | |
| 568 | + if(min >0){ | |
| 569 | + strTemp.sprintf("남은 예상 시간 : %d분 %d초", min, _sec); | |
| 570 | + ui->ctrLbRemainTime->setText(strTemp); | |
| 571 | + } | |
| 572 | + else{ | |
| 573 | + strTemp.sprintf("남은 예상 시간 : %d초", sec); | |
| 574 | + ui->ctrLbRemainTime->setText(strTemp); | |
| 575 | + } | |
| 350 | 576 | } |
| 351 | 577 | |
| 352 | 578 | void FileProcessDlg::programUpload(){ | ... | ... |
app/gui/oven_control/fileprocessdlg.h
| ... | ... | @@ -4,6 +4,9 @@ |
| 4 | 4 | #include <QDialog> |
| 5 | 5 | #include <QFile> |
| 6 | 6 | #include <QTextStream> |
| 7 | +#include <QThread> | |
| 8 | +#include <QList> | |
| 9 | +#include <QMutex> | |
| 7 | 10 | #include "config.h" |
| 8 | 11 | #include "servicedata.h" |
| 9 | 12 | #include "historylistwindow.h" |
| ... | ... | @@ -16,6 +19,31 @@ namespace Ui { |
| 16 | 19 | class FileProcessDlg; |
| 17 | 20 | } |
| 18 | 21 | |
| 22 | +class ProgramCopyWorker : public QObject{ | |
| 23 | + Q_OBJECT | |
| 24 | + QString m_strDestDir; | |
| 25 | + QList<QString> m_arrSrcFileList; | |
| 26 | + QList<QString> m_arrSrcDirList; | |
| 27 | + QMutex m_mutex; | |
| 28 | + bool m_bStop; | |
| 29 | +public: | |
| 30 | + explicit ProgramCopyWorker(QString strDest); | |
| 31 | + explicit ProgramCopyWorker(); | |
| 32 | + void setDestPath(QString strDest); | |
| 33 | + void addSrcFile(QString strfilename); | |
| 34 | + void addSrcDir(QString strDirPath); | |
| 35 | + | |
| 36 | + | |
| 37 | +public slots: | |
| 38 | + void workerMain(); | |
| 39 | + void workerStop(); | |
| 40 | + | |
| 41 | + | |
| 42 | +signals: | |
| 43 | + void finished(); | |
| 44 | + void progressed(int progress, int sec); | |
| 45 | +}; | |
| 46 | + | |
| 19 | 47 | class FileProcessDlg : public QDialog |
| 20 | 48 | { |
| 21 | 49 | Q_OBJECT |
| ... | ... | @@ -37,10 +65,18 @@ private slots: |
| 37 | 65 | void configDownload(); |
| 38 | 66 | void configUpload(); |
| 39 | 67 | |
| 68 | +signals: | |
| 69 | + void stopcopy(); | |
| 70 | + | |
| 71 | +public slots: | |
| 72 | + void onProgressed(int progress,int sec); | |
| 73 | + void onProgressFinished(); | |
| 40 | 74 | |
| 41 | 75 | private: |
| 42 | 76 | Ui::FileProcessDlg *ui; |
| 43 | 77 | ConfigType m_nCfgtype; |
| 78 | + QThread programCopyThd; | |
| 79 | + ProgramCopyWorker worker; | |
| 44 | 80 | }; |
| 45 | 81 | |
| 46 | 82 | #endif // FILEPROCESSDLG_H | ... | ... |
app/gui/oven_control/fileprocessor.cpp
| ... | ... | @@ -39,3 +39,36 @@ bool FileProcessor::detectUSB(QString &usbPath){ |
| 39 | 39 | qDebug() << "usb detect fail"; |
| 40 | 40 | return false; |
| 41 | 41 | } |
| 42 | + | |
| 43 | + | |
| 44 | +void FileProcessor::getAllDirList(QDir d, QStringList &list){ | |
| 45 | + QStringList qsl = d.entryList(QDir::NoDotAndDotDot | QDir::Dirs); | |
| 46 | + foreach(QString strdir, qsl){ | |
| 47 | + strdir.prepend(d.absolutePath().append("/")); | |
| 48 | + list.append(strdir); | |
| 49 | + QDir dir(strdir); | |
| 50 | + getAllDirList(dir,list); | |
| 51 | + } | |
| 52 | +} | |
| 53 | + | |
| 54 | +quint64 FileProcessor::getDirSize(const QString &str){ | |
| 55 | + qint64 sizex = 0; | |
| 56 | + QFileInfo str_info(str); | |
| 57 | + if(str_info.isDir()){ | |
| 58 | + QDir dir(str); | |
| 59 | + QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot); | |
| 60 | + for (int i = 0; i < list.size(); ++i) | |
| 61 | + { | |
| 62 | + QFileInfo fileInfo = list.at(i); | |
| 63 | + if(fileInfo.isDir()) | |
| 64 | + { | |
| 65 | + sizex += getDirSize(fileInfo.absoluteFilePath()); | |
| 66 | + } | |
| 67 | + else{ | |
| 68 | + qDebug() << fileInfo.absoluteFilePath() << fileInfo.size(); | |
| 69 | + sizex += fileInfo.size(); | |
| 70 | + } | |
| 71 | + } | |
| 72 | + } | |
| 73 | + return sizex; | |
| 74 | +} | ... | ... |
app/gui/oven_control/fileprocessor.h
| ... | ... | @@ -10,7 +10,8 @@ public: |
| 10 | 10 | static bool folderExist(const QString &path); |
| 11 | 11 | static bool fileExist(const QString &path_file); |
| 12 | 12 | static bool detectUSB(QString &usbpath); |
| 13 | - | |
| 13 | +static void getAllDirList(QDir d, QStringList &list); | |
| 14 | +static quint64 getDirSize(const QString &str); | |
| 14 | 15 | }; |
| 15 | 16 | |
| 16 | 17 | #endif // FILEPROCESSOR_H | ... | ... |