2023-01-07 22:14:44 +00:00

150 lines
3.7 KiB
Lua

Controller = {}
require("Monitor")
function Controller:new(t)
t = t or {}
setmetatable(t, self)
self.__index = self
return t
end
function Controller:init()
self.monitor = Monitor:new()
self.monitor:init()
self.monitor:setStatus(1, "not started")
self.monitor:setButton("start")
self.redstone = {}
self.turtleStatus = "unknown"
end
function Controller:sendMessage(id, message, protocol)
rednet.send(id, message, protocol)
local id2, message2 = rednet.receive("received", 1)
return message == message2
end
function Controller:doAction(id, message, protocol)
self:sendMessage(id, message, protocol)
local id2, message2, protocol2
repeat
id2, message2, protocol2 = rednet.receive()
until id2 == id
return protocol2 == "confirm", message2
end
function Controller:setSlaveID(id)
self.slaveID = id
end
function Controller:initSlave()
if self:sendMessage(self.slaveID, "init", "command") then
local id, message, protocol = rednet.receive(nil, 60)
if (protocol == "confirm") then
return true
end
return false
end
end
function Controller:updateTreeStatus()
if self:sendMessage(self.slaveID, "checkTree", "command") then
local id, message, protocol = rednet.receive(nil, 60)
if (protocol == "confirm") then
self.treeStatus = message
return message
end
end
end
function Controller:waitForRedstone(direction)
self.redstone[direction] = false
while(redstone.getInput(direction) == true) do
sleep(0.05)
end
while(redstone.getInput(direction) == false) do
sleep(0.05)
end
self.redstone[direction] = true
return true
end
function Controller:autoWood()
self.stop = false
while(self.stop == false) do
self.turtleStatus = "checking tree"
self:updateFuelLevel()
self:updateDisplay(4)
local update = self:updateTreeStatus()
if(update == nil) then
self.turtleStatus = "error"
return false
elseif(update == "sapling") then
self.turtleStatus = "waiting"
self:updateFuelLevel()
self:updateDisplay(4)
local t = os.clock()
self:doAction(self.slaveID, "sort")
sleep(60)
elseif(update == "tree")then
self.turtleStatus = "cutting tree"
self:updateFuelLevel()
self:updateDisplay(4)
self:doAction(self.slaveID, "cutTree")
self.turtleStatus = "planting tree"
self:updateFuelLevel()
self:updateDisplay(4)
self:doAction(self.slaveID, "plantTree")
end
end
end
function Controller:updateFuelLevel()
local s, fuelLevel = self:doAction(self.slaveID, "getFuelLevel")
if(s == true) then
self.turtleFuelLevel = fuelLevel
end
return s
end
function Controller:updateDisplay(line)
if(self.monitor.sb.lines[line] ~= self.turtleStatus) then
self.monitor:setStatus(line, self.turtleStatus)
end
self:displayFuelLevel(line + 1)
end
function Controller:displayFuelLevel(line)
if(self.monitor.sb.lines[line] ~= self.turtleFuelLevel) then
self.monitor:setStatus(line, "fuel Level:" .. self.turtleFuelLevel)
end
end
function Main()
local ct = Controller:new()
ct:init()
ct:setSlaveID(10)
ct:waitForRedstone("top")
ct.monitor:setStatus(1, "Turtle:")
ct.monitor:setStatus(2, "Id: 10")
ct.monitor:setStatus(3, "not connected")
ct.monitor:setButton("init turtle")
ct:waitForRedstone("top")
ct:initSlave()
ct.monitor:setStatus(3, "connected")
ct.monitor:setButton("start turtle")
ct:waitForRedstone("top")
ct:autoWood()
end