From 6a81d38e4cef99a38cc392c4483816492e917114 Mon Sep 17 00:00:00 2001
From: victor <taehoon@falinux.com>
Date: Tue, 18 Apr 2017 17:08:06 +0900
Subject: [PATCH] =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=9A=94=EB=A6=AC=20?=
 =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=A0=84=EB=A9=B4=20?=
 =?UTF-8?q?=EC=9E=AC=EC=9E=91=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/gui/oven_control/autocook.cpp                |  522 ++++
 app/gui/oven_control/autocook.h                  |   42 +
 app/gui/oven_control/autocookconfigwindow.cpp    |  178 +-
 app/gui/oven_control/autocookconfigwindow.h      |   17 +-
 app/gui/oven_control/autocookconfigwindow.ui     |  257 +-
 app/gui/oven_control/autocookselectionwindow.cpp |   34 +-
 app/gui/oven_control/autocookselectionwindow.h   |    9 +-
 app/gui/oven_control/autocookwindow.cpp          | 1129 +++----
 app/gui/oven_control/autocookwindow.h            |   73 +-
 app/gui/oven_control/autocookwindow.ui           | 3516 ++++++++--------------
 app/gui/oven_control/cook.cpp                    |  754 ++---
 app/gui/oven_control/cook.h                      |  227 +-
 app/gui/oven_control/cookbook.cpp                |  102 +
 app/gui/oven_control/cookbook.h                  |   29 +
 app/gui/oven_control/define.cpp                  |  495 +++
 app/gui/oven_control/define.h                    |  118 +
 app/gui/oven_control/keepwarmpopup.cpp           |   34 +
 app/gui/oven_control/keepwarmpopup.h             |   32 +
 app/gui/oven_control/keepwarmpopup.ui            |  362 +++
 app/gui/oven_control/oven_control.pro            |   17 +-
 app/gui/oven_control/preheattempgauge.cpp        |   19 +-
 app/gui/oven_control/preheattempgauge.h          |    4 +-
 22 files changed, 4016 insertions(+), 3954 deletions(-)
 create mode 100644 app/gui/oven_control/autocook.cpp
 create mode 100644 app/gui/oven_control/autocook.h
 create mode 100644 app/gui/oven_control/cookbook.cpp
 create mode 100644 app/gui/oven_control/cookbook.h
 create mode 100644 app/gui/oven_control/define.cpp
 create mode 100644 app/gui/oven_control/define.h
 create mode 100644 app/gui/oven_control/keepwarmpopup.cpp
 create mode 100644 app/gui/oven_control/keepwarmpopup.h
 create mode 100644 app/gui/oven_control/keepwarmpopup.ui

diff --git a/app/gui/oven_control/autocook.cpp b/app/gui/oven_control/autocook.cpp
new file mode 100644
index 0000000..a2d93cb
--- /dev/null
+++ b/app/gui/oven_control/autocook.cpp
@@ -0,0 +1,522 @@
+#include "autocook.h"
+
+AutoCook::AutoCook() : currentStepIndex(0), done_(false), doorOpened(false), checkingCoreTemp(false)
+{
+
+}
+
+AutoCook::AutoCook(Cook cook) : AutoCook()
+{
+    this->cook = cook;
+    for (int idx = 0; idx < this->cook.steps.size(); idx++)
+        this->cook.steps[idx].time *= 1000;
+
+
+    startStep();
+}
+
+void AutoCook::startStep()
+{
+    Oven *oven = Oven::getInstance();
+
+    CookStep &currentStep = cook.steps[currentStepIndex];
+    switch (Define::classify(currentStep.type))
+    {
+    case Define::PreheatClass:
+        startHumidity = oven->currentHumidity();
+        startTemp = oven->currentTemp();
+        isWaitingDoorOpened_ = false;
+        oven->setMode(Oven::CombinationMode);
+        oven->setHumidity(currentStep.humidity);
+        oven->setTemp(currentStep.temp);
+        oven->setFan(currentStep.fan);
+        oven->startPreheating();
+        break;
+    case Define::DoorClass:
+        isWaitingDoorOpened_ = true;
+        break;
+    case Define::CookClass:
+        startHumidity = oven->currentHumidity();
+        startTemp = oven->currentTemp();
+        isWaitingDoorOpened_ = false;
+        oven->setMode(Oven::CombinationMode);
+        oven->setHumidity(currentStep.humidity);
+        oven->setTemp(currentStep.temp);
+        oven->setFan(currentStep.fan);
+        oven->setTime(remainingTime() + 300);
+
+        if (cook.isCoreTempValid())
+        {
+            oven->setInterTemp(cook.coreTemp());
+            oven->setInterTempEnabled(true);
+        }
+        else
+            oven->setInterTempEnabled(false);
+
+        if (currentStep.dehumidification)
+        {
+            if (currentStep.dehumidificationRepeatDelay)
+                oven->repeatDamper(currentStep.dehumidification, currentStep.dehumidificationRepeatDelay, currentStep.dehumidificationRepeatCount);
+            else
+                oven->openDamper(currentStep.dehumidification);
+        }
+
+        if (currentStep.humidification)
+        {
+            if (currentStep.humidificationRepeatDelay)
+                oven->repeatHumidification(currentStep.humidification, currentStep.humidificationRepeatDelay, currentStep.humidificationRepeatCount);
+            else
+                oven->startHumidification(currentStep.humidification);
+        }
+
+        stepStartTime.start();
+        oven->startCooking();
+    case Define::InvalidClass:
+        break;
+    }
+
+    advance();
+}
+
+void AutoCook::nextStep()
+{
+    qDebug() << "Next Step Before" << remainingTime();
+
+    Oven *oven = Oven::getInstance();
+
+    CookStep &currentStep = cook.steps[currentStepIndex];
+    CookStep &nextStep = cook.steps[currentStepIndex + 1];
+
+    Define::StepClass currentClass = Define::classify(currentStep.type);
+    Define::StepClass nextClass = Define::classify(nextStep.type);
+
+    if (currentClass == Define::PreheatClass && nextClass == Define::DoorClass)
+    {
+        oven->stopPreheating();
+        isWaitingDoorOpened_ = true;
+    }
+    else if (currentClass == Define::DoorClass && nextClass == Define::CookClass)
+    {
+        startHumidity = oven->currentHumidity();
+        startTemp = oven->currentTemp();
+        oven->setHumidity(nextStep.humidity);
+        oven->setTemp(nextStep.temp);
+        oven->setFan(nextStep.fan);
+        oven->setTime(remainingTime() + 300);
+
+        if (cook.isCoreTempValid())
+        {
+            oven->setInterTemp(cook.coreTemp());
+            oven->setInterTempEnabled(true);
+        }
+        else
+            oven->setInterTempEnabled(false);
+
+        stepStartTime.start();
+        oven->startCooking();
+
+        if (nextStep.dehumidification)
+        {
+            if (nextStep.dehumidificationRepeatDelay)
+                oven->repeatDamper(nextStep.dehumidification, nextStep.dehumidificationRepeatDelay, nextStep.dehumidificationRepeatCount);
+            else
+                oven->openDamper(nextStep.dehumidification);
+        }
+
+        if (nextStep.humidification)
+        {
+            if (nextStep.humidificationRepeatDelay)
+                oven->repeatHumidification(nextStep.humidification, nextStep.humidificationRepeatDelay, nextStep.humidificationRepeatCount);
+            else
+                oven->startHumidification(nextStep.humidification);
+        }
+
+        if (checkingCoreTemp && currentStepIndex + 2 >= cook.steps.size())
+        {
+            lastCoreTempIncreasedTime.start();
+        }
+    }
+    else if (currentClass == Define::CookClass && nextClass == Define::CookClass)
+    {
+        startHumidity = oven->currentHumidity();
+        startTemp = oven->currentTemp();
+        oven->setHumidity(nextStep.humidity);
+        oven->setTemp(nextStep.temp);
+        oven->setFan(nextStep.fan);
+        stepStartTime.start();
+
+        if (currentStep.dehumidification)
+        {
+            if (nextStep.dehumidification)
+            {
+                if (currentStep.dehumidificationRepeatDelay)
+                {
+                    if (nextStep.dehumidificationRepeatDelay)
+                        oven->repeatDamper(nextStep.dehumidification, nextStep.dehumidificationRepeatDelay, nextStep.dehumidificationRepeatCount);
+                    else
+                    {
+                        oven->stopRepeatDamper();
+                        oven->openDamper(nextStep.dehumidification);
+                    }
+                }
+                else
+                {
+                    if (nextStep.dehumidificationRepeatDelay)
+                        oven->repeatDamper(nextStep.dehumidification, nextStep.dehumidificationRepeatDelay, nextStep.dehumidificationRepeatCount);
+                    else
+                        oven->openDamper(nextStep.dehumidification);
+                }
+            }
+            else
+            {
+                if (currentStep.dehumidificationRepeatDelay)
+                    oven->stopRepeatDamper();
+            }
+        }
+        else
+        {
+            if (nextStep.dehumidification)
+            {
+                if (nextStep.dehumidificationRepeatDelay)
+                    oven->repeatDamper(nextStep.dehumidification, nextStep.dehumidificationRepeatDelay, nextStep.dehumidificationRepeatCount);
+                else
+                    oven->openDamper(nextStep.dehumidification);
+            }
+        }
+
+        if (nextStep.humidification != currentStep.humidification
+                || nextStep.humidificationRepeatDelay != currentStep.humidificationRepeatDelay
+                || nextStep.humidificationRepeatCount != currentStep.humidificationRepeatCount)
+        {
+            if (nextStep.humidificationRepeatDelay)
+            {
+                if (currentStep.humidificationRepeatDelay)
+                    oven->repeatHumidification(nextStep.humidification, nextStep.humidificationRepeatDelay, nextStep.humidificationRepeatCount);
+                else
+                {
+                    oven->stopHumidification();
+                    oven->repeatHumidification(nextStep.humidification, nextStep.humidificationRepeatDelay, nextStep.humidificationRepeatCount);
+                }
+            }
+            else
+            {
+                if (currentStep.humidificationRepeatDelay)
+                {
+                    oven->stopRepeatHumidification();
+                    oven->startHumidification(nextStep.humidification);
+                }
+                else
+                    oven->startHumidification(nextStep.humidification);
+            }
+        }
+
+        if (checkingCoreTemp && currentStepIndex + 2 >= cook.steps.size())
+        {
+            lastCoreTempIncreasedTime.start();
+        }
+    }
+    else if (currentClass == Define::CookClass && nextClass == Define::DoorClass)
+    {
+        if (currentStep.dehumidification)
+        {
+            if (currentStep.dehumidificationRepeatDelay)
+                oven->stopRepeatDamper();
+            else
+                oven->closeDamper();
+        }
+
+        if (currentStep.humidification)
+        {
+            if (currentStep.humidificationRepeatDelay)
+                oven->stopRepeatHumidification();
+            else
+                oven->stopHumidification();
+        }
+
+        oven->stopCooking();
+        isWaitingDoorOpened_ = true;
+    }
+
+    currentStepIndex++;
+
+    advance();
+
+    qDebug() << "Next Step After" << remainingTime();
+}
+
+bool AutoCook::advance()
+{
+    Oven *oven = Oven::getInstance();
+
+    CookStep &currentStep = cook.steps[currentStepIndex];
+    switch (Define::classify(currentStep.type))
+    {
+    case Define::PreheatClass:
+        if (oven->currentHumidity() >= currentStep.humidity
+                && oven->currentTemp() >= currentStep.temp)
+        {
+            nextStep();
+
+            return true;
+        }
+        break;
+    case Define::DoorClass:
+        if (isWaitingDoorOpened_)
+        {
+            if (oven->door())
+            {
+                isWaitingDoorOpened_ = false;
+
+                return true;
+            }
+        }
+        else
+        {
+            if (!oven->door())
+            {
+                nextStep();
+
+                return true;
+            }
+        }
+        break;
+    case Define::CookClass:
+    {
+        if (oven->door())
+        {
+            if (!doorOpened)
+            {
+                doorOpened = true;
+
+                if (checkingCoreTemp && currentStepIndex + 1 >= cook.steps.size())
+                {
+                    currentStep.time -= lastCoreTempIncreasedTime.elapsed();
+                }
+                else
+                {
+                    currentStep.time -= stepStartTime.elapsed();
+                }
+            }
+
+            return false;
+        }
+        else if (doorOpened)
+        {
+            doorOpened = false;
+            stepStartTime.start();
+            lastCoreTempIncreasedTime.start();
+            lastCoreTempChangedTime.start();
+        }
+
+        int remainingCurrentStepTime = currentStep.time;
+        if (checkingCoreTemp && currentStepIndex + 1 >= cook.steps.size())
+            remainingCurrentStepTime -= lastCoreTempIncreasedTime.elapsed();
+        else
+            remainingCurrentStepTime -= stepStartTime.elapsed();
+
+        if (remainingCurrentStepTime <= 0)
+        {
+            if (currentStepIndex + 1 < cook.steps.size())
+            {
+                nextStep();
+
+                return true;
+            }
+            else
+            {
+                done_ = true;
+
+                if (currentStep.dehumidification)
+                {
+                    if (currentStep.dehumidificationRepeatDelay)
+                        oven->stopRepeatDamper();
+                    else
+                        oven->closeDamper();
+                }
+
+                if (currentStep.humidification)
+                {
+                    if (currentStep.humidificationRepeatDelay)
+                        oven->stopRepeatHumidification();
+                    else
+                        oven->stopHumidification();
+                }
+
+                oven->stopCooking();
+
+                return true;
+            }
+        }
+        else if (cook.isCoreTempValid() && oven->isInterTempValid())
+        {
+            if (!checkingCoreTemp)
+            {
+                checkingCoreTemp = true;
+                lastCoreTemp = oven->currentInterTemp();
+                lastIncreasedCoreTemp = lastCoreTemp;
+                lastCoreTempChangedTime.start();
+                lastCoreTempIncreasedTime.start();
+            }
+
+
+            int currentCoreTemp = oven->currentInterTemp();
+            if (currentCoreTemp >= cook.coreTemp())
+            {
+                done_ = true;
+
+                if (currentStep.dehumidification)
+                {
+                    if (currentStep.dehumidificationRepeatDelay)
+                        oven->stopRepeatDamper();
+                    else
+                        oven->closeDamper();
+                }
+
+                if (currentStep.humidification)
+                {
+                    if (currentStep.humidificationRepeatDelay)
+                        oven->stopRepeatHumidification();
+                    else
+                        oven->stopHumidification();
+                }
+
+                oven->stopCooking();
+
+                currentStepIndex = cook.steps.size() - 1;
+
+                return true;
+            }
+            else if (currentCoreTemp != lastCoreTemp)
+            {
+                if (currentCoreTemp > lastIncreasedCoreTemp)
+                {
+                    if (currentStepIndex + 1 < cook.steps.size())
+                    {
+                        int otherStepsTime = 0;
+                        for (int idx = currentStepIndex; idx + 1 < cook.steps.size(); idx++)
+                            otherStepsTime += cook.steps[idx].time;
+
+                        otherStepsTime -= stepStartTime.elapsed();
+
+                        int expectedRemainingTime = (cook.coreTemp() - currentCoreTemp) * lastCoreTempChangedTime.elapsed() / (currentCoreTemp - lastCoreTemp);
+                        int expectedLastStepRemainingTime = expectedRemainingTime - otherStepsTime;
+
+                        CookStep &lastStep = cook.steps[cook.steps.size() - 1];
+                        lastStep.time = qMax(expectedLastStepRemainingTime, 30000);
+
+                        lastIncreasedCoreTemp = currentCoreTemp;
+                        lastCoreTempIncreasedTime.start();
+                    }
+                    else
+                    {
+                        CookStep &lastStep = cook.steps[cook.steps.size() - 1];
+
+                        int expectedRemainingTime = (cook.coreTemp() - currentCoreTemp) * lastCoreTempChangedTime.elapsed() / (currentCoreTemp - lastCoreTemp);
+
+                        qDebug() << "cook.coreTemp()" << cook.coreTemp();
+                        qDebug() << "currentCoreTemp" << currentCoreTemp;
+                        qDebug() << "lastCoreTemp" << lastCoreTemp;
+                        qDebug() << "lastCoreTempChangedTime.elapsed()" << lastCoreTempChangedTime.elapsed();
+                        qDebug() << "expectedRemainingTime" << expectedRemainingTime;
+
+                        if (expectedRemainingTime > 30000)
+                        {
+                            lastStep.time = expectedRemainingTime;
+                            lastCoreTempIncreasedTime.start();
+                        }
+                        else
+                        {
+                            int currentRemainingTime = lastStep.time - lastCoreTempIncreasedTime.elapsed();
+
+                            qDebug() << "lastCoreTempIncreasedTime" << lastCoreTempIncreasedTime;
+                            qDebug() << "currentRemainingTime" << currentRemainingTime;
+
+                            if (currentRemainingTime > 30000)
+                            {
+                                lastStep.time = 30000;
+                                lastCoreTempIncreasedTime.start();
+                            }
+                            else if (expectedRemainingTime > currentRemainingTime)
+                            {
+                                lastStep.time = expectedRemainingTime;
+                                lastCoreTempIncreasedTime.start();
+                            }
+                        }
+                    }
+                }
+
+                lastCoreTemp = currentCoreTemp;
+                lastCoreTempChangedTime.start();
+            }
+
+
+//            int currentCoreTemp = oven->currentInterTemp();
+//            if (currentCoreTemp != lastCoreTemp)
+//            {
+//                int remainingStepsTime = 0;
+//                for (int idx = currentStepIndex + 1; idx < cook.steps.size(); idx++)
+//                    remainingStepsTime += cook.steps[idx].time;
+
+//                int currentRemainingTime = currentStep.time - lastCoreTempTime.elapsed() + remainingStepsTime;
+//                int expectedTime = (cook.coreTemp() - currentCoreTemp) * qAbs(lastCoreTempTime.elapsed() / (currentCoreTemp - lastCoreTemp));
+//                int expectedCurrentStepTime = expectedTime - remainingStepsTime;
+
+//                for (int idx = currentStepIndex; idx < cook.steps.size(); idx++)
+//                {
+//                    CookStep &step = cook.steps[idx];
+//                    if (expectedCurrentStepTime > 0)
+//                    {
+//                        step.time = expectedCurrentStepTime;
+//                        break;
+//                    }
+//                    else
+//                    {
+//                        expectedCurrentStepTime += step.time;
+//                        step.time = 0;
+//                    }
+//                }
+
+//                lastCoreTemp = oven->currentInterTemp();
+//                lastCoreTempTime.start();
+//                stepStartTime.start();
+
+//                advance();
+
+//                return true;
+//            }
+        }
+    }
+    case Define::InvalidClass:
+            break;
+    }
+
+    return false;
+}
+
+int AutoCook::remainingTime()
+{
+    if (done_)
+    {
+        return 0;
+    }
+    else if (checkingCoreTemp && currentStepIndex + 1 >= cook.steps.size())
+    {
+        CookStep &step = cook.steps[cook.steps.size() - 1];
+        int t = step.time;
+        if (!doorOpened)
+            t -= lastCoreTempIncreasedTime.elapsed();
+
+        return t / 1000;
+    }
+    else
+    {
+        int t = 0;
+        for (int i = currentStepIndex; i < cook.steps.size(); i++)
+            t += cook.steps[i].time;
+
+        if (!doorOpened && Define::classify(cook.steps[currentStepIndex].type) == Define::CookClass)
+            t -= stepStartTime.elapsed();
+
+        return t / 1000;
+    }
+}
diff --git a/app/gui/oven_control/autocook.h b/app/gui/oven_control/autocook.h
new file mode 100644
index 0000000..3788089
--- /dev/null
+++ b/app/gui/oven_control/autocook.h
@@ -0,0 +1,42 @@
+#ifndef AUTOCOOK_H
+#define AUTOCOOK_H
+
+#include "oven.h"
+#include "cook.h"
+
+class AutoCook
+{
+public:
+    AutoCook();
+    AutoCook(Cook cook);
+
+    void startStep();
+    void nextStep();
+
+    bool advance();
+
+    int remainingTime();
+    bool isWaitingDoorOpened() { return isWaitingDoorOpened_; }
+    bool done() { return done_; }
+
+    Cook cook;
+    int currentStepIndex;
+
+    int startHumidity;
+    int startTemp;
+
+private:
+    bool done_;
+    bool isWaitingDoorOpened_;
+
+    bool doorOpened;
+
+    QTime stepStartTime;
+    bool checkingCoreTemp;
+    int lastCoreTemp;
+    int lastIncreasedCoreTemp;
+    QTime lastCoreTempChangedTime;
+    QTime lastCoreTempIncreasedTime;
+};
+
+#endif // AUTOCOOK_H
diff --git a/app/gui/oven_control/autocookconfigwindow.cpp b/app/gui/oven_control/autocookconfigwindow.cpp
index d30f026..6f6e66f 100644
--- a/app/gui/oven_control/autocookconfigwindow.cpp
+++ b/app/gui/oven_control/autocookconfigwindow.cpp
@@ -1,7 +1,9 @@
 #include "autocookconfigwindow.h"
 #include "ui_autocookconfigwindow.h"
 
-AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, AbstractCook *cook) :
+#include "autocookwindow.h"
+
+AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Cook cook) :
     QMainWindow(parent),
     ui(new Ui::AutoCookConfigWindow),
     oven(oven),
@@ -12,13 +14,9 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
     ui->clockContainer->setParent(ui->upperStack);
     setAttribute(Qt::WA_DeleteOnClose);
 
