mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-24 00:49:18 +02:00
build 200806. configurable power transfer coupling type, train passenger information system announcement chime, getvalues event crash fix
This commit is contained in:
@@ -1013,7 +1013,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
// TODO: remove the check once the station system is in place
|
// TODO: remove the check once the station system is in place
|
||||||
if( m_lastexchangestop != asNextStop ) {
|
if( m_lastexchangestop != asNextStop ) {
|
||||||
auto const platformside = static_cast<int>( std::floor( std::abs( sSpeedTable[ i ].evEvent->input_value( 2 ) ) ) ) % 10;
|
auto const platformside = static_cast<int>( std::floor( std::abs( sSpeedTable[ i ].evEvent->input_value( 2 ) ) ) ) % 10;
|
||||||
auto const exchangetime = simulation::Station.update_load( pVehicles[ 0 ], TrainParams, platformside );
|
auto const exchangetime = simulation::Station.update_load( pVehicles[ end::front ], TrainParams, platformside );
|
||||||
WaitingSet( exchangetime );
|
WaitingSet( exchangetime );
|
||||||
// announce the stop name while at it
|
// announce the stop name while at it
|
||||||
announce( announcement_t::current );
|
announce( announcement_t::current );
|
||||||
|
|||||||
17
DynObj.cpp
17
DynObj.cpp
@@ -5862,7 +5862,8 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co
|
|||||||
{ "near_stop:", announcement_t::approaching },
|
{ "near_stop:", announcement_t::approaching },
|
||||||
{ "stop:", announcement_t::current },
|
{ "stop:", announcement_t::current },
|
||||||
{ "next_stop:", announcement_t::next },
|
{ "next_stop:", announcement_t::next },
|
||||||
{ "destination:", announcement_t::destination } };
|
{ "destination:", announcement_t::destination },
|
||||||
|
{ "chime:", announcement_t::chime } };
|
||||||
while( ( ( token = parser.getToken<std::string>() ) != "" )
|
while( ( ( token = parser.getToken<std::string>() ) != "" )
|
||||||
&& ( token != "}" ) ) {
|
&& ( token != "}" ) ) {
|
||||||
if( token.back() == ':' ) {
|
if( token.back() == ':' ) {
|
||||||
@@ -7050,7 +7051,7 @@ material_handle TDynamicObject::DestinationFind( std::string Destination ) {
|
|||||||
return destinationhandle;
|
return destinationhandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TDynamicObject::announce( announcement_t const Announcement ) {
|
void TDynamicObject::announce( announcement_t const Announcement, bool const Chime ) {
|
||||||
|
|
||||||
if( m_speakers.empty() ) { return; }
|
if( m_speakers.empty() ) { return; }
|
||||||
|
|
||||||
@@ -7061,6 +7062,7 @@ void TDynamicObject::announce( announcement_t const Announcement ) {
|
|||||||
if( driver == nullptr ) { return; }
|
if( driver == nullptr ) { return; }
|
||||||
|
|
||||||
auto const &timetable { driver->TrainTimetable() };
|
auto const &timetable { driver->TrainTimetable() };
|
||||||
|
auto playchime { Chime };
|
||||||
|
|
||||||
if( m_announcements[ static_cast<int>( Announcement ) ].empty() ) {
|
if( m_announcements[ static_cast<int>( Announcement ) ].empty() ) {
|
||||||
goto followup;
|
goto followup;
|
||||||
@@ -7089,6 +7091,15 @@ void TDynamicObject::announce( announcement_t const Announcement ) {
|
|||||||
if( stopnamesound.empty() ) {
|
if( stopnamesound.empty() ) {
|
||||||
goto followup;
|
goto followup;
|
||||||
}
|
}
|
||||||
|
// potentially precede the announcement with a chime...
|
||||||
|
if( ( true == playchime )
|
||||||
|
&& ( false == m_announcements[ static_cast<int>( announcement_t::chime ) ].empty() ) ) {
|
||||||
|
for( auto &speaker : m_speakers ) {
|
||||||
|
speaker.announcement_queue.emplace_back( m_announcements[ static_cast<int>( announcement_t::chime ) ] );
|
||||||
|
}
|
||||||
|
playchime = false;
|
||||||
|
}
|
||||||
|
// ...then play the announcement itself
|
||||||
for( auto &speaker : m_speakers ) {
|
for( auto &speaker : m_speakers ) {
|
||||||
speaker.announcement_queue.emplace_back( m_announcements[ static_cast<int>( Announcement ) ] );
|
speaker.announcement_queue.emplace_back( m_announcements[ static_cast<int>( Announcement ) ] );
|
||||||
speaker.announcement_queue.emplace_back( stopnamesound );
|
speaker.announcement_queue.emplace_back( stopnamesound );
|
||||||
@@ -7097,7 +7108,7 @@ void TDynamicObject::announce( announcement_t const Announcement ) {
|
|||||||
followup:
|
followup:
|
||||||
// potentially follow up with another announcement
|
// potentially follow up with another announcement
|
||||||
if( Announcement == announcement_t::next ) {
|
if( Announcement == announcement_t::next ) {
|
||||||
announce( announcement_t::destination );
|
announce( announcement_t::destination, playchime );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
DynObj.h
4
DynObj.h
@@ -156,6 +156,7 @@ enum class announcement_t : int {
|
|||||||
current,
|
current,
|
||||||
next,
|
next,
|
||||||
destination,
|
destination,
|
||||||
|
chime,
|
||||||
end
|
end
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -720,7 +721,8 @@ private:
|
|||||||
void OverheadTrack(float o);
|
void OverheadTrack(float o);
|
||||||
glm::dvec3 get_future_movement() const;
|
glm::dvec3 get_future_movement() const;
|
||||||
void move_set(double distance);
|
void move_set(double distance);
|
||||||
void announce( announcement_t const Announcement );
|
// playes specified announcement, potentially preceding it with a chime
|
||||||
|
void announce( announcement_t const Announcement, bool const Chime = true );
|
||||||
|
|
||||||
double MED[9][8]; // lista zmiennych do debugowania hamulca ED
|
double MED[9][8]; // lista zmiennych do debugowania hamulca ED
|
||||||
static std::string const MED_labels[ 8 ];
|
static std::string const MED_labels[ 8 ];
|
||||||
|
|||||||
@@ -567,6 +567,10 @@ getvalues_event::init() {
|
|||||||
m_passive = true;
|
m_passive = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if( m_targets.empty() ) {
|
||||||
|
m_ignored = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
// NOTE: GetValues retrieves data only from first specified memory cell
|
// NOTE: GetValues retrieves data only from first specified memory cell
|
||||||
// TBD, TODO: allow retrieval from more than one cell?
|
// TBD, TODO: allow retrieval from more than one cell?
|
||||||
m_input.data_source = m_targets.front();
|
m_input.data_source = m_targets.front();
|
||||||
|
|||||||
@@ -699,6 +699,7 @@ struct TCoupling {
|
|||||||
int AutomaticCouplingFlag = coupling::coupler;
|
int AutomaticCouplingFlag = coupling::coupler;
|
||||||
int AllowedFlag = ( coupling::coupler | coupling::brakehose ); //Ra: maska dostępnych
|
int AllowedFlag = ( coupling::coupler | coupling::brakehose ); //Ra: maska dostępnych
|
||||||
int PowerFlag = ( coupling::power110v | coupling::power24v );
|
int PowerFlag = ( coupling::power110v | coupling::power24v );
|
||||||
|
int PowerCoupling = coupling::permanent; // type of coupling required for power transfer
|
||||||
/*zmienne*/
|
/*zmienne*/
|
||||||
bool AutomaticCouplingAllowed { true }; // whether automatic coupling can be currently performed
|
bool AutomaticCouplingAllowed { true }; // whether automatic coupling can be currently performed
|
||||||
int CouplingFlag = 0; /*0 - wirtualnie, 1 - sprzegi, 2 - pneumatycznie, 4 - sterowanie, 8 - kabel mocy*/
|
int CouplingFlag = 0; /*0 - wirtualnie, 1 - sprzegi, 2 - pneumatycznie, 4 - sterowanie, 8 - kabel mocy*/
|
||||||
|
|||||||
@@ -1649,13 +1649,13 @@ void TMoverParameters::PowerCouplersCheck( double const Deltatime, coupling cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
case coupling::power110v: {
|
case coupling::power110v: {
|
||||||
oppositecouplingispresent = ( ( oppositecoupler.CouplingFlag & coupling::permanent ) != 0 ) && ( ( oppositecoupler.PowerFlag & coupling::power110v ) != 0 );
|
oppositecouplingispresent = ( TestFlag( oppositecoupler.CouplingFlag, oppositecoupler.PowerCoupling ) ) && ( ( oppositecoupler.PowerFlag & coupling::power110v ) != 0 );
|
||||||
localpowerexportisenabled = ( oppositecouplingispresent );
|
localpowerexportisenabled = ( oppositecouplingispresent );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case coupling::power24v: {
|
case coupling::power24v: {
|
||||||
oppositecouplingispresent = ( ( oppositecoupler.CouplingFlag & coupling::permanent ) != 0 ) && ( ( oppositecoupler.PowerFlag & coupling::power24v ) != 0 );
|
oppositecouplingispresent = ( TestFlag( oppositecoupler.CouplingFlag, oppositecoupler.PowerCoupling ) ) && ( ( oppositecoupler.PowerFlag & coupling::power24v ) != 0 );
|
||||||
localpowerexportisenabled = ( oppositecouplingispresent );
|
localpowerexportisenabled = ( oppositecouplingispresent );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -8530,59 +8530,32 @@ std::string TMoverParameters::EngineDescription(int what) const
|
|||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
double TMoverParameters::GetTrainsetVoltage( int const Coupling ) const
|
double TMoverParameters::GetTrainsetVoltage( int const Coupling ) const
|
||||||
{//ABu: funkcja zwracajaca napiecie dla calego skladu, przydatna dla EZT
|
{//ABu: funkcja zwracajaca napiecie dla calego skladu, przydatna dla EZT
|
||||||
// TBD, TODO: roll into a loop, call once per vehicle update, return cached results?
|
// TBD, TODO: call once per vehicle update, return cached results?
|
||||||
auto frontvoltage { 0.0 };
|
double voltages[] = { 0.0, 0.0 };
|
||||||
if( Couplers[ end::front ].Connected != nullptr ) {
|
for( int end = end::front; end <= end::rear; ++end ) {
|
||||||
auto const frontcouplingflag {
|
if( Couplers[ end ].Connected == nullptr ) {
|
||||||
Couplers[ end::front ].CouplingFlag
|
continue;
|
||||||
| ( ( Couplers[ end::front ].CouplingFlag & coupling::permanent ) != 0 ?
|
}
|
||||||
Couplers[ end::front ].PowerFlag :
|
auto const &coupler { Couplers[ end ] };
|
||||||
|
auto const fullcoupling {
|
||||||
|
coupler.CouplingFlag
|
||||||
|
| ( TestFlag( coupler.CouplingFlag, coupler.PowerCoupling ) ?
|
||||||
|
coupler.PowerFlag :
|
||||||
0 ) };
|
0 ) };
|
||||||
if( ( frontcouplingflag & Coupling ) != 0 ) {
|
if( ( fullcoupling & Coupling ) == 0 ) {
|
||||||
auto *connectedpowercoupling = (
|
continue;
|
||||||
( Coupling & ( coupling::highvoltage | coupling::heating ) ) != 0 ? &Couplers[ end::front ].Connected->Couplers[ Couplers[ end::front ].ConnectedNr ].power_high :
|
}
|
||||||
( Coupling & coupling::power110v ) != 0 ? &Couplers[ end::front ].Connected->Couplers[ Couplers[ end::front ].ConnectedNr ].power_110v :
|
auto *connectedpowercoupling = (
|
||||||
( Coupling & coupling::power24v ) != 0 ? &Couplers[ end::front ].Connected->Couplers[ Couplers[ end::front ].ConnectedNr ].power_24v :
|
( Coupling & ( coupling::highvoltage | coupling::heating ) ) != 0 ? &coupler.Connected->Couplers[ coupler.ConnectedNr ].power_high :
|
||||||
nullptr );
|
( Coupling & coupling::power110v ) != 0 ? &coupler.Connected->Couplers[ coupler.ConnectedNr ].power_110v :
|
||||||
if( ( connectedpowercoupling != nullptr )
|
( Coupling & coupling::power24v ) != 0 ? &coupler.Connected->Couplers[ coupler.ConnectedNr ].power_24v :
|
||||||
&& ( connectedpowercoupling->is_live ) ) {
|
nullptr );
|
||||||
frontvoltage = connectedpowercoupling->voltage;
|
if( ( connectedpowercoupling != nullptr )
|
||||||
}
|
&& ( connectedpowercoupling->is_live ) ) {
|
||||||
|
voltages[ end ] = connectedpowercoupling->voltage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto rearvoltage{ 0.0 };
|
return std::max( voltages[ end::front ], voltages[ end::rear ] );
|
||||||
if( Couplers[ end::rear ].Connected != nullptr ) {
|
|
||||||
auto const rearcouplingflag {
|
|
||||||
Couplers[ end::rear ].CouplingFlag
|
|
||||||
| ( ( Couplers[ end::rear ].CouplingFlag & coupling::permanent ) != 0 ?
|
|
||||||
Couplers[ end::rear ].PowerFlag :
|
|
||||||
0 ) };
|
|
||||||
if( ( rearcouplingflag & Coupling ) != 0 ) {
|
|
||||||
auto *connectedpowercoupling = (
|
|
||||||
( Coupling & ( coupling::highvoltage | coupling::heating ) ) != 0 ? &Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_high :
|
|
||||||
( Coupling & coupling::power110v ) != 0 ? &Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_110v :
|
|
||||||
( Coupling & coupling::power24v ) != 0 ? &Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_24v :
|
|
||||||
nullptr );
|
|
||||||
if( ( connectedpowercoupling != nullptr )
|
|
||||||
&& ( connectedpowercoupling->is_live ) ) {
|
|
||||||
rearvoltage = connectedpowercoupling->voltage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return std::max( frontvoltage, rearvoltage );
|
|
||||||
/*
|
|
||||||
return std::max(
|
|
||||||
( ( ( Couplers[end::front].Connected )
|
|
||||||
&& ( Couplers[ end::front ].Connected->Couplers[ Couplers[ end::front ].ConnectedNr ].power_high.is_live )
|
|
||||||
&& ( ( Couplers[ end::front ].CouplingFlag & Coupling ) != 0 ) ) ?
|
|
||||||
Couplers[end::front].Connected->Couplers[ Couplers[end::front].ConnectedNr ].power_high.voltage :
|
|
||||||
0.0 ),
|
|
||||||
( ( ( Couplers[end::rear].Connected )
|
|
||||||
&& ( Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_high.is_live )
|
|
||||||
&& ( ( Couplers[ end::rear ].CouplingFlag & Coupling ) != 0 ) ) ?
|
|
||||||
Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_high.voltage :
|
|
||||||
0.0 ) );
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double TMoverParameters::GetTrainsetHighVoltage() const {
|
double TMoverParameters::GetTrainsetHighVoltage() const {
|
||||||
@@ -9924,6 +9897,7 @@ void TMoverParameters::LoadFIZ_BuffCoupl( std::string const &line, int const Ind
|
|||||||
if( coupler->AllowedFlag < 0 ) {
|
if( coupler->AllowedFlag < 0 ) {
|
||||||
coupler->AllowedFlag = ( ( -coupler->AllowedFlag ) | coupling::permanent );
|
coupler->AllowedFlag = ( ( -coupler->AllowedFlag ) | coupling::permanent );
|
||||||
}
|
}
|
||||||
|
extract_value( coupler->PowerCoupling, "PowerCoupling", line, "" );
|
||||||
extract_value( coupler->PowerFlag, "PowerFlag", line, "" );
|
extract_value( coupler->PowerFlag, "PowerFlag", line, "" );
|
||||||
extract_value( coupler->control_type, "ControlType", line, "" );
|
extract_value( coupler->control_type, "ControlType", line, "" );
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user