From be11283ba76ceab07cb3337432e614e5ad962be6 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Tue, 29 Sep 2026 14:54:38 +0200 Subject: [PATCH] =?UTF-8?q?fix(kobling):=20stoppedAway=20logger=20afstande?= =?UTF-8?q?n=20til=20mark=C3=B8ren;=20flow=20pr=C3=B8ver=20=C3=A9n=20gang?= =?UTF-8?q?=20mere=20at=20hente=20vognen=20efter=20stoppedAway;=20puljens?= =?UTF-8?q?=20skyld-regel=20matcher=20=C3=A5rsagen=20med=20afstand=20(v1.5?= =?UTF-8?q?6.1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adFlowWagons.lua | 15 +++++++++++++++ FS25_ADSmartPickup/adHitch.lua | 2 +- FS25_ADSmartPickup/adPool.lua | 2 +- FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adFlowWagons.lua | 4 ++++ tests/test_adHitch.lua | 3 ++- tests/test_adPool.lua | 1 + 7 files changed, 25 insertions(+), 4 deletions(-) diff --git a/FS25_ADSmartPickup/adFlowWagons.lua b/FS25_ADSmartPickup/adFlowWagons.lua index df2d3a5..be22302 100644 --- a/FS25_ADSmartPickup/adFlowWagons.lua +++ b/FS25_ADSmartPickup/adFlowWagons.lua @@ -32,6 +32,13 @@ function ADFlowWagons.startAction(s) return "fetch" end +-- Hent vogn fejlede: ét nyt forsøg når AD standsede undervejs (forbigående, fx spærret af en anden traktor); +-- ikke ved kobling der fejler ved markøren (den skal rettes). +ADFlowWagons.FETCH_RETRIES = 1 +function ADFlowWagons.retryFetch(reason, retries) + return tostring(reason):find("^stoppedAway") ~= nil and (retries or 0) < ADFlowWagons.FETCH_RETRIES +end + -- Hvorfor "wait" (til loggen). s som startAction. function ADFlowWagons.waitReason(s) if s.tractorBusy then return "tractorBusy" end @@ -133,6 +140,7 @@ local waiting = setmetatable({}, {__mode = "k"}) -- traktor -> runId (venter p local fetching = setmetatable({}, {__mode = "k"}) -- traktor -> runId (henter sin vogn) local emptying = setmetatable({}, {__mode = "k"}) -- traktor -> {stage, since, fillType, runName} local homing = setmetatable({}, {__mode = "k"}) -- traktor -> true (flowets hjemtur: vogn af, traktor hjem) +local fetchRetries = setmetatable({}, {__mode = "k"}) -- traktor -> antal nye hente-forsøg local missingCount = {} -- runId -> tjek i træk local seenBuildings = {} -- bygnings-id'er set i denne session local rememberTimer, buildingTimer = 0, 0 @@ -304,6 +312,7 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle) return end if ok then + fetchRetries[tractor] = nil local result = ADRunsController.startVehicle(adEnv, current, tractor) if result ~= nil and not result.ok then -- flowet kan ikke startes (markør, bygning …): ikke efterladt ved Connect med vognen @@ -311,7 +320,13 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle) tostring(current.name), tostring(ADRuns.vehicleLabel(tractor)), tostring(result.reason)) ADHitch.returnHome(adEnv, tractor) end + elseif ADFlowWagons.retryFetch(detail, fetchRetries[tractor]) then + fetchRetries[tractor] = (fetchRetries[tractor] or 0) + 1 + waiting[tractor] = runId -- retryWaiting starter den igen om lidt + Logging.warning(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' kunne ikke hente sin vogn (%s) — prøver igen", tostring(current.name), + tostring(ADRuns.vehicleLabel(tractor)), tostring(detail)) else + fetchRetries[tractor] = nil Logging.warning(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' kunne ikke hente sin vogn (%s)", tostring(current.name), tostring(ADRuns.vehicleLabel(tractor)), tostring(detail)) end diff --git a/FS25_ADSmartPickup/adHitch.lua b/FS25_ADSmartPickup/adHitch.lua index ec36918..70a2c72 100644 --- a/FS25_ADSmartPickup/adHitch.lua +++ b/FS25_ADSmartPickup/adHitch.lua @@ -123,7 +123,7 @@ function ADHitch.step(job, state, dt, succeeded) elseif ADHitch.hasArrived(state) then job.state = "acting" elseif state.distance > arriveDistanceOf(state) and (job.seenActive or job.elapsed >= ADHitch.START_GRACE_MS) then - job.state, job.reason = "failed", "stoppedAway" + job.state, job.reason = "failed", string.format("stoppedAway (%.0f m fra markøren)", state.distance) end elseif job.state == "acting" then if succeeded then diff --git a/FS25_ADSmartPickup/adPool.lua b/FS25_ADSmartPickup/adPool.lua index 75c7b0a..194e7bb 100644 --- a/FS25_ADSmartPickup/adPool.lua +++ b/FS25_ADSmartPickup/adPool.lua @@ -124,7 +124,7 @@ end -- Hvem fik koblingen til at fejle? Kom traktoren ikke frem, er det traktoren (ingen AD-rute), ellers redskabet. function ADPool.failureBlames(reason) - if reason == "stoppedAway" then return "tractor" end + if tostring(reason):find("^stoppedAway") ~= nil then return "tractor" end return "implement" end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index c73a13d..e69ba85 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.56.0.0 + 1.56.1.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFlowWagons.lua b/tests/test_adFlowWagons.lua index e21b2f6..492a6c7 100644 --- a/tests/test_adFlowWagons.lua +++ b/tests/test_adFlowWagons.lua @@ -105,5 +105,9 @@ check("tøm: kører mod målet (ikke i stå) -> vent", W.emptyStep("target", {ca check("i stå: tæt på, uændret længe", W.isStalled({nearTarget = true, sinceChangeMs = W.EMPTY_STALL_MS}), true) check("i stå: tæt på, lige ankommet", W.isStalled({nearTarget = true, sinceChangeMs = 5000}), false) check("i stå: på vej (langt væk)", W.isStalled({nearTarget = false, sinceChangeMs = 999999}), false) +-- hent vogn: ét nyt forsøg efter "stoppedAway" (AD standsede undervejs — fx spærret af en anden traktor) +check("hent igen: stoppedAway første gang", W.retryFetch("stoppedAway (37 m fra markøren)", 0), true) +check("hent igen: stoppedAway anden gang -> nej", W.retryFetch("stoppedAway", 1), false) +check("hent igen: noAttachable -> nej (markøren skal rettes)", W.retryFetch("noAttachable", 0), false) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1) diff --git a/tests/test_adHitch.lua b/tests/test_adHitch.lua index 76a8103..ea464a6 100644 --- a/tests/test_adHitch.lua +++ b/tests/test_adHitch.lua @@ -59,7 +59,7 @@ check("job: AD ikke startet endnu (opstart-frist)", lostJob.state, "driving") H.step(lostJob, {adActive = true, distance = 40, speed = 5}, 500, false) H.step(lostJob, {adActive = false, distance = 40, speed = 0}, 500, false) check("job: AD stoppede langt fra markøren", lostJob.state, "failed") -check("job: årsag stoppet undervejs", lostJob.reason, "stoppedAway") +check("job: årsag stoppet undervejs", tostring(lostJob.reason):find("^stoppedAway") ~= nil, true) -- tur: "Connect Bredal > Start" -> to markørnavne local route = H.parseTrip("Connect", "Bredal", ">", "Start", ">", "Afkobl", "Bredal", ">", "Start") check("tur: antal trin", #route, 4) @@ -120,5 +120,6 @@ check("transport: tændt+sænket+udfoldet", table.concat(H.stowActions({turnedOn check("transport: allerede klar", #H.stowActions({}), 0) check("transport: kan ikke foldes -> kun sluk/løft", table.concat(H.stowActions({turnedOn = true, lowered = true, unfolded = true, canFold = false}), ","), "turnOff,raise") check("transport: kun udfoldet", table.concat(H.stowActions({unfolded = true, canFold = true}), ","), "fold") +check("vagt: stoppedAway med afstand", H.step(H.newJob(1, "Connect x", "attach"), {adActive = false, distance = 37.4, speed = 0}, 4000, false).reason, "stoppedAway (37 m fra markøren)") print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1) diff --git a/tests/test_adPool.lua b/tests/test_adPool.lua index eb05ea2..14434b2 100644 --- a/tests/test_adPool.lua +++ b/tests/test_adPool.lua @@ -103,6 +103,7 @@ check("I1: selvkørende sprøjte", P.canPull("fertilizer"), false) local offNet = P.pairFor("plow", 0, 0, {implements[2]}, {{id = "far", x = 100, z = 0, offNetwork = true}, {id = "ok", x = 400, z = 0, hp = 300}}, {}) check("I2: traktor uden for vejnettet springes over", offNet.tractor.id, "ok") check("I2: stoppedAway -> traktoren", P.failureBlames("stoppedAway"), "tractor") +check("I2: stoppedAway med afstand -> traktoren", P.failureBlames("stoppedAway (40 m fra markøren)"), "tractor") check("I2: noAttachable -> redskabet", P.failureBlames("noAttachable"), "implement") -- I3: efter koblingen — tom uden påfyldning = fejl, tom med påfyldning = fyld op, ellers kør check("I3: ingen påfyldningsbehov", P.nextDrive(nil), "drive")