diff --git a/app/gui/oven_control/config.cpp b/app/gui/oven_control/config.cpp
index 5600490..4177ca1 100644
--- a/app/gui/oven_control/config.cpp
+++ b/app/gui/oven_control/config.cpp
@@ -18,6 +18,7 @@
 #include "confighalfenergydlg.h"
 #include "config1digitsetdlg.h"
 #include "configdutywashdlg.h"
+#include "fileprocessor.h"
 
 using namespace Define;
 
@@ -325,6 +326,7 @@ QString Config::getTempString(int cel_temp){
 void Config::execConfigWindow(QWidget *parent, Define::ConfigType idx){
     QDialog *dlg;
     bool bUsbDetect = false;
+    QString usbPath = "";
     switch(idx){
     case config_language:
         dlg = new ConfigLanguageDlg(parent);
@@ -362,21 +364,26 @@ void Config::execConfigWindow(QWidget *parent, Define::ConfigType idx){
     case config_service_data_download:
     case config_program_download:
     case config_set_download:
-        if(!bUsbDetect){
+        if(!FileProcessor::detectUSB(usbPath)){
             dlg = new UsbCheckPopupDlg(parent);
             dlg->exec();
         }
-        dlg = new ConfigFileProcessDlg(parent,idx);
-        dlg->exec();
+        if(FileProcessor::detectUSB(usbPath)){
+            dlg = new ConfigFileProcessDlg(parent,idx);
+            dlg->exec();
+        }
         return;
     case config_set_upload:
     case config_program_upload:
-        if(!bUsbDetect){
+
+        if(!FileProcessor::detectUSB(usbPath)){
             dlg = new UsbCheckPopupDlg(parent);
             dlg->exec();
         }
-        dlg = new ConfigFileProcessDlg(parent,idx,false);
-        dlg->exec();
+        if(FileProcessor::detectUSB(usbPath)){
+            dlg = new ConfigFileProcessDlg(parent,idx,false);
+            dlg->exec();
+        }
         return;
     case config_set_half_energy:
         dlg = new ConfigHalfEnergyDlg(parent);
diff --git a/app/gui/oven_control/configfileprocessdlg.cpp b/app/gui/oven_control/configfileprocessdlg.cpp
index addab20..f044ab8 100644
--- a/app/gui/oven_control/configfileprocessdlg.cpp
+++ b/app/gui/oven_control/configfileprocessdlg.cpp
@@ -1,6 +1,7 @@
 #include "configfileprocessdlg.h"
 #include "ui_configfileprocessdlg.h"
 #include "config.h"
+#include "fileprocessdlg.h"
 
 ConfigFileProcessDlg::ConfigFileProcessDlg(QWidget *parent, ConfigType type, bool isDown) :
     QDialog(parent),
@@ -12,6 +13,7 @@ ConfigFileProcessDlg::ConfigFileProcessDlg(QWidget *parent, ConfigType type, boo
     setAttribute(Qt::WA_NoSystemBackground);
     setAttribute(Qt::WA_TranslucentBackground);
     setAttribute(Qt::WA_DeleteOnClose);
+    m_bIsDown = isDown;
     if(type < config_invalid)
     {
         m_nCfgtype = type;
@@ -26,6 +28,7 @@ ConfigFileProcessDlg::ConfigFileProcessDlg(QWidget *parent, ConfigType type, boo
 
         }
     }
+
 }
 
 ConfigFileProcessDlg::~ConfigFileProcessDlg()
@@ -35,11 +38,9 @@ ConfigFileProcessDlg::~ConfigFileProcessDlg()
 
 void ConfigFileProcessDlg::on_ctrBtnOk_clicked()
 {
-    switch(m_nCfgtype){
-        default:
-        break;
-    }
-
+    QDialog *dg;
+    dg = new FileProcessDlg(parentWidget(),m_nCfgtype, m_bIsDown);
+    dg->exec();
     deleteLater();
 }
 
diff --git a/app/gui/oven_control/configfileprocessdlg.h b/app/gui/oven_control/configfileprocessdlg.h
index a661a7e..27a1110 100644
--- a/app/gui/oven_control/configfileprocessdlg.h
+++ b/app/gui/oven_control/configfileprocessdlg.h
@@ -26,6 +26,7 @@ private slots:
 private:
     Ui::ConfigFileProcessDlg *ui;
     ConfigType m_nCfgtype;
+    bool m_bIsDown;
 };
 
 #endif // CONFIGFILEPROCESSDLG_H
diff --git a/app/gui/oven_control/configwindow.cpp b/app/gui/oven_control/configwindow.cpp
index 64766d9..f11f959 100644
--- a/app/gui/oven_control/configwindow.cpp
+++ b/app/gui/oven_control/configwindow.cpp
@@ -9,7 +9,7 @@
 #include "yesnopopupdlg.h"
 #include "configdatetimedlg.h"
 #include "servicepassinputdlg.h"
-
+#include "fileprocessor.h"
 
 
 ConfigWindow::ConfigWindow(QWidget *parent) :
diff --git a/app/gui/oven_control/fileprocessdlg.cpp b/app/gui/oven_control/fileprocessdlg.cpp
new file mode 100644
index 0000000..616bd4d
--- /dev/null
+++ b/app/gui/oven_control/fileprocessdlg.cpp
@@ -0,0 +1,123 @@
+#include <QTimer>
+#include <QFile>
+#include "fileprocessdlg.h"
+#include "ui_fileprocessdlg.h"
+#include "fileprocessor.h"
+#include "ovenstatics.h"
+#include <QDebug>
+FileProcessDlg::FileProcessDlg(QWidget *parent, ConfigType type, bool isDown) :
+    QDialog(parent),
+    ui(new Ui::FileProcessDlg)
+{
+    ui->setupUi(this);
+    setAttribute(Qt::WA_DeleteOnClose);
+    setAttribute(Qt::WA_TranslucentBackground);
+    setWindowFlags(Qt::FramelessWindowHint);
+
+    ui->ctrWjProcess->setMinimum(0);
+    ui->ctrWjProcess->setMaximum(100);
+
+    if(isDown){
+        QPixmap pxmap;
+        pxmap.load(":/images/config/102_usb_upload_icon.png");
+        ui->label_2->setPixmap(pxmap);
+    }
+
+    switch(type){
+    case config_info_data_download:
+        QTimer::singleShot(100,this,SLOT(infodataDownload()));
+        break;
+    case config_service_data_download:
+        QTimer::singleShot(100,this,SLOT(servicedataDownload()));
+        break;
+    case config_program_download:
+        QTimer::singleShot(100,this,SLOT(programDownload()));
+        break;
+    case config_program_upload:
+        QTimer::singleShot(100,this,SLOT(programUpload()));
+        break;
+    case config_set_download:
+        QTimer::singleShot(100,this,SLOT(configDownload()));
+        break;
+    case config_set_upload:
+        QTimer::singleShot(100,this,SLOT(configUpload()));
+        break;
+    default:
+        QTimer::singleShot(200,this,SLOT(deleteLater()));
+        break;
+    }
+}
+
+FileProcessDlg::~FileProcessDlg()
+{
+    delete ui;
+}
+
+void FileProcessDlg::on_ctrBtnCancel_clicked()
+{
+    close();
+}
+
+void FileProcessDlg::infodataDownload(){
+
+}
+
+void FileProcessDlg::servicedataDownload(){
+
+
+}
+
+void FileProcessDlg::programDownload(){
+
+}
+
+void FileProcessDlg::programUpload(){
+
+}
+
+void FileProcessDlg::configDownload(){
+    QString strUsbPath;
+    if(FileProcessor::detectUSB(strUsbPath)){
+        strUsbPath.append("/config.ini");
+        qDebug() << strUsbPath;
+        if(QFile::copy("/prime/config/config.ini", strUsbPath)){
+            ui->ctrWjProcess->setValue(100);
+            ui->ctrLbRemainTime->setText("남은 예상 시간 : 0초");
+            ui->ctrLbRemainTime->setText(tr("남은 예상 시간 : 완료"));
+            QTimer::singleShot(1000,this,SLOT(close()));
+        }
+        else{
+            ui->ctrLbRemainTime->setText(tr("다운로드에 실패하였습니다."));
+            QTimer::singleShot(1000,this,SLOT(close()));
+        }
+    }
+    else{
+        ui->ctrLbRemainTime->setText(tr("다운로드에 실패하였습니다."));
+        QTimer::singleShot(1000,this,SLOT(close()));
+    }
+}
+
+void FileProcessDlg::configUpload(){
+    QString strUsbPath;
+    if(FileProcessor::detectUSB(strUsbPath)){
+        strUsbPath.append("/config.ini");
+        qDebug() << strUsbPath;
+        QFile file("/prime/config/config.ini");
+        file.remove();
+        if(QFile::copy( strUsbPath , "/prime/config/config.ini")){
+            OvenStatistics* ovs = OvenStatistics::getInstance();
+            ovs->srvdata->loadServiceData();
+            ui->ctrWjProcess->setValue(100);
+            ui->ctrLbRemainTime->setText(tr("남은 예상 시간 : 완료"));
+            QTimer::singleShot(1000,this,SLOT(close()));
+        }
+        else{
+            ui->ctrLbRemainTime->setText(tr("업로드에 실패하였습니다."));
+            QTimer::singleShot(1000,this,SLOT(close()));
+        }
+    }
+    else{
+        ui->ctrLbRemainTime->setText(tr("업로드에 실패하였습니다."));
+        QTimer::singleShot(1000,this,SLOT(close()));
+    }
+}
diff --git a/app/gui/oven_control/fileprocessdlg.h b/app/gui/oven_control/fileprocessdlg.h
new file mode 100644
index 0000000..66d6619
--- /dev/null
+++ b/app/gui/oven_control/fileprocessdlg.h
@@ -0,0 +1,48 @@
+#ifndef FILEPROCESSDLG_H
+#define FILEPROCESSDLG_H
+
+#include <QDialog>
+#include "config.h"
+#include "servicedata.h"
+
+using namespace Define;
+
+namespace Ui {
+class FileProcessDlg;
+}
+
+class FileProcessDlg : public QDialog
+{
+    Q_OBJECT
+
+    const uint8_t m_arrErrorMaxIdx[4] = {3,4,3,11};
+
+    const char m_strInfoName[4][64] = {"Top Ignition Box\0",
+                                         "Steam Ignition Box\0","Bottom Ignition Box\0","Service Total\0"};
+    const uint16_t m_arrErrorIdxs[3][20] = { //서비스 에러 기록 종합은 합산
+        {ERROR_IDX_upper_fire_fail,ERROR_IDX_upper_pan_fail,ERROR_IDX_upper_motor_fail},
+        {ERROR_IDX_steam_fire_fail,ERROR_IDX_steam_pan_fail,ERROR_IDX_water_level_sensor_fail,ERROR_IDX_steam_gen_temp_high_alram},
+        {ERROR_IDX_lower_fire_fail,ERROR_IDX_lower_pan_fail,ERROR_IDX_lower_motor_fail}
+    };
+
+
+
+public:
+    explicit FileProcessDlg(QWidget *parent = 0, ConfigType type = config_invalid, bool isDown = true);
+    ~FileProcessDlg();
+
+private slots:
+    void on_ctrBtnCancel_clicked();
+    void infodataDownload();
+    void servicedataDownload();
+    void programDownload();
+    void programUpload();
+    void configDownload();
+    void configUpload();
+
+private:
+    Ui::FileProcessDlg *ui;
+    ConfigType m_nCfgtype;
+};
+
+#endif // FILEPROCESSDLG_H
diff --git a/app/gui/oven_control/fileprocessdlg.ui b/app/gui/oven_control/fileprocessdlg.ui
new file mode 100644
index 0000000..9016434
--- /dev/null
+++ b/app/gui/oven_control/fileprocessdlg.ui
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FileProcessDlg</class>
+ <widget class="QDialog" name="FileProcessDlg">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>900</width>
+    <height>1600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <property name="windowOpacity">
+   <double>1.000000000000000</double>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">#centralWidget { background-image: url(:/images/background/popup/503.png);
+}
+</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <widget class="QWidget" name="centralWidget" native="true">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>430</y>
+     <width>900</width>
+     <height>503</height>
+    </rect>
+   </property>
+   <property name="styleSheet">
+    <string notr="true"/>
+   </property>
+   <widget class="QWidget" name="verticalLayoutWidget">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>0</y>
+      <width>901</width>
+      <height>520</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <property name="topMargin">
+      <number>30</number>
+     </property>
+     <property name="bottomMargin">
+      <number>30</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string/>
+       </property>
+       <property name="pixmap">
+        <pixmap resource="resources.qrc">:/images/config/102_usb_download_icon.png</pixmap>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item alignment="Qt::AlignHCenter">
+      <widget class="FileProcessGauge" name="ctrWjProcess" native="true">
+       <property name="minimumSize">
+        <size>
+         <width>820</width>
+         <height>120</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>820</width>
+         <height>120</height>
+        </size>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="ctrLbRemainTime">
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>30</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <family>나눔바른고딕</family>
+         <pointsize>14</pointsize>
+        </font>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">color : white;
+padding-left : 65px;</string>
+       </property>
+       <property name="text">
+        <string>남은 예상 시간 : 1초</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+       </property>
+      </widget>
+     </item>
+     <item alignment="Qt::AlignRight">
+      <widget class="QPushButton" name="ctrBtnCancel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>220</width>
+         <height>100</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <family>나눔바른고딕</family>
+         <pointsize>17</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+         <underline>true</underline>
+        </font>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">QPushButton{
+		 border : none;
+        color : white;
+}
+
+QPushButton::pressed, QPushButton::focus{
+        color : yellow;
+}</string>
+       </property>
+       <property name="text">
+        <string>취소</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>FileProcessGauge</class>
+   <extends>QWidget</extends>
+   <header>fileprocessgauge.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/app/gui/oven_control/fileprocessgauge.cpp b/app/gui/oven_control/fileprocessgauge.cpp
new file mode 100644
index 0000000..85de2fb
--- /dev/null
+++ b/app/gui/oven_control/fileprocessgauge.cpp
@@ -0,0 +1,40 @@
+#include "fileprocessgauge.h"
+#include <QPainter>
+#include <QDebug>
+
+FileProcessGauge::FileProcessGauge(QWidget *parent) : PreheatTempGauge(parent)
+{
+    border.load(":/images/gauge/103_usb_graph_01.png");
+    indicator.load(":/images/gauge/103_usb_graph_02.png");
+    body.load(":/images/gauge/103_usb_graph_03.png");
+    min = 0;
+    max = 100;
+    val = 30;
+}
+
+void FileProcessGauge::paintEvent(QPaintEvent *event){
+    QPainter painter(this);
+    painter.setBrush(Qt::NoBrush);
+    painter.setPen(Qt::NoPen);
+    QRect textRect(0,0,72,40);
+
+    qreal percentage = (qreal) (val - min) / qMax(max - min, 1);
+    percentage = qBound((qreal) 0.0, percentage, (qreal) 1.0);
+
+    QRect targetRect(
+                (border.size().width() - body.size().width()) / 2 + textRect.width()/2,
+                (border.size().height() - body.size().height()) / 2 + indicator.size().height()+textRect.height(),
+                body.size().width() * percentage, body.height());
+
+    QRect sourceRect(0, 0, body.size().width() * percentage, body.height());
+    QFont font;
+    font.setFamily("나눔맑은고딕");
+    font.setPixelSize(30);
+    painter.setFont(font);
+    painter.setPen(Qt::white);
+    painter.drawPixmap(targetRect, body, sourceRect);
+    painter.drawPixmap(textRect.width()/ 2, textRect.height()+indicator.size().height(), border);
+    painter.drawPixmap(targetRect.right() - indicator.size().width() / 2, textRect.height(), indicator);
+    textRect.setRect(targetRect.right() - textRect.size().width()/2, textRect.top(),72,40);
+    painter.drawText(textRect,Qt::AlignCenter, QString("%1%").arg(val));
+}
diff --git a/app/gui/oven_control/fileprocessgauge.h b/app/gui/oven_control/fileprocessgauge.h
new file mode 100644
index 0000000..dec70d1
--- /dev/null
+++ b/app/gui/oven_control/fileprocessgauge.h
@@ -0,0 +1,16 @@
+#ifndef FILEPROCESSGAUGE_H
+#define FILEPROCESSGAUGE_H
+
+#include "preheattempgauge.h"
+
+class FileProcessGauge : public PreheatTempGauge
+{
+public:
+    FileProcessGauge(QWidget *parent=0);
+
+protected:
+    void paintEvent(QPaintEvent *event);
+
+};
+
+#endif // FILEPROCESSGAUGE_H
diff --git a/app/gui/oven_control/fileprocessor.cpp b/app/gui/oven_control/fileprocessor.cpp
new file mode 100644
index 0000000..51ab451
--- /dev/null
+++ b/app/gui/oven_control/fileprocessor.cpp
@@ -0,0 +1,41 @@
+#include <QDebug>
+#include "fileprocessor.h"
+
+FileProcessor::FileProcessor()
+{
+
+}
+
+bool FileProcessor::folderExist(const QString &path){
+    QDir qdir(path);
+    qDebug() << "check path" << path;
+    return qdir.exists();
+}
+
+bool FileProcessor::fileExist(const QString &path_file){
+    QFile qfile(path_file);
+    return qfile.exists();
+}
+
+bool FileProcessor::detectUSB(QString &usbPath){
+    int curUsbNum=0xff;
+    bool usbMountErr = false;
+    QString checkUsbName[3] = {
+        "sda",
+        "sdb",
+        "sdc"
+    };
+
+    for(int i =2;i >=0 ; i--){
+
+        if(folderExist(QString("/sys/block/").append(checkUsbName[i]))){
+            if(folderExist(QString("/mnt/%111").arg(checkUsbName[i]))){
+                usbPath =  QString("/mnt/%111").arg(checkUsbName[i]);
+                return true;
+            }
+            break;
+        }
+    }
+    qDebug() << "usb detect fail";
+    return false;
+}
diff --git a/app/gui/oven_control/fileprocessor.h b/app/gui/oven_control/fileprocessor.h
new file mode 100644
index 0000000..f275fdd
--- /dev/null
+++ b/app/gui/oven_control/fileprocessor.h
@@ -0,0 +1,16 @@
+#ifndef FILEPROCESSOR_H
+#define FILEPROCESSOR_H
+
+#include <QtCore>
+
+class FileProcessor
+{
+public:
+    FileProcessor();
+static bool folderExist(const QString &path);
+static bool fileExist(const QString &path_file);
+static bool detectUSB(QString &usbpath);
+
+};
+
+#endif // FILEPROCESSOR_H
diff --git a/app/gui/oven_control/images/config/102_usb_download_icon.png b/app/gui/oven_control/images/config/102_usb_download_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a482fb5a0ad50cbf41ff3e252895889788347397
GIT binary patch
literal 3237
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
Xl@Q<b?3B$H00000NkvXXu0mjf1}!FR

literal 0
HcmV?d00001

diff --git a/app/gui/oven_control/images/config/102_usb_upload_icon.png b/app/gui/oven_control/images/config/102_usb_upload_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb9e32db9df2dce48e3d19fd097f70bcd0a33b51
GIT binary patch
literal 3191
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

literal 0
HcmV?d00001

diff --git a/app/gui/oven_control/images/gauge/103_usb_graph_01.png b/app/gui/oven_control/images/gauge/103_usb_graph_01.png
new file mode 100644
index 0000000000000000000000000000000000000000..b117b1cdc3a8c87dceacb416f243b82fd0248c9c
GIT binary patch
literal 578
zcmeAS@N?(olHy`uVBq!ia0y~yVEP4QJ94l9Nv@U?2Z5AAvPY0F14ET614BbI1H;e%
zK>8&EL#Y7+!>a@a2CEqi4C48d;*Yuk)iNb{ySp&_Z|^^|AIRe@@Q5sCVBi)8VMc~o
zb0mO*>?NMQuIvw4_?Yz6?#aGB&A`C8+|$J|q~g}w8ykI{5+zz6@;g6d`qDO!MXZ3C
zD_VWSl0trO^$lu;%;E*i;tL9!&oc?R{PEsmasKk1C;#qLuekTfZx?riK=}W^><mAw
z7x4?ERPCs{^7`c8(zCCZmNhSzTlK24z-;yJ&D&+yzS?&0Rc%4m)m5RZ!}K@rT2~nw
z`t{zoFP-<wz88Ji_3HdTnR&YB?|*w+a{2D;hbw`K)<*3;k(K{_<M&E-g^m}@EP}NS
z3P3AdzA!d**f|JXWam)&#o*{7Ka?bwwZC38-|wCNs#hD!o0qR!UH9i-#<$bA`@%v?
yubVdqgFL;pYUb6W|BPPhF*yC$!wmLr4dW!$J<F?i-%tj|B7>)^pUXO@geCx;;NKts

