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:
@@ -451,6 +451,27 @@ function ADCpBridge.getCourse(vehicle)
|
||||
return ok and course or nil
|
||||
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).
|
||||
local function setMultiTools(vehicle, n)
|
||||
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()
|
||||
if handle.cancelled then return end
|
||||
-- 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
|
||||
return startWithCourse()
|
||||
end
|
||||
@@ -551,14 +573,22 @@ function ADCpBridge.start(vehicle, fieldX, fieldZ, onDone, opts)
|
||||
end
|
||||
setMultiTools(vehicle, opts.multiTools or 1)
|
||||
-- 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
|
||||
job:onClickGenerateFieldWorkCourse(function(generated)
|
||||
handle.generating = false
|
||||
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
|
||||
startWithCourse()
|
||||
end)
|
||||
end
|
||||
generate(ADCpBridge.HEADLANDS)
|
||||
end
|
||||
handle.onBoundary = function(_, success, message)
|
||||
if handle.fired then return end
|
||||
handle.fired = true
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.51.4.0</version>
|
||||
<version>1.51.5.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
@@ -148,5 +148,21 @@ do
|
||||
AIJobType, g_currentMission = nil, nil
|
||||
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"))
|
||||
os.exit(failures == 0 and 0 or 1)
|
||||
|
||||
Reference in New Issue
Block a user