From ddcf324a015246aecc6c2388342b65cbf4cb1008 Mon Sep 17 00:00:00 2001 From: kiritow <1362050620@qq.com> Date: Fri, 27 Oct 2017 16:18:19 +0800 Subject: [PATCH] Update Station 2/6 program --- station_2_6.lua | 990 ++++++++++++++++++++---------------------------- 1 file changed, 402 insertions(+), 588 deletions(-) diff --git a/station_2_6.lua b/station_2_6.lua index a8970f7..716c38a 100644 --- a/station_2_6.lua +++ b/station_2_6.lua @@ -1,12 +1,11 @@ --[[ Station 2/6 Standard Schedule Program ]] - require("libevent") require("util") require("checkarg") require("queue") -local sides=require("sides") +local sides = require("sides") -- Config your update functions here (Do not change variable name) local redin1 = proxy("redstone", "a0") @@ -19,55 +18,44 @@ local redout3 = proxy("redstone", "90") local redout4 = proxy("redstone", "53") -- Redirect Table -local redirect_tb= -{ - ["ab_st"]={redin1,sides.north}, - ["ab_sr"]={redin1,sides.east}, - ["ab_sv"]={redin1,sides.south}, - ["ab_lout"]={redin1,sides.west}, - - ["ba_st"] = {redin2,sides.north}, - ["ba_sr"] = {redin2,sides.east}, - ["ba_sv"]={redin2,sides.south}, - ["ba_lout"] = {redin2,sides.west}, - +local redirect_tb = { + ["ab_st"] = {redin1, sides.north}, + ["ab_sr"] = {redin1, sides.east}, + ["ab_sv"] = {redin1, sides.south}, + ["ab_lout"] = {redin1, sides.west}, + ["ba_st"] = {redin2, sides.north}, + ["ba_sr"] = {redin2, sides.east}, + ["ba_sv"] = {redin2, sides.south}, + ["ba_lout"] = {redin2, sides.west}, -- ins: Inside station sensor - ["s1"] = {redin3,sides.north}, - ["s2"] = {redin3,sides.east}, - ["s3"] = {redin3,sides.south}, - ["s4"] = {redin3,sides.west}, - - ["s5"]={redin4,sides.north}, - ["s6"]={redin4,sides.east}, - ["st_l"]={redin4,sides.south}, - - + ["s1"] = {redin3, sides.north}, + ["s2"] = {redin3, sides.east}, + ["s3"] = {redin3, sides.south}, + ["s4"] = {redin3, sides.west}, + ["s5"] = {redin4, sides.north}, + ["s6"] = {redin4, sides.east}, + ["st_l"] = {redin4, sides.south}, -- Output - ["m1"]={redout1,sides.north}, - ["m2"]={redout1,sides.east}, - ["m3"]={redout1,sides.south}, - ["m4"]={redout1,sides.west}, - - ["m5"]={redout2,sides.north}, - ["m6"]={redout2,sides.east}, - ["k1"]={redout2,sides.south}, - ["k2"]={redout2,sides.west}, - - ["k3"]={redout3,sides.north}, - ["k4"]={redout3,sides.east}, - ["k5"]={redout3,sides.south}, - ["k6"]={redout3,sides.west}, - - ["ab_ko"]={redout4,sides.north}, - ["ba_ko"]={redout4,sides.east}, - - ["last_unused"]={"unused",sides.north} + ["m1"] = {redout1, sides.north}, + ["m2"] = {redout1, sides.east}, + ["m3"] = {redout1, sides.south}, + ["m4"] = {redout1, sides.west}, + ["m5"] = {redout2, sides.north}, + ["m6"] = {redout2, sides.east}, + ["k1"] = {redout2, sides.south}, + ["k2"] = {redout2, sides.west}, + ["k3"] = {redout3, sides.north}, + ["k4"] = {redout3, sides.east}, + ["k5"] = {redout3, sides.south}, + ["k6"] = {redout3, sides.west}, + ["ab_ko"] = {redout4, sides.north}, + ["ba_ko"] = {redout4, sides.east}, + ["last_unused"] = {"unused", sides.north} } - -local function getNameFromRaw(Device,Side) - for k,t in pairs(redirect_tb) do - if(t[1].address == Device and t[2]==Side) then +local function getNameFromRaw(Device, Side) + for k, t in pairs(redirect_tb) do + if (t[1].address == Device and t[2] == Side) then return k end end @@ -76,7 +64,7 @@ local function getNameFromRaw(Device,Side) end local function getRawFromName(Name) - return redirect_tb[Name][1],redirect_tb[Name][2] + return redirect_tb[Name][1], redirect_tb[Name][2] end local function enabledevice(Name) @@ -94,8 +82,8 @@ local function disabledevice(Name) end local function readdevice(Name) - local d,s=getRawFromName(Name) - if(d~=nil and s~=nil) then + local d, s = getRawFromName(Name) + if (d ~= nil and s ~= nil) then return d.getInput(s) else -- Critical error @@ -103,99 +91,188 @@ local function readdevice(Name) end end -local evl=Queue.new() +local function trigger(Name) + enabledevice(Name) + os.sleep(0.25) + disabledevice(Name) +end -local function train_delegator(Name,callback_func) - evl:push(AddEventListener("redstone_changed", - function(ev,dev,sd,from,to) - if(getNameFromRaw(dev,sd)==Name) then - callback_func(from,to) +local evl = Queue.new() + +local function train_delegator(Name, callback_func) + evl:push( + AddEventListener( + "redstone_changed", + function(ev, dev, sd, from, to) + if (getNameFromRaw(dev, sd) == Name) then + callback_func(from, to) + end end - end)) + ) + ) end -- Data for 6 ways. -local isfree={true,true,true,true,true,true} -local timerid={0,0,0,0,0,0} -local timecnt={0,0,0,0,0,0} -local revflag={false,false,false,false,false,false} -local ab_timerid_out,ab_time_out=0,0 -local ba_timerid_out,ba_time_out=0,0 -local _side_line_free=true -local _side_line_hw=true +local isfree = {true, true, true, true, true, true} +local timerid = {-1, -1, -1, -1, -1, -1} +local timecnt = {0, 0, 0, 0, 0, 0} +local revflag = {false, false, false, false, false, false} +local ab_timerid_out, ab_time_out = 0, 0 +local ba_timerid_out, ba_time_out = 0, 0 +local _side_line_free = true +local _side_line_hw = true +local _auto_unlock_side_line_hw = false local function isSideLineFree() return _side_line_free and _side_line_hw end local function lockSideLine() - _side_line_free=false + _side_line_free = false end local function unlockSideLine() - _side_line_free=true + if (not _auto_unlock_side_line_hw) then -- Manual + _side_line_free = true + end -- else it will be unlock automatically end -local bus=Queue.new() +local function setSideLineAutoUnlock(flag) + checkbool(flag) + _auto_unlock_side_line_hw = flag + if (flag) then + print("SideLine AutoUnlock is now enabled") + else + print("SideLine AutoUnlock is not disabled") + end +end + +local bus = Queue.new() + +local function addNormalStationTimer(n) -- Add Normal Timer + checknumber(n) + if (timerid[n] ~= -1) then + print("Error: add another timer to station ", n) + bus:push("halt") + end + timecnt[n] = 1 + timerid[n] = + AddTimer( + 1, + function() + timecnt[n] = timecnt[n] + 1 + if (timecnt[n] == 5) then + bus:push("s" .. n .. "_timeout") + end + end, + -1 + ) +end + +local function addSimpleStationTimer(n) -- Add Simple Timer + checknumber(n) + if (timerid[n] ~= -1) then + print("Error: add another timer to station ", n) + bus:push("halt") + end + timecnt[n] = 1 + timerid[n] = + AddTimer( + 1, + function() + timecnt[n] = timecnt[n] + 1 + end, + -1 + ) +end + +local function stopTimer(n) -- Stop Timer + checknumber(n) + if (timerid[n] == -1) then + print("Error: stopping a non-exist timer") + bus:push("halt") + end + RemoveTimer(timerid[n]) + timerid[n] = -1 + timecnt[n] = 0 +end local function doInit() - evl:push(AddEventListener("interrupted", - function() - bus:push("stop") - end)) + setSideLineAutoUnlock(true) - train_delegator("ab_st", - function(from,to) - if(from= timecnt[1] and timecnt[n] >= timecnt[2] and timecnt[n] >= timecnt[3] and timecnt[n] >= timecnt[6]) then + if (revflag[1]) then -- Way n need reverse + if (isfree[4]) then -- Way n --> Way 4 + isfree[4] = false + revflag[4] = false + disabledevice("m3") + disabledevice("m4") + disabledevice("k4") + done = true + elseif (isfree[5]) then --- Way n --> Way5 + isfree[5] = false + revflag[5] = false + disabledevice("m3") + enabledevice("m4") + disabledevice("k5") + done = true + end + else -- Way n does not need reverse + if (ab_time_out == 0 and readdevice("ab_lout") > 0) then -- Can move to next station (B) + startABTimer() + enabledevice("m3") + done = true + end + end + end + end + + if (done) then -- Clear way n + stopTimer(n) + isfree[n] = true + lockSideLine() + trigger("k" .. n) + unlockSideLine() + else + bus:push(ev) + end end local function TCSMain() @@ -222,554 +360,230 @@ local function TCSMain() print("TCS Started. Press Ctrl+C to stop.") -- Main Processing Loop - local running=true - while(running) do + local running = true + while (running) do os.sleep(0.25) -- Shorter sleep, faster program. - - local ev="no_event" - if(bus:top()~=nil) then - ev=bus:pop() -- Notice: Event is already poped. + + local ev = "no_event" + if (bus:top() ~= nil) then + ev = bus:pop() -- Notice: Event is already poped. end - + -- For Debug: Print Event Name - if(ev~="no_event") then + if (ev ~= "no_event") then print(ev) end - if(ev=="no_event") then + if (ev == "no_event") then -- No event, no action. - elseif(ev=="stop") then - running=false - elseif(ev=="ab_new_train") then - local act=false - if(readdevice("ab_sr")>0) then -- Train will stop - if(readdevice("ab_sv")>0) then -- Train will reverse - if(isfree[1]) then -- Train --> Way1 - isfree[1]=false - revflag[1]=true + elseif (ev == "stop") then + running = false + elseif (ev == "halt") then + print("Exception Occured! Something goes wrong!") + running = false + elseif (ev == "ab_new_train") then + local act = false + if (readdevice("ab_sr") > 0) then -- Train will stop + if (readdevice("ab_sv") > 0) then -- Train will reverse + if (isfree[1]) then -- Train --> Way1 + isfree[1] = false + revflag[1] = true disabledevice("m6") enabledevice("m1") disabledevice("k1") - act=true - elseif(isfree[2]) then -- Train --> Way2 - isfree[2]=false - revflag[2]=true + act = true + elseif (isfree[2]) then -- Train --> Way2 + isfree[2] = false + revflag[2] = true disabledevice("m6") disabledevice("m1") enabledevice("m2") disabledevice("k2") - act=true - elseif(isfree[6]) then -- Train --> Way6 - isfree[6]=false - revflag[6]=true - + act = true + elseif (isfree[6]) then -- Train --> Way6 + isfree[6] = false + revflag[6] = true + enabledevice("m6") disabledevice("k6") - act=true + act = true end else -- Train does not need reverse - if(isfree[1]) then -- Train --> Way1 - isfree[1]=false - revflag[1]=false + if (isfree[1]) then -- Train --> Way1 + isfree[1] = false + revflag[1] = false disabledevice("m6") enabledevice("m1") disabledevice("k1") - act=true - elseif(isfree[2]) then -- Train --> Way2 - isfree[2]=false - revflag[2]=false + act = true + elseif (isfree[2]) then -- Train --> Way2 + isfree[2] = false + revflag[2] = false disabledevice("m6") disabledevice("m1") enabledevice("m2") disabledevice("k2") - act=true + act = true end -- None-reverse train should not enter 6 end else -- Train will pass - if(isfree[3]) then -- Train --> Way3 - isfree[3]=false - if(readdevice("ab_sv")>0) then -- Train will reverse - revflag[3]=true + if (isfree[3]) then -- Train --> Way3 + isfree[3] = false + if (readdevice("ab_sv") > 0) then -- Train will reverse + revflag[3] = true else - revflag[3]=false + revflag[3] = false end - + disabledevice("m6") disabledevice("m1") disabledevice("m2") disabledevice("k3") - act=true + act = true end end - if(act) then - enabledevice("ab_ko") - os.sleep(0.25) - disabledevice("ab_ko") + if (act) then + trigger("ab_ko") else bus:push(ev) end - elseif(ev=="ba_new_train") then - local act=false - if(readdevice("ba_sr")>0) then -- Train will stop - if(readdevice("ba_sv")>0) then -- Train will reverse - if(isfree[5]) then -- Train --> Way5 (will reverse) - isfree[5]=false - revflag[5]=true + elseif (ev == "ba_new_train") then + local act = false + if (isSideLineFree()) then -- Side line free, can move in. + if (readdevice("ba_sr") > 0) then -- Train will stop + if (readdevice("ba_sv") > 0) then -- Train will reverse + if (isfree[5]) then -- Train --> Way5 (will reverse) + isfree[5] = false + revflag[5] = true - enabledevice("m4") - disabledevice("k5") - act=true + enabledevice("m4") + disabledevice("k5") + act = true + end + else -- Train does not need reverse + if (isfree[5]) then -- Train --> Way5 (will not reverse) + isfree[5] = false + revflag[5] = false + + enabledevice("m4") + disabledevice("k5") + act = true + end end - else -- Train does not need reverse - if(isfree[5]) then -- Train --> Way5 (will not reverse) - isfree[5]=false - revflag[5]=false + else -- Train will pass + if (readdevice("ba_sv") > 0) then -- Train will reverse + if (isfree[5]) then -- Train --> Way5 (will reverse) + isfree[5] = false + revflag[5] = true - enabledevice("m4") - disabledevice("k5") - act=true - end - end - else -- Train will pass - if(readdevice("ba_sv")>0) then -- Train will reverse - if(isfree[5]) then -- Train --> Way5 (will not reverse) - isfree[5]=false - revflag[5]=true + enabledevice("m4") + disabledevice("k5") + act = true + end + else -- Train does not need reverse + if (isfree[4]) then -- Train --> Way4 (not reverse) + isfree[4] = false + revflag[4] = false - enabledevice("m4") - disabledevice("k5") - act=true - end - else -- Train does not need reverse - if(isfree[4]) then - isfree[4]=false - revflag[4]=false - - disabledevice("m4") - disabledevice("k4") - act=true - elseif(isfree[5]) then - isfree[5]=false - revflag[5]=false + disabledevice("m4") + disabledevice("k4") + act = true + elseif (isfree[5]) then -- Train --> Way5 (not reverse) + isfree[5] = false + revflag[5] = false - enabledevice("m4") - disabledevice("k5") - act=true + enabledevice("m4") + disabledevice("k5") + act = true + end end end end - - if(act) then - enabledevice("ba_ko") - os.sleep(0.25) - disabledevice("ba_ko") + + if (act) then + lockSideLine() + trigger("ba_ko") + unlockSideLine() else bus:push(ev) end - elseif(ev=="s1_ready") then -- Add in-station timer - timecnt[1]=1 - timerid[1]=AddTimer(1, - function() - timecnt[1]=timecnt[1]+1 - if(timecnt[1]==5) then - bus:push("s1_timeout") - end - end,-1) - elseif(ev=="s2_ready") then -- Add in-station timer - timecnt[2]=1 - timerid[2]=AddTimer(1, - function() - timecnt[2]=timecnt[2]+1 - if(timecnt[2]==5) then - bus:push("s2_timeout") - end - end,-1) - elseif(ev=="s3_ready") then -- Judge or turn on timer - local needtimer=false - if(revflag[3]) then -- Need rev. Go line 4 or line 5 - if(isfree[4]) then -- Way 3 --> Way 4 - if(isSideLineFree()) then - isfree[4]=false - revflag[4]=false - - lockSideLine() - disabledevice("m3") - disabledevice("m4") - disabledevice("k4") - enabledevice("k3") - os.sleep(0.25) - disabledevice("k3") - os.sleep(3) - unlockSideLine() - else - needtimer=true - end - elseif(isfree[5]) then -- Way 3 --> Way 5 - if(isSideLineFree()) then - isfree[5]=false - revflag[5]=false - lockSideLine() - disabledevice("m3") - enabledevice("m4") - disabledevice("k5") - enabledevice("k3") - os.sleep(0.25) - disabledevice("k3") - os.sleep(3) - unlockSideLine() - else - needtimer=true - end - end - else -- way 3 does not need rev - if(isSideLineFree()) then - lockSideLine() - enabledevice("m3") - enabledevice("k3") - os.sleep(0.25) - disabledevice("k3") - os.sleep(3) - unlockSideLine() - else - needtimer=true - end - end - if(needtimer) then -- We need a timer... (can't move, sad >_<) - timecnt[3]=1 - timerid[3]=AddTimer(1, - function() - timecnt[3]=timecnt[3]+1 - end,-1) - bus:push("s3_pending") -- Tell scheduler Way 3 is pending - else -- Yeah! Moved directly! Now we mark way 3 as free - isfree[3]=true - end - elseif(ev=="s4_ready") then - local act=false - if(ba_time_out==0 and readdevice("ba_lout")>0) then -- Can let go - if(isfree[5] or revflag[5]==true) then -- Way5 is free or Way5 will reverse - act=true - end - end - - if(act) then - -- Add BA Timer - startBATimer() - enabledevice("k4") - os.sleep(0.25) - disabledevice("k4") - isfree[4]=true - else - timecnt[4]=0 - timerid[4]=AddTimer(1, - function() - timecnt[4]=timecnt[4]+1 - end,-1) - bus:push("s4_pending") -- Tell scheduler Way 4 is pending - end - elseif(ev=="s5_ready") then -- Train must stay at way5 whether it wants to stop or not. - timecnt[5]=1 - timerid[5]=AddTimer(1, - function() - timecnt[5]=timecnt[5]+1 - if(timecnt[5]==5) then - bus:push("s5_timeout") - end - end,-1) - elseif(ev=="s6_ready") then - timecnt[6]=1 - timerid[6]=AddTimer(1, - function() - timecnt[6]=timecnt[6]+1 - if(timecnt[6]==5) then - bus:push("s6_timeout") - end - end,-1) - elseif(ev=="s1_timeout") then - local done=false - if(isSideLineFree()) then -- Side line must be free(or we can't move at all) - if(revflag[1]) then -- Way1 need reverse - if(isfree[4]) then -- Way 1 --> Way 4 - done=true - lockSideLine() - isfree[4]=false - revflag[4]=false - disabledevice("m3") - disabledevice("m4") - disabledevice("k4") - - enabledevice("k1") - os.sleep(3) - disabledevice("k1") - - unlockSideLine() - elseif(isfree[5]) then --- Way1 --> Way5 - done=true - lockSideLine() - isfree[5]=false - revflag[5]=false - disabledevice("m3") - enabledevice("m4") - disabledevice("k5") - - enabledevice("k1") - os.sleep(3) - disabledevice("k1") - - unlockSideLine() - end - else -- Way 1 does not need reverse - if(readdevice("ab_lout")>0) then -- Can move to next station (B) - done=true - lockSideLine() - enabledevice("m3") - - enabledevice("k1") - os.sleep(3) - disabledevice("k1") - - unlockSideLine() - end - end - end - - if(done) then -- Clear way1 - RemoveTimer(timerid[1]) - timecnt[1]=0 - isfree[1]=true - else - bus:push(ev) - end - elseif(ev=="s2_timeout") then - local done=false - if(isSideLineFree()) then -- Side line must be free(or we can't move at all) - if(revflag[2]) then -- Way2 need reverse - if(isfree[4]) then -- Way 2 --> Way 4 - done=true - lockSideLine() - isfree[4]=false - revflag[4]=false - disabledevice("m3") - disabledevice("m4") - disabledevice("k4") - - enabledevice("k2") - os.sleep(3) - disabledevice("k2") - - unlockSideLine() - elseif(isfree[5]) then --- Way2 --> Way5 - done=true - lockSideLine() - isfree[5]=false - revflag[5]=false - disabledevice("m3") - enabledevice("m4") - disabledevice("k5") - - enabledevice("k2") - os.sleep(3) - disabledevice("k2") - - unlockSideLine() - end - else -- Way 2 does not need reverse - if(readdevice("ab_lout")>0) then -- Can move to next station (B) - done=true - lockSideLine() - enabledevice("m3") - - enabledevice("k2") - os.sleep(3) - disabledevice("k2") - - unlockSideLine() - end - end - end - - if(done) then -- Clear way2 - RemoveTimer(timerid[2]) - timecnt[2]=0 - isfree[2]=true - else - bus:push(ev) - end - elseif(ev=="s6_timeout") then - local done=false - if(isSideLineFree()) then -- Side line must be free(or we can't move at all) - if(revflag[6]) then -- Way6 need reverse - if(isfree[4]) then -- Way 6 --> Way 4 - done=true - lockSideLine() - isfree[4]=false - revflag[4]=false - disabledevice("m3") - disabledevice("m4") - disabledevice("k4") - - enabledevice("k6") - os.sleep(3) - disabledevice("k6") - - unlockSideLine() - elseif(isfree[5]) then --- Way6 --> Way5 - done=true - lockSideLine() - isfree[5]=false - revflag[5]=false - disabledevice("m3") - enabledevice("m4") - disabledevice("k5") - - enabledevice("k6") - os.sleep(3) - disabledevice("k6") - - unlockSideLine() - end - else -- Way 6 does not need reverse - if(readdevice("ab_lout")>0) then -- Can move to next station (B) - done=true - lockSideLine() - enabledevice("m3") - - enabledevice("k6") - os.sleep(3) - disabledevice("k6") - - unlockSideLine() - end - end - end - - if(done) then -- Clear way6 - RemoveTimer(timerid[6]) - timecnt[6]=0 - isfree[6]=true - else - bus:push(ev) - end - elseif(ev=="s5_timeout") then - local done=false - if(revflag[5]) then -- Need reverse - if(isfree[6]) then - isfree[6]=false - revflag[6]=false + elseif (ev == "s1_ready") then -- Add in-station timer + addNormalStationTimer(1) --> s1_timeout + elseif (ev == "s2_ready") then -- Add in-station timer + addNormalStationTimer(2) --> s2_timeout + elseif (ev == "s3_ready") then -- Judge or turn on timer + addSimpleStationTimer(3) + bus:push("s3_pending") --> s3_pending + elseif (ev == "s4_ready") then + addSimpleStationTimer(4) + bus:push("s4_pending") --> s4_pending + elseif (ev == "s5_ready") then -- Train must stay at way5 whether it wants to stop or not. + addNormalStationTimer(5) --> s5_timeout + elseif (ev == "s6_ready") then + addNormalStationTimer(5) --> s6_timeout + elseif (ev == "s1_timeout") then + proc1236(1, ev) + elseif (ev == "s2_timeout") then + proc1236(2, ev) + elseif (ev == "s3_pending") then + proc1236(3, ev) + elseif (ev == "s6_timeout") then + proc1236(6, ev) + elseif (ev == "s5_timeout") then + local done = false + if (revflag[5]) then -- Need reverse + if (isfree[6]) then + isfree[6] = false + revflag[6] = false enabledevice("m5") disabledevice("k6") - - enabledevice("k5") - os.sleep(0.25) - disabledevice("k5") - - done=true + done = true end -- If way6 is not free, we cannot reverse to it. (bang!) else -- Does not need reverse - if(ba_time_out==0 and readdevice("ba_lout")>0) then -- Can let go - if(isfree[4] or timecnt[4]==0 or timecnt[5]>=timecnt[4]) then -- If Way4 is free, or way4 is not ready, or way5 wait longer - startBATimer() - disabledevice("m5") - enabledevice("k5") - os.sleep(0.25) - disabledevice("k5") - - done=true - end -- We just cannot move. (We must wait!) - end -- Cannot move at all. - end - if(done) then - RemoveTimer(timerid[5]) - timecnt[5]=0 - isfree[5]=true -- Mark way5 as free - else - bus:push(ev) - end - elseif(ev=="s3_pending") then - local done=false - if(revflag[3]) then -- Need rev. Go line 4 or line 5 - if(isfree[4]) then -- Way 3 --> Way 4 - if(isSideLineFree()) then - isfree[4]=false - revflag[4]=false - - lockSideLine() - disabledevice("m3") - disabledevice("m4") - disabledevice("k4") - enabledevice("k3") - os.sleep(0.25) - disabledevice("k3") - os.sleep(3) - unlockSideLine() - done=true - end - elseif(isfree[5]) then -- Way 3 --> Way 5 - if(isSideLineFree()) then - isfree[5]=false - revflag[5]=false - lockSideLine() - disabledevice("m3") - enabledevice("m4") - disabledevice("k5") - enabledevice("k3") - os.sleep(0.25) - disabledevice("k3") - os.sleep(3) - unlockSideLine() - done=true - end - end - else -- way 3 does not need rev - if(isSideLineFree()) then - lockSideLine() - enabledevice("m3") - enabledevice("k3") - os.sleep(0.25) - disabledevice("k3") - os.sleep(3) - unlockSideLine() - done=true - end - end - if(done) then -- mark way 3 as free - isfree[3]=true - RemoveTimer(timerid[3]) - timecnt[3]=0 - else - bus:push(ev) - end - elseif(ev=="s4_pending") then - local okay=false - if(ba_time_out==0 and readdevice("ba_lout")>0) then -- Can let go - if(isfree[5] or revflag[5]==true or timecnt[4]>=timecnt[5]) then -- Way5 is free or Way5 will reverse - okay=true - end + if (ba_time_out == 0 and timecnt[5] >= timecnt[4] and readdevice("ba_lout") > 0) then -- Can let go + disabledevice("m5") + done = true + end -- Cannot move. end - if(okay) then - -- Add BA Timer + if (done) then startBATimer() - enabledevice("k4") - os.sleep(0.25) - disabledevice("k4") - RemoveTimer(timerid[4]) - timecnt[4]=0 - isfree[4]=true + stopTimer(5) + trigger("k5") + isfree[5] = true -- Mark way5 as free else bus:push(ev) end - elseif(ev=="ba_time_out_needstop") then + elseif (ev == "s4_pending") then + local okay = false + if (ba_time_out == 0 and readdevice("ba_lout") > 0) then -- Can let go + if (isfree[5] or revflag[5] or (timecnt[4] >= timecnt[5])) then -- Way5 is free or Way5 will reverse + okay = true + end + end + + if (okay) then + startBATimer() + stopTimer(4) + trigger("k4") + isfree[4] = true -- Mark way 4 as free + else + bus:push(ev) + end + elseif (ev == "ab_time_out_needstop") then + RemoveTimer(ab_timerid_out) + ab_time_out = 0 + elseif (ev == "ba_time_out_needstop") then RemoveTimer(ba_timerid_out) - ba_time_out=0 + ba_time_out = 0 else -- Unknown event -- Debug: Output the event name - print("Ignoring:",ev) + print("Ignoring:", ev) end -- End of event patch end -- End of loop doCleanUp()