literal 0
HcmV?d00001

diff --git a/app/gui/oven_control/images/gauge/103_usb_graph_02.png b/app/gui/oven_control/images/gauge/103_usb_graph_02.png
new file mode 100644
index 0000000000000000000000000000000000000000..30013074f944f95ef263a8a385cd820605798933
GIT binary patch
literal 289
zcmeAS@N?(olHy`uVBq!ia0vp^{2(?53y{1c{^t~sQb_g)@?~JCQe|LhXl7ve`5#EX
zWMC*YU|@Kaz`$TNgMmRje^UHWH=tUkByV>YhX3vTXZ8bmoCO|{#S9GG!XV7ZFl&wk
zP>{XE)7O>#AqyXqp4vUx*QbF(ZJsWUArhBMFDw*1<RH-caJqC-r?Sv=F$t3{GYKh$
z(j{$68qc@{vM`<G(VcK`j_Z?t%R-gy{_oVky-lmgO?~?M%E@yITyB>>zELSO+%Zk%
zVTH;EU%9Y?gs6{}uN-zC_#N-+Rnua>>L~9WrMxipO%FvsI8Xe+xcor)W6v)KgwsFH
eo0x1fld)vRCYROHTHk;!V(@hJb6Mw<&;$TddSu%G

literal 0
HcmV?d00001

diff --git a/app/gui/oven_control/images/gauge/103_usb_graph_03.png b/app/gui/oven_control/images/gauge/103_usb_graph_03.png
new file mode 100644
index 0000000000000000000000000000000000000000..caf9a4b288ae3a16b10626cc2047253a37588e62
GIT binary patch
literal 250
zcmeAS@N?(olHy`uVBq!ia0y~yVEPJVTXO&jhI=7edw>*ElDE4H!~gdFGy8!&&H|6f
zVg?3oVGw3ym^DWND9B#o>Fdh=kX4*p-Z;yaX$MfK+tbA{q~g}wOOApJ3>=3I4(#8h
zd5BeBh;wfl*E~ti0^1#OG5qV;uQ$Iw`1L^*8W*<=NFjDTP$Q0`n^us*=(&l}<J;8l
RYk<yT@O1TaS?83{1OSSfUt0hG

literal 0
HcmV?d00001

diff --git a/app/gui/oven_control/oven_control.pro b/app/gui/oven_control/oven_control.pro
index 30087d8..e007093 100644
--- a/app/gui/oven_control/oven_control.pro
+++ b/app/gui/oven_control/oven_control.pro
@@ -103,7 +103,10 @@ SOURCES += main.cpp\
     backlight.cpp \
     dirtylevel.cpp \
     washwarnicon.cpp \
-    coretempsettingpopup.cpp
+    coretempsettingpopup.cpp \
+    fileprocessor.cpp \
+    fileprocessgauge.cpp \
+    fileprocessdlg.cpp
 
 HEADERS  += mainwindow.h \
     cook.h \
@@ -196,7 +199,10 @@ HEADERS  += mainwindow.h \
     backlight.h \
     dirtylevel.h \
     washwarnicon.h \
-    coretempsettingpopup.h
+    coretempsettingpopup.h \
+    fileprocessor.h \
+    fileprocessgauge.h \
+    fileprocessdlg.h
 
 FORMS    += mainwindow.ui \
     manualcookwindow.ui \
@@ -259,7 +265,8 @@ FORMS    += mainwindow.ui \
     gasmodelsettingwindow.ui \
     electricmodelsettingwindow.ui \
     servicepassinputdlg.ui \
-    coretempsettingpopup.ui
+    coretempsettingpopup.ui \
+    fileprocessdlg.ui
 
 RESOURCES += \
     resources.qrc
diff --git a/app/gui/oven_control/resources.qrc b/app/gui/oven_control/resources.qrc
index 0fab1d0..6abd0b8 100644
--- a/app/gui/oven_control/resources.qrc
+++ b/app/gui/oven_control/resources.qrc
@@ -557,5 +557,10 @@
         <file>images/cook_type/meat_hide.png</file>
         <file>images/cook_type/poultry_hide.png</file>
         <file>images/cook_type/vegetable_hide.png</file>
+        <file>images/gauge/103_usb_graph_01.png</file>
+        <file>images/gauge/103_usb_graph_02.png</file>
+        <file>images/gauge/103_usb_graph_03.png</file>
+        <file>images/config/102_usb_upload_icon.png</file>
+        <file>images/config/102_usb_download_icon.png</file>
     </qresource>
 </RCC>
diff --git a/app/gui/oven_control/servicepassinputdlg.cpp b/app/gui/oven_control/servicepassinputdlg.cpp
index 0e63d3d..9154dc4 100644
--- a/app/gui/oven_control/servicepassinputdlg.cpp
+++ b/app/gui/oven_control/servicepassinputdlg.cpp
@@ -30,6 +30,7 @@ void ServicePassInputDlg::on_ctrBtnOk_clicked()
         connect(w,SIGNAL(destroyed(QObject*)),this,SLOT(close()));
         w->setWindowModality(Qt::WindowModal);
         w->show();
+        this->hide();
     }
     else {
         qDebug()<< "pass incorrect " <<  ui->lineEdit->text();
diff --git a/app/gui/oven_control/usbcheckpopupdlg.cpp b/app/gui/oven_control/usbcheckpopupdlg.cpp
index 4331e7a..95b9a54 100644
--- a/app/gui/oven_control/usbcheckpopupdlg.cpp
+++ b/app/gui/oven_control/usbcheckpopupdlg.cpp
@@ -1,6 +1,7 @@
 #include <QTimer>
 #include "usbcheckpopupdlg.h"
 #include "ui_usbcheckpopupdlg.h"
+#include "fileprocessor.h"
 
 UsbCheckPopupDlg::UsbCheckPopupDlg(QWidget *parent) :
     QDialog(parent),
@@ -29,7 +30,8 @@ void UsbCheckPopupDlg::on_ctrBtnYes_clicked()
 }
 
 void UsbCheckPopupDlg::usbCheckTimerFired(){
-    bool usbDetect = false;
+    QString strTemp;
+    bool usbDetect = FileProcessor::detectUSB(strTemp);
     if(usbDetect){
         accept();
     }