1
0
mirror of https://github.com/kepler155c/opus synced 2024-12-24 23:50:26 +00:00

transition to kernel

This commit is contained in:
kepler155c@gmail.com 2018-01-13 15:17:26 -05:00
parent fc8d44b60d
commit bd37b57780
20 changed files with 336 additions and 223 deletions

View File

@ -127,6 +127,8 @@ local function getProxy(pi)
error("Timed out attaching peripheral: " .. pi.uri)
end
-- write the uri of the periperal we are requesting...
-- ie. type/monitor
socket:write(pi.path)
local proxy = socket:read(3)
@ -134,6 +136,10 @@ local function getProxy(pi)
error("Timed out attaching peripheral: " .. pi.uri)
end
if type(proxy) == 'string' then
error(proxy)
end
local methods = proxy.methods
proxy.methods = nil
@ -166,6 +172,9 @@ local function getProxy(pi)
socket:read()
end)
end
if not socket.connected then
error("Timed out communicating with peripheral: " .. pi.uri)
end
table.insert(queue, {
fn = method,
@ -222,7 +231,7 @@ end
function Peripheral.lookup(uri)
local pi = parse(uri)
if pi.host then
if pi.host and _G.device.wireless_modem then
return getProxy(pi)
end

View File

@ -9,7 +9,6 @@ local os = _G.os
local socketClass = { }
function socketClass:read(timeout)
local data, distance = _G.transport.read(self)
if data then
return data, distance
@ -31,6 +30,9 @@ function socketClass:read(timeout)
os.cancelTimer(timerId)
return data, distance
end
if not self.connected then
break
end
elseif e == 'timer' and id == timerId then
if timeout or not self.connected then
@ -104,6 +106,9 @@ local function newSocket(isLoopback)
end
function Socket.connect(host, port)
if not device.wireless_modem then
return false, 'Wireless modem not found'
end
local socket = newSocket(host == os.getComputerID())
socket.dhost = tonumber(host)
@ -149,7 +154,6 @@ function Socket.connect(host, port)
end
local function trusted(msg, port)
if port == 19 or msg.shost == os.getComputerID() then
-- no auth for trust server or loopback
return true
@ -172,7 +176,6 @@ local function trusted(msg, port)
end
function Socket.server(port)
device.wireless_modem.open(port)
Logger.log('socket', 'Waiting for connections on port ' .. port)

View File

@ -6,7 +6,40 @@ local _gsub = string.gsub
local Terminal = { }
function Terminal.scrollable(ct, size)
function Terminal.scrollable(win, size)
local w, h = win.getSize()
local scrollPos = 0
local scp = win.setCursorPos
win.setCursorPos = function(x, y)
scp(x, y)
if y > scrollPos + h then
win.scrollTo(y - h)
elseif y < scrollPos then
win.scrollTo(y - 2)
end
end
win.scrollUp = function()
win.scrollTo(scrollPos - 1)
end
win.scrollDown = function()
win.scrollTo(scrollPos + 1)
end
win.scrollTo = function(p)
p = math.min(math.max(p, 0), size)
if p ~= scrollPos then
scrollPos = p
win.reposition(1, -scrollPos + 1, w, h + size)
end
end
win.reposition(1, 1, w, h + size, true)
end
function Terminal.scrollable2(ct, size)
local w, h = ct.getSize()
local win = _G.window.create(ct, 1, 1, w, h + size, true)
@ -63,7 +96,6 @@ function Terminal.scrollable(ct, size)
return win
end
function Terminal.toGrayscale(ct)
local scolors = {

View File

@ -563,22 +563,23 @@ function Util.wordWrap(str, limit)
end
function Util.args(arg)
local tab = { remainder = { } }
local options, args = { }, { }
local k = 1
while k <= #arg do
local v = arg[k]
if string.sub(v, 1, 1) == '-' then
local jopt = string.sub(v, 2)
tab[ jopt ] = arg[ k + 1 ]
local opt = string.sub(v, 2)
options[opt] = arg[k + 1]
k = k + 1
else
table.insert(tab.remainder, v)
table.insert(args, v)
end
k = k + 1
end
return tab
return options, args
end
-- http://lua-users.org/wiki/AlternativeGetOpt
local function getopt( arg, options )
local tab = {}

View File

@ -1,9 +1,8 @@
local injector = _G.requireInjector or load(http.get('https://raw.githubusercontent.com/kepler155c/opus/master/sys/apis/injector.lua').readAll())()
local injector = _G.requireInjector or load(_G.http.get('https://raw.githubusercontent.com/kepler155c/opus/master/sys/apis/injector.lua').readAll())()
injector()
local Event = require('event')
local History = require('history')
local Peripheral = require('peripheral')
local UI = require('ui')
local Util = require('util')

View File

@ -128,6 +128,7 @@ function UI.VerticalTabBar:setParent()
c.x = 1
c.y = k + 1
c.ox, c.oy = c.x, c.y
c.ow = 8
c.width = 8
end
end

View File

@ -20,11 +20,7 @@ local overviewId
local tabsDirty = false
local closeInd = Util.getVersion() >= 1.76 and '\215' or '*'
multishell.term = term.current() --deprecated
-- redirect kernel output to a window
kernel.window = window.create(parentTerm, 1, 2, w, h - 1, false)
kernel.terminal = kernel.window
multishell.term = parentTerm --deprecated
local config = {
standard = {
@ -156,6 +152,7 @@ function multishell.hideTab(tabId)
local tab = kernel.find(tabId)
if tab then
tab.hidden = true
kernel.lower(tab.uid)
redrawMenu()
end
end
@ -224,6 +221,7 @@ kernel.hook('multishell_redraw', function()
local currentTab = kernel.routines[1]
for _,tab in pairs(kernel.routines) do
tab.title = tab.env._APP_TITLE or tab.title
if tab.hidden and tab ~= currentTab then
tab.width = 0
else

View File

@ -330,7 +330,7 @@ end
local tArgs = { ... }
if #tArgs > 0 then
local env = setmetatable(Util.shallowCopy(sandboxEnv), { __index = _G })
return run(_ENV, ...) -- maybe _ENV
return run(env, ...)
end
local Config = require('config')

View File

@ -10,9 +10,9 @@ local os = _G.os
local read = _G.read
local term = _G.term
local args = Util.args({ ... })
local options, args = Util.args({ ... })
local remoteId = tonumber(table.remove(args.remainder, 1))
local remoteId = tonumber(table.remove(args, 1) or '')
if not remoteId then
print('Enter host ID')
remoteId = tonumber(read())
@ -22,8 +22,8 @@ if not remoteId then
error('Syntax: telnet [-title TITLE] ID [PROGRAM]')
end
if args.title then
multishell.setTitle(multishell.getCurrent(), args.title)
if options.title then
multishell.setTitle(multishell.getCurrent(), options.title)
end
print('connecting...')
@ -43,7 +43,7 @@ socket:write({
width = w,
height = h,
isColor = ct.isColor(),
program = args.remainder,
program = args,
})
Event.addRoutine(function()
@ -61,10 +61,10 @@ end)
ct.clear()
ct.setCursorPos(1, 1)
local filter = Util.transpose({
local filter = Util.transpose {
'char', 'paste', 'key', 'key_up', 'terminate',
'mouse_scroll', 'mouse_click', 'mouse_drag', 'mouse_up',
})
}
while true do
local e = { os.pullEventRaw() }

View File

@ -5,43 +5,81 @@ local http = _G.http
local os = _G.os
local shell = _ENV.shell
local term = _G.term
local window = _G.window
local w, h = term.getSize()
term.setTextColor(colors.white)
if term.isColor() then
term.setBackgroundColor(colors.black)
term.clear()
local opus = {
'fffff00',
'ffff07000',
'ff00770b00 4444',
'ff077777444444444',
'f07777744444444444',
'f0000777444444444',
'070000111744444',
'777770000',
'7777000000',
'70700000000',
'077000000000',
}
for k,line in ipairs(opus) do
term.setCursorPos((w - 18) / 2, k + (h - #opus) / 2)
term.blit(string.rep(' ', #line), string.rep('a', #line), line)
end
end
term.setCursorPos((w - 18) / 2, h)
term.write('Loading Opus...')
term.setCursorPos(w, h)
local GIT_REPO = 'kepler155c/opus/develop-1.8'
local BRANCH = 'develop-1.8'
local GIT_REPO = 'kepler155c/opus/' .. BRANCH
local BASE = 'https://raw.githubusercontent.com/' .. GIT_REPO
local sandboxEnv = setmetatable({ }, { __index = _G })
for k,v in pairs(_ENV) do
sandboxEnv[k] = v
end
sandboxEnv.multishell = _ENV.multishell or { }
sandboxEnv.multishell = { }
_G.debug = function() end
local terminal = term.current()
local w, h = term.getSize()
local kernelWindow = window.create(terminal, 1, 1, w, h, false)
term.redirect(kernelWindow)
local splashWindow
local function showStatus(status, ...)
local str = string.format(status, ...)
print(str)
splashWindow.setCursorPos(1, h)
splashWindow.clearLine()
splashWindow.setCursorPos((w - #str) / 2, h)
splashWindow.write(str)
os.sleep(.1)
end
local function splash()
splashWindow = window.create(terminal, 1, 1, w, h, false)
splashWindow.setTextColor(colors.white)
if splashWindow.isColor() then
splashWindow.setBackgroundColor(colors.black)
splashWindow.clear()
local opus = {
'fffff00',
'ffff07000',
'ff00770b00 4444',
'ff077777444444444',
'f07777744444444444',
'f0000777444444444',
'070000111744444',
'777770000',
'7777000000',
'70700000000',
'077000000000',
}
for k,line in ipairs(opus) do
splashWindow.setCursorPos((w - 18) / 2, k + (h - #opus) / 2)
splashWindow.blit(string.rep(' ', #line), string.rep('a', #line), line)
end
end
splashWindow.setVisible(true)
return splashWindow
end
local function setLabel()
-- Default label
if not os.getComputerLabel() then
showStatus('Setting computer label')
local id = os.getComputerID()
if _G.turtle then
os.setComputerLabel('turtle_' .. id)
elseif _G.pocket then
os.setComputerLabel('pocket_' .. id)
elseif _G.commands then
os.setComputerLabel('command_' .. id)
else
os.setComputerLabel('computer_' .. id)
end
end
end
local function makeEnv()
local env = setmetatable({ }, { __index = _G })
@ -51,7 +89,6 @@ local function makeEnv()
return env
end
-- os.run doesn't provide return values :(
local function run(file, ...)
local s, m = loadfile(file, makeEnv())
if s then
@ -77,107 +114,113 @@ local function runUrl(file, ...)
error('Failed to download ' .. url)
end
_G.debug = function() end
local function createUserEnvironment(Util)
showStatus('Creating user environment')
-- Install require shim
if fs.exists('sys/apis/injector.lua') then
_G.requireInjector = run('sys/apis/injector.lua')
else
-- not local, run the file system directly from git
_G.requireInjector = runUrl('/sys/apis/injector.lua')
runUrl('sys/extensions/vfs.lua')
-- install file system
fs.mount('', 'gitfs', GIT_REPO)
end
_G.requireInjector()
local Util = require('util')
-- Default label
if not os.getComputerLabel() then
local id = os.getComputerID()
if _G.turtle then
os.setComputerLabel('turtle_' .. id)
elseif _G.pocket then
os.setComputerLabel('pocket_' .. id)
elseif _G.commands then
os.setComputerLabel('command_' .. id)
else
os.setComputerLabel('computer_' .. id)
if not fs.exists('usr/apps') then
fs.makeDir('usr/apps')
end
if not fs.exists('usr/autorun') then
fs.makeDir('usr/autorun')
end
if not fs.exists('usr/etc/fstab') then
Util.writeFile('usr/etc/fstab', 'usr gitfs kepler155c/opus-apps/' .. BRANCH)
end
end
-- user environment
if not fs.exists('usr/apps') then
fs.makeDir('usr/apps')
end
if not fs.exists('usr/autorun') then
fs.makeDir('usr/autorun')
end
if not fs.exists('usr/etc/fstab') then
Util.writeFile('usr/etc/fstab', 'usr gitfs kepler155c/opus-apps/develop-1.8')
end
if not fs.exists('usr/config/shell') then
Util.writeTable('usr/config/shell', {
aliases = shell.aliases(),
path = 'usr/apps:sys/apps:' .. shell.path(),
lua_path = '/sys/apis:/usr/apis',
})
local function createShellEnvironment(Util)
showStatus('Creating shell environment')
if not fs.exists('usr/config/shell') then
Util.writeTable('usr/config/shell', {
aliases = shell.aliases(),
path = 'usr/apps:sys/apps:' .. shell.path(),
lua_path = '/sys/apis:/usr/apis',
})
end
local config = Util.readTable('usr/config/shell')
if config.aliases then
for k in pairs(shell.aliases()) do
shell.clearAlias(k)
end
for k,v in pairs(config.aliases) do
shell.setAlias(k, v)
end
end
shell.setPath(config.path)
sandboxEnv.LUA_PATH = config.lua_path
end
-- shell environment
local config = Util.readTable('usr/config/shell')
if config.aliases then
for k in pairs(shell.aliases()) do
shell.clearAlias(k)
end
for k,v in pairs(config.aliases) do
shell.setAlias(k, v)
local function loadExtensions(Util)
local dir = 'sys/extensions'
for _,file in ipairs(fs.list(dir)) do
showStatus('Loading ' .. file)
local s, m = Util.run(makeEnv(), 'sys/apps/shell', fs.combine(dir, file))
if not s then
error(m)
end
end
end
shell.setPath(config.path)
sandboxEnv.LUA_PATH = config.lua_path
Util.run(makeEnv(), 'sys/kernel.lua')
-- extensions
local dir = 'sys/extensions'
for _,file in ipairs(fs.list(dir)) do
local s, m = Util.run(makeEnv(), 'sys/apps/shell', fs.combine(dir, file))
if not s then
error(m)
end
end
-- install user file systems
fs.loadTab('usr/etc/fstab')
local args = { ... }
if args[1] then
term.setBackgroundColor(colors.black)
term.clear()
term.setCursorPos(1, 1)
end
local cterm = term.current()
splash()
local s, m = pcall(function()
showStatus('Loading Opus OS...')
args[1] = args[1] or 'sys/apps/multishell'
local routine = kernel.newRoutine({
path = 'sys/apps/shell',
args = args
})
kernel.run(routine)
local s, m = pcall(kernel.start)
-- Install require shim
if fs.exists('sys/apis/injector.lua') then
_G.requireInjector = run('sys/apis/injector.lua')
else
-- not local, run the file system directly from git
_G.requireInjector = runUrl('sys/apis/injector.lua')
runUrl('sys/extensions/vfs.lua')
-- install file system
fs.mount('', 'gitfs', GIT_REPO)
end
_G.requireInjector()
local Util = require('util')
setLabel()
createUserEnvironment(Util)
createShellEnvironment(Util)
showStatus('Reticulating splines')
Util.run(makeEnv(), 'sys/kernel.lua')
loadExtensions(Util)
showStatus('Mounting file systems')
fs.loadTab('usr/etc/fstab')
splashWindow.setVisible(false)
if args[1] then
kernelWindow.setVisible(true)
end
--term.clear()
--term.redirect(terminal)
_G.kernel.run(_G.kernel.newRoutine({
path = 'sys/apps/shell',
args = args[1] and args or { 'sys/apps/multishell' },
terminal = terminal,
}))
end)
term.redirect(cterm)
term.setBackgroundColor(colors.black)
term.setTextColor(colors.white)
term.clear()
term.setCursorPos(1, 1)
if not s then
print('\nCrash detected\n')
_G.printError(m)
splashWindow.setVisible(false)
kernelWindow.setVisible(true)
print('\nError loading Opus OS\n')
_G.printError(m .. '\n')
else
if _G.kernel.routines[1] then
_G.kernel.start(terminal, kernelWindow)
end
end
fs.restore()
if fs.restore then
fs.restore()
end

View File

@ -167,9 +167,9 @@
[ "2a4d562b1d9a9c90bdede6fac8ce4f7402462b86" ] = {
title = "Tasks",
category = "System",
icon = "\0307 \0303\0317__\0307\031 \
\0303 \
\0303 ",
icon = "\030f\031f \0315/\
\030f\031f \0315/\\/ \
\030f\0315/\031f ",
run = "Tabs.lua",
},
[ "114edfc04a1ab03541bdc80ce064f66a7cfcedbb" ] = {
@ -215,9 +215,9 @@
bdc1fd5d3c0f3dcfd55d010426e61bf9451e680d = {
title = "Shell",
category = "Apps",
icon = "\0304 \030 \
\0304 \030f\0314> \0310_\031 \
\0304 \030f \030 ",
icon = "\030f\0314\151\131\131\131\131\
\030f\0314\149\030f\0314> \0310_ \
\030f\0314\149\030f ",
run = "shell",
},
[ "131f0b008f44298812221d120d982940609be781" ] = {

View File

@ -83,7 +83,9 @@ kernel.hook({ 'mouse_click', 'mouse_up', 'mouse_drag' }, function(event, eventDa
if not mouse.state[button] then
return true -- ensure mouse ups are only generated if a mouse down was sent
end
mouse.state[button] = nil
if event == 'mouse_up' then
mouse.state[button] = nil
end
end
end)

View File

@ -24,6 +24,12 @@ local focusedRoutineEvents = Util.transpose {
'paste', 'terminate',
}
_G.debug = function(pattern, ...)
local oldTerm = term.redirect(kernel.terminal)
Util.print(pattern, ...)
term.redirect(oldTerm)
end
-- any function that runs in a kernel hook does not run in
-- a separate coroutine or have a window. an error in a hook
-- function will crash the system.
@ -151,6 +157,13 @@ function kernel.lower(uid)
local routine = Util.find(kernel.routines, 'uid', uid)
if routine and #kernel.routines > 1 then
if routine == kernel.routines[1] then
local nextRoutine = kernel.routines[2]
if nextRoutine then
kernel.raise(nextRoutine.uid)
end
end
Util.removeByValue(kernel.routines, routine)
table.insert(kernel.routines, routine)
return true
@ -172,12 +185,7 @@ function kernel.event(event, eventData)
local eventHooks = kernel.hooks[event]
if eventHooks then
for i = #eventHooks, 1, -1 do
local s, m = pcall(function()
stopPropagation = eventHooks[i](event, eventData)
end)
if not s then
error(m)
end
stopPropagation = eventHooks[i](event, eventData)
if stopPropagation then
break
end
@ -199,10 +207,23 @@ function kernel.event(event, eventData)
end
end
function kernel.start()
repeat
local eventData = { os.pullEventRaw() }
local event = table.remove(eventData, 1)
kernel.event(event, eventData)
until event == 'kernel_halt' or not kernel.routines[1]
function kernel.start(terminal, kernelWindow)
kernel.window = kernelWindow
kernel.terminal = kernel.window
local s, m = pcall(function()
repeat
local eventData = { os.pullEventRaw() }
local event = table.remove(eventData, 1)
kernel.event(event, eventData)
until event == 'kernel_halt' or not kernel.routines[1]
end)
kernel.window.setVisible(true)
if not s then
term.redirect(kernel.window)
print('\nCrash detected\n')
_G.printError(m)
end
term.redirect(terminal)
end

View File

@ -22,6 +22,7 @@ Event.addRoutine(function()
-- need to prevent multiple shares
if not peripheral then
print('peripheral: invalid peripheral ' .. uri)
socket:write('Invalid peripheral: ' .. uri)
else
print('peripheral: proxing ' .. uri)
local proxy = {
@ -62,6 +63,11 @@ Event.addRoutine(function()
print('peripheral: lost connection from ' .. socket.dhost)
break
end
if not _G.device[peripheral.name] then
print('periperal: detached')
socket:close()
break
end
if peripheral[data.fn] then
socket:write({ peripheral[data.fn](table.unpack(data.args)) })
end

View File

@ -1,6 +1,8 @@
local Event = require('event')
local Socket = require('socket')
local fs = _G.fs
local fileUid = 0
local fileHandles = { }
@ -46,10 +48,10 @@ local function sambaConnection(socket)
end
local ret
local s, m = pcall(function()
ret = fn(unpack(msg.args))
ret = fn(unpack(msg.args))
end)
if not s and m then
printError('samba: ' .. m)
_G.printError('samba: ' .. m)
end
socket:write({ response = ret })
end
@ -58,7 +60,6 @@ local function sambaConnection(socket)
end
Event.addRoutine(function()
print('samba: listening on port 139')
while true do
@ -72,11 +73,11 @@ Event.addRoutine(function()
end
end)
Event.on('network_attach', function(e, computer)
Event.on('network_attach', function(_, computer)
fs.mount(fs.combine('network', computer.label), 'netfs', computer.id)
end)
Event.on('network_detach', function(e, computer)
Event.on('network_detach', function(_, computer)
print('samba: detaching ' .. computer.label)
fs.unmount(fs.combine('network', computer.label))
end)

View File

@ -15,7 +15,6 @@ local gpsLastPoint
local gpsLastRequestTime
local function snmpConnection(socket)
while true do
local msg = socket:read()
if not msg then
@ -98,7 +97,6 @@ local function snmpConnection(socket)
end
Event.addRoutine(function()
print('snmp: listening on port 161')
while true do
@ -137,7 +135,6 @@ local info = {
local infoTimer = os.clock()
local function sendInfo()
if os.clock() - infoTimer >= 1 then -- don't flood
infoTimer = os.clock()
info.label = os.getComputerLabel()

View File

@ -2,16 +2,14 @@
Low level socket protocol implementation.
* sequencing
* write acknowledgements
* background read buffering
]]--
local Event = require('event')
local os = _G.os
_ENV._APP_TITLE = 'Net transport'
local computerId = os.getComputerID()
local transport = {
timers = { },
sockets = { },
@ -61,21 +59,18 @@ function transport.close(socket)
transport.sockets[socket.sport] = nil
end
print('Net transport started')
Event.on('timer', function(_, timerId)
local socket = transport.timers[timerId]
while true do
local e, timerId, dport, dhost, msg, distance = os.pullEvent()
if socket and socket.connected then
print('transport timeout - closing socket ' .. socket.sport)
socket:close()
transport.timers[timerId] = nil
end
end)
if e == 'timer' then
local socket = transport.timers[timerId]
if socket and socket.connected then
debug('transport timeout - closing socket ' .. socket.sport)
socket:close()
transport.timers[timerId] = nil
end
elseif e == 'modem_message' and dhost == computerId and msg then
Event.on('modem_message', function(_, _, dport, dhost, msg, distance)
if dhost == computerId and msg then
local socket = transport.sockets[dport]
if socket and socket.connected then
@ -85,6 +80,7 @@ while true do
-- received disconnect from other end
socket.connected = false
socket:close()
os.queueEvent('transport_' .. socket.sport)
elseif msg.type == 'ACK' then
local ackTimerId = socket.timers[msg.seq]
@ -105,7 +101,7 @@ while true do
elseif msg.type == 'DATA' and msg.data then
socket.activityTimer = os.clock()
if msg.seq ~= socket.rseq then
debug('transport seq error - closing socket ' .. socket.sport)
print('transport seq error - closing socket ' .. socket.sport)
socket:close()
else
socket.rseq = socket.rseq + 1
@ -125,4 +121,6 @@ while true do
end
end
end
end
end)
print('Net transport started')

View File

@ -2,16 +2,18 @@ local Event = require('event')
local Socket = require('socket')
local Util = require('util')
local os = _G.os
local terminal = _ENV.multishell.term
local function vncHost(socket)
local methods = { 'blit', 'clear', 'clearLine', 'setCursorPos', 'write',
'setTextColor', 'setTextColour', 'setBackgroundColor',
'setBackgroundColour', 'scroll', 'setCursorBlink', }
socket.term = multishell.term
socket.oldTerm = Util.shallowCopy(socket.term)
local oldTerm = Util.shallowCopy(terminal)
for _,k in pairs(methods) do
socket.term[k] = function(...)
terminal[k] = function(...)
if not socket.queue then
socket.queue = { }
Event.onTimeout(0, function()
@ -23,7 +25,7 @@ local function vncHost(socket)
f = k,
args = { ... },
})
socket.oldTerm[k](...)
oldTerm[k](...)
end
end
@ -35,17 +37,17 @@ local function vncHost(socket)
end
if data.type == 'shellRemote' then
os.queueEvent(unpack(data.event))
os.queueEvent(table.unpack(data.event))
elseif data.type == 'termInfo' then
socket.term.getSize = function()
terminal.getSize = function()
return data.width, data.height
end
os.queueEvent('term_resize')
end
end
for k,v in pairs(socket.oldTerm) do
socket.term[k] = v
for k,v in pairs(oldTerm) do
terminal[k] = v
end
os.queueEvent('term_resize')
end

View File

@ -1,7 +1,10 @@
_G.requireInjector()
--[[
Adds the control-d hotkey to view the kernel log.
]]
local Terminal = require('terminal')
local Util = require('util')
local kernel = _G.kernel
local keyboard = _G.device.keyboard
@ -9,19 +12,20 @@ local multishell = _ENV.multishell
local os = _G.os
local term = _G.term
_ENV._APP_TITLE = 'Debug'
if multishell and multishell.setTitle then
multishell.setTitle(multishell.getCurrent(), 'System Log')
end
term.redirect(Terminal.scrollable(term.current(), 50))
local tabId = multishell.getCurrent()
local routine = kernel.getCurrent()
local previousId
_G.debug = function(pattern, ...)
local oldTerm = term.current()
term.redirect(kernel.terminal)
Util.print(pattern, ...)
term.redirect(oldTerm)
end
kernel.window.reposition(1, 2)
Terminal.scrollable(kernel.window, 50)
routine.terminal = kernel.window
routine.window = kernel.window
term.redirect(routine.window)
kernel.hook('mouse_scroll', function(_, eventData)
local dir, y = eventData[1], eventData[3]
@ -38,22 +42,15 @@ kernel.hook('mouse_scroll', function(_, eventData)
end
end)
print('Debug started')
print('Press ^d to activate debug window')
keyboard.addHotkey('control-d', function()
local currentId = multishell.getFocus()
if currentId ~= tabId then
previousId = currentId
multishell.setFocus(tabId)
local current = kernel.getFocused()
if current.uid ~= routine.uid then
previousId = current.uid
kernel.raise(routine.uid)
elseif previousId then
multishell.setFocus(previousId)
kernel.raise(previousId)
end
end)
os.pullEventRaw('terminate')
print('Debug stopped')
_G.debug = function() end
keyboard.removeHotkey('control-d')

View File

@ -5,6 +5,7 @@ local Util = require('util')
local device = _G.device
local fs = _G.fs
local multishell = _ENV.multishell
local network = _G.network
local os = _G.os
local printError = _G.printError
@ -13,7 +14,9 @@ if not device.wireless_modem then
return
end
_ENV._APP_TITLE = 'Net Daemon'
if multishell and multishell.setTitle then
multishell.setTitle(multishell.getCurrent(), 'Net Daemon')
end
print('Net daemon started')