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
|
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,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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user