fix: runs-controller — ingen global fallback for køretøjs-indstilling; id-opslag via map

This commit is contained in:
2026-09-22 22:35:30 +02:00
parent c0d0edac69
commit 264a07c697
2 changed files with 40 additions and 9 deletions
+26 -9
View File
@@ -47,13 +47,21 @@ function ADRunsController.getFarmVehicles(adEnv)
return result return result
end end
function ADRunsController.findVehicleById(adEnv, vehicleId) -- Ét map pr. kald i stedet for at genscanne getFarmVehicles pr. vehicleId — startRun/stopRun/
-- getRunStatus/load slår flere id'er op pr. kald, og GUI'et kalder getRunStatus hvert sekund.
local function getFarmVehiclesById(adEnv)
local byId = {}
for _, vehicle in ipairs(ADRunsController.getFarmVehicles(adEnv)) do for _, vehicle in ipairs(ADRunsController.getFarmVehicles(adEnv)) do
if ADRunsController.getVehicleId(vehicle) == vehicleId then local id = ADRunsController.getVehicleId(vehicle)
return vehicle if id ~= nil then
byId[id] = vehicle
end end
end end
return nil return byId
end
function ADRunsController.findVehicleById(adEnv, vehicleId)
return getFarmVehiclesById(adEnv)[vehicleId]
end end
function ADRunsController.getRunForVehicle(vehicle) function ADRunsController.getRunForVehicle(vehicle)
@@ -182,13 +190,18 @@ end
-- ---- Start / Stop ---- -- ---- Start / Stop ----
-- AD gemmer indstillinger som INDEKS i values; useFolders er global, rotateTargets pr. køretøj. -- AD gemmer indstillinger som INDEKS i values; useFolders er global, rotateTargets pr. køretøj.
-- Er indstillingen køretøjs-specifik, men køretøjet mangler sin egen settings-tabel, skrives
-- der IKKE til den globale tabel — det ville ødelægge AD's globale default for alle køretøjer.
local function setSetting(adEnv, vehicle, settingName, value) local function setSetting(adEnv, vehicle, settingName, value)
local global = adEnv.AutoDrive.settings[settingName] local global = adEnv.AutoDrive.settings[settingName]
if global == nil then if global == nil then
return return
end end
local setting = global local setting = global
if global.isVehicleSpecific and vehicle.ad.settings ~= nil and vehicle.ad.settings[settingName] ~= nil then if global.isVehicleSpecific then
if vehicle.ad.settings == nil or vehicle.ad.settings[settingName] == nil then
return
end
setting = vehicle.ad.settings[settingName] setting = vehicle.ad.settings[settingName]
end end
for index, candidate in ipairs(setting.values) do for index, candidate in ipairs(setting.values) do
@@ -247,8 +260,9 @@ function ADRunsController.startRun(adEnv, runId)
if run == nil then if run == nil then
return results return results
end end
local vehiclesById = getFarmVehiclesById(adEnv)
for _, vehicleId in ipairs(run.vehicleIds) do for _, vehicleId in ipairs(run.vehicleIds) do
local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId) local vehicle = vehiclesById[vehicleId]
if vehicle ~= nil then if vehicle ~= nil then
local validation = ADRunsController.validateVehicle(adEnv, run, vehicle) local validation = ADRunsController.validateVehicle(adEnv, run, vehicle)
local result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason} local result = {vehicle = vehicle, ok = validation.ok, reason = validation.reason}
@@ -277,8 +291,9 @@ function ADRunsController.stopRun(adEnv, runId)
if run == nil then if run == nil then
return stopped return stopped
end end
local vehiclesById = getFarmVehiclesById(adEnv)
for _, vehicleId in ipairs(run.vehicleIds) do for _, vehicleId in ipairs(run.vehicleIds) do
local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId) local vehicle = vehiclesById[vehicleId]
if vehicle ~= nil and isVehicleActive(vehicle) then if vehicle ~= nil and isVehicleActive(vehicle) then
vehicle:stopAutoDrive() vehicle:stopAutoDrive()
stopped = stopped + 1 stopped = stopped + 1
@@ -289,8 +304,9 @@ end
function ADRunsController.getRunStatus(adEnv, run) function ADRunsController.getRunStatus(adEnv, run)
local running = 0 local running = 0
local vehiclesById = getFarmVehiclesById(adEnv)
for _, vehicleId in ipairs(run.vehicleIds) do for _, vehicleId in ipairs(run.vehicleIds) do
local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId) local vehicle = vehiclesById[vehicleId]
if vehicle ~= nil and isVehicleActive(vehicle) then if vehicle ~= nil and isVehicleActive(vehicle) then
running = running + 1 running = running + 1
end end
@@ -345,9 +361,10 @@ function ADRunsController.load(adEnv)
return return
end end
ADRunsController.store = store ADRunsController.store = store
local vehiclesById = getFarmVehiclesById(adEnv)
for _, run in ipairs(store.runs) do for _, run in ipairs(store.runs) do
for _, vehicleId in ipairs(run.vehicleIds) do for _, vehicleId in ipairs(run.vehicleIds) do
if ADRunsController.findVehicleById(adEnv, vehicleId) == nil then if vehiclesById[vehicleId] == nil then
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': køretøj %s findes ikke (endnu) i dette savegame", tostring(run.name), tostring(vehicleId)) Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': køretøj %s findes ikke (endnu) i dette savegame", tostring(run.name), tostring(vehicleId))
end end
end end
+14
View File
@@ -231,5 +231,19 @@ ADRunsController.installSaveHook()
ItemSystem.save() ItemSystem.save()
check("C9 save-hook kaldes før ItemSystem.save", hooked, true) check("C9 save-hook kaldes før ItemSystem.save", hooked, true)
-- C11: vogn uden egen ad.settings-tabel (ingen rotateTargets pr. køretøj) -> den
-- køretøjs-specifikke indstilling skrives IKKE til den globale settings-tabel
adEnv.AutoDrive.settings.rotateTargets.current = 1
adEnv.AutoDrive.settings.useFolders.current = 1
local settingsRun = ADRunsController.createRun("Settings Test")
ADRunsController.updateRun(settingsRun.id, {targetWayPointId = 94, loops = 1})
local noSettings = makeVehicle("vehicleH", "Uden AD-settings", {STRAW}, 500000, 200, 0)
noSettings.ad.settings = {}
ADRunsController.assignVehicle(settingsRun.id, noSettings)
ADRunsController.startRun(adEnv, settingsRun.id)
check("C11 global rotateTargets urørt", adEnv.AutoDrive.settings.rotateTargets.current, 1)
check("C11 useFolders global stadig skrevet", adEnv.AutoDrive.settings.useFolders.current, 2)
check("C11 køretøjet startet", noSettings.started, 1)
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)