--[[ Station 2/3 Schedule Program ]] require("util") local sides = require("sides") local event = require("event") --[[ Redstone Signals Direction_[Type][Info]: number ]] local ab_st, ab_sr, ab_lin, ab_lout local ba_st, ba_sr, ba_lin, ba_lout local ab_ko, ab_m, ab_ks = 0, 0, 0 local ba_ko, ba_m, ba_ks = 0, 0, 0 local mid_ka, mid_kb = 0, 0 -- Config your update functions here (Do not change function name) local redin1 = proxy("redstone", "") local redin2 = proxy("redstone", "") local redout1 = proxy("redstone", "") local redout2 = proxy("redstone", "") local function updateRedstoneInput() ab_st = redin1.getInput(sides.north) ab_sr = redin1.getInput(sides.east) ba_st = redin1.getInput(sides.south) ba_sr = redin1.getInput(sides.west) ab_lin = redin2.getInput(sides.north) ab_lout = redin2.getInput(sides.east) ba_lin = redin2.getInput(sides.south) ba_lout = redin2.getInput(sides.west) end local function updateRedstoneOutput() redout1.setOutput(sides.north, ab_ko) redout1.setOutput(sides.east, ab_m) redout1.setOutput(sides.south, ab_ks) redout1.setOutput(sides.west, mid_ka) redout2.setOutput(sides.north, ba_ko) redout2.setOutput(sides.east, ba_m) redout2.setOutput(sides.south, ba_ks) redout2.setOutput(sides.west, mid_kb) end -- Internal Schedule Status (Notice: Program must start without any trains in station) local mid_direction local ab_station_time = 0 local ba_station_time = 0 local mid_time = 0 local ab_exit_time = 0 local ba_exit_time = 0 -- Debug Output local dprint = print local function debugClearOutput() if(dprint ~= nil) then os.execute("clear") end end local function debugOutputInfo() dprint("ab_st",ab_st,"ab_sr",ab_sr,"ba_st",ba_st,"ba_sr",ba_sr,"ab_lin",ab_lin,"ab_lout",ab_lout,"ba_lin",ba_lin,"ba_lout",ba_lout) dprint("mid_direction",mid_direction,"ab_station_time",ab_station_time,"ba_station_time",ba_station_time,"mid_time",mid_time,"ab_exit_time",ab_exit_time,"ba_exit_time",ba_exit_time) end local function debugValueInfo() dprint("ab_ko",ab_ko,"ab_m",ab_m,"ab_ks",ab_ks,"mid_ka",mid_ka,"ba_ko",ba_ko,"ba_m",ba_m,"ba_ks",ba_ks,"mid_kb",mid_kb) end --[[ Internal Functions ]] local function doInit() -- Flash output to zero. updateRedstoneOutput() end local function doCheck() if(redin1==nil or redin2==nil or redout1==nil or redout2==nil) then print("Redstone Configure") end end -- Main Program local function main() doCheck() doInit() while true do debugClearOutput() -- Flush input updateRedstoneInput() debugOutputInfo() -- Update status if (ab_station_time > 0) then ab_station_time = ab_station_time + 1 end if (ba_station_time > 0) then ba_station_time = ba_station_time + 1 end if (mid_time > 0) then mid_time = mid_time + 1 end if (ab_exit_time > 0) then ab_exit_time = ab_exit_time + 1 if (ab_exit_time > 10) then -- Exit will reset in 10 loops (5seconds) ab_exit_time = 0 end end if (ba_exit_time > 0) then ba_exit_time = ba_exit_time + 1 if (ba_exit_time > 10) then -- Exit will reset in 10 loops (5seconds) ba_exit_time = 0 end end -- Judge Incoming bus. if (ab_st > 0) then -- New incoming bus from A to B if (ab_sr > 0) then -- This bus want to stop if (ab_station_time == 0) then -- If AB Station is free dprint("A-->B Train In") ab_ko = 15 -- enable to allow incoming ab_ks = 0 -- disable to let it stop ab_m = 0 -- disable to allow incoming to station ab_station_time = 1 -- Start Time Counter else -- AB Station is not free -- This train should wait outside the station dprint("A-->B Train Pending") end else -- This bus want to pass by if (mid_time == 0) then -- Mid is free dprint("A-->Mid Train In") ab_ko = 15 -- enable to allow incoming ab_m = 15 -- enable motor to let it pass. mid_ka = 15 -- enable switch from A mid_kb = 0 -- disable switch to B mid_direction = "ab" mid_time = 1 -- Start time counter else -- Mid is busy dprint("A-->Mid Train Pending") -- This train should wait outside the station end end end if (ba_st > 0) then -- New incoming bus from B to A if (ba_sr > 0) then -- This bus want to stop if (ba_station_time == 0) then -- If BA Station is free dprint("B-->A Train In") ba_ko = 15 -- enable to allow incoming ba_ks = 0 -- disable to let it stop ba_m = 0 -- disable to allow incoming to station ba_station_time = 1 -- Start Time Counter else -- BA Station is not free -- This train should wait outside the station dprint("B-->A Train Pending") end else -- This bus want to pass by if (mid_time == 0) then -- Mid is free dprint("B-->Mid Train In") ba_ko = 15 -- enable to allow incoming ba_m = 15 -- enable motor to let it pass. mid_ka = 0 mid_kb = 15 mid_direction = "ba" mid_time = 1 else -- Mid is busy dprint("B-->Mid Train Pending") -- This train should wait outside the station end end end if (ab_lout > 0 and ab_exit_time == 0) then -- AB next free -- Judge which train should pass. if (ab_station_time > 16 and (mid_time > 0 and mid_direction == "ab")) then -- Two Trains if (ab_station_time > mid_time) then -- StationTrain wait longer. dprint("A-->B Train Out") ab_station_time = 0 -- Stop counter ab_ks = 15 -- enable swith to let it go ab_exit_time = 1 else -- MidTrain wait longer dprint("Mid-->B Train out") mid_time = 0 -- Stop Counter mid_kb = 15 ab_exit_time = 1 end elseif (ab_station_time > 16) then --Only Station Train dprint("A-->B Train Out") ab_station_time = 0 ab_ks = 15 ab_exit_time = 1 elseif (mid_time > 0 and mid_direction == "ab") then -- Only Mid Train dprint("Mid-->B Train Out") mid_time = 0 mid_kb = 15 ab_exit_time = 1 end -- No train end -- End of AB judge if (ba_lout > 0 and ba_exit_time == 0) then -- BA next free -- Judge which train should pass. if (ba_station_time > 16 and (mid_time > 0 and mid_direction == "ba")) then -- Two Trains if (ba_station_time > mid_time) then -- StationTrain wait longer. dprint("B-->A Train Out") ba_station_time = 0 -- Stop counter ba_ks = 15 -- enable swith to let it go ba_exit_time = 1 else -- MidTrain wait longer dprint("Mid-->A Train Out") mid_time = 0 -- Stop Counter mid_ka = 15 ba_exit_time = 1 end elseif (ba_station_time > 16) then --Only Station Train dprint("B-->A Train Out") ba_station_time = 0 ba_ks = 15 ba_exit_time = 1 elseif (mid_time > 0 and mid_direction == "ba") then -- Only Mid Train dprint("Mid-->A Train Out") mid_time = 0 mid_ka = 15 ba_exit_time = 1 end -- No train end debugValueInfo() -- Set output updateRedstoneOutput() -- Sleep for next loop dprint("==========") os.sleep(0.5) end end print("Start!") main() print("Stop!")