17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-18 14:59:19 +02:00

fix: automatic coupler crashes, horns, compressor start delay, radio and cab lever sounds

- automatic couplers don't catch above the safe collision speed (#86): with crash damage on they couple at a
  closing speed of 15 km/h at most, a faster hit locks the coupling until the vehicles part and the collision
  runs its course. On the way: CollisionVelocity() read a head-on 10 + 10 km/h as 14.1 km/h (quaternions turn
  by half the angle), it's now taken from the touching ends; CollisionDetect() took the other vehicle's speed
  the wrong way round for vehicles facing each other. Head-on hits now derail sooner, at the intended limit,
- a single horn lever can't sound both tones at once (eu07/maszyna#392),
- a skid ends once the vehicle stops on locked wheels (eu07/maszyna#479),
- electronic destination signs are blanked at the end of the timetable (eu07/maszyna#446),
- horns need the air or the voltage to sound (eu07/maszyna#290, #76): HornType=[Pneumatic]|Electric and
  Horn3Type in Cntrl.; a pneumatic horn needs 0.2 MPa in the main reservoir (or the main pipe without one),
  an electric one the low voltage; the lever stays where it was put,
- compressor start delay (#67): CompressorStartDelay [s] in Brake., counted from the compressor getting its
  power, after the engine starts say; none by default,
- the channel and volume buttons of a radio without power do nothing (eu07/maszyna#429); the power check of
  the radio is TMoverParameters::RadioPowered(),
- a lever moved smoothly sounds the positions it passes (#83).

Sonar findings in the functions changed: nesting, nested conditionals, commented-out code, std::format,
references to const. Unit tests: test::pair for two vehicles running into each other, test_couplers,
test_horn, test_wheelslip, test_compressor, test_radio, test_gauge_positions.
This commit is contained in:
jerrrrycho
2026-10-17 14:41:59 +02:00
parent c7f9796387
commit ec345f94cb
21 changed files with 1235 additions and 171 deletions

99
tests/unit/test_horn.cpp Normal file
View File

@@ -0,0 +1,99 @@
#include "stdafx.h"
#include "doctest.h"
#include "vehicle.h"
#include "vehicle/horn.h"
// the horn keys of the cab: low tone (A) and high tone (shift+A), held to sound
TEST_CASE("horn: a single lever for both tones sounds one tone at a time (eu07/maszyna#392)") {
auto signal{0};
signal = horn::pressed(signal, horn::low, true);
REQUIRE(signal == horn::low);
// the lever moved over to the high tone while the low tone key is still held
signal = horn::pressed(signal, horn::high, true);
CHECK(signal == horn::high);
// letting go of the low tone key leaves the high tone sounding
signal = horn::released(signal, horn::low);
CHECK(signal == horn::high);
signal = horn::released(signal, horn::high);
CHECK(signal == 0);
}
TEST_CASE("horn: separate buttons for the tones can sound both at once") {
auto signal{0};
signal = horn::pressed(signal, horn::low, false);
signal = horn::pressed(signal, horn::high, false);
CHECK(signal == (horn::low | horn::high));
signal = horn::released(signal, horn::low);
CHECK(signal == horn::high);
}
TEST_CASE("horn: releasing a tone leaves the other bits of the signal alone") {
auto const third{4}; // the third horn, operated separately
CHECK(horn::released(horn::low | third, horn::low) == third);
CHECK(horn::pressed(third, horn::high, true) == (horn::high | third));
}
// what the horns need to sound (eu07/maszyna#290): a pneumatic horn the air of the main reservoir, an electric one
// the low voltage. the horn lever stays where the driver put it, only the horn is silent
namespace {
test::vehicle horn_vehicle(test::definition Definition) {
// a main reservoir of its own
return test::vehicle{Definition.set("Brake", "Vv", 1.0).set("Brake", "MinCP", 0.65).set("Brake", "MaxCP", 0.8)};
}
int const allhorns{horn::low | horn::high | 4};
} // namespace
TEST_CASE("horn: a pneumatic horn sounds on the air of the main reservoir only") {
auto vehicle{horn_vehicle(test::definition::load("wagon"))};
REQUIRE(vehicle->HornSupply == horn_supply::pneumatic); // the default
vehicle->Compressor = 0.65;
CHECK(vehicle->SoundingHorns(allhorns) == allhorns);
vehicle->Compressor = 0.0; // the reservoir is empty
CHECK(vehicle->SoundingHorns(allhorns) == 0);
}
TEST_CASE("horn: a vehicle without a main reservoir takes the horn air from the main pipe") {
test::vehicle vehicle{test::definition::load("wagon")};
REQUIRE(vehicle->VeselVolume == 0.0);
vehicle->ScndPipePress = 0.5;
CHECK(vehicle->SoundingHorns(horn::low) == horn::low);
vehicle->ScndPipePress = 0.0;
CHECK(vehicle->SoundingHorns(horn::low) == 0);
}
TEST_CASE("horn: an electric horn sounds on the low voltage, whatever the air") {
auto vehicle{horn_vehicle(test::definition::load("wagon").set("Cntrl", "HornType", "Electric"))};
REQUIRE(vehicle->HornSupply == horn_supply::electric);
REQUIRE(vehicle->Horn3Supply == horn_supply::electric); // the third horn follows the others unless told otherwise
vehicle->Compressor = 0.0;
vehicle->Power24vIsAvailable = true;
CHECK(vehicle->SoundingHorns(allhorns) == allhorns);
vehicle->Power24vIsAvailable = false;
CHECK(vehicle->SoundingHorns(allhorns) == 0);
}
TEST_CASE("horn: the third horn can have a supply of its own, an electric horn of a diesel say") {
auto vehicle{horn_vehicle(test::definition::load("wagon").set("Cntrl", "Horn3Type", "Electric"))};
REQUIRE(vehicle->HornSupply == horn_supply::pneumatic);
REQUIRE(vehicle->Horn3Supply == horn_supply::electric);
vehicle->Compressor = 0.0;
vehicle->Power24vIsAvailable = true;
CHECK(vehicle->SoundingHorns(allhorns) == 4);
vehicle->Compressor = 0.65;
vehicle->Power24vIsAvailable = false;
CHECK(vehicle->SoundingHorns(allhorns) == (horn::low | horn::high));
}