diff --git a/halyde/core/boot.lua b/halyde/core/boot.lua index 0d0b512..df14963 100644 --- a/halyde/core/boot.lua +++ b/halyde/core/boot.lua @@ -1,7 +1,7 @@ local loadfile = ... local filesystem = loadfile("/halyde/lib/filesystem.lua")(loadfile) -_G._OSVERSION = "Halyde 0.3.1" +_G._OSVERSION = "Halyde 0.4.0" function _G.import(module, ...) local args = table.pack(...) @@ -28,4 +28,4 @@ end --assert(handle:write("Bazinga!")) --handle:close() -import("/halyde/core/cormgr.lua") +import("/halyde/core/cormgr.lua") \ No newline at end of file diff --git a/halyde/core/cormgr.lua b/halyde/core/cormgr.lua index 6f79595..ee46034 100644 --- a/halyde/core/cormgr.lua +++ b/halyde/core/cormgr.lua @@ -13,11 +13,10 @@ function _G.cormgr.loadCoroutine(path) end function handleError(errormsg) - if errormsg~=nil then - -- nothing for now - error(tostring(errormsg)) + if errormsg == nil then + error("unknown error") else - error("An error has occured, but given as 'nil'.") + error(tostring(errormsg).."\n \n"..debug.traceback()) end end @@ -59,4 +58,4 @@ while true do if #_G.cormgr.corList == 0 then computer.shutdown() end -end +end \ No newline at end of file diff --git a/halyde/core/datatools.lua b/halyde/core/datatools.lua index 836e464..83eab76 100644 --- a/halyde/core/datatools.lua +++ b/halyde/core/datatools.lua @@ -4,4 +4,19 @@ function table.find(table, item) return(v) end end +end + +function table.copy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[table.copy(orig_key)] = table.copy(orig_value) + end + setmetatable(copy, table.copy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + return copy end \ No newline at end of file diff --git a/halyde/core/evmgr.lua b/halyde/core/evmgr.lua index b9ea6aa..7143eba 100644 --- a/halyde/core/evmgr.lua +++ b/halyde/core/evmgr.lua @@ -7,21 +7,16 @@ local ocelot = component.proxy(component.list("ocelot")()) while true do local args repeat - args = computer.pullSignal(0) - if args then - ocelot.log("Sending signal "..args..","..computer.uptime()) - table.insert(evmgr.eventQueue, {computer.uptime(),args}) + args = {computer.pullSignal(0)} + if args and args[1] then + --ocelot.log("Sending signal "..args..","..computer.uptime()) + table.insert(evmgr.eventQueue, args) while #evmgr.eventQueue > maxEventQueueLength do - ocelot.log("Queue length breach, removing first signal") + --ocelot.log("Queue length breach, removing first signal") table.remove(evmgr.eventQueue, 1) end - --ocelot.log("Event queue:") - for i = 1, #evmgr.eventQueue do - --ocelot.log("Args 1 and 2:") - --ocelot.log(tostring(evmgr.eventQueue[i][1])) - --ocelot.log(tostring(evmgr.eventQueue[i][2])) - end end - until not args + until not args or not args[1] + --ocelot.log("done") coroutine.yield() -end +end \ No newline at end of file diff --git a/halyde/core/shell.lua b/halyde/core/shell.lua index 919a4be..80da8f3 100644 --- a/halyde/core/shell.lua +++ b/halyde/core/shell.lua @@ -5,7 +5,7 @@ local event = import("event") print("\n │\n │ ".._OSVERSION..'\n │ Welcome! Type "help" to get started.\n │') while true do - --coroutine.yield() - local args = {event.pull("key_down")} + coroutine.yield() + read() --ocelot.log(tostring(args[1])) -end +end \ No newline at end of file diff --git a/halyde/lib/event.lua b/halyde/lib/event.lua index d6dd5dd..8d80da0 100644 --- a/halyde/lib/event.lua +++ b/halyde/lib/event.lua @@ -2,30 +2,33 @@ local event = {} local ocelot = component.proxy(component.list("ocelot")()) -function event.pull(evtype, timeout) +function event.pull(evtype, ...) + local timeout = ... checkArg(1, evtype, "string", "nil") checkArg(2, timeout, "number", "nil") local startTime = computer.uptime() - local args + local args = {} + local finished = false repeat for i = 1, #evmgr.eventQueue do - ocelot.log(tostring(evmgr.eventQueue[i][1]).." ("..type(evmgr.eventQueue[i][1]).."), "..tostring(evmgr.eventQueue[i][2])) - --ocelot.log(tostring(evmgr.eventQueue[i][3])) - --ocelot.log(tostring(evmgr.eventQueue[i][4])) - if evmgr.eventQueue[i][1] >= startTime and (evmgr.eventQueue[i][2] == evtype or not evtype) then - args = evmgr.eventQueue[i] + if evmgr.eventQueue[i][2] == evtype or not evtype then + args = table.copy(evmgr.eventQueue[i]) + table.remove(evmgr.eventQueue, i) break end end - if not args then + if evtype then + finished = args[1] == evtype + end + if timeout then + finished = computer.uptime() >= startTime + timeout + end + if not finished then coroutine.yield() end - until args and not timeout or args and timeout and (args or computer.uptime() >= startTime + timeout) - if args then - --[[ table.remove(args, 1) - return table.unpack(args) ]] - return args[2] - end + until finished + ocelot.log(tostring(args[1])) + return table.unpack(args) end -return event +return event \ No newline at end of file diff --git a/halyde/lib/termlib.lua b/halyde/lib/termlib.lua index f7d7c25..30d8eaf 100644 --- a/halyde/lib/termlib.lua +++ b/halyde/lib/termlib.lua @@ -1,5 +1,11 @@ + +local event = import("event") +--local keyboard = import("keyboard") + local gpu = component.proxy(component.list("gpu")()) -- replace with component.gpu once implemented -local lineNumber = 1 +local ocelot = component.proxy(component.list("ocelot")()) +_G.termlib = {} +termlib.nextPosX, termlib.nextPosY = 1, 1 function _G.print(text) local xRes, yRes = gpu.getResolution() @@ -9,17 +15,41 @@ function _G.print(text) local printText = tostring(text):gsub("\t", " ") for line in printText:gmatch("([^\n]*)\n?") do while #line > xRes do - gpu.set(1,lineNumber,line:sub(1,xRes)) + gpu.set(termlib.nextPosX, termlib.nextPosY, line:sub(1,xRes)) line = line:sub(xRes+1) - lineNumber = lineNumber + 1 + termlib.nextPosY = termlib.nextPosY + 1 + termlib.nextPosX = 1 end - gpu.set(1,lineNumber,line) - lineNumber = lineNumber + 1 + gpu.set(termlib.nextPosX, termlib.nextPosY, line) + termlib.nextPosY = termlib.nextPosY + 1 end end function _G.clear() local xRes, yRes = gpu.getResolution() gpu.fill(1,1,xRes,yRes," ") - lineNumber = 1 + termlib.nextPosX, termlib.nextPosY = 1, 1 +end + +function _G.read() + ocelot.log("reading") + local curtext = "" + local nextPosX, nextPosY = termlib.nextPosX, termlib.nextPosY + while true do + local args = {event.pull("key_down", 0.5)} + ocelot.log(tostring(args[1])) + if args[4] then + local keycode = args[4] + local key = keyboard.keys[keycode] + if key == "back" then + curtext = curtext:sub(1, #curtext-1) + elseif key == "enter" then + return curtext + else + curtext = curtext .. (unicode.char(args[3]) or "") + end + termlib.nextPosX, termlib.nextPosY = nextPosX, nextPosY + print(curtext) + end + end end \ No newline at end of file