fix(marker): højst 2 slå-ture pr. mark (CP-hjørner gav uendelig genudsendelse); ryd færdige sæt ved Stop

Review-fund (MEDIUM): ADFieldJobs.finished voksede for marker der blev sendt ud igen uden at gå videre.
This commit is contained in:
2026-09-25 21:59:43 +02:00
parent 6ffd78896a
commit 4208b6e6c3
2 changed files with 20 additions and 6 deletions
+15 -6
View File
@@ -10,6 +10,8 @@ ADFieldJobs.TICK_MS = 1000
ADFieldJobs.ARRIVE_DISTANCE = 30
ADFieldJobs.IDLE_CONFIRM_MS = 5000
ADFieldJobs.START_TIMEOUT_MS = 60000
-- Courseplay kan efterlade hjørner på skæve marker: efter så mange færdige slå-ture går marken videre.
ADFieldJobs.MAX_MOW_PASSES = 2
ADFieldJobs.state = {fields = {}, fleet = {}, assignments = {}}
ADFieldJobs.timer = 0
ADFieldJobs.now = 0
@@ -33,7 +35,7 @@ function ADFieldJobs.decide(field, info, assignments, now)
end
if active == 0 and finished > 0 then
local stillStanding = field.stage == "mowing" and info ~= nil and (info.readyRatio or 0) >= ADFieldModel.CUT_RATIO
if not stillStanding then return {action = "advance"} end
if not stillStanding or finished >= ADFieldJobs.MAX_MOW_PASSES then return {action = "advance"} end
end
if info == nil or info.markerId == nil then return {action = "wait"} end
local role = ADFieldModel.wantsRig(field, active, now)
@@ -205,6 +207,16 @@ end
-- ---- udsendelse og opfølgning ----
-- Færdige sæt for en mark glemmes, når marken går videre eller stoppes. Listen er begrænset: en mark
-- der sendes ud igen uden at gå videre (hjørner), går videre efter MAX_MOW_PASSES færdige ture.
local function forgetFinished(fieldId)
local remaining = {}
for _, done in ipairs(ADFieldJobs.finished or {}) do
if done.fieldId ~= fieldId then table.insert(remaining, done) end
end
ADFieldJobs.finished = remaining
end
local function release(assignment, phase)
assignment.phase = phase or "released"
ADFieldJobs.state.assignments[assignment.vehicleId] = nil
@@ -338,6 +350,7 @@ function ADFieldJobs.stopField(adEnv, id)
pcall(function() if assignment.vehicle.stopCurrentAIJob ~= nil and ADCpBridge.isWorking(assignment.vehicle) then assignment.vehicle:stopCurrentAIJob(AIMessageSuccessStoppedByUser.new()) end end)
release(assignment)
end
forgetFinished(id)
setField(ADFieldModel.stop(ADFieldJobs.getField(id)))
ADFieldJobs.save()
log(id, "stoppet fra menuen")
@@ -364,11 +377,7 @@ local function stepField(adEnv, info)
elseif decision.action == "advance" then
local nextField = ADFieldModel.advance(field)
setField(nextField)
local remaining = {}
for _, done in ipairs(ADFieldJobs.finished or {}) do
if done.fieldId ~= info.id then table.insert(remaining, done) end
end
ADFieldJobs.finished = remaining
forgetFinished(info.id)
log(info.id, "%s -> %s", field.stage, nextField.stage)
ADFieldJobs.save()
elseif decision.action == "dispatch" then