Skip to content

Commit

Permalink
Train: fix speedMax value
Browse files Browse the repository at this point in the history
  • Loading branch information
gfgit committed Sep 14, 2024
1 parent 7b1ba46 commit 65ff801
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 13 deletions.
56 changes: 43 additions & 13 deletions server/src/train/train.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -572,16 +572,13 @@ void Train::updateSpeedTable()

*m_speedTable = TrainSpeedTable::buildTable(speedCurves);

// Update max speed TODO: update also speedMax property
const auto& lastEntry = m_speedTable->getEntryAt(m_speedTable->count() - 1);
maxSpeedPoint.speedMetersPerSecond = lastEntry.avgSpeed;
maxSpeedPoint.tableIdx = m_speedTable->count() - 1;

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

updateSpeedMax();
}

void Train::scheduleSpeedTableUpdate()
Expand Down Expand Up @@ -701,19 +698,52 @@ void Train::updatePowered()

void Train::updateSpeedMax()
{
maxSpeedPoint = SpeedPoint();

double realMaxSpeedMS = 0;
bool speedWasAdjusted = false;

if(!vehicles->empty() && powered)
{
const auto itEnd = vehicles->end();
auto it = vehicles->begin();
double kmph = (*it)->vehicle->speedMax.getValue(SpeedUnit::KiloMeterPerHour);
for(; it != itEnd; ++it)
for(const auto& item : *vehicles)
{
if(m_speedTable && isPowered(item.vehicle))
continue; // Already taken into account by speed table max

const SpeedProperty& vehicleMax = item.vehicle->speedMax;
const double v = vehicleMax.getValue(SpeedUnit::MeterPerSecond);

if((v > 0 && v < realMaxSpeedMS) || !speedWasAdjusted)
{
speedWasAdjusted = true;
realMaxSpeedMS = v;
}
}
}

if(m_speedTable)
{
if(speedWasAdjusted)
{
// Round to closest match or set to table max speed
auto match = m_speedTable->getClosestMatch(realMaxSpeedMS / m_world.scaleRatio);
maxSpeedPoint.speedMetersPerSecond = match.tableEntry.avgSpeed;
maxSpeedPoint.tableIdx = match.tableIdx;
}
else if(!vehicles->empty() && powered)
{
const double v = (*it)->vehicle->speedMax.getValue(SpeedUnit::KiloMeterPerHour);
if((v > 0 || isPowered(*(*it)->vehicle)) && v < kmph)
kmph = v;
// Set to table max speed in case all vehicles are powered or with zero max speed
const uint32_t lastTableIdx = m_speedTable->count() - 1;
maxSpeedPoint.speedMetersPerSecond = m_speedTable->getEntryAt(lastTableIdx).avgSpeed;
maxSpeedPoint.tableIdx = lastTableIdx;
}
speedMax.setValueInternal(convertUnit(kmph, SpeedUnit::KiloMeterPerHour, speedMax.unit()));

realMaxSpeedMS = maxSpeedPoint.speedMetersPerSecond * m_world.scaleRatio;
speedWasAdjusted = true;
}

if(speedWasAdjusted)
speedMax.setValueInternal(convertUnit(realMaxSpeedMS, SpeedUnit::MeterPerSecond, speedMax.unit()));
else
speedMax.setValueInternal(0);

Expand Down
14 changes: 14 additions & 0 deletions server/src/vehicle/rail/poweredrailvehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ void PoweredRailVehicle::destroying()
void PoweredRailVehicle::loaded()
{
RailVehicle::loaded();
updateMaxSpeed();
registerDecoder();
}

Expand All @@ -107,6 +108,19 @@ void PoweredRailVehicle::worldEvent(WorldState state, WorldEvent event)
Attributes::setEnabled(power, editable);
}

void PoweredRailVehicle::updateMaxSpeed()
{
if(!m_speedCurve)
return;

double speedMS = m_speedCurve->getSpeedForStep(126);
speedMS *= m_world.scaleRatio;

speedMax.setValueInternal(convertUnit(speedMS,
SpeedUnit::MeterPerSecond,
speedMax.unit()));
}

void PoweredRailVehicle::registerDecoder()
{
//Disconnect from previous decoder
Expand Down
2 changes: 2 additions & 0 deletions server/src/vehicle/rail/poweredrailvehicle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ class PoweredRailVehicle : public RailVehicle
void loaded() override;
void worldEvent(WorldState state, WorldEvent event) override;

void updateMaxSpeed();

void registerDecoder();
boost::signals2::connection decoderConnection;

Expand Down

0 comments on commit 65ff801

Please sign in to comment.