diff --git a/FS25_ADSmartPickup/adCpBridge.lua b/FS25_ADSmartPickup/adCpBridge.lua index d50823f..84a7930 100644 --- a/FS25_ADSmartPickup/adCpBridge.lua +++ b/FS25_ADSmartPickup/adCpBridge.lua @@ -377,8 +377,12 @@ function ADCpBridge.getWorkWidth(vehicle) return best end +-- AutoDrive kører også som AI-job i FS25: aktiv AD er ikke Courseplay (in-game 29/9: Milk Store ved Cow Wait +-- med AD aktiv blev meldt 'Courseplay kører' og ventede på sig selv). function ADCpBridge.isWorking(vehicle) if vehicle.getIsCpFieldWorkActive ~= nil and vehicle:getIsCpFieldWorkActive() then return true end + local module = vehicle.ad ~= nil and vehicle.ad.stateModule or nil + if module ~= nil and module.isActive ~= nil and module:isActive() then return false end return vehicle.getIsAIActive ~= nil and vehicle:getIsAIActive() or false end diff --git a/FS25_ADSmartPickup/adFlowWagons.lua b/FS25_ADSmartPickup/adFlowWagons.lua index fdb1190..8c33406 100644 --- a/FS25_ADSmartPickup/adFlowWagons.lua +++ b/FS25_ADSmartPickup/adFlowWagons.lua @@ -146,6 +146,7 @@ local fetching = setmetatable({}, {__mode = "k"}) -- traktor -> runId (henter s local emptying = setmetatable({}, {__mode = "k"}) -- traktor -> {stage, since, fillType, runName} local homing = setmetatable({}, {__mode = "k"}) -- traktor -> true (flowets hjemtur: vogn af, traktor hjem) local fetchRetries = setmetatable({}, {__mode = "k"}) -- traktor -> antal nye hente-forsøg +local lastWaitText = setmetatable({}, {__mode = "k"}) -- traktor -> sidst loggede venteårsag (kun ændringer logges) local missingCount = {} -- runId -> tjek i træk local seenBuildings = {} -- bygnings-id'er set i denne session local rememberTimer, buildingTimer = 0, 0 @@ -296,20 +297,22 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle) wagonBusy = wagonId ~= nil and ADPool.isReserved(wagonId), } local action = ADFlowWagons.startAction(startState) - if action == "start" then return false end + if action == "start" then lastWaitText[vehicle] = nil return false end ADRunsController.runningRuns[run.id] = true if action == "wait" then - if waiting[vehicle] == nil then - local holder = wagon ~= nil and wagon.getAttacherVehicle ~= nil and wagon:getAttacherVehicle() or nil - Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' venter på sin vogn (%s: %s)", tostring(run.name), - tostring(ADRuns.vehicleLabel(vehicle)), ADFlowWagons.waitReason(startState), - startState.tractorBusy and ADFlowWagons.busyWhy(vehicle, tractorId) - or (holder ~= nil and ("sidder på " .. tostring(ADRuns.vehicleLabel(holder)))) or "reserveret af puljen") + local holder = wagon ~= nil and wagon.getAttacherVehicle ~= nil and wagon:getAttacherVehicle() or nil + local waitText = ADFlowWagons.waitReason(startState) .. ": " .. (startState.tractorBusy and ADFlowWagons.busyWhy(vehicle, tractorId) + or (holder ~= nil and ("sidder på " .. tostring(ADRuns.vehicleLabel(holder)))) or "reserveret af puljen") + if lastWaitText[vehicle] ~= waitText then + lastWaitText[vehicle] = waitText + Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' venter på sin vogn (%s)", tostring(run.name), + tostring(ADRuns.vehicleLabel(vehicle)), waitText) end waiting[vehicle] = run.id return true, {vehicle = vehicle, ok = true, reason = "waitingWagon"} end waiting[vehicle] = nil + lastWaitText[vehicle] = nil fetching[vehicle] = run.id local runId = run.id local okFetch, errFetch = pcall(ADHitch.fetch, adEnv, vehicle, connectId, function(tractor, ok, detail) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index ded91d9..ed8fc14 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.57.3.0 + 1.57.4.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adCpBridge.lua b/tests/test_adCpBridge.lua index 8523054..2397575 100644 --- a/tests/test_adCpBridge.lua +++ b/tests/test_adCpBridge.lua @@ -164,5 +164,15 @@ check("forager i kursus: 2 runder", ADCpBridge.courseHasHeadlands({getNumberOfHe 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) +-- isWorking: AutoDrive kører også som AI i FS25 — det er ikke Courseplay (in-game 29/9: Milk Store holdt ved +-- Cow Wait med AD aktiv og "ventede på sig selv" som 'Courseplay kører') +local function fakeVehicle(cp, ai, ad) + return {getIsCpFieldWorkActive = function() return cp end, getIsAIActive = function() return ai end, + ad = {stateModule = {isActive = function() return ad end}}} +end +check("CP arbejder: Courseplay markarbejde", ADCpBridge.isWorking(fakeVehicle(true, true, false)), true) +check("CP arbejder: AI uden AD (CP-kørsel)", ADCpBridge.isWorking(fakeVehicle(false, true, false)), true) +check("CP arbejder: AutoDrive kører -> ikke CP", ADCpBridge.isWorking(fakeVehicle(false, true, true)), false) +check("CP arbejder: intet", ADCpBridge.isWorking(fakeVehicle(false, false, false)), false) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)