Operating system for OpenComputers
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

79 líneas
1.8KB

  1. local gpus,screens,ttyn,pids = {}, {}, 0, {}
  2. local basepid = nil
  3. local shell = require "shell"
  4. local function scan()
  5. local w,di = pcall(computer.getDeviceInfo)
  6. if w then
  7. for a,t in pairs(component.list()) do
  8. if t == "gpu" then
  9. gpus[a] = gpus[a] or {false, tonumber(di[a].capacity)}
  10. elseif t == "screen" then
  11. screens[a] = screens[a] or {false, tonumber(di[a].capacity)}
  12. end
  13. end
  14. else
  15. dprint("no getDevInfo")
  16. for a,t in pairs(component.list()) do
  17. if t == "gpu" then
  18. gpus[a] = gpus[a] or {false, 8000}
  19. elseif t == "screen" then
  20. screens[a] = screens[a] or {false, 8000}
  21. end
  22. end
  23. end
  24. end
  25. local function nextScreen(n)
  26. local rt = {}
  27. for k,v in pairs(screens) do
  28. if not v[1] then
  29. rt[v[2]] = rt[v[2]] or k
  30. end
  31. end
  32. return rt[n] or rt[8000] or rt[2000] or rt[600]
  33. end
  34. local function spawnShell(fin,fout)
  35. io.input(fin)
  36. io.output(fout):setvbuf("no")
  37. print(_OSVERSION.." - "..tostring(math.floor(computer.totalMemory()/1024)).."K RAM")
  38. return os.spawn(shell.interactive, "shell: "..tostring(fin))
  39. end
  40. local function allocate()
  41. for k,v in pairs(gpus) do
  42. dprint(k)
  43. local sA = nextScreen(v[2])
  44. if v[1] == false and sA then
  45. local r,w = vtemu(k,sA)
  46. devfs.register("tty"..tostring(ttyn), function() return r,w,function() end end)
  47. gpus[k][1] = true
  48. screens[sA][1] = true
  49. pids["tty"..tostring(ttyn)] = {-1}
  50. ttyn = ttyn + 1
  51. end
  52. end
  53. end
  54. function start()
  55. scan()
  56. allocate()
  57. dprint("screens ready")
  58. basepid = os.spawn(function()
  59. while true do
  60. coroutine.yield()
  61. for k,v in pairs(pids) do
  62. if not os.taskInfo(v[1]) then
  63. dprint("Spawning new shell for "..k)
  64. pids[k][1] = spawnShell(v[2] or "/dev/"..k, v[3] or "/dev/"..k)
  65. pids[k][2], pids[k][3] = pids[k][2] or io.input(), pids[k][3] or io.output()
  66. end
  67. end
  68. end
  69. end,"getty")
  70. return basepid
  71. end
  72. function stop()
  73. os.kill(basepid)
  74. basepid = nil
  75. end