17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-11-06 18:38:36 +01:00
Commit Graph

722 Commits

Author SHA1 Message Date
maj00r
f4f0b2bb10 Propagate the reverser setting, not its absolute direction.
CabActivisation() sent DirAbsolute under the "Direction" command, while
DirectionForward() and DirectionBackward() send DirActive under the same name.
The receiving end (TMoverParameters::RunInternalCommand) assigns the value
straight to DirActive and derives DirAbsolute from its own CabActive, so the two
senders only agree while CabActive is 1. Activating a rear cab therefore left
every other member of the consist with the reverser set the opposite way.

The symptom was an EMU that stalled and then accelerated backwards after control
changed hands. It was intermittent because the reverser sweep in
sync_consist_reversers() normally repairs the members through the other two call
sites - except on an EZT, where the first DirectionBackward() at DirActive 1 is
consumed by the high-current switch and propagates nothing, leaving the state set
by CabActivisation() in place.

Seen on an EN57 driven from the rear cab: the occupied car held DirActive 1 with
CabActive -1, the motor car and the far cab held DirActive -1 with the same
CabActive, so their DirAbsolute came out inverted.
2026-09-06 14:45:12 +02:00
maj00r
aaccd7b9b7 Keep one primary per consist and let a secondary AI claim it.
A driver without movePrimary no longer just idles. UpdateSecondary() cuts
BrakeValveActive so a secondary AI stops fighting the primary over the brake
pipe, and - as long as no driver in the consist has iEngineActive - keeps
scanning ahead of CabOccupied, so it can take movePrimary and start the engine
once a signal permits.

scan_route() orients by CabOccupied when DirActive is 0, and
ClaimConsistPrimary() clears movePrimary on every other driver in the consist,
then calls TableClear() and CheckVehicles(), so sSpeedTable is rebuilt for the
new front and ctOwner follows it.

- walk the consist with FirstFind()/Neighbour() instead of Next()/Prev(), which
  stopped at the starting vehicle and mishandled reversed members;
- ReassignConsistPrimary() picks a single driver after any coupling change,
  both from TDynamicObject::couple() and from the AI path;
- IsOccupiedByAnotherConsist() decides membership with BelongsToConsist() and
  takes a signed distance, so a consist left behind no longer cuts the scan
  short. DistanceToAnotherConsist() hands back the gap it already computes, so
  OtherConsistAtSignal() counts a foreign vehicle only while it stands closer
  than the signal itself, instead of comparing track starts;
- TSpeedPos::Set() marks an entry with spNotOurShuntSignal when a
  spShuntSemaphor was already permitting as the entry was added. A shunting
  signal does not address its permission to a particular consist, so a dormant
  driver does not wake up on a permission it did not see light up; the flag
  drops once the signal shows stop, so its own turn is never blocked. spSemaphor
  is excluded: a semaphore sets a route for us and permits us even when found
  already lit. The check reads SemPermitIndex - the entry that produced the
  permitting command - because SemNextIndex can point at an earlier signal.
  The flag is also stamped whenever the permission turns out to belong to a
  consist standing in front of us - both where TableUpdateEvent() already knows
  the signal is for the vehicle ahead, and in check_route_ahead() - so the
  addressee pulling away does not hand the still-lit signal over to whoever
  waited behind it;
- the scantable debug panel lists the flags by name (spNotOurShuntSignal shows
  as not-ours) and folds the nearest vehicle ahead into the table by its own
  distance.
2026-09-06 13:21:44 +02:00
6befd69968 Merge pull request #149 from combolek/getpf
state_manager: Optimize computation of pressure flow for Oerlikon ESt valves
2026-09-04 16:39:49 +02:00
jakubg1
f8cb5e4431 Fix EP fuse auto-(dis)engaging
When the Autorewident function is enabled, the EP fuse switch will no longer automatically engage or disengage if the player is controlling the train. This would happen for example when approaching a station.
2026-08-24 00:24:15 +02:00
Ryba04
7cc6a67399 Followed sonar's suggestions 2026-08-18 20:34:37 +02:00
Ryba04
7d3b9a7360 Fix "Traxx" local brake 2026-08-18 00:04:31 +02:00
combolek
19441b5e91 Convert Przekladniki to std::array 2026-07-28 09:28:10 -07:00
combolek
12c583f418 Fix some SonarQube warnings 2026-07-28 08:54:33 -07:00
combolek
00bb44a789 state_manager: Optimize computation of pressure flow for Oerlikon ESt valves
TNESt3::GetPF() is a *major* hotspot in simulation state update. The leading cause is the use of typeid (RTTI) which is implemented in the C++ runtime essentially as a string compare. This change eliminates the use of typeid and instead caches statically typed pointers for the few TPrzekladnik subclass objects that need their parameters adjusted in TNESt3::GetPF(). As a bonus some virtual methods on TPrzekladnik can now be removed. Overall this change reduces the TNESt3::GetPF() contribution from about 25% to 16%.
2026-07-26 21:19:38 -07:00
maj00r
03bfbb1345 fix: restore min>max tolerance lost in clamp->std::clamp migration
The dumb3d->glm / utilities-simplification refactor replaced the old custom
clamp() (which tolerated Lo>Hi, returning the upper bound) with std::clamp,
where inverted bounds are undefined behaviour. Only a few sites were patched
afterwards, by hand, with std::minmax plumbing (incl. a stray `static` inside
a per-axle loop). Others silently produced wrong results in the AI braking /
acceleration path.

