diff options
-rw-r--r-- | advtrains_interlocking/lzb.lua | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/advtrains_interlocking/lzb.lua b/advtrains_interlocking/lzb.lua index c352869..e439703 100644 --- a/advtrains_interlocking/lzb.lua +++ b/advtrains_interlocking/lzb.lua @@ -41,25 +41,38 @@ The traverser stops at signals that result in spd==0, because changes beyond the local il = advtrains.interlocking -local BRAKE_SPACE = 10 -local AWARE_ZONE = 50 +local params = { + BRAKE_SPACE = 10, + AWARE_ZONE = 50, -local ADD_STAND = 2.5 -local ADD_SLOW = 1.5 -local ADD_FAST = 7 -local ZONE_ROLL = 2 -local ZONE_HOLD = 5 -- added on top of ZONE_ROLL -local ZONE_VSLOW = 3 -- When speed is <2, still allow accelerating + ADD_STAND = 2.5, + ADD_SLOW = 1.5, + ADD_FAST = 7, + ZONE_ROLL = 2, + ZONE_HOLD = 5, -- added on top of ZONE_ROLL + ZONE_VSLOW = 3, -- When speed is <2, still allow accelerating + + DST_FACTOR = 1.5, + + SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX, +} + +function advtrains.interlocking.set_lzb_param(par, val) + if params[par] and tonumber(val) then + params[par] = tonumber(val) + else + error("Inexistant param or not a number") + end +end -local SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX local function look_ahead(id, train) local acc = advtrains.get_acceleration(train, 1) local vel = train.velocity - local brakedst = -(vel*vel) / (2*acc) + local brakedst = ( -(vel*vel) / (2*acc) ) * params.DST_FACTOR - local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + BRAKE_SPACE) + local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + params.BRAKE_SPACE) --local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE) local lzb = train.lzb @@ -103,7 +116,7 @@ local function look_ahead(id, train) if lzb.travsht then --shunt move if asp.shunt.free then - nspd = SHUNT_SPEED_MAX + nspd = params.SHUNT_SPEED_MAX elseif asp.shunt.proceed_as_main and asp.main.free then nspd = asp.main.speed lzb.travsht = false @@ -113,7 +126,7 @@ local function look_ahead(id, train) if asp.main.free then nspd = asp.main.speed elseif asp.shunt.free then - nspd = SHUNT_SPEED_MAX + nspd = params.SHUNT_SPEED_MAX lzb.travsht = true end end @@ -190,12 +203,12 @@ local function apply_control(id, train) local f = (v1-v0) / a local s = v0*f + a*f*f/2 - local st = s + ADD_SLOW + local st = s + params.ADD_SLOW if v0 > 3 then - st = s + ADD_FAST + st = s + params.ADD_FAST end if v0<=0 then - st = s + ADD_STAND + st = s + params.ADD_STAND end local i = advtrains.path_get_index_by_offset(train, it.idx, -st) @@ -208,13 +221,13 @@ local function apply_control(id, train) return end - i = advtrains.path_get_index_by_offset(train, i, -ZONE_ROLL) + i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_ROLL) if i <= train.index and v0>1 then -- roll control train.ctrl.lzb = 2 return end - i = advtrains.path_get_index_by_offset(train, i, -ZONE_HOLD) + i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_HOLD) if i <= train.index and v0>1 then -- hold speed train.ctrl.lzb = 3 |