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

Merge remote-tracking branch 'TMJ/master'

This commit is contained in:
Królik Uszasty
2021-05-01 23:29:23 +02:00
11 changed files with 214 additions and 167 deletions

View File

@@ -2502,10 +2502,14 @@ bool TController::CheckVehicles(TOrders user)
{ {
// HACK: to account for su-45/46 shortcomings diesel-powered engines only activate heating in cold conditions // HACK: to account for su-45/46 shortcomings diesel-powered engines only activate heating in cold conditions
// TODO: take instead into account presence of converters in attached cars, once said presence is possible to specify // TODO: take instead into account presence of converters in attached cars, once said presence is possible to specify
auto const isheatingneeded{ ( auto const ispassengertrain { ( IsPassengerTrain ) && ( iVehicles - ControlledEnginesCount > 0 ) };
IsCargoTrain ? false : auto const isheatingcouplingactive { pVehicles[ end::front ]->is_connected( pVehicles[ end::rear ], coupling::heating ) };
has_diesel_engine() ? ( Global.AirTemperature < 10 ) : auto const isheatingneeded {
true ) }; (is_emu() || is_dmu() ? true :
// false == isheatingcouplingactive ? false :
(OrderCurrentGet() & (Obey_train | Bank)) == 0 ? false :
ispassengertrain ? (has_diesel_engine() ? (Global.AirTemperature < 10) : true) :
false)};
if( mvControlling->HeatingAllow != isheatingneeded ) { if( mvControlling->HeatingAllow != isheatingneeded ) {
cue_action( cue_action(
isheatingneeded ? isheatingneeded ?
@@ -5317,161 +5321,164 @@ TCommandType TController::BackwardScan( double const Range )
} }
// szukamy od pierwszej osi w wybranym kierunku // szukamy od pierwszej osi w wybranym kierunku
double scandir = startdir * pVehicles[0]->RaDirectionGet(); double scandir = startdir * pVehicles[0]->RaDirectionGet();
if (scandir != 0.0) {
// skanowanie toru w poszukiwaniu eventów GetValues (PutValues nie są przydatne) if( scandir == 0.0 ) { return TCommandType::cm_Unknown; }
// Ra: przy wstecznym skanowaniu prędkość nie ma znaczenia
double scandist = Range; // zmodyfikuje na rzeczywiście przeskanowane // skanowanie toru w poszukiwaniu eventów GetValues (PutValues nie są przydatne)
basic_event *e = NULL; // event potencjalnie od semafora // Ra: przy wstecznym skanowaniu prędkość nie ma znaczenia
// opcjonalnie może być skanowanie od "wskaźnika" z przodu, np. W5, Tm=Ms1, koniec toru wg drugiej osi w kierunku ruchu double scandist = Range; // zmodyfikuje na rzeczywiście przeskanowane
TTrack *scantrack = BackwardTraceRoute(scandist, scandir, pVehicles[end::front], e); basic_event *e = nullptr; // event potencjalnie od semafora
auto const dir = startdir * pVehicles[end::front]->VectorFront(); // wektor w kierunku jazdy/szukania // opcjonalnie może być skanowanie od "wskaźnika" z przodu, np. W5, Tm=Ms1, koniec toru wg
if( !scantrack ) { // drugiej osi w kierunku ruchu
// jeśli wstecz wykryto koniec toru to raczej nic się nie da w takiej sytuacji zrobić auto const *scantrack{BackwardTraceRoute(scandist, scandir, pVehicles[end::front], e)};
return TCommandType::cm_Unknown; auto const dir{startdir *
pVehicles[end::front]->VectorFront()}; // wektor w kierunku jazdy/szukania
// jeśli wstecz wykryto koniec toru to raczej nic się nie da w takiej sytuacji zrobić
if (e == nullptr)
{
return TCommandType::cm_Unknown;
}
if (typeid(*e) != typeid(getvalues_event))
{
return TCommandType::cm_Unknown;
}
// jeśli jest jakiś sygnał na widoku
double scanvel; // prędkość ustawiona semaforem
#if LOGBACKSCAN
std::string edir{"Backward scan by " + pVehicle->asName + " - " +
((scandir > 0) ? "Event2 " : "Event1 ")};
edir += "(" + (e->name()) + ")";
#endif
{
// najpierw sprawdzamy, czy semafor czy inny znak został przejechany
auto const sl{e->input_location()}; // położenie komórki pamięci
auto const pos{pVehicles[end::rear]->RearPosition()}; // pozycja tyłu
auto const sem{sl - pos}; // wektor do komórki pamięci od końca składu
if (dir.x * sem.x + dir.z * sem.z < 0)
{
// jeśli został minięty
// iloczyn skalarny jest ujemny, gdy sygnał stoi z tyłu
#if LOGBACKSCAN
WriteLog(edir + " - ignored as not passed yet");
#endif
return TCommandType::cm_Unknown; // nic
} }
else { scanvel = e->input_value(1); // prędkość przy tym semaforze
// a jeśli są dalej tory // przeliczamy odległość od semafora - potrzebne by były współrzędne początku składu
double vmechmax; // prędkość ustawiona semaforem scandist = sem.Length() - 2; // 2m luzu przy manewrach wystarczy
if( e != nullptr ) { if (scandist < 0)
// jeśli jest jakiś sygnał na widoku {
// ujemnych nie ma po co wysyłać
scandist = 0;
}
}
auto move{false}; // czy AI w trybie manewerowym ma dociągnąć pod S1
if (e->input_command() == TCommandType::cm_SetVelocity)
{
if ((scanvel == 0.0) ? (OrderCurrentGet() & (Shunt | Loose_shunt | Connect)) :
(OrderCurrentGet() & Connect))
{ // przy podczepianiu ignorować wyjazd?
move = true; // AI w trybie manewerowym ma dociągnąć pod S1
}
else
{
if ((scandist > fMinProximityDist) &&
((mvOccupied->Vel > EU07_AI_NOMOVEMENT) &&
((OrderCurrentGet() & (Shunt | Loose_shunt)) == 0)))
{
// jeśli semafor jest daleko, a pojazd jedzie, to informujemy o zmianie prędkości
// jeśli jedzie manewrowo, musi dostać SetVelocity, żeby sie na pociągowy przełączył
#if LOGBACKSCAN #if LOGBACKSCAN
std::string edir { // WriteLog(edir+"SetProximityVelocity "+AnsiString(scandist) +
"Backward scan by " // AnsiString(scanvel));
+ pVehicle->asName + " - " WriteLog(edir);
+ ( ( scandir > 0 ) ?
"Event2 " :
"Event1 " ) };
#endif #endif
// najpierw sprawdzamy, czy semafor czy inny znak został przejechany // SetProximityVelocity(scandist,scanvel,&sl);
auto pos = pVehicles[1]->RearPosition(); // pozycja tyłu return (scanvel > 0 ? TCommandType::cm_SetVelocity : TCommandType::cm_Unknown);
if( typeid( *e ) == typeid( getvalues_event ) ) }
{ // przesłać info o zbliżającym się semaforze else
{
// ustawiamy prędkość tylko wtedy, gdy ma ruszyć, stanąć albo ma stać
// if ((MoverParameters->Vel==0.0)||(scanvel==0.0)) //jeśli stoi lub ma stanąć/stać
// semafor na tym torze albo lokomtywa stoi, a ma ruszyć, albo ma stanąć, albo nie
// ruszać stop trzeba powtarzać, bo inaczej zatrąbi i pojedzie sam
// PutCommand("SetVelocity",scanvel,e->Params[9].asMemCell->Value2(),&sl,stopSem);
#if LOGBACKSCAN #if LOGBACKSCAN
edir += "(" + ( e->name() ) + ")"; WriteLog(edir + " - [SetVelocity] [" + to_string(scanvel, 2) + "] [" +
to_string(e->input_value(2), 2) + "]");
#endif #endif
auto sl = e->input_location(); // położenie komórki pamięci return (scanvel > 0 ? TCommandType::cm_SetVelocity : TCommandType::cm_Unknown);
auto sem = sl - pos; // wektor do komórki pamięci od końca składu }
if (dir.x * sem.x + dir.z * sem.z < 0) { }
// jeśli został minięty }
// iloczyn skalarny jest ujemny, gdy sygnał stoi z tyłu // reakcja AI w trybie manewrowym dodatkowo na sygnały manewrowe
if (OrderCurrentGet() ? OrderCurrentGet() & (Shunt | Loose_shunt | Connect) :
true) // w Wait_for_orders też widzi tarcze
{
if (move || e->input_command() == TCommandType::cm_ShuntVelocity)
{ // jeśli powyżej było SetVelocity 0 0, to dociągamy pod S1
/*
if ((scandist > fMinProximityDist) &&
((mvOccupied->Vel > EU07_AI_NOMOVEMENT) || (scanvel == 0.0)))
{
// jeśli tarcza jest daleko, to:
//- jesli pojazd jedzie, to informujemy o zmianie prędkości
//- jeśli stoi, to z własnej inicjatywy może podjechać pod zamkniętą tarczę
if (mvOccupied->Vel > EU07_AI_NOMOVEMENT) // tylko jeśli jedzie
{ // Mechanik->PutCommand("SetProximityVelocity",scandist,scanvel,sl);
#if LOGBACKSCAN #if LOGBACKSCAN
WriteLog(edir + " - ignored as not passed yet"); // WriteLog(edir+"SetProximityVelocity "+AnsiString(scandist)+"
// "+AnsiString(scanvel));
WriteLog(edir);
#endif #endif
return TCommandType::cm_Unknown; // nic // SetProximityVelocity(scandist,scanvel,&sl);
} // jeśli jedzie na W5 albo koniec toru, to można zmienić kierunek
vmechmax = e->input_value(1); // prędkość przy tym semaforze return (iDrivigFlags & moveTrackEnd) ? TCommandType::cm_ChangeDirection :
// przeliczamy odległość od semafora - potrzebne by były współrzędne początku składu TCommandType::cm_Unknown;
scandist = sem.Length() - 2; // 2m luzu przy manewrach wystarczy // TBD: request direction change also if VelNext in current direction is 0,
if( scandist < 0 ) { // while signal behind requests movement?
// ujemnych nie ma po co wysyłać }
scandist = 0; }
} else
bool move = false; // czy AI w trybie manewerowym ma dociągnąć pod S1 {
if( e->input_command() == TCommandType::cm_SetVelocity ) { // ustawiamy prędkość tylko wtedy, gdy ma ruszyć, albo stanąć albo ma stać pod
if( ( vmechmax == 0.0 ) ? // tarczą stop trzeba powtarzać, bo inaczej zatrąbi i pojedzie sam if
( OrderCurrentGet() & ( Shunt | Loose_shunt | Connect ) ) : // ((MoverParameters->Vel==0.0)||(scanvel==0.0)) //jeśli jedzie lub ma stanąć/stać
( OrderCurrentGet() & Connect ) ) { // przy podczepianiu ignorować wyjazd? { // nie dostanie komendy jeśli jedzie i ma jechać
move = true; // AI w trybie manewerowym ma dociągnąć pod S1 // PutCommand("ShuntVelocity",scanvel,e->Params[9].asMemCell->Value2(),&sl,stopSem);
}
else {
if( ( scandist > fMinProximityDist )
&& ( ( mvOccupied->Vel > EU07_AI_NOMOVEMENT )
&& ( ( OrderCurrentGet() & ( Shunt | Loose_shunt ) ) == 0 ) ) ) {
// jeśli semafor jest daleko, a pojazd jedzie, to informujemy o zmianie prędkości
// jeśli jedzie manewrowo, musi dostać SetVelocity, żeby sie na pociągowy przełączył
#if LOGBACKSCAN #if LOGBACKSCAN
// WriteLog(edir+"SetProximityVelocity "+AnsiString(scandist) + AnsiString(vmechmax)); WriteLog(edir + " - [ShuntVelocity] [" + to_string(scanvel, 2) + "] [" +
WriteLog(edir); to_string(e->input_value(2), 2) + "]");
#endif #endif
// SetProximityVelocity(scandist,vmechmax,&sl); return (scanvel > 0 ? TCommandType::cm_ShuntVelocity :
return ( TCommandType::cm_Unknown);
vmechmax > 0 ? }
TCommandType::cm_SetVelocity : }
TCommandType::cm_Unknown ); // NOTE: dead code due to returns in branching above
} if ((scanvel != 0.0) && (scandist < 100.0))
else { {
// ustawiamy prędkość tylko wtedy, gdy ma ruszyć, stanąć albo ma stać // jeśli Tm w odległości do 100m podaje zezwolenie na jazdę, to od razu ją
// if ((MoverParameters->Vel==0.0)||(vmechmax==0.0)) //jeśli stoi lub ma stanąć/stać // ignorujemy, aby móc szukać kolejnej eSignSkip=e; //wtedy uznajemy ignorowaną przy
// semafor na tym torze albo lokomtywa stoi, a ma ruszyć, albo ma stanąć, albo nie ruszać // poszukiwaniu nowej
// stop trzeba powtarzać, bo inaczej zatrąbi i pojedzie sam
// PutCommand("SetVelocity",vmechmax,e->Params[9].asMemCell->Value2(),&sl,stopSem);
#if LOGBACKSCAN #if LOGBACKSCAN
WriteLog( WriteLog(edir + " - will be ignored due to Ms2");
edir + " - [SetVelocity] ["
+ to_string( vmechmax, 2 ) + "] ["
+ to_string( e->input_value( 2 ), 2 ) + "]" );
#endif #endif
return ( return (scanvel > 0 ? TCommandType::cm_ShuntVelocity : TCommandType::cm_Unknown);
vmechmax > 0 ? }
TCommandType::cm_SetVelocity : */
TCommandType::cm_Unknown ); return ((VelNext > 0) ?
} TCommandType::cm_Unknown : // no need to bother if we can continue in current direction
} (scanvel == 0) ?
} TCommandType::cm_Unknown : // no need to bother with a stop signal
if (OrderCurrentGet() ? OrderCurrentGet() & (Shunt | Loose_shunt | Connect) : TCommandType::cm_ShuntVelocity); // otherwise report a relevant shunt signal behind
true) // w Wait_for_orders też widzi tarcze } // if (move?...
{ // reakcja AI w trybie manewrowym dodatkowo na sygnały manewrowe } // if (OrderCurrentGet()==Shunt)
if (move ? true : e->input_command() == TCommandType::cm_ShuntVelocity)
{ // jeśli powyżej było SetVelocity 0 0, to dociągamy pod S1 return (((e->m_passive) && (e->is_command())) ? TCommandType::cm_Command :
if ((scandist > fMinProximityDist) && TCommandType::cm_Unknown);
(mvOccupied->Vel > EU07_AI_NOMOVEMENT) || (vmechmax == 0.0) )
{ // jeśli tarcza jest daleko, to:
//- jesli pojazd jedzie, to informujemy o zmianie prędkości
//- jeśli stoi, to z własnej inicjatywy może podjechać pod zamkniętą
// tarczę
if (mvOccupied->Vel > EU07_AI_NOMOVEMENT) // tylko jeśli jedzie
{ // Mechanik->PutCommand("SetProximityVelocity",scandist,vmechmax,sl);
#if LOGBACKSCAN
// WriteLog(edir+"SetProximityVelocity "+AnsiString(scandist)+"
// "+AnsiString(vmechmax));
WriteLog(edir);
#endif
// SetProximityVelocity(scandist,vmechmax,&sl);
return (iDrivigFlags & moveTrackEnd) ?
TCommandType::cm_ChangeDirection :
TCommandType::cm_Unknown; // jeśli jedzie na W5 albo koniec toru,
// to można zmienić kierunek
}
}
else {
// ustawiamy prędkość tylko wtedy, gdy ma ruszyć, albo stanąć albo ma stać pod tarczą
// stop trzeba powtarzać, bo inaczej zatrąbi i pojedzie sam
// if ((MoverParameters->Vel==0.0)||(vmechmax==0.0)) //jeśli jedzie lub ma stanąć/stać
{ // nie dostanie komendy jeśli jedzie i ma jechać
// PutCommand("ShuntVelocity",vmechmax,e->Params[9].asMemCell->Value2(),&sl,stopSem);
#if LOGBACKSCAN
WriteLog(
edir + " - [ShuntVelocity] ["
+ to_string( vmechmax, 2 ) + "] ["
+ to_string( e->input_value( 2 ), 2 ) + "]" );
#endif
return (
vmechmax > 0 ?
TCommandType::cm_ShuntVelocity :
TCommandType::cm_Unknown );
}
}
if ((vmechmax != 0.0) && (scandist < 100.0)) {
// jeśli Tm w odległości do 100m podaje zezwolenie na jazdę, to od razu ją ignorujemy, aby móc szukać kolejnej
// eSignSkip=e; //wtedy uznajemy ignorowaną przy poszukiwaniu nowej
#if LOGBACKSCAN
WriteLog(edir + " - will be ignored due to Ms2");
#endif
return (
vmechmax > 0 ?
TCommandType::cm_ShuntVelocity :
TCommandType::cm_Unknown );
}
} // if (move?...
} // if (OrderCurrentGet()==Shunt)
if (e->m_passive) // jeśli skanowany
if (e->is_command()) // a podłączona komórka ma komendę
return TCommandType::cm_Command; // to też się obrócić
} // if (e->Type==tp_GetValues)
} // if (e)
} // if (scantrack)
} // if (scandir!=0.0)
return TCommandType::cm_Unknown; // nic
}; };
std::string TController::NextStop() const std::string TController::NextStop() const
@@ -7991,13 +7998,13 @@ TController::check_route_behind( double const Range ) {
|| ( TestFlag( iDrivigFlags, moveConnect ) ) ) }; || ( TestFlag( iDrivigFlags, moveConnect ) ) ) };
if( couplinginprogress ) { return; } if( couplinginprogress ) { return; }
auto const comm { BackwardScan( Range ) }; auto const commandbehind { BackwardScan( Range ) };
if( comm != TCommandType::cm_Unknown ) { if( commandbehind != TCommandType::cm_Unknown ) {
// jeśli w drugą można jechać // jeśli w drugą można jechać
// należy sprawdzać odległość od znalezionego sygnalizatora, // należy sprawdzać odległość od znalezionego sygnalizatora,
// aby w przypadku prędkości 0.1 wyciągnąć najpierw skład za sygnalizator // aby w przypadku prędkości 0.1 wyciągnąć najpierw skład za sygnalizator
// i dopiero wtedy zmienić kierunek jazdy, oczekując podania prędkości >0.5 // i dopiero wtedy zmienić kierunek jazdy, oczekując podania prędkości >0.5
if( comm == TCommandType::cm_Command ) { if( commandbehind == TCommandType::cm_Command ) {
// jeśli komenda Shunt to ją odbierz bez przemieszczania się (np. odczep wagony po dopchnięciu do końca toru) // jeśli komenda Shunt to ją odbierz bez przemieszczania się (np. odczep wagony po dopchnięciu do końca toru)
iDrivigFlags |= moveStopHere; iDrivigFlags |= moveStopHere;
} }

View File

@@ -408,7 +408,7 @@ private:
double IdleTime{}; // keeps track of time spent at a stop double IdleTime{}; // keeps track of time spent at a stop
double fStopTime = 0.0; // czas postoju przed dalszą jazdą (np. na przystanku) double fStopTime = 0.0; // czas postoju przed dalszą jazdą (np. na przystanku)
float ExchangeTime{ 0.0 }; // time needed to finish current load exchange float ExchangeTime{ 0.0 }; // time needed to finish current load exchange
double fShuntVelocity = 25.0; // prędkość manewrowania, zależy m.in. od składu double fShuntVelocity = 40.0; // prędkość manewrowania, zależy m.in. od składu
int iDrivigFlags = // flagi bitowe ruchu int iDrivigFlags = // flagi bitowe ruchu
moveStopPoint | // podjedź do W4 możliwie blisko moveStopPoint | // podjedź do W4 możliwie blisko
moveStopHere | // nie podjeżdżaj do semafora, jeśli droga nie jest wolna moveStopHere | // nie podjeżdżaj do semafora, jeśli droga nie jest wolna

View File

@@ -695,17 +695,24 @@ global_settings::ConfigParse(cParser &Parser) {
{ {
uart_conf.enable = true; uart_conf.enable = true;
Parser.getTokens(3, false); Parser.getTokens(3, false);
Parser >> uart_conf.port >> uart_conf.baud >> uart_conf.updatetime; Parser
>> uart_conf.port
>> uart_conf.baud
>> uart_conf.updatetime;
} }
else if (token == "uarttune") else if (token == "uarttune")
{ {
Parser.getTokens(16); Parser.getTokens(16);
Parser >> uart_conf.mainbrakemin >> uart_conf.mainbrakemax >> uart_conf.localbrakemin >> Parser
uart_conf.localbrakemax >> uart_conf.tankmax >> uart_conf.tankuart >> >> uart_conf.mainbrakemin >> uart_conf.mainbrakemax
uart_conf.pipemax >> uart_conf.pipeuart >> uart_conf.brakemax >> >> uart_conf.localbrakemin >> uart_conf.localbrakemax
uart_conf.brakeuart >> uart_conf.hvmax >> uart_conf.hvuart >> >> uart_conf.tankmax >> uart_conf.tankuart
uart_conf.currentmax >> uart_conf.currentuart >> uart_conf.lvmax >> >> uart_conf.pipemax >> uart_conf.pipeuart
uart_conf.lvuart; >> uart_conf.brakemax >> uart_conf.brakeuart
>> uart_conf.pantographmax >> uart_conf.pantographuart
>> uart_conf.hvmax >> uart_conf.hvuart
>> uart_conf.currentmax >> uart_conf.currentuart
>> uart_conf.lvmax >> uart_conf.lvuart;
} }
else if (token == "uarttachoscale") else if (token == "uarttachoscale")
{ {
@@ -715,8 +722,11 @@ global_settings::ConfigParse(cParser &Parser) {
else if (token == "uartfeature") else if (token == "uartfeature")
{ {
Parser.getTokens(4); Parser.getTokens(4);
Parser >> uart_conf.mainenable >> uart_conf.scndenable >> uart_conf.trainenable >> Parser
uart_conf.localenable; >> uart_conf.mainenable
>> uart_conf.scndenable
>> uart_conf.trainenable
>> uart_conf.localenable;
} }
else if (token == "uartdebug") else if (token == "uartdebug")
{ {
@@ -1177,6 +1187,8 @@ global_settings::export_as_text( std::ostream &Output ) const {
<< uart_conf.pipeuart << " " << uart_conf.pipeuart << " "
<< uart_conf.brakemax << " " << uart_conf.brakemax << " "
<< uart_conf.brakeuart << " " << uart_conf.brakeuart << " "
<< uart_conf.pantographmax << " "
<< uart_conf.pipemax << " "
<< uart_conf.hvmax << " " << uart_conf.hvmax << " "
<< uart_conf.hvuart << " " << uart_conf.hvuart << " "
<< uart_conf.currentmax << " " << uart_conf.currentmax << " "

View File

@@ -767,6 +767,7 @@ traction_table::InitTraction() {
scene::node_data nodedata; scene::node_data nodedata;
nodedata.name = traction->asPowerSupplyName; nodedata.name = traction->asPowerSupplyName;
powersource = new TTractionPowerSource( nodedata ); powersource = new TTractionPowerSource( nodedata );
powersource->IsAutogenerated = true;
powersource->Init( traction->NominalVoltage, traction->MaxCurrent ); powersource->Init( traction->NominalVoltage, traction->MaxCurrent );
simulation::Powergrid.insert( powersource ); simulation::Powergrid.insert( powersource );
} }

View File

@@ -33,6 +33,7 @@ public:
// members // members
TTractionPowerSource *psNode[ 2 ] = { nullptr, nullptr }; // zasilanie na końcach dla sekcji TTractionPowerSource *psNode[ 2 ] = { nullptr, nullptr }; // zasilanie na końcach dla sekcji
bool bSection = false; // czy jest sekcją bool bSection = false; // czy jest sekcją
bool IsAutogenerated { false }; // indicates autogenerated source for individual traction piece
private: private:
// methods // methods

View File

@@ -799,6 +799,7 @@ TTrain::get_state() const {
static_cast<float>( mvOccupied->Compressor ), static_cast<float>( mvOccupied->Compressor ),
static_cast<float>( mvOccupied->PipePress ), static_cast<float>( mvOccupied->PipePress ),
static_cast<float>( mvOccupied->BrakePress ), static_cast<float>( mvOccupied->BrakePress ),
static_cast<float>( mvPantographUnit->PantPress ),
fHVoltage, fHVoltage,
{ fHCurrent[ ( mvControlled->TrainType & dt_EZT ) ? 0 : 1 ], fHCurrent[ 2 ], fHCurrent[ 3 ] }, { fHCurrent[ ( mvControlled->TrainType & dt_EZT ) ? 0 : 1 ], fHCurrent[ 2 ], fHCurrent[ 3 ] },
ggLVoltage.GetValue(), ggLVoltage.GetValue(),

View File

@@ -104,6 +104,7 @@ class TTrain {
float reservoir_pressure; float reservoir_pressure;
float pipe_pressure; float pipe_pressure;
float brake_pressure; float brake_pressure;
float pantograph_pressure;
float hv_voltage; float hv_voltage;
std::array<float, 3> hv_current; std::array<float, 3> hv_current;
float lv_voltage; float lv_voltage;

View File

@@ -938,8 +938,8 @@ debug_panel::update_section_vehicle( std::vector<text_line> &Output ) {
} }
} }
} }
Output.emplace_back( textline, Global.UITextColor );
} }
Output.emplace_back( textline, Global.UITextColor );
} }
std::string std::string
@@ -1293,7 +1293,8 @@ debug_panel::update_section_powergrid( std::vector<text_line> &Output ) {
for( auto const *powerstation : simulation::Powergrid.sequence() ) { for( auto const *powerstation : simulation::Powergrid.sequence() ) {
if( true == powerstation->bSection ) { continue; } if( true == powerstation->IsAutogenerated ) { continue; }
if( true == powerstation->bSection ) { continue; }
auto const name { ( auto const name { (
powerstation->m_name.empty() ? powerstation->m_name.empty() ?

View File

@@ -106,7 +106,25 @@ editor_mode::enter() {
m_statebackup = { Global.pCamera, FreeFlyModeFlag, Global.ControlPicking }; m_statebackup = { Global.pCamera, FreeFlyModeFlag, Global.ControlPicking };
Camera = Global.pCamera; Camera = Global.pCamera;
FreeFlyModeFlag = true; // NOTE: camera placement is effectively a copy of drivermode DistantView( true )
// TBD, TODO: refactor into a common vehicle method?
if( false == FreeFlyModeFlag ) {
auto const *vehicle { Camera.m_owner };
auto const cab {
( vehicle->MoverParameters->CabOccupied == 0 ?
1 :
vehicle->MoverParameters->CabOccupied ) };
auto const left { vehicle->VectorLeft() * cab };
Camera.Pos =
Math3D::vector3( Camera.Pos.x, vehicle->GetPosition().y, Camera.Pos.z )
+ left * vehicle->GetWidth()
+ Math3D::vector3( 1.25 * left.x, 1.6, 1.25 * left.z );
Camera.m_owner = nullptr;
Camera.LookAt = vehicle->GetPosition();
Camera.RaLook(); // jednorazowe przestawienie kamery
FreeFlyModeFlag = true;
}
Global.ControlPicking = true; Global.ControlPicking = true;
EditorModeFlag = true; EditorModeFlag = true;

View File

@@ -336,7 +336,8 @@ void uart_input::poll()
uint16_t tank_press = (uint16_t)std::min(conf.tankuart, trainstate.reservoir_pressure * 0.1f / conf.tankmax * conf.tankuart); uint16_t tank_press = (uint16_t)std::min(conf.tankuart, trainstate.reservoir_pressure * 0.1f / conf.tankmax * conf.tankuart);
uint16_t pipe_press = (uint16_t)std::min(conf.pipeuart, trainstate.pipe_pressure * 0.1f / conf.pipemax * conf.pipeuart); uint16_t pipe_press = (uint16_t)std::min(conf.pipeuart, trainstate.pipe_pressure * 0.1f / conf.pipemax * conf.pipeuart);
uint16_t brake_press = (uint16_t)std::min(conf.brakeuart, trainstate.brake_pressure * 0.1f / conf.brakemax * conf.brakeuart); uint16_t brake_press = (uint16_t)std::min(conf.brakeuart, trainstate.brake_pressure * 0.1f / conf.brakemax * conf.brakeuart);
uint16_t hv_voltage = (uint16_t)std::min(conf.hvuart, trainstate.hv_voltage / conf.hvmax * conf.hvuart); uint16_t pantograph_press = (uint16_t)std::min(conf.pantographuart, trainstate.pantograph_pressure * 0.1f / conf.pantographmax * conf.pantographuart );
uint16_t hv_voltage = (uint16_t)std::min(conf.hvuart, trainstate.hv_voltage / conf.hvmax * conf.hvuart);
uint16_t current1 = (uint16_t)std::min(conf.currentuart, trainstate.hv_current[0] / conf.currentmax * conf.currentuart); uint16_t current1 = (uint16_t)std::min(conf.currentuart, trainstate.hv_current[0] / conf.currentmax * conf.currentuart);
uint16_t current2 = (uint16_t)std::min(conf.currentuart, trainstate.hv_current[1] / conf.currentmax * conf.currentuart); uint16_t current2 = (uint16_t)std::min(conf.currentuart, trainstate.hv_current[1] / conf.currentmax * conf.currentuart);
uint16_t current3 = (uint16_t)std::min(conf.currentuart, trainstate.hv_current[2] / conf.currentmax * conf.currentuart); uint16_t current3 = (uint16_t)std::min(conf.currentuart, trainstate.hv_current[2] / conf.currentmax * conf.currentuart);
@@ -409,8 +410,10 @@ void uart_input::poll()
SPLIT_INT16(lv_voltage), SPLIT_INT16(lv_voltage),
//byte 33 //byte 33
(uint8_t)trainstate.radio_channel, (uint8_t)trainstate.radio_channel,
//byte 34-48 //byte 34-35
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 SPLIT_INT16(pantograph_press),
//byte 36-48
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; };
if (conf.debug) if (conf.debug)

2
uart.h
View File

@@ -23,6 +23,8 @@ public:
float pipeuart = 65535.0f; float pipeuart = 65535.0f;
float brakemax = 10.0f; float brakemax = 10.0f;
float brakeuart = 65535.0f; float brakeuart = 65535.0f;
float pantographmax = 10.0f;
float pantographuart = 65535.0f;
float hvmax = 100000.0f; float hvmax = 100000.0f;
float hvuart = 65535.0f; float hvuart = 65535.0f;
float currentmax = 10000.0f; float currentmax = 10000.0f;