From b010fe7f57f1501a255645283a598cba822c84db Mon Sep 17 00:00:00 2001 From: TheWahlolly Date: Sun, 13 Apr 2025 17:40:19 +0300 Subject: [PATCH] v0.4.1 - Added something in the likes of an io.read() function in OpenOS. Cursor will be added next update. Shell parser will be added in 0.5.0. --- halyde/config/startupapps.txt | 1 + halyde/core/boot.lua | 2 +- halyde/core/evmgr.lua | 2 +- halyde/core/shell.lua | 11 ++++-- halyde/lib/event.lua | 63 +++++++++++++++++++++++------------ halyde/lib/termlib.lua | 17 +++++----- 6 files changed, 61 insertions(+), 35 deletions(-) diff --git a/halyde/config/startupapps.txt b/halyde/config/startupapps.txt index 248e747..5be8336 100644 --- a/halyde/config/startupapps.txt +++ b/halyde/config/startupapps.txt @@ -1,3 +1,4 @@ /halyde/core/datatools.lua +/halyde/core/fullkb.lua /halyde/core/evmgr.lua /halyde/core/shell.lua \ No newline at end of file diff --git a/halyde/core/boot.lua b/halyde/core/boot.lua index df14963..700300e 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.4.0" +_G._OSVERSION = "Halyde 0.4.1" function _G.import(module, ...) local args = table.pack(...) diff --git a/halyde/core/evmgr.lua b/halyde/core/evmgr.lua index 7143eba..10568c1 100644 --- a/halyde/core/evmgr.lua +++ b/halyde/core/evmgr.lua @@ -2,7 +2,7 @@ _G.evmgr = {} _G.evmgr.eventQueue = {} local maxEventQueueLength = 10 -- increase if events start getting dropped -local ocelot = component.proxy(component.list("ocelot")()) +--local ocelot = component.proxy(component.list("ocelot")()) while true do local args diff --git a/halyde/core/shell.lua b/halyde/core/shell.lua index 80da8f3..a71e998 100644 --- a/halyde/core/shell.lua +++ b/halyde/core/shell.lua @@ -1,11 +1,16 @@ import("termlib") local event = import("event") ---local ocelot = component.proxy(component.list("ocelot")()) +_G.shell = {} +_G.shell.workingDirectory = "/" -print("\n │\n │ ".._OSVERSION..'\n │ Welcome! Type "help" to get started.\n │') +print("\n │\n │ ".._OSVERSION..'\n │ Welcome! Type "help" to get started.\n │\n ') while true do coroutine.yield() + print(shell.workingDirectory .. " >") + termlib.nextPosX = #(shell.workingDirectory .. " > ") + termlib.nextPosY = termlib.nextPosY - 1 read() - --ocelot.log(tostring(args[1])) + termlib.nextPosX = 1 + print("no shell parser yet") end \ No newline at end of file diff --git a/halyde/lib/event.lua b/halyde/lib/event.lua index 8d80da0..afdbc41 100644 --- a/halyde/lib/event.lua +++ b/halyde/lib/event.lua @@ -1,34 +1,53 @@ local event = {} -local ocelot = component.proxy(component.list("ocelot")()) - -function event.pull(evtype, ...) - local timeout = ... - checkArg(1, evtype, "string", "nil") - checkArg(2, timeout, "number", "nil") +--local ocelot = component.proxy(component.list("ocelot")()) +function event.pull(...) + local args = {...} + local evtype, timeout + + if #args == 0 then + -- No arguments, wait for any event indefinitely + evtype = nil + timeout = nil + elseif #args == 1 then + -- If one argument is provided, it could be either the event type or timeout + if type(args[1]) == "number" then + -- It's a timeout + evtype = nil + timeout = args[1] + else + -- It's an event type + evtype = args[1] + timeout = nil + end + else + -- Both event type and timeout provided + evtype = args[1] + timeout = args[2] + end + local startTime = computer.uptime() - local args = {} - local finished = false + local result = {} + repeat + -- Check event queue for matching event for i = 1, #evmgr.eventQueue do - if evmgr.eventQueue[i][2] == evtype or not evtype then - args = table.copy(evmgr.eventQueue[i]) + if not evtype or evmgr.eventQueue[i][1] == evtype then + -- Found matching event (or any event if no type specified) + result = table.copy(evmgr.eventQueue[i]) table.remove(evmgr.eventQueue, i) - break + return table.unpack(result) end end - if evtype then - finished = args[1] == evtype + + -- Check if we've timed out + if timeout and computer.uptime() >= startTime + timeout then + return nil -- Timed out, return nil end - if timeout then - finished = computer.uptime() >= startTime + timeout - end - if not finished then - coroutine.yield() - end - until finished - ocelot.log(tostring(args[1])) - return table.unpack(args) + + -- Yield to allow other processes to run and more events to be added + coroutine.yield() + until false -- Loop until we find an event or timeout end return event \ No newline at end of file diff --git a/halyde/lib/termlib.lua b/halyde/lib/termlib.lua index 30d8eaf..797417c 100644 --- a/halyde/lib/termlib.lua +++ b/halyde/lib/termlib.lua @@ -1,4 +1,3 @@ - local event = import("event") --local keyboard = import("keyboard") @@ -32,21 +31,23 @@ function _G.clear() 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 + if args[3] >= 32 and args[3] <= 126 then curtext = curtext .. (unicode.char(args[3]) or "") + else + if key == "back" then + curtext = curtext:sub(1, #curtext-1) + termlib.nextPosX, termlib.nextPosY = nextPosX, nextPosY + print(curtext.." ") + elseif key == "enter" then + return curtext + end end termlib.nextPosX, termlib.nextPosY = nextPosX, nextPosY print(curtext)