|
|
@@ -0,0 +1,50 @@ |
|
|
|
local gpus,screens,ttyn = {}, {}, 0 |
|
|
|
local function scan() |
|
|
|
local w,di = pcall(computer.getDeviceInfo) |
|
|
|
if w then |
|
|
|
for a,t in pairs(component.list()) do |
|
|
|
if t == "gpu" then |
|
|
|
gpus[a] = gpus[a] or {false, tonumber(di[a].capacity)} |
|
|
|
elseif t == "screen" then |
|
|
|
screens[a] = screens[a] or {false, tonumber(di[a].capacity)} |
|
|
|
end |
|
|
|
end |
|
|
|
else |
|
|
|
dprint("no getDevInfo") |
|
|
|
for a,t in pairs(component.list()) do |
|
|
|
if t == "gpu" then |
|
|
|
gpus[a] = gpus[a] or {false, 8000} |
|
|
|
elseif t == "screen" then |
|
|
|
screens[a] = screens[a] or {false, 8000} |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
local function nextScreen(n) |
|
|
|
local rt = {} |
|
|
|
for k,v in pairs(screens) do |
|
|
|
if not v[1] then |
|
|
|
rt[v[2]] = rt[v[2]] or k |
|
|
|
end |
|
|
|
end |
|
|
|
return rt[n] or rt[8000] or rt[2000] or rt[600] |
|
|
|
end |
|
|
|
local function allocate() |
|
|
|
for k,v in pairs(gpus) do |
|
|
|
dprint(k) |
|
|
|
local sA = nextScreen(v[2]) |
|
|
|
if v[1] == false and sA then |
|
|
|
local r,w = vtemu(k,sA) |
|
|
|
devfs.register("tty"..tostring(ttyn), function() return r,w,function() end end) |
|
|
|
gpus[k][1] = true |
|
|
|
screens[sA][1] = true |
|
|
|
ttyn = ttyn + 1 |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
scan() |
|
|
|
allocate() |
|
|
|
dprint("screens ready") |
|
|
|
while true do |
|
|
|
coroutine.yield() |
|
|
|
end |