-    ui->cookTypeIcon->setPixmap(Cook::icon(cook->type()));
-    ui->selectCookButton->setText(cook->name());
-
     configWidgets.append(
                 ConfigWidget {
                     ui->configButton_1,
-                    ui->configBlock_1,
                     ui->configMinLabel_1,
                     ui->configMaxLabel_1,
                     ui->configCurrentLabel_1,
@@ -27,7 +25,6 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
     configWidgets.append(
                 ConfigWidget {
                     ui->configButton_2,
-                    ui->configBlock_2,
                     ui->configMinLabel_2,
                     ui->configMaxLabel_2,
                     ui->configCurrentLabel_2,
@@ -36,7 +33,6 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
     configWidgets.append(
                 ConfigWidget {
                     ui->configButton_3,
-                    ui->configBlock_3,
                     ui->configMinLabel_3,
                     ui->configMaxLabel_3,
                     ui->configCurrentLabel_3,
@@ -45,7 +41,6 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
     configWidgets.append(
                 ConfigWidget {
                     ui->configButton_4,
-                    ui->configBlock_4,
                     ui->configMinLabel_4,
                     ui->configMaxLabel_4,
                     ui->configCurrentLabel_4,
@@ -54,21 +49,46 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
     configWidgets.append(
                 ConfigWidget {
                     ui->configButton_5,
-                    ui->configBlock_5,
                     ui->configMinLabel_5,
                     ui->configMaxLabel_5,
                     ui->configCurrentLabel_5,
                     ui->configSlider_5
                 });
 
+    cookStartTimer.setSingleShot(true);
+    cookStartTimer.setInterval(3000);
+    connect(&cookStartTimer, SIGNAL(timeout()), SLOT(start()));
+
+    foreach (ConfigWidget w, configWidgets)
+    {
+        connect(w.button, SIGNAL(pressed()), SLOT(stopTimer()));
+        connect(w.button, SIGNAL(released()), SLOT(startTimer()));
+        connect(w.slider, SIGNAL(sliderPressed()), SLOT(stopTimer()));
+        connect(w.slider, SIGNAL(sliderReleased()), SLOT(startTimer()));
+    }
+
+    setupUi();
+
+    startTimer();
+}
+
+AutoCookConfigWindow::~AutoCookConfigWindow()
+{
+    delete ui;
+}
+
+void AutoCookConfigWindow::setupUi()
+{
+    ui->cookTypeIcon->setPixmap(Define::icon(cook.type));
+    ui->selectCookButton->setText(cook.name);
+
     for (int idx = 0; idx < 5; idx++)
     {
-        AbstractCookConfig *config = cook->configurations[idx];
-        if (config == NULL)
+        CookConfig config = cook.configs[idx];
+        if (config.type == Define::ConfigNotUsed)
         {
             ConfigWidget cw = configWidgets.at(idx);
             cw.button->hide();
-            cw.block->hide();
             cw.minimum->hide();
             cw.maximum->hide();
             cw.current->hide();
@@ -78,29 +98,29 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
         {
             ConfigWidget cw = configWidgets.at(idx);
             cw.button->setStyleSheet(
-                        "QPushButton { border-image: url("
-                         + config->icon()
-                         + ") } QPushButton::pressed { border-image: url("
-                         + config->overlayIcon()
+                        "QPushButton { image: url("
+                         + Define::icon(config.type)
+                         + ") } QPushButton::pressed { image: url("
+                         + Define::iconOverlay(config.type)
                          + ") }");
 
-            cw.minimum->setText(config->minLabel());
-            cw.maximum->setText(config->maxLabel());
+            cw.minimum->setText(Define::minimum(config.type));
+            cw.maximum->setText(Define::maximum(config.type));
             cw.slider->blockSignals(true);
             cw.slider->setMinimum(1);
-            cw.slider->setMaximum(config->count());
-            cw.slider->setValue(config->current());
+            cw.slider->setMaximum(config.maximum);
+            cw.slider->setValue(config.current);
             cw.slider->blockSignals(false);
 
-            switch (config->type())
+            switch (config.type)
             {
-            case Cook::Time:
+            case Define::Time:
                 cw.slider->setProperty("sliderColor", "white");
                 break;
-            case Cook::BurnDegree:
+            case Define::BurnDegree:
                 cw.slider->setProperty("sliderColor", "yellow");
                 break;
-            case Cook::Brightness:
+            case Define::Brightness:
                 cw.slider->setProperty("sliderColor", "red");
                 break;
             default:
@@ -108,61 +128,32 @@ AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Oven *oven, Abstract
                 break;
             }
 
-            cw.slider->style()->unpolish(cw.slider);
-            cw.slider->style()->polish(cw.slider);
-            cw.slider->update();
+//            cw.slider->style()->unpolish(cw.slider);
+//            cw.slider->style()->polish(cw.slider);
+//            cw.slider->update();
 
             connect(cw.slider, SIGNAL(valueChanged(int)), SLOT(updateConfig()));
         }
     }
 
-    if (cook->interTempEnabled())
-    {
-        interTempEnabled = true;
-
-        ConfigWidget cw = configWidgets.at(3);
-        cw.button->show();
-        cw.button->setStyleSheet(
-                    "QPushButton {"
-                    "  border-image: url(:/images/images/auto/011_icon_04_ov_01.png)"
-                    "} QPushButton::pressed {"
-                    "  border-image: url(:/images/images/auto/011_icon_04_ov.png)"
-                    "}");
-
-        cw.block->show();
-        cw.minimum->hide();
-        cw.maximum->hide();
-        cw.current->hide();
-        cw.slider->hide();
-
-        connect(cw.button, SIGNAL(clicked()), SLOT(changeInterTemp()));
-    }
-
-}
-
-AutoCookConfigWindow::~AutoCookConfigWindow()
-{
-    delete ui;
+    updateView();
 }
 
 void AutoCookConfigWindow::updateView()
 {
     for (int idx = 0; idx < 5; idx++)
     {
-        if (interTempEnabled && idx == 3)
-            continue;
-
-        AbstractCookConfig *config = cook->configurations[idx];
-        if (config == NULL)
+        CookConfig config = cook.configs[idx];
+        if (config.type == Define::ConfigNotUsed)
             continue;
 
         ConfigWidget cw = configWidgets.at(idx);
 
-        switch (config->type())
+        switch (config.type)
         {
-        case Cook::Time:
+        case Define::Time:
         {
-            int time = cook->time();
+            int time = cook.time();
             if (time >= 3600)
                 cw.current->setText(QString().sprintf(
                         "%d"
@@ -186,43 +177,54 @@ void AutoCookConfigWindow::updateView()
                         time));
             break;
         }
-        case Cook::BurnDegree:
-            cw.slider->setProperty("sliderColor", "yellow");
-            break;
-        case Cook::Brightness:
-            cw.slider->setProperty("sliderColor", "red");
+        case Define::BurnDegree:
+            cw.current->setText(QString().sprintf(
+                    "%d"
+                    "<span style=\"font-size:11pt;\">℃</span>",
+                    cook.coreTemp()));
             break;
         default:
-            cw.slider->setProperty("sliderColor", "blue");
+            cw.current->setText(QString().sprintf(
+                    "%d"
+                    "<span style=\"font-size:11pt;\">/%d</span>",
+                    config.current, config.maximum));
             break;
         }
     }
-
-    if (cook->interTempEnabled())
-    {
-        ConfigWidget cw = configWidgets.at(3);
-        cw.button->show();
-        cw.button->setStyleSheet(
-                    "QPushButton {"
-                    "  border-image: url(:/images/images/auto/011_icon_04_ov_01.png)"
-                    "} QPushButton::pressed {"
-                    "  border-image: url(:/images/images/auto/011_icon_04_ov.png)"
-                    "}");
-
-        cw.block->show();
-        cw.minimum->hide();
-        cw.maximum->hide();
-        cw.current->hide();
-        cw.slider->hide();
-    }
 }
 
 void AutoCookConfigWindow::updateConfig()
 {
+    cook.setConfig(ui->configSlider_1->value(),
+                   ui->configSlider_2->value(),
+                   ui->configSlider_3->value(),
+                   ui->configSlider_4->value(),
+                   ui->configSlider_5->value());
+
+    updateView();
+}
+
+void AutoCookConfigWindow::startTimer()
+{
+    cookStartTimer.start();
+}
+
+void AutoCookConfigWindow::stopTimer()
+{
+    cookStartTimer.stop();
+}
+
+void AutoCookConfigWindow::start()
+{
+    close();
 
+    AutoCookWindow *w = new AutoCookWindow(parentWidget(), cook);
+    w->setWindowModality(Qt::WindowModal);
+    w->showFullScreen();
+    w->raise();
 }
 
-void AutoCookConfigWindow::changeInterTemp()
+void AutoCookConfigWindow::on_backButton_clicked()
 {
-    cook->setInterTempEnabled(!cook->interTempEnabled());
+    close();
 }
diff --git a/app/gui/oven_control/autocookconfigwindow.h b/app/gui/oven_control/autocookconfigwindow.h
index 5f594b3..b7eba44 100644
--- a/app/gui/oven_control/autocookconfigwindow.h
+++ b/app/gui/oven_control/autocookconfigwindow.h
@@ -8,7 +8,8 @@
 #include <QSlider>
 
 #include "oven.h"
-#include "cook.h"
+//#include "cook.h"
+#include "cookbook.h"
 
 namespace Ui {
 class AutoCookConfigWindow;
@@ -19,20 +20,19 @@ class AutoCookConfigWindow : public QMainWindow
     Q_OBJECT
 
 public:
-    explicit AutoCookConfigWindow(QWidget *parent = 0, Oven *oven = 0, AbstractCook *cook = 0);
+    explicit AutoCookConfigWindow(QWidget *parent = 0, Oven *oven = 0,
+                                  Cook cook = Cook(Define::Poultry, "/prime/cookbook/poultry/chicken", "Chicken"));
     ~AutoCookConfigWindow();
 
 private:
     Ui::AutoCookConfigWindow *ui;
     Oven *oven;
-    AbstractCook *cook;
+    Cook cook;
 
     QTimer cookStartTimer;
-    bool interTempEnabled;
 
     struct ConfigWidget {
         QPushButton *button;
-        QWidget *block;
         QLabel *minimum;
         QLabel *maximum;
         QLabel *current;
@@ -42,9 +42,14 @@ private:
     QList<ConfigWidget> configWidgets;
 
 private slots:
+    void setupUi();
     void updateView();
     void updateConfig();
-    void changeInterTemp();
+    void startTimer();
+    void stopTimer();
+    void start();
+
+    void on_backButton_clicked();
 };
 
 #endif // AUTOCOOKCONFIGWINDOW_H
diff --git a/app/gui/oven_control/autocookconfigwindow.ui b/app/gui/oven_control/autocookconfigwindow.ui
index 89046ea..ca5e35b 100644
--- a/app/gui/oven_control/autocookconfigwindow.ui
+++ b/app/gui/oven_control/autocookconfigwindow.ui
@@ -14,11 +14,11 @@
    <string>MainWindow</string>
   </property>
   <property name="styleSheet">
-   <string notr="true">#centralwidget { background-image: url(:/images/background/auto_config.png); }
+   <string notr="true">#centralwidget { background-image: url(:/images/background/auto.png); }
 #bottomBar { background-image: url(:/images/bottom_bar/background.png); }
 
 QSlider::groove {
-background-image: url(:/images/images/auto/gau_04.png);
+background-image: url(:/images/slider/groove.png);
 background-repeat: no-repeat;
 background-position: center;
 }
@@ -30,31 +30,38 @@ margin: 0px 5px;
 }
 
 QSlider[sliderColor=&quot;red&quot;]::sub-page {
-background-image: url(:/images/images/auto/gau_05.png);
+background-image: url(:/images/slider/sub_red.png);
 }
 
 QSlider[sliderColor=&quot;yellow&quot;]::sub-page {
-background-image: url(:/images/images/auto/gau_06.png);
+background-image: url(:/images/slider/sub_yellow.png);
 }
 
 QSlider[sliderColor=&quot;white&quot;]::sub-page {
-background-image: url(:/images/images/auto/gau_07.png);
+background-image: url(:/images/slider/sub_white.png);
 }
 
 QSlider[sliderColor=&quot;blue&quot;]::sub-page {
-background-image: url(:/images/images/auto/gau_09.png);
+background-image: url(:/images/slider/sub_blue.png);
 }
 
 QSlider[sliderColor=&quot;green&quot;]::sub-page {
-background-image: url(:/images/images/auto/sys_icon_01_gau.png);
+background-image: url(:/images/slider/sub_green.png);
 }
 
 QSlider::handle {
-background-image: url(:/images/images/manual/graphe_BTN_Bigsize.png);
+background-image: url(:/images/slider/handle_big.png);
 background-repeat: no-repeat;
 background-position: center;
 width: 23px;
 height: 33px;
+}
+
+QPushButton[style=&quot;icon&quot;] {
+background-image: url(:/images/slider_icon/background.png);
+background-repeat: no-repeat;
+background-position: center;
+border: none;
 }</string>
   </property>
   <widget class="QWidget" name="centralwidget">
@@ -109,14 +116,14 @@ height: 33px;
       </sizepolicy>
      </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/images/auto/006_sys_icon_03.png); }
-QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_03_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
-    <widget class="QPushButton" name="backButton_3">
+    <widget class="QPushButton" name="washButton">
      <property name="geometry">
       <rect>
        <x>514</x>
@@ -132,14 +139,14 @@ QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_03_ov.
       </sizepolicy>
      </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/images/auto/006_sys_icon_05.png); }
-QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_05_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/wash.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
-    <widget class="QPushButton" name="backButton_2">
+    <widget class="QPushButton" name="configButton">
      <property name="geometry">
       <rect>
        <x>288</x>
@@ -155,14 +162,14 @@ QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_05_ov.
       </sizepolicy>
      </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/images/auto/006_sys_icon_01.png); }
-QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_01_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
-    <widget class="QPushButton" name="backButton_4">
+    <widget class="QPushButton" name="helpButton">
      <property name="geometry">
       <rect>
        <x>627</x>
@@ -178,14 +185,14 @@ QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_01_ov.
       </sizepolicy>
      </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/images/auto/006_sys_icon_02.png); }
-QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_02_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
-    <widget class="QPushButton" name="backButton_5">
+    <widget class="QPushButton" name="favoritesButton">
      <property name="geometry">
       <rect>
        <x>401</x>
