From aa3bcb7545490d94850ec9339b45fcdb67caf087 Mon Sep 17 00:00:00 2001 From: Igor Date: Wed, 2 Mar 2016 13:19:36 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B0=D1=84=D1=83=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modemConnection.lua | 160 +++++++++++++++++++++++++--------------- 1 file changed, 99 insertions(+), 61 deletions(-) diff --git a/lib/modemConnection.lua b/lib/modemConnection.lua index a66cfa2d..e822c38d 100644 --- a/lib/modemConnection.lua +++ b/lib/modemConnection.lua @@ -7,7 +7,7 @@ local unicode = require("unicode") local ecs, image local modem = component.modem local gpu = component.gpu -local wirelessConnection = {} +local modemConnection = {} ---------------------------------------------------------------------------------------------------------------------------------- @@ -16,18 +16,22 @@ local infoMessages = { noModem = "Этой библиотеке требуется сетевая карта для работы", } -wirelessConnection.port = 322 -wirelessConnection.sendingDataDelay = 1.0 -wirelessConnection.receiveMessagesFromRobots = true +modemConnection.port = 322 +modemConnection.sendingDataDelay = 1.0 +modemConnection.receiveMessagesFromRobots = true +modemConnection.receiveMessagesFromTablets = true +modemConnection.receiveMessagesFromComputers = true ---------------------------------------------------------------------------------------------------------------------------------- local xSize, ySize = gpu.getResolution() -local computerIcon +local computerIcon, robotIcon, tabletIcon if not component.isAvailable("robot") then image = require("image") ecs = require("ECSAPI") computerIcon = image.load("MineOS/System/OS/Icons/Script.pic") + robotIcon = image.load("MineOS/System/OS/Icons/Robot.pic") + tabletIcon = image.load("MineOS/System/OS/Icons/Tablet.pic") end ---------------------------------------------------------------------------------------------------------------------------------- @@ -55,21 +59,27 @@ end local function modemMessageHandler(_, localAddress, remoteAddress, port, distance, ...) local messages = {...} if #messages > 0 then - if port == wirelessConnection.port then + if port == modemConnection.port then if messages[1] == "requestingPermissionToConnect" then askForConnection(messages[2]) elseif messages[1] == "iAmHereAddMePlease" then - if not wirelessConnection.availableUsers[remoteAddress] then + if not modemConnection.availableUsers[remoteAddress] then local userData = serialization.unserialize(messages[2]) - if not userData.isRobot or (userData.isRobot and wirelessConnection.receiveMessagesFromRobots) then - wirelessConnection.availableUsers[userData.address] = userData - modem.send(remoteAddress, wirelessConnection.port, "iAmHereAddMePlease", wirelessConnection.dataToSend) + if + (not userData.isRobot and not userData.isTablet and modemConnection.receiveMessagesFromComputers) + or + (userData.isRobot and modemConnection.receiveMessagesFromRobots) + or + (userData.isTablet and modemConnection.receiveMessagesFromTablets) + then + modemConnection.availableUsers[userData.address] = userData + modem.send(remoteAddress, modemConnection.port, "iAmHereAddMePlease", modemConnection.dataToSend) computer.pushSignal("userlistChanged") end end elseif messages[1] == "iAmDisconnecting" then - if wirelessConnection.availableUsers[remoteAddress] then - wirelessConnection.availableUsers[remoteAddress] = nil + if modemConnection.availableUsers[remoteAddress] then + modemConnection.availableUsers[remoteAddress] = nil computer.pushSignal("userlistChanged") end end @@ -78,25 +88,44 @@ local function modemMessageHandler(_, localAddress, remoteAddress, port, distanc end local function createSendingArray() - wirelessConnection.dataToSend = {} - wirelessConnection.dataToSend.address = wirelessConnection.localAddress - wirelessConnection.dataToSend.name = component.filesystem.getLabel() + modemConnection.dataToSend = {} + modemConnection.dataToSend.address = modemConnection.localAddress + modemConnection.dataToSend.name = component.filesystem.getLabel() + if component.isAvailable("robot") then - wirelessConnection.dataToSend.isRobot = true + modemConnection.dataToSend.isRobot = true if component.isAvailable("inventory_controller") then - wirelessConnection.dataToSend.inventoryController = true + modemConnection.dataToSend.inventoryController = true end + if component.isAvailable("tank_controller") then - wirelessConnection.dataToSend.tankController = true + modemConnection.dataToSend.tankController = true end + if component.isAvailable("crafting") then - wirelessConnection.dataToSend.crafting = true + modemConnection.dataToSend.crafting = true end + if component.isAvailable("redstone") then - wirelessConnection.dataToSend.redstone = true + modemConnection.dataToSend.redstone = true end end - wirelessConnection.dataToSend = serialization.serialize(wirelessConnection.dataToSend) + + if component.isAvailable("tablet") then + modemConnection.dataToSend.isTablet = true + if component.isAvailable("navigation") then + modemConnection.dataToSend.navigation = true + end + + if component.isAvailable("piston") then + modemConnection.dataToSend.piston = true + end + end + + if component.isAvailable("geolyzer") then + modemConnection.dataToSend.geolyzer = true + end + modemConnection.dataToSend = serialization.serialize(modemConnection.dataToSend) end --Нарисовать окружность, алгоритм спизжен с вики @@ -142,9 +171,17 @@ local function drawCircles(xCircle, yCircle, minumumRadius, maximumRadius, step, end end -local function drawIconAndAddress(x, y, background, foreground, text) - image.draw(x + 3, y, computerIcon) - ecs.colorTextWithBack(x, y + 5, foreground, background, ecs.stringLimit("end", text, 14)) +local function drawIconAndAddress(x, y, background, foreground, userData) + if userData.isRobot then + image.draw(x + 3, y, robotIcon) + elseif userData.isTablet then + image.draw(x + 3, y, tabletIcon) + else + image.draw(x + 3, y, computerIcon) + end + + ecs.colorTextWithBack(x, y + 5, foreground, background, ecs.stringLimit("end", userData.address, 14)) + return x, y, x + 13, y + 5 end @@ -156,7 +193,7 @@ local function drawHorizontalIcons() local iconWidth = 14 local spaceBetween = 2 - local totalWidth = ecs.getArraySize(wirelessConnection.availableUsers) * (iconWidth + spaceBetween) - spaceBetween + local totalWidth = ecs.getArraySize(modemConnection.availableUsers) * (iconWidth + spaceBetween) - spaceBetween local x = math.floor(xSize / 2 - totalWidth / 2) + 1 obj.Users = {} @@ -164,22 +201,23 @@ local function drawHorizontalIcons() local counter = 0 local limit = math.floor(xSize / (iconWidth + spaceBetween)) y = y + 1 - for address in pairs(wirelessConnection.availableUsers) do + for address in pairs(modemConnection.availableUsers) do if counter < limit then - newObj("Users", address, drawIconAndAddress(x, y, background, 0xFFFFFF, address)) + newObj("Users", address, drawIconAndAddress(x, y, background, 0xFFFFFF, modemConnection.availableUsers[address])) end x = x + iconWidth + spaceBetween counter = counter + 1 end end -local function drawSelectedIcon(x, y, background, foreground, text) +local function drawSelectedIcon(x, y, background, foreground, userData) local selectionWidth = 16 - local oldPixels = ecs.rememberOldPixels(x - 1, y, x + selectionWidth - 2, y + 13) - ecs.square(x - 1, y, selectionWidth, 8, background) - drawIconAndAddress(x, y + 1, background, foreground, text) - obj.CykaKnopkaInfo = { ecs.drawButton(x - 1, y + 8, selectionWidth, 3, "Информация", 0xff6699, 0xFFFFFF) } - obj.CykaKnopkaConnect = { ecs.drawButton(x - 1, y + 11, selectionWidth, 3, "Подключиться", 0xff3333, 0xFFFFFF) } + local skokaOtnat = (selectionWidth - 14) / 2 + local oldPixels = ecs.rememberOldPixels(x - skokaOtnat, y, x + selectionWidth - 2, y + 13) + ecs.square(x - skokaOtnat, y, selectionWidth, 8, background) + drawIconAndAddress(x, y + 1, background, foreground, userData) + obj.CykaKnopkaInfo = { ecs.drawButton(x - skokaOtnat, y + 8, selectionWidth, 3, "Информация", 0xff6699, 0xFFFFFF) } + obj.CykaKnopkaConnect = { ecs.drawButton(x - skokaOtnat, y + 11, selectionWidth, 3, "Подключиться", 0xff3333, 0xFFFFFF) } return oldPixels end @@ -191,10 +229,10 @@ local function connectionGUI() local step = 4 local currentRadius = minumumRadius - drawIconAndAddress(xCircle - 6, ySize - 6, 0xEEEEEE, 0x262626, wirelessConnection.localAddress) + drawIconAndAddress(xCircle - 6, ySize - 6, 0xEEEEEE, 0x262626, {address = modemConnection.localAddress}) while true do - if ecs.getArraySize(wirelessConnection.availableUsers) > 0 then + if ecs.getArraySize(modemConnection.availableUsers) > 0 then currentRadius = 0 drawCircles(xCircle, yCircle, minumumRadius, maximumRadius, step, currentRadius) @@ -203,9 +241,9 @@ local function connectionGUI() local oldPixels, needToUpdate while true do if not oldPixels and needToUpdate then - if ecs.getArraySize(wirelessConnection.availableUsers) <= 0 then + if ecs.getArraySize(modemConnection.availableUsers) <= 0 then ecs.square(1, 1, xSize, ySize, 0xEEEEEE) - drawIconAndAddress(xCircle - 6, ySize - 6, 0xEEEEEE, 0x262626, wirelessConnection.localAddress) + drawIconAndAddress(xCircle - 6, ySize - 6, 0xEEEEEE, 0x262626, {address = modemConnection.localAddress}) currentRadius = minumumRadius break else @@ -219,7 +257,7 @@ local function connectionGUI() if oldPixels then ecs.drawOldPixels(oldPixels); oldPixels = nil end for address in pairs(obj.Users) do if ecs.clickedAtArea(e[3], e[4], obj.Users[address][1], obj.Users[address][2], obj.Users[address][3], obj.Users[address][4]) then - oldPixels = drawSelectedIcon(obj.Users[address][1], obj.Users[address][2] - 1, 0xCCCCFF, 0x262626, address) + oldPixels = drawSelectedIcon(obj.Users[address][1], obj.Users[address][2] - 1, 0xCCCCFF, 0x262626, modemConnection.availableUsers[address]) break end end @@ -238,43 +276,43 @@ end ---------------------------------------------------------------------------------------------------------------------------------- -function wirelessConnection.stopReceivingData() +function modemConnection.stopReceivingData() event.ignore("modem_message", modemMessageHandler) end -function wirelessConnection.startReceivingData() - wirelessConnection.stopReceivingData() +function modemConnection.startReceivingData() + modemConnection.stopReceivingData() event.listen("modem_message", modemMessageHandler) end -function wirelessConnection.disconnect() - modem.broadcast(wirelessConnection.port, "iAmDisconnecting") +function modemConnection.disconnect() + modem.broadcast(modemConnection.port, "iAmDisconnecting") end -function wirelessConnection.sendPersonalData() - wirelessConnection.disconnect() - modem.broadcast(wirelessConnection.port, "iAmHereAddMePlease", wirelessConnection.dataToSend) +function modemConnection.sendPersonalData() + modemConnection.disconnect() + modem.broadcast(modemConnection.port, "iAmHereAddMePlease", modemConnection.dataToSend) end -function wirelessConnection.changePort(newPort) - modem.close(wirelessConnection.port) +function modemConnection.changePort(newPort) + modem.close(modemConnection.port) modem.open(newPort) - wirelessConnection.port = newPort - wirelessConnection.remoteAddress = nil - wirelessConnection.localAddress = component.getPrimary("modem").address - wirelessConnection.availableUsers = {} + modemConnection.port = newPort + modemConnection.remoteAddress = nil + modemConnection.localAddress = component.getPrimary("modem").address + modemConnection.availableUsers = {} createSendingArray() end -function wirelessConnection.connect() - wirelessConnection.sendPersonalData() +function modemConnection.search() + modemConnection.sendPersonalData() connectionGUI() end -function wirelessConnection.init() +function modemConnection.init() if component.isAvailable("modem") then - wirelessConnection.changePort(wirelessConnection.port) - wirelessConnection.startReceivingData() + modemConnection.changePort(modemConnection.port) + modemConnection.startReceivingData() else ecs.error(infoMessages.noModem) return @@ -283,11 +321,11 @@ end ---------------------------------------------------------------------------------------------------------------------------------- -wirelessConnection.init() -wirelessConnection.sendPersonalData() --- wirelessConnection.connect() +modemConnection.init() +modemConnection.sendPersonalData() +modemConnection.search() ---------------------------------------------------------------------------------------------------------------------------------- -return wirelessConnection +return modemConnection