mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 10:29:19 +02:00
Merge branch 'tmj-dev' into milek-dev
This commit is contained in:
@@ -276,21 +276,14 @@ double TMoverParameters::Current(double n, double U)
|
||||
// *************************************************************************************************
|
||||
// główny konstruktor
|
||||
// *************************************************************************************************
|
||||
TMoverParameters::TMoverParameters(double VelInitial, std::string TypeNameInit,
|
||||
std::string NameInit, int LoadInitial,
|
||||
std::string LoadTypeInitial,
|
||||
int Cab) ://: T_MoverParameters(VelInitial, TypeNameInit,
|
||||
//NameInit, LoadInitial, LoadTypeInitial, Cab)
|
||||
TMoverParameters::TMoverParameters(double VelInitial, std::string TypeNameInit, std::string NameInit, int Cab) :
|
||||
TypeName( TypeNameInit ),
|
||||
Name( NameInit ),
|
||||
ActiveCab( Cab ),
|
||||
Load( LoadInitial ),
|
||||
LoadType( LoadTypeInitial )
|
||||
ActiveCab( Cab )
|
||||
{
|
||||
WriteLog(
|
||||
"------------------------------------------------------");
|
||||
WriteLog("init default physic values for " + NameInit + ", [" + TypeNameInit + "], [" +
|
||||
LoadTypeInitial + "]");
|
||||
WriteLog("init default physic values for " + NameInit + ", [" + TypeNameInit + "]");
|
||||
Dim = TDimension();
|
||||
|
||||
// BrakeLevelSet(-2); //Pascal ustawia na 0, przestawimy na odcięcie (CHK jest jeszcze nie wczytane!)
|
||||
@@ -352,10 +345,6 @@ LoadType( LoadTypeInitial )
|
||||
}
|
||||
eimc[eimc_p_eped] = 1.5;
|
||||
|
||||
// inicjalizacja zmiennych}
|
||||
// Loc:=LocInitial; //Ra: to i tak trzeba potem przesunąć, po ustaleniu pozycji na torze
|
||||
// (potrzebna długość)
|
||||
// Rot:=RotInitial;
|
||||
for (int b = 0; b < 2; ++b)
|
||||
{
|
||||
Couplers[b].AllowedFlag = 3; // domyślnie hak i hamulec, inne trzeba włączyć jawnie w FIZ
|
||||
@@ -407,20 +396,6 @@ LoadType( LoadTypeInitial )
|
||||
SecuritySystem.RadioStop = false; // domyślnie nie ma
|
||||
SecuritySystem.AwareMinSpeed = 0.1 * Vmax;
|
||||
s_CAtestebrake = false;
|
||||
// ABu 240105:
|
||||
// CouplerNr[0]:=1;
|
||||
// CouplerNr[1]:=0;
|
||||
|
||||
// TO POTEM TU UAKTYWNIC A WYWALIC Z CHECKPARAM}
|
||||
//{
|
||||
// if Pos(LoadTypeInitial,LoadAccepted)>0 then
|
||||
// begin
|
||||
//}
|
||||
|
||||
//{
|
||||
// end
|
||||
// else Load:=0;
|
||||
// }
|
||||
};
|
||||
|
||||
double TMoverParameters::Distance(const TLocation &Loc1, const TLocation &Loc2,
|
||||
@@ -1253,6 +1228,7 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap
|
||||
OffsetTrackH = Sign(RunningShape.R) * 0.2;
|
||||
}
|
||||
|
||||
// TODO: investigate, seems supplied NewRot is always 0 although the code here suggests some actual values are expected
|
||||
Loc = NewLoc;
|
||||
Rot = NewRot;
|
||||
NewRot.Rx = 0;
|
||||
@@ -3755,27 +3731,25 @@ void TMoverParameters::ComputeConstans(void)
|
||||
// *************************************************************************************************
|
||||
double TMoverParameters::ComputeMass(void)
|
||||
{
|
||||
double M;
|
||||
LoadType = ToLower(LoadType); // po co zakładać jak można mieć na pewno
|
||||
if (Load > 0)
|
||||
{ // zakładamy, że ładunek jest pisany małymi literami
|
||||
double M { 0.0 };
|
||||
// TODO: unit weight table, pulled from external data file
|
||||
if( LoadAmount > 0 ) {
|
||||
|
||||
if (ToLower(LoadQuantity) == "tonns")
|
||||
M = Load * 1000;
|
||||
else if (LoadType == "passengers")
|
||||
M = Load * 80;
|
||||
else if (LoadType == "luggage")
|
||||
M = Load * 100;
|
||||
else if (LoadType == "cars")
|
||||
M = Load * 1200; // 800 kilo to miał maluch
|
||||
else if (LoadType == "containers")
|
||||
M = Load * 8000;
|
||||
else if (LoadType == "transformers")
|
||||
M = Load * 50000;
|
||||
M = LoadAmount * 1000;
|
||||
else if (LoadType.name == "passengers")
|
||||
M = LoadAmount * 80;
|
||||
else if (LoadType.name == "luggage")
|
||||
M = LoadAmount * 100;
|
||||
else if (LoadType.name == "cars")
|
||||
M = LoadAmount * 1200; // 800 kilo to miał maluch
|
||||
else if (LoadType.name == "containers")
|
||||
M = LoadAmount * 8000;
|
||||
else if (LoadType.name == "transformers")
|
||||
M = LoadAmount * 50000;
|
||||
else
|
||||
M = Load * 1000;
|
||||
M = LoadAmount * 1000;
|
||||
}
|
||||
else
|
||||
M = 0;
|
||||
// Ra: na razie tak, ale nie wszędzie masy wirujące się wliczają
|
||||
return Mass + M + Mred;
|
||||
}
|
||||
@@ -6455,58 +6429,105 @@ void TMoverParameters::dizel_Heat( double const dt ) {
|
||||
*/
|
||||
}
|
||||
|
||||
bool
|
||||
TMoverParameters::AssignLoad( std::string const &Name, float const Amount ) {
|
||||
|
||||
if( Name == "pantstate" ) {
|
||||
if( EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
|
||||
// wartość niby "pantstate" - nazwa dla formalności, ważna jest ilość
|
||||
auto const pantographsetup { static_cast<int>( Amount ) };
|
||||
if( pantographsetup & ( 1 << 2 ) ) {
|
||||
DoubleTr = -1;
|
||||
}
|
||||
if( pantographsetup & ( 1 << 0 ) ) {
|
||||
if( DoubleTr == 1 ) { PantFront( true ); }
|
||||
else { PantRear( true ); }
|
||||
}
|
||||
if( pantographsetup & ( 1 << 1 ) ) {
|
||||
if( DoubleTr == 1 ) { PantRear( true ); }
|
||||
else { PantFront( true ); }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// can't mix load types, at least for the time being
|
||||
if( ( LoadAmount > 0 ) && ( LoadType.name != Name ) ) { return false; }
|
||||
|
||||
if( Name.empty() ) {
|
||||
// empty the vehicle
|
||||
LoadType = load_attributes();
|
||||
LoadAmount = 0.f;
|
||||
return true;
|
||||
}
|
||||
|
||||
for( auto const &loadattributes : LoadAttributes ) {
|
||||
if( Name == loadattributes.name ) {
|
||||
LoadType = loadattributes;
|
||||
LoadAmount = Amount;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// didn't find matching load configuration, this type is unsupported
|
||||
return false;
|
||||
}
|
||||
|
||||
// *************************************************************************************************
|
||||
// Q: 20160713
|
||||
// Test zakończenia załadunku / rozładunku
|
||||
// *************************************************************************************************
|
||||
bool TMoverParameters::LoadingDone(double LSpeed, std::string LoadInit)
|
||||
{
|
||||
// test zakończenia załadunku/rozładunku
|
||||
long LoadChange = 0;
|
||||
bool LD = false;
|
||||
bool TMoverParameters::LoadingDone(double const LSpeed, std::string const &Loadname) {
|
||||
|
||||
// ClearPendingExceptions; // zabezpieczenie dla Trunc()
|
||||
// LoadingDone:=false; //nie zakończone
|
||||
if (!LoadInit.empty()) // nazwa ładunku niepusta
|
||||
{
|
||||
if (Load > MaxLoad)
|
||||
LoadChange = abs(long(LSpeed * LastLoadChangeTime / 2.0)); // przeładowanie?
|
||||
else
|
||||
LoadChange = abs(long(LSpeed * LastLoadChangeTime));
|
||||
if (LSpeed < 0) // gdy rozładunek
|
||||
{
|
||||
LoadStatus = 2; // trwa rozładunek (włączenie naliczania czasu)
|
||||
if (LoadChange != 0) // jeśli coś przeładowano
|
||||
{
|
||||
LastLoadChangeTime = 0; // naliczony czas został zużyty
|
||||
Load -= LoadChange; // zmniejszenie ilości ładunku
|
||||
CommandIn.Value1 =
|
||||
CommandIn.Value1 - LoadChange; // zmniejszenie ilości do rozładowania
|
||||
if (Load < 0)
|
||||
Load = 0; //ładunek nie może być ujemny
|
||||
if ((Load == 0) || (CommandIn.Value1 < 0)) // pusto lub rozładowano żądaną ilość
|
||||
LoadStatus = 4; // skończony rozładunek
|
||||
if (Load == 0)
|
||||
LoadType.clear(); // jak nic nie ma, to nie ma też nazwy
|
||||
}
|
||||
}
|
||||
else if (LSpeed > 0) // gdy załadunek
|
||||
{
|
||||
LoadStatus = 1; // trwa załadunek (włączenie naliczania czasu)
|
||||
if (LoadChange != 0) // jeśli coś przeładowano
|
||||
{
|
||||
LastLoadChangeTime = 0; // naliczony czas został zużyty
|
||||
LoadType = LoadInit; // nazwa
|
||||
Load += LoadChange; // zwiększenie ładunku
|
||||
CommandIn.Value1 = CommandIn.Value1 - LoadChange;
|
||||
if ((Load >= MaxLoad * (1.0 + OverLoadFactor)) || (CommandIn.Value1 < 0))
|
||||
LoadStatus = 4; // skończony załadunek
|
||||
}
|
||||
}
|
||||
else
|
||||
LoadStatus = 4; // zerowa prędkość zmiany, to koniec
|
||||
if( LSpeed == 0.0 ) {
|
||||
// zerowa prędkość zmiany, to koniec
|
||||
LoadStatus = 4;
|
||||
return true;
|
||||
}
|
||||
return (LoadStatus >= 4);
|
||||
|
||||
if( Loadname.empty() ) { return ( LoadStatus >= 4 ); }
|
||||
if( Loadname != LoadType.name ) { return ( LoadStatus >= 4 ); }
|
||||
|
||||
// test zakończenia załadunku/rozładunku
|
||||
// load exchange speed is reduced if the wagon is overloaded
|
||||
auto const loadchange { static_cast<float>( std::abs( LSpeed * LastLoadChangeTime ) * ( LoadAmount > MaxLoad ? 0.5 : 1.0 ) ) };
|
||||
|
||||
if( LSpeed < 0 ) {
|
||||
// gdy rozładunek
|
||||
LoadStatus = 2; // trwa rozładunek (włączenie naliczania czasu)
|
||||
if( loadchange > 0 ) // jeśli coś przeładowano
|
||||
{
|
||||
LastLoadChangeTime = 0; // naliczony czas został zużyty
|
||||
LoadAmount -= loadchange; // zmniejszenie ilości ładunku
|
||||
CommandIn.Value1 -= loadchange; // zmniejszenie ilości do rozładowania
|
||||
if( ( LoadAmount <= 0 ) || ( CommandIn.Value1 <= 0 ) ) {
|
||||
// pusto lub rozładowano żądaną ilość
|
||||
LoadStatus = 4; // skończony rozładunek
|
||||
LoadAmount = std::max( 0.f, LoadAmount ); //ładunek nie może być ujemny
|
||||
}
|
||||
if( LoadAmount == 0.f ) {
|
||||
AssignLoad(""); // jak nic nie ma, to nie ma też nazwy
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( LSpeed > 0 ) {
|
||||
// gdy załadunek
|
||||
LoadStatus = 1; // trwa załadunek (włączenie naliczania czasu)
|
||||
if( loadchange > 0 ) // jeśli coś przeładowano
|
||||
{
|
||||
LastLoadChangeTime = 0; // naliczony czas został zużyty
|
||||
LoadAmount += loadchange; // zwiększenie ładunku
|
||||
CommandIn.Value1 -= loadchange;
|
||||
if( ( LoadAmount >= MaxLoad * ( 1.0 + OverLoadFactor ) ) || ( CommandIn.Value1 <= 0 ) ) {
|
||||
LoadStatus = 4; // skończony załadunek
|
||||
LoadAmount = std::min<float>( MaxLoad * ( 1.0 + OverLoadFactor ), LoadAmount );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ( LoadStatus >= 4 );
|
||||
}
|
||||
|
||||
// *************************************************************************************************
|
||||
@@ -7590,19 +7611,30 @@ void TMoverParameters::LoadFIZ_Param( std::string const &line ) {
|
||||
|
||||
void TMoverParameters::LoadFIZ_Load( std::string const &line ) {
|
||||
|
||||
extract_value( LoadAccepted, "LoadAccepted", line, "" );
|
||||
if( true == LoadAccepted.empty() ) {
|
||||
return;
|
||||
auto const acceptedloads { Split( extract_value( "LoadAccepted", line ), ',' ) };
|
||||
|
||||
if( acceptedloads.empty() ) { return; }
|
||||
|
||||
auto const minoffsets { Split( extract_value( "LoadMinOffset", line ), ',' ) };
|
||||
auto minoffset { 0.f };
|
||||
auto minoffsetsiterator { std::begin( minoffsets ) };
|
||||
// NOTE: last (if any) offset parameter retrieved from the list applies to the remainder of the list
|
||||
// TBD, TODO: include other load parameters in this system
|
||||
for( auto &load : acceptedloads ) {
|
||||
if( minoffsetsiterator != std::end( minoffsets ) ) {
|
||||
minoffset = std::stof( *minoffsetsiterator );
|
||||
++minoffsetsiterator;
|
||||
}
|
||||
LoadAttributes.emplace_back(
|
||||
ToLower( load ),
|
||||
minoffset );
|
||||
}
|
||||
LoadAccepted = ToLower( LoadAccepted );
|
||||
|
||||
extract_value( MaxLoad, "MaxLoad", line, "" );
|
||||
extract_value( LoadQuantity, "LoadQ", line, "" );
|
||||
extract_value( OverLoadFactor, "OverLoadFactor", line, "" );
|
||||
extract_value( LoadSpeed, "LoadSpeed", line, "" );
|
||||
extract_value( UnLoadSpeed, "UnLoadSpeed", line, "" );
|
||||
|
||||
extract_value( LoadMinOffset, "LoadMinOffset", line, "" );
|
||||
}
|
||||
|
||||
void TMoverParameters::LoadFIZ_Dimensions( std::string const &line ) {
|
||||
@@ -8648,11 +8680,6 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
|
||||
// WriteLogSS("aa ok", BoolToYN(OK));
|
||||
}
|
||||
|
||||
if( ( LoadType.empty() == false ) && ( LoadAccepted.find( LoadType ) == std::string::npos ) ) {
|
||||
// remove load if the type isn't supported
|
||||
Load = 0.0;
|
||||
}
|
||||
|
||||
if (BrakeSystem == TBrakeSystem::Individual)
|
||||
if (BrakeSubsystem != TBrakeSubSystem::ss_None)
|
||||
OK = false; //!
|
||||
@@ -8886,16 +8913,16 @@ bool TMoverParameters::CheckLocomotiveParameters(bool ReadyFlag, int Dir)
|
||||
|
||||
if( LoadFlag > 0 ) {
|
||||
|
||||
if( Load < MaxLoad * 0.45 ) {
|
||||
if( LoadAmount < MaxLoad * 0.45 ) {
|
||||
IncBrakeMult();
|
||||
IncBrakeMult();
|
||||
DecBrakeMult(); // TODO: przeinesiono do mover.cpp
|
||||
if( Load < MaxLoad * 0.35 )
|
||||
if( LoadAmount < MaxLoad * 0.35 )
|
||||
DecBrakeMult();
|
||||
}
|
||||
else {
|
||||
IncBrakeMult(); // TODO: przeinesiono do mover.cpp
|
||||
if( Load >= MaxLoad * 0.55 )
|
||||
if( LoadAmount >= MaxLoad * 0.55 )
|
||||
IncBrakeMult();
|
||||
}
|
||||
}
|
||||
@@ -9476,39 +9503,44 @@ bool TMoverParameters::RunCommand( std::string Command, double CValue1, double C
|
||||
OK = true; // true, gdy można usunąć komendę
|
||||
}
|
||||
/*naladunek/rozladunek*/
|
||||
else if ( issection( "Load=", Command ) )
|
||||
// TODO: have these commands leverage load exchange system instead
|
||||
else if ( issection( "Load=", Command ) )
|
||||
{
|
||||
OK = false; // będzie powtarzane aż się załaduje
|
||||
if( ( Vel < 0.01 )
|
||||
if( ( Vel < 0.1 ) // tolerance margin for small vehicle movements in the consist
|
||||
&& ( MaxLoad > 0 )
|
||||
&& ( Load < MaxLoad * ( 1.0 + OverLoadFactor ) ) ) {
|
||||
// czy można ładowac?
|
||||
if( Distance( Loc, CommandIn.Location, Dim, Dim ) < 10 ) {
|
||||
// ten peron/rampa
|
||||
auto const testload { ToLower( extract_value( "Load", Command ) ) };
|
||||
if( LoadAccepted.find( testload ) != std::string::npos ) // nazwa jest obecna w CHK
|
||||
OK = LoadingDone( Min0R( CValue2, LoadSpeed ), testload ); // zmienia LoadStatus
|
||||
&& ( LoadAmount < MaxLoad * ( 1.0 + OverLoadFactor ) )
|
||||
&& ( Distance( Loc, CommandIn.Location, Dim, Dim ) < 10 ) ) { // ten peron/rampa
|
||||
|
||||
auto const loadname { ToLower( extract_value( "Load", Command ) ) };
|
||||
if( LoadAmount == 0.f ) {
|
||||
AssignLoad( loadname );
|
||||
}
|
||||
OK = LoadingDone(
|
||||
std::min<float>( CValue2, LoadSpeed ),
|
||||
loadname ); // zmienia LoadStatus
|
||||
}
|
||||
else {
|
||||
// no loading can be done if conditions aren't met
|
||||
LastLoadChangeTime = 0.0;
|
||||
}
|
||||
// if OK then LoadStatus:=0; //nie udalo sie w ogole albo juz skonczone
|
||||
}
|
||||
else if( issection( "UnLoad=", Command ) )
|
||||
{
|
||||
OK = false; // będzie powtarzane aż się rozładuje
|
||||
if( ( Vel < 0.01 )
|
||||
&& ( Load > 0 ) ) {
|
||||
// czy jest co rozladowac?
|
||||
if( Distance( Loc, CommandIn.Location, Dim, Dim ) < 10 ) {
|
||||
// ten peron
|
||||
auto const testload { ToLower( extract_value( "UnLoad", Command ) ) }; // zgodność nazwy ładunku z CHK
|
||||
if( LoadType == testload ) {
|
||||
/*mozna to rozladowac*/
|
||||
OK = LoadingDone( -Min0R( CValue2, LoadSpeed ), testload );
|
||||
}
|
||||
}
|
||||
if( ( Vel < 0.1 ) // tolerance margin for small vehicle movements in the consist
|
||||
&& ( LoadAmount > 0 ) // czy jest co rozladowac?
|
||||
&& ( Distance( Loc, CommandIn.Location, Dim, Dim ) < 10 ) ) { // ten peron
|
||||
/*mozna to rozladowac*/
|
||||
OK = LoadingDone(
|
||||
-1.f * std::min<float>( CValue2, LoadSpeed ),
|
||||
ToLower( extract_value( "UnLoad", Command ) ) );
|
||||
}
|
||||
// if OK then LoadStatus:=0;
|
||||
}
|
||||
else {
|
||||
// no loading can be done if conditions aren't met
|
||||
LastLoadChangeTime = 0.0;
|
||||
}
|
||||
}
|
||||
else if (Command == "SpeedCntrl")
|
||||
{
|
||||
if ((EngineType == TEngineType::ElectricInductionMotor))
|
||||
|
||||
Reference in New Issue
Block a user