Add a safe_clamp() helper (normalizes inverted bounds) and use it ONLY where
Lo<=Hi cannot be proven at compile time (config min/max pairs, sign-dependent
expressions, container underflow). Sites with constant bounds or [0, x>=0]
keep std::clamp. Remove the manual std::minmax workarounds and rewrite the
damaged-track jolt code value-first.
2026-07-02 00:37:52 +02:00
jerrrrycho
d85096f64d reformat: remove redundant parentheses 2026-06-30 21:19:46 +02:00
jerrrrycho
bf147dd155 refactor: replace null with nullptr 2026-06-29 02:48:25 +02:00
docentYT
e06ae37f47 replace new clamps with std::clamp and to_string with std::string 2026-05-05 23:40:59 +02:00
docentYT
5367cb9940 Merge remote-tracking branch 'upstream/master' into utilities-simplification 2026-05-05 23:08:43 +02:00
cb4b6b9a4f Separate electrodynamic and localbrake levers 2026-05-03 21:51:16 +02:00
docentYT
13c7317f6e Do not allow implicit cast for inline std::string to_string(bool Value) and change to_string to std::string for non boolean values 2026-05-03 15:49:29 +02:00
docentYT
59347af5a0 Replace some std::min and std::max combinations with std::clamp 2026-05-02 19:38:14 +02:00
docentYT
ca699d117f Remove not needed includes 2026-05-02 14:40:31 +02:00
docentYT
3628eb0fc3 Replace interpolate with std::lerp and glm::mix 2026-05-02 01:31:38 +02:00
docentYT
d1f16411a1 Replace clamp with std::clamp 2026-05-01 22:14:29 +02:00
docentYT
ec1dfae953 Replace starts_with and ends_with with string class methods 2026-05-01 17:31:11 +02:00
docentYT
337e750ed1 Replace Max0R and Min0R with std::max and std::min 2026-04-30 23:47:32 +02:00
7acc34df3e Merge pull request #97 from docentYT/migrate-from-dumb3d-to-glm
Migrate from dumb3d to glm
2026-04-28 19:46:46 +02:00
docentYT
d5d1825e38 Remove dumb3d 2026-04-27 23:03:47 +02:00
129924315d Cleanup hamulce.cpp/h with Mover.cpp/h 2026-04-27 18:21:55 +02:00
dcfd34908a Revert "Add power smoothing for inverter based vehicles"
This reverts commit 40bbbc6210.
For some reason it broke SA13x controllers lol
2026-04-17 20:08:04 +02:00
593e4bcf36 Merge branch 'master' into master 2026-04-14 21:01:04 +02:00
ae056f2bbd Merge pull request #79 from xingzihai/engine-overheat
feat: add EngineMaxTemperature support for diesel locomotive overheat detection
2026-04-14 20:49:37 +02:00
jakubg1
0d010e8c6a Simplify derailing logic, derail reason enum
- The `TMoverParameters::derail()` function has been renamed to `::Derail()`, with a capital D.
- All derail events now use that function.
  - Simplified and unified the logic behind different derail types.
  - The `dtrack_freerail` track type is now slightly increasing the chance of derailing on a tight curve, as it was the intention.
- A new `DerailReason` enum has been created which holds all derail types.
- The `DerailReason` field in the `TMoverParameters` class has been removed.
  - This was a transient field which is not necessary anymore.
  - The logging functionality as such has been moved from `DynObj.cpp` to `Mover.cpp`.
2026-04-04 02:05:49 +02:00
xingzihai
754fc50ca8 feat: add EngineMaxTemperature support for diesel locomotive overheat detection
Add engine temperature monitoring to diesel locomotive heat management system:
- Add engine field to heat_data struct (fluid_circuit_t type)
- Add EngineMaxTemperature config extraction in .fiz files
- Add engine overheat detection logic (is_hot check)
- Include engine.is_hot in PT status check

