fix(flows): review v1.51 — start af stoppet flow venter hvis traktoren er lånt af puljen, stop/slet af et stoppet flow rører ikke lånte traktorer, oprydning efter indlæsning springer lånte over, vogn holdt af ET kørende flow, flyttet traktor glemmer sin vogn, Stop-knap også for flows der holder stille, fejlet start sætter vognen tilbage, bygning væk kun for bygninger set i sessionen, spuNameFleet rører kun egne ikke-delte parkeringer (v1.51.2.0)
This commit is contained in:
@@ -25,6 +25,8 @@ end
|
||||
|
||||
-- s = {hasRear, wagonId, wagonExists, hasConnect, wagonAttached, wagonBusy} -> "start" | "fetch" | "wait"
|
||||
function ADFlowWagons.startAction(s)
|
||||
-- lånt ud af puljen (markarbejde, marksilo, på hjemtur): vent til den er fri
|
||||
if s.tractorBusy then return "wait" end
|
||||
if s.hasRear or s.wagonId == nil or not s.wagonExists or not s.hasConnect then return "start" end
|
||||
if s.wagonAttached or s.wagonBusy then return "wait" end
|
||||
return "fetch"
|
||||
@@ -41,8 +43,14 @@ end
|
||||
|
||||
-- Holdes vognen af et flow der ikke er stoppet? (så må puljen ikke låne den)
|
||||
function ADFlowWagons.isHeld(runs, wagonId)
|
||||
local run = ADFlowWagons.ownerOf(runs, wagonId)
|
||||
return run ~= nil and not run.stopped
|
||||
for _, run in ipairs(runs or {}) do
|
||||
if not run.stopped then
|
||||
for _, id in pairs(run.wagons or {}) do
|
||||
if id == wagonId then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Et tjek af om bygningen mangler: -> ny tæller, væk?
|
||||
@@ -52,12 +60,13 @@ function ADFlowWagons.missingStep(count, missingNow)
|
||||
return next, next >= ADFlowWagons.MISSING_CHECKS
|
||||
end
|
||||
|
||||
-- Flowets bygnings-id'er der ikke findes i exists = {[id] = true}.
|
||||
function ADFlowWagons.missingBuildings(run, exists)
|
||||
-- Flowets bygnings-id'er der ikke findes i exists = {[id] = true}. Kun bygninger der er set i denne session
|
||||
-- (seen) tæller: et forældet id i et gammelt flow må ikke stoppe et flow der virker.
|
||||
function ADFlowWagons.missingBuildings(run, exists, seen)
|
||||
local missing = {}
|
||||
for _, key in ipairs({"sourceBuildingIds", "targetBuildingIds", "storeBuildingIds"}) do
|
||||
for _, id in ipairs(run[key] or {}) do
|
||||
if not exists[id] then table.insert(missing, id) end
|
||||
if not exists[id] and (seen or {})[id] then table.insert(missing, id) end
|
||||
end
|
||||
end
|
||||
return missing
|
||||
@@ -68,6 +77,7 @@ end
|
||||
local waiting = setmetatable({}, {__mode = "k"}) -- traktor -> runId (venter på sin vogn)
|
||||
local fetching = setmetatable({}, {__mode = "k"}) -- traktor -> runId (henter sin vogn)
|
||||
local missingCount = {} -- runId -> tjek i træk
|
||||
local seenBuildings = {} -- bygnings-id'er set i denne session
|
||||
local rememberTimer, buildingTimer = 0, 0
|
||||
|
||||
local function runs()
|
||||
@@ -95,6 +105,17 @@ function ADFlowWagons.isFreeTractor(vehicle)
|
||||
return run == nil or run.stopped == true
|
||||
end
|
||||
|
||||
-- Holder flowet noget: en traktor henter/venter på sin vogn eller har en vogn bagpå (til Stop-knappen).
|
||||
function ADFlowWagons.hasActivity(run, vehiclesById)
|
||||
for _, vehicleId in ipairs(run.vehicleIds or {}) do
|
||||
local vehicle = vehiclesById ~= nil and vehiclesById[vehicleId] or nil
|
||||
if vehicle ~= nil and (waiting[vehicle] ~= nil or fetching[vehicle] ~= nil or #ADHitch.rearImplementsOf(vehicle) > 0) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function ADFlowWagons.hasWagonFor(run, tractorId)
|
||||
return (run.wagons or {})[tractorId] ~= nil
|
||||
end
|
||||
@@ -103,6 +124,14 @@ function ADFlowWagons.isHeldWagon(wagonId)
|
||||
return ADFlowWagons.isHeld(runs(), wagonId)
|
||||
end
|
||||
|
||||
-- Lånt ud af puljen: markarbejde, marksilo-lån, på hjemtur eller Courseplay kører den.
|
||||
function ADFlowWagons.isPoolBusy(vehicle, tractorId)
|
||||
return (ADFieldJobs ~= nil and ADFieldJobs.state.assignments[tractorId] ~= nil)
|
||||
or (ADFieldSilos ~= nil and ADFieldSilos.isLoaned(vehicle))
|
||||
or (ADPool ~= nil and ADPool.isReturning(vehicle))
|
||||
or (ADCpBridge ~= nil and ADCpBridge.isWorking(vehicle))
|
||||
end
|
||||
|
||||
-- Før en flow-traktor startes: hent sin vogn / vent på den. -> håndteret, resultat (som startVehicle)
|
||||
function ADFlowWagons.beforeStart(adEnv, run, vehicle)
|
||||
local tractorId = ADRunsController.getVehicleId(vehicle)
|
||||
@@ -111,6 +140,7 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle)
|
||||
local wagon = wagonId ~= nil and findAnyVehicle(wagonId) or nil
|
||||
local connectId = wagon ~= nil and connectOf(adEnv, wagon) or nil
|
||||
local action = ADFlowWagons.startAction({
|
||||
tractorBusy = ADFlowWagons.isPoolBusy(vehicle, tractorId),
|
||||
hasRear = #ADHitch.rearImplementsOf(vehicle) > 0, wagonId = wagonId, wagonExists = wagon ~= nil,
|
||||
hasConnect = connectId ~= nil,
|
||||
wagonAttached = wagon ~= nil and wagon.getAttacherVehicle ~= nil and wagon:getAttacherVehicle() ~= nil,
|
||||
@@ -129,7 +159,7 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle)
|
||||
waiting[vehicle] = nil
|
||||
fetching[vehicle] = run.id
|
||||
local runId = run.id
|
||||
ADHitch.fetch(adEnv, vehicle, connectId, function(tractor, ok, detail)
|
||||
local okFetch, errFetch = pcall(ADHitch.fetch, adEnv, vehicle, connectId, function(tractor, ok, detail)
|
||||
fetching[tractor] = nil
|
||||
local current = ADRuns.getRun(ADRunsController.store, runId)
|
||||
if current == nil or current.stopped then
|
||||
@@ -137,12 +167,22 @@ function ADFlowWagons.beforeStart(adEnv, run, vehicle)
|
||||
return
|
||||
end
|
||||
if ok then
|
||||
ADRunsController.startVehicle(adEnv, current, tractor)
|
||||
local result = ADRunsController.startVehicle(adEnv, current, tractor)
|
||||
if result ~= nil and not result.ok then
|
||||
-- flowet kan ikke startes (markør, bygning …): ikke efterladt ved Connect med vognen
|
||||
Logging.warning(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' kunne ikke starte (%s) — vognen sættes tilbage",
|
||||
tostring(current.name), tostring(ADRuns.vehicleLabel(tractor)), tostring(result.reason))
|
||||
ADHitch.returnHome(adEnv, tractor)
|
||||
end
|
||||
else
|
||||
Logging.warning(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' kunne ikke hente sin vogn (%s)", tostring(current.name),
|
||||
tostring(ADRuns.vehicleLabel(tractor)), tostring(detail))
|
||||
end
|
||||
end)
|
||||
if not okFetch then
|
||||
fetching[vehicle] = nil
|
||||
return true, {vehicle = vehicle, ok = false, reason = "error"}
|
||||
end
|
||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' henter sin vogn", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)))
|
||||
return true, {vehicle = vehicle, ok = true, reason = "fetchingWagon"}
|
||||
end
|
||||
@@ -204,9 +244,10 @@ local function checkBuildings(adEnv)
|
||||
if id ~= nil then exists[id] = true end
|
||||
end
|
||||
if next(exists) == nil then return end -- listen er ikke klar: sig intet
|
||||
for id in pairs(exists) do seenBuildings[id] = true end
|
||||
for _, run in ipairs(runs()) do
|
||||
if not run.stopped then
|
||||
local missing = ADFlowWagons.missingBuildings(run, exists)
|
||||
local missing = ADFlowWagons.missingBuildings(run, exists, seenBuildings)
|
||||
local count, gone = ADFlowWagons.missingStep(missingCount[run.id], #missing > 0)
|
||||
missingCount[run.id] = count
|
||||
if gone then
|
||||
@@ -234,7 +275,8 @@ local function cleanupAfterLoad(adEnv)
|
||||
local vehicle = ADRunsController.findVehicleById(adEnv, vehicleId)
|
||||
local module = vehicle ~= nil and vehicle.ad ~= nil and vehicle.ad.stateModule or nil
|
||||
local controlled = vehicle ~= nil and vehicle.getIsControlled ~= nil and vehicle:getIsControlled()
|
||||
if module ~= nil and not module:isActive() and not controlled and #ADHitch.poolParkIds(adEnv, vehicle) > 0 then
|
||||
if module ~= nil and not module:isActive() and not controlled and #ADHitch.poolParkIds(adEnv, vehicle) > 0
|
||||
and not ADFlowWagons.isPoolBusy(vehicle, vehicleId) then
|
||||
Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s' er stoppet: '%s' sætter sin vogn på plads", tostring(run.name),
|
||||
tostring(ADRuns.vehicleLabel(vehicle)))
|
||||
pcall(ADHitch.returnHome, adEnv, vehicle)
|
||||
|
||||
Reference in New Issue
Block a user