From 78be72c4b18d2b2cfaf369db9c11b1418bb5da14 Mon Sep 17 00:00:00 2001 From: Jacob Babor Date: Mon, 26 Feb 2024 00:20:08 -0600 Subject: [PATCH] Move to rednet This sucks. It has broadcast, which is required for the project, but if you're not listening when a packet ships then you drop it --- storage-net/README.md | 6 +++-- storage-net/common.lua | 61 +++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 35 deletions(-) diff --git a/storage-net/README.md b/storage-net/README.md index bba53fa..644bf63 100644 --- a/storage-net/README.md +++ b/storage-net/README.md @@ -25,9 +25,9 @@ Packet format is uniform between master <-> slaves and is structured like so: ``` { // Metadata - magic: str("ccstoragenet") networkid: int() sourceid: int() + sourcetype: str() destid: int() // Payload @@ -43,15 +43,17 @@ Packet format is uniform between master <-> slaves and is structured like so: | Name | Required? | Type | Description | :-- | :--: | :-- | :-- -| `magic` | true | string | Must be `ccstoragenet`. If it is not, the packet is immediately discarded | | `networkid` | true | int | The ID of the network | | `sourceid` | true | int | The CC ID of the machine sending the packet | +| `sourcetype` | true | string | The mode of the machine sending the packet | | `destid` | true | int | The CC ID of the intended recipient of the packet | | `type` | true | string | An arbitrary string literal corresponding to the type of the request. Common examplse include `ping`, `query`, etc. | | `itemname` | false | string | The unlocalized name of an item. Used for querying, crafting, movement, etc. | | `itemquant` | false | int | Quantity of the aforementioned item | | `destination` | false | int | The CC ID of the intended recipient of the item | +Messages are sent over rednet with the protocol `ccstoragenet`. + ### Slave Node Initialization * The slave starts up diff --git a/storage-net/common.lua b/storage-net/common.lua index 0b036da..716f9c7 100644 --- a/storage-net/common.lua +++ b/storage-net/common.lua @@ -20,6 +20,7 @@ print("Computer " .. os.getComputerID() .. " configured as " .. mode) -- Common globals modem = peripheral.find("modem") or error("No modem attached", 0) +modem_side = peripheral.getName(modem) -- Master globals -- Slave globals @@ -33,13 +34,13 @@ function c_mainLoop(loopfunc) end function c_waitForMessage() -- Waits for a message on the modem, timing out after 1 second - local timeout = os.startTimer(1) - local event, side, channel, replyChannel, message, distance = os.pullEvent() - if (event == "modem_message") then + local sender, message = rednet.receive(packet_magic, 1) + if message then if - (message["magic"] ~= packet_magic) or -- Magic is required per packet spec - (not message["type"]) -- Message type is required - then + (not message["type"]) or -- Message type is required + (message["sourcetype"] == mode) or -- Ignore packets from our class of machines + (message["networkid"] ~= networkid) -- Ignore packets from other networks + then print("Discarded nonconformant message") return nil end @@ -50,76 +51,70 @@ end function c_sendMessage(message) -- Sends a message, either to the master or all slaves depending on mode local msg = { - magic = packet_magic, networkid = networkid, sourceid = os.getComputerID(), - --destid is optional + sourcetype = mode, } -- Override basic message object with args for k,v in pairs(message) do msg[k] = v end print("Transmitting message: " .. textutils.serialize(msg)) - -- Transmit on different ports depending on mode - if (mode == "master") then - modem.transmit(port_broadcast, port_return, msg) - elseif (mode == "slave") then - modem.transmit(port_return, port_broadcast, msg) - end + rednet.broadcast(msg, packet_magic) end + -- Master functions function m_loop() -- The main loop of the master server -- Listen for packets on the return net - msg = c_waitForMessage() - if not msg then return end - sleep(1) + local msg = c_waitForMessage() + if not msg then + sleep(1) + return + end + if msg["type"] == "pong" then + print("Received pong from slave: " .. msg["sourceid"]) + end end + -- Slave functions function s_loop() -- The main loop of any slave nodes -- Listen for packets from the master - msg = c_waitForMessage() + local msg = c_waitForMessage() if not msg then - print(".") + sleep(1) return end - if (msg[type] == "ping") then + if (msg["type"] == "ping") then -- Respond to pings with pongs - print("Received ping") + print("Received ping from master: " .. msg["sourceid"]) c_sendMessage({type="pong"}) + else + print("Unknown message: " .. textutils.serialize(msg)) end - sleep(1) end -- Application entrypoint function main () if (mode == "master") then print("Beginning initialization as master...") - modem.open(port_return) + rednet.open(modem_side) print("Pinging for slaves...") c_sendMessage({type="ping"}) - sleep(3) - local msg = true - while msg ~= nil do - msg = c_waitForMessage() - if (msg and msg[type] == "pong") then - print("Received pong from " .. msg["sourceid"]) - end - end + print("Entering main loop") c_mainLoop(m_loop) elseif (mode == "slave") then print("Beginning initialization as slave...") - modem.open(port_broadcast) + rednet.open(modem_side) print("Entering main loop") c_mainLoop(s_loop) else error("Invalid mode: " .. mode .. ", please configure this node appropriately", 0) end - modem.closeAll() end main() \ No newline at end of file