113 lines
3.4 KiB
Lua
113 lines
3.4 KiB
Lua
-- CLI бортового компьютера AtlasOS v1.1
|
|
-- Вход: пин 1 - команда; остальные пины не используются
|
|
-- Выходы: 1 - текст, 2 - очистка (1), 3 - цвет (R,G,B)
|
|
|
|
-- Глобальный цвет по умолчанию (зелёный)
|
|
local defaultColor = "0,255,0"
|
|
local currentColor = defaultColor
|
|
-- Устанавливаем начальный цвет
|
|
out[3] = currentColor
|
|
|
|
-- Таблица команд
|
|
local commands = {}
|
|
|
|
-- Регистрация команды
|
|
local function register_command(name, func, description)
|
|
commands[name] = { func = func, desc = description }
|
|
end
|
|
|
|
-- Вывод обычного текста с текущим цветом
|
|
local function print(text)
|
|
out[3] = currentColor
|
|
out[1] = text
|
|
end
|
|
|
|
-- Вывод текста ошибки (красный) с последующим возвратом цвета
|
|
local function printerror(text)
|
|
out[3] = "255,40,40"
|
|
out[1] = text
|
|
out[3] = currentColor
|
|
end
|
|
|
|
-- Обработчик команд
|
|
local function process_command(cmd_str)
|
|
local parts = {}
|
|
for token in tostring(cmd_str):gmatch("%S+") do
|
|
table.insert(parts, token)
|
|
end
|
|
local cmd = parts[1]
|
|
local args = {}
|
|
for i = 2, #parts do
|
|
table.insert(args, parts[i])
|
|
end
|
|
|
|
local cmd_entry = commands[cmd]
|
|
if cmd_entry then
|
|
local success, result = pcall(cmd_entry.func, args)
|
|
if success then
|
|
if result ~= nil then
|
|
-- Команда вернула строку для вывода
|
|
print(result)
|
|
end
|
|
-- если result == nil, команда сама обработала вывод
|
|
else
|
|
printerror(tostring(result))
|
|
end
|
|
else
|
|
printerror("Error: Unknown command. Type 'help' for list.")
|
|
end
|
|
end
|
|
|
|
-- ---- Команды ----
|
|
|
|
-- help
|
|
register_command("help", function(args)
|
|
local help_text = "Available commands:\n"
|
|
for name, entry in pairs(commands) do
|
|
help_text = help_text .. " " .. name .. " - " .. entry.desc .. "\n"
|
|
end
|
|
return help_text
|
|
end, "Show this help")
|
|
|
|
-- echo
|
|
register_command("echo", function(args)
|
|
if #args == 0 then
|
|
error("echo requires text.") -- будет перехвачено pcall
|
|
end
|
|
return table.concat(args, " ")
|
|
end, "Echo the input text")
|
|
|
|
-- clear
|
|
register_command("clear", function(args)
|
|
out[2] = 1
|
|
return nil
|
|
end, "Clear the screen")
|
|
|
|
-- color (устанавливает цвет для последующих обычных выводов)
|
|
register_command("color", function(args)
|
|
if #args < 3 then
|
|
error("color requires 3 numbers (R G B)")
|
|
end
|
|
local r, g, b = tonumber(args[1]), tonumber(args[2]), tonumber(args[3])
|
|
if not (r and g and b) then
|
|
error("invalid color values")
|
|
end
|
|
r = math.max(0, math.min(255, math.floor(r)))
|
|
g = math.max(0, math.min(255, math.floor(g)))
|
|
b = math.max(0, math.min(255, math.floor(b)))
|
|
currentColor = r .. "," .. g .. "," .. b
|
|
print("Color set to " .. currentColor)
|
|
return nil -- print уже вывел сообщение
|
|
end, "Set text color (R G B)")
|
|
|
|
-- status
|
|
register_command("status", function(args)
|
|
return "AtlasOS v1.1 - All systems nominal."
|
|
end, "Show system status")
|
|
|
|
-- Входной сигнал
|
|
function inp(pin, val)
|
|
if pin == 1 then
|
|
process_command(val)
|
|
end
|
|
end |