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