diff --git a/FS25_ADSmartPickup/adFieldSilos.lua b/FS25_ADSmartPickup/adFieldSilos.lua index 9a0a70f..e2cb0f3 100644 --- a/FS25_ADSmartPickup/adFieldSilos.lua +++ b/FS25_ADSmartPickup/adFieldSilos.lua @@ -387,6 +387,7 @@ local function dispatchPool(adEnv, order, pair, silosById, storesById) if park ~= nil then ADFieldWork.startAd(adEnv, tractor, adEnv.AutoDrive.MODE_DRIVETO, park, nil) end return end + pcall(ADHitch.foldForTransport, tractor) local okDispatch, err = pcall(dispatchOne, adEnv, order, tractor, silosById, storesById, true) if not okDispatch then Logging.warning(ADFieldSilos.LOG_PREFIX .. "'%s' kunne ikke starte turen med puljevognen: %s", tostring(ADRuns.vehicleLabel(tractor)), tostring(err)) diff --git a/FS25_ADSmartPickup/adFieldWork.lua b/FS25_ADSmartPickup/adFieldWork.lua index 3e08820..f953816 100644 --- a/FS25_ADSmartPickup/adFieldWork.lua +++ b/FS25_ADSmartPickup/adFieldWork.lua @@ -1203,7 +1203,8 @@ function ADFieldWork.follow(adEnv, assignment) if park ~= nil then startAd(adEnv, vehicle, adEnv.AutoDrive.MODE_DRIVETO, park, nil) end return end - -- koblet på: bredden med redskabet på (for bred -> hjem igen) + -- koblet på: sammenfoldet til vejen, bredden med redskabet på (for bred -> hjem igen) + pcall(ADHitch.foldForTransport, vehicle) local width = ADCpBridge.getWorkWidth(vehicle) local okWidth, widthReason, widthArgs = ADFieldModel.checkWidth(assignment.role, width, ADFieldModel.requiredWidth(field, assignment.role)) if not okWidth then diff --git a/FS25_ADSmartPickup/adHitch.lua b/FS25_ADSmartPickup/adHitch.lua index 92ba065..3836de2 100644 --- a/FS25_ADSmartPickup/adHitch.lua +++ b/FS25_ADSmartPickup/adHitch.lua @@ -23,7 +23,8 @@ ADHitch.TIMEOUT_REASON = {attach = "noAttachable", detach = "nothingToDetach", a ADHitch.ARRIVE_DISTANCE = 5 -- m fra markøren, AD standser traktoren tæt på waypointet ADHitch.STILL_SPEED = 1 -- km/t ADHitch.START_GRACE_MS = 3000 -- så længe må AD være om at komme i gang efter fetch/drop -ADHitch.ACT_TIMEOUT_MS = 8000 -- så længe forsøges kobling/afkobling efter ankomst +ADHitch.ACT_TIMEOUT_MS = 8000 -- så længe forsøges kobling efter ankomst +ADHitch.DETACH_TIMEOUT_MS = 20000 -- afkobling: redskabet skal måske foldes ud først (plov: "unfold the tool") ADHitch.TICK_MS = 250 ADHitch.ROUTE_WAIT_MS = 10000 -- pause ved almindelige markører midt i en tur @@ -117,7 +118,8 @@ function ADHitch.step(job, state, dt, succeeded) job.state = "done" else job.actElapsed = job.actElapsed + dt - if job.actElapsed >= ADHitch.ACT_TIMEOUT_MS then + local limit = job.action == "detach" and ADHitch.DETACH_TIMEOUT_MS or ADHitch.ACT_TIMEOUT_MS + if job.actElapsed >= limit then job.state, job.reason = "failed", ADHitch.TIMEOUT_REASON[job.action] end end @@ -217,6 +219,17 @@ local function isImplementPark(adEnv, vehicle, markerId) return false end +-- Efter påkobling: fold foldbare redskaber sammen til vejen (CP folder selv ud på marken). +function ADHitch.foldForTransport(vehicle) + for _, implement in ipairs(ADHitch.rearImplementsOf(vehicle)) do + local object = implement.object + local unfolded = object.getIsUnfolded ~= nil and object:getIsUnfolded() + if unfolded and object.spec_foldable ~= nil and object.setFoldDirection ~= nil then + object:setFoldDirection(-(object.spec_foldable.turnOnFoldDirection or 1)) + end + end +end + function ADHitch.rearImplementsOf(vehicle) return ADHitch.rearImplements(attachedImplements(vehicle)) end @@ -236,6 +249,12 @@ function ADHitch.tryDetach(vehicle) local object = implement.object local allowed, warning = true, nil if object.isDetachAllowed ~= nil then allowed, warning = object:isDetachAllowed() end + if not allowed and object.spec_foldable ~= nil and object.setFoldDirection ~= nil then + -- plove o.l. må kun kobles af udfoldet (in-game 28/9: "You first need to unfold the tool") — fold ud + -- og prøv igen ved næste tick, mens foldningen kører + object:setFoldDirection(object.spec_foldable.turnOnFoldDirection or 1) + return false, "unfolding: " .. tostring(warning) + end if not allowed then return false, tostring(warning or "detachNotAllowed") end vehicle:detachImplementByObject(object) table.insert(names, implement.name) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 237a24e..f53184a 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.50.1.0 + 1.50.2.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adHitch.lua b/tests/test_adHitch.lua index e489da2..041ec7b 100644 --- a/tests/test_adHitch.lua +++ b/tests/test_adHitch.lua @@ -47,7 +47,7 @@ check("job: opgivet efter vagt-tid", failJob.state, "failed") check("job: årsag", failJob.reason, "noAttachable") local dropJob = H.newJob(9, "Afkobl Bredal", "detach") H.step(dropJob, {adActive = false, distance = 1, speed = 0}, 500, false) -for _ = 1, 20 do H.step(dropJob, {adActive = false, distance = 1, speed = 0}, 500, false) end +for _ = 1, 45 do H.step(dropJob, {adActive = false, distance = 1, speed = 0}, 500, false) end check("job: afkobling opgivet", dropJob.reason, "nothingToDetach") local lostJob = H.newJob(25, "Connect Bredal", "attach") H.step(lostJob, {adActive = false, distance = 40, speed = 0}, 500, false) @@ -98,5 +98,12 @@ H.fetch(stubEnv, tractorStub, 9, function() end) check("annullér: job fandtes", H.cancel(tractorStub), true) check("annullér: AD stoppet", tractorStub.stopped, true) check("annullér: intet job tilbage", H.cancel(tractorStub), false) +-- afkobling må tage længere tid (redskabet skal måske foldes ud først) +local foldJob = H.newJob(4, "Plov", "detach") +H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) +for _ = 1, 16 do H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) end +check("afkobling: stadig i gang efter 8 s (folder ud)", foldJob.state, "acting") +for _ = 1, 30 do H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) end +check("afkobling: opgivet efter sin frist", foldJob.state, "failed") print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)