feat(kursus): nye Courseplay-kurser får altid 2 forager-runder og starter på forageren (ellers ind i træer i hjørnerne); smal mark -> ét forsøg uden; genbrugt kursus uden forager beregnes på ny (v1.51.5.0)

This commit is contained in:
2026-09-29 01:11:38 +02:00
parent a5c52cee09
commit 82db248775
3 changed files with 55 additions and 9 deletions
+31 -1
View File
@@ -451,6 +451,27 @@ function ADCpBridge.getCourse(vehicle)
return ok and course or nil return ok and course or nil
end end
-- Forager: nye kurser får altid HEADLANDS runder og starter på forageren, så der ikke køres ind i træer, hegn
-- o.l. i hjørnerne (brugerkrav 29/9). Kan kurset ikke laves med forager (smal mark), prøves én gang uden.
ADCpBridge.HEADLANDS = 2
function ADCpBridge.setHeadlands(vehicle, n)
if vehicle.getCourseGeneratorSettings == nil then return false end
return (pcall(function()
local settings = vehicle:getCourseGeneratorSettings()
settings.numberOfHeadlands:setValue(n)
if settings.startOnHeadland ~= nil then settings.startOnHeadland:setValue(n > 0) end
end))
end
-- Har kurset forager? (ukendt API = antag ja, så intet genberegnes unødigt)
function ADCpBridge.courseHasHeadlands(course)
if course == nil then return false end
if course.getNumberOfHeadlands == nil then return true end
local ok, n = pcall(course.getNumberOfHeadlands, course)
return not ok or type(n) ~= "number" or n > 0
end
-- Multi-tool: sæt antal sæt på kursus-generatoren før kurset laves (1 = normalt kursus). -- Multi-tool: sæt antal sæt på kursus-generatoren før kurset laves (1 = normalt kursus).
local function setMultiTools(vehicle, n) local function setMultiTools(vehicle, n)
pcall(function() vehicle:getCourseGeneratorSettings().multiTools:setValue(n or 1) end) pcall(function() vehicle:getCourseGeneratorSettings().multiTools:setValue(n or 1) end)
@@ -537,7 +558,8 @@ function ADCpBridge.start(vehicle, fieldX, fieldZ, onDone, opts)
local function generateAndStart() local function generateAndStart()
if handle.cancelled then return end if handle.cancelled then return end
-- genbrug: maskinens eget kursus (CP's validate kræver kun hasCpCourse) — ingen ny beregning -- genbrug: maskinens eget kursus (CP's validate kræver kun hasCpCourse) — ingen ny beregning
if opts.reuse and ADCpBridge.getCourse(vehicle) ~= nil then -- eget kursus genbruges kun med forager (ellers nyt kursus med 2 runder)
if opts.reuse and ADCpBridge.getCourse(vehicle) ~= nil and ADCpBridge.courseHasHeadlands(ADCpBridge.getCourse(vehicle)) then
handle.reusedCourse = true handle.reusedCourse = true
return startWithCourse() return startWithCourse()
end end
@@ -551,14 +573,22 @@ function ADCpBridge.start(vehicle, fieldX, fieldZ, onDone, opts)
end end
setMultiTools(vehicle, opts.multiTools or 1) setMultiTools(vehicle, opts.multiTools or 1)
-- kursusberegningen kører over mange frames på store marker: moden venter længere imens -- kursusberegningen kører over mange frames på store marker: moden venter længere imens
local function generate(headlands)
ADCpBridge.setHeadlands(vehicle, headlands)
handle.generating = true handle.generating = true
job:onClickGenerateFieldWorkCourse(function(generated) job:onClickGenerateFieldWorkCourse(function(generated)
handle.generating = false handle.generating = false
if handle.cancelled then return end if handle.cancelled then return end
if not generated and headlands > 0 then
Logging.info("ADSmartPickup: kursus med %d forager-runder kunne ikke laves — prøver uden forager", headlands)
return generate(0)
end
if not generated then return finish(false, "Courseplay kunne ikke lave kursus") end if not generated then return finish(false, "Courseplay kunne ikke lave kursus") end
startWithCourse() startWithCourse()
end) end)
end end
generate(ADCpBridge.HEADLANDS)
end
handle.onBoundary = function(_, success, message) handle.onBoundary = function(_, success, message)
if handle.fired then return end if handle.fired then return end
handle.fired = true handle.fired = true
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107"> <modDesc descVersion="107">
<author>masterdraco</author> <author>masterdraco</author>
<version>1.51.4.0</version> <version>1.51.5.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>
+16
View File
@@ -148,5 +148,21 @@ do
AIJobType, g_currentMission = nil, nil AIJobType, g_currentMission = nil, nil
end end
-- forager: 2 runder og start på forageren (så der ikke køres ind i træer o.l. i hjørnerne)
local recorded = {}
local function setting(name) return {setValue = function(_, v) recorded[name] = v end} end
local headlandVehicle = {getCourseGeneratorSettings = function() return {numberOfHeadlands = setting("headlands"), startOnHeadland = setting("startOnHeadland")} end}
check("forager: sat", ADCpBridge.setHeadlands(headlandVehicle, 2), true)
check("forager: 2 runder", recorded.headlands, 2)
check("forager: start på forageren", recorded.startOnHeadland, true)
ADCpBridge.setHeadlands(headlandVehicle, 0)
check("forager: ingen -> ikke start på forageren", recorded.startOnHeadland, false)
check("forager: køretøj uden CP", ADCpBridge.setHeadlands({}, 2), false)
check("forager: standard er 2", ADCpBridge.HEADLANDS, 2)
-- genbrugt kursus uden forager beregnes på ny
check("forager i kursus: 2 runder", ADCpBridge.courseHasHeadlands({getNumberOfHeadlands = function() return 2 end}), true)
check("forager i kursus: ingen", ADCpBridge.courseHasHeadlands({getNumberOfHeadlands = function() return 0 end}), false)
check("forager i kursus: ukendt -> antag ja", ADCpBridge.courseHasHeadlands({}), true)
check("forager i kursus: intet kursus", ADCpBridge.courseHasHeadlands(nil), false)
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
os.exit(failures == 0 and 0 or 1) os.exit(failures == 0 and 0 or 1)