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,6 +14,185 @@ | ||
14 | #define ERROR_LOG_FILE_TOTAL "/TotalError.csv" | 14 | #define ERROR_LOG_FILE_TOTAL "/TotalError.csv" |
15 | #define SERVICE_DATA_FILE "/ServiceData.csv" | 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 | FileProcessDlg::FileProcessDlg(QWidget *parent, ConfigType type, bool isDown) : | 196 | FileProcessDlg::FileProcessDlg(QWidget *parent, ConfigType type, bool isDown) : |
18 | QDialog(parent), | 197 | QDialog(parent), |
19 | ui(new Ui::FileProcessDlg) | 198 | ui(new Ui::FileProcessDlg) |
@@ -64,7 +243,10 @@ FileProcessDlg::~FileProcessDlg() | @@ -64,7 +243,10 @@ FileProcessDlg::~FileProcessDlg() | ||
64 | 243 | ||
65 | void FileProcessDlg::on_ctrBtnCancel_clicked() | 244 | void FileProcessDlg::on_ctrBtnCancel_clicked() |
66 | { | 245 | { |
67 | - close(); | 246 | + |
247 | + //emit stopcopy(); | ||
248 | + programCopyThd.requestInterruption(); | ||
249 | + //close(); | ||
68 | } | 250 | } |
69 | 251 | ||
70 | void FileProcessDlg::saveHistoryLineData(QTextStream &out, uint16_t i, uint16_t fired_cnt, time_t first_fired, time_t last_fried){ | 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,6 +297,8 @@ void FileProcessDlg::saveHistoryTotalData(QTextStream &out){ | ||
115 | 297 | ||
116 | } | 298 | } |
117 | 299 | ||
300 | + | ||
301 | + | ||
118 | void FileProcessDlg::infodataDownload(){ | 302 | void FileProcessDlg::infodataDownload(){ |
119 | QString strUsbPath; | 303 | QString strUsbPath; |
120 | QString strFile; | 304 | QString strFile; |
@@ -346,7 +530,49 @@ void FileProcessDlg::servicedataDownload(){ | @@ -346,7 +530,49 @@ void FileProcessDlg::servicedataDownload(){ | ||
346 | } | 530 | } |
347 | 531 | ||
348 | void FileProcessDlg::programDownload(){ | 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 | void FileProcessDlg::programUpload(){ | 578 | void FileProcessDlg::programUpload(){ |
app/gui/oven_control/fileprocessdlg.h
@@ -4,6 +4,9 @@ | @@ -4,6 +4,9 @@ | ||
4 | #include <QDialog> | 4 | #include <QDialog> |
5 | #include <QFile> | 5 | #include <QFile> |
6 | #include <QTextStream> | 6 | #include <QTextStream> |
7 | +#include <QThread> | ||
8 | +#include <QList> | ||
9 | +#include <QMutex> | ||
7 | #include "config.h" | 10 | #include "config.h" |
8 | #include "servicedata.h" | 11 | #include "servicedata.h" |
9 | #include "historylistwindow.h" | 12 | #include "historylistwindow.h" |
@@ -16,6 +19,31 @@ namespace Ui { | @@ -16,6 +19,31 @@ namespace Ui { | ||
16 | class FileProcessDlg; | 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 | class FileProcessDlg : public QDialog | 47 | class FileProcessDlg : public QDialog |
20 | { | 48 | { |
21 | Q_OBJECT | 49 | Q_OBJECT |
@@ -37,10 +65,18 @@ private slots: | @@ -37,10 +65,18 @@ private slots: | ||
37 | void configDownload(); | 65 | void configDownload(); |
38 | void configUpload(); | 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 | private: | 75 | private: |
42 | Ui::FileProcessDlg *ui; | 76 | Ui::FileProcessDlg *ui; |
43 | ConfigType m_nCfgtype; | 77 | ConfigType m_nCfgtype; |
78 | + QThread programCopyThd; | ||
79 | + ProgramCopyWorker worker; | ||
44 | }; | 80 | }; |
45 | 81 | ||
46 | #endif // FILEPROCESSDLG_H | 82 | #endif // FILEPROCESSDLG_H |
app/gui/oven_control/fileprocessor.cpp
@@ -39,3 +39,36 @@ bool FileProcessor::detectUSB(QString &usbPath){ | @@ -39,3 +39,36 @@ bool FileProcessor::detectUSB(QString &usbPath){ | ||
39 | qDebug() << "usb detect fail"; | 39 | qDebug() << "usb detect fail"; |
40 | return false; | 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,7 +10,8 @@ public: | ||
10 | static bool folderExist(const QString &path); | 10 | static bool folderExist(const QString &path); |
11 | static bool fileExist(const QString &path_file); | 11 | static bool fileExist(const QString &path_file); |
12 | static bool detectUSB(QString &usbpath); | 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 | #endif // FILEPROCESSOR_H | 17 | #endif // FILEPROCESSOR_H |