From 4208b6e6c3359a518581d43a76efb5995e1c97c9 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Fri, 25 Sep 2026 21:59:43 +0200 Subject: [PATCH] =?UTF-8?q?fix(marker):=20h=C3=B8jst=202=20sl=C3=A5-ture?= =?UTF-8?q?=20pr.=20mark=20(CP-hj=C3=B8rner=20gav=20uendelig=20genudsendel?= =?UTF-8?q?se);=20ryd=20f=C3=A6rdige=20s=C3=A6t=20ved=20Stop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review-fund (MEDIUM): ADFieldJobs.finished voksede for marker der blev sendt ud igen uden at gå videre. --- FS25_ADSmartPickup/adFieldJobs.lua | 21 +++++++++++++++------ tests/test_adFieldJobs.lua | 5 +++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/FS25_ADSmartPickup/adFieldJobs.lua b/FS25_ADSmartPickup/adFieldJobs.lua index 156849f..5136bd5 100644 --- a/FS25_ADSmartPickup/adFieldJobs.lua +++ b/FS25_ADSmartPickup/adFieldJobs.lua @@ -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 diff --git a/tests/test_adFieldJobs.lua b/tests/test_adFieldJobs.lua index d4b18e5..3041e52 100644 --- a/tests/test_adFieldJobs.lua +++ b/tests/test_adFieldJobs.lua @@ -33,5 +33,10 @@ local collecting = M.advance(mowing) check("J5 genoptag opsamling", J.decide(collecting, info, {}, 0).role, "collector") check("J5 to vogne maks", J.decide(collecting, info, {{phase = "working"}, {phase = "driving"}}, 0).action, "none") +-- J6: Courseplay efterlader et hjørne -> efter 2 færdige slå-ture går marken videre alligevel +local standing = {id = 109, markerId = 5, mowable = true, readyRatio = 0.8} +check("J6 én tur -> slå igen", J.decide(mowing, standing, {{phase = "finished"}}, 0).action, "dispatch") +check("J6 to ture -> videre", J.decide(mowing, standing, {{phase = "finished"}, {phase = "finished"}}, 0).action, "advance") + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)