Compare commits

..

No commits in common. "5dd175bb0074e401359573b14b95b9a9bf793214" and "c8806be02da5fa230a0b79c468817d802a14a863" have entirely different histories.

2 changed files with 15 additions and 21 deletions

View File

@ -14,7 +14,9 @@ The master node must have a modem attached and be within range of all slave node
## Communication Protocol
Messages are sent over rednet with the protocol `ccstoragenet`.
Port 42914 is used for Master => Slave broadcasting
Port 42915 is used for Slave => Master return broadcasting
### Packet Format
@ -50,15 +52,17 @@ Packet format is uniform between master <-> slaves and is structured like so:
| `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 and immediately listens for messages
* The slave starts up
### Master Node Initialization
* The master node starts up
* The master node sends a packet with type `ping`.
* The master node listens for `pong` packets from all slaves.
* The master node listens for `pong` packets for a configurable timeout.
* The `sourceid` of all `pong` packets is recorded for statistics displays. This cached data is only used for user display. Node availability is evaluated at request time.
### Inventory Search (query)

View File

@ -22,7 +22,6 @@ print("Computer " .. os.getComputerID() .. " configured as " .. mode)
modem = peripheral.find("modem") or error("No modem attached", 0)
modem_side = peripheral.getName(modem)
-- Master globals
m_slaves = {}
-- Slave globals
-- Common functions
@ -37,11 +36,11 @@ function c_waitForMessage()
local sender, message = rednet.receive(packet_magic, 1)
if message then
if
(not message["type"]) or -- Message type is required
(message["sourcetype"] == mode) or -- Ignore packets from our class of machines
(message["networkid"] ~= networkid) or -- Ignore packets from other networks
(message["targetid"] and message["targetid"] ~= os.getComputerID) -- Ignore packets for other machines
(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
return message
@ -59,7 +58,7 @@ function c_sendMessage(message)
for k,v in pairs(message) do
msg[k] = v
end
--print("Transmitting message: " .. textutils.serialize(msg))
print("Transmitting message: " .. textutils.serialize(msg))
rednet.broadcast(msg, packet_magic)
end
@ -72,18 +71,9 @@ function m_loop()
return
end
if msg["type"] == "pong" then
local source = msg["sourceid"]
print("Received pong from slave: " .. source)
m_slaves[source] = source
print("Received pong from slave: " .. msg["sourceid"])
end
end
function m_ping()
-- Clear out the list of all slaves and send out a fresh ping
-- Ping information isn't used for much, so delay in clearing cache and
-- repopulating the data isn't a big deal.
m_slaves = {}
c_sendMessage({type="ping"})
end
-- Slave functions
function s_loop()
@ -109,8 +99,8 @@ function main ()
rednet.open(modem_side)
print("Pinging for slaves...")
m_ping()
c_sendMessage({type="ping"})
print("Entering main loop")
c_mainLoop(m_loop)
elseif (mode == "slave") then