16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 17:29:18 +02:00

AI can make braking test

This commit is contained in:
Królik Uszasty
2020-10-25 00:47:59 +02:00
parent 40cc1cf083
commit 44df817426
4 changed files with 60 additions and 6 deletions

View File

@@ -2409,7 +2409,10 @@ bool TController::CheckVehicles(TOrders user)
if( mvOccupied->LightsPosNo > 0 ) { if( mvOccupied->LightsPosNo > 0 ) {
pVehicle->SetLights(); pVehicle->SetLights();
} }
if (OrderCurrentGet() & (Shunt | Loose_shunt | Disconnect | Connect | Change_direction)) {
// kasowanie pamieci hamowania kontrolnego
DynamicBrakeTest = 0;
}
if (AIControllFlag) if (AIControllFlag)
{ // jeśli prowadzi komputer { // jeśli prowadzi komputer
if( true == TestFlag( OrderCurrentGet(), Obey_train ) ) { if( true == TestFlag( OrderCurrentGet(), Obey_train ) ) {
@@ -2992,7 +2995,7 @@ bool TController::ReleaseEngine() {
bool TController::IncBrake() bool TController::IncBrake()
{ // zwiększenie hamowania { // zwiększenie hamowania
bool OK = false; bool OK = false;
TBrakeSystem bs = BrakeSystem == TBrakeSystem::ElectroPneumatic && ForcePNBrake ? TBrakeSystem bs = ((BrakeSystem == TBrakeSystem::ElectroPneumatic) && (ForcePNBrake)) ?
TBrakeSystem::Pneumatic : BrakeSystem; TBrakeSystem::Pneumatic : BrakeSystem;
switch( bs ) { switch( bs ) {
case TBrakeSystem::Individual: { case TBrakeSystem::Individual: {
@@ -3969,7 +3972,7 @@ void TController::SpeedCntrl(double DesiredSpeed)
void TController::SetTimeControllers() void TController::SetTimeControllers()
{ {
//1. Check the type of Main Brake Handle //1. Check the type of Main Brake Handle
if (BrakeSystem == TBrakeSystem::Pneumatic) if (BrakeSystem == TBrakeSystem::Pneumatic || ForcePNBrake)
{ {
if (mvOccupied->Handle->Time) if (mvOccupied->Handle->Time)
{ {
@@ -4171,11 +4174,11 @@ void TController::SetTimeControllers()
void TController::CheckTimeControllers() void TController::CheckTimeControllers()
{ {
//1. Check the type of Main Brake Handle //1. Check the type of Main Brake Handle
if (BrakeSystem == TBrakeSystem::ElectroPneumatic && mvOccupied->Handle->TimeEP) if (BrakeSystem == TBrakeSystem::ElectroPneumatic && mvOccupied->Handle->TimeEP && !ForcePNBrake)
{ {
mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_EPN)); mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_EPN));
} }
if (BrakeSystem == TBrakeSystem::Pneumatic && mvOccupied->Handle->Time) if ((BrakeSystem == TBrakeSystem::Pneumatic || ForcePNBrake) && mvOccupied->Handle->Time)
{ {
if (BrakeCtrlPosition > 0) if (BrakeCtrlPosition > 0)
mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_MB)); mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_MB));
@@ -6493,6 +6496,44 @@ TController::UpdateSituation(double dt) {
} }
} }
// koniec predkosci aktualnej // koniec predkosci aktualnej
if (Global.DynamicBrakeTest)
{
// hamowanie kontrolne
if ((OrderCurrentGet() & Obey_train) && (DynamicBrakeTest == 0) && (vel < VelDesired)
&& (AccDesired > 0) && (TrainParams.TTVmax >= 10.0) && (primary())
&& (vel > std::min(TrainParams.TTVmax - 2.0, 58.0)))
{
DynamicBrakeTest = 1;
DBT_VelocityBrake = vel;
DBT_VelocityRelease = vel - 8.0;
DBT_BrakingTime = ElapsedTime;
}
switch (DynamicBrakeTest)
{
case 1:
AccDesired = fAccThreshold * 1.01;
ForcePNBrake = true;
mvOccupied->EpFuseSwitch(false);
if (vel <= DBT_VelocityRelease)
{
DynamicBrakeTest = 2;
DBT_BrakingTime = ElapsedTime - DBT_BrakingTime;
DBT_MidPointAcc = AbsAccS;
DBT_ReleasingTime = ElapsedTime;
}
break;
case 2:
if (fReady < 0.5)
{
mvOccupied->EpFuseSwitch(true);
ForcePNBrake = false;
DynamicBrakeTest = 3;
DBT_ReleasingTime = ElapsedTime - DBT_ReleasingTime;
DBT_VelocityFinish = vel;
}
break;
}
}
// last step sanity check, until the whole calculation is straightened out // last step sanity check, until the whole calculation is straightened out
AccDesired = std::min( AccDesired, AccPreferred ); AccDesired = std::min( AccDesired, AccPreferred );
@@ -6759,7 +6800,7 @@ TController::UpdateSituation(double dt) {
DecSpeed(); DecSpeed();
} }
} }
if( mvOccupied->TrainType == dt_EZT ) { if( (mvOccupied->TrainType == dt_EZT) && (!ForcePNBrake) ) {
// właściwie, to warunek powinien być na działający EP // właściwie, to warunek powinien być na działający EP
// Ra: to dobrze hamuje EP w EZT // Ra: to dobrze hamuje EP w EZT
// HACK: when going downhill be more responsive to desired deceleration // HACK: when going downhill be more responsive to desired deceleration

View File

@@ -350,6 +350,12 @@ private:
TBrakeSystem BrakeSystem = TBrakeSystem::Individual; //type of main brake TBrakeSystem BrakeSystem = TBrakeSystem::Individual; //type of main brake
bool ForcePNBrake = false; //is it necessary to use PN brake instead of EP brake bool ForcePNBrake = false; //is it necessary to use PN brake instead of EP brake
int DynamicBrakeTest = 0; //is it necessary to make brake test while driving int DynamicBrakeTest = 0; //is it necessary to make brake test while driving
double DBT_VelocityBrake = 0;
double DBT_VelocityRelease = 0;
double DBT_VelocityFinish = 0;
double DBT_BrakingTime = 0;
double DBT_ReleasingTime = 0;
double DBT_MidPointAcc = 0;
int StaticBrakeTest = 0; //is it necessary to make brake test while standing int StaticBrakeTest = 0; //is it necessary to make brake test while standing
double LastReactionTime = 0.0; double LastReactionTime = 0.0;
double fActionTime = 0.0; // czas używany przy regulacji prędkości i zamykaniu drzwi double fActionTime = 0.0; // czas używany przy regulacji prędkości i zamykaniu drzwi

View File

@@ -658,6 +658,12 @@ global_settings::ConfigParse(cParser &Parser) {
Parser.getTokens(1, false); Parser.getTokens(1, false);
Parser >> iHiddenEvents; Parser >> iHiddenEvents;
} }
else if (token == "dynamicbraketest")
{
// enable dynamic brake tests made by AI drivers
Parser.getTokens();
Parser >> DynamicBrakeTest;
}
else if (token == "pause") else if (token == "pause")
{ {
// czy po wczytaniu ma być pauza? // czy po wczytaniu ma być pauza?

View File

@@ -100,6 +100,7 @@ struct global_settings {
bool bRollFix{ true }; // czy wykonać przeliczanie przechyłki bool bRollFix{ true }; // czy wykonać przeliczanie przechyłki
bool bJoinEvents{ false }; // czy grupować eventy o tych samych nazwach bool bJoinEvents{ false }; // czy grupować eventy o tych samych nazwach
int iHiddenEvents{ 1 }; // czy łączyć eventy z torami poprzez nazwę toru int iHiddenEvents{ 1 }; // czy łączyć eventy z torami poprzez nazwę toru
bool DynamicBrakeTest { false }; //enable dynamic brake tests made by AI drivers
// ui // ui
int PythonScreenUpdateRate{ 200 }; // delay between python-based screen updates, in milliseconds int PythonScreenUpdateRate{ 200 }; // delay between python-based screen updates, in milliseconds
int iTextMode{ 0 }; // tryb pracy wyświetlacza tekstowego int iTextMode{ 0 }; // tryb pracy wyświetlacza tekstowego