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:
99
tests/unit/test_horn.cpp
Normal file
99
tests/unit/test_horn.cpp
Normal 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));
|
||||
}
|
||||
Reference in New Issue
Block a user