/* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "stdafx.h" #include "vehicle/handover.h" #include "McZapkie/MOVER.h" namespace handover { void release_ai_controls(TMoverParameters &Occupied, TMoverParameters &Controlling) { // the AI's hornoff action touches the horn only while the AI drives Occupied.WarningSignal = 0; // the AI drives the sandbox directly, bypassing the manual and automatic sanding states if (Controlling.SandDose && false == (Controlling.SandDoseManual || Controlling.SandDoseAuto)) { Controlling.Sandbox(false); } if (Occupied.DepartureSignal) { Occupied.signal_departure(false); } if (Occupied.Hamulec->Releaser()) { Occupied.BrakeReleaser(0); } } int light_selector_position(TMoverParameters const &Occupied, int const Lightstable, int const Headlights, int const Inventory) { // the selector size comes from the vehicle definition, the table holds a fixed number of positions auto const positioncount{std::min(Occupied.LightsPosNo, static_cast(std::size(Occupied.Lights[0])))}; if (positioncount <= 0 || Lightstable < 0 || Lightstable >= static_cast(std::size(Occupied.Lights))) { return Occupied.LightsPos; } auto const &lights{Occupied.Lights[Lightstable]}; auto const lightsmatch{[&lights, Inventory, Headlights](int const Position) { return (lights[Position - 1] & Inventory) == Headlights; }}; if (Occupied.LightsPos >= 1 && Occupied.LightsPos <= positioncount && lightsmatch(Occupied.LightsPos)) { return Occupied.LightsPos; } for (auto position = 1; position <= positioncount; ++position) { if (lightsmatch(position)) { return position; } } return Occupied.LightsPos; } int dimmer_position(TMoverParameters const &Occupied, bool const Headlightson) { auto const &positions{Occupied.dimPositions}; auto const current{Occupied.modernDimmerPosition}; auto const count{static_cast(positions.size())}; auto const isoff{[&positions, count](int const Position) { return Position < 0 || Position >= count || positions[Position].isOff; }}; if (false == Occupied.enableModernDimmer || false == Headlightson || false == isoff(current)) { return current; } if (false == isoff(Occupied.modernDimmerDefaultPosition)) { return Occupied.modernDimmerDefaultPosition; } for (auto position = 0; position < count; ++position) { if (false == (positions[position].isOff || positions[position].isDimmed || positions[position].isHighBeam)) { return position; } } for (auto position = 0; position < count; ++position) { if (false == positions[position].isOff) { return position; } } return current; } } // namespace handover