Added final elevator code.
This commit is contained in:
		
							parent
							
								
									80bb1986b2
								
							
						
					
					
						commit
						49ff45df7b
					
				| 
						 | 
				
			
			@ -5,41 +5,12 @@ A script for an all-in-one elevator with floor selection, sounds, doors, and
 | 
			
		|||
more.
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
local SYSTEM_NAME = "Test Elevator"
 | 
			
		||||
 | 
			
		||||
-- Floors, in order from bottom to top.
 | 
			
		||||
local FLOORS = {
 | 
			
		||||
    {
 | 
			
		||||
        label = "-1",
 | 
			
		||||
        name = "Basement",
 | 
			
		||||
        speaker = "speaker_2",
 | 
			
		||||
        doorRedstone = "redstoneIntegrator_17",
 | 
			
		||||
        contactRedstone = "redstoneIntegrator_18",
 | 
			
		||||
        monitor = "monitor_4",
 | 
			
		||||
        callMonitor = "monitor_5",
 | 
			
		||||
        height = 25
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "0",
 | 
			
		||||
        name = "Ground Floor",
 | 
			
		||||
        speaker = "speaker_1",
 | 
			
		||||
        doorRedstone = "redstoneIntegrator_7",
 | 
			
		||||
        contactRedstone = "redstoneIntegrator_6",
 | 
			
		||||
        monitor = "monitor_1",
 | 
			
		||||
        callMonitor = "monitor_3",
 | 
			
		||||
        height = 58
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "1",
 | 
			
		||||
        name = "Mechanical Room",
 | 
			
		||||
        speaker = "speaker_0",
 | 
			
		||||
        doorRedstone = "redstoneIntegrator_4",
 | 
			
		||||
        contactRedstone = "redstoneIntegrator_5",
 | 
			
		||||
        monitor = "monitor_0",
 | 
			
		||||
        callMonitor = "monitor_2",
 | 
			
		||||
        height = 68
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
-- Load floors from elevator settings.
 | 
			
		||||
local FLOORS = {}
 | 
			
		||||
local floorsFile = io.open("floors.tbl", "r") or error("Missing floors.tbl")
 | 
			
		||||
FLOORS = textutils.unserialize(floorsFile:read("a"))
 | 
			
		||||
floorsFile:close()
 | 
			
		||||
table.sort(FLOORS, function(fA, fB) return fA.height < fB.height end)
 | 
			
		||||
 | 
			
		||||
local FLOORS_BY_LABEL = {}
 | 
			
		||||
for _, floor in pairs(FLOORS) do
 | 
			
		||||
| 
						 | 
				
			
			@ -52,13 +23,18 @@ for _, floor in pairs(FLOORS) do
 | 
			
		|||
end
 | 
			
		||||
table.sort(FLOOR_LABELS_ORDERED, function(lblA, lblB) return FLOORS_BY_LABEL[lblA].height < FLOORS_BY_LABEL[lblB].height end)
 | 
			
		||||
 | 
			
		||||
local CONTROL_BASE_RPM = 16
 | 
			
		||||
local CONTROL_MAX_RPM = 256
 | 
			
		||||
local CONTROL_ANALOG_LEVEL_PER_RPM = 2
 | 
			
		||||
local settingsFile = io.open("settings.tbl", "r") or error("Missing settings.tbl")
 | 
			
		||||
local settings = textutils.unserialize(settingsFile:read("a"))
 | 
			
		||||
 | 
			
		||||
local CONTROL_DIRECTION_UP = true
 | 
			
		||||
local CONTROL_DIRECTION_DOWN = false
 | 
			
		||||
local CONTROL_REDSTONE = "redstoneIntegrator_13"
 | 
			
		||||
local SYSTEM_NAME = settings.systemName
 | 
			
		||||
 | 
			
		||||
local CONTROL_BASE_RPM = settings.control.baseRpm
 | 
			
		||||
local CONTROL_MAX_RPM = settings.control.maxRpm
 | 
			
		||||
local CONTROL_ANALOG_LEVEL_PER_RPM = settings.control.analogLevelPerRpm
 | 
			
		||||
 | 
			
		||||
local CONTROL_DIRECTION_UP = settings.control.directionUp
 | 
			
		||||
local CONTROL_DIRECTION_DOWN = settings.control.directionDown
 | 
			
		||||
local CONTROL_REDSTONE = settings.control.redstone
 | 
			
		||||
 | 
			
		||||
local CURRENT_STATE = {
 | 
			
		||||
    rpm = nil,
 | 
			
		||||
| 
						 | 
				
			
			@ -66,11 +42,11 @@ local CURRENT_STATE = {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
local function openDoor(floor)
 | 
			
		||||
    peripheral.call(floor.doorRedstone, "setOutput", "back", true)
 | 
			
		||||
    peripheral.call(floor.redstone, "setOutput", "left", true)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function closeDoor(floor)
 | 
			
		||||
    peripheral.call(floor.doorRedstone, "setOutput", "back", false)
 | 
			
		||||
    peripheral.call(floor.redstone, "setOutput", "left", false)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function playChime(floor)
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +109,7 @@ local function setSpeed(rpm)
 | 
			
		|||
end
 | 
			
		||||
 | 
			
		||||
local function isFloorContactActive(floor)
 | 
			
		||||
    return peripheral.call(floor.contactRedstone, "getInput", "back")
 | 
			
		||||
    return peripheral.call(floor.redstone, "getInput", "back")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Determines the label of the floor we're currently on.
 | 
			
		||||
| 
						 | 
				
			
			@ -141,7 +117,7 @@ end
 | 
			
		|||
-- If that fails, the elevator is at an unknown position, so we move it as soon as possible to top.
 | 
			
		||||
local function determineCurrentFloorLabel()
 | 
			
		||||
    for _, floor in pairs(FLOORS) do
 | 
			
		||||
        local status = peripheral.call(floor.contactRedstone, "getInput", "back")
 | 
			
		||||
        local status = isFloorContactActive(floor)
 | 
			
		||||
        if status then return floor.label end
 | 
			
		||||
    end
 | 
			
		||||
    -- No floor found. Move the elevator to the top.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
{
 | 
			
		||||
    {
 | 
			
		||||
        label = "1",
 | 
			
		||||
        name = "First Floor",
 | 
			
		||||
        speaker = "speaker_0",
 | 
			
		||||
        redstone = "redstoneIntegrator_4",
 | 
			
		||||
        monitor = "monitor_1",
 | 
			
		||||
        callMonitor = "monitor_0",
 | 
			
		||||
        height = 126
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "2",
 | 
			
		||||
        name = "Second Floor",
 | 
			
		||||
        speaker = "speaker_1",
 | 
			
		||||
        redstone = "redstoneIntegrator_6",
 | 
			
		||||
        monitor = "monitor_3",
 | 
			
		||||
        callMonitor = "monitor_2",
 | 
			
		||||
        height = 140
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "3",
 | 
			
		||||
        name = "Third Floor",
 | 
			
		||||
        speaker = "speaker_2",
 | 
			
		||||
        redstone = "redstoneIntegrator_7",
 | 
			
		||||
        monitor = "monitor_5",
 | 
			
		||||
        callMonitor = "monitor_4",
 | 
			
		||||
        height = 147
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "4",
 | 
			
		||||
        name = "Fourth Floor",
 | 
			
		||||
        speaker = "speaker_3",
 | 
			
		||||
        redstone = "redstoneIntegrator_8",
 | 
			
		||||
        monitor = "monitor_6",
 | 
			
		||||
        callMonitor = "monitor_7",
 | 
			
		||||
        height = 154
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "5",
 | 
			
		||||
        name = "Fifth Floor",
 | 
			
		||||
        speaker = "speaker_4",
 | 
			
		||||
        redstone = "redstoneIntegrator_9",
 | 
			
		||||
        monitor = "monitor_8",
 | 
			
		||||
        callMonitor = "monitor_9",
 | 
			
		||||
        height = 161
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "6",
 | 
			
		||||
        name = "Sixth Floor",
 | 
			
		||||
        speaker = "speaker_5",
 | 
			
		||||
        redstone = "redstoneIntegrator_10",
 | 
			
		||||
        monitor = "monitor_10",
 | 
			
		||||
        callMonitor = "monitor_11",
 | 
			
		||||
        height = 168
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        label = "7",
 | 
			
		||||
        name = "Seventh Floor",
 | 
			
		||||
        speaker = "speaker_6",
 | 
			
		||||
        redstone = "redstoneIntegrator_11",
 | 
			
		||||
        monitor = "monitor_12",
 | 
			
		||||
        callMonitor = "monitor_13",
 | 
			
		||||
        height = 175
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
{
 | 
			
		||||
    systemName = "HandieVale Tower",
 | 
			
		||||
    control = {
 | 
			
		||||
        baseRpm = 16,
 | 
			
		||||
        maxRpm = 256,
 | 
			
		||||
        analogLevelPerRpm = 2,
 | 
			
		||||
        directionUp = true,
 | 
			
		||||
        directionDown = false,
 | 
			
		||||
        redstone = "redstoneIntegrator_5"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue