16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-23 05:09:19 +02:00

build 190227. joint master controlled cab control, minor bug fixes

This commit is contained in:
tmj-fstate
2019-02-27 16:22:46 +01:00
parent 8da3a9a74f
commit e356172a81
16 changed files with 200 additions and 47 deletions

View File

@@ -372,14 +372,13 @@ bool TSpeedPos::Set(basic_event *event, double dist, double length, TOrders orde
iFlags = spEvent; iFlags = spEvent;
evEvent = event; evEvent = event;
vPos = event->input_location(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?) vPos = event->input_location(); // współrzędne eventu albo komórki pamięci (zrzutować na tor?)
if( dist + length >= 0 ) { // ignore events located behind the consist, but with exception of stop points which may be needed to update freshly received timetable
iFlags |= spEnabled; if( ( dist + length < 0 )
CommandCheck(); // sprawdzenie typu komendy w evencie i określenie prędkości && ( event->input_command() != TCommandType::cm_PassengerStopPoint ) ) {
}
else {
// located behind the tracking consist, don't bother with it
return false; return false;
} }
iFlags |= spEnabled;
CommandCheck(); // sprawdzenie typu komendy w evencie i określenie prędkości
// zależnie od trybu sprawdzenie czy jest tutaj gdzieś semafor lub tarcza manewrowa // zależnie od trybu sprawdzenie czy jest tutaj gdzieś semafor lub tarcza manewrowa
// jeśli wskazuje stop wtedy wystawiamy true jako koniec sprawdzania // jeśli wskazuje stop wtedy wystawiamy true jako koniec sprawdzania
// WriteLog("EventSet: Vel=" + AnsiString(fVelNext) + " iFlags=" + AnsiString(iFlags) + " order="+AnsiString(order)); // WriteLog("EventSet: Vel=" + AnsiString(fVelNext) + " iFlags=" + AnsiString(iFlags) + " order="+AnsiString(order));
@@ -486,6 +485,20 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
if (iTableDirection != iDirection ) { if (iTableDirection != iDirection ) {
// jeśli zmiana kierunku, zaczynamy od toru ze wskazanym pojazdem // jeśli zmiana kierunku, zaczynamy od toru ze wskazanym pojazdem
TableClear();
/*
// aktualna prędkość // changed to -1 to recognize speed limit, if any
fLastVel = -1.0;
sSpeedTable.clear();
iLast = -1;
tLast = nullptr; //żaden nie sprawdzony
SemNextIndex = -1;
SemNextStopIndex = -1;
*/
if( VelSignalLast == 0.0 ) {
// don't allow potential red light overrun keep us from reversing
VelSignalLast = -1.0;
}
iTableDirection = iDirection; // ustalenie w jakim kierunku jest wypełniana tabelka względem pojazdu iTableDirection = iDirection; // ustalenie w jakim kierunku jest wypełniana tabelka względem pojazdu
pTrack = pVehicle->RaTrackGet(); // odcinek, na którym stoi pTrack = pVehicle->RaTrackGet(); // odcinek, na którym stoi
fTrackLength = pVehicle->RaTranslationGet(); // pozycja na tym torze (odległość od Point1) fTrackLength = pVehicle->RaTranslationGet(); // pozycja na tym torze (odległość od Point1)
@@ -503,17 +516,6 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
.Length(); .Length();
// aktualna odległość ma być ujemna gdyż jesteśmy na końcu składu // aktualna odległość ma być ujemna gdyż jesteśmy na końcu składu
fCurrentDistance = -fLength - fTrackLength; fCurrentDistance = -fLength - fTrackLength;
// aktualna prędkość // changed to -1 to recognize speed limit, if any
fLastVel = -1.0;
sSpeedTable.clear();
iLast = -1;
tLast = nullptr; //żaden nie sprawdzony
SemNextIndex = -1;
SemNextStopIndex = -1;
if( VelSignalLast == 0.0 ) {
// don't allow potential red light overrun keep us from reversing
VelSignalLast = -1.0;
}
fTrackLength = pTrack->Length(); //skasowanie zmian w zmiennej żeby poprawnie liczyło w dalszych krokach fTrackLength = pTrack->Length(); //skasowanie zmian w zmiennej żeby poprawnie liczyło w dalszych krokach
MoveDistanceReset(); // AI startuje 1s po zaczęciu jazdy i mógł już coś przejechać MoveDistanceReset(); // AI startuje 1s po zaczęciu jazdy i mógł już coś przejechać
} }
@@ -759,7 +761,7 @@ void TController::TableCheck(double fDistance)
{ // przeliczenie odległości w tabelce, ewentualnie doskanowanie (bez analizy prędkości itp.) { // przeliczenie odległości w tabelce, ewentualnie doskanowanie (bez analizy prędkości itp.)
if( iTableDirection != iDirection ) { if( iTableDirection != iDirection ) {
// jak zmiana kierunku, to skanujemy od końca składu // jak zmiana kierunku, to skanujemy od końca składu
TableTraceRoute( fDistance, pVehicles[ 1 ] ); TableTraceRoute( fDistance, pVehicles[ end::rear ] );
TableSort(); TableSort();
} }
else if (iTableDirection) else if (iTableDirection)
@@ -786,7 +788,7 @@ void TController::TableCheck(double fDistance)
--iLast; --iLast;
} }
tLast = sSpeedTable[ i ].trTrack; tLast = sSpeedTable[ i ].trTrack;
TableTraceRoute( fDistance, pVehicles[ 1 ] ); TableTraceRoute( fDistance, pVehicles[ end::rear ] );
TableSort(); TableSort();
// nie kontynuujemy pętli, trzeba doskanować ciąg dalszy // nie kontynuujemy pętli, trzeba doskanować ciąg dalszy
break; break;
@@ -824,7 +826,7 @@ void TController::TableCheck(double fDistance)
sSpeedTable[iLast].Update(); // aktualizacja ostatniego sSpeedTable[iLast].Update(); // aktualizacja ostatniego
// WriteLog("TableCheck: Upate last track. Dist=" + AnsiString(sSpeedTable[iLast].fDist)); // WriteLog("TableCheck: Upate last track. Dist=" + AnsiString(sSpeedTable[iLast].fDist));
if( sSpeedTable[ iLast ].fDist < fDistance ) { if( sSpeedTable[ iLast ].fDist < fDistance ) {
TableTraceRoute( fDistance, pVehicles[ 1 ] ); // doskanowanie dalszego odcinka TableTraceRoute( fDistance, pVehicles[ end::rear ] ); // doskanowanie dalszego odcinka
TableSort(); TableSort();
} }
// garbage collection // garbage collection
@@ -2353,7 +2355,6 @@ bool TController::PrepareEngine()
voltrear = false; voltrear = false;
LastReactionTime = 0.0; LastReactionTime = 0.0;
ReactionTime = PrepareTime; ReactionTime = PrepareTime;
iDrivigFlags |= moveActive; // może skanować sygnały i reagować na komendy
if ( mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) { if ( mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
voltfront = true; voltfront = true;
@@ -2484,6 +2485,8 @@ bool TController::PrepareEngine()
} }
eAction = TAction::actUnknown; eAction = TAction::actUnknown;
iEngineActive = 1; iEngineActive = 1;
iDrivigFlags |= moveActive; // może skanować sygnały i reagować na komendy
return true; return true;
} }
else { else {
@@ -3266,10 +3269,10 @@ void TController::Doors( bool const Open, int const Side ) {
&& ( ( fActionTime > -0.5 ) && ( ( fActionTime > -0.5 )
|| ( false == AIControllFlag ) ) ) { || ( false == AIControllFlag ) ) ) {
// ai doesn't close the door until it's free to depart, but human driver has free reign to do stupid things // ai doesn't close the door until it's free to depart, but human driver has free reign to do stupid things
if( ( pVehicle->MoverParameters->Doors.open_control == control_t::conductor ) if( ( pVehicle->MoverParameters->Doors.close_control == control_t::conductor )
|| ( ( true == AIControllFlag ) || ( ( true == AIControllFlag )
&& ( ( pVehicle->MoverParameters->Doors.open_control == control_t::driver ) && ( ( pVehicle->MoverParameters->Doors.close_control == control_t::driver )
|| ( pVehicle->MoverParameters->Doors.open_control == control_t::mixed ) ) ) ) { || ( pVehicle->MoverParameters->Doors.close_control == control_t::mixed ) ) ) ) {
// if the door are controlled by the driver, we let the user operate them unless this user is an ai // if the door are controlled by the driver, we let the user operate them unless this user is an ai
// the train conductor, if present, handles door operation also for human-driven trains // the train conductor, if present, handles door operation also for human-driven trains
pVehicle->MoverParameters->OperateDoors( side::right, false ); pVehicle->MoverParameters->OperateDoors( side::right, false );
@@ -3306,6 +3309,10 @@ void TController::Doors( bool const Open, int const Side ) {
bool bool
TController::doors_open() const { TController::doors_open() const {
return (
IsAnyDoorOpen[ side::right ]
|| IsAnyDoorOpen[ side::left ] );
/*
auto *vehicle = pVehicles[ 0 ]; // pojazd na czole składu auto *vehicle = pVehicles[ 0 ]; // pojazd na czole składu
while( vehicle != nullptr ) { while( vehicle != nullptr ) {
if( ( false == vehicle->MoverParameters->Doors.instances[side::right].is_closed ) if( ( false == vehicle->MoverParameters->Doors.instances[side::right].is_closed )
@@ -3317,6 +3324,7 @@ TController::doors_open() const {
} }
// if we're still here there's nothing open // if we're still here there's nothing open
return false; return false;
*/
} }
void TController::RecognizeCommand() void TController::RecognizeCommand()
@@ -4215,7 +4223,7 @@ TController::UpdateSituation(double dt) {
Obstacle.vehicle_end = std::get<int>( lookup ); Obstacle.vehicle_end = std::get<int>( lookup );
Obstacle.distance = std::get<double>( lookup ); Obstacle.distance = std::get<double>( lookup );
if( Obstacle.distance < ( mvOccupied->CategoryFlag == 2 ? 25 : 75 ) ) { if( Obstacle.distance < ( mvOccupied->CategoryFlag == 2 ? 25 : 100 ) ) {
// at short distances (re)calculate range between couplers directly // at short distances (re)calculate range between couplers directly
Obstacle.distance = TMoverParameters::CouplerDist( frontvehicle->MoverParameters, Obstacle.vehicle->MoverParameters ); Obstacle.distance = TMoverParameters::CouplerDist( frontvehicle->MoverParameters, Obstacle.vehicle->MoverParameters );
} }

View File

@@ -3439,13 +3439,13 @@ bool TDynamicObject::Update(double dt, double dt1)
else { else {
// unfold mirror on the side with open doors, if not moving too fast // unfold mirror on the side with open doors, if not moving too fast
if( ( dMirrorMoveL < 1.0 ) if( ( dMirrorMoveL < 1.0 )
&& ( true == MoverParameters->Doors.instances[side::left].is_open ) ) { && ( true == MoverParameters->Doors.instances[side::left].open_permit ) ) {
dMirrorMoveL = std::min( dMirrorMoveL = std::min(
1.0, 1.0,
dMirrorMoveL + 1.0 * dt1 ); dMirrorMoveL + 1.0 * dt1 );
} }
if( ( dMirrorMoveR < 1.0 ) if( ( dMirrorMoveR < 1.0 )
&& ( true == MoverParameters->Doors.instances[side::right].is_open ) ) { && ( true == MoverParameters->Doors.instances[side::right].open_permit ) ) {
dMirrorMoveR = std::min( dMirrorMoveR = std::min(
1.0, 1.0,
dMirrorMoveR + 1.0 * dt1 ); dMirrorMoveR + 1.0 * dt1 );

View File

@@ -960,7 +960,11 @@ whois_event::run_() {
1 : 1 :
0, // 1, gdy ma tu zatrzymanie 0, // 1, gdy ma tu zatrzymanie
m_input.flags ); m_input.flags );
WriteLog( "Train detected: " + m_activator->Mechanik->TrainName() ); WriteLog(
"Type: WhoIs (" + to_string( m_input.flags ) + ") - "
+ "[train: " + m_activator->Mechanik->TrainName() + "], "
+ "[stations left: " + to_string( m_activator->Mechanik->StationCount() - m_activator->Mechanik->StationIndex() ) + "], "
+ "[stop at next: " + ( m_activator->Mechanik->IsStop() ? "yes" : "no") + "]" );
} }
} }
} }

View File

@@ -158,6 +158,7 @@ TTrain::commandhandler_map const TTrain::m_commandhandlers = {
{ user_command::aidriverenable, &TTrain::OnCommand_aidriverenable }, { user_command::aidriverenable, &TTrain::OnCommand_aidriverenable },
{ user_command::aidriverdisable, &TTrain::OnCommand_aidriverdisable }, { user_command::aidriverdisable, &TTrain::OnCommand_aidriverdisable },
{ user_command::jointcontrollerset, &TTrain::OnCommand_jointcontrollerset },
{ user_command::mastercontrollerincrease, &TTrain::OnCommand_mastercontrollerincrease }, { user_command::mastercontrollerincrease, &TTrain::OnCommand_mastercontrollerincrease },
{ user_command::mastercontrollerincreasefast, &TTrain::OnCommand_mastercontrollerincreasefast }, { user_command::mastercontrollerincreasefast, &TTrain::OnCommand_mastercontrollerincreasefast },
{ user_command::mastercontrollerdecrease, &TTrain::OnCommand_mastercontrollerdecrease }, { user_command::mastercontrollerdecrease, &TTrain::OnCommand_mastercontrollerdecrease },
@@ -757,13 +758,50 @@ void TTrain::OnCommand_aidriverdisable( TTrain *Train, command_data const &Comma
auto const EU07_CONTROLLER_BASERETURNDELAY { 0.5f }; auto const EU07_CONTROLLER_BASERETURNDELAY { 0.5f };
auto const EU07_CONTROLLER_KEYBOARDETURNDELAY { 1.5f }; auto const EU07_CONTROLLER_KEYBOARDETURNDELAY { 1.5f };
void TTrain::OnCommand_jointcontrollerset( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) {
// on press or hold
// value controls brake in range 0-0.5, master controller in range 0.5-1.0
if( Command.param1 >= 0.5 ) {
Train->set_master_controller(
( Command.param1 * 2 - 1 )
* ( Train->mvControlled->CoupledCtrl ?
Train->mvControlled->MainCtrlPosNo + Train->mvControlled->ScndCtrlPosNo :
Train->mvControlled->MainCtrlPosNo ) );
Train->m_mastercontrollerinuse = true;
Train->mvOccupied->LocalBrakePosA = 0;
}
else {
Train->mvOccupied->LocalBrakePosA = (
clamp(
1.0 - ( Command.param1 * 2 ),
0.0, 1.0 ) );
if( Train->mvControlled->MainCtrlPos > 0 ) {
Train->set_master_controller( 0 );
}
}
}
else {
// release
Train->m_mastercontrollerinuse = false;
Train->m_mastercontrollerreturndelay = EU07_CONTROLLER_BASERETURNDELAY; // NOTE: keyboard return delay is omitted for other input sources
}
}
void TTrain::OnCommand_mastercontrollerincrease( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_mastercontrollerincrease( TTrain *Train, command_data const &Command ) {
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->ggJointCtrl.SubModel != nullptr )
&& ( Train->mvControlled->LocalBrakePosA > 0.0 ) ) {
OnCommand_independentbrakedecrease( Train, Command );
}
else {
Train->mvControlled->IncMainCtrl( 1 ); Train->mvControlled->IncMainCtrl( 1 );
Train->m_mastercontrollerinuse = true; Train->m_mastercontrollerinuse = true;
} }
}
else { else {
// release // release
Train->m_mastercontrollerinuse = false; Train->m_mastercontrollerinuse = false;
@@ -775,7 +813,19 @@ void TTrain::OnCommand_mastercontrollerincreasefast( TTrain *Train, command_data
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->ggJointCtrl.SubModel != nullptr )
&& ( Train->mvControlled->LocalBrakePosA > 0.0 ) ) {
OnCommand_independentbrakedecreasefast( Train, Command );
}
else {
Train->mvControlled->IncMainCtrl( 2 ); Train->mvControlled->IncMainCtrl( 2 );
Train->m_mastercontrollerinuse = true;
}
}
else {
// release
Train->m_mastercontrollerinuse = false;
Train->m_mastercontrollerreturndelay = EU07_CONTROLLER_KEYBOARDETURNDELAY + EU07_CONTROLLER_BASERETURNDELAY;
} }
} }
@@ -783,9 +833,15 @@ void TTrain::OnCommand_mastercontrollerdecrease( TTrain *Train, command_data con
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->ggJointCtrl.SubModel != nullptr )
&& ( Train->mvControlled->MainCtrlPos == 0 ) ) {
OnCommand_independentbrakeincrease( Train, Command );
}
else {
Train->mvControlled->DecMainCtrl( 1 ); Train->mvControlled->DecMainCtrl( 1 );
Train->m_mastercontrollerinuse = true; Train->m_mastercontrollerinuse = true;
} }
}
else { else {
// release // release
Train->m_mastercontrollerinuse = false; Train->m_mastercontrollerinuse = false;
@@ -797,7 +853,19 @@ void TTrain::OnCommand_mastercontrollerdecreasefast( TTrain *Train, command_data
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->ggJointCtrl.SubModel != nullptr )
&& ( Train->mvControlled->MainCtrlPos == 0 ) ) {
OnCommand_independentbrakeincreasefast( Train, Command );
}
else {
Train->mvControlled->DecMainCtrl( 2 ); Train->mvControlled->DecMainCtrl( 2 );
Train->m_mastercontrollerinuse = true;
}
}
else {
// release
Train->m_mastercontrollerinuse = false;
Train->m_mastercontrollerreturndelay = EU07_CONTROLLER_KEYBOARDETURNDELAY + EU07_CONTROLLER_BASERETURNDELAY;
} }
} }
@@ -981,7 +1049,7 @@ void TTrain::OnCommand_independentbrakeset( TTrain *Train, command_data const &C
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
Train->mvControlled->LocalBrakePosA = ( Train->mvOccupied->LocalBrakePosA = (
clamp( clamp(
Command.param1, Command.param1,
0.0, 1.0 ) ); 0.0, 1.0 ) );
@@ -5735,7 +5803,21 @@ bool TTrain::Update( double const Deltatime )
} }
} }
// McZapkie-080602: obroty (albo translacje) regulatorow // McZapkie-080602: obroty (albo translacje) regulatorow
if (ggMainCtrl.SubModel) { if( ggJointCtrl.SubModel != nullptr ) {
// joint master controller moves forward to adjust power and backward to adjust brakes
auto const brakerangemultiplier {
( mvControlled->CoupledCtrl ?
mvControlled->MainCtrlPosNo + mvControlled->ScndCtrlPosNo :
mvControlled->MainCtrlPosNo )
/ static_cast<double>(LocalBrakePosNo) };
ggJointCtrl.UpdateValue(
( mvOccupied->LocalBrakePosA > 0.0 ? mvOccupied->LocalBrakePosA * LocalBrakePosNo * -1 * brakerangemultiplier :
mvControlled->CoupledCtrl ? double( mvControlled->MainCtrlPos + mvControlled->ScndCtrlPos ) :
double( mvControlled->MainCtrlPos ) ),
dsbNastawnikJazdy );
ggJointCtrl.Update();
}
if ( ggMainCtrl.SubModel != nullptr ) {
#ifdef _WIN32 #ifdef _WIN32
if( ( DynamicObject->Mechanik != nullptr ) if( ( DynamicObject->Mechanik != nullptr )
@@ -5822,7 +5904,7 @@ bool TTrain::Update( double const Deltatime )
ggBrakeCtrl.Update(); ggBrakeCtrl.Update();
} }
if( ggLocalBrake.SubModel ) { if( ggLocalBrake.SubModel != nullptr ) {
#ifdef _WIN32 #ifdef _WIN32
if( ( DynamicObject->Mechanik != nullptr ) if( ( DynamicObject->Mechanik != nullptr )
&& ( false == DynamicObject->Mechanik->AIControllFlag ) // nie blokujemy AI && ( false == DynamicObject->Mechanik->AIControllFlag ) // nie blokujemy AI
@@ -6853,6 +6935,9 @@ bool TTrain::InitializeCab(int NewCabNo, std::string const &asFileName)
if( dsbReverserKey.offset() == nullvector ) { if( dsbReverserKey.offset() == nullvector ) {
dsbReverserKey.offset( ggDirKey.model_offset() ); dsbReverserKey.offset( ggDirKey.model_offset() );
} }
if( dsbNastawnikJazdy.offset() == nullvector ) {
dsbNastawnikJazdy.offset( ggJointCtrl.model_offset() );
}
if( dsbNastawnikJazdy.offset() == nullvector ) { if( dsbNastawnikJazdy.offset() == nullvector ) {
dsbNastawnikJazdy.offset( ggMainCtrl.model_offset() ); dsbNastawnikJazdy.offset( ggMainCtrl.model_offset() );
} }
@@ -7094,6 +7179,7 @@ void TTrain::clear_cab_controls()
// other cab controls // other cab controls
// TODO: arrange in more readable manner, and eventually refactor // TODO: arrange in more readable manner, and eventually refactor
ggJointCtrl.Clear();
ggMainCtrl.Clear(); ggMainCtrl.Clear();
ggMainCtrlAct.Clear(); ggMainCtrlAct.Clear();
ggScndCtrl.Clear(); ggScndCtrl.Clear();
@@ -7729,6 +7815,7 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co
bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int const Cabindex) { bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int const Cabindex) {
std::unordered_map<std::string, TGauge &> const gauges = { std::unordered_map<std::string, TGauge &> const gauges = {
{ "jointctrl:", ggJointCtrl },
{ "mainctrl:", ggMainCtrl }, { "mainctrl:", ggMainCtrl },
{ "scndctrl:", ggScndCtrl }, { "scndctrl:", ggScndCtrl },
{ "dirkey:" , ggDirKey }, { "dirkey:" , ggDirKey },

View File

@@ -155,6 +155,7 @@ class TTrain
// TBD, TODO: consider this approach if we ever want to have customized consist behaviour to received commands, based on the consist/vehicle type or whatever // TBD, TODO: consider this approach if we ever want to have customized consist behaviour to received commands, based on the consist/vehicle type or whatever
static void OnCommand_aidriverenable( TTrain *Train, command_data const &Command ); static void OnCommand_aidriverenable( TTrain *Train, command_data const &Command );
static void OnCommand_aidriverdisable( TTrain *Train, command_data const &Command ); static void OnCommand_aidriverdisable( TTrain *Train, command_data const &Command );
static void OnCommand_jointcontrollerset( TTrain *Train, command_data const &Command );
static void OnCommand_mastercontrollerincrease( TTrain *Train, command_data const &Command ); static void OnCommand_mastercontrollerincrease( TTrain *Train, command_data const &Command );
static void OnCommand_mastercontrollerincreasefast( TTrain *Train, command_data const &Command ); static void OnCommand_mastercontrollerincreasefast( TTrain *Train, command_data const &Command );
static void OnCommand_mastercontrollerdecrease( TTrain *Train, command_data const &Command ); static void OnCommand_mastercontrollerdecrease( TTrain *Train, command_data const &Command );
@@ -372,6 +373,7 @@ public: // reszta może by?publiczna
TGauge ggWater1TempB; TGauge ggWater1TempB;
// McZapkie: definicje regulatorow // McZapkie: definicje regulatorow
TGauge ggJointCtrl;
TGauge ggMainCtrl; TGauge ggMainCtrl;
TGauge ggMainCtrlAct; TGauge ggMainCtrlAct;
TGauge ggScndCtrl; TGauge ggScndCtrl;

View File

@@ -22,6 +22,7 @@ commanddescription_sequence Commands_descriptions = {
{ "aidriverenable", command_target::vehicle }, { "aidriverenable", command_target::vehicle },
{ "aidriverdisable", command_target::vehicle }, { "aidriverdisable", command_target::vehicle },
{ "jointcontrollerset", command_target::vehicle },
{ "mastercontrollerincrease", command_target::vehicle }, { "mastercontrollerincrease", command_target::vehicle },
{ "mastercontrollerincreasefast", command_target::vehicle }, { "mastercontrollerincreasefast", command_target::vehicle },
{ "mastercontrollerdecrease", command_target::vehicle }, { "mastercontrollerdecrease", command_target::vehicle },

View File

@@ -16,6 +16,7 @@ enum class user_command {
aidriverenable, aidriverenable,
aidriverdisable, aidriverdisable,
jointcontrollerset,
mastercontrollerincrease, mastercontrollerincrease,
mastercontrollerincreasefast, mastercontrollerincreasefast,
mastercontrollerdecrease, mastercontrollerdecrease,

View File

@@ -27,6 +27,7 @@ driverkeyboard_input::default_bindings() {
m_bindingsetups = { m_bindingsetups = {
{ user_command::aidriverenable, GLFW_KEY_Q | keymodifier::shift }, { user_command::aidriverenable, GLFW_KEY_Q | keymodifier::shift },
{ user_command::aidriverdisable, GLFW_KEY_Q }, { user_command::aidriverdisable, GLFW_KEY_Q },
// jointcontrollerset,
{ user_command::mastercontrollerincrease, GLFW_KEY_KP_ADD }, { user_command::mastercontrollerincrease, GLFW_KEY_KP_ADD },
{ user_command::mastercontrollerincreasefast, GLFW_KEY_KP_ADD | keymodifier::shift }, { user_command::mastercontrollerincreasefast, GLFW_KEY_KP_ADD | keymodifier::shift },
{ user_command::mastercontrollerdecrease, GLFW_KEY_KP_SUBTRACT }, { user_command::mastercontrollerdecrease, GLFW_KEY_KP_SUBTRACT },

View File

@@ -21,6 +21,8 @@ http://mozilla.org/MPL/2.0/.
#include "uilayer.h" #include "uilayer.h"
#include "Logs.h" #include "Logs.h"
auto const EU07_CONTROLLER_MOUSESLIDERSIZE{ 0.65 };
void void
mouse_slider::bind( user_command const &Command ) { mouse_slider::bind( user_command const &Command ) {
@@ -29,6 +31,7 @@ mouse_slider::bind( user_command const &Command ) {
auto const *train { simulation::Train }; auto const *train { simulation::Train };
TMoverParameters const *vehicle { nullptr }; TMoverParameters const *vehicle { nullptr };
switch( m_command ) { switch( m_command ) {
case user_command::jointcontrollerset:
case user_command::mastercontrollerset: case user_command::mastercontrollerset:
case user_command::secondcontrollerset: { case user_command::secondcontrollerset: {
vehicle = ( train ? train->Controlled() : nullptr ); vehicle = ( train ? train->Controlled() : nullptr );
@@ -47,6 +50,29 @@ mouse_slider::bind( user_command const &Command ) {
// calculate initial value and accepted range // calculate initial value and accepted range
switch( m_command ) { switch( m_command ) {
case user_command::jointcontrollerset: {
// NOTE: special case, merges two separate controls
auto const *occupied { train ? train->Occupied() : nullptr };
if( occupied == nullptr ) { return; }
auto const powerrange { static_cast<double>(
vehicle->CoupledCtrl ?
vehicle->MainCtrlPosNo + vehicle->ScndCtrlPosNo :
vehicle->MainCtrlPosNo ) };
// for simplicity upper half of the range controls power, lower controls brakes
auto const brakerangemultiplier { powerrange / LocalBrakePosNo };
m_valuerange = 1.0;
m_value =
0.5
+ 0.5 * ( vehicle->CoupledCtrl ?
vehicle->MainCtrlPos + vehicle->ScndCtrlPos :
vehicle->MainCtrlPos ) / powerrange
- 0.5 * occupied->LocalBrakePosA;
m_analogue = true;
m_invertrange = false;
break;
}
case user_command::mastercontrollerset: { case user_command::mastercontrollerset: {
m_valuerange = ( m_valuerange = (
vehicle->CoupledCtrl ? vehicle->CoupledCtrl ?
@@ -57,24 +83,28 @@ mouse_slider::bind( user_command const &Command ) {
vehicle->MainCtrlPos + vehicle->ScndCtrlPos : vehicle->MainCtrlPos + vehicle->ScndCtrlPos :
vehicle->MainCtrlPos ); vehicle->MainCtrlPos );
m_analogue = false; m_analogue = false;
m_invertrange = false;
break; break;
} }
case user_command::secondcontrollerset: { case user_command::secondcontrollerset: {
m_valuerange = vehicle->ScndCtrlPosNo; m_valuerange = vehicle->ScndCtrlPosNo;
m_value = vehicle->ScndCtrlPos; m_value = vehicle->ScndCtrlPos;
m_analogue = false; m_analogue = false;
m_invertrange = true;
break; break;
} }
case user_command::trainbrakeset: { case user_command::trainbrakeset: {
m_valuerange = 1.0; m_valuerange = 1.0;
m_value = ( vehicle->fBrakeCtrlPos - vehicle->Handle->GetPos( bh_MIN ) ) / ( vehicle->Handle->GetPos( bh_MAX ) - vehicle->Handle->GetPos( bh_MIN ) ); m_value = ( vehicle->fBrakeCtrlPos - vehicle->Handle->GetPos( bh_MIN ) ) / ( vehicle->Handle->GetPos( bh_MAX ) - vehicle->Handle->GetPos( bh_MIN ) );
m_analogue = true; m_analogue = true;
m_invertrange = true;
break; break;
} }
case user_command::independentbrakeset: { case user_command::independentbrakeset: {
m_valuerange = 1.0; m_valuerange = 1.0;
m_value = vehicle->LocalBrakePosA; m_value = vehicle->LocalBrakePosA;
m_analogue = true; m_analogue = true;
m_invertrange = true;
break; break;
} }
default: { default: {
@@ -86,14 +116,18 @@ mouse_slider::bind( user_command const &Command ) {
Application.get_cursor_pos( m_cursorposition.x, m_cursorposition.y ); Application.get_cursor_pos( m_cursorposition.x, m_cursorposition.y );
Application.set_cursor( GLFW_CURSOR_DISABLED ); Application.set_cursor( GLFW_CURSOR_DISABLED );
auto const controlsize { Global.iWindowHeight * 0.75 }; auto const controlsize { Global.iWindowHeight * EU07_CONTROLLER_MOUSESLIDERSIZE };
auto const controledge { Global.iWindowHeight * 0.5 + controlsize * 0.5 }; auto const controledge { Global.iWindowHeight * 0.5 + controlsize * 0.5 };
auto const stepsize { controlsize / m_valuerange }; auto const stepsize { controlsize / m_valuerange };
if( m_invertrange ) {
m_value = ( m_analogue ? 1.0 : m_valuerange ) - m_value;
}
Application.set_cursor_pos( Application.set_cursor_pos(
Global.iWindowWidth * 0.5, Global.iWindowWidth * 0.5,
( m_analogue ? ( m_analogue ?
controledge - ( 1.0 - m_value ) * controlsize : controledge - m_value * controlsize :
controledge - m_value * stepsize - 0.5 * stepsize ) ); controledge - m_value * stepsize - 0.5 * stepsize ) );
} }
@@ -108,15 +142,17 @@ mouse_slider::release() {
void void
mouse_slider::on_move( double const Mousex, double const Mousey ) { mouse_slider::on_move( double const Mousex, double const Mousey ) {
auto const controlsize { Global.iWindowHeight * 0.75 }; auto const controlsize { Global.iWindowHeight * EU07_CONTROLLER_MOUSESLIDERSIZE };
auto const controledge { Global.iWindowHeight * 0.5 + controlsize * 0.5 }; auto const controledge { Global.iWindowHeight * 0.5 + controlsize * 0.5 };
auto const stepsize { controlsize / m_valuerange }; auto const stepsize { controlsize / m_valuerange };
auto mousey = clamp( Mousey, controledge - controlsize, controledge ); auto mousey = clamp( Mousey, controledge - controlsize, controledge );
m_value = ( m_value = (
m_analogue ? m_analogue ?
1.0 - ( ( controledge - mousey ) / controlsize ) : ( controledge - mousey ) / controlsize :
std::floor( ( controledge - mousey ) / stepsize ) ); std::floor( ( controledge - mousey ) / stepsize ) );
if( m_invertrange ) {
m_value = ( m_analogue ? 1.0 : m_valuerange ) - m_value; }
} }
@@ -370,6 +406,7 @@ drivermouse_input::button( int const Button, int const Action ) {
m_varyingpollrate = true; m_varyingpollrate = true;
break; break;
} }
case user_command::jointcontrollerset:
case user_command::mastercontrollerset: case user_command::mastercontrollerset:
case user_command::secondcontrollerset: case user_command::secondcontrollerset:
case user_command::trainbrakeset: case user_command::trainbrakeset:
@@ -445,6 +482,9 @@ void
drivermouse_input::default_bindings() { drivermouse_input::default_bindings() {
m_buttonbindings = { m_buttonbindings = {
{ "jointctrl:", {
user_command::jointcontrollerset,
user_command::none } },
{ "mainctrl:", { { "mainctrl:", {
user_command::mastercontrollerset, user_command::mastercontrollerset,
user_command::none } }, user_command::none } },

View File

@@ -39,6 +39,7 @@ private:
double m_value { 0.0 }; double m_value { 0.0 };
double m_valuerange { 0.0 }; double m_valuerange { 0.0 };
bool m_analogue { false }; bool m_analogue { false };
bool m_invertrange { false };
glm::dvec2 m_cursorposition { 0.0 }; glm::dvec2 m_cursorposition { 0.0 };
}; };

View File

@@ -696,7 +696,9 @@ debug_panel::update_section_ai( std::vector<text_line> &Output ) {
+ ", braking: " + to_string( mechanik.fBrakeDist, 0 ); + ", braking: " + to_string( mechanik.fBrakeDist, 0 );
if( mechanik.Obstacle.distance < 5000 ) { if( mechanik.Obstacle.distance < 5000 ) {
textline += "\n obstacle: " + to_string( mechanik.Obstacle.distance, 0 ); textline +=
"\n obstacle: " + to_string( mechanik.Obstacle.distance, 0 )
+ " (" + mechanik.Obstacle.vehicle->asName + ")";
} }
Output.emplace_back( textline, Global.UITextColor ); Output.emplace_back( textline, Global.UITextColor );

View File

@@ -49,10 +49,12 @@ bounding_area::serialize( std::ostream &Output ) const {
// restores content of the struct from provided input stream // restores content of the struct from provided input stream
void void
bounding_area::deserialize( std::istream &Input ) { bounding_area::deserialize( std::istream &Input, bool const Preserveradius ) {
center = sn_utils::d_dvec3( Input ); center = sn_utils::d_dvec3( Input );
radius = sn_utils::ld_float32( Input ); radius = ( Preserveradius ?
std::max( radius, sn_utils::ld_float32( Input ) ) :
sn_utils::ld_float32( Input ) );
} }

View File

@@ -59,9 +59,9 @@ struct bounding_area {
// stores content of the struct in provided output stream // stores content of the struct in provided output stream
void void
serialize( std::ostream &Output ) const; serialize( std::ostream &Output ) const;
// restores content of the struct from provided input stream // restores content of the struct from provided input stream.
void void
deserialize( std::istream &Input ); deserialize( std::istream &Input, bool const Preserveradius = true );
}; };
//using group_handle = std::size_t; //using group_handle = std::size_t;

View File

@@ -62,6 +62,7 @@ init() {
" pantograph: %.2f%cMT", " pantograph: %.2f%cMT",
"Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]", "Forces:\n tractive: %.1f, brake: %.1f, friction: %.2f%s\nAcceleration:\n tangential: %.2f, normal: %.2f (path radius: %s)\nVelocity: %.2f, distance traveled: %.2f\nPosition: [%.2f, %.2f, %.2f]",
"master controller",
"master controller", "master controller",
"second controller", "second controller",
"shunt mode power", "shunt mode power",
@@ -206,6 +207,7 @@ init() {
" pantograf: %.2f%cZG", " pantograf: %.2f%cZG",
"Sily:\n napedna: %.1f, hamowania: %.1f, tarcie: %.2f%s\nPrzyspieszenia:\n styczne: %.2f, normalne: %.2f (promien: %s)\nPredkosc: %.2f, pokonana odleglosc: %.2f\nPozycja: [%.2f, %.2f, %.2f]", "Sily:\n napedna: %.1f, hamowania: %.1f, tarcie: %.2f%s\nPrzyspieszenia:\n styczne: %.2f, normalne: %.2f (promien: %s)\nPredkosc: %.2f, pokonana odleglosc: %.2f\nPozycja: [%.2f, %.2f, %.2f]",
"nastawnik jazdy",
"nastawnik jazdy", "nastawnik jazdy",
"nastawnik dodatkowy", "nastawnik dodatkowy",
"sterowanie analogowe", "sterowanie analogowe",
@@ -322,6 +324,7 @@ init() {
{ {
std::vector<std::string> cabcontrols = { std::vector<std::string> cabcontrols = {
"mainctrl:", "mainctrl:",
"jointctrl:",
"scndctrl:", "scndctrl:",
"shuntmodepower:", "shuntmodepower:",
"dirkey:", "dirkey:",

View File

@@ -52,6 +52,7 @@ enum string {
debug_vehicle_forcesaccelerationvelocityposition, debug_vehicle_forcesaccelerationvelocityposition,
cab_mainctrl, cab_mainctrl,
cab_jointctrl,
cab_scndctrl, cab_scndctrl,
cab_shuntmodepower, cab_shuntmodepower,
cab_dirkey, cab_dirkey,

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#define VERSION_MAJOR 19 #define VERSION_MAJOR 19
#define VERSION_MINOR 223 #define VERSION_MINOR 227
#define VERSION_REVISION 0 #define VERSION_REVISION 0