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:
@@ -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 ----
|
||||
|
||||
Reference in New Issue
Block a user