mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-09-01 02:22:15 +00:00
PyBridge
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
-- Optional connection tuning extension for MOOSE Bridge.
|
||||
--
|
||||
-- Load after MooseBridge.lua and before creating the bridge instance. It reduces
|
||||
-- DCS main-thread stalls when the Python server is not running by shortening the
|
||||
-- blocking LuaSocket connect timeout and using less aggressive retry defaults.
|
||||
|
||||
if not MOOSE_BRIDGE then error("Load MooseBridge.lua before MooseBridgeSocketTuningExtension.lua") end
|
||||
|
||||
local function bridge_tuning_mission_time()
|
||||
if timer and timer.getTime then return timer.getTime() end
|
||||
return 0
|
||||
end
|
||||
|
||||
local function bridge_tuning_safe_tostring(value)
|
||||
if value == nil then return "nil" end
|
||||
return tostring(value)
|
||||
end
|
||||
|
||||
local function bridge_should_log_connect_failure(bridge, err, now)
|
||||
if bridge.LogConnectFailures == false then return false end
|
||||
if err == "timeout" and bridge.LogConnectTimeouts ~= true then return false end
|
||||
|
||||
local interval = bridge.ConnectFailureLogInterval or 60
|
||||
if bridge.LastConnectFailureLog and now - bridge.LastConnectFailureLog < interval then return false end
|
||||
|
||||
bridge.LastConnectFailureLog = now
|
||||
return true
|
||||
end
|
||||
|
||||
local _moose_bridge_tuning_base_new = MOOSE_BRIDGE.New
|
||||
|
||||
function MOOSE_BRIDGE:New(host, port)
|
||||
local bridge = _moose_bridge_tuning_base_new(self, host, port)
|
||||
|
||||
-- Keep idle bridge retries low-impact when the Python server is not listening.
|
||||
bridge.ConnectTimeout = bridge.ConnectTimeout or 0.02
|
||||
if bridge.ConnectRetryDelay == nil or bridge.ConnectRetryDelay == 5 then bridge.ConnectRetryDelay = 10 end
|
||||
if bridge.TickInterval == nil or bridge.TickInterval == 0.2 then bridge.TickInterval = 0.5 end
|
||||
if bridge.HeartbeatInterval == nil or bridge.HeartbeatInterval == 5 then bridge.HeartbeatInterval = 10 end
|
||||
|
||||
-- Keep expected idle reconnect timeouts out of dcs.log by default.
|
||||
if bridge.LogConnectFailures == nil then bridge.LogConnectFailures = true end
|
||||
if bridge.LogConnectTimeouts == nil then bridge.LogConnectTimeouts = false end
|
||||
bridge.ConnectFailureLogInterval = bridge.ConnectFailureLogInterval or 60
|
||||
bridge.LastConnectFailureLog = nil
|
||||
|
||||
return bridge
|
||||
end
|
||||
|
||||
function MOOSE_BRIDGE:_Connect()
|
||||
local now = bridge_tuning_mission_time()
|
||||
if now - self.LastConnectAttempt < (self.ConnectRetryDelay or 10) then return end
|
||||
self.LastConnectAttempt = now
|
||||
|
||||
local lib = require("socket")
|
||||
local conn = lib.tcp()
|
||||
conn:settimeout(self.ConnectTimeout or 0.02)
|
||||
|
||||
local ok, err = conn:connect(self.Host, self.Port)
|
||||
if not ok then
|
||||
if bridge_should_log_connect_failure(self, err, now) then
|
||||
self:_Log("Connect failed: " .. bridge_tuning_safe_tostring(err))
|
||||
end
|
||||
conn:close()
|
||||
return
|
||||
end
|
||||
|
||||
-- All regular bridge IO is polled from the scheduler tick and must not block DCS.
|
||||
conn:settimeout(0)
|
||||
self.Socket = conn
|
||||
self.Connected = true
|
||||
self:_Log("Connected to Python bridge")
|
||||
end
|
||||
Reference in New Issue
Block a user