multimanualcook.cpp 4.53 KB
#include "multimanualcook.h"

#include "oven.h"

MultiManualCook::MultiManualCook(QObject *parent) : MultiCook(parent)
{
    mode_ = Define::InvalidMode;
    temp = 30;
    hum = 0;
    time = 0;
    modifiedTime = -1;
    state = Idle;

    checkTimer.setInterval(100);
    connect(&checkTimer, SIGNAL(timeout()), SLOT(check()));
}

QString MultiManualCook::name()
{
//    QString n("%1, %2, %3");
//    QString m;
//    switch (mode_)
//    {
//    case Define::InvalidMode:
//        m = "Invalid";
//        break;
//    case Define::SteamMode:
//        m = "Steam";
//        break;
//    case Define::CombiMode:
//        m = "Combi";
//        break;
//    case Define::DryMode:
//        m = "Dry";
//        break;
//    }

//    return n.arg(m).arg(temp).arg(hum);
    return tr("수동 요리");
}

Define::Mode MultiManualCook::mode()
{
    return mode_;
}

int MultiManualCook::temperature()
{
    return temp;
}

int MultiManualCook::humidity()
{
    return hum;
}

int MultiManualCook::remainingTime()
{
    if (modifiedTime != -1)
        return modifiedTime;

    switch (state)
    {
    case Idle:
        return time;
    case Running:
        return time -= elapsed.restart();
    case Paused:
        return time;
    case Finished:
        return 0;
    }

    return 0;
}

void MultiManualCook::increaseTime()
{
    if (state == Finished)
        return;

    if (modifiedTime == -1)
        modifiedTime = remainingTime() + 60 * 1000;
    else
        modifiedTime += 60 * 1000;
}

void MultiManualCook::decreaseTime()
{
    if (state == Finished)
        return;

    if (modifiedTime == -1)
        modifiedTime = remainingTime() - 60 * 1000;
    else
        modifiedTime -= 60 * 1000;

    if (modifiedTime < 60 * 1000)
        modifiedTime = 60 * 1000;
}

void MultiManualCook::setTime()
{
    if (state == Finished)
        return;

    if (modifiedTime == -1)
        return;

    time = modifiedTime;
    elapsed.start();
    modifiedTime = -1;

    qDebug() << QTime::currentTime() << "setTime to" << time;
}

void MultiManualCook::start()
{
    state = Running;
    elapsed.start();
    decreasedTime.start();

    checkTimer.start();
}

void MultiManualCook::stop()
{
    state = Finished;
    checkTimer.stop();
}

void MultiManualCook::pause()
{
    if (state != Running)
        return;

    state = Paused;
    time -= elapsed.elapsed();
    decreasedTime.pause();
    if (increasedTime.isValid())
        increasedTime.pause();

    checkTimer.stop();
}

void MultiManualCook::resume()
{
    if (state != Paused)
        return;

    state = Running;
    time += 30 * 1000;
    elapsed.start();
    decreasedTime.resume();
    if (increasedTime.isValid())
        increasedTime.resume();

    checkTimer.start();
}

MultiCook *MultiManualCook::clone(QObject *parent)
{
    MultiManualCook *c = new MultiManualCook(parent);
    c->mode_ = mode_;
    c->temp = temp;
    c->hum = hum;
    c->time = time;

    return (MultiCook *) c;
}

bool MultiManualCook::equals(MultiCook *other)
{
    MultiManualCook *o = qobject_cast<MultiManualCook *>(other);
    if (o == Q_NULLPTR)
        return false;

    if (o->mode_ != mode_)
        return false;

    if (o->temp != temp)
        return false;

    if (o->hum != hum)
        return false;

    if (o->time != time)
        return false;

    return true;
}

void MultiManualCook::setMode(Define::Mode mode)
{
    mode_ = mode;
}

void MultiManualCook::setTemperature(int temperature)
{
    temp = temperature;
    checkTimer.start();
}

void MultiManualCook::setHumidity(int humidity)
{
    hum = humidity;
}

void MultiManualCook::setTime(int secs)
{
    time = secs * 1000;
}

void MultiManualCook::check()
{
    if (state != Running)
        return;

    int dt = Oven::getInstance()->currentTemp() - temp;

    // checking under temperature
    if ((remainingTime() < 10 * 60 * 1000 && increasedTime.isNull())
            || (increasedTime.isValid() && increasedTime.elapsed() > 3 * 60 * 1000))
    {
        increasedTime.start();
        if (dt < -20)
        {
            int t = remainingTime();
            time = remainingTime() * 1.1;
            qDebug() << QTime::currentTime() << "Increase from" << t << "to" << remainingTime();
        }
    }

    // checking over temperature
    if (decreasedTime.elapsed() > 2 * 60 * 1000)
    {
        decreasedTime.start();
        if (dt > 20)
        {
            int t = remainingTime();
            time = remainingTime() * 0.8;
            qDebug() << QTime::currentTime() << "Reduce from" << t << "to" << remainingTime();
        }
    }

    if (remainingTime() <= 0)
        stop();
}