59 lines
1.4 KiB
Lua
59 lines
1.4 KiB
Lua
do
|
|
--#include "module/nvt100.lua"
|
|
function vtemu(gpua,scra) -- creates a process to handle the GPU and screen address combination *gpua*/*scra*. Returns read, write and "close" functions.
|
|
local gpu = component.proxy(gpua)
|
|
gpu.bind(scra)
|
|
local write = vt100emu(gpu)
|
|
local kba = {}
|
|
for k,v in ipairs(component.invoke(scra,"getKeyboards")) do
|
|
kba[v]=true
|
|
end
|
|
local buf, lbuf, echo = "", true, true
|
|
os.spawn(function() dprint(pcall(function()
|
|
while true do
|
|
local ty,ka,ch = coroutine.yield()
|
|
if ty == "key_down" and kba[ka] then
|
|
if ch == 13 then ch = 10 end
|
|
if ch == 8 then
|
|
if buf:len() > 0 then
|
|
if echo then write("\8 \8") end
|
|
buf = buf:sub(1,-2)
|
|
end
|
|
elseif ch > 0 then
|
|
if echo then write(string.char(ch)) end
|
|
buf=buf..string.char(ch)
|
|
end
|
|
end
|
|
end
|
|
end)) end,string.format("ttyd[%s:%s]",gpua:sub(1,8),scra:sub(1,8)))
|
|
local function bread(n)
|
|
local r
|
|
if lbuf then
|
|
while not buf:find("\n") do
|
|
coroutine.yield()
|
|
end
|
|
local n = buf:find("\n")
|
|
r, buf = buf:sub(1,n), buf:sub(n+1)
|
|
else
|
|
r = buf
|
|
buf = ""
|
|
coroutine.yield()
|
|
end
|
|
return r
|
|
end
|
|
local function bwrite(d)
|
|
local ba, lb, ec = write(d)
|
|
buf = buf .. ba
|
|
if lb ~= nil then
|
|
dprint("local buffer mode: "..tostring(lb))
|
|
lbuf = lb
|
|
end
|
|
if ec ~= nil then
|
|
dprint("echo mode: "..tostring(ec))
|
|
echo = ec
|
|
end
|
|
end
|
|
return bread, bwrite, function() io.write("\27[2J\27[H") end
|
|
end
|
|
end
|