forked from hkc/cc-stuff
BigTerm smoke test 1: enough to show CCPI
This commit is contained in:
parent
637827c6af
commit
2f889add9b
|
@ -0,0 +1,99 @@
|
||||||
|
local bigterm = require("bigterm")({
|
||||||
|
{ p = peripheral.wrap("monitor_1"), x = 1, y = 1 },
|
||||||
|
{ p = peripheral.wrap("monitor_2"), x = 2, y = 1 },
|
||||||
|
{ p = peripheral.wrap("monitor_3"), x = 1, y = 2 },
|
||||||
|
{ p = peripheral.wrap("monitor_4"), x = 2, y = 2 },
|
||||||
|
{ p = peripheral.wrap("monitor_5"), x = 1, y = 3 },
|
||||||
|
{ p = peripheral.wrap("monitor_6"), x = 2, y = 3 },
|
||||||
|
}, {
|
||||||
|
palette = {
|
||||||
|
[colors.white] = 0xEFEFEF,
|
||||||
|
[colors.orange] = 0xEF712A,
|
||||||
|
[colors.magenta] = 0xCF43EA,
|
||||||
|
[colors.lightBlue] = 0x5643EF,
|
||||||
|
[colors.yellow] = 0xEFCF42,
|
||||||
|
[colors.lime] = 0x43FA99,
|
||||||
|
[colors.pink] = 0xEF7192,
|
||||||
|
[colors.gray] = 0x676767,
|
||||||
|
[colors.lightGray] = 0xAAAAAA,
|
||||||
|
[colors.cyan] = 0x42DFFA,
|
||||||
|
[colors.blue] = 0x7853FF,
|
||||||
|
[colors.brown] = 0xb18624,
|
||||||
|
[colors.green] = 0x00FF00,
|
||||||
|
[colors.red] = 0xFF0000,
|
||||||
|
[colors.black] = 0x000000
|
||||||
|
},
|
||||||
|
scale = 0.5
|
||||||
|
})
|
||||||
|
|
||||||
|
bigterm._forEachMonitor(function(mon, i)
|
||||||
|
print(mon.x, mon.y, mon.p.getSize())
|
||||||
|
end)
|
||||||
|
|
||||||
|
--bigterm._blitpixel(1, 21, "A")
|
||||||
|
|
||||||
|
local w, h = bigterm.getSize()
|
||||||
|
print(w, h)
|
||||||
|
|
||||||
|
--for y = 1, h do
|
||||||
|
-- for x = 1, w do
|
||||||
|
-- bigterm._blitpixel(
|
||||||
|
-- x,
|
||||||
|
-- y,
|
||||||
|
-- string.char((x + y * 16 - 16) % 256),
|
||||||
|
-- string.format("%x", (x - y) % 16),
|
||||||
|
-- string.format("%x", (x + y) % 16)
|
||||||
|
-- )
|
||||||
|
-- end
|
||||||
|
--end
|
||||||
|
|
||||||
|
bigterm.setTextColor(colors.white)
|
||||||
|
bigterm.setBackgroundColor(colors.black)
|
||||||
|
|
||||||
|
bigterm.clear()
|
||||||
|
|
||||||
|
if false then
|
||||||
|
local lines = require("cc.strings").wrap(io.lines("cc-stuff/beemovie.txt")(), w)
|
||||||
|
for i, line in ipairs(lines) do
|
||||||
|
bigterm.setCursorPos(1, i)
|
||||||
|
bigterm.setTextColor(2 ^ (i % 2))
|
||||||
|
bigterm.write(line)
|
||||||
|
if i == h then break end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for t = 0, 31 do
|
||||||
|
for y = 1, h do
|
||||||
|
local res = {}
|
||||||
|
for x = 0, w do
|
||||||
|
table.insert(res, string.format("%x", bit.bxor(x, y * t + 1) % 16))
|
||||||
|
end
|
||||||
|
res = table.concat(res)
|
||||||
|
bigterm.setCursorPos(1, y)
|
||||||
|
bigterm.blit(res, res, string.rep("f", #res))
|
||||||
|
end
|
||||||
|
os.sleep(0.05)
|
||||||
|
end
|
||||||
|
|
||||||
|
local ccpi = require("ccpi")
|
||||||
|
local img = ccpi.load("cc-stuff/cute.cpi")
|
||||||
|
|
||||||
|
local ys = {}
|
||||||
|
for y = 1, img.h do table.insert(ys, y) end
|
||||||
|
|
||||||
|
for i = 1, #ys do
|
||||||
|
local a, b = math.random(1, #ys), math.random(1, #ys)
|
||||||
|
ys[a], ys[b] = ys[b], ys[a]
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, y in ipairs(ys) do
|
||||||
|
bigterm.setCursorPos(1, y)
|
||||||
|
bigterm.blit(img.lines[y].s, img.lines[y].fg, img.lines[y].bg)
|
||||||
|
os.sleep(0.05)
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1, 16 do
|
||||||
|
bigterm.setPaletteColor(bit.blshift(1, i - 1), img.palette[i])
|
||||||
|
os.sleep(0.10)
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
local expect = require("cc.expect").expect
|
||||||
|
local function todo() error("todo!") end
|
||||||
|
local pretty = require "cc.pretty"
|
||||||
|
|
||||||
|
local BigTerm = {
|
||||||
|
write = function(self, text)
|
||||||
|
local w = self.getSize()
|
||||||
|
for i = 1, #text do
|
||||||
|
if self._pos.x <= w then
|
||||||
|
self._blitpixel(
|
||||||
|
self._pos.x,
|
||||||
|
self._pos.y,
|
||||||
|
text:sub(i, i),
|
||||||
|
self._colorChar(self._colorForeground),
|
||||||
|
self._colorChar(self._colorBackground)
|
||||||
|
)
|
||||||
|
self._pos.x = self._pos.x + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
blit = function(self, text, foreground, background)
|
||||||
|
local x, y = self._pos.x, self._pos.y
|
||||||
|
local w = #text
|
||||||
|
local LIMIT = 0
|
||||||
|
local ox = 1
|
||||||
|
while w > 0 and LIMIT < 20 do
|
||||||
|
local mon, i, lx, ly = self._getMonitorForScreenPos(x, y)
|
||||||
|
if not mon then break end
|
||||||
|
local remaining = mon._w - lx
|
||||||
|
mon.p.setCursorPos(lx + 1, ly + 1)
|
||||||
|
mon.p.blit(
|
||||||
|
text:sub(ox, ox + w),
|
||||||
|
foreground:sub(ox, ox + w - 1),
|
||||||
|
background:sub(ox, ox + w - 1)
|
||||||
|
)
|
||||||
|
w = w - remaining
|
||||||
|
x = x + remaining
|
||||||
|
ox = ox + remaining
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
clear = function(self)
|
||||||
|
self._forEachMonitor(function(mon)
|
||||||
|
mon.p.clear()
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
clearLine = function(self) todo() end,
|
||||||
|
scroll = function(self, n)
|
||||||
|
-- TODO: NOPE! store framebuffer and write lines onto other screens
|
||||||
|
self._forEachMonitor(function(mon)
|
||||||
|
mon.p.scroll(n)
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
|
||||||
|
getCursorPos = function(self) return self._pos.x, self._pos.y end,
|
||||||
|
setCursorPos = function(self, x, y)
|
||||||
|
self._pos.x = x
|
||||||
|
self._pos.y = y
|
||||||
|
-- TODO: move cursor to the correct monitor and hide it from others
|
||||||
|
end,
|
||||||
|
|
||||||
|
setCursorBlink = function(self, state) todo() end,
|
||||||
|
getCursorBlink = function(self) todo() end,
|
||||||
|
|
||||||
|
isColor = function(self) return true end,
|
||||||
|
getSize = function(self)
|
||||||
|
local w, h = 0, 0
|
||||||
|
for ix = 1, self._w do
|
||||||
|
local mon = self._findMonitor(ix, 1)
|
||||||
|
w = w + mon._w
|
||||||
|
end
|
||||||
|
for iy = 1, self._h do
|
||||||
|
local mon = self._findMonitor(1, iy)
|
||||||
|
h = h + mon._h
|
||||||
|
end
|
||||||
|
return w, h
|
||||||
|
end,
|
||||||
|
|
||||||
|
setTextColor = function(self, fg)
|
||||||
|
self._forEachMonitor(function(mon)
|
||||||
|
mon.p.setTextColor(fg)
|
||||||
|
end)
|
||||||
|
self._colorForeground = fg
|
||||||
|
end,
|
||||||
|
getTextColor = function(self) todo() end,
|
||||||
|
|
||||||
|
setBackgroundColor = function(self, bg)
|
||||||
|
self._forEachMonitor(function(mon)
|
||||||
|
mon.p.setBackgroundColor(bg)
|
||||||
|
end)
|
||||||
|
self._colorBackground = bg
|
||||||
|
end,
|
||||||
|
getBackgroundColor = function(self) todo() end,
|
||||||
|
|
||||||
|
setTextScale = function(self, scale)
|
||||||
|
self._scale = scale
|
||||||
|
self._reset()
|
||||||
|
end,
|
||||||
|
getTextScale = function(self)
|
||||||
|
return self._scale
|
||||||
|
end,
|
||||||
|
|
||||||
|
setPaletteColor = function(self, index, color, g, b)
|
||||||
|
expect(1, index, "number")
|
||||||
|
expect(2, color, "number")
|
||||||
|
expect(3, g, "number", "nil")
|
||||||
|
expect(4, b, "number", "nil")
|
||||||
|
if index < 0 or index > 32768 or math.log(index, 2) % 1 ~= 0 then
|
||||||
|
error("index out of range")
|
||||||
|
end
|
||||||
|
|
||||||
|
local r = color
|
||||||
|
if g == nil or b == nil then
|
||||||
|
if color < 0 or color > 0xFFFFFF then
|
||||||
|
error("color out of range")
|
||||||
|
end
|
||||||
|
r = bit.band(0xFF, bit.brshift(color, 16)) / 255
|
||||||
|
g = bit.band(0xFF, bit.brshift(color, 8)) / 255
|
||||||
|
b = bit.band(0xFF, bit.brshift(color, 0)) / 255
|
||||||
|
else
|
||||||
|
if r < 0 or r > 1.0 then error("red channel out of range") end
|
||||||
|
if g < 0 or g > 1.0 then error("green channel out of range") end
|
||||||
|
if b < 0 or b > 1.0 then error("blue channel out of range") end
|
||||||
|
end
|
||||||
|
|
||||||
|
self._palette[index] = bit.bor(
|
||||||
|
bit.blshift(math.floor(r * 255), 16),
|
||||||
|
bit.blshift(math.floor(g * 255), 8),
|
||||||
|
bit.blshift(math.floor(b * 255), 0)
|
||||||
|
)
|
||||||
|
self._forEachMonitor(function(mon)
|
||||||
|
mon.p.setPaletteColor(index, r, g, b)
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
getPaletteColor = function(self, index) todo() end,
|
||||||
|
|
||||||
|
-- internals
|
||||||
|
|
||||||
|
_colorChar = function(self, v)
|
||||||
|
return string.format("%x", math.floor(math.log(v, 2)))
|
||||||
|
end,
|
||||||
|
|
||||||
|
_reset = function(self)
|
||||||
|
self._w = 1
|
||||||
|
self._h = 1
|
||||||
|
self._forEachMonitor(function(mon, i)
|
||||||
|
mon.p.setTextScale(self._scale)
|
||||||
|
local w, h = mon.p.getSize()
|
||||||
|
self._monitors[i]._w = w
|
||||||
|
self._monitors[i]._h = h
|
||||||
|
if mon.x > self._w then self._w = mon.x end
|
||||||
|
if mon.y > self._h then self._h = mon.y end
|
||||||
|
for id, color in pairs(self._palette) do
|
||||||
|
mon.p.setPaletteColor(id, color)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
|
||||||
|
_blitpixel = function(self, x, y, c, bg, fg)
|
||||||
|
bg = bg or "0"
|
||||||
|
fg = fg or "f"
|
||||||
|
local mon = self._getMonitorForScreenPos(x, y)
|
||||||
|
mon.p.setCursorPos(((x - 1) % mon._w) + 1, ((y - 1) % mon._h) + 1)
|
||||||
|
mon.p.blit(c, bg, fg)
|
||||||
|
end,
|
||||||
|
|
||||||
|
_findMonitor = function(self, x, y)
|
||||||
|
for i = 1, #self._monitors do
|
||||||
|
local mon = self._monitors[i]
|
||||||
|
if mon.x == x and mon.y == y then
|
||||||
|
return mon, i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
_getMonitorForScreenPos = function(self, x, y)
|
||||||
|
local oy = 1
|
||||||
|
for iy = 1, self._h do
|
||||||
|
local ox = 1
|
||||||
|
for ix = 1, self._w do
|
||||||
|
local mon, i = self._findMonitor(ix, iy)
|
||||||
|
if x >= ox and x < (ox + mon._w) and y >= oy and y < (oy + mon._h) then
|
||||||
|
return mon, i, x - ox, y - oy
|
||||||
|
end
|
||||||
|
ox = ox + mon._w
|
||||||
|
end
|
||||||
|
local mon, i = self._findMonitor(1, iy)
|
||||||
|
oy = oy + mon._h
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
_forEachMonitor = function(self, fun)
|
||||||
|
for i = 1, #self._monitors do
|
||||||
|
fun(self._monitors[i], i)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return function(monitors, args)
|
||||||
|
args = args or {}
|
||||||
|
local mon = setmetatable({
|
||||||
|
_monitors = monitors,
|
||||||
|
_pos = { x = 1, y = 1 },
|
||||||
|
_blink = false,
|
||||||
|
_colorForeground = colors.white,
|
||||||
|
_colorBackground = colors.black,
|
||||||
|
_scale = args.scale or 1.0,
|
||||||
|
_palette = args.palette or {},
|
||||||
|
}, { __index = BigTerm })
|
||||||
|
for name, method in pairs(BigTerm) do
|
||||||
|
if type(method) == "function" then
|
||||||
|
mon[name] = function(...) return method(mon, ...) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
mon._reset()
|
||||||
|
return mon
|
||||||
|
end
|
Loading…
Reference in New Issue