C

Qt Quick Ultralite Motorcycle Cluster Demo

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
#include "simulation/states.h"
#include "MotorCluster/MainModel.h"
#include "mathutils.h"

using namespace MotorCluster;

namespace {
MainModel &mainModel = MainModel::instance();

const uint32_t ChangeStateDelay = 750;
} // namespace

namespace IntroStateConstants {
const uint32_t InitialDelay = 1000;
}

namespace Simulation {

// --- Intro state
IntroState::IntroState(const StateId &nextState)
    : _nextState(nextState)
{}

void IntroState::onEnter(const StateId &, const Layer &layer, Machine &sm)
{
    _step = Step_Blank;

    mainModel.tripValue.setValue(247);
    mainModel.odoValue.setValue(5891);
    mainModel.tempValue.setValue(21);
    mainModel.timeHourValue.setValue(14);
    mainModel.timeMinuteValue.setValue(13);

    mainModel.bottomElementsVisible.setValue(false);
    mainModel.speedometerVisible.setValue(false);
    mainModel.roundGaugesVisible.setValue(false);
    mainModel.rangeVisible.setValue(false);
    mainModel.telltalesVisible.setValue(false);

    mainModel.bgLinesLeftActive.setValue(false);
    mainModel.bgLinesRightActive.setValue(false);
    mainModel.bgRoadActive.setValue(false);

    mainModel.speedValue.setValue(0);
    mainModel.rpm.setValue(0);
    mainModel.gear.setValue(0);
    mainModel.logoAnimationStart.setValue(false);

    mainModel.rpmAnimationTime.setValue(1000);

    sm.requestUpdate(IntroStateConstants::InitialDelay, false, layer);
}

void IntroState::onUpdate(uint32_t, const Layer &layer, Machine &sm)
{
    using namespace IntroStateConstants;
    _step = static_cast<Step>(_step + 1);

    switch (_step) {
    case Step_ShowLogo:
        mainModel.logoAnimationStart.setValue(true);
        sm.requestUpdate(3000, false, layer);
        break;
    case Step_ShowBLinkers:
        mainModel.leftTurnSignal.setValue(true);
        mainModel.rightTurnSignal.setValue(true);
        sm.requestUpdate(50, false, layer);
        break;
    case Step_ShowTellTales:
        mainModel.leftTurnSignal.setValue(false);
        mainModel.rightTurnSignal.setValue(false);
        mainModel.telltalesVisible.setValue(true);
        sm.requestUpdate(400, false, layer);
        break;
    case Step_ShowTachoScale:
        mainModel.tachoScaleActive.setValue(true);
        mainModel.tachoUpperFrameActive.setValue(true);
        mainModel.tachoBottomFrameActive.setValue(true);
        sm.requestUpdate(300, false, layer);
        break;
    case Step_ShowBottomElements:
        mainModel.bottomElementsVisible.setValue(true);
        sm.requestUpdate(600, false, layer);
        break;
    case Step_ShowBgLines:
        mainModel.bgLinesLeftActive.setValue(true);
        mainModel.bgLinesRightActive.setValue(true);
        sm.requestUpdate(600, false, layer);
        break;
    case Step_ShowBgRoad:
        mainModel.bgRoadActive.setValue(true);
        sm.requestUpdate(600, false, layer);
        break;
    case Step_ShowSpeedometer:
        mainModel.speedometerVisible.setValue(true);
        mainModel.rangeVisible.setValue(true);
        sm.requestUpdate(400, false, layer);
        break;
    case Step_ShowGauges:
        mainModel.roundGaugesVisible.setValue(true);
        sm.requestUpdate(2500, false, layer);
        break;
    case Step_RpmToMax:
        mainModel.rpm.setValue(16000);
        sm.requestUpdate(1000, false, layer);
        break;
    case Step_RpmToZero:
        mainModel.rpm.setValue(1000);
        sm.requestUpdate(1000, false, layer);
        break;
    case Step_Done:
        sm.changeState(_nextState, layer, ChangeStateDelay);
        break;
    default:
        break;
    }
}

// --- EndSate
EndState::EndState(const StateId &nextState)
    : _nextState(nextState)
{}

void EndState::onEnter(const StateId &, const Layer &layer, Machine &sm)
{
    _step = Step_Blank;
    sm.requestUpdate(10, false, layer);
}

void EndState::onUpdate(uint32_t, const Layer &layer, Machine &sm)
{
    _step = static_cast<Step>(_step + 1);
    switch (_step) {
    case Step_HideBgLines:
        mainModel.bgLinesLeftActive.setValue(false);
        mainModel.bgLinesRightActive.setValue(false);
        sm.requestUpdate(600, false, layer);
        break;
    case Step_HideRoad:
        mainModel.bgRoadActive.setValue(false);
        sm.requestUpdate(500, false, layer);
        break;
    case Step_HideGauges:
        mainModel.roundGaugesVisible.setValue(false);
        sm.requestUpdate(1000, false, layer);
        break;
    case Step_HideBottomElements:
        mainModel.bottomElementsVisible.setValue(false);
        sm.requestUpdate(500, false, layer);
        break;
    case Step_HideTellTales:
        mainModel.speedometerVisible.setValue(false);
        mainModel.telltalesVisible.setValue(false);
        mainModel.rangeVisible.setValue(false);
        sm.requestUpdate(500, false, layer);
        break;
    case Step_HideTachoScale:
        mainModel.tachoScaleActive.setValue(false);
        sm.requestUpdate(500, false, layer);
        break;
    case Step_HideTacho:
        mainModel.rpm.setValue(1000);
        sm.requestUpdate(500, false, layer);
        break;
    case Step_HideTachoFramesTop:
        mainModel.tachoUpperFrameActive.setValue(false);
        mainModel.tachoBottomFrameActive.setValue(false);
        mainModel.rpm.setValue(0);
        sm.requestUpdate(1500, false, layer);
        break;
    case Step_Done:
        sm.changeState(_nextState, layer, ChangeStateDelay);
        break;
    default:
        break;
    }
}

void EndState::onLeave(const StateId &, const Layer &, Machine &)
{
    mainModel.fuelLevel.setValue(30);
}

} // namespace Simulation