Skip to content

Commit

Permalink
Train: initial TrainSpeedTable code
Browse files Browse the repository at this point in the history
- PoweredRailVehicle: added VehicleSpeedCurve
  • Loading branch information
gfgit committed Sep 12, 2024
1 parent 5e9414c commit 40278b0
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
56 changes: 56 additions & 0 deletions server/src/train/train.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "trainblockstatus.hpp"
#include "trainlist.hpp"
#include "trainlisttablemodel.hpp"
#include "trainspeedtable.hpp"
#include "trainvehiclelist.hpp"
#include "trainvehiclelistitem.hpp"
#include "../world/world.hpp"
Expand Down Expand Up @@ -364,6 +365,57 @@ void Train::updateSpeed()
updateEnabled();
}

void Train::updateSpeedTable()
{
if(!active)
{
// Delay recalculation to when active
m_speedTable.reset();
m_speedTableNeedsRecalculation = true;
return;
}

// Recalculate speed table
m_speedTableNeedsRecalculation = false;

if(m_poweredVehicles.empty())
{
m_speedTable.reset();
return;
}

std::vector<VehicleSpeedCurve> speedCurves;
speedCurves.reserve(m_poweredVehicles.size());
for(const auto& vehicle : m_poweredVehicles)
{
if(!vehicle->m_speedCurve)
{
// All vehicles must have a speed curve loaded
m_speedTable.reset();
return;
}

speedCurves.push_back(*vehicle->m_speedCurve);
}

if(!m_speedTable)
m_speedTable.reset(new TrainSpeedTable);

*m_speedTable = TrainSpeedTable::buildTable(speedCurves);

if(m_speedTable->count() == 1)
{
// No match was found, only null entry
m_speedTable.reset();
}
}

void Train::checkSpeedTable()
{
if(!m_speedTable || m_speedTableNeedsRecalculation)
updateSpeedTable();
}

void Train::vehiclesChanged()
{
updateLength();
Expand Down Expand Up @@ -402,6 +454,8 @@ void Train::updatePowered()
if(auto poweredVehicle = std::dynamic_pointer_cast<PoweredRailVehicle>(item->vehicle.value()))
m_poweredVehicles.emplace_back(poweredVehicle);
powered.setValueInternal(!m_poweredVehicles.empty());

updateSpeedTable();
}

void Train::updateSpeedMax()
Expand Down Expand Up @@ -487,6 +541,8 @@ bool Train::setTrainActive(bool val)
const bool stopValue = emergencyStop;
for(const auto& vehicle : m_poweredVehicles)
vehicle->setEmergencyStop(stopValue);

checkSpeedTable();
}
else
{
Expand Down
5 changes: 5 additions & 0 deletions server/src/train/train.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class TrainVehicleList;
class TrainBlockStatus;
class BlockRailTile;
class PoweredRailVehicle;
class TrainSpeedTable;

class Train : public IdObject
{
Expand All @@ -56,12 +57,16 @@ class Train : public IdObject
};

std::vector<std::shared_ptr<PoweredRailVehicle>> m_poweredVehicles;
std::unique_ptr<TrainSpeedTable> m_speedTable;
bool m_speedTableNeedsRecalculation = false;

boost::asio::steady_timer m_speedTimer;
SpeedState m_speedState = SpeedState::Idle;

void setSpeed(double kmph);
void updateSpeed();
void updateSpeedTable();
void checkSpeedTable();

void vehiclesChanged();
void updateLength();
Expand Down
5 changes: 5 additions & 0 deletions server/src/vehicle/rail/poweredrailvehicle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@
#ifndef TRAINTASTIC_SERVER_VEHICLE_RAIL_POWEREDRAILVEHICLE_HPP
#define TRAINTASTIC_SERVER_VEHICLE_RAIL_POWEREDRAILVEHICLE_HPP

#include <memory>
#include "railvehicle.hpp"
#include <traintastic/enum/direction.hpp>
#include "../../core/powerproperty.hpp"

class VehicleSpeedCurve;

class PoweredRailVehicle : public RailVehicle
{
protected:
Expand All @@ -44,6 +47,8 @@ class PoweredRailVehicle : public RailVehicle
float lastTrainSpeedStep = 0;
Direction lastTrainSetDirection = Direction::Unknown;

std::unique_ptr<VehicleSpeedCurve> m_speedCurve; //TODO: initialize?

public:
PowerProperty power;

Expand Down

0 comments on commit 40278b0

Please sign in to comment.