forked from izaya/LuPPC
Basic GPU component
This commit is contained in:
parent
b722a0c0bf
commit
aeb3bf786e
@ -5,5 +5,7 @@ extern char lua_component[];
|
|||||||
extern char lua_computer[];
|
extern char lua_computer[];
|
||||||
extern char lua_init[];
|
extern char lua_init[];
|
||||||
extern char lua_sandbox[];
|
extern char lua_sandbox[];
|
||||||
|
extern char lua_textgpu[];
|
||||||
|
extern char lua_util_color[];
|
||||||
extern char lua_util_random[];
|
extern char lua_util_random[];
|
||||||
#endif
|
#endif
|
||||||
|
@ -4,6 +4,11 @@
|
|||||||
#ifndef LUPI_H
|
#ifndef LUPI_H
|
||||||
#define LUPI_H
|
#define LUPI_H
|
||||||
|
|
||||||
|
//TODO: move to utils
|
||||||
|
#define pushstuple(state, name, value) lua_pushstring((state), (name)); lua_pushstring((state), (value)); lua_settable((state), -3)
|
||||||
|
#define pushctuple(state, name, value) lua_pushstring((state), (name)); lua_pushcfunction((state), (value)); lua_settable((state), -3)
|
||||||
|
|
||||||
void run_init();
|
void run_init();
|
||||||
void setup_modules(lua_State *L);
|
void setup_modules(lua_State *L);
|
||||||
|
void termutils_start(lua_State *L);
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,18 +5,16 @@
|
|||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
//TODO: move to utils
|
|
||||||
#define pushtuple(state, name, value) lua_pushstring((state), (name)); lua_pushstring((state), (value)); lua_settable((state), -3)
|
|
||||||
|
|
||||||
|
|
||||||
void setup_modules(lua_State *L) {
|
void setup_modules(lua_State *L) {
|
||||||
lua_createtable (L, 0, 1);
|
lua_createtable (L, 0, 1);
|
||||||
|
|
||||||
pushtuple(L, "boot", lua_boot);
|
pushstuple(L, "boot", lua_boot);
|
||||||
pushtuple(L, "component", lua_component);
|
pushstuple(L, "component", lua_component);
|
||||||
pushtuple(L, "computer", lua_computer);
|
pushstuple(L, "computer", lua_computer);
|
||||||
pushtuple(L, "sandbox", lua_sandbox);
|
pushstuple(L, "sandbox", lua_sandbox);
|
||||||
pushtuple(L, "random", lua_util_random);
|
pushstuple(L, "textgpu", lua_textgpu);
|
||||||
|
pushstuple(L, "color", lua_util_color);
|
||||||
|
pushstuple(L, "random", lua_util_random);
|
||||||
|
|
||||||
lua_setglobal(L, "moduleCode");
|
lua_setglobal(L, "moduleCode");
|
||||||
}
|
}
|
@ -8,8 +8,11 @@
|
|||||||
void run_init() {
|
void run_init() {
|
||||||
lua_State *L;
|
lua_State *L;
|
||||||
L = luaL_newstate();
|
L = luaL_newstate();
|
||||||
luaL_openlibs(L);
|
|
||||||
setup_modules(L);
|
luaL_openlibs (L);
|
||||||
|
setup_modules (L);
|
||||||
|
termutils_start (L);
|
||||||
|
|
||||||
int status = luaL_loadstring(L, lua_init);
|
int status = luaL_loadstring(L, lua_init);
|
||||||
if (status) {
|
if (status) {
|
||||||
fprintf(stderr, "Couldn't load init: %s\n", lua_tostring(L, -1));
|
fprintf(stderr, "Couldn't load init: %s\n", lua_tostring(L, -1));
|
||||||
|
34
src/c/termutils.c
Normal file
34
src/c/termutils.c
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include "lupi.h"
|
||||||
|
#include <lua.h>
|
||||||
|
#include <lualib.h>
|
||||||
|
#include <lauxlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static void handle_winch(int sig){
|
||||||
|
signal(SIGWINCH, SIG_IGN);
|
||||||
|
|
||||||
|
//FIXME: Prerelease: Implement
|
||||||
|
signal(SIGWINCH, handle_winch);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_get_term_sz (lua_State *L) {
|
||||||
|
struct winsize w;
|
||||||
|
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
|
||||||
|
lua_pushnumber(L, w.ws_col);
|
||||||
|
lua_pushnumber(L, w.ws_row);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void termutils_start(lua_State *L) {
|
||||||
|
signal(SIGWINCH, handle_winch);
|
||||||
|
|
||||||
|
lua_createtable (L, 0, 1);
|
||||||
|
pushctuple(L, "getSize", l_get_term_sz);
|
||||||
|
|
||||||
|
lua_setglobal(L, "termutils");
|
||||||
|
}
|
@ -1,6 +1,10 @@
|
|||||||
local boot = {}
|
local boot = {}
|
||||||
|
|
||||||
function boot.boot()
|
function boot.boot()
|
||||||
|
local gpu = modules.component.api.proxy(modules.component.api.list("gpu", true)())
|
||||||
|
local w, h = gpu.getResolution()
|
||||||
|
print("r= " .. tostring(w) .. " " .. tostring(h))
|
||||||
|
gpu.fill(0, 0, w, h, " ")
|
||||||
print("LuPI L2 INIT")
|
print("LuPI L2 INIT")
|
||||||
print("FIXME: boot stub")
|
print("FIXME: boot stub")
|
||||||
error("Unable to boot")
|
error("Unable to boot")
|
||||||
|
@ -18,7 +18,7 @@ function api.register(address, ctype, proxy, doc)
|
|||||||
checkArg(2, ctype, "string")
|
checkArg(2, ctype, "string")
|
||||||
checkArg(3, proxy, "table")
|
checkArg(3, proxy, "table")
|
||||||
if type(address) ~= "string" then
|
if type(address) ~= "string" then
|
||||||
address = random.uuid()
|
address = modules.random.uuid()
|
||||||
end
|
end
|
||||||
if components[address] ~= nil then
|
if components[address] ~= nil then
|
||||||
return nil, "component already at address"
|
return nil, "component already at address"
|
||||||
@ -28,12 +28,13 @@ function api.register(address, ctype, proxy, doc)
|
|||||||
components[address].proxy = {}
|
components[address].proxy = {}
|
||||||
for k,v in pairs(proxy) do
|
for k,v in pairs(proxy) do
|
||||||
if type(v) == "function" then
|
if type(v) == "function" then
|
||||||
components[address].proxy = setmetatable({name=k,address=address}, componentCallback)
|
print("Cfunc " .. k)
|
||||||
|
components[address].proxy[k] = setmetatable({name=k,address=address}, componentCallback)
|
||||||
else
|
else
|
||||||
components[address].proxy = v
|
components[address].proxy[k] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
computer.pushSignal("component_added", address, ctype)
|
modules.computer.api.pushSignal("component_added", address, ctype)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -44,7 +45,7 @@ function api.unregister(address)
|
|||||||
end
|
end
|
||||||
local ctype = components[address].type
|
local ctype = components[address].type
|
||||||
components[address] = nil
|
components[address] = nil
|
||||||
computer.pushSignal("component_removed", address, ctype)
|
modules.computer.api.pushSignal("component_removed", address, ctype)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
local computer = {}
|
local computer = {}
|
||||||
|
local api = {}
|
||||||
|
computer.api = api
|
||||||
|
|
||||||
function computer.prepare( ... )
|
function computer.prepare( ... )
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function api.pushSignal(...)
|
||||||
|
--FIXME: ASAP: Implement
|
||||||
|
end
|
||||||
|
|
||||||
return computer
|
return computer
|
@ -1,4 +1,4 @@
|
|||||||
local function checkArg(n, have, ...)
|
function checkArg(n, have, ...)
|
||||||
have = type(have)
|
have = type(have)
|
||||||
local function check(want, ...)
|
local function check(want, ...)
|
||||||
if not want then
|
if not want then
|
||||||
@ -36,8 +36,13 @@ end
|
|||||||
|
|
||||||
--Load modules
|
--Load modules
|
||||||
loadModule("random")
|
loadModule("random")
|
||||||
|
loadModule("color")
|
||||||
|
|
||||||
loadModule("component")
|
loadModule("component")
|
||||||
loadModule("computer")
|
loadModule("computer")
|
||||||
|
|
||||||
|
loadModule("textgpu")
|
||||||
|
|
||||||
loadModule("sandbox")
|
loadModule("sandbox")
|
||||||
loadModule("boot")
|
loadModule("boot")
|
||||||
|
|
||||||
@ -45,4 +50,5 @@ loadModule("boot")
|
|||||||
modules.component.prepare()
|
modules.component.prepare()
|
||||||
modules.computer.prepare()
|
modules.computer.prepare()
|
||||||
|
|
||||||
|
modules.textgpu.start()
|
||||||
modules.boot.boot()
|
modules.boot.boot()
|
||||||
|
121
src/lua/core/textgpu.lua
Normal file
121
src/lua/core/textgpu.lua
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
local textgpu = {}
|
||||||
|
|
||||||
|
local mapping = {
|
||||||
|
["0"] = 0x000000,
|
||||||
|
["1"] = 0xFF0000,
|
||||||
|
["2"] = 0x00FF00,
|
||||||
|
["3"] = 0xFFFF00,
|
||||||
|
["4"] = 0x0000FF,
|
||||||
|
["5"] = 0xFF00FF,
|
||||||
|
["6"] = 0x00FFFF,
|
||||||
|
["7"] = 0xFFFFFF,
|
||||||
|
}
|
||||||
|
|
||||||
|
local background = "0"
|
||||||
|
local foreground = "0"
|
||||||
|
|
||||||
|
function textgpu.start()
|
||||||
|
local gpu = {}
|
||||||
|
function gpu.bind() return false, "This is static bound gpu" end
|
||||||
|
function gpu.getScreen() return "n/a" end
|
||||||
|
function gpu.setBackground(color, isPaletteIndex)
|
||||||
|
checkArg(1, color, "number")
|
||||||
|
checkArg(2, isPaletteIndex, "boolean", "nil")
|
||||||
|
if isPaletteIndex then
|
||||||
|
return --TODO: Maybe?
|
||||||
|
end
|
||||||
|
background = modules.color.nearest(color, mapping)
|
||||||
|
io.write("\x1b[4" .. background .. "m")
|
||||||
|
end
|
||||||
|
function gpu.setForeground(color, isPaletteIndex)
|
||||||
|
checkArg(1, color, "number")
|
||||||
|
checkArg(2, isPaletteIndex, "boolean", "nil")
|
||||||
|
if isPaletteIndex then
|
||||||
|
return --TODO: Maybe?
|
||||||
|
end
|
||||||
|
background = modules.color.nearest(color, mapping)
|
||||||
|
io.write("\x1b[3" .. background .. "m")
|
||||||
|
end
|
||||||
|
function gpu.getBackground()
|
||||||
|
return mapping[background], false
|
||||||
|
end
|
||||||
|
function gpu.getForeground()
|
||||||
|
return mapping[foreground], false
|
||||||
|
end
|
||||||
|
function gpu.getPaletteColor()
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
function gpu.setPaletteColor()
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
function gpu.maxDepth()
|
||||||
|
return 3
|
||||||
|
end
|
||||||
|
function gpu.setDepth()
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
function gpu.getDepth()
|
||||||
|
return 3
|
||||||
|
end
|
||||||
|
function gpu.maxResolution()
|
||||||
|
return termutils.getSize()
|
||||||
|
end
|
||||||
|
function gpu.getResolution()
|
||||||
|
return termutils.getSize()
|
||||||
|
end
|
||||||
|
function gpu.setResolution(w, h)
|
||||||
|
checkArg(1, w, "number")
|
||||||
|
checkArg(2, h, "number")
|
||||||
|
return false, "Non resizeable gpu"
|
||||||
|
end
|
||||||
|
function gpu.get(x, y)
|
||||||
|
checkArg(1, x, "number")
|
||||||
|
checkArg(2, y, "number")
|
||||||
|
--FIXME: ASAP: Implement
|
||||||
|
return " "
|
||||||
|
end
|
||||||
|
function gpu.set(x, y, value, vertical)
|
||||||
|
checkArg(1, x, "number")
|
||||||
|
checkArg(2, y, "number")
|
||||||
|
checkArg(3, value, "string")
|
||||||
|
checkArg(4, vertical, "boolean", "nil")
|
||||||
|
if not vertical then
|
||||||
|
io.write("\x1b[" .. y .. ";" .. x .. "H" .. value)
|
||||||
|
else
|
||||||
|
io.write("\x1b[" .. y .. ";" .. x .. "H")
|
||||||
|
value:gsub(".", function(c)
|
||||||
|
io.write(c .. "\x1b[D\x1b[B")
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
function gpu.copy(x, y, w, h, tx, ty)
|
||||||
|
checkArg(1, x, "number")
|
||||||
|
checkArg(2, y, "number")
|
||||||
|
checkArg(3, w, "number")
|
||||||
|
checkArg(4, h, "number")
|
||||||
|
checkArg(5, tx, "number")
|
||||||
|
checkArg(6, ty, "number")
|
||||||
|
--FIXME: ASAP: Implement
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
function gpu.fill(x, y, w, h, ch)
|
||||||
|
checkArg(1, x, "number")
|
||||||
|
checkArg(2, y, "number")
|
||||||
|
checkArg(3, w, "number")
|
||||||
|
checkArg(4, h, "number")
|
||||||
|
checkArg(5, ch, "string")
|
||||||
|
ch = ch:sub(1, 1):rep(w)
|
||||||
|
for i=1, h do
|
||||||
|
gpu.set(x, y + i - 1, ch)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
gpu.setForeground(0xFFFFFF)
|
||||||
|
gpu.setBackground(0x000000)
|
||||||
|
|
||||||
|
modules.component.api.register(nil, "gpu", gpu)
|
||||||
|
end
|
||||||
|
|
||||||
|
return textgpu
|
68
src/lua/core/util/color.lua
Normal file
68
src/lua/core/util/color.lua
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
local color = {}
|
||||||
|
|
||||||
|
function color.rgbToHsv(r, g, b)
|
||||||
|
local h, s, v
|
||||||
|
local min, max, delta
|
||||||
|
min = math.min(r, g, b)
|
||||||
|
max = math.max(r, g, b)
|
||||||
|
v = max
|
||||||
|
delta = max - min
|
||||||
|
if delta < 0.00001 then
|
||||||
|
return 0, 0, v
|
||||||
|
end
|
||||||
|
if max ~= 0 then
|
||||||
|
s = delta / max
|
||||||
|
else
|
||||||
|
s = 0
|
||||||
|
h = -1
|
||||||
|
return h, s, v
|
||||||
|
end
|
||||||
|
|
||||||
|
if r == max then
|
||||||
|
h = (g - b) / delta
|
||||||
|
elseif g == max then
|
||||||
|
h = 2 + (b - r) / delta
|
||||||
|
else
|
||||||
|
h = 4 + (r - g) / delta
|
||||||
|
end
|
||||||
|
|
||||||
|
h = h * 60
|
||||||
|
if h < 0 then h = h + 360 end
|
||||||
|
return h, s, v
|
||||||
|
end
|
||||||
|
|
||||||
|
function color.hsvToRgb(h, s, v)
|
||||||
|
local i, f, p, q, t
|
||||||
|
if s == 0 then
|
||||||
|
return v, v, v
|
||||||
|
end
|
||||||
|
h = h / 60
|
||||||
|
i = math.floor(h)
|
||||||
|
f = h - i
|
||||||
|
p = v * (1 - s)
|
||||||
|
q = v * (1 - s * f)
|
||||||
|
t = v * (1 - s * (1 - f))
|
||||||
|
if i == 0 then return v, t, p end
|
||||||
|
if i == 1 then return q, v, p end
|
||||||
|
if i == 2 then return p, v, t end
|
||||||
|
if i == 3 then return p, q, v end
|
||||||
|
if i == 4 then return t, p, v end
|
||||||
|
return v, p, q
|
||||||
|
end
|
||||||
|
|
||||||
|
function color.nearest(to, colors)
|
||||||
|
local lowest = math.huge
|
||||||
|
local lowestk = nil
|
||||||
|
local th, ts, tv = color.rgbToHsv((to & 0xFF0000) >> 16, (to & 0xFF00) >> 8, to & 0xFF)
|
||||||
|
for k, col in pairs(colors) do
|
||||||
|
local h, s, v = color.rgbToHsv((col & 0xFF0000) >> 16, (col & 0xFF00) >> 8, col & 0xFF)
|
||||||
|
local d = math.abs(h - th) + math.abs(s - ts) + math.abs(v - tv)
|
||||||
|
if d < lowest then
|
||||||
|
lowest = d
|
||||||
|
lowestk = k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return lowestk
|
||||||
|
end
|
||||||
|
|
||||||
|
return color
|
@ -3,7 +3,7 @@ local random = {}
|
|||||||
function random.uuid()
|
function random.uuid()
|
||||||
local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
|
local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
|
||||||
return string.gsub(template, '[xy]', function (c)
|
return string.gsub(template, '[xy]', function (c)
|
||||||
local v = (c == 'x') and random(0, 0xf) or random(8, 0xb)
|
local v = (c == 'x') and math.random(0, 0xf) or math.random(8, 0xb)
|
||||||
return string.format('%x', v)
|
return string.format('%x', v)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user