C
Qt Quick Ultralite Motorcycle Cluster Demo
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
#ifndef DRIVETRAIN_H
#define DRIVETRAIN_H
#include <stdint.h>
namespace Simulation {
class Drivetrain
{
public:
struct Config
{
static const int MAX_GEARS = 7;
int maxRpm;
int minRpm;
int shiftUpAtRpm;
int shiftDownAtRpm;
float tireCircumference; // cm
float diffRatio;
int gearNum;
float gearRatios[MAX_GEARS];
};
struct DriveData
{
int speed;
int rpm;
int gear;
float fuelLevel;
float odometer;
float tripDistance;
float distanceToTarget;
int targetSpeed;
float acceleration;
float targetFuel;
float fuelSpeed;
};
Drivetrain(const Config &config);
void update(uint32_t tick);
void reset();
void setSpeedTarget(int targetSpeed, bool withRandomAccChanges);
void setFuelTarget(float targetFuel, float fuelSpeed);
void setDistanceToTarget(float distance);
void forceNeutraulGear(bool setNeutral);
const DriveData &getDriveData() const;
bool isTargetSpeedReached() const;
private:
void calculateSpeedData(uint32_t tick, float acceleration);
void updateRpm(uint32_t tick, float acceleration);
void updateGearShift(uint32_t tick);
void shiftGear(int delta);
int calculateRpm(int speed, int gear) const;
void updateSpeed();
int calculateSpeed(int rpm, int gear) const;
void updateFuelLevel();
void updateOdometers(uint32_t tick);
DriveData _data;
uint32_t _timeFromLastRandomAccChange;
bool _enableRandomAccChanges;
uint32_t _timeCounterForShiftUp;
const Config &_config;
};
} // namespace Simulation
#endif // DRIVETRAIN_H