@@ -201,7 +208,8 @@ QPushButton:pressed { border-image: url(:/images/images/auto/006_sys_icon_02_ov.
       </sizepolicy>
      </property>
      <property name="styleSheet">
-      <string notr="true"/>
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/favorites.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
@@ -632,8 +640,8 @@ border-image: url(:/images/button/152_ov.png);
      <string/>
     </property>
     <property name="icon">
-     <iconset>
-      <normaloff>:/images/images/auto/btn_icon_01.png</normaloff>:/images/images/auto/btn_icon_01.png</iconset>
+     <iconset resource="resources.qrc">
+      <normaloff>:/images/auto_button/btn_icon_01.png</normaloff>:/images/auto_button/btn_icon_01.png</iconset>
     </property>
     <property name="iconSize">
      <size>
@@ -645,25 +653,18 @@ border-image: url(:/images/button/152_ov.png);
    <widget class="QPushButton" name="configButton_1">
     <property name="geometry">
      <rect>
-      <x>49</x>
-      <y>627</y>
-      <width>96</width>
-      <height>96</height>
+      <x>27</x>
+      <y>605</y>
+      <width>140</width>
+      <height>140</height>
      </rect>
     </property>
-    <property name="styleSheet">
-     <string notr="true">QPushButton {
-	border-image: url(:/images/images/manual/011_icon_01.png);
-}
-
-QPushButton:pressed {
-	border-image: url(:/images/images/manual/011_icon_01_ov.png);
-}
-</string>
-    </property>
     <property name="text">
      <string/>
     </property>
+    <property name="style" stdset="0">
+     <string notr="true">icon</string>
+    </property>
    </widget>
    <widget class="QSlider" name="configSlider_4">
     <property name="geometry">
@@ -693,25 +694,18 @@ QPushButton:pressed {
    <widget class="QPushButton" name="configButton_4">
     <property name="geometry">
      <rect>
-      <x>49</x>
-      <y>1137</y>
-      <width>96</width>
-      <height>96</height>
+      <x>27</x>
+      <y>1115</y>
+      <width>140</width>
+      <height>140</height>
      </rect>
     </property>
-    <property name="styleSheet">
-     <string notr="true">QPushButton {
-	border-image: url(:/images/images/manual/011_icon_01.png);
-}
-
-QPushButton:pressed {
-	border-image: url(:/images/images/manual/011_icon_01_ov.png);
-}
-</string>
-    </property>
     <property name="text">
      <string/>
     </property>
+    <property name="style" stdset="0">
+     <string notr="true">icon</string>
+    </property>
    </widget>
    <widget class="QLabel" name="configMaxLabel_2">
     <property name="enabled">
@@ -775,32 +769,6 @@ QPushButton:pressed {
      <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
     </property>
    </widget>
-   <widget class="QWidget" name="configBlock_3" native="true">
-    <property name="geometry">
-     <rect>
-      <x>27</x>
-      <y>935</y>
-      <width>140</width>
-      <height>140</height>
-     </rect>
-    </property>
-    <property name="styleSheet">
-     <string notr="true">background-image: url(:/images/images/manual/010_icon_block.png);</string>
-    </property>
-   </widget>
-   <widget class="QWidget" name="configBlock_4" native="true">
-    <property name="geometry">
-     <rect>
-      <x>27</x>
-      <y>1115</y>
-      <width>140</width>
-      <height>140</height>
-     </rect>
-    </property>
-    <property name="styleSheet">
-     <string notr="true">background-image: url(:/images/images/manual/010_icon_block.png);</string>
-    </property>
-   </widget>
    <widget class="QSlider" name="configSlider_2">
     <property name="geometry">
      <rect>
@@ -1042,25 +1010,18 @@ QPushButton:pressed {
    <widget class="QPushButton" name="configButton_2">
     <property name="geometry">
      <rect>
-      <x>49</x>
-      <y>787</y>
-      <width>96</width>
-      <height>96</height>
+      <x>27</x>
+      <y>765</y>
+      <width>140</width>
+      <height>140</height>
      </rect>
     </property>
-    <property name="styleSheet">
-     <string notr="true">QPushButton {
-	border-image: url(:/images/images/manual/011_icon_01.png);
-}
-
-QPushButton:pressed {
-	border-image: url(:/images/images/manual/011_icon_01_ov.png);
-}
-</string>
-    </property>
     <property name="text">
      <string/>
     </property>
+    <property name="style" stdset="0">
+     <string notr="true">icon</string>
+    </property>
    </widget>
    <widget class="QLabel" name="configMinLabel_1">
     <property name="enabled">
@@ -1124,19 +1085,6 @@ QPushButton:pressed {
      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
     </property>
    </widget>
-   <widget class="QWidget" name="configBlock_2" native="true">
-    <property name="geometry">
-     <rect>
-      <x>27</x>
-      <y>765</y>
-      <width>140</width>
-      <height>140</height>
-     </rect>
-    </property>
-    <property name="styleSheet">
-     <string notr="true">background-image: url(:/images/images/manual/010_icon_block.png);</string>
-    </property>
-   </widget>
    <widget class="QLabel" name="configMaxLabel_1">
     <property name="enabled">
      <bool>true</bool>
@@ -1346,20 +1294,7 @@ QPushButton:pressed {
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
-   <widget class="QWidget" name="configBlock_1" native="true">
-    <property name="geometry">
-     <rect>
-      <x>27</x>
-      <y>605</y>
-      <width>140</width>
-      <height>140</height>
-     </rect>
-    </property>
-    <property name="styleSheet">
-     <string notr="true">background-image: url(:/images/images/manual/010_icon_block.png);</string>
-    </property>
-   </widget>
-   <widget class="QWidget" name="configBlock_5" native="true">
+   <widget class="QPushButton" name="configButton_5">
     <property name="geometry">
      <rect>
       <x>27</x>
@@ -1368,32 +1303,12 @@ QPushButton:pressed {
       <height>140</height>
      </rect>
     </property>
-    <property name="styleSheet">
-     <string notr="true">background-image: url(:/images/images/manual/010_icon_block.png);</string>
-    </property>
-   </widget>
-   <widget class="QPushButton" name="configButton_5">
-    <property name="geometry">
-     <rect>
-      <x>49</x>
-      <y>1307</y>
-      <width>96</width>
-      <height>96</height>
-     </rect>
-    </property>
-    <property name="styleSheet">
-     <string notr="true">QPushButton {
-	border-image: url(:/images/images/manual/011_icon_01.png);
-}
-
-QPushButton:pressed {
-	border-image: url(:/images/images/manual/011_icon_01_ov.png);
-}
-</string>
-    </property>
     <property name="text">
      <string/>
     </property>
+    <property name="style" stdset="0">
+     <string notr="true">icon</string>
+    </property>
    </widget>
    <widget class="QSlider" name="configSlider_5">
     <property name="geometry">
@@ -1487,25 +1402,18 @@ QPushButton:pressed {
    <widget class="QPushButton" name="configButton_3">
     <property name="geometry">
      <rect>
-      <x>49</x>
-      <y>957</y>
-      <width>96</width>
-      <height>96</height>
+      <x>27</x>
+      <y>935</y>
+      <width>140</width>
+      <height>140</height>
      </rect>
     </property>
-    <property name="styleSheet">
-     <string notr="true">QPushButton {
-	border-image: url(:/images/images/manual/011_icon_01.png);
-}
-
-QPushButton:pressed {
-	border-image: url(:/images/images/manual/011_icon_01_ov.png);
-}
-</string>
-    </property>
     <property name="text">
      <string/>
     </property>
+    <property name="style" stdset="0">
+     <string notr="true">icon</string>
+    </property>
    </widget>
    <widget class="QSlider" name="configSlider_1">
     <property name="geometry">
@@ -1538,41 +1446,6 @@ QPushButton:pressed {
      <number>1</number>
     </property>
    </widget>
-   <zorder>configBlock_4</zorder>
-   <zorder>configBlock_2</zorder>
-   <zorder>configBlock_1</zorder>
-   <zorder>upperStack</zorder>
-   <zorder>bottomBar</zorder>
-   <zorder>configMaxLabel_5</zorder>
-   <zorder>configMinLabel_5</zorder>
-   <zorder>selectCookButton</zorder>
-   <zorder>configCurrentLabel_2</zorder>
-   <zorder>configMaxLabel_3</zorder>
-   <zorder>configMinLabel_3</zorder>
-   <zorder>configMinLabel_4</zorder>
-   <zorder>pushButton_4</zorder>
-   <zorder>configButton_1</zorder>
-   <zorder>configSlider_4</zorder>
-   <zorder>configButton_4</zorder>
-   <zorder>configMaxLabel_2</zorder>
-   <zorder>configBlock_3</zorder>
-   <zorder>configSlider_2</zorder>
-   <zorder>configCurrentLabel_5</zorder>
-   <zorder>configMinLabel_2</zorder>
-   <zorder>configSlider_3</zorder>
-   <zorder>configMaxLabel_4</zorder>
-   <zorder>configButton_2</zorder>
-   <zorder>configMinLabel_1</zorder>
-   <zorder>configMaxLabel_1</zorder>
-   <zorder>configCurrentLabel_3</zorder>
-   <zorder>configCurrentLabel_1</zorder>
-   <zorder>cookTypeIcon</zorder>
-   <zorder>configBlock_5</zorder>
-   <zorder>configButton_5</zorder>
-   <zorder>configSlider_5</zorder>
-   <zorder>configCurrentLabel_4</zorder>
-   <zorder>configButton_3</zorder>
-   <zorder>configSlider_1</zorder>
   </widget>
  </widget>
  <customwidgets>
@@ -1583,6 +1456,8 @@ QPushButton:pressed {
    <container>1</container>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="resources.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/app/gui/oven_control/autocookselectionwindow.cpp b/app/gui/oven_control/autocookselectionwindow.cpp
index 38e2348..89e0dd0 100644
--- a/app/gui/oven_control/autocookselectionwindow.cpp
+++ b/app/gui/oven_control/autocookselectionwindow.cpp
@@ -4,9 +4,10 @@
 #include <QSignalMapper>
 #include <QtDebug>
 
-#include "autocookwindow.h"
+#include "autocookconfigwindow.h"
+//#include "autocookwindow.h"
 
-AutoCookSelectionWindow::AutoCookSelectionWindow(QWidget *parent, Oven *oven, Cook::CookType type) :
+AutoCookSelectionWindow::AutoCookSelectionWindow(QWidget *parent, Oven *oven, Define::CookType type) :
     QMainWindow(parent),
     ui(new Ui::AutoCookSelectionWindow),
     oven(oven), type(type), autoCookWindowOpened(false)
@@ -16,20 +17,9 @@ AutoCookSelectionWindow::AutoCookSelectionWindow(QWidget *parent, Oven *oven, Co
     ui->clockContainer->setParent(ui->upperStack);
     setAttribute(Qt::WA_DeleteOnClose);
 
-    ui->cookTypeIcon->setPixmap(Cook::icon(type));
+    ui->cookTypeIcon->setPixmap(Define::icon(type));
 
-    switch (type)
-    {
-    case Cook::Poultry:
-        cookList.append(new ChickenCook);
-        break;
-    case Cook::Meat:
-        cookList.append(new MeatPie);
-        break;
-    case Cook::Bread:
-        cookList.append(new Croissant);
-        break;
-    }
+    book = CookBook(type);
 
     QSignalMapper *sm = new QSignalMapper(this);
     connect(sm, SIGNAL(mapped(int)), SLOT(onCookSelected(int)));
@@ -47,7 +37,7 @@ AutoCookSelectionWindow::AutoCookSelectionWindow(QWidget *parent, Oven *oven, Co
     "border-image: url(:/images/button/288_ov.png);\n"
     "}");
 
-    for (int idx = 0; idx < cookList.size(); idx++)
+    for (int idx = 0; idx < book.list.size(); idx++)
     {
         int x = 12 + (idx % 3) * 294;
         int y = 615 + (idx / 3) * 80;
@@ -56,7 +46,7 @@ AutoCookSelectionWindow::AutoCookSelectionWindow(QWidget *parent, Oven *oven, Co
         pb->setGeometry(QRect(x, y, 288, 70));
         pb->setFont(font);
         pb->setStyleSheet(stylesheet);
-        pb->setText(cookList.at(idx)->name());
+        pb->setText(book.list.at(idx));
 
         sm->setMapping(pb, idx);
         connect(pb, SIGNAL(clicked()), sm, SLOT(map()));
@@ -66,9 +56,6 @@ AutoCookSelectionWindow::AutoCookSelectionWindow(QWidget *parent, Oven *oven, Co
 AutoCookSelectionWindow::~AutoCookSelectionWindow()
 {
     delete ui;
-
-    foreach (AbstractCook *cook, cookList)
-        delete cook;
 }
 
 void AutoCookSelectionWindow::onCookSelected(int idx)
@@ -78,11 +65,12 @@ void AutoCookSelectionWindow::onCookSelected(int idx)
 
     autoCookWindowOpened = true;
 
-    AutoCookWindow *w = new AutoCookWindow(parentWidget(), oven, cookList.takeAt(idx));
+    close();
+
+    AutoCookConfigWindow *w = new AutoCookConfigWindow(parentWidget(), oven, book.get(idx));
     w->setWindowModality(Qt::WindowModal);
     w->showFullScreen();
-
-    close();
+    w->raise();
 }
 
 void AutoCookSelectionWindow::on_backButton_clicked()
diff --git a/app/gui/oven_control/autocookselectionwindow.h b/app/gui/oven_control/autocookselectionwindow.h
index e116740..3addaac 100644
--- a/app/gui/oven_control/autocookselectionwindow.h
+++ b/app/gui/oven_control/autocookselectionwindow.h
@@ -4,7 +4,7 @@
 #include <QMainWindow>
 
 #include "oven.h"
-#include "cook.h"
+#include "cookbook.h"
 
 namespace Ui {
 class AutoCookSelectionWindow;
@@ -15,7 +15,7 @@ class AutoCookSelectionWindow : public QMainWindow
     Q_OBJECT
 
 public:
-    explicit AutoCookSelectionWindow(QWidget *parent = 0, Oven *oven = 0, Cook::CookType type = Cook::Poultry);
+    explicit AutoCookSelectionWindow(QWidget *parent = 0, Oven *oven = 0, Define::CookType type = Define::Poultry);
     ~AutoCookSelectionWindow();
 
 private slots:
@@ -26,8 +26,9 @@ private slots:
 private:
     Ui::AutoCookSelectionWindow *ui;
     Oven *oven;
-    Cook::CookType type;
-    QList<AbstractCook *> cookList;
+    Define::CookType type;
+    CookBook book;
+
     bool autoCookWindowOpened;
 };
 
diff --git a/app/gui/oven_control/autocookwindow.cpp b/app/gui/oven_control/autocookwindow.cpp
index 31027ea..cb2c026 100644
--- a/app/gui/oven_control/autocookwindow.cpp
+++ b/app/gui/oven_control/autocookwindow.cpp
@@ -1,104 +1,47 @@
 #include "autocookwindow.h"
 #include "ui_autocookwindow.h"
 
-AutoCookWindow::AutoCookWindow(QWidget *parent, Oven *oven, AbstractCook *cook) :
+#include "keepwarmpopup.h"
+
+AutoCookWindow::AutoCookWindow(QWidget *parent, Cook cook) :
     QMainWindow(parent),
     ui(new Ui::AutoCookWindow),
-    oven(oven),
-    cook(cook),
-    started(false),
-    done(false),
-    selectedStepIndex(0)
+    cook(cook)
 {
     ui->setupUi(this);
 
     ui->clockContainer->setParent(ui->upperStack);
     setAttribute(Qt::WA_DeleteOnClose);
 
-    connect(oven, SIGNAL(changed(Oven*)), SLOT(onOvenUpdated()));
-    oven->setDefault(Oven::CombinationMode);
-
-    lastHumidity = oven->currentHumidity();
-    lastTemp = oven->currentTemp();
-    lastDoorView = Cook::Invalid;
-
-    QTimer *cookStartTimer = new QTimer(this);
-    cookStartTimer->setSingleShot(true);
-    cookStartTimer->setInterval(3000);
-    connect(cookStartTimer, SIGNAL(timeout()), SLOT(start()));
-
-    connect(ui->configButton_1, SIGNAL(pressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configButton_2, SIGNAL(pressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configButton_3, SIGNAL(pressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configButton_4, SIGNAL(pressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configButton_5, SIGNAL(pressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configButton_1, SIGNAL(released()), SIGNAL(startCookStartTimer()));
-    connect(ui->configButton_2, SIGNAL(released()), SIGNAL(startCookStartTimer()));
-    connect(ui->configButton_3, SIGNAL(released()), SIGNAL(startCookStartTimer()));
-    connect(ui->configButton_4, SIGNAL(released()), SIGNAL(startCookStartTimer()));
-    connect(ui->configButton_5, SIGNAL(released()), SIGNAL(startCookStartTimer()));
-
-    connect(ui->configSlider_1, SIGNAL(sliderPressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configSlider_2, SIGNAL(sliderPressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configSlider_3, SIGNAL(sliderPressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configSlider_4, SIGNAL(sliderPressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configSlider_5, SIGNAL(sliderPressed()), SIGNAL(stopCookStartTimer()));
-    connect(ui->configSlider_1, SIGNAL(actionTriggered(int)), SIGNAL(startCookStartTimer()));
-    connect(ui->configSlider_2, SIGNAL(actionTriggered(int)), SIGNAL(startCookStartTimer()));
-    connect(ui->configSlider_3, SIGNAL(actionTriggered(int)), SIGNAL(startCookStartTimer()));
-    connect(ui->configSlider_4, SIGNAL(actionTriggered(int)), SIGNAL(startCookStartTimer()));
-    connect(ui->configSlider_5, SIGNAL(actionTriggered(int)), SIGNAL(startCookStartTimer()));
-
-    connect(this, SIGNAL(stopCookStartTimer()), cookStartTimer, SLOT(stop()));
-    connect(this, SIGNAL(startCookStartTimer()), cookStartTimer, SLOT(start()));
-
-    connect(ui->configSlider_1, SIGNAL(valueChanged(int)), SLOT(onConfigChanged()));
-    connect(ui->configSlider_2, SIGNAL(valueChanged(int)), SLOT(onConfigChanged()));
-    connect(ui->configSlider_3, SIGNAL(valueChanged(int)), SLOT(onConfigChanged()));
-    connect(ui->configSlider_4, SIGNAL(valueChanged(int)), SLOT(onConfigChanged()));
-    connect(ui->configSlider_5, SIGNAL(valueChanged(int)), SLOT(onConfigChanged()));
-
-    connect(ui->configSlider_1, SIGNAL(sliderMoved(int)), SLOT(updateView()));
-    connect(ui->configSlider_2, SIGNAL(sliderMoved(int)), SLOT(updateView()));
-    connect(ui->configSlider_3, SIGNAL(sliderMoved(int)), SLOT(updateView()));
-    connect(ui->configSlider_4, SIGNAL(sliderMoved(int)), SLOT(updateView()));
-    connect(ui->configSlider_5, SIGNAL(sliderMoved(int)), SLOT(updateView()));
-    connect(ui->configSlider_1, SIGNAL(valueChanged(int)), SLOT(updateView()));
-    connect(ui->configSlider_2, SIGNAL(valueChanged(int)), SLOT(updateView()));
-    connect(ui->configSlider_3, SIGNAL(valueChanged(int)), SLOT(updateView()));
-    connect(ui->configSlider_4, SIGNAL(valueChanged(int)), SLOT(updateView()));
-    connect(ui->configSlider_5, SIGNAL(valueChanged(int)), SLOT(updateView()));
-
-
-    checkCookTimer.setInterval(1000);
-    connect(&checkCookTimer, SIGNAL(timeout()), SLOT(checkCook()));
+    autocook = AutoCook(cook);
+    processSelected = false;
+
+    setupUi();
 
+    Oven *oven = Oven::getInstance();
+    connect(oven, SIGNAL(changed(Oven*)), SLOT(updateView()));
 
     returnToCurrentStepTimer.setSingleShot(true);
     returnToCurrentStepTimer.setInterval(3000);
     connect(&returnToCurrentStepTimer, SIGNAL(timeout()), SLOT(returnToCurrentStep()));
 
-
-    showingCurrentHumidity = false;
     showCurrentHumidityTimer.setSingleShot(true);
     showCurrentHumidityTimer.setInterval(3000);
     connect(&showCurrentHumidityTimer, SIGNAL(timeout()), SLOT(showCurrentHumidity()));
 
-    showingCurrentTemp = false;
     showCurrentTempTimer.setSingleShot(true);
     showCurrentTempTimer.setInterval(3000);
     connect(&showCurrentTempTimer, SIGNAL(timeout()), SLOT(showCurrentTemp()));
 
-    setupUi();
+    connect(&checkCookTimer, SIGNAL(timeout()), SLOT(checkCook()));
+    checkCookTimer.start(100);
 
-    cookStartTimer->start();
+    connect(&checkProcessTimer, SIGNAL(timeout()), SLOT(checkProcess()));
 }
 
 AutoCookWindow::~AutoCookWindow()
 {
     delete ui;
-
-    delete cook;
 }
 
 void AutoCookWindow::setupUi()
@@ -109,137 +52,14 @@ void AutoCookWindow::setupUi()
     dryModeIcon.load(":/images/cook_mode/small_dryheat.png");
     combiModeIcon.load(":/images/cook_mode/small_combi.png");
 
-    QString cookTypeIcon = Cook::icon(cook->type());
-    ui->cookTypeIcon_1->setPixmap(cookTypeIcon);
-    ui->cookTypeIcon_2->setPixmap(cookTypeIcon);
-
-    QString name = cook->name();
-    ui->selectCookButton_1->setText(name);
-    ui->selectCookButton_2->setText(name);
+    ui->cookTypeIcon->setPixmap(Define::icon(cook.type));
+    ui->selectCookButton->setText(cook.name);
 
-    for (int idx = 0; idx < 5; idx++)
-    {
-        QPushButton *icon;
-        QLabel *minLabel;
-        QLabel *maxLabel;
-        QLabel *currentLabel;
-        QSlider *slider;
-
-        switch (idx)
-        {
-        case 0:
-            icon = ui->configButton_1;
-            minLabel = ui->configMinLabel_1;
-            maxLabel = ui->configMaxLabel_1;
-            currentLabel = ui->configCurrentLabel_1;
-            slider = ui->configSlider_1;
-            break;
-        case 1:
-            icon = ui->configButton_2;
-            minLabel = ui->configMinLabel_2;
-            maxLabel = ui->configMaxLabel_2;
-            currentLabel = ui->configCurrentLabel_2;
-            slider = ui->configSlider_2;
-            break;
-        case 2:
-            icon = ui->configButton_3;
-            minLabel = ui->configMinLabel_3;
-            maxLabel = ui->configMaxLabel_3;
-            currentLabel = ui->configCurrentLabel_3;
-            slider = ui->configSlider_3;
-            break;
-        case 3:
-            icon = ui->configButton_4;
-            minLabel = ui->configMinLabel_4;
-            maxLabel = ui->configMaxLabel_4;
-            currentLabel = ui->configCurrentLabel_4;
-            slider = ui->configSlider_4;
-            break;
-        case 4:
-            icon = ui->configButton_5;
-            minLabel = ui->configMinLabel_5;
-            maxLabel = ui->configMaxLabel_5;
-            currentLabel = ui->configCurrentLabel_5;
-            slider = ui->configSlider_5;
-            break;
-        }
-
-        AbstractCookConfig *config = cook->configurations[idx];
-        if (config != NULL)
-        {
-            icon->show();
-            icon->setStyleSheet("QPushButton { image: url("
-                                + config->icon()
-                                + ") } QPushButton::pressed { image: url("
-                                + config->overlayIcon()
-                                + ") }");
-            minLabel->show();
-            minLabel->setText(config->minLabel());
-            maxLabel->show();
-            maxLabel->setText(config->maxLabel());
-
-            currentLabel->show();
-
-            slider->show();
-            slider->blockSignals(true);
-            slider->setMinimum(1);
-            slider->setMaximum(config->count());
-            slider->setValue(config->current());
-            slider->blockSignals(false);
-
-            switch (config->type())
-            {
-            case Cook::Time:
-                slider->setProperty("sliderColor", QString("white"));
-                break;
-            case Cook::BurnDegree:
-                slider->setProperty("sliderColor", QString("yellow"));
-                break;
-            case Cook::Brightness:
-                slider->setProperty("sliderColor", QString("red"));
-                break;
-            default:
-                slider->setProperty("sliderColor", QString("blue"));
-                break;
-            }
-
-            slider->style()->unpolish(slider);
-            slider->style()->polish(slider);
-            slider->update();
-        }
-        else
-        {
-            icon->hide();
-            minLabel->hide();
-            maxLabel->hide();
-            currentLabel->hide();
-            slider->hide();
-        }
-    }
-
-    if (cook->interTempEnabled())
-    {
-        ui->configButton_4->show();
-        ui->configButton_4->setStyleSheet(
-                    QString("QPushButton { image: url(")
-                    + ":/images/slider_icon/core_temp_enabled.png"
-                    + ") } QPushButton::pressed { image: url("
-                    + ":/images/slider_icon/core_temp_ov.png"
-                    + ") }"
-                    );
-        ui->configMinLabel_4->hide();
-        ui->configMaxLabel_4->hide();
-        ui->configCurrentLabel_4->hide();
-        ui->configSlider_4->hide();
-
-        interTempEnabled = true;
-    }
-
-    int offsetX = (900 - (cook->stepCount() * 19 * 2 - 19)) / 2;
+    int offsetX = (900 - (cook.steps.size() * 19 * 2 - 19)) / 2;
     int offsetY = 1150;
-    for (int idx = 0; idx < cook->stepCount(); idx++)
+    for (int idx = 0; idx < cook.steps.size(); idx++)
     {
-        QLabel *bullet = new QLabel(ui->cookPage);
+        QLabel *bullet = new QLabel(this);
         bullet->setPixmap(bulletPixmap);
         bullet->setGeometry(offsetX + 19 * 2 * idx, offsetY, 19, 19);
         bullets.append(bullet);
@@ -281,588 +101,533 @@ void AutoCookWindow::setupUi()
     ui->closeDoorAnimation->hide();
     ui->closeDoorArrow->hide();
 
-    updateView();
-}
+    lastViewCookMode = Define::InvalidMode;
+    lastViewCookType = Define::Invalid;
+    lastViewCoreTemp = 999;
+    lastViewDoorType = Define::Invalid;
+    lastViewTime = 0;
+    lastViewStepIndex = -1;
+    selectedStepIndex = 0;
+    showingCurrentHumidity = false;
+    showingCurrentTemp = false;
 
-void AutoCookWindow::updateView()
-{
-//    qDebug() << "updateView";
-    if (started)
+    if (autocook.cook.processes.isEmpty())
     {
-        ui->stackedWidget->setCurrentIndex(1);
-
-        for (int idx = 0; idx < bullets.length(); idx++)
-        {
-            QLabel *bullet = bullets.at(idx);
-            if (idx == selectedStepIndex)
-                bullet->setPixmap(selectedBulletPixmap);
-            else
-                bullet->setPixmap(bulletPixmap);
-        }
-
-        viewStep(cook->step(selectedStepIndex));
-
-        int time = oven->time();
-        if (time >= 3600)
-            ui->timeLabel->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">시간</span> %02d<span style=\"font-size:11pt;\">분</span>", time / 3600, (time % 3600) / 60));
-        else if (time >= 60)
-            ui->timeLabel->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">분</span> %02d<span style=\"font-size:11pt;\">초</span>", time / 60, time % 60));
-        else
-            ui->timeLabel->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">초</span>", time));
-
-        int curInterTemp = oven->currentInterTemp();
-        if (interTempEnabled)
-        {
-            int interTemp = oven->interTemp();
-            ui->interTempLabel->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">℃ / %d</span><span style=\"font-size:9pt;\">℃</span>", curInterTemp, interTemp));
-        }
-        else
-            ui->interTempLabel->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">℃</span>", curInterTemp));
-
-        if (!done)
-        {
-            if (oven->door())
-            {
-                ui->closeDoorAnimation->show();
-                ui->closeDoorArrow->show();
-                ui->openDoorAnimation->hide();
-                ui->openDoorArrow->hide();
-            }
-            else
-            {
-                ui->closeDoorAnimation->hide();
-                ui->closeDoorArrow->hide();
-
-                Cook::Step step = cook->currentStep();
-                if (Cook::classify(step.type) == Cook::DoorClass)
-                {
-                    ui->openDoorAnimation->show();
-                    ui->openDoorArrow->show();
-                }
-                else
-                {
-                    ui->openDoorAnimation->hide();
-                    ui->openDoorArrow->hide();
-                }
-            }
-        }
+        ui->processTitleLabel->hide();
+        ui->processTypeLabel->hide();
+        ui->processButton_1->hide();
+        ui->processButton_2->hide();
+        ui->processButton_3->hide();
     }
     else
     {
-        ui->stackedWidget->setCurrentIndex(0);
-
-        for (int idx = 0; idx < 5; idx++)
+        QString typeText;
+        QSignalMapper *sm = NULL;
+        for (int i = 0; i < 3; i++)
         {
-            AbstractCookConfig *config = cook->configurations[idx];
-            if (config == NULL)
-                continue;
-
-            QLabel *l;
-            QSlider *s;
-            switch (idx)
+            QPushButton *pb;
+            switch (i)
             {
             case 0:
-                l = ui->configCurrentLabel_1;
-                s = ui->configSlider_1;
+                pb = ui->processButton_1;
                 break;
             case 1:
-                l = ui->configCurrentLabel_2;
-                s = ui->configSlider_2;
+                pb = ui->processButton_2;
                 break;
             case 2:
-                l = ui->configCurrentLabel_3;
-                s = ui->configSlider_3;
-                break;
-            case 3:
-                l = ui->configCurrentLabel_4;
-                s = ui->configSlider_4;
-                break;
-            case 4:
-                l = ui->configCurrentLabel_5;
-                s = ui->configSlider_5;
+                pb = ui->processButton_3;
                 break;
             }
 
-            int time = cook->time();
-            int interTemp = cook->interTemp();
-
-            switch (config->type())
+            if (i < autocook.cook.processes.size())
             {
-            case Cook::Time:
-                if (time >= 3600)
-                    l->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">시간</span> %02d<span style=\"font-size:11pt;\">분</span>", time / 3600, (time % 3600) / 60));
-                else if (time >= 60)
-                    l->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">분</span> %02d<span style=\"font-size:11pt;\">초</span>", time / 60, time % 60));
+                if (sm == NULL)
+                {
+                    sm = new QSignalMapper(this);
+                    connect(sm, SIGNAL(mapped(int)), SLOT(startProcess(int)));
+                }
+
+                Define::Process process = autocook.cook.processes[i];
+
+                QString text = Define::name(process);
+                if (typeText.isEmpty())
+                    typeText = text;
                 else
-                    l->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">초</span>", time));
-                break;
-            case Cook::BurnDegree:
-                l->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">℃</span>", interTemp));
-                break;
-            default:
-                l->setText(QString().sprintf("%d<span style=\"font-size:11pt;\">/%d</span>", config->current(), config->count()));
-                break;
+                    typeText += ", " + text;
+
+                QString styleSheet = QString("QPushButton { border-image: url(%1) } QPushButton:pressed { border-image: url(%2) }")
+                        .arg(Define::icon(process))
+                        .arg(Define::iconOverlay(process));
+
+                pb->setStyleSheet(styleSheet);
+
+                sm->setMapping(pb, (int) process);
+                connect(pb, SIGNAL(clicked()), sm, SLOT(map()));
+            }
+            else
+            {
+                pb->hide();
             }
         }
 
-        if (interTempEnabled)
-        {
-            ui->configButton_4->setStyleSheet(
-                        QString("QPushButton { image: url(")
-                        + ":/images/slider_icon/core_temp_enabled.png"
-                        + ") } QPushButton::pressed { image: url("
-                        + ":/images/slider_icon/core_temp_ov.png"
-                        + ") }");
-        }
-        else
-        {
-            ui->configButton_4->setStyleSheet(
-                        QString("QPushButton { image: url(")
-                        + ":/images/slider_icon/core_temp.png"
-                        + ") } QPushButton::pressed { image: url("
-                        + ":/images/slider_icon/core_temp_ov.png"
-                        + ") }");
-        }
+        ui->processTypeLabel->setText(typeText);
     }
+
+    ui->processContainer->hide();
+
+    updateView();
 }
 
-void AutoCookWindow::viewStep(Cook::Step step)
+void AutoCookWindow::updateView()
 {
-//    qDebug() << "viewStep" << step.type;
-    switch (Cook::classify(step.type))
+    Oven *oven = Oven::getInstance();
+
+    QString spanFontSize11("<span style=\"font-size:11pt\">%1</span>");
+    QString spanFontSize9("<span style=\"font-size:9pt\">%1</span>");
+
+    int remainingTime = qMax(0, autocook.remainingTime());
+    if (remainingTime != lastViewTime)
     {
-    case Cook::PreheatClass:
-        viewPreheatStep(step);
-        break;
-    case Cook::DoorClass:
-        viewDoorStep(step);
-        break;
-    case Cook::CookClass:
-        viewCookStep(step);
-        break;
-    default:
-        break;
+        lastViewTime = remainingTime;
+
+        QString hour = spanFontSize11.arg("시간");
+        QString min = spanFontSize11.arg("분");
+        QString sec = spanFontSize11.arg("초");
+
+        if (remainingTime >= 3600)
+            ui->timeLabel->setText(QString("%1%2 %3%4")
+                                   .arg(remainingTime / 3600)
+                                   .arg(hour)
+                                   .arg((remainingTime % 3600) / 60, 2, 10, QLatin1Char('0'))
+                                   .arg(min));
+        else if (remainingTime >= 60)
+            ui->timeLabel->setText(QString("%1%2 %3%4")
+                                   .arg(remainingTime / 60)
+                                   .arg(min)
+                                   .arg(remainingTime % 60, 2, 10, QLatin1Char('0'))
+                                   .arg(sec));
+        else
+            ui->timeLabel->setText(QString("%1%2")
+                                   .arg(remainingTime)
+                                   .arg(sec));
     }
-}
 
-void AutoCookWindow::viewPreheatStep(Cook::Step step)
-{
-    ui->cookStepIcon->show();
-    ui->cookStepIcon->setPixmap(QPixmap(":/images/cook_step_type/sys_icon_05.png"));
-    ui->cookStepLabel->show();
-    ui->cookStepLabel->setText("예열");
-    ui->doorStepLabel->hide();
-    ui->cookStepAnimation->hide();
-
-    ui->humidityGauge->show();
-    ui->humidityGauge->setValue(step.humidity);
-    ui->humidityLabel->show();
-    if (showingCurrentHumidity)
-        ui->humidityLabel->setText(QString().sprintf("%d%%", oven->currentHumidity()));
-    else
-        ui->humidityLabel->setText(QString().sprintf("%d%%", step.humidity));
+    int coreTemp = oven->currentInterTemp();
+    if (coreTemp != lastViewCoreTemp)
+    {
+        lastViewCoreTemp = coreTemp;
 
-    ui->heatGauge->show();
-    ui->heatGauge->setValue(step.temp);
-    ui->heatLabel->show();
-    if (showingCurrentTemp)
-        ui->heatLabel->setText(QString().sprintf("%d℃", oven->currentTemp()));
-    else
-        ui->heatLabel->setText(QString().sprintf("%d℃", step.temp));
+        QString coreTempLabel = QString::number(coreTemp);
+        if (cook.isCoreTempValid())
+            coreTempLabel += spanFontSize11.arg("℃ / " + QString::number(cook.coreTemp())) + spanFontSize9.arg("℃");
+        else
+            coreTempLabel += spanFontSize11.arg("℃");
 
-    ui->cookModeIcon->show();
-    switch (step.mode)
-    {
-    case Cook::SteamMode:
-        ui->cookModeIcon->setPixmap(steamModeIcon);
-        break;
-    case Cook::DryMode:
-        ui->cookModeIcon->setPixmap(dryModeIcon);
-        break;
-    case Cook::CombiMode:
-        ui->cookModeIcon->setPixmap(combiModeIcon);
-        break;
+        ui->interTempLabel->setText(coreTempLabel);
     }
-}
 
-void AutoCookWindow::viewDoorStep(Cook::Step step)
-{
-//    qDebug() << "viewDoorStep";
-    ui->cookStepLabel->hide();
-    ui->cookStepIcon->hide();
-    ui->doorStepLabel->show();
-    ui->cookStepAnimation->show();
-
-    ui->humidityGauge->hide();
-    ui->humidityLabel->hide();
-    ui->heatGauge->hide();
-    ui->heatLabel->hide();
-    ui->cookModeIcon->hide();
-
-    if (lastDoorView != step.type)
+    if (autocook.done())
     {
-        lastDoorView = step.type;
-        qDebug() << "clearStepAnimation";
+        if (!oven->door())
+        {
+            if (ui->openDoorAnimation->isHidden())
+                ui->openDoorAnimation->show();
 
-        ui->cookStepAnimation->clear();
-        switch (step.type)
+            if (ui->openDoorArrow->isHidden())
+                ui->openDoorArrow->show();
+
+            if (ui->closeDoorAnimation->isVisible())
+                ui->closeDoorAnimation->hide();
+
+            if (ui->closeDoorArrow->isVisible())
+                ui->closeDoorArrow->hide();
+        }
+        else
         {
-        case Cook::PutThermometer:
-            ui->doorStepLabel->setText("중심 온도계 삽입");
-            ui->cookStepAnimation->load(":/images/animation/thermometer_01.png");
-            ui->cookStepAnimation->load(":/images/animation/thermometer_02.png");
-            ui->cookStepAnimation->setGeometry((900-210)/2, 800, 210, 307);
-            break;
-        case Cook::Load:
-            ui->doorStepLabel->setText("식재료 적재");
-            ui->cookStepAnimation->load(":/images/animation/load_01.png");
-            ui->cookStepAnimation->load(":/images/animation/load_02.png");
-            ui->cookStepAnimation->load(":/images/animation/load_03.png");
-            ui->cookStepAnimation->load(":/images/animation/load_04.png");
-            ui->cookStepAnimation->load(":/images/animation/load_03.png");
-            ui->cookStepAnimation->load(":/images/animation/load_02.png");
-            ui->cookStepAnimation->load(":/images/animation/load_01.png");
-            ui->cookStepAnimation->setGeometry((900-264)/2, 800, 264, 307);
-            break;
-        case Cook::Cut:
-            ui->doorStepLabel->setText("자르기");
-            ui->cookStepAnimation->load(":/images/animation/cut_01.png");
-            ui->cookStepAnimation->load(":/images/animation/cut_02.png");
-            ui->cookStepAnimation->load(":/images/animation/cut_03.png");
-            ui->cookStepAnimation->setGeometry((900-264)/2, 800, 264, 307);
-            break;
-        case Cook::Pour:
-            ui->doorStepLabel->setText("물 붓기");
-            ui->cookStepAnimation->load(":/images/animation/pour_01.png");
-            ui->cookStepAnimation->load(":/images/animation/pour_02.png");
-            ui->cookStepAnimation->load(":/images/animation/pour_03.png");
-            ui->cookStepAnimation->load(":/images/animation/pour_04.png");
-            ui->cookStepAnimation->setGeometry((900-264)/2, 800, 264, 307);
-            break;
-        default:
-            ui->doorStepLabel->hide();
+            if (ui->openDoorAnimation->isVisible())
+                ui->openDoorAnimation->hide();
+
+            if (ui->openDoorArrow->isVisible())
+                ui->openDoorArrow->hide();
+
+            if (ui->closeDoorAnimation->isVisible())
+                ui->closeDoorAnimation->hide();
+
+            if (ui->closeDoorArrow->isVisible())
+                ui->closeDoorArrow->hide();
         }
+
+        if (ui->processContainer->isHidden())
+            ui->processContainer->show();
     }
-}
+    else if (autocook.isWaitingDoorOpened() && !oven->door())
+    {
+        if (ui->openDoorAnimation->isHidden())
+            ui->openDoorAnimation->show();
 
-void AutoCookWindow::viewCookStep(Cook::Step step)
-{
-    ui->cookStepLabel->show();
-    ui->cookStepIcon->show();
-    ui->doorStepLabel->hide();
-    ui->cookStepAnimation->hide();
-
-    ui->humidityGauge->show();
-    ui->humidityGauge->setValue(step.humidity);
-    ui->humidityLabel->show();
-    if (showingCurrentHumidity)
-        ui->humidityLabel->setText(QString().sprintf("%d%%", oven->currentHumidity()));
-    else
-        ui->humidityLabel->setText(QString().sprintf("%d%%", step.humidity));
+        if (ui->openDoorArrow->isHidden())
+            ui->openDoorArrow->show();
 
-    ui->heatGauge->show();
-    ui->heatGauge->setValue(step.temp);
-    ui->heatLabel->show();
-    if (showingCurrentTemp)
-        ui->heatLabel->setText(QString().sprintf("%d℃", oven->currentTemp()));
-    else
-        ui->heatLabel->setText(QString().sprintf("%d℃", step.temp));
+        if (ui->closeDoorAnimation->isVisible())
+            ui->closeDoorAnimation->hide();
 
-    ui->cookModeIcon->show();
-    switch (step.mode)
-    {
-    case Cook::SteamMode:
-        ui->cookModeIcon->setPixmap(steamModeIcon);
-        break;
-    case Cook::DryMode:
-        ui->cookModeIcon->setPixmap(dryModeIcon);
-        break;
-    case Cook::CombiMode:
-        ui->cookModeIcon->setPixmap(combiModeIcon);
-        break;
+        if (ui->closeDoorArrow->isVisible())
+            ui->closeDoorArrow->hide();
     }
+    else if (!autocook.isWaitingDoorOpened() && oven->door())
+    {
+        if (ui->openDoorAnimation->isVisible())
+            ui->openDoorAnimation->hide();
 
-    ui->cookStepLabel->setText(Cook::name(step.type));
-    ui->cookStepIcon->setPixmap(QPixmap(Cook::icon(step.type)));
-}
+        if (ui->openDoorArrow->isVisible())
+            ui->openDoorArrow->hide();
 
-void AutoCookWindow::doPreheatStep(Cook::Step step)
-{
-//    oven->setHumidity(step.humidity);
-    oven->setHumidity(0);
-    oven->setTemp(step.temp);
-    oven->startPreheating();
-
-    lastHumidity = oven->currentHumidity();
-    lastTemp = oven->currentTemp();
-
-    ui->preheatIcon->show();
-    ui->preheatLabel->show();
-    ui->preheatGauge->show();
-    ui->preheatGauge->setMaximum(step.temp);
-    ui->preheatGauge->setMinimum(lastTemp);
-    ui->preheatGauge->setValue(lastTemp);
-}
+        if (ui->closeDoorAnimation->isHidden())
+            ui->closeDoorAnimation->show();
 
-void AutoCookWindow::doDoorStep(Cook::Step /*step*/)
-{
-    opened = false;
-}
+        if (ui->closeDoorArrow->isHidden())
+            ui->closeDoorArrow->show();
+    }
+    else
+    {
+        if (ui->openDoorAnimation->isVisible())
+            ui->openDoorAnimation->hide();
 
-void AutoCookWindow::doCookStep(Cook::Step step)
-{
-//    oven->setHumidity(step.humidity);
-    oven->setHumidity(0);
-    oven->setTemp(step.temp);
-    oven->startCooking();
+        if (ui->openDoorArrow->isVisible())
+            ui->openDoorArrow->hide();
 
-    lastHumidity = oven->currentHumidity();
-    lastTemp = oven->currentTemp();
-}
+        if (ui->closeDoorAnimation->isVisible())
+            ui->closeDoorAnimation->hide();
 
-static bool checkReached(int target, int last, int current)
-{
-    qDebug() << "checkReached" << target << last << current;
-    return ((target >= last) && (target <= current))
-            || ((target <= last) && (target >= current));
-}
+        if (ui->closeDoorArrow->isVisible())
+            ui->closeDoorArrow->hide();
+    }
 
-void AutoCookWindow::checkPreheatStep(Cook::Step step)
-{
-    int curTemp = oven->currentTemp();
+    if (autocook.cook.steps[autocook.currentStepIndex].type == Define::Preheat)
+    {
+        if (ui->preheatIcon->isHidden())
+            ui->preheatIcon->show();
 
-    ui->preheatGauge->setValue(curTemp);
+        if (ui->preheatLabel->isHidden())
+            ui->preheatLabel->show();
 
-    if (checkReached(step.humidity, lastHumidity, oven->currentHumidity())
-            && checkReached(step.temp, lastTemp, curTemp))
+        if (ui->preheatGauge->isHidden())
+            ui->preheatGauge->show();
+
+        ui->preheatGauge->setMaximum(autocook.cook.steps[autocook.currentStepIndex].temp);
+        ui->preheatGauge->setMinimum(autocook.startTemp);
+        ui->preheatGauge->setValue(oven->currentTemp());
+    }
+    else
     {
-        if (selectedStepIndex == cook->currentStepIndex())
-            selectedStepIndex = cook->currentStepIndex() + 1;
+        if (ui->preheatIcon->isVisible())
+            ui->preheatIcon->hide();
 
-        ui->preheatIcon->hide();
-        ui->preheatLabel->hide();
-        ui->preheatGauge->hide();
+        if (ui->preheatLabel->isVisible())
+            ui->preheatLabel->hide();
 
-        cook->setCurrentStepIndex(cook->currentStepIndex() + 1);
-        doStep();
+        if (ui->preheatGauge->isVisible())
+            ui->preheatGauge->hide();
     }
-}
 
-void AutoCookWindow::checkDoorStep(Cook::Step /*step*/)
-{
-//    qDebug() << "checkDoorStep" << opened << oven->door();
-    if (opened)
+    if (selectedStepIndex != lastViewStepIndex)
     {
-        if (!oven->door())
-        {
-            if (selectedStepIndex == cook->currentStepIndex())
-                selectedStepIndex = cook->currentStepIndex() + 1;
+        lastViewStepIndex = selectedStepIndex;
 
-            cook->setCurrentStepIndex(cook->currentStepIndex() + 1);
-            doStep();
+        for (int idx = 0; idx < bullets.length(); idx++)
+        {
+            QLabel *bullet = bullets.at(idx);
+            if (idx == selectedStepIndex)
+                bullet->setPixmap(selectedBulletPixmap);
+            else
+                bullet->setPixmap(bulletPixmap);
         }
     }
-    else
-    {
-        if (oven->door())
-            opened = true;
-    }
-}
 
-void AutoCookWindow::checkCookStep(Cook::Step step)
-{
-    if (cook->currentStepIndex() + 1 < cook->stepCount())
+    CookStep showingStep = autocook.cook.steps[selectedStepIndex];
+    if (Define::classify(showingStep.type) == Define::DoorClass)
     {
-        if (checkReached(step.humidity, lastHumidity, oven->currentHumidity())
-                && checkReached(step.temp, lastTemp, oven->currentTemp()))
-        {
-            if (selectedStepIndex == cook->currentStepIndex())
-                selectedStepIndex = cook->currentStepIndex() + 1;
+        if (ui->cookStepIcon->isVisible())
+            ui->cookStepIcon->hide();
 
-            cook->setCurrentStepIndex(cook->currentStepIndex() + 1);
-            doStep();
-        }
-        else if (interTempEnabled)
+        if (ui->cookStepLabel->isVisible())
+            ui->cookStepLabel->hide();
+
+        if (ui->cookModeIcon->isVisible())
+            ui->cookModeIcon->hide();
+
+        if (ui->humidityGauge->isVisible())
+            ui->humidityGauge->hide();
+
+        if (ui->humidityGaugeButton->isVisible())
+            ui->humidityGaugeButton->hide();
+
+        if (ui->humidityLabel->isVisible())
+            ui->humidityLabel->hide();
+
+        if (ui->heatGauge->isVisible())
+            ui->heatGauge->hide();
+
+        if (ui->heatGaugeButton->isVisible())
+            ui->heatGaugeButton->hide();
+
+        if (ui->heatLabel->isVisible())
+            ui->heatLabel->hide();
+
+        if (ui->doorStepLabel->isHidden())
+            ui->doorStepLabel->show();
+
+        if (ui->cookStepAnimation->isHidden())
+            ui->cookStepAnimation->show();
+
+        if (showingStep.type != lastViewDoorType)
         {
-            if (cook->interTemp() <= oven->currentInterTemp())
-            {
-                if (selectedStepIndex == cook->currentStepIndex())
-                    selectedStepIndex = cook->stepCount() - 1;
+            lastViewDoorType = showingStep.type;
 
-                cook->setCurrentStepIndex(cook->stepCount() - 1);
-                doStep();
+            ui->doorStepLabel->setText(Define::name(showingStep.type));
+            ui->cookStepAnimation->clear();
+            switch (showingStep.type)
+            {
+            case Define::PutThermometer:
+                ui->doorStepLabel->setText("중심 온도계 삽입");
+                ui->cookStepAnimation->load(":/images/animation/thermometer_01.png");
+                ui->cookStepAnimation->load(":/images/animation/thermometer_02.png");
+                ui->cookStepAnimation->setGeometry((900-210)/2, 800, 210, 307);
+                ui->cookStepAnimation->start(300);
+                break;
+            case Define::Load:
+                ui->doorStepLabel->setText("식재료 적재");
+                ui->cookStepAnimation->load(":/images/animation/load_01.png");
+                ui->cookStepAnimation->load(":/images/animation/load_02.png");
+                ui->cookStepAnimation->load(":/images/animation/load_03.png");
+                ui->cookStepAnimation->load(":/images/animation/load_04.png");
+                ui->cookStepAnimation->load(":/images/animation/load_03.png");
+                ui->cookStepAnimation->load(":/images/animation/load_02.png");
+                ui->cookStepAnimation->load(":/images/animation/load_01.png");
+                ui->cookStepAnimation->setGeometry((900-264)/2, 800, 264, 307);
+                ui->cookStepAnimation->start(300);
+                break;
+            case Define::Cut:
+                ui->doorStepLabel->setText("자르기");
+                ui->cookStepAnimation->load(":/images/animation/cut_01.png");
+                ui->cookStepAnimation->load(":/images/animation/cut_02.png");
+                ui->cookStepAnimation->load(":/images/animation/cut_03.png");
+                ui->cookStepAnimation->setGeometry((900-264)/2, 800, 264, 307);
+                ui->cookStepAnimation->start(300);
+                break;
+            case Define::Pour:
+                ui->doorStepLabel->setText("물 붓기");
+                ui->cookStepAnimation->load(":/images/animation/pour_01.png");
+                ui->cookStepAnimation->load(":/images/animation/pour_02.png");
+                ui->cookStepAnimation->load(":/images/animation/pour_03.png");
+                ui->cookStepAnimation->load(":/images/animation/pour_04.png");
+                ui->cookStepAnimation->setGeometry((900-264)/2, 800, 264, 307);
+                ui->cookStepAnimation->start(300);
+                break;
+            default:
+                ui->doorStepLabel->hide();
+                ui->cookStepAnimation->hide();
             }
         }
     }
-    else /*if current step == last step*/
+    else
     {
-        if (done)
+        if (ui->doorStepLabel->isVisible())
+            ui->doorStepLabel->hide();
+
+        if (ui->cookStepAnimation->isVisible())
+            ui->cookStepAnimation->hide();
+
+        if (ui->cookStepIcon->isHidden())
+            ui->cookStepIcon->show();
+
+        if (ui->cookStepLabel->isHidden())
+            ui->cookStepLabel->show();
+
+        if (ui->cookModeIcon->isHidden())
+            ui->cookModeIcon->show();
+
+        if (ui->humidityGauge->isHidden())
+            ui->humidityGauge->show();
+
+        if (ui->humidityGaugeButton->isHidden())
+            ui->humidityGaugeButton->show();
+
+        if (ui->humidityLabel->isHidden())
+            ui->humidityLabel->show();
+
+        if (ui->heatGauge->isHidden())
+            ui->heatGauge->show();
+
+        if (ui->heatGaugeButton->isHidden())
+            ui->heatGaugeButton->show();
+
+        if (ui->heatLabel->isHidden())
+            ui->heatLabel->show();
+
+        if (showingStep.type != lastViewCookType)
         {
+            lastViewCookType = showingStep.type;
 
+            ui->cookStepIcon->setPixmap(Define::icon(showingStep.type));
+            ui->cookStepLabel->setText(Define::name(showingStep.type));
         }
-        else
+
+        if (showingStep.mode != lastViewCookMode)
         {
-            if ((interTempEnabled && cook->interTemp() <= oven->currentInterTemp())
-                    || oven->time() == 0)
-            {
-                done = true;
-                ui->openDoorAnimation->show();
-                ui->openDoorArrow->show();
-                ui->closeDoorAnimation->hide();
-                ui->closeDoorArrow->hide();
+            lastViewCookMode = showingStep.mode;
 
-                oven->setTime(0);
+            switch (showingStep.mode)
+            {
+            case Define::SteamMode:
+                ui->cookModeIcon->setPixmap(steamModeIcon);
+                break;
+            case Define::CombiMode:
+                ui->cookModeIcon->setPixmap(combiModeIcon);
+                break;
+            case Define::DryMode:
+                ui->cookModeIcon->setPixmap(dryModeIcon);
+                break;
+            case Define::InvalidClass:
+                ui->cookModeIcon->hide();
+                break;
             }
         }
-    }
-}
-
-void AutoCookWindow::start()
-{
-    qDebug() << "start";
 
-    started = true;
-    oven->setTime(cook->time());
-    oven->setInterTemp(cook->interTemp());
-    oven->setInterTempEnabled(interTempEnabled);
+        ui->humidityGauge->setValue(showingStep.humidity);
 
-    doStep();
-    checkCookTimer.start();
+        int humidity;
+        if (showingCurrentHumidity)
+            humidity = oven->currentHumidity();
+        else
+            humidity = showingStep.humidity;
 
-    updateView();
-}
+        if (humidity != lastViewHumidity)
+        {
+            lastViewHumidity = humidity;
+            ui->humidityLabel->setText(QString("%1%").arg(humidity));
+        }
 
-void AutoCookWindow::stop()
-{
-    qDebug() << "stop";
-    oven->stop();
-    checkCookTimer.stop();
+        ui->heatGauge->setValue(showingStep.temp);
 
-    updateView();
-}
+        int temp;
+        if (showingCurrentTemp)
+            temp = oven->currentTemp();
+        else
+            temp = showingStep.temp;
 
-void AutoCookWindow::doStep()
-{
-    qDebug() << "doStep";
-    Cook::Step step = cook->currentStep();
-    switch (Cook::classify(step.type))
-    {
-    case Cook::PreheatClass:
-        doPreheatStep(step);
-        break;
-    case Cook::DoorClass:
-        doDoorStep(step);
-        break;
-    case Cook::CookClass:
-        doCookStep(step);
-        break;
-    default:
-        break;
+        if (temp != lastViewTemp)
+        {
+            lastViewTemp = temp;
+            ui->heatLabel->setText(QString("%1℃").arg(temp));
+        }
     }
 }
 
 void AutoCookWindow::checkCook()
 {
-//    qDebug() << "checkCook";
-    Cook::Step step = cook->currentStep();
-    switch (Cook::classify(step.type))
+    int lastStepIndex = autocook.currentStepIndex;
+    if (autocook.advance())
     {
-    case Cook::PreheatClass:
-        checkPreheatStep(step);
-        break;
-    case Cook::DoorClass:
-        checkDoorStep(step);
-        break;
-    case Cook::CookClass:
-        checkCookStep(step);
-        break;
-    default:
-        qDebug() << "Checking Invalid Cook";
+        if (lastStepIndex != autocook.currentStepIndex)
+            selectedStepIndex = autocook.currentStepIndex;
+
+        if (autocook.done())
+            checkCookTimer.stop();
     }
 
     updateView();
 }
 
-void AutoCookWindow::onOvenUpdated()
+void AutoCookWindow::startProcess(int process)
 {
-    updateView();
+    if (processSelected)
+        return;
 
-    qDebug() << "onOvenUpdated()";
-}
+    processSelected = true;
 
-void AutoCookWindow::on_showPrevStepButton_clicked()
-{
-    if (selectedStepIndex > 0)
-        selectedStepIndex--;
-
-    updateView();
+    Define::Process p = (Define::Process) process;
+    switch (p)
+    {
+    case Define::CookAgain:
+    {
+        close();
 
-    returnToCurrentStepTimer.start();
-}
+        AutoCookWindow *w = new AutoCookWindow(parentWidget(), cook);
+        w->setWindowModality(Qt::WindowModal);
+        w->showFullScreen();
+        w->raise();
 
-void AutoCookWindow::on_showNextStepButton_clicked()
-{
-    if (selectedStepIndex + 1 < cook->stepCount())
-        selectedStepIndex++;
+        break;
+    }
+    case Define::MakeCrisper:
+    {
+        selectedProcess = (Define::Process) process;
 
-    updateView();
+        CookStep &step = autocook.cook.steps[autocook.cook.steps.size() - 1];
 
-    returnToCurrentStepTimer.start();
-}
+        Oven *oven = Oven::getInstance();
+        oven->setHumidity(step.humidity);
+        oven->setTemp(step.temp + 10);
+        oven->startCooking();
 
-void AutoCookWindow::returnToCurrentStep()
-{
-    selectedStepIndex = cook->currentStepIndex();
+        checkProcessTimer.start(100);
+        break;
+    }
+    case Define::KeepWarm:
+    {
+        processSelected = false;
+        selectedProcess = (Define::Process) process;
 
-    updateView();
+        KeepWarmPopup *p = new KeepWarmPopup(this);
+        p->showFullScreen();
+        p->raise();
+        break;
+    }
+    }
 }
 
-void AutoCookWindow::onConfigChanged()
+void AutoCookWindow::checkProcess()
 {
-    for (int idx = 0; idx < 5; idx++)
-    {
-        AbstractCookConfig *config = cook->configurations[idx];
-        if (config == NULL)
-            continue;
+    if (!processSelected)
+        return;
 
-        QSlider *slider;
-        switch (idx)
+    switch (selectedProcess)
+    {
+    case Define::MakeCrisper:
+    {
+        Oven *oven = Oven::getInstance();
+        if (oven->currentTemp() >= oven->temp())
         {
-        case 0:
-            slider = ui->configSlider_1;
-            break;
-        case 1:
-            slider = ui->configSlider_2;
-            break;
-        case 2:
-            slider = ui->configSlider_3;
-            break;
-        case 3:
-            slider = ui->configSlider_4;
-            break;
-        case 4:
-            slider = ui->configSlider_5;
-            break;
+            oven->stopCooking();
+            checkProcessTimer.stop();
         }
-
-        config->setCurrent(slider->value());
+        break;
+    }
+    default:
+        break;
     }
+
+    updateView();
 }
 
-void AutoCookWindow::on_backButton_clicked()
+void AutoCookWindow::returnToCurrentStep()
 {
-    stop();
-    close();
+    selectedStepIndex = autocook.currentStepIndex;
+    showingDifferentStep = false;
+    updateView();
 }
 
-void AutoCookWindow::on_configButton_4_clicked()
+void AutoCookWindow::showCurrentHumidity()
 {
-    if (cook->interTempEnabled())
-    {
-        interTempEnabled = !interTempEnabled;
+    showingCurrentHumidity = true;
+    updateView();
+}
 
-        updateView();
-    }
+void AutoCookWindow::showCurrentTemp()
+{
+    showingCurrentTemp = true;
+    updateView();
 }
 
 void AutoCookWindow::on_humidityGaugeButton_pressed()
@@ -872,7 +637,8 @@ void AutoCookWindow::on_humidityGaugeButton_pressed()
 
 void AutoCookWindow::on_humidityGaugeButton_released()
 {
-    showCurrentHumidityTimer.stop();
+    if (showCurrentHumidityTimer.isActive())
+        showCurrentHumidityTimer.stop();
 
     if (showingCurrentHumidity)
     {
@@ -888,7 +654,8 @@ void AutoCookWindow::on_heatGaugeButton_pressed()
 
 void AutoCookWindow::on_heatGaugeButton_released()
 {
-    showCurrentTempTimer.stop();
+    if (showCurrentTempTimer.isActive())
+        showCurrentTempTimer.stop();
 
     if (showingCurrentTemp)
     {
@@ -897,16 +664,30 @@ void AutoCookWindow::on_heatGaugeButton_released()
     }
 }
 
-void AutoCookWindow::showCurrentHumidity()
+void AutoCookWindow::on_backButton_clicked()
 {
-    showingCurrentHumidity = true;
+    Oven::getInstance()->stop();
+    close();
+}
 
-    updateView();
+void AutoCookWindow::on_showPrevStepButton_clicked()
+{
+    if (selectedStepIndex > 0)
+    {
+        selectedStepIndex--;
+        updateView();
+    }
+
+    returnToCurrentStepTimer.start();
 }
 
-void AutoCookWindow::showCurrentTemp()
+void AutoCookWindow::on_showNextStepButton_clicked()
 {
-    showingCurrentTemp = true;
+    if (selectedStepIndex + 1 < cook.steps.size())
+    {
+        selectedStepIndex++;
+        updateView();
+    }
 
-    updateView();
+    returnToCurrentStepTimer.start();
 }
diff --git a/app/gui/oven_control/autocookwindow.h b/app/gui/oven_control/autocookwindow.h
index de1b134..a7d0f28 100644
--- a/app/gui/oven_control/autocookwindow.h
+++ b/app/gui/oven_control/autocookwindow.h
@@ -2,12 +2,10 @@
 #define AUTOCOOKWINDOW_H
 
 #include <QMainWindow>
-#include <QTimer>
-#include <QPixmap>
 #include <QLabel>
+#include <QTimer>
 
-#include "oven.h"
-#include "cook.h"
+#include "autocook.h"
 
 namespace Ui {
 class AutoCookWindow;
@@ -17,76 +15,67 @@ class AutoCookWindow : public QMainWindow
 {
     Q_OBJECT
 
-signals:
-    void startCookStartTimer();
-    void stopCookStartTimer();
-
 public:
-    explicit AutoCookWindow(QWidget *parent = 0, Oven *oven = 0, AbstractCook *cook = 0);
+    explicit AutoCookWindow(QWidget *parent, Cook cook);
     ~AutoCookWindow();
 
 private:
     Ui::AutoCookWindow *ui;
+
+    Cook cook;
+    AutoCook autocook;
+
     QTimer checkCookTimer;
-    Oven *oven;
-    AbstractCook *cook;
-    bool started;
-    bool done;
-    bool opened;
-    bool interTempEnabled;
 
     QPixmap bulletPixmap;
     QPixmap selectedBulletPixmap;
     QList<QLabel *> bullets;
-    int selectedStepIndex;
-    QTimer returnToCurrentStepTimer;
 
     QPixmap steamModeIcon;
     QPixmap dryModeIcon;
     QPixmap combiModeIcon;
 
+    int selectedStepIndex;
+    int lastViewStepIndex;
+    bool showingDifferentStep;
+    QTimer returnToCurrentStepTimer;
+
     bool showingCurrentHumidity;
     bool showingCurrentTemp;
     QTimer showCurrentHumidityTimer;
     QTimer showCurrentTempTimer;
 
-    int lastHumidity;
-    int lastTemp;
+    int lastViewTime;
+    int lastViewCoreTemp;
+    int lastViewHumidity;
+    int lastViewTemp;
+    Define::StepType lastViewDoorType;
+    Define::StepType lastViewCookType;
+    Define::Mode lastViewCookMode;
+
+    bool processSelected;
+    Define::Process selectedProcess;
+    QTimer checkProcessTimer;
 
-    Cook::StepType lastDoorView;
 
     void setupUi();
-    void viewStep(Cook::Step step);
-    void viewPreheatStep(Cook::Step step);
-    void viewDoorStep(Cook::Step step);
-    void viewCookStep(Cook::Step step);
-    void doPreheatStep(Cook::Step step);
-    void doDoorStep(Cook::Step step);
-    void doCookStep(Cook::Step step);
-    void checkPreheatStep(Cook::Step step);
-    void checkDoorStep(Cook::Step step);
-    void checkCookStep(Cook::Step step);
 
 private slots:
     void updateView();
-    void start();
-    void stop();
-    void doStep();
     void checkCook();
-    void onOvenUpdated();
-    void on_showPrevStepButton_clicked();
-    void on_showNextStepButton_clicked();
-    void returnToCurrentStep();
+    void startProcess(int process);
+    void checkProcess();
 
-    void onConfigChanged();
-    void on_backButton_clicked();
-    void on_configButton_4_clicked();
+    void returnToCurrentStep();
+    void showCurrentHumidity();
+    void showCurrentTemp();
     void on_humidityGaugeButton_pressed();
     void on_humidityGaugeButton_released();
     void on_heatGaugeButton_pressed();
     void on_heatGaugeButton_released();
-    void showCurrentHumidity();
-    void showCurrentTemp();
+    void on_backButton_clicked();
+    void on_showPrevStepButton_clicked();
+    void on_showNextStepButton_clicked();
 };
 
 #endif // AUTOCOOKWINDOW_H
diff --git a/app/gui/oven_control/autocookwindow.ui b/app/gui/oven_control/autocookwindow.ui
index ee6140f..6eaab6d 100644
--- a/app/gui/oven_control/autocookwindow.ui
+++ b/app/gui/oven_control/autocookwindow.ui
@@ -16,57 +16,11 @@
   <property name="styleSheet">
    <string notr="true">#centralwidget { background-image: url(:/images/background/auto_steps.png); }
 #bottomBar { background-image: url(:/images/bottom_bar/background.png); }
-#configPage { background-image: url(:/images/background/auto.png); }
-#cookPage { background-image: url(:/images/background/auto_steps.png); }
-
-QSlider::groove {
-background-image: url(:/images/slider/groove.png);
-background-repeat: no-repeat;
-background-position: center;
-}
-
-QSlider::sub-page {
-background-repeat: no-repeat;
-background-position: left center;
-margin: 0px 5px;
-}
-
-QSlider[sliderColor=&quot;red&quot;]::sub-page {
-background-image: url(:/images/slider/sub_red.png);
-}
-
-QSlider[sliderColor=&quot;yellow&quot;]::sub-page {
-background-image: url(:/images/slider/sub_yellow.png);
-}
-
-QSlider[sliderColor=&quot;white&quot;]::sub-page {
-background-image: url(:/images/slider/sub_white.png);
-}
-
-QSlider[sliderColor=&quot;blue&quot;]::sub-page {
-background-image: url(:/images/slider/sub_blue.png);
-}
-
-QSlider[sliderColor=&quot;green&quot;]::sub-page {
-background-image: url(:/images/slider/sub_green.png);
-}
-
-QSlider::handle {
-background-image: url(:/images/slider/handle_big.png);
-background-repeat: no-repeat;
-background-position: center;
-width: 23px;
-height: 33px;
-}
 
 QPushButton {
 background-repeat: no-repeat;
 background-position: center;
 border: none;
-}
-
-QPushButton[style=&quot;icon&quot;] {
-background-image: url(:/images/slider_icon/background.png);
 }</string>
   </property>
   <widget class="QWidget" name="centralwidget">
@@ -96,2318 +50,1292 @@ background-image: url(:/images/slider_icon/background.png);
     </widget>
     <widget class="QWidget" name="page_2"/>
    </widget>
-   <widget class="QStackedWidget" name="stackedWidget">
+   <widget class="QWidget" name="bottomBar" native="true">
     <property name="geometry">
      <rect>
       <x>0</x>
-      <y>0</y>
+      <y>1450</y>
       <width>900</width>
-      <height>1450</height>
+      <height>150</height>
      </rect>
     </property>
-    <widget class="QWidget" name="configPage">
-     <widget class="QLabel" name="cookTypeIcon_1">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>430</y>
-        <width>250</width>
-        <height>150</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap>:/images/images/auto/005_auto_icon_01_ov.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="selectCookButton_1">
-      <property name="geometry">
-       <rect>
-        <x>420</x>
-        <y>480</y>
-        <width>288</width>
-        <height>70</height>
-       </rect>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>10</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton {
-border-image: url(:/images/button/288.png);
-}
-QPushButton::pressed {
-border-image: url(:/images/button/288_ov.png);
-}</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="pushButton_4">
-      <property name="geometry">
-       <rect>
-        <x>720</x>
-        <y>480</y>
-        <width>152</width>
-        <height>70</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton {
-border-image: url(:/images/button/152.png);
-}
-QPushButton::pressed {
-border-image: url(:/images/button/152_ov.png);
-}</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="icon">
-       <iconset resource="resources.qrc">
-        <normaloff>:/images/auto_button/btn_icon_01.png</normaloff>:/images/auto_button/btn_icon_01.png</iconset>
-      </property>
-      <property name="iconSize">
-       <size>
-        <width>40</width>
-        <height>51</height>
-       </size>
-      </property>
-     </widget>
-     <widget class="QSlider" name="configSlider_1">
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>663</y>
-        <width>666</width>
-        <height>33</height>
-       </rect>
-      </property>
-      <property name="pageStep">
-       <number>1</number>
-      </property>
-      <property name="tracking">
-       <bool>true</bool>
-      </property>
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configCurrentLabel_1">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>199</x>
-        <y>690</y>
-        <width>641</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>스팀</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMinLabel_1">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>620</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>감소</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="configButton_1">
-      <property name="geometry">
-       <rect>
-        <x>27</x>
-        <y>605</y>
-        <width>140</width>
-        <height>140</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { image: url(:/images/slider_icon/gau_icon_01.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/gau_icon_01_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="style" stdset="0">
-       <string>icon</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMaxLabel_1">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>700</x>
-        <y>620</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>증가</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMaxLabel_2">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>700</x>
-        <y>780</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>증가</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMinLabel_2">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>780</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>감소</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="configButton_2">
-      <property name="geometry">
-       <rect>
-        <x>27</x>
-        <y>765</y>
-        <width>140</width>
-        <height>140</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { image: url(:/images/slider_icon/gau_icon_01.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/gau_icon_01_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="style" stdset="0">
-       <string>icon</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configCurrentLabel_2">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>199</x>
-        <y>850</y>
-        <width>641</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>스팀</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QSlider" name="configSlider_2">
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>823</y>
-        <width>666</width>
-        <height>33</height>
-       </rect>
-      </property>
-      <property name="pageStep">
-       <number>1</number>
-      </property>
-      <property name="tracking">
-       <bool>true</bool>
-      </property>
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMaxLabel_3">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>700</x>
-        <y>950</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>증가</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMinLabel_3">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>950</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>감소</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="configButton_3">
-      <property name="geometry">
-       <rect>
-        <x>27</x>
-        <y>935</y>
-        <width>140</width>
-        <height>140</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { image: url(:/images/slider_icon/gau_icon_01.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/gau_icon_01_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="style" stdset="0">
-       <string>icon</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configCurrentLabel_3">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>199</x>
-        <y>1020</y>
-        <width>641</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>스팀</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QSlider" name="configSlider_3">
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>993</y>
-        <width>666</width>
-        <height>33</height>
-       </rect>
-      </property>
-      <property name="pageStep">
-       <number>1</number>
-      </property>
-      <property name="tracking">
-       <bool>true</bool>
-      </property>
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMaxLabel_4">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>700</x>
-        <y>1130</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>증가</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMinLabel_4">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>1130</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>감소</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="configButton_4">
-      <property name="geometry">
-       <rect>
-        <x>27</x>
-        <y>1115</y>
-        <width>140</width>
-        <height>140</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { image: url(:/images/slider_icon/gau_icon_01.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/gau_icon_01_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="style" stdset="0">
-       <string>icon</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configCurrentLabel_4">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>199</x>
-        <y>1200</y>
-        <width>641</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>스팀</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QSlider" name="configSlider_4">
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>1173</y>
-        <width>666</width>
-        <height>33</height>
-       </rect>
-      </property>
-      <property name="pageStep">
-       <number>1</number>
-      </property>
-      <property name="tracking">
-       <bool>true</bool>
-      </property>
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMaxLabel_5">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>700</x>
-        <y>1300</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>증가</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configMinLabel_5">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>1300</y>
-        <width>151</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>9</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>감소</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="configButton_5">
-      <property name="geometry">
-       <rect>
-        <x>27</x>
-        <y>1285</y>
-        <width>140</width>
-        <height>140</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { image: url(:/images/slider_icon/gau_icon_01.png); }
-QPushButton:pressed { image: url(:/images/slider_icon/gau_icon_01_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="style" stdset="0">
-       <string>icon</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="configCurrentLabel_5">
-      <property name="enabled">
-       <bool>true</bool>
-      </property>
-      <property name="geometry">
-       <rect>
-        <x>189</x>
-        <y>1370</y>
-        <width>651</width>
-        <height>51</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>스팀</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-      </property>
-     </widget>
-     <widget class="QSlider" name="configSlider_5">
-      <property name="geometry">
-       <rect>
-        <x>185</x>
-        <y>1343</y>
-        <width>666</width>
-        <height>33</height>
-       </rect>
-      </property>
-      <property name="pageStep">
-       <number>1</number>
-      </property>
-      <property name="tracking">
-       <bool>true</bool>
-      </property>
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-     </widget>
+    <widget class="QPushButton" name="backButton">
+     <property name="geometry">
+      <rect>
+       <x>175</x>
+       <y>26</y>
+       <width>97</width>
+       <height>97</height>
+      </rect>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
     </widget>
-    <widget class="QWidget" name="cookPage">
-     <widget class="QPushButton" name="configCookButton">
-      <property name="geometry">
-       <rect>
-        <x>720</x>
-        <y>480</y>
-        <width>152</width>
-        <height>70</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
-QPushButton::pressed { border-image: url(:/images/button/152_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="icon">
-       <iconset resource="resources.qrc">
-        <normaloff>:/images/auto_button/btn_icon_03.png</normaloff>:/images/auto_button/btn_icon_03.png</iconset>
-      </property>
-      <property name="iconSize">
-       <size>
-        <width>38</width>
-        <height>37</height>
-       </size>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="autoCookButton">
-      <property name="geometry">
-       <rect>
-        <x>559</x>
-        <y>480</y>
-        <width>152</width>
-        <height>70</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
-QPushButton::pressed { border-image: url(:/images/button/152_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="icon">
-       <iconset resource="resources.qrc">
-        <normaloff>:/images/auto_button/btn_icon_02.png</normaloff>:/images/auto_button/btn_icon_02.png</iconset>
-      </property>
-      <property name="iconSize">
-       <size>
-        <width>40</width>
-        <height>51</height>
-       </size>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="selectCookButton_2">
-      <property name="geometry">
-       <rect>
-        <x>259</x>
-        <y>480</y>
-        <width>288</width>
-        <height>70</height>
-       </rect>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>10</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { border-image: url(:/images/button/288.png); }
-QPushButton::pressed { border-image: url(:/images/button/288_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QLabel" name="cookTypeIcon_2">
-      <property name="geometry">
-       <rect>
-        <x>0</x>
-        <y>430</y>
-        <width>250</width>
-        <height>150</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap>:/images/images/auto/005_auto_icon_01_ov.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="showPrevStepButton">
-      <property name="geometry">
-       <rect>
-        <x>10</x>
-        <y>715</y>
-        <width>60</width>
-        <height>400</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/auto_button/prev_step.png); }
-QPushButton::pressed { background-image: url(:/images/auto_button/prev_step_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="showNextStepButton">
-      <property name="geometry">
-       <rect>
-        <x>830</x>
-        <y>715</y>
-        <width>60</width>
-        <height>400</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { background-image: url(:/images/auto_button/next_step.png); }
-QPushButton::pressed { background-image: url(:/images/auto_button/next_step_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QLabel" name="label_3">
-      <property name="geometry">
-       <rect>
-        <x>130</x>
-        <y>600</y>
-        <width>100</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="resources.qrc">:/images/symbol/time.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="label_4">
-      <property name="geometry">
-       <rect>
-        <x>460</x>
-        <y>600</y>
-        <width>100</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="resources.qrc">:/images/symbol/core_temp.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="infoButton">
-      <property name="geometry">
-       <rect>
-        <x>730</x>
-        <y>730</y>
-        <width>63</width>
-        <height>63</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">QPushButton { border-image: url(:/images/symbol/info.png); }
-QPushButton::pressed { border-image: url(:/images/symbol/info_ov.png); }</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QLabel" name="cookStepIcon">
-      <property name="geometry">
-       <rect>
-        <x>80</x>
-        <y>710</y>
-        <width>100</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>14</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="resources.qrc">:/images/cook_step_type/sys_icon_05.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="cookStepLabel">
-      <property name="geometry">
-       <rect>
-        <x>180</x>
-        <y>710</y>
-        <width>541</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>14</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>Preheat</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="cookModeIcon">
-      <property name="geometry">
-       <rect>
-        <x>80</x>
-        <y>1020</y>
-        <width>741</width>
-        <height>81</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap>:/images/images/auto/window_icon_06.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="AnimatedImageBox" name="openDoorAnimation">
-      <property name="geometry">
-       <rect>
-        <x>40</x>
-        <y>1220</y>
-        <width>251</width>
-        <height>201</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string>TextLabel</string>
-      </property>
-     </widget>
-     <widget class="HumidityCircularGauge" name="humidityGauge" native="true">
-      <property name="geometry">
-       <rect>
-        <x>100</x>
-        <y>810</y>
-        <width>291</width>
-        <height>290</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-     </widget>
-     <widget class="HeatCircularGauge" name="heatGauge" native="true">
-      <property name="geometry">
-       <rect>
-        <x>510</x>
-        <y>810</y>
-        <width>291</width>
-        <height>290</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-     </widget>
-     <widget class="AnimatedImageBox" name="cookStepAnimation">
-      <property name="geometry">
-       <rect>
-        <x>340</x>
-        <y>800</y>
-        <width>231</width>
-        <height>281</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QLabel" name="humidityLabel">
-      <property name="geometry">
-       <rect>
-        <x>90</x>
-        <y>960</y>
-        <width>321</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>10</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="heatLabel">
-      <property name="geometry">
-       <rect>
-        <x>490</x>
-        <y>960</y>
-        <width>321</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>10</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="timeLabel">
-      <property name="geometry">
-       <rect>
-        <x>230</x>
-        <y>600</y>
-        <width>231</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>00:00</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="interTempLabel">
-      <property name="geometry">
-       <rect>
-        <x>560</x>
-        <y>600</y>
-        <width>231</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Roboto</family>
-        <pointsize>16</pointsize>
-        <weight>75</weight>
-        <bold>true</bold>
-       </font>
-      </property>
-      <property name="text">
-       <string>000/000</string>
-      </property>
-     </widget>
-     <widget class="QLabel" name="doorStepLabel">
-      <property name="geometry">
-       <rect>
-        <x>110</x>
-        <y>710</y>
-        <width>541</width>
-        <height>100</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>14</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>Preheat</string>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="humidityGaugeButton">
-      <property name="geometry">
-       <rect>
-        <x>100</x>
-        <y>810</y>
-        <width>291</width>
-        <height>290</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">border: #000000</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="QPushButton" name="heatGaugeButton">
-      <property name="geometry">
-       <rect>
-        <x>510</x>
-        <y>810</y>
-        <width>291</width>
-        <height>290</height>
-       </rect>
-      </property>
-      <property name="styleSheet">
-       <string notr="true">border: #000000</string>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-     </widget>
-     <widget class="PreheatTempGauge" name="preheatGauge" native="true">
-      <property name="geometry">
-       <rect>
-        <x>460</x>
-        <y>1360</y>
-        <width>415</width>
-        <height>58</height>
-       </rect>
-      </property>
-     </widget>
-     <widget class="QLabel" name="preheatIcon">
-      <property name="geometry">
-       <rect>
-        <x>260</x>
-        <y>1370</y>
-        <width>100</width>
-        <height>48</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>14</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="resources.qrc">:/images/cook_step_type/sys_icon_05.png</pixmap>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="QLabel" name="preheatLabel">
-      <property name="geometry">
-       <rect>
-        <x>330</x>
-        <y>1370</y>
-        <width>131</width>
-        <height>48</height>
-       </rect>
-      </property>
-      <property name="palette">
-       <palette>
-        <active>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </active>
-        <inactive>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>255</red>
-            <green>255</green>
-            <blue>255</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </inactive>
-        <disabled>
-         <colorrole role="WindowText">
-          <brush brushstyle="SolidPattern">
-           <color alpha="255">
-            <red>123</red>
-            <green>123</green>
-            <blue>123</blue>
-           </color>
-          </brush>
-         </colorrole>
-        </disabled>
-       </palette>
-      </property>
-      <property name="font">
-       <font>
-        <family>Malgun Gothic</family>
-        <pointsize>14</pointsize>
-       </font>
-      </property>
-      <property name="text">
-       <string>예열 중</string>
-      </property>
-      <property name="alignment">
-       <set>Qt::AlignCenter</set>
-      </property>
-     </widget>
-     <widget class="AnimatedImageBox" name="closeDoorAnimation">
-      <property name="geometry">
-       <rect>
-        <x>40</x>
-        <y>1220</y>
-        <width>251</width>
-        <height>201</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap>:/images/images/auto/ani_04.png</pixmap>
-      </property>
-     </widget>
-     <widget class="QLabel" name="closeDoorArrow">
-      <property name="geometry">
-       <rect>
-        <x>80</x>
-        <y>1320</y>
-        <width>85</width>
-        <height>24</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="resources.qrc">:/images/animation/close_door_arrow.png</pixmap>
-      </property>
-     </widget>
-     <widget class="QLabel" name="openDoorArrow">
-      <property name="geometry">
-       <rect>
-        <x>80</x>
-        <y>1320</y>
-        <width>85</width>
-        <height>24</height>
-       </rect>
-      </property>
-      <property name="text">
-       <string/>
-      </property>
-      <property name="pixmap">
-       <pixmap resource="resources.qrc">:/images/animation/open_door_arrow.png</pixmap>
-      </property>
-     </widget>
+    <widget class="QPushButton" name="washButton">
+     <property name="geometry">
+      <rect>
+       <x>514</x>
+       <y>26</y>
+       <width>97</width>
+       <height>97</height>
+      </rect>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/wash.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
     </widget>
-    <widget class="QWidget" name="selectionPage">
+    <widget class="QPushButton" name="configButton">
+     <property name="geometry">
+      <rect>
+       <x>288</x>
+       <y>26</y>
+       <width>97</width>
+       <height>97</height>
+      </rect>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
      <property name="styleSheet">
-      <string notr="true">QWidget#selectionPage {
-background-image: url(:/images/images/auto/ba_ground_set);
-}</string>
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+    <widget class="QPushButton" name="helpButton">
+     <property name="geometry">
+      <rect>
+       <x>627</x>
+       <y>26</y>
+       <width>97</width>
+       <height>97</height>
+      </rect>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
+     </property>
+     <property name="text">
+      <string/>
      </property>
     </widget>
+    <widget class="QPushButton" name="favoritesButton">
+     <property name="geometry">
+      <rect>
+       <x>401</x>
+       <y>26</y>
+       <width>97</width>
+       <height>97</height>
+      </rect>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/favorites.png); }
+QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_ov.png); }</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+   </widget>
+   <widget class="QPushButton" name="configCookButton">
+    <property name="geometry">
+     <rect>
+      <x>720</x>
+      <y>480</y>
+      <width>152</width>
+      <height>70</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
+QPushButton::pressed { border-image: url(:/images/button/152_ov.png); }</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="icon">
+     <iconset resource="resources.qrc">
+      <normaloff>:/images/auto_button/btn_icon_03.png</normaloff>:/images/auto_button/btn_icon_03.png</iconset>
+    </property>
+    <property name="iconSize">
+     <size>
+      <width>38</width>
+      <height>37</height>
+     </size>
+    </property>
+   </widget>
+   <widget class="QLabel" name="doorStepLabel">
+    <property name="geometry">
+     <rect>
+      <x>110</x>
+      <y>710</y>
+      <width>541</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Malgun Gothic</family>
+      <pointsize>14</pointsize>
+     </font>
+    </property>
+    <property name="text">
+     <string>Preheat</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="autoCookButton">
+    <property name="geometry">
+     <rect>
+      <x>559</x>
+      <y>480</y>
+      <width>152</width>
+      <height>70</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
+QPushButton::pressed { border-image: url(:/images/button/152_ov.png); }</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="icon">
+     <iconset resource="resources.qrc">
+      <normaloff>:/images/auto_button/btn_icon_02.png</normaloff>:/images/auto_button/btn_icon_02.png</iconset>
+    </property>
+    <property name="iconSize">
+     <size>
+      <width>40</width>
+      <height>51</height>
+     </size>
+    </property>
+   </widget>
+   <widget class="QLabel" name="cookModeIcon">
+    <property name="geometry">
+     <rect>
+      <x>80</x>
+      <y>1020</y>
+      <width>741</width>
+      <height>81</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap>:/images/images/auto/window_icon_06.png</pixmap>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="HumidityCircularGauge" name="humidityGauge" native="true">
+    <property name="geometry">
+     <rect>
+      <x>100</x>
+      <y>810</y>
+      <width>291</width>
+      <height>290</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+   </widget>
+   <widget class="QLabel" name="humidityLabel">
+    <property name="geometry">
+     <rect>
+      <x>90</x>
+      <y>960</y>
+      <width>321</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Roboto</family>
+      <pointsize>16</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>10</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QLabel" name="cookStepLabel">
+    <property name="geometry">
+     <rect>
+      <x>180</x>
+      <y>710</y>
+      <width>541</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Malgun Gothic</family>
+      <pointsize>14</pointsize>
+     </font>
+    </property>
+    <property name="text">
+     <string>Preheat</string>
+    </property>
    </widget>
-   <widget class="QWidget" name="bottomBar" native="true">
+   <widget class="QLabel" name="heatLabel">
+    <property name="geometry">
+     <rect>
+      <x>490</x>
+      <y>960</y>
+      <width>321</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Roboto</family>
+      <pointsize>16</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>10</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="heatGaugeButton">
+    <property name="geometry">
+     <rect>
+      <x>510</x>
+      <y>810</y>
+      <width>291</width>
+      <height>290</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">border: #000000</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="QLabel" name="cookTypeIcon">
     <property name="geometry">
      <rect>
       <x>0</x>
-      <y>1450</y>
-      <width>900</width>
+      <y>430</y>
+      <width>250</width>
       <height>150</height>
      </rect>
     </property>
-    <widget class="QPushButton" name="backButton">
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap>:/images/images/auto/005_auto_icon_01_ov.png</pixmap>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QLabel" name="interTempLabel">
+    <property name="geometry">
+     <rect>
+      <x>560</x>
+      <y>600</y>
+      <width>231</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Roboto</family>
+      <pointsize>16</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>000/000</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="closeDoorArrow">
+    <property name="geometry">
+     <rect>
+      <x>80</x>
+      <y>1320</y>
+      <width>85</width>
+      <height>24</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/animation/close_door_arrow.png</pixmap>
+    </property>
+   </widget>
+   <widget class="QLabel" name="timeLabel">
+    <property name="geometry">
+     <rect>
+      <x>230</x>
+      <y>600</y>
+      <width>231</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Roboto</family>
+      <pointsize>16</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>00:00</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="preheatIcon">
+    <property name="geometry">
+     <rect>
+      <x>260</x>
+      <y>1370</y>
+      <width>100</width>
+      <height>48</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Malgun Gothic</family>
+      <pointsize>14</pointsize>
+     </font>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/cook_step_type/sys_icon_05.png</pixmap>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="infoButton">
+    <property name="geometry">
+     <rect>
+      <x>730</x>
+      <y>730</y>
+      <width>63</width>
+      <height>63</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { border-image: url(:/images/symbol/info.png); }
+QPushButton::pressed { border-image: url(:/images/symbol/info_ov.png); }</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="humidityGaugeButton">
+    <property name="geometry">
+     <rect>
+      <x>100</x>
+      <y>810</y>
+      <width>291</width>
+      <height>290</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">border: #000000</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="showNextStepButton">
+    <property name="geometry">
+     <rect>
+      <x>830</x>
+      <y>715</y>
+      <width>60</width>
+      <height>400</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/auto_button/next_step.png); }
+QPushButton::pressed { background-image: url(:/images/auto_button/next_step_ov.png); }</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_4">
+    <property name="geometry">
+     <rect>
+      <x>460</x>
+      <y>600</y>
+      <width>100</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/symbol/core_temp.png</pixmap>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QLabel" name="cookStepIcon">
+    <property name="geometry">
+     <rect>
+      <x>80</x>
+      <y>710</y>
+      <width>100</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Malgun Gothic</family>
+      <pointsize>14</pointsize>
+     </font>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/cook_step_type/sys_icon_05.png</pixmap>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QLabel" name="preheatLabel">
+    <property name="geometry">
+     <rect>
+      <x>330</x>
+      <y>1370</y>
+      <width>131</width>
+      <height>48</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>Malgun Gothic</family>
+      <pointsize>14</pointsize>
+     </font>
+    </property>
+    <property name="text">
+     <string>예열 중</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="showPrevStepButton">
+    <property name="geometry">
+     <rect>
+      <x>10</x>
+      <y>715</y>
+      <width>60</width>
+      <height>400</height>
+     </rect>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { background-image: url(:/images/auto_button/prev_step.png); }
+QPushButton::pressed { background-image: url(:/images/auto_button/prev_step_ov.png); }</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="AnimatedImageBox" name="openDoorAnimation">
+    <property name="geometry">
+     <rect>
+      <x>40</x>
+      <y>1220</y>
+      <width>251</width>
+      <height>201</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/animation/door_09.png</pixmap>
+    </property>
+   </widget>
+   <widget class="AnimatedImageBox" name="cookStepAnimation">
+    <property name="geometry">
+     <rect>
+      <x>340</x>
+      <y>800</y>
+      <width>231</width>
+      <height>281</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="selectCookButton">
+    <property name="geometry">
+     <rect>
+      <x>259</x>
+      <y>480</y>
+      <width>288</width>
+      <height>70</height>
+     </rect>
+    </property>
+    <property name="font">
+     <font>
+      <family>Roboto</family>
+      <pointsize>10</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { border-image: url(:/images/button/288.png); }
+QPushButton::pressed { border-image: url(:/images/button/288_ov.png); }</string>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_3">
+    <property name="geometry">
+     <rect>
+      <x>130</x>
+      <y>600</y>
+      <width>100</width>
+      <height>100</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/symbol/time.png</pixmap>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="HeatCircularGauge" name="heatGauge" native="true">
+    <property name="geometry">
+     <rect>
+      <x>510</x>
+      <y>810</y>
+      <width>291</width>
+      <height>290</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+   </widget>
+   <widget class="PreheatTempGauge" name="preheatGauge" native="true">
+    <property name="geometry">
+     <rect>
+      <x>460</x>
+      <y>1360</y>
+      <width>415</width>
+      <height>58</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLabel" name="openDoorArrow">
+    <property name="geometry">
+     <rect>
+      <x>80</x>
+      <y>1320</y>
+      <width>85</width>
+      <height>24</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/animation/open_door_arrow.png</pixmap>
+    </property>
+   </widget>
+   <widget class="AnimatedImageBox" name="closeDoorAnimation">
+    <property name="geometry">
+     <rect>
+      <x>40</x>
+      <y>1220</y>
+      <width>251</width>
+      <height>201</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string/>
+    </property>
+    <property name="pixmap">
+     <pixmap resource="resources.qrc">:/images/animation/door_09.png</pixmap>
+    </property>
+   </widget>
+   <widget class="QWidget" name="processContainer" native="true">
+    <property name="geometry">
+     <rect>
+      <x>260</x>
+      <y>1200</y>
+      <width>640</width>
+      <height>250</height>
+     </rect>
+    </property>
+    <widget class="QLabel" name="processTitleLabel">
      <property name="geometry">
       <rect>
-       <x>175</x>
-       <y>26</y>
-       <width>97</width>
-       <height>97</height>
+       <x>0</x>
+       <y>0</y>
+       <width>640</width>
+       <height>50</height>
       </rect>
      </property>
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
+     <property name="palette">
+      <palette>
+       <active>
+        <colorrole role="WindowText">
+         <brush brushstyle="SolidPattern">
+          <color alpha="255">
+           <red>255</red>
+           <green>255</green>
+           <blue>255</blue>
+          </color>
+         </brush>
+        </colorrole>
+       </active>
+       <inactive>
+        <colorrole role="WindowText">
+         <brush brushstyle="SolidPattern">
+          <color alpha="255">
+           <red>255</red>
+           <green>255</green>
+           <blue>255</blue>
+          </color>
+         </brush>
+        </colorrole>
+       </inactive>
+       <disabled>
+        <colorrole role="WindowText">
+         <brush brushstyle="SolidPattern">
+          <color alpha="255">
+           <red>123</red>
+           <green>123</green>
+           <blue>123</blue>
+          </color>
+         </brush>
+        </colorrole>
+       </disabled>
+      </palette>
      </property>
-     <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
+     <property name="font">
+      <font>
+       <family>Malgun Gothic</family>
+       <pointsize>14</pointsize>
+       <weight>75</weight>
+       <bold>true</bold>
+      </font>
      </property>
      <property name="text">
-      <string/>
+      <string>후속 과정 옵션</string>
      </property>
     </widget>
-    <widget class="QPushButton" name="washButton">
+    <widget class="QLabel" name="processTypeLabel">
      <property name="geometry">
       <rect>
-       <x>514</x>
-       <y>26</y>
-       <width>97</width>
-       <height>97</height>
+       <x>0</x>
+       <y>50</y>
+       <width>640</width>
+       <height>50</height>
       </rect>
      </property>
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
+     <property name="palette">
+      <palette>
+       <active>
+        <colorrole role="WindowText">
+         <brush brushstyle="SolidPattern">
+          <color alpha="255">
+           <red>255</red>
+           <green>255</green>
+           <blue>255</blue>
+          </color>
+         </brush>
+        </colorrole>
+       </active>
+       <inactive>
+        <colorrole role="WindowText">
+         <brush brushstyle="SolidPattern">
+          <color alpha="255">
+           <red>255</red>
+           <green>255</green>
+           <blue>255</blue>
+          </color>
+         </brush>
+        </colorrole>
+       </inactive>
+       <disabled>
+        <colorrole role="WindowText">
+         <brush brushstyle="SolidPattern">
+          <color alpha="255">
+           <red>123</red>
+           <green>123</green>
+           <blue>123</blue>
+          </color>
+         </brush>
+        </colorrole>
+       </disabled>
+      </palette>
      </property>
-     <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/wash.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
+     <property name="font">
+      <font>
+       <family>Malgun Gothic</family>
+       <pointsize>12</pointsize>
+       <weight>50</weight>
+       <bold>false</bold>
+      </font>
      </property>
      <property name="text">
-      <string/>
+      <string>새로운 재료 넣기</string>
      </property>
     </widget>
-    <widget class="QPushButton" name="configButton">
+    <widget class="QPushButton" name="processButton_1">
      <property name="geometry">
       <rect>
-       <x>288</x>
-       <y>26</y>
-       <width>97</width>
-       <height>97</height>
+       <x>0</x>
+       <y>130</y>
+       <width>152</width>
+       <height>70</height>
       </rect>
      </property>
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
+QPushButton:pressed { border-image: url(:/images/button/152_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
-    <widget class="QPushButton" name="helpButton">
+    <widget class="QPushButton" name="processButton_2">
      <property name="geometry">
       <rect>
-       <x>627</x>
-       <y>26</y>
-       <width>97</width>
-       <height>97</height>
+       <x>150</x>
+       <y>130</y>
+       <width>152</width>
+       <height>70</height>
       </rect>
      </property>
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
+QPushButton:pressed { border-image: url(:/images/button/152_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
-    <widget class="QPushButton" name="favoritesButton">
+    <widget class="QPushButton" name="processButton_3">
      <property name="geometry">
       <rect>
-       <x>401</x>
-       <y>26</y>
-       <width>97</width>
-       <height>97</height>
+       <x>300</x>
+       <y>130</y>
+       <width>152</width>
+       <height>70</height>
       </rect>
      </property>
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
      <property name="styleSheet">
-      <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/favorites.png); }
-QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_ov.png); }</string>
+      <string notr="true">QPushButton { border-image: url(:/images/button/152.png); }
+QPushButton:pressed { border-image: url(:/images/button/152_ov.png); }</string>
      </property>
      <property name="text">
       <string/>
      </property>
     </widget>
    </widget>
-   <zorder>stackedWidget</zorder>
+   <zorder>openDoorAnimation</zorder>
+   <zorder>closeDoorAnimation</zorder>
    <zorder>upperStack</zorder>
    <zorder>bottomBar</zorder>
+   <zorder>configCookButton</zorder>
+   <zorder>doorStepLabel</zorder>
+   <zorder>autoCookButton</zorder>
+   <zorder>cookModeIcon</zorder>
+   <zorder>humidityGauge</zorder>
+   <zorder>humidityLabel</zorder>
+   <zorder>cookStepLabel</zorder>
+   <zorder>heatLabel</zorder>
+   <zorder>cookTypeIcon</zorder>
+   <zorder>interTempLabel</zorder>
+   <zorder>closeDoorArrow</zorder>
+   <zorder>timeLabel</zorder>
+   <zorder>preheatIcon</zorder>
+   <zorder>infoButton</zorder>
+   <zorder>humidityGaugeButton</zorder>
+   <zorder>showNextStepButton</zorder>
+   <zorder>label_4</zorder>
+   <zorder>cookStepIcon</zorder>
+   <zorder>preheatLabel</zorder>
+   <zorder>showPrevStepButton</zorder>
+   <zorder>cookStepAnimation</zorder>
+   <zorder>selectCookButton</zorder>
+   <zorder>label_3</zorder>
+   <zorder>heatGauge</zorder>
+   <zorder>preheatGauge</zorder>
+   <zorder>openDoorArrow</zorder>
+   <zorder>heatGaugeButton</zorder>
+   <zorder>processContainer</zorder>
   </widget>
  </widget>
  <customwidgets>
@@ -2418,6 +1346,11 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_ov.png); }
    <container>1</container>
   </customwidget>
   <customwidget>
+   <class>AnimatedImageBox</class>
+   <extends>QLabel</extends>
+   <header>animatedimagebox.h</header>
+  </customwidget>
+  <customwidget>
    <class>HumidityCircularGauge</class>
    <extends>QWidget</extends>
    <header>humiditycirculargauge.h</header>
@@ -2430,11 +1363,6 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_ov.png); }
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>AnimatedImageBox</class>
-   <extends>QLabel</extends>
-   <header>animatedimagebox.h</header>
-  </customwidget>
-  <customwidget>
    <class>PreheatTempGauge</class>
    <extends>QWidget</extends>
    <header>preheattempgauge.h</header>
diff --git a/app/gui/oven_control/cook.cpp b/app/gui/oven_control/cook.cpp
index 92f7421..21e75ee 100644
--- a/app/gui/oven_control/cook.cpp
+++ b/app/gui/oven_control/cook.cpp
@@ -1,516 +1,396 @@
 #include "cook.h"
 
-#include <QtCore>
-#include <QtDebug>
+#include <QErrorMessage>
 
-#include <cmath>
-
-AbstractCook::~AbstractCook()
+static QErrorMessage *errorDialog = NULL;
+static void showError(QString errorMessage)
 {
-    for (int idx = 0; idx < 5; idx++)
-        if (configurations[idx] != NULL)
-        {
-            delete configurations[idx];
-            configurations[idx] = NULL;
-        }
-}
+    if (errorDialog == NULL)
+    {
+        errorDialog = new QErrorMessage;
+        errorDialog->setWindowModality(Qt::ApplicationModal);
+        errorDialog->setGeometry(QRect(0, 426, 900, 426));
+    }
 
-Cook::CookType AbstractCook::type()
-{
-    return type_;
+    errorDialog->showMessage(errorMessage);
+    errorDialog->exec();
 }
 
-QString AbstractCook::name()
+Cook::Cook()
+    : type(Define::InvalidCookType),
+      isInitialized_(false), isLoaded_(false), isCoreTempValid_(false),
+      time_(0), coreTemp_(0)
 {
-    return name_;
+    for (int i = 0; i < 5; i++)
+        configs[i].type = Define::InvalidConfig;
 }
 
-int AbstractCook::time()
+Cook::Cook(Define::CookType type, QString root, QString name)
+    : Cook()
 {
-    int t = time_;
-    for (int idx = 0; idx < 5; idx++)
-        if (configurations[idx] != NULL)
-            t = configurations[idx]->configureTime(t);
-
-    return t;
-}
+    if (!root.endsWith("/"))
+        root += "/";
 
-bool AbstractCook::interTempEnabled()
-{
-    return interTempEnabled_;
-}
+    this->type = type;
+    this->root = root;
+    this->name = name;
 
-void AbstractCook::setInterTempEnabled(bool enabled)
-{
-    interTempEnabled_ = enabled;
+    initialize();
 }
 
-int AbstractCook::interTemp()
+void Cook::initialize()
 {
-    int t = interTemp_;
-    for (int idx = 0; idx < 5; idx++)
-        if (configurations[idx] != NULL)
-            t = configurations[idx]->configureInterTemp(t);
+    if (type == Define::InvalidCookType || root.isEmpty() || name.isEmpty())
+        return;
 
-    return t;
-}
+    QFile file(root + "config.csv");
+    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        showError("File not found: " + file.fileName());
+        return;
+    }
 
-Cook::Step AbstractCook::currentStep()
-{
-    return step(currentStepIndex());
-}
+    int lineCount = 0;
+    int configIndex = 0;
+    while (!file.atEnd())
+    {
+        if (configIndex == 5)
+            break;
 
-int AbstractCook::currentStepIndex()
-{
-    return currentStep_;
-}
+        lineCount++;
 
-void AbstractCook::setCurrentStepIndex(int index)
-{
-    if (index < stepCount_ && index >= 0)
-        currentStep_ = index;
-}
+        QString line = QString::fromUtf8(file.readLine()).trimmed();
+        if (line.isEmpty())
+            continue;
 
-int AbstractCook::stepCount()
-{
-    return stepCount_;
-}
+        if (line.startsWith("use"))
+            continue;
 
-Cook::Step AbstractCook::step(int index)
-{
-    if (index < stepCount_)
-    {
-        Cook::Step s = stepList[index];
-        for (int idx = 0; idx < 5; idx++)
-            if (configurations[idx] != NULL)
-                s = configurations[idx]->configureStep(s);
+        QString errorMessage = QString("%3: %1, line %2").arg(file.fileName()).arg(lineCount);
 
-        return s;
-    }
-    else
-        return Cook::Step { Cook::Invalid, Cook::SteamMode, 0, 0 };
-}
+        QString use = line.section(',', 0, 0).trimmed();
+        if (use.isEmpty())
+        {
+            showError(errorMessage.arg("Use column must be filled"));
+            file.close();
+            return;
+        }
 
-Cook::StepClass Cook::classify(Cook::StepType type)
-{
-    switch (type)
-    {
-    case Preheat:
-        return PreheatClass;
-    case PutThermometer:
-    case Load:
-    case Cut:
-    case Pour:
-        return DoorClass;
-    case Bake:
-    case Dry:
-    case Ferment:
-    case BlowSteam:
-    case CoolDown:
-    case Steam:
-    case Roast:
-    case Boil:
-    case Thicken:
-    case WarmUp:
-    case MakeCrispy:
-    case Finish:
-    case Damp:
-    case Defer:
-    case Grill:
-    case End:
-    case Burn:
-    case Fry:
-    case HeatUp:
-    case Ripen:
-    case RipenKeep:
-    case BoilSteadily:
-    case CookGratin:
-    case Brown:
-    case Simmer:
-    case Moisten:
-        return CookClass;
-    default:
-        return InvalidClass;
+        if (use == "yes")
+        {
+            CookConfig config;
+
+            config.type = Define::identifyConfigType(line.section(',', 1, 1).trimmed());
+            if (config.type == Define::InvalidConfig)
+            {
+                showError(errorMessage.arg("Invalid configuration type"));
+                file.close();
+                return;
+            }
+
+            bool ok;
+            config.maximum = line.section(',', 2, 2).trimmed().toInt(&ok);
+            if (!ok)
+            {
+                showError(errorMessage.arg("Invalid count"));
+                file.close();
+                return;
+            }
+
+            config.current = line.section(',', 3, 3).trimmed().toInt(&ok);
+            if (!ok)
+            {
+                showError(errorMessage.arg("Invalid default"));
+                file.close();
+                return;
+            }
+
+            configs[configIndex++] = config;
+        }
+        else
+            configs[configIndex++] = CookConfig { Define::ConfigNotUsed, 0, 0 };
     }
-}
 
-Cook::Configuration AbstractCookConfig::type()
-{
-    return type_;
-}
+    file.close();
 
-QString AbstractCookConfig::icon()
-{
-    return icon_;
-}
+    for (int i = configIndex; i < 5; i++)
+        configs[configIndex++] = CookConfig { Define::ConfigNotUsed, 0, 0 };
 
-QString AbstractCookConfig::overlayIcon()
-{
-    return overayIcon_;
+    isInitialized_ = true;
 }
 
-QString AbstractCookConfig::minLabel()
+void Cook::setConfig(int first, int second, int third, int fourth, int fifth)
 {
-    return minLabel_;
-}
+    if (!isInitialized())
+        return;
 
-QString AbstractCookConfig::maxLabel()
-{
-    return maxLabel_;
-}
+    int currents[5] = { first, second, third, fourth, fifth };
+    for (int i = 0; i < 5; i++)
+    {
+        if (configs[i].type == Define::ConfigNotUsed)
+            continue;
 
-QString AbstractCookConfig::currentLabel()
-{
-    return currentLabel_;
+        if (configs[i].current != currents[i])
+        {
+            configs[i].current = currents[i];
+            isLoaded_ = false;
+        }
+    }
 }
 
-int AbstractCookConfig::count()
+void Cook::load()
 {
-    return count_;
-}
+    if (!isInitialized())
+        return;
 
-void AbstractCookConfig::setCount(int value)
-{
-    count_ = value;
-    if (current_ > count_)
-        current_ = count_;
-}
+    QString selection;
+    for (int i = 0; i < 5; i++)
+    {
+        if (configs[i].type == Define::ConfigNotUsed)
+            continue;
 
-int AbstractCookConfig::current()
-{
-    return current_;
-}
+        selection += QString::number(configs[i].current);
+    }
 
-void AbstractCookConfig::setCurrent(int value)
-{
-    current_ = qBound(1, value, count_);
-}
+    QFile dataFile(root + "data." + selection + ".csv");
+    if (!dataFile.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        showError("File not found: " + dataFile.fileName());
+        return;
+    }
 
-int AbstractCookConfig::standard()
-{
-    return standard_;
-}
+    steps.clear();
 
-void AbstractCookConfig::setStandard(int value)
-{
-    standard_ = qBound(1, value, count_);
-    setCurrent(standard_);
-}
+    int lineCount = 0;
+    while (!dataFile.atEnd())
+    {
+        lineCount++;
 
-int AbstractCookConfig::configureTime(int standardTime)
-{
-    return standardTime;
-}
+        QString line = QString::fromUtf8(dataFile.readLine()).trimmed();
+        if (line.isEmpty())
+            continue;
 
-int AbstractCookConfig::configureInterTemp(int standardInterTemp)
-{
-    return standardInterTemp;
-}
+        if (line.startsWith("type"))
+            continue;
 
-Cook::Step AbstractCookConfig::configureStep(Cook::Step standardStep)
-{
-    return standardStep;
-}
+        QString errorMessage = QString("%3: %1, line %2").arg(dataFile.fileName()).arg(lineCount);
 
-BrightnessConfig::BrightnessConfig()
-{
-    type_ = Cook::Brightness;
-    icon_ = ":/images/slider_icon/gau_icon_01.png";
-    overayIcon_ = ":/images/slider_icon/gau_icon_01_ov.png";
-    minLabel_ = "연한색";
-    maxLabel_ = "진한색";
-}
+        CookStep step;
+        bzero(&step, sizeof(step));
 
-Cook::Step BrightnessConfig::configureStep(Cook::Step standardStep)
-{
-    int dVal = current_ - standard_;
-    qreal m = 1.0 - 0.05 * dVal;
+        step.type = Define::identifyStepType(line.section(',', 0, 0).trimmed());
+        switch (Define::classify(step.type))
+        {
+        case Define::InvalidClass:
+            showError(errorMessage.arg("Invalid type"));
+            continue;
+        case Define::DoorClass:
+            steps.append(step);
+            continue;
+        default:
+            break;
+        }
 
-    standardStep.humidity =
-            qBound(0, (int) round(standardStep.humidity * m), 100);
+        step.mode = Define::identifyMode(line.section(',', 1, 1).trimmed());
+        if (step.mode == Define::InvalidMode)
+        {
+            showError(errorMessage.arg("Invalid mode"));
+            continue;
+        }
 
-    return standardStep;
-}
+        bool ok;
 
-TimeConfig::TimeConfig()
-{
-    type_ = Cook::Time;
-    icon_ = ":/images/slider_icon/time.png";
-    overayIcon_ = ":/images/slider_icon/time_ov.png";
-    minLabel_ = "단시간";
-    maxLabel_ = "장시간";
-}
+        step.humidity = line.section(',', 3, 3).trimmed().toInt(&ok);
+        if (!ok || step.humidity < 0 || step.humidity > 100)
+        {
+            showError(errorMessage.arg("Invalid humidity"));
+            continue;
+        }
 
-int TimeConfig::configureTime(int standardTime)
-{
-    int dVal = current_ - standard_;
-    qreal m = 1.0 + 0.1 * dVal;
+        step.temp = line.section(',', 4, 4).trimmed().toInt(&ok);
+        if (!ok || step.temp < 30 || step.temp > 300)
+        {
+            showError(errorMessage.arg("Invalid temperature"));
+            continue;
+        }
 
-    standardTime = qBound(0, (int) round(standardTime * m), 24 * 60 * 60);
+        step.fan = line.section(',', 6, 6).trimmed().toInt(&ok);
+        if (!ok || step.fan < 1 || step.fan > 5)
+        {
+            showError(errorMessage.arg("Invalid fan level"));
+            continue;
+        }
 
-    return standardTime;
-}
+        if (step.type == Define::Preheat)
+        {
+            steps.append(step);
+            continue;
+        }
 
-BurnDegreeConfig::BurnDegreeConfig()
-{
-    type_ = Cook::BurnDegree;
-    icon_ = ":/images/slider_icon/gau_icon_02.png";
-    overayIcon_ = ":/images/slider_icon/gau_icon_02_ov.png";
-    minLabel_ = "중간 익힘";
-    maxLabel_ = "완전 익힘";
-}
+        step.time = line.section(',', 2, 2).trimmed().toInt(&ok);
+        if (!ok || step.time <= 0)
+        {
+            showError(errorMessage.arg("Invalid time"));
+            continue;
+        }
 
-Cook::Step BurnDegreeConfig::configureStep(Cook::Step standardStep)
-{
-    int dVal = current_ - standard_;
-    qreal m = 1.0 + 0.03 * dVal;
+        int tInt = line.section(',', 5, 5).trimmed().toInt(&ok);
+        if (ok)
+        {
+            if (tInt < 0 || tInt > 100)
+            {
+                showError(errorMessage.arg("Invalid coreTemperature"));
+                continue;
+            }
 
-    standardStep.temp =
-            qBound(30, (int) round(standardStep.temp * m), 300);
+            step.coreTemp = tInt;
+        }
 
-    return standardStep;
-}
+        tInt = line.section(',', 7, 7).trimmed().toInt(&ok);
+        if (ok)
+        {
+            if (tInt < 0)
+            {
+                showError(errorMessage.arg("Invalid damper"));
+                continue;
+            }
+
+            step.dehumidification = tInt;
+
+            tInt = line.section(',', 9, 9).trimmed().toInt(&ok);
+            if (ok)
+            {
+                if (tInt < 0)
+                {
+                    showError(errorMessage.arg("Invalid damperRepeat"));
+                    continue;
+                }
+
+                step.dehumidificationRepeatDelay = tInt;
+
+                tInt = line.section(',', 11, 11).trimmed().toInt(&ok);
+                if (ok)
+                {
+                    if (tInt < 0)
+                    {
+                        showError(errorMessage.arg("Invalid damperRepeatCount"));
+                        continue;
+                    }
+
+                    step.dehumidificationRepeatCount = tInt;
+                }
+            }
+        }
 
-int BurnDegreeConfig::configureInterTemp(int standardInterTemp)
-{
-    int dVal = current_ - standard_;
-    qreal m = 1.0 + 0.03 * dVal;
+        tInt = line.section(',', 8, 8).trimmed().toInt(&ok);
+        if (ok)
+        {
+            if (tInt < 0)
+            {
+                showError(errorMessage.arg("Invalid sideNozzle"));
+                continue;
+            }
+
+            step.humidification = tInt;
+
+            tInt = line.section(',', 10, 10).trimmed().toInt(&ok);
+            if (ok)
+            {
+                if (tInt < 0)
+                {
+                    showError(errorMessage.arg("Invalid sideNozzleRepeat"));
+                    continue;
+                }
+
+                step.humidificationRepeatDelay = tInt;
+
+                tInt = line.section(',', 12, 12).trimmed().toInt(&ok);
+                if (ok)
+                {
+                    if (tInt < 0)
+                    {
+                        showError(errorMessage.arg("Invalid sideNozzleRepeatCount"));
+                        continue;
+                    }
+
+                    step.humidificationRepeatCount = tInt;
+                }
+            }
+        }
 
-    standardInterTemp = qBound(0, (int) round(standardInterTemp * m), 99);
+        steps.append(step);
+    }
 
-    return standardInterTemp;
-}
+    dataFile.close();
 
-QString Cook::name(Cook::StepType type)
-{
-    switch (type)
+    QFile processFile(root + "process.csv");
+    if (!processFile.open(QIODevice::ReadOnly | QIODevice::Text))
     {
-    case Cook::Roast:
-        return "로스팅";
-    case Cook::Grill:
-        return "그릴";
-    case Cook::Boil:
-        return "끓이기";
-    case Cook::BoilSteadily:
-        return "뭉근하게 끓이기";
-    case Cook::HeatUp:
-        return "온도 높이기";
-    case Cook::Thicken:
-        return "걸쭉하게 만들기";
-    case Cook::WarmUp:
-        return "데우기";
-    case Cook::Simmer:
-        return "약한 불로 끓이기";
-    case Cook::End:
-        return "종료";
-    case Cook::MakeCrispy:
-        return "바삭함 주기";
-    case Cook::Brown:
-        return "브라우닝(갈색 내기)";
-    case Cook::BlowSteam:
-        return "스팀 쏘이기";
-    case Cook::Damp:
-        return "습윤 주기";
-    case Cook::Finish:
-        return "피니싱";
-    case Cook::Burn:
-        return "그을리기";
-    case Cook::CookGratin:
-        return "그라탱 요리";
-    case Cook::CoolDown:
-        return "식히기";
-    case Cook::Defer:
-        return "보류";
-    case Cook::RipenKeep:
-        return "숙성 & 보존";
-    case Cook::Bake:
-        return "베이킹";
-    case Cook::Fry:
-        return "기름에 재빨리 볶기";
-    case Cook::Steam:
-        return "찌기";
-    case Cook::Ripen:
-        return "촉촉하게";
-    case Cook::Ferment:
-        return "숙성";
-    case Cook::Moisten:
-        return "발효";
-    case Cook::Dry:
-        return "건조시키기";
-    default:
-        return "";
+        showError("File not found: " + processFile.fileName());
+        return;
     }
-}
 
-QString Cook::icon(Cook::StepType type)
-{
-    switch (type)
+    lineCount = 0;
+    while (!processFile.atEnd())
     {
-    case Cook::Roast:
-    case Cook::Grill:
-        return ":/images/cook_step_type/sys_icon_01.png";
-    case Cook::Boil:
-    case Cook::BoilSteadily:
-    case Cook::HeatUp:
-    case Cook::Thicken:
-    case Cook::WarmUp:
-    case Cook::Simmer:
-        return ":/images/cook_step_type/sys_icon_02.png";
-    case Cook::End:
-        return ":/images/cook_step_type/sys_icon_03.png";
-    case Cook::MakeCrispy:
-    case Cook::Brown:
-    case Cook::BlowSteam:
-    case Cook::Damp:
-        return ":/images/cook_step_type/sys_icon_04.png";
-    case Cook::Finish:
-        return ":/images/cook_step_type/sys_icon_05.png";
-    case Cook::Burn:
-    case Cook::CookGratin:
-        return ":/images/cook_step_type/sys_icon_06.png";
-    case Cook::CoolDown:
-        return ":/images/cook_step_type/sys_icon_07.png";
-    case Cook::Defer:
-    case Cook::RipenKeep:
-        return ":/images/cook_step_type/sys_icon_08.png";
-    case Cook::Bake:
-        return ":/images/cook_step_type/sys_icon_09.png";
-    case Cook::Fry:
-    case Cook::Steam:
-        return ":/images/cook_step_type/sys_icon_10.png";
-    case Cook::Ripen:
-    case Cook::Ferment:
-    case Cook::Moisten:
-        return ":/images/cook_step_type/sys_icon_11.png";
-    case Cook::Dry:
-        return ":/images/cook_step_type/sys_icon_12.png";
-    default:
-        return "";
+        lineCount++;
+
+        QString line = QString::fromUtf8(processFile.readLine()).trimmed();
+        if (line.isEmpty())
+            continue;
+
+        if (line.startsWith("type"))
+            continue;
+
+        QString errorMessage = QString("%3: %1, line %2").arg(processFile.fileName()).arg(lineCount);
+
+        Define::Process process = Define::identifyProcess(line);
+        if (process == Define::InvalidProcess)
+        {
+            showError(errorMessage.arg("Invalid type"));
+            continue;
+        }
+
+        processes.append(process);
     }
-}
 
-QString Cook::icon(Cook::CookType type)
-{
-    switch (type)
+    isLoaded_ = true;
+
+    isCoreTempValid_ = false;
+    time_ = 0;
+    coreTemp_ = 0;
+    foreach (CookStep s, steps)
     {
-    case Poultry:
-        return ":/images/cook_type/poultry_ov.png";
-    case Meat:
-        return ":/images/cook_type/meat_ov.png";
-    case Fish:
-        return ":/images/cook_type/fish_ov.png";
-    case Desert:
-        return ":/images/cook_type/desert_ov.png";
-    case Vegetable:
-        return ":/images/cook_type/vegetable_ov.png";
-    case Bread:
-        return ":/images/cook_type/bread_ov.png";
-    case Etc:
-        return ":/images/cook_type/etc_ov.png";
-    default:
-        return "";
+        if (s.coreTemp)
+        {
+            isCoreTempValid_ = true;
+            coreTemp_ = s.coreTemp;
+        }
+
+        time_ += s.time;
     }
 }
 
-FriedRice::FriedRice()
+bool Cook::isCoreTempValid()
 {
-    name_ = QCoreApplication::tr("볶음밥");
-    currentStep_ = 0;
-    stepCount_ = 4;
-
-    stepList[0] = { Cook::Preheat, Cook::CombiMode, 100, 150 };
-    stepList[1] = { Cook::Load, Cook::CombiMode, 0, 0 };
-    stepList[2] = { Cook::Roast, Cook::CombiMode, 80, 130 };
-    stepList[3] = { Cook::Roast, Cook::DryMode, 30, 170 };
-}
+    if (!isLoaded())
+        load();
 
-ChickenCook::ChickenCook()
-{
-    type_ = Cook::Poultry;
-    name_ = QCoreApplication::tr("닭고기 요리");
-    currentStep_ = 0;
-    stepCount_ = 5;
-
-    stepList[0] = { Cook::Preheat, Cook::CombiMode, 100, 230 };
-    stepList[1] = { Cook::Load, Cook::CombiMode, 0, 0 };
-    stepList[2] = { Cook::Roast, Cook::CombiMode, 90, 210 };
-    stepList[3] = { Cook::Roast, Cook::CombiMode, 50, 173 };
-    stepList[4] = { Cook::Roast, Cook::DryMode, 50, 200 };
-
-    time_ = 39 * 60;
-    interTempEnabled_ = true;
-    interTemp_ = 88;
-
-    BrightnessConfig *brightness = new BrightnessConfig;
-    brightness->setCount(5);
-    brightness->setStandard(3);
-    brightness->setCurrent(3);
-    configurations[0] = brightness;
-
-    BurnDegreeConfig *burnDegree = new BurnDegreeConfig;
-    burnDegree->setCount(3);
-    burnDegree->setStandard(3);
-    burnDegree->setCurrent(3);
-    configurations[1] = burnDegree;
+    return isCoreTempValid_;
 }
 
-MeatPie::MeatPie()
+int Cook::time()
 {
-    type_ = Cook::Meat;
-    name_ = QCoreApplication::tr("고기 파이");
-    currentStep_ = 0;
-    stepCount_ = 5;
-
-    stepList[0] = { Cook::Preheat, Cook::DryMode, 100, 211 };
-    stepList[1] = { Cook::Load, Cook::DryMode, 0, 0 };
-    stepList[2] = { Cook::Bake, Cook::DryMode, 100, 191 };
-    stepList[3] = { Cook::CoolDown, Cook::DryMode, 100, 120 };
-    stepList[4] = { Cook::Bake, Cook::DryMode, 40, 120 };
-
-    time_ = (1 * 60 + 17) * 60;
-    interTempEnabled_ = true;
-    interTemp_ = 62;
-
-    BrightnessConfig *brightness = new BrightnessConfig;
-    brightness->setCount(5);
-    brightness->setStandard(3);
-    brightness->setCurrent(3);
-    configurations[0] = brightness;
-
-    BurnDegreeConfig *burnDegree = new BurnDegreeConfig;
-    burnDegree->setCount(3);
-    burnDegree->setStandard(2);
-    burnDegree->setCurrent(2);
-    configurations[1] = burnDegree;
+    if (!isLoaded())
+        load();
+
+    return time_;
 }
 
-Croissant::Croissant()
+int Cook::coreTemp()
 {
-    type_ = Cook::Bread;
-    name_ = QCoreApplication::tr("크로와상/페이스트리");
-    currentStep_ = 0;
-    stepCount_ = 6;
-
-    stepList[0] = { Cook::Preheat, Cook::CombiMode, 100, 180 };
-    stepList[1] = { Cook::Load, Cook::DryMode, 0, 0 };
-    stepList[2] = { Cook::BlowSteam, Cook::SteamMode, 100, 98 };
-    stepList[3] = { Cook::Bake, Cook::DryMode, 100, 170 };
-    stepList[4] = { Cook::Bake, Cook::DryMode, 70, 170 };
-    stepList[5] = { Cook::Bake, Cook::DryMode, 20, 170 };
-
-    time_ = 18 * 60;
-    interTempEnabled_ = false;
-    interTemp_ = 0;
-
-    BrightnessConfig *brightness = new BrightnessConfig;
-    brightness->setCount(5);
-    brightness->setStandard(3);
-    brightness->setCurrent(3);
-    configurations[0] = brightness;
-
-    TimeConfig *timeConf = new TimeConfig;
-    timeConf->setCount(3);
-    timeConf->setStandard(2);
-    timeConf->setCurrent(2);
-    configurations[4] = timeConf;
+    if (!isLoaded())
+        load();
+
+    return coreTemp_;
 }
diff --git a/app/gui/oven_control/cook.h b/app/gui/oven_control/cook.h
index 6b50178..47b09ee 100644
--- a/app/gui/oven_control/cook.h
+++ b/app/gui/oven_control/cook.h
@@ -1,205 +1,64 @@
 #ifndef COOK_H
 #define COOK_H
 
-#include <QObject>
-#include <QTimer>
-#include <QList>
+#include "define.h"
 
-namespace Cook {
-    enum CookType
-    {
-        Poultry,
-        Meat,
-        Fish,
-        Desert,
-        Vegetable,
-        Bread,
-        Etc
-    };
-
-    enum StepClass
-    {
-        InvalidClass,
-        PreheatClass,
-        DoorClass,
-        CookClass
-    };
-
-    enum StepType
-    {
-        Invalid,
-
-        Preheat,        // 예열
-        PutThermometer, // 중심 온도계 삽입
-        Load,           // 식재료 적재
-        Cut,            // 자르기
-        Pour,           // 물 붓기
-
-        Bake,           // 베이킹
-        Dry,            // 건조
-        Ferment,        // 발효
-        BlowSteam,      // 스팀 쏘이기
-        CoolDown,       // 식히기
-        Steam,          // 찌기
-        Roast,          // 로스팅
-        Boil,           // 끓이기
-        Thicken,        // 걸쭉하게 만들기
-        WarmUp,         // 데우기
-        MakeCrispy,     // 바삭하게 만들기
-        Finish,         // 피니싱
-        Damp,           // 습윤하게 만들기
-        Defer,          // 보류
-        Grill,          // 그릴
-        End,            // 종료
-        Burn,           // 그을리기
-        Fry,            // 기름에 볶기
-        HeatUp,         // 온도 높이기
-        Ripen,          // 숙성
-        RipenKeep,      // 숙성 & 보존
-        BoilSteadily,   // 뭉근하게 끓이기
-        CookGratin,     // 그라탱 요리
-        Brown,          // 브라우닝
-        Simmer,         // 약한 불로 끓이기
-        Moisten         // 촉촉하게
-    };
-
-    enum Mode {
-        SteamMode, DryMode, CombiMode
-    };
-
-    struct Step {
-        StepType type;
-        Mode mode;
-        int humidity;
-        int temp;
-    };
-
-    enum Configuration {
-        Brightness,
-        Time,
-        BurnDegree
-    };
-
-    StepClass classify(StepType type);
-    QString name(StepType type);
-    QString icon(CookType type);
-    QString icon(StepType type);
-}
-
-class AbstractCookConfig
+struct CookConfig
 {
-public:
-    Cook::Configuration type();
-    QString icon();
-    QString overlayIcon();
-    QString minLabel();
-    QString maxLabel();
-    virtual QString currentLabel();
-
-    int count();
-    int current();
-    int standard();
-
-    virtual int configureTime(int standardTime);
-    virtual int configureInterTemp(int standardInterTemp);
-    virtual Cook::Step configureStep(Cook::Step standardStep);
-
-public slots:
-    void setCount(int value);
-    void setCurrent(int value);
-    void setStandard(int value);
-
-protected:
-    Cook::Configuration type_;
-    QString icon_;
-    QString overayIcon_;
-    QString minLabel_;
-    QString maxLabel_;
-    QString currentLabel_;
-
-    int standard_;
-    int current_;
-    int count_;
+    Define::ConfigType type;
+    int maximum;
+    int current;
 };
 
-class AbstractCook
+struct CookStep
 {
-public:
-    AbstractCook() { for (int idx = 0; idx < 5; idx++) configurations[idx] = NULL; }
-    ~AbstractCook();
-
-    Cook::CookType type();
-    QString name();
-    int time();
-    bool interTempEnabled();
-    void setInterTempEnabled(bool enabled);
-    int interTemp();
-
-    Cook::Step currentStep();
-    Cook::Step step(int index);
-
-    int currentStepIndex();
-    void setCurrentStepIndex(int index);
-
-    int stepCount();
-
-    AbstractCookConfig *configurations[5];
-
-protected:
-    Cook::CookType type_;
-    QString name_;
-    int time_;
-    bool interTempEnabled_;
-    int interTemp_;
-    int currentStep_;
-    int stepCount_;
-    Cook::Step stepList[10];
+    Define::StepType type;
+    Define::Mode mode;
+    int humidity;
+    int temp;
+    int time;
+    int fan;
+    int coreTemp;
+    int dehumidification;
+    int humidification;
+    int dehumidificationRepeatDelay;
+    int humidificationRepeatDelay;
+    int dehumidificationRepeatCount;
+    int humidificationRepeatCount;
 };
 
-class BrightnessConfig : public AbstractCookConfig
+class Cook
 {
 public:
-    BrightnessConfig();
-    Cook::Step configureStep(Cook::Step standardStep);
-};
+    Cook();
+    Cook(Define::CookType type, QString root, QString name);
 
-class TimeConfig : public AbstractCookConfig
-{
-public:
-    TimeConfig();
-    int configureTime(int standardTime);
-};
+    Define::CookType type;
+    QString name;
+    QString root;
 
-class BurnDegreeConfig : public AbstractCookConfig
-{
-public:
-    BurnDegreeConfig();
-    Cook::Step configureStep(Cook::Step standardStep);
-    int configureInterTemp(int standardInterTemp);
-};
+    CookConfig configs[5];
+    QList<CookStep> steps;
+    QList<Define::Process> processes;
 
-class FriedRice : public AbstractCook
-{
-public:
-    FriedRice();
-};
+    void setConfig(int first, int second, int third, int fourth, int fifth);
 
-class ChickenCook : public AbstractCook
-{
-public:
-    ChickenCook();
-};
+    bool isInitialized() { return isInitialized_; }
+    bool isLoaded() { return isLoaded_; }
+    void load();
 
-class MeatPie : public AbstractCook
-{
-public:
-    MeatPie();
-};
+    bool isCoreTempValid();
+    int time();
+    int coreTemp();
 
-class Croissant : public AbstractCook
-{
-public:
-    Croissant();
+private:
+    bool isInitialized_;
+    bool isLoaded_;
+    bool isCoreTempValid_;
+    int time_;
+    int coreTemp_;
+
+    void initialize();
 };
 
 #endif // COOK_H
diff --git a/app/gui/oven_control/cookbook.cpp b/app/gui/oven_control/cookbook.cpp
new file mode 100644
index 0000000..82d9954
--- /dev/null
+++ b/app/gui/oven_control/cookbook.cpp
@@ -0,0 +1,102 @@
+#include "cookbook.h"
+
+#include <QApplication>
+#include <QErrorMessage>
+
+static QErrorMessage *errorDialog = NULL;
+static void showError(QString errorMessage)
+{
+    if (errorDialog == NULL)
+    {
+        errorDialog = new QErrorMessage;
+        errorDialog->setWindowModality(Qt::ApplicationModal);
+        errorDialog->setGeometry(QRect(0, 426, 900, 426));
+    }
+
+    errorDialog->showMessage(errorMessage);
+    errorDialog->exec();
+}
+
+CookBook::CookBook(Define::CookType type)
+    : type(type)
+{
+    switch (type)
+    {
+    case Define::Poultry:
+        root = QString("/prime/cookbook/poultry/");
+        break;
+    case Define::Meat:
+        root = QString("/prime/cookbook/meat/");
+        break;
+    case Define::Fish:
+        root = QString("/prime/cookbook/fish/");
+        break;
+    case Define::Desert:
+        root = QString("/prime/cookbook/desert/");
+        break;
+    case Define::Vegetable:
+        root = QString("/prime/cookbook/vegetable/");
+        break;
+    case Define::Bread:
+        root = QString("/prime/cookbook/bread/");
+        break;
+    case Define::Etc:
+        root = QString("/prime/cookbook/etc/");
+        break;
+    default:
+        return;
+    }
+
+    QFile file(root + "list.csv");
+    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        showError("File not found: " + file.fileName());
+        return;
+    }
+
+    int lineCount = 0;
+    while (!file.atEnd())
+    {
+        lineCount++;
+
+        QString line = QString::fromUtf8(file.readLine()).trimmed();
+        if (line.isEmpty())
+            continue;
+
+        if (line.startsWith("directory"))
+            continue;
+
+        QString errorMessage = QString("%3: %1, line %2").arg(file.fileName()).arg(lineCount);
+
+        QString directory = line.section(',', 0, 0).trimmed();
+        if (directory.isEmpty())
+        {
+            showError(errorMessage.arg("Directory name is missed"));
+            continue;
+        }
+
+        QString cookname = line.section(',', 1, 1).trimmed();
+        if (cookname.isEmpty())
+        {
+            showError(errorMessage.arg("Cook name is missed"));
+            continue;
+        }
+
+        list.append(cookname);
+        book.append(ListEntity { directory, cookname });
+    }
+
+    file.close();
+}
+
+Cook CookBook::get(int index)
+{
+    if (index < book.size())
+    {
+        ListEntity e = book.at(index);
+        return Cook(type, root + e.directory, e.name);
+    }
+
+    return Cook();
+}
+
diff --git a/app/gui/oven_control/cookbook.h b/app/gui/oven_control/cookbook.h
new file mode 100644
index 0000000..4200492
--- /dev/null
+++ b/app/gui/oven_control/cookbook.h
@@ -0,0 +1,29 @@
+#ifndef COOKBOOK_H
+#define COOKBOOK_H
+
+#include <QtCore>
+#include <QList>
+
+#include "define.h"
+#include "cook.h"
+
+class CookBook
+{
+public:
+    CookBook() {}
+    CookBook(Define::CookType type);
+    QList<QString> list;
+    Cook get(int index);
+
+private:
+    struct ListEntity {
+        QString directory;
+        QString name;
+    };
+
+    Define::CookType type;
+    QString root;
+    QList<ListEntity> book;
+};
+
+#endif // COOKBOOK_H
diff --git a/app/gui/oven_control/define.cpp b/app/gui/oven_control/define.cpp
new file mode 100644
index 0000000..5b30b87
--- /dev/null
+++ b/app/gui/oven_control/define.cpp
@@ -0,0 +1,495 @@
+#include "define.h"
+
+Define::ConfigType Define::identifyConfigType(QString type)
+{
+    if (type == "brightness")
+        return Brightness;
+    else if (type == "cookinglevel")
+        return BurnDegree;
+    else if (type == "boiledlevel")
+        return SoftBoilDegree;
+    else if (type == "size")
+        return PieceSize;
+    else if (type == "crispy1")
+        return CrispyDegree;
+    else if (type == "moisten1")
+        return MoistDegree;
+    else if (type == "thickness")
+        return Thickness;
+    else if (type == "humidity")
+        return Humidity;
+    else if (type == "temperature")
+        return Temperature;
+    else if (type == "cookingtime")
+        return Time;
+    else if (type == "coretemperature")
+        return CoreTemperature;
+    else if (type == "coretemperaturesensor")
+        return Thermometer;
+    else
+        return InvalidConfig;
+}
+
+Define::StepType Define::identifyStepType(QString type)
+{
+    if (type == "preheat")
+        return Preheat;
+    else if (type == "load")        //
+        return Load;
+    else if (type == "therometer")  //
+        return PutThermometer;
+    else if (type == "cut")         //
+        return Cut;
+    else if (type == "pour")        //
+        return Pour;
+    else if (type == "bake")
+        return Bake;
+    else if (type == "dry")
+        return Dry;
+    else if (type == "ferment")
+        return Ferment;
+    else if (type == "steaming")
+        return BlowSteam;
+    else if (type == "cooldown")
+        return CoolDown;
+    else if (type == "steam")
+        return Steam;
+    else if (type == "roasting")
+        return Roast;
+    else if (type == "boil")
+        return Boil;
+    else if (type == "thicken")
+        return Thicken;
+    else if (type == "warmup")
+        return WarmUp;
+    else if (type == "crispy2")
+        return MakeCrispy;
+    else if (type == "finish")
+        return Finish;
+    else if (type == "damp")
+        return Damp;
+    else if (type == "defer")
+        return Defer;
+    else if (type == "grill")
+        return Grill;
+    else if (type == "end")
+        return End;
+    else if (type == "burn")
+        return Burn;
+    else if (type == "fry")
+        return Fry;
+    else if (type == "heatup")
+        return HeatUp;
+    else if (type == "ripen")
+        return Ripen;
+    else if (type == "ripenkeep")
+        return RipenKeep;
+    else if (type == "boilsteadily")
+        return BoilSteadily;
+    else if (type == "cookgratin")
+        return CookGratin;
+    else if (type == "brown")
+        return Brown;
+    else if (type == "simmer")
+        return Simmer;
+    else if (type == "moisten2")
+        return Moisten;
+    else
+        return Invalid;
+}
+
+Define::StepClass Define::classify(Define::StepType type)
+{
+    switch (type)
+    {
+    case Invalid:
+        return InvalidClass;
+    case Preheat:
+        return PreheatClass;
+    case PutThermometer:
+    case Load:
+    case Cut:
+    case Pour:
+        return DoorClass;
+    case Bake:
+    case Dry:
+    case Ferment:
+    case BlowSteam:
+    case CoolDown:
+    case Steam:
+    case Roast:
+    case Boil:
+    case Thicken:
+    case WarmUp:
+    case MakeCrispy:
+    case Finish:
+    case Damp:
+    case Defer:
+    case Grill:
+    case End:
+    case Burn:
+    case Fry:
+    case HeatUp:
+    case Ripen:
+    case RipenKeep:
+    case BoilSteadily:
+    case CookGratin:
+    case Brown:
+    case Simmer:
+    case Moisten:
+        return CookClass;
+    }
+
+    return InvalidClass;
+}
+
+Define::Mode Define::identifyMode(QString mode)
+{
+    if (mode == "combi")
+        return CombiMode;
+    else if (mode == "dry")
+        return DryMode;
+    else if (mode == "steam")
+        return SteamMode;
+    else
+        return InvalidMode;
+}
+
+QString Define::icon(Define::CookType type)
+{
+    switch (type)
+    {
+    case Poultry:
+        return ":/images/cook_type/poultry_ov.png";
+    case Meat:
+        return ":/images/cook_type/meat_ov.png";
+    case Fish:
+        return ":/images/cook_type/fish_ov.png";
+    case Desert:
+        return ":/images/cook_type/desert_ov.png";
+    case Vegetable:
+        return ":/images/cook_type/vegetable_ov.png";
+    case Bread:
+        return ":/images/cook_type/bread_ov.png";
+    case Etc:
+        return ":/images/cook_type/etc_ov.png";
+    default:
+        return "";
+    }
+}
+
+QString Define::icon(Define::ConfigType type)
+{
+    switch (type)
+    {
+    case Brightness:
+        return ":/images/slider_icon/gau_icon_01.png";
+    case BurnDegree:
+        return ":/images/slider_icon/gau_icon_02.png";
+    case SoftBoilDegree:
+        return ":/images/slider_icon/gau_icon_03.png";
+    case PieceSize:
+        return ":/images/slider_icon/gau_icon_04.png";
+    case CrispyDegree:
+        return ":/images/slider_icon/gau_icon_05.png";
+    case MoistDegree:
+        return ":/images/slider_icon/gau_icon_06.png";
+    case Thickness:
+        return ":/images/slider_icon/gau_icon_07.png";
+    case Humidity:
+        return ":/images/slider_icon/humidity.png";
+    case Temperature:
+        return ":/images/slider_icon/temp.png";
+    case Time:
+        return ":/images/slider_icon/time.png";
+    case CoreTemperature:
+        return ":/images/slider_icon/core_temp_enabled.png";
+    case Thermometer:
+        return ":/images/slider_icon/thermometer_enabled.png";
+    case InvalidConfig:
+    case ConfigNotUsed:
+    default:
+        return "";
+    }
+}
+
+QString Define::iconOverlay(Define::ConfigType type)
+{
+    switch (type)
+    {
+    case Brightness:
+        return ":/images/slider_icon/gau_icon_01_ov.png";
+    case BurnDegree:
+        return ":/images/slider_icon/gau_icon_02_ov.png";
+    case SoftBoilDegree:
+        return ":/images/slider_icon/gau_icon_03_ov.png";
+    case PieceSize:
+        return ":/images/slider_icon/gau_icon_04_ov.png";
+    case CrispyDegree:
+        return ":/images/slider_icon/gau_icon_05_ov.png";
+    case MoistDegree:
+        return ":/images/slider_icon/gau_icon_06_ov.png";
+    case Thickness:
+        return ":/images/slider_icon/gau_icon_07_ov.png";
+    case Humidity:
+        return ":/images/slider_icon/humidity_ov.png";
+    case Temperature:
+        return ":/images/slider_icon/temp_ov.png";
+    case Time:
+        return ":/images/slider_icon/time_ov.png";
+    case CoreTemperature:
+        return ":/images/slider_icon/core_temp_ov.png";
+    case Thermometer:
+        return ":/images/slider_icon/thermometer_ov.png";
+    case InvalidConfig:
+    case ConfigNotUsed:
+    default:
+        return "";
+    }
+}
+
+QString Define::minimum(Define::ConfigType type)
+{
+    switch (type)
+    {
+    case Brightness:
+        return "연한색";
+    case BurnDegree:
+        return "중간익힘";
+    case SoftBoilDegree:
+        return "반숙";
+    case PieceSize:
+        return "작은조각";
+    case CrispyDegree:
+        return "연한색";
+    case MoistDegree:
+        return "촉촉하게";
+    case Thickness:
+        return "얇음";
+    case Humidity:
+        return "건조함";
+    case Temperature:
+        return "약";
+    case Time:
+        return "단시간";
+    case CoreTemperature:
+        return "따뜻함";
+    case Thermometer:
+        return "있음";
+    case InvalidConfig:
+    case ConfigNotUsed:
+    default:
+        return "";
+    }
+}
+
+QString Define::maximum(Define::ConfigType type)
+{
+    switch (type)
+    {
+    case Brightness:
+        return "진한색";
+    case BurnDegree:
+        return "완전익힘";
+    case SoftBoilDegree:
+        return "완숙";
+    case PieceSize:
+        return "큰조각";
+    case CrispyDegree:
+        return "진한색";
+    case MoistDegree:
+        return "완전익힘";
+    case Thickness:
+        return "두꺼움";
+    case Humidity:
+        return "습윤";
+    case Temperature:
+        return "강";
+    case Time:
+        return "장시간";
+    case CoreTemperature:
+        return "뜨거움";
+    case Thermometer:
+        return "없음";
+    case InvalidConfig:
+    case ConfigNotUsed:
+    default:
+        return "";
+    }
+}
+
+QString Define::icon(Define::StepType type)
+{
+    switch (type)
+    {
+    case Roast:
+    case Grill:
+        return ":/images/cook_step_type/sys_icon_01.png";
+    case Boil:
+    case BoilSteadily:
+    case HeatUp:
+    case Thicken:
+    case WarmUp:
+    case Simmer:
+        return ":/images/cook_step_type/sys_icon_02.png";
+    case End:
+        return ":/images/cook_step_type/sys_icon_03.png";
+    case MakeCrispy:
+    case Brown:
+    case BlowSteam:
+    case Damp:
+        return ":/images/cook_step_type/sys_icon_04.png";
+    case Preheat:
+    case Finish:
+        return ":/images/cook_step_type/sys_icon_05.png";
+    case Burn:
+    case CookGratin:
+        return ":/images/cook_step_type/sys_icon_06.png";
+    case CoolDown:
+        return ":/images/cook_step_type/sys_icon_07.png";
+    case Defer:
+    case RipenKeep:
+        return ":/images/cook_step_type/sys_icon_08.png";
+    case Bake:
+        return ":/images/cook_step_type/sys_icon_09.png";
+    case Fry:
+    case Steam:
+        return ":/images/cook_step_type/sys_icon_10.png";
+    case Ripen:
+    case Ferment:
+    case Moisten:
+        return ":/images/cook_step_type/sys_icon_11.png";
+    case Dry:
+        return ":/images/cook_step_type/sys_icon_12.png";
+    default:
+        return "";
+    }
+}
+
+QString Define::name(Define::StepType type)
+{
+    switch (type)
+    {
+    case Preheat:
+        return "예열";
+    case PutThermometer:
+        return "중심 온도계 삽입";
+    case Load:
+        return "식재료 적재";
+    case Cut:
+        return "자르기";
+    case Pour:
+        return "물 붓기";
+    case Bake:
+        return "베이킹";
+    case Dry:
+        return "건조";
+    case Ferment:
+        return "발효";
+    case BlowSteam:
+        return "스팀 쏘이기";
+    case CoolDown:
+        return "식히기";
+    case Steam:
+        return "찌기";
+    case Roast:
+        return "로스팅";
+    case Boil:
+        return "끓이기";
+    case Thicken:
+        return "걸쭉하게 만들기";
+    case WarmUp:
+        return "데우기";
+    case MakeCrispy:
+        return "바삭하게 만들기";
+    case Finish:
+        return "피니싱";
+    case Damp:
+        return "습윤하게 만들기";
+    case Defer:
+        return "보류";
+    case Grill:
+        return "그릴";
+    case End:
+        return "종료";
+    case Burn:
+        return "그을리기";
+    case Fry:
+        return "기름에 재빨리 볶기";
+    case HeatUp:
+        return "온도 높이기";
+    case Ripen:
+        return "숙성";
+    case RipenKeep:
+        return "숙성 & 보존";
+    case BoilSteadily:
+        return "뭉근하게 끓이기";
+    case CookGratin:
+        return "그라탱 요리";
+    case Brown:
+        return "브라우닝";
+    case Simmer:
+        return "약한 불로 끓이기";
+    case Moisten:
+        return "촉촉하게";
+    default:
+        return "";
+    }
+}
+
+Define::Process Define::identifyProcess(QString type)
+{
+    if (type == "again")
+        return CookAgain;
+    else if (type == "crispy3")
+        return MakeCrisper;
+    else if (type == "heatreserve")
+        return KeepWarm;
+    else
+        return InvalidProcess;
+}
+
+QString Define::icon(Define::Process type)
+{
+    switch (type)
+    {
+    case CookAgain:
+        return ":/images/auto_button/option_btn_01.png";
+    case MakeCrisper:
+        return ":/images/auto_button/option_btn_01.png";
+    case KeepWarm:
+        return ":/images/auto_button/option_btn_01.png";
+    default:
+        return ":/images/button/152.png";
+    }
+}
+
+QString Define::iconOverlay(Define::Process type)
+{
+    switch (type)
+    {
+    case CookAgain:
+        return ":/images/auto_button/option_btn_01_ov.png";
+    case MakeCrisper:
+        return ":/images/auto_button/option_btn_01_ov.png";
+    case KeepWarm:
+        return ":/images/auto_button/option_btn_01_ov.png";
+    default:
+        return ":/images/button/152_ov.png";
+    }
+}
+
+QString Define::name(Define::Process type)
+{
+    switch (type)
+    {
+    case CookAgain:
+        return "새로운 재료 넣기";
+    case MakeCrisper:
+        return "바삭함 주기";
+    case KeepWarm:
+        return "보온 유지";
+    default:
+        return "";
+    }
+}
diff --git a/app/gui/oven_control/define.h b/app/gui/oven_control/define.h
new file mode 100644
index 0000000..a0962b9
--- /dev/null
+++ b/app/gui/oven_control/define.h
@@ -0,0 +1,118 @@
+#ifndef DEFINE_H
+#define DEFINE_H
+
+#include <QtCore>
+
+namespace Define
+{
+    enum CookType
+    {
+        InvalidCookType,
+        Poultry,
+        Meat,
+        Fish,
+        Desert,
+        Vegetable,
+        Bread,
+        Etc
+    };
+
+    QString icon(CookType type);
+
+    enum ConfigType
+    {
+        InvalidConfig,
+        ConfigNotUsed,
+        Brightness,
+        BurnDegree,
+        SoftBoilDegree,
+        PieceSize,
+        CrispyDegree,
+        MoistDegree,
+        Thickness,
+        Humidity,
+        Temperature,
+        Time,
+        CoreTemperature,
+        Thermometer
+    };
+
+    ConfigType identifyConfigType(QString type);
+    QString icon(ConfigType type);
+    QString iconOverlay(ConfigType type);
+    QString minimum(ConfigType type);
+    QString maximum(ConfigType type);
+
+    enum StepClass
+    {
+        InvalidClass,
+        PreheatClass,
+        DoorClass,
+        CookClass
+    };
+
+    enum StepType
+    {
+        Invalid,
+
+        Preheat,        // 예열
+
+        PutThermometer, // 중심 온도계 삽입
+        Load,           // 식재료 적재
+        Cut,            // 자르기
+        Pour,           // 물 붓기
+
+        Bake,           // 베이킹
+        Dry,            // 건조
+        Ferment,        // 발효
+        BlowSteam,      // 스팀 쏘이기
+        CoolDown,       // 식히기
+        Steam,          // 찌기
+        Roast,          // 로스팅
+        Boil,           // 끓이기
+        Thicken,        // 걸쭉하게 만들기
+        WarmUp,         // 데우기
+        MakeCrispy,     // 바삭하게 만들기
+        Finish,         // 피니싱
+        Damp,           // 습윤하게 만들기
+        Defer,          // 보류
+        Grill,          // 그릴
+        End,            // 종료
+        Burn,           // 그을리기
+        Fry,            // 기름에 볶기
+        HeatUp,         // 온도 높이기
+        Ripen,          // 숙성
+        RipenKeep,      // 숙성 & 보존
+        BoilSteadily,   // 뭉근하게 끓이기
+        CookGratin,     // 그라탱 요리
+        Brown,          // 브라우닝
+        Simmer,         // 약한 불로 끓이기
+        Moisten         // 촉촉하게
+    };
+
+    StepType identifyStepType(QString type);
+    StepClass classify(StepType type);
+    QString icon(StepType type);
+    QString name(StepType type);
+
+    enum Mode {
+        InvalidMode, SteamMode, DryMode, CombiMode
+    };
+
+    Mode identifyMode(QString mode);
+
+    enum Process
+    {
+        InvalidProcess,
+        CookAgain,
+        MakeCrisper,
+        KeepWarm
+    };
+
+    Process identifyProcess(QString type);
+    QString icon(Process type);
+    QString iconOverlay(Process type);
+    QString name(Process type);
+}
+
+#endif // DEFINE_H
diff --git a/app/gui/oven_control/keepwarmpopup.cpp b/app/gui/oven_control/keepwarmpopup.cpp
new file mode 100644
index 0000000..d7348ec
--- /dev/null
+++ b/app/gui/oven_control/keepwarmpopup.cpp
@@ -0,0 +1,34 @@
+#include "keepwarmpopup.h"
+#include "ui_keepwarmpopup.h"
+
+KeepWarmPopup::KeepWarmPopup(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::KeepWarmPopup)
+{
+    ui->setupUi(this);
+
+    setAttribute(Qt::WA_DeleteOnClose);
+
+    connect(&updateViewTimer, SIGNAL(timeout()), SLOT(updateView()));
+    updateViewTimer.start(100);
+
+    startTime.start();
+}
+
+KeepWarmPopup::~KeepWarmPopup()
+{
+    delete ui;
+}
+
+void KeepWarmPopup::updateView()
+{
+    int elapsed = startTime.elapsed() / 1000;
+    ui->timeLabel->setText(QString("%1:%2")
+                           .arg(elapsed / 60, 2, 10, QLatin1Char('0'))
+                           .arg(elapsed % 60, 2, 10, QLatin1Char('0')));
+}
+
+void KeepWarmPopup::on_stopButton_clicked()
+{
+    close();
+}
diff --git a/app/gui/oven_control/keepwarmpopup.h b/app/gui/oven_control/keepwarmpopup.h
new file mode 100644
index 0000000..76bd9a9
--- /dev/null
+++ b/app/gui/oven_control/keepwarmpopup.h
@@ -0,0 +1,32 @@
+#ifndef KEEPWARMPOPUP_H
+#define KEEPWARMPOPUP_H
+
+#include <QWidget>
+#include <QTime>
+#include <QTimer>
+
+namespace Ui {
+class KeepWarmPopup;
+}
+
+class KeepWarmPopup : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit KeepWarmPopup(QWidget *parent = 0);
+    ~KeepWarmPopup();
+
+private:
+    Ui::KeepWarmPopup *ui;
+
+    QTime startTime;
+    QTimer updateViewTimer;
+
+
+private slots:
+    void updateView();
+    void on_stopButton_clicked();
+};
+
+#endif // KEEPWARMPOPUP_H
diff --git a/app/gui/oven_control/keepwarmpopup.ui b/app/gui/oven_control/keepwarmpopup.ui
new file mode 100644
index 0000000..0643911
--- /dev/null
+++ b/app/gui/oven_control/keepwarmpopup.ui
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>KeepWarmPopup</class>
+ <widget class="QWidget" name="KeepWarmPopup">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>900</width>
+    <height>1600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">QPushButton { border: none; }</string>
+  </property>
+  <widget class="QWidget" name="background" native="true">
+   <property name="geometry">
+    <rect>
+     <x>21</x>
+     <y>446</y>
+     <width>858</width>
+     <height>984</height>
+    </rect>
+   </property>
+   <property name="styleSheet">
+    <string notr="true">#background {
+background-image: url(:/images/background/original.png);
+margin: -446px -170px -21px -21px;
+padding: 446px 170px 21px 21px;
+image: url(:/images/background/popup/error.png);
+}</string>
+   </property>
+   <widget class="QLabel" name="label">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>0</y>
+      <width>858</width>
+      <height>227</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>NanumGothic</family>
+      <pointsize>18</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>보온 유지</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_2">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>227</y>
+      <width>858</width>
+      <height>252</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>NanumGothic</family>
+      <pointsize>14</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>보온 유지 중입니다</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QLabel" name="timeLabel">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>479</y>
+      <width>858</width>
+      <height>252</height>
+     </rect>
+    </property>
+    <property name="palette">
+     <palette>
+      <active>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </active>
+      <inactive>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>255</red>
+          <green>255</green>
+          <blue>255</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </inactive>
+      <disabled>
+       <colorrole role="WindowText">
+        <brush brushstyle="SolidPattern">
+         <color alpha="255">
+          <red>123</red>
+          <green>123</green>
+          <blue>123</blue>
+         </color>
+        </brush>
+       </colorrole>
+      </disabled>
+     </palette>
+    </property>
+    <property name="font">
+     <font>
+      <family>NanumGothic</family>
+      <pointsize>22</pointsize>
+      <weight>75</weight>
+      <bold>true</bold>
+     </font>
+    </property>
+    <property name="text">
+     <string>00:00</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignCenter</set>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="stopButton">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>731</y>
+      <width>858</width>
+      <height>252</height>
+     </rect>
+    </property>
+    <property name="font">
+     <font>
+      <pointsize>10</pointsize>
+     </font>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">QPushButton { color: white; }
+QPushButton:pressed { color: yellow; }</string>
+    </property>
+    <property name="text">
+     <string>중단</string>
+    </property>
+   </widget>
+  </widget>
+  <widget class="QPushButton" name="upperCloseButton">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>900</width>
+     <height>446</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string/>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="leftCloseButton">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>446</y>
+     <width>21</width>
+     <height>984</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string/>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="rightCloseButton">
+   <property name="geometry">
+    <rect>
+     <x>879</x>
+     <y>446</y>
+     <width>130</width>
+     <height>984</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string/>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="bottomCloseButton">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>1430</y>
+     <width>900</width>
+     <height>170</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string/>
+   </property>
+  </widget>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>upperCloseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>KeepWarmPopup</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>449</x>
+     <y>222</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>449</x>
+     <y>799</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>leftCloseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>KeepWarmPopup</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>10</x>
+     <y>937</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>449</x>
+     <y>799</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>rightCloseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>KeepWarmPopup</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>943</x>
+     <y>937</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>449</x>
+     <y>799</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>bottomCloseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>KeepWarmPopup</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>449</x>
+     <y>1514</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>449</x>
+     <y>799</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/app/gui/oven_control/oven_control.pro b/app/gui/oven_control/oven_control.pro
index 75b0885..70d4ef6 100644
--- a/app/gui/oven_control/oven_control.pro
+++ b/app/gui/oven_control/oven_control.pro
@@ -14,7 +14,7 @@ TEMPLATE = app
 
 
 SOURCES += main.cpp\
-        mainwindow.cpp \
+    mainwindow.cpp \
     cook.cpp \
     oven.cpp \
     abstractoveninterface.cpp \
@@ -46,7 +46,11 @@ SOURCES += main.cpp\
     engineermenuwindow.cpp \
     ovenstatics.cpp \
     servicedatas.cpp \
-    popupwindow.cpp
+    popupwindow.cpp \
+    cookbook.cpp \
+    define.cpp \
+    autocook.cpp \
+    keepwarmpopup.cpp
 
 HEADERS  += mainwindow.h \
     cook.h \
@@ -81,7 +85,11 @@ HEADERS  += mainwindow.h \
     engineermenuwindow.h \
     ovenstatics.h \
     servicedatas.h \
-    popupwindow.h
+    popupwindow.h \
+    cookbook.h \
+    define.h \
+    autocook.h \
+    keepwarmpopup.h
 
 FORMS    += mainwindow.ui \
     manualcookwindow.ui \
@@ -100,7 +108,8 @@ FORMS    += mainwindow.ui \
     preheatpopup.ui \
     cooldownpopup.ui \
     engineermenuwindow.ui \
-    popupwindow.ui 
+    popupwindow.ui \
+    keepwarmpopup.ui
 
 RESOURCES += \
     resources.qrc
diff --git a/app/gui/oven_control/preheattempgauge.cpp b/app/gui/oven_control/preheattempgauge.cpp
index 1f6dca8..6625901 100644
--- a/app/gui/oven_control/preheattempgauge.cpp
+++ b/app/gui/oven_control/preheattempgauge.cpp
@@ -9,32 +9,41 @@ PreheatTempGauge::PreheatTempGauge(QWidget *parent) : QWidget(parent)
     indicator.load(":/images/gauge/bar_indicator.png");
     body.load(":/images/gauge/bar_short_red.png");
 
-    value = 0;
+    val = 0;
     min = 0;
     max = 1;
 }
 
 void PreheatTempGauge::setValue(int value)
 {
-    this->value = qBound(min, value, max);
+    if (value == val)
+        return;
+
+    val = qBound(min, value, max);
 
     update();
 }
 
 void PreheatTempGauge::setMinimum(int minimum)
 {
+    if (minimum == min)
+        return;
+
     min = minimum;
     max = qMax(min, max);
-    value = qBound(min, value, max);
+    val = qBound(min, val, max);
 
     update();
 }
 
 void PreheatTempGauge::setMaximum(int maximum)
 {
+    if (maximum == max)
+        return;
+
     max = maximum;
     min = qMin(min, max);
-    value = qBound(min, value, max);
+    val = qBound(min, val, max);
 
     update();
 }
@@ -45,7 +54,7 @@ void PreheatTempGauge::paintEvent(QPaintEvent */*event*/)
     painter.setBrush(Qt::NoBrush);
     painter.setPen(Qt::NoPen);
 
-    qreal percentage = (qreal) (value - min) / qMax(max - min, 1);
+    qreal percentage = (qreal) (val - min) / qMax(max - min, 1);
     percentage = qBound((qreal) 0.0, percentage, (qreal) 1.0);
 
     QRect targetRect(
diff --git a/app/gui/oven_control/preheattempgauge.h b/app/gui/oven_control/preheattempgauge.h
index 56436c5..9340112 100644
--- a/app/gui/oven_control/preheattempgauge.h
+++ b/app/gui/oven_control/preheattempgauge.h
@@ -13,7 +13,7 @@ public:
 signals:
 
 public slots:
-    void setValue(int value);
+    void setValue(int val);
     void setMinimum(int minimum);
     void setMaximum(int maximum);
 
@@ -25,7 +25,7 @@ protected:
     QPixmap border;
     QPixmap indicator;
 
-    int value;
+    int val;
     int min;
     int max;
 };
-- 
2.1.4