Implements issue #77: Oil, water and engine overheat lamps for diesel locomotives
2026-04-01 23:28:28 +00:00
Agent
68fa78a582 feat(overheat): Add overheat indicator lamps for oil, water, water_aux, and engine
- Add engine_max_temp and engine_is_hot fields to heat_data structure
- Add EngineMaxTemperature field extraction from .fiz files
- Add engine overheat check comparing Ts with engine_max_temp
- Add four new overheat lamp indicators:
  - i-oil_overheat
  - i-water_overheat
  - i-wateraux_overheat
  - i-engine_overheat
- Add lamp update logic to turn on/off based on is_hot flags
- Add lamp initialization in clear_cab_controls()

This implements issue #77 - overheat lamps for diesel engines.

The lamps will turn on when:
- Oil temperature exceeds OilMaxTemperature
- Water temperature exceeds WaterMaxTemperature
- Auxiliary water temperature exceeds WaterAuxMaxTemperature
- Engine temperature exceeds EngineMaxTemperature

Each check includes 8-degree hysteresis to prevent rapid on/off cycling.
2026-04-01 23:26:39 +00:00
copilot-swe-agent[bot]
7e49aa8740 Rewrite #includes to use explicit subdirectory paths
Co-authored-by: Hirek193 <23196899+Hirek193@users.noreply.github.com>
2026-03-14 19:16:48 +00:00
40bbbc6210 Add power smoothing for inverter based vehicles 2026-02-08 13:04:49 +01:00
7b8fa3f226 Set wiper default pos = 0 in case not defined 2025-09-30 21:08:22 +02:00
a7c2fa22f1 Add wiperList Default parameter (for default position) 2025-09-30 21:03:38 +02:00
b969a55533 Fix lightsset command so bot wont affect it 2025-09-19 01:58:40 +02:00
Ryba04
33ad7b718f Merge branch 'master' into master 2025-09-13 19:46:26 +02:00
072165aae3 Resolve conflicts for merge 2025-09-04 20:27:45 +02:00
jakubg1
dc8de9aa07 Separate FFList from DEList, add FFEDList (ffBrakeList)
Added a new optional section to .fiz files: `ffBrakeList`. It is used instead of `ffList` whenever the vehicle has its ED braking engaged.

Example (dynamic/pkp/elf_v1/inverter_kp.fiz):
```
ffList: Size=3
0	2.0
33.7	2.08
34.0	2.12
130.4	8.10
endff

ffBrakeList: Size=4
0	2.0
33.7	2.08
34.8	2.08
34.8	2.17
130.4	8.10
endff
```
2025-09-04 04:36:26 +02:00
6e2835bdeb Remove starts with statement 2025-08-21 20:25:18 +02:00
be8218949c More linux specific blocks 2025-08-21 20:22:26 +02:00
c0437946c7 Prevent multiple battery switches in hold conditions 2025-07-23 12:29:04 +02:00
13f7551b5f Modern dimmer overhaul
Now it supports custom positions
2025-07-15 16:06:42 +02:00
Ryba04
6b21737ec4 Merge pull request #85 from Anonim17PL/master
Poprawki po 078470c, 2a5d8cc i 7cac46d
2025-05-04 17:40:59 +02:00
WLs50
0280b40ca5 Merge remote-tracking branch 'manul-public/master' into manul-staging 2025-04-05 14:24:53 +02:00
Anonim17PL
583dc8c1ec Czy ktoś w ogóle kompiluje ten kod?
```/home/debian/autobuilder/output/build/maszyna/application.h:41:10: error: extra qualification ‘eu07_application::’ on member ‘DiscordRPCService’ [-fpermissive]
   41 |     void eu07_application::DiscordRPCService(); // discord rich presence service function (runs as separate thread)
      |          ^~~~~~~~~~~~~~~~```

Czy C++20 jest nam potrzebne?
```/home/debian/autobuilder/output/build/maszyna/McZapkie/Mover.cpp:11346:34: error: ‘std::string’ {aka ‘class std::__cxx11::basic_string<char>’} has no member named ‘_Starts_with’
11346 |                     if (PantType._Starts_with("DSA")) // zakladam ze wszystkie pantografy DSA sa takie same
      |                                  ^~~~~~~~~~~~```

Kompletny absurd z 7cac46d:
```/home/debian/autobuilder/output/build/maszyna/particles.cpp:477:29: error: cannot bind non-const lvalue reference of type ‘cParser&’ to an rvalue of type ‘cParser’
  477 |     if( source.deserialize( cParser( templatepath + templatename + ".txt", cParser::buffer_FILE ) ) ) {
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```
2025-03-24 13:25:51 +01:00
b5172e940b Add wiper animation 2025-03-16 16:24:48 +01:00
a505962b10 Mover reload function fix 2025-03-16 16:22:59 +01:00
dad32c28a2 After cherrypick fixes to 2a5d8cc6de 2025-03-16 16:22:33 +01:00
f59f3c368e Add WBL85, EC160 pantograph types 2025-03-16 16:22:24 +01:00