150 lines
3.7 KiB
Lua
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 |