MineOS/lib/multiScreen.lua
Igor Timofeev 4e571a2aeb aefaef
2015-12-01 21:44:05 +03:00

295 lines
11 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local ecs = require("ECSAPI")
local components = require("component")
local serialization = require("serialization")
local fs = require("filesystem")
local event = require("event")
local unicode = require("unicode")
local image = require("image")
--------------------------------------------------------------------------------------------------------------------------------------------
local pathToMultiScreenFolder = "MineOS/System/MultiScreen/"
local pathToConfigFile = pathToMultiScreenFolder .. "Config.cfg"
local colors = {
background = 0x262626,
foreground = 0xDDDDDD,
currentScreen = ecs.colors.green,
screen = 0xDDDDDD,
}
local baseResolution = {
width = 135,
height = 50,
}
local monitors = {}
--------------------------------------------------------------------------------------------------------------------------------------------
local function getAllConnectedScreens()
local massiv = {}
for address in pairs(components.list("screen")) do
table.insert(massiv, address)
end
return massiv
end
local function configurator()
fs.makeDirectory(pathToMultiScreenFolder)
ecs.setScale(0.7)
local data = ecs.universalWindow("auto", "auto", 40, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x880000, "Здорово, ебана!"}, {"EmptyLine"}, {"WrappedText", 0x262626, "Добро пожаловать в программу конфигурации мультимонитора. Вам необходимо указать количество мониторов по ширине и высоте, которые вы желаете объединить, а также выбрать желаемый масштаб."}, {"EmptyLine"}, {"Input", 0x262626, 0x880000, "Ширина"}, {"Input", 0x262626, 0x880000, "Высота"}, {"Slider", 0x262626, 0x880000, 1, 100, 100, "Масштаб: ", "%"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "Подтвердить"}, {0x777777, 0xffffff, "Отмена"}})
local width, height, scale = tonumber(data[1]), tonumber(data[2]), tonumber(data[3]) / 100
if data[4] == "Отмена" then
ecs.prepareToExit()
print("Калибровка отменена!")
os.exit()
end
baseResolution.width, baseResolution.height = math.floor(baseResolution.width * scale), math.floor(baseResolution.height * scale)
-- ecs.error(baseResolution.width .. "x" ..baseResolution.height .. " ccale = " ..scale)
local countOfConnectedScreens = #getAllConnectedScreens()
while ((countOfConnectedScreens - 1) ~= width * height) do
data = ecs.universalWindow("auto", "auto", 44, 0xeeeeee, true, {"EmptyLine"}, {"WrappedText", 0x262626, "Теперь вам необходимо подключить внешние мониторы. Вы указали, что собираетесь сделать мультимонитор из " .. width*height .. " мониторов, но на данный момент вы подключили " .. countOfConnectedScreens - 1 .. " мониторов. Так что подключайте все так, как указали, и жмите \"Далее\"."}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "Далее"}, {0x777777, 0xffffff, "Отмена"}})
if data[1] == "Отмена" then
ecs.prepareToExit()
print("Калибровка отменена!")
os.exit()
end
countOfConnectedScreens = #getAllConnectedScreens()
end
----
local w, h = 8, 3
local xC, yC = 1, 1
local xSize, ySize = gpu.getResolution()
local mainScreenAddress = gpu.getScreen()
local function drawMonitors()
ecs.clearScreen(colors.background)
local x, y = 3, 2
local xPos, yPos = x, y
for j = 1, height do
for i = 1, width do
if j == yC and i == xC then
ecs.square(xPos, yPos, w, h, colors.currentScreen)
else
ecs.square(xPos, yPos, w, h, colors.screen)
end
xPos = xPos + w + 2
end
yPos = yPos + h + 1
xPos = x
end
gpu.setBackground(colors.background)
gpu.setForeground(colors.foreground)
ecs.centerText("x", ySize - 5, "Начинаем процесс калибровки. Коснитесь монитора, подсвеченного зеленым цветом.")
ecs.centerText("x", ySize - 4, "Не нарушайте порядок прокосновений!")
end
local touchArray = {}
while xC <= width and yC <= height do
drawMonitors()
local e = {event.pull()}
if e[1] == "touch" then
if e[2] ~= mainScreenAddress then
local success = true
for i = 1, #touchArray do
if touchArray[i] == e[2] then
success = false
break
end
end
if success then
ecs.rebindGPU(e[2])
gpu.setResolution(baseResolution.width, baseResolution.height)
local color = math.random(0x555555, 0xffffff)
ecs.square(1,1,160,50,color)
gpu.setForeground(0xffffff - color)
ecs.centerText("xy", 0, "Монитор " .. xC .. "x" .. yC .. " откалиброван!")
-- table.insert(touchArray, {address = e[2], position = {x = xC, y = yC}})
touchArray[xC] = touchArray[xC] or {}
touchArray[xC][yC] = touchArray[xC][yC] or {}
touchArray[xC][yC].address = e[2]
ecs.rebindGPU(mainScreenAddress)
ecs.setScale(0.7)
xC = xC + 1
if xC > width and yC < height then xC = 1; yC = yC + 1 end
else
ecs.error("Тупая скотина, зачем ты тыкаешь на монитор, которого уже касался? На твое счастье в этой проге есть защита от конченных дебилов вроде тебя.")
end
else
ecs.error("Ну что ты за мудак криворукий! Сказано же, каких мониторов касаться. Не трогай этот монитор.")
end
end
end
monitors = touchArray
monitors.countOfScreensByWidth = width
monitors.countOfScreensByHeight = height
monitors.screenResolutionByWidth = baseResolution.width
monitors.screenResolutionByHeight = baseResolution.height
monitors.totalResolutionByWidth = baseResolution.width * width
monitors.totalResolutionByHeight = baseResolution.height * height
ecs.prepareToExit()
ecs.universalWindow("auto", "auto", 40, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x262626, "Калибровка успешно завершена!"}, {"EmptyLine"}, {"Button", {ecs.colors.orange, 0xffffff, "Отлично"}})
gpu.setBackground(0x000000)
for x = 1, #monitors do
for y = 1, #monitors[x] do
gpu.bind(monitors[x][y].address)
gpu.fill(1, 1, 160, 50, " ")
end
end
gpu.bind(mainScreenAddress)
ecs.prepareToExit()
end
local function saveConfig()
local file = io.open(pathToConfigFile, "w")
file:write(serialization.serialize(monitors))
file:close()
end
local function loadConfig()
if fs.exists(pathToConfigFile) then
local file = io.open(pathToConfigFile, "r")
monitors = serialization.unserialize(file:read("*a"))
file:close()
print(" ")
print("Файл конфигурации мультимонитора успешно загружен.")
print(" ")
print("Количество экранов: " .. monitors.countOfScreensByWidth .. "x" .. monitors.countOfScreensByHeight .. " шт")
print("Разрешение каждого экрана: " .. monitors.screenResolutionByWidth .. "x" .. monitors.screenResolutionByHeight .. " px")
print("Суммарного разрешение кластера: ".. monitors.totalResolutionByWidth .. "x" .. monitors.totalResolutionByHeight .. " px")
print(" ")
else
configurator()
saveConfig()
loadConfig()
end
end
--------------------------------------------------------------------------------------------------------------------------------------------
local currentBackground, currentForeground, currentAddress = 0x000000, 0xffffff, ""
local multiScreen = {}
function multiScreen.setBackground(color)
currentBackground = color
end
function multiScreen.setForeground(color)
currentForeground = color
end
local function getMonitorAndCoordinates(x, y)
local xMonitor = math.ceil(x / monitors.screenResolutionByWidth)
local yMonitor = math.ceil(y / monitors.screenResolutionByHeight)
local xPos = x - (xMonitor - 1) * monitors.screenResolutionByWidth
local yPos = y - (yMonitor - 1) * monitors.screenResolutionByHeight
-- print("x = " .. x)
-- print("y = " .. y)
-- print("xMonitor = " .. xMonitor)
-- print("yMonitor = " .. yMonitor)
-- print("xPos = " .. xPos)
-- print("yPos = " .. yPos)
return xMonitor, yMonitor, xPos, yPos
end
function multiScreen.clear(color)
for x = 1, #monitors do
for y = 1, #monitors[x] do
gpu.bind(monitors[x][y].address)
gpu.setResolution(monitors.screenResolutionByWidth, monitors.screenResolutionByHeight)
gpu.setBackground(color)
gpu.fill(1, 1, 160, 50, " ")
end
end
end
function multiScreen.set(x, y, text)
for i = 1, unicode.len(text) do
local xMonitor, yMonitor, xPos, yPos = getMonitorAndCoordinates(x + i - 1, y)
if currentAddress ~= monitors[xMonitor][yMonitor].address then
gpu.bind(monitors[xMonitor][yMonitor].address)
currentAddress = monitors[xMonitor][yMonitor].address
gpu.setResolution(monitors.screenResolutionByWidth, monitors.screenResolutionByHeight)
end
if gpu.getBackground ~= currentBackground then gpu.setBackground(currentBackground) end
if gpu.getForeground ~= currentForeground then gpu.setForeground(currentForeground) end
gpu.set(xPos, yPos, unicode.sub(text, i, i))
end
end
function multiScreen.image(x, y, picture)
local sizeOfPixelData = 4
local function convertIndexToCoords(index)
index = (index + sizeOfPixelData - 1) / sizeOfPixelData
local ostatok = index % picture.width
local x = (ostatok == 0) and picture.width or ostatok
local y = math.ceil(index / picture.width)
ostatok = nil
return x, y
end
local function convertCoordsToIndex(x, y)
return (picture.width * (y - 1) + x) * sizeOfPixelData - sizeOfPixelData + 1
end
local xPos, yPos
for i = 1, #picture, sizeOfPixelData do
xPos, yPos = convertIndexToCoords(i)
if picture[i + 2] ~= 0xff then
multiScreen.setBackground(picture[i])
multiScreen.setForeground(picture[i + 1])
multiScreen.set(x + xPos - 1, y + yPos - 1, picture[i + 3])
end
end
end
--------------------------------------------------------------------------------------------------------------------------------------------
loadConfig()
multiScreen.clear(0x000000)
local picture = image.load("4.png")
multiScreen.image(2, 2, picture)
-- multiScreen.setBackground(ecs.colors.green)
-- multiScreen.setForeground(ecs.colors.white)
-- multiScreen.set(130, 2, "Сука мать ебал, пидор ты ебаный, хыыы!")
-- multiScreen.set(230, 4, "Сука мать ебал, пидор ты ебаный, хыыы!")
--------------------------------------------------------------------------------------------------------------------------------------------
return multiScreen