From 01a9284e1c22febc9f2d75fa0821a47016120053 Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Sat, 16 Apr 2016 05:31:39 +0300 Subject: [PATCH] afae --- Applications/MultiScreen/MultiScreen.lua | 502 ++++++++++++----------- 1 file changed, 253 insertions(+), 249 deletions(-) diff --git a/Applications/MultiScreen/MultiScreen.lua b/Applications/MultiScreen/MultiScreen.lua index ed98abce..af312138 100644 --- a/Applications/MultiScreen/MultiScreen.lua +++ b/Applications/MultiScreen/MultiScreen.lua @@ -14,15 +14,15 @@ local pathToMultiScreenFolder = "MultiScreen/" local pathToConfigFile = pathToMultiScreenFolder .. "Config.cfg" local colors = { - background = 0x262626, - foreground = 0xDDDDDD, - currentScreen = ecs.colors.green, - screen = 0xDDDDDD, + background = 0x262626, + foreground = 0xDDDDDD, + currentScreen = ecs.colors.green, + screen = 0xDDDDDD, } local baseResolution = { - width = 135, - height = 50, + width = 135, + height = 50, } local monitors = {} @@ -30,158 +30,158 @@ local monitors = {} -------------------------------------------------------------------------------------------------------------------------------------------- local function getAllConnectedScreens() - local massiv = {} - for address in pairs(components.list("screen")) do - table.insert(massiv, address) - end - return massiv + 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) + 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 + 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) + baseResolution.width, baseResolution.height = math.floor(baseResolution.width * scale), math.floor(baseResolution.height * scale) - -- ecs.error(baseResolution.width .. "x" ..baseResolution.height .. " ccale = " ..scale) + -- ecs.error(baseResolution.width .. "x" ..baseResolution.height .. " ccale = " ..scale) - local countOfConnectedScreens = #getAllConnectedScreens() + 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 + 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 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 + 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 + gpu.setBackground(colors.background) + gpu.setForeground(colors.foreground) + ecs.centerText("x", ySize - 5, "Начинаем процесс калибровки. Коснитесь монитора, подсвеченного зеленым цветом.") + ecs.centerText("x", ySize - 4, "Не нарушайте порядок прокосновений!") + end - local touchArray = {} + 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] + 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) + 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 + 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 + 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, "Отлично"}}) + 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() + 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() + 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 + 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 -------------------------------------------------------------------------------------------------------------------------------------------- @@ -191,165 +191,165 @@ local currentBackground, currentForeground, currentAddress = 0x000000, 0xffffff, local multiScreen = {} function multiScreen.setBackground(color) - currentBackground = color + currentBackground = color end function multiScreen.setForeground(color) - currentForeground = 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 + 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) + -- print("x = " .. x) + -- print("y = " .. y) + -- print("xMonitor = " .. xMonitor) + -- print("yMonitor = " .. yMonitor) + -- print("xPos = " .. xPos) + -- print("yPos = " .. yPos) - return xMonitor, yMonitor, xPos, 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 + 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 monitors[xMonitor] and monitors[xMonitor][yMonitor] then - 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 + for i = 1, unicode.len(text) do + local xMonitor, yMonitor, xPos, yPos = getMonitorAndCoordinates(x + i - 1, y) + + if monitors[xMonitor] and monitors[xMonitor][yMonitor] then + 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 end -------------------------------------------------------------------------------------------------------------------------------------------- --Склеить байты и создать из них число local function mergeBytesToNumber(...) - local bytes = {...} - local finalNumber = bytes[1] - for i = 2, #bytes do - finalNumber = bit32.bor(bit32.lshift(finalNumber, 8), bytes[i]) - end - return finalNumber + local bytes = {...} + local finalNumber = bytes[1] + for i = 2, #bytes do + finalNumber = bit32.bor(bit32.lshift(finalNumber, 8), bytes[i]) + end + return finalNumber end --Прочитать n байтов из файла, возвращает прочитанные байты как число, если не удалось прочитать, то возвращает 0 local function readBytes(file, count) - local readedBytes = file:read(count) - return mergeBytesToNumber(string.byte(readedBytes, 1, count)) + local readedBytes = file:read(count) + return mergeBytesToNumber(string.byte(readedBytes, 1, count)) end local function selectTerminateBit_l() - local prevByte = nil - local prevTerminateBit = nil + local prevByte = nil + local prevTerminateBit = nil - return function( byte ) - local x, terminateBit = nil - if ( prevByte == byte ) then - return prevTerminateBit - end + return function( byte ) + local x, terminateBit = nil + if ( prevByte == byte ) then + return prevTerminateBit + end - x = bit32.band( bit32.bnot(byte), 0x000000FF ) - x = bit32.bor( x, bit32.rshift(x, 1) ) - x = bit32.bor( x, bit32.rshift(x, 2) ) - x = bit32.bor( x, bit32.rshift(x, 4) ) - x = bit32.bor( x, bit32.rshift(x, 8) ) - x = bit32.bor( x, bit32.rshift(x, 16) ) + x = bit32.band( bit32.bnot(byte), 0x000000FF ) + x = bit32.bor( x, bit32.rshift(x, 1) ) + x = bit32.bor( x, bit32.rshift(x, 2) ) + x = bit32.bor( x, bit32.rshift(x, 4) ) + x = bit32.bor( x, bit32.rshift(x, 8) ) + x = bit32.bor( x, bit32.rshift(x, 16) ) - terminateBit = x - bit32.rshift(x, 1) + terminateBit = x - bit32.rshift(x, 1) - prevByte = byte - prevTerminateBit = terminateBit + prevByte = byte + prevTerminateBit = terminateBit - return terminateBit - end + return terminateBit + end end local selectTerminateBit = selectTerminateBit_l() --Декодирование UTF-8 символа local function decodeChar(file) - local first_byte = readBytes(file, 1) - local charcode_array = {first_byte} - local len = 1 + local first_byte = readBytes(file, 1) + local charcode_array = {first_byte} + local len = 1 - local middle = selectTerminateBit(first_byte) - if ( middle == 32 ) then - len = 2 - elseif ( middle == 16 ) then - len = 3 - elseif ( middle == 8 ) then - len = 4 - elseif ( middle == 4 ) then - len = 5 - elseif ( middle == 2 ) then - len = 6 - end + local middle = selectTerminateBit(first_byte) + if ( middle == 32 ) then + len = 2 + elseif ( middle == 16 ) then + len = 3 + elseif ( middle == 8 ) then + len = 4 + elseif ( middle == 4 ) then + len = 5 + elseif ( middle == 2 ) then + len = 6 + end - for i = 1, len-1 do - table.insert( charcode_array, readBytes(file, 1) ) - end + for i = 1, len-1 do + table.insert( charcode_array, readBytes(file, 1) ) + end - return string.char( table.unpack( charcode_array ) ) + return string.char( table.unpack( charcode_array ) ) end local function drawBigImageFromOCIFRawFile(x, y, path) - local file = io.open(path, "rb") - print("Открываем файл " .. path) - --Читаем ширину и высоту файла - local signature = file:read(4) - print("Читаем сигнатуру файла: " .. signature) - local encodingMethod = string.byte(file:read(1)) - print("Читаем метод кодирования: " .. encodingMethod) + local file = io.open(path, "rb") + print("Открываем файл " .. path) + --Читаем ширину и высоту файла + local signature = file:read(4) + print("Читаем сигнатуру файла: " .. signature) + local encodingMethod = string.byte(file:read(1)) + print("Читаем метод кодирования: " .. encodingMethod) - if encodingMethod ~= 5 then error("Неподдерживаемый метод кодирования: " .. encodingMethod) end + if encodingMethod ~= 5 then error("Неподдерживаемый метод кодирования: " .. encodingMethod) end - local width = readBytes(file, 2) - local height = readBytes(file, 2) + local width = readBytes(file, 2) + local height = readBytes(file, 2) - print("Ширина пикчи: " .. tostring(width)) - print("Высота пикчи: " .. tostring(height)) + print("Ширина пикчи: " .. tostring(width)) + print("Высота пикчи: " .. tostring(height)) - print("Начинаю отросовку пикчи...") + print("Начинаю отросовку пикчи...") - for j = 1, height do - for i = 1, width do - local background = readBytes(file, 3) - local foreground = readBytes(file, 3) - local alpha = readBytes(file, 1) - local symbol = decodeChar( file ) + for j = 1, height do + for i = 1, width do + local background = readBytes(file, 3) + local foreground = readBytes(file, 3) + local alpha = readBytes(file, 1) + local symbol = decodeChar( file ) - multiScreen.setBackground(background) - multiScreen.setForeground(foreground) - multiScreen.set(x + i - 1, y + j - 1, symbol) - end - end + multiScreen.setBackground(background) + multiScreen.setForeground(foreground) + multiScreen.set(x + i - 1, y + j - 1, symbol) + end + end - file:close() + file:close() - print("Отрисовка пикчи завершена") + print("Отрисовка пикчи завершена") end -------------------------------------------------------------------------------------------------------------------------------------------- @@ -357,16 +357,20 @@ end local args = {...} if args[1] == "draw" and args[2] then - loadConfig() - multiScreen.clear(0x000000) - drawBigImageFromOCIFRawFile(1, 1, args[2]) + loadConfig() + multiScreen.clear(0x000000) + drawBigImageFromOCIFRawFile(1, 1, args[2]) elseif args[1] == "calibrate" then - fs.remove(pathToMultiScreenFolder) - loadConfig() + fs.remove(pathToMultiScreenFolder) + loadConfig() +elseif args[1] == "clear" then + loadConfig() + multiScreen.clear(tonumber(args[2] or 0x000000)) else - print("Использование программы:") - print(" MultiScreen draw <путь к изображению> - отобразить изображение из файла на мониторах") - print(" MultiScreen calibrate - перекалибровать мониторы") + print("Использование программы:") + print(" MultiScreen calibrate - перекалибровать мониторы") + print(" MultiScreen draw <путь к изображению> - отобразить изображение из файла на мониторах") + print(" MultiScreen clear <цвет> - очистить мониторы с указанным цветом (черным по умолчанию)") end --------------------------------------------------------------------------------------------------------------------------------------------