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