diff --git a/core/Turtles.lua b/core/Turtles.lua index 1b77dee..90fe16b 100644 --- a/core/Turtles.lua +++ b/core/Turtles.lua @@ -37,10 +37,10 @@ local socket local page = UI.Page { coords = UI.Window { backgroundColor = colors.black, - height = 4, + height = 3, }, tabs = UI.Tabs { - x = 1, y = 5, ey = -2, + x = 1, y = 4, ey = -2, scripts = UI.ScrollingGrid { tabTitle = 'Run', backgroundColor = colors.cyan, @@ -122,12 +122,19 @@ local page = UI.Page { fn = 'turtle.turnRight', }, info = UI.TextArea { - x = 2, y = 9, + x = 15, y = 2, inactive = true, } }, }, - statusBar = UI.StatusBar(), + statusBar = UI.StatusBar { + values = { }, + columns = { + { key = 'status' }, + { key = 'distance', width = 6 }, + { key = 'fuel', width = 6 }, + }, + }, notification = UI.Notification(), accelerators = { q = 'quit', @@ -184,8 +191,8 @@ function page.coords:draw() if not t.point.gps then ind = 'REL' end - self:print(string.format('%s : %d,%d,%d\n Fuel: %s\n', - ind, t.point.x, t.point.y, t.point.z, Util.toBytes(t.fuel))) + self:print(string.format('%s : %d,%d,%d', + ind, t.point.x, t.point.y, t.point.z)) end end @@ -289,14 +296,14 @@ end function page.statusBar:draw() local t = self.parent.turtle if t then - local status = string.format('%s [ %s ]', t.status, Util.round(t.distance, 2)) - self:setStatus(status, true) + self.values.status = t.status + self.values.distance = Util.round(t.distance, 2) + self.values.fuel = Util.toBytes(t.fuel) end UI.StatusBar.draw(self) end function page:showBlocks() - local script = [[ local function inspect(direction) local s,b = turtle['inspect' .. (direction or '')]() diff --git a/core/etc/apps.db b/core/etc/apps.db index aabd715..a691ab2 100644 --- a/core/etc/apps.db +++ b/core/etc/apps.db @@ -99,4 +99,12 @@ Needs work \030 \031f\030f\031e\139\030e\128\030f\159\129\0314\130\131\131\129", run = "recorder.lua", }, + [ "4486006f811b88cacd5f211fd579717e29b600cd" ] = { + title = "Swarm", + category = "Turtle", + icon = " \0315\\\030 \031 \ + \0304\031f _ \030 \031c/\0315\\\ + \0304 ", + run = "multiMiner.lua", + }, } diff --git a/core/etc/scripts/goHome b/core/etc/scripts/goHome index cd9af95..2749820 100644 --- a/core/etc/scripts/goHome +++ b/core/etc/scripts/goHome @@ -1,3 +1,7 @@ _G.requireInjector(_ENV) -local Home = require('turtle.home') -turtle.run(Home.go) +local config = require('config').load('gps') +if config.home then + if turtle.enableGPS() then + return turtle.pathfind(config.home) + end +end diff --git a/core/etc/scripts/setHome b/core/etc/scripts/setHome index 6aa1f20..9f88beb 100644 --- a/core/etc/scripts/setHome +++ b/core/etc/scripts/setHome @@ -1,3 +1,8 @@ _G.requireInjector(_ENV) -local Home = require('turtle.home') -turtle.run(Home.set) +local Config = require('config') +local pt = turtle.enableGPS() +if pt then + local config = Config.load('gps', { }) + config.home = pt + Config.update('gps', config) +end diff --git a/miners/multiMiner.lua b/core/multiMiner.lua similarity index 100% rename from miners/multiMiner.lua rename to core/multiMiner.lua diff --git a/miners/etc/apps.db b/miners/etc/apps.db index 3acf3c3..9bf870e 100644 --- a/miners/etc/apps.db +++ b/miners/etc/apps.db @@ -17,12 +17,4 @@ run = "scanningMiner.lua", requires = 'turtle', }, - [ "4486006f811b88cacd5f211fd579717e29b600cd" ] = { - title = "Multi", - category = "Turtle", - icon = " \0315\\\030 \031 \ - \0304\031f _ \030 \031c/\0315\\\ - \0304 ", - run = "multiMiner.lua", - }, } diff --git a/miners/findSwarm.lua b/miners/findSwarm.lua index 1b2141f..9881aa8 100644 --- a/miners/findSwarm.lua +++ b/miners/findSwarm.lua @@ -72,6 +72,9 @@ local function getNextPoint(member) chunkIndex = chunkIndex + 1 while paused do + if abort then + return + end os.sleep(3) end diff --git a/turtle/apis/home.lua b/turtle/apis/home.lua deleted file mode 100644 index 4e552c8..0000000 --- a/turtle/apis/home.lua +++ /dev/null @@ -1,42 +0,0 @@ -local Config = require('config') -local GPS = require('gps') - -local turtle = _G.turtle - -local Home = { } - -function Home.go() - local config = { } - Config.load('gps', config) - - if config.home then - if turtle.enableGPS() then - return turtle.pathfind(config.home) - end - end -end - -function Home.set() - local config = { } - Config.load('gps', config) - - local pt = GPS.getPoint() - if pt then - local originalHeading = turtle.point.heading - local heading = GPS.getHeading() - if heading then - local turns = (turtle.point.heading - originalHeading) % 4 - pt.heading = (heading - turns) % 4 - config.home = pt - Config.update('gps', config) - - pt = GPS.getPoint() - pt.heading = heading - turtle.setPoint(pt, true) - turtle.go(config.home) - return config.home - end - end -end - -return Home diff --git a/turtle/autorun/gps.lua b/turtle/autorun/gps.lua deleted file mode 100644 index 856ebad..0000000 --- a/turtle/autorun/gps.lua +++ /dev/null @@ -1,43 +0,0 @@ -local modem = _G.device.wireless_modem -local turtle = _G.turtle - -if turtle and modem then - local s, m = turtle.run(function() - - _G.requireInjector(_ENV) - - local Config = require('config') - local config = { - destructive = false, - } - Config.load('gps', config) - - if config.home then - - local s = turtle.enableGPS(2) - if not s then - s = turtle.enableGPS(2) - end - if not s and config.destructive then - turtle.set({ attackPolicy = 'attack', digPolicy = 'turtleSafe' }) - s = turtle.enableGPS(2) - end - - if not s then - error('Unable to get GPS position') - end - - if config.destructive then - turtle.set({ attackPolicy = 'attack', digPolicy = 'turtleSafe' }) - end - - if not turtle.pathfind(config.home) then - error('Failed to return home') - end - end - end) - - if not s and m then - error(m) - end -end diff --git a/turtle/autorun/startup.lua b/turtle/autorun/startup.lua index 1a6f63d..f29155b 100644 --- a/turtle/autorun/startup.lua +++ b/turtle/autorun/startup.lua @@ -1,31 +1,138 @@ -local Util = require('util') +if not _G.turtle then + return +end -local device = _G.device -local fs = _G.fs -local turtle = _G.turtle +local Config = require('config') +local GPS = require('gps') +local Point = require('point') +local Util = require('util') -if turtle then - fs.mount('sys/apps/system/turtle.lua', 'linkfs', 'packages/turtle/system/turtle.lua') +local device = _G.device +local fs = _G.fs +local peripheral = _G.peripheral +local turtle = _G.turtle - function turtle.scan(blocks) - local pt = turtle.point - local scanner = device['plethora:scanner'] or error('Scanner not equipped') +-- add a System setup tab +fs.mount('sys/apps/system/turtle.lua', 'linkfs', 'packages/turtle/system/turtle.lua') - if not blocks then - return Util.each(scanner:scan(), function(b) - b.x = pt.x + b.x - b.y = pt.y + b.y - b.z = pt.z + b.z - end) - end +-- provide a turtle function for scanning +function turtle.scan(blocks) + local pt = turtle.point + local scanner = device['plethora:scanner'] or error('Scanner not equipped') - return Util.filter(scanner:scan(), function(b) - if blocks[b.name] then - b.x = pt.x + b.x - b.y = pt.y + b.y - b.z = pt.z + b.z - return true - end + if not blocks then + return Util.each(scanner:scan(), function(b) + b.x = pt.x + b.x + b.y = pt.y + b.y + b.z = pt.z + b.z end) end + + return Util.filter(scanner:scan(), function(b) + if blocks[b.name] then + b.x = pt.x + b.x + b.y = pt.y + b.y + b.z = pt.z + b.z + return true + end + end) +end + +local function getHeading(apt) + if not turtle then + return + end + + local heading = turtle.point.heading + local bpt + + repeat + if not turtle.inspect() and turtle.forward() then + bpt = GPS.locate() + break + end + turtle.turnRight() + until turtle.getHeading() == heading + + if not bpt then + repeat + if not peripheral.getType('front') then + turtle.dig() + if turtle.forward() then + bpt = GPS.locate() + break + end + end + turtle.turnRight() + until turtle.point.heading == heading + end + + if not bpt then + return false + end + + local turns = (turtle.point.heading - heading) % 4 + + turtle.back() + turtle.setHeading(heading) + + if apt.x < bpt.x then + return (0 - turns) % 4 + elseif apt.z < bpt.z then + return (1 - turns) % 4 + elseif apt.x > bpt.x then + return (2 - turns) % 4 + end + return (3 - turns) % 4 +end + +local function getScannedHeading() + local facing = device['plethora:scanner'].getBlockMeta(0, 0, 0).state.facing + return Point.facings[facing].heading +end + +-- [[ GPS ]] -- +function turtle.enableGPS(timeout) + local pt = GPS.getPoint(timeout or 2) or error('GPS not found') + + if device['plethora:scanner'] then + pt.heading = getScannedHeading() + + elseif turtle.select('plethora:module:2') then + -- never swap out modem + local equip = turtle.isEquipped('modem') == 'right' and turtle.equipLeft or turtle.equipRight + + if equip() then + pt.heading = getScannedHeading() + equip() + end + end + + if not pt.heading then + pt.heading = getHeading(pt) + end + + if pt.heading then + turtle.setPoint(pt, true) + return turtle.point + end +end + +-- return to home location if configured to do so +if _G.device.wireless_modem then + local config = Config.load('gps') + + if config.home then + if not turtle.enableGPS(2) then + error('Unable to get GPS position') + end + + if config.destructive then + turtle.set({ attackPolicy = 'attack', digPolicy = 'turtleSafe' }) + end + + if not turtle.pathfind(config.home) then + error('Failed to return home') + end + end end diff --git a/turtle/system/turtle.lua b/turtle/system/turtle.lua index 3be1e96..ba07793 100644 --- a/turtle/system/turtle.lua +++ b/turtle/system/turtle.lua @@ -5,13 +5,11 @@ local fs = _G.fs local turtle = _G.turtle if turtle then - local Home = require('turtle.home') - - local values = { } - Config.load('gps', values.home and { values.home } or { }) + local config = Config.load('gps') local gpsTab = UI.Tab { - tabTitle = 'GPS', + tabTitle = 'Home', + description = 'Turtle home location', labelText = UI.Text { x = 3, y = 2, value = 'On restart, return to this location' @@ -19,7 +17,7 @@ if turtle then grid = UI.Grid { x = 3, ex = -3, y = 4, height = 2, - values = values, + values = { config.home or { } }, inactive = true, columns = { { heading = 'x', key = 'x' }, @@ -37,24 +35,41 @@ if turtle then text = 'Clear', event = 'gps_clear', }, + breakingText = UI.Text { + x = 3, y = 9, + value = 'Can break blocks', + }, + breaking = UI.Checkbox { + x = 20, y = 9, + value = config.destructive, + }, } + function gpsTab:eventHandler(event) if event.type == 'gps_set' then self:emit({ type = 'info_message', message = 'Determining location' }) self:sync() - if Home.set() then - Config.load('gps', values) - self.grid:setValues(values.home and { values.home } or { }) + local pt = turtle.enableGPS() + if pt then + config.home = pt + Config.update('gps', config) + self.grid:setValues({ config.home }) self.grid:draw() self:emit({ type = 'success_message', message = 'Location set' }) else self:emit({ type = 'error_message', message = 'Unable to determine location' }) end return true + + elseif event.type == 'checkbox_change' then + config.destructive = event.checked + Config.update('gps', config) + elseif event.type == 'gps_clear' then fs.delete('usr/config/gps') self.grid:setValues({ }) - self.grid:draw() + self.breaking:reset() + self:draw() return true end end