fix(gui): Start starter altid (kørende AD-traktor stoppes og startes på run'et), Stop-knap kun for runs vi har startet, sprungne traktorer med årsag i status/log, kapacitet <100 l = ingen vogn, ASCII-tegn (v1.12.2.0)

This commit is contained in:
2026-09-23 11:18:55 +02:00
parent 2d6e6dd7bf
commit 2ff8e46306
7 changed files with 89 additions and 33 deletions
+37 -14
View File
@@ -10,6 +10,11 @@ ADRunsController.LOG_PREFIX = "ADSmartPickup: "
ADRunsController.MAX_NETWORK_DISTANCE = 30
ADRunsController.store = ADRuns.newStore()
-- Trækkerens egne tanke (diesel/AdBlue) kan give en lille "kapacitet" uden vogn.
ADRunsController.MIN_LOAD_CAPACITY = 100
-- run-id -> true når run'et er startet fra fanen (Start/Stop-knappen følger DETTE, ikke om
-- traktorerne tilfældigvis kører AutoDrive — en manuelt startet traktor må ikke vende knappen).
ADRunsController.runningRuns = {}
local function copyList(list)
local copy = {}
@@ -261,7 +266,7 @@ local function getLoadCapacity(adEnv, vehicle)
return nil
end
local _, capacity = adEnv.AutoDrive.getAllFillLevels(trailers)
return capacity ~= nil and capacity > 0 and capacity or nil
return capacity ~= nil and capacity >= ADRunsController.MIN_LOAD_CAPACITY and capacity or nil
end
local function intersects(listA, listB)
@@ -596,17 +601,28 @@ local function isVehicleActive(vehicle)
return stateModule ~= nil and stateModule.isActive ~= nil and stateModule:isActive()
end
-- Som ADInputManager:input_start_stop: loops nulstilles og AD stoppes.
local function stopVehicle(vehicle)
local stateModule = vehicle.ad.stateModule
if stateModule.setLoopsDone ~= nil then
stateModule:setLoopsDone(0)
end
vehicle:stopAutoDrive()
end
-- Anvend run-tilstand OG start traktoren i ét pcall'et kald: kaster vehicle:startAutoDrive()
-- (fx AD's egen validering), skal den ene traktor fejle uden at hele startRun-loopet
-- afbrydes — ellers når de øvrige tildelte traktorer aldrig at blive startet.
-- Start præcis som AD's HUD (ADInputManager:input_start_stop): det er MODE'ens start(),
-- der opretter køreopgaverne og selv kalder startAutoDrive — startAutoDrive alene sætter
-- kun "aktiv", og traktoren bliver holdende.
-- Kører traktoren AutoDrive i forvejen (startet manuelt eller i en gammel tilstand), stoppes
-- den først, så run'ets tilstand og opgaver gælder fra nu.
local function applyAndStart(adEnv, run, vehicle, ingredients)
applyRunToVehicle(adEnv, run, vehicle, ingredients)
if isVehicleActive(vehicle) then
return
stopVehicle(vehicle)
end
applyRunToVehicle(adEnv, run, vehicle, ingredients)
local stateModule = vehicle.ad.stateModule
local farmId = ADSmartPickup.getFarmId(vehicle)
if stateModule.setActualFarmId ~= nil and farmId ~= nil then
@@ -624,7 +640,8 @@ local function applyAndStart(adEnv, run, vehicle, ingredients)
end
end
-- Pr. tildelt traktor: validér, skriv AD-tilstand, start. ✖-traktorer springes over.
-- Pr. tildelt traktor: validér, skriv AD-tilstand, start. Afviste traktorer springes over
-- og logges med årsag (samme nøgle som fanen viser).
function ADRunsController.startRun(adEnv, runId)
local run = ADRuns.getRun(ADRunsController.store, runId)
local results = {}
@@ -632,15 +649,20 @@ function ADRunsController.startRun(adEnv, runId)
return results
end
local vehiclesById = getFarmVehiclesById(adEnv)
local started = 0
for _, vehicleId in ipairs(run.vehicleIds) do
local vehicle = vehiclesById[vehicleId]
if vehicle ~= nil then
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
local result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason}
if not validation.ok then
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' sprunget over (%s)", tostring(run.name), tostring(vehicle:getName()), tostring(validation.reason))
end
if validation.ok then
local ingredients = ADRunsController.getRunIngredients(adEnv, run, vehicle)
local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients)
if ok then
started = started + 1
local target = run.kind == "outbound" and ("kilde " .. tostring(run.sourceWayPointIds[1])) or ("markør " .. tostring(run.targetWayPointId))
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' startet mod %s", tostring(run.name), tostring(vehicle:getName()), target)
else
@@ -651,16 +673,10 @@ function ADRunsController.startRun(adEnv, runId)
table.insert(results, result)
end
end
return results
end
-- Som ADInputManager:input_start_stop: loops nulstilles og AD stoppes.
local function stopVehicle(vehicle)
local stateModule = vehicle.ad.stateModule
if stateModule.setLoopsDone ~= nil then
stateModule:setLoopsDone(0)
if started > 0 then
ADRunsController.runningRuns[runId] = true
end
vehicle:stopAutoDrive()
return results
end
-- En kørende traktor der fjernes fra sit run (eller hvis run slettes) kører run'ets job —
@@ -689,9 +705,12 @@ function ADRunsController.stopRun(adEnv, runId)
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' stoppet", tostring(run.name), tostring(vehicle:getName()))
end
end
ADRunsController.runningRuns[runId] = nil
return stopped
end
-- running = traktorer med AutoDrive aktiv (uanset hvem der startede dem); isRunning = run'et er
-- startet fra fanen og mindst én traktor kører stadig (Start/Stop-knappen følger isRunning).
function ADRunsController.getRunStatus(adEnv, run)
local running = 0
local vehiclesById = getFarmVehiclesById(adEnv)
@@ -701,7 +720,11 @@ function ADRunsController.getRunStatus(adEnv, run)
running = running + 1
end
end
return {running = running, total = #run.vehicleIds}
local isRunning = ADRunsController.runningRuns[run.id] == true and running > 0
if ADRunsController.runningRuns[run.id] and running == 0 then
ADRunsController.runningRuns[run.id] = nil
end
return {running = running, total = #run.vehicleIds, isRunning = isRunning}
end
-- ---- overblik ----