Guest User

Rednet API

a guest
May 29th, 2013
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.47 KB | None | 0 0
  1.  
  2. CHANNEL_BROADCAST = 65535
  3.  
  4. local tValidSides = {}
  5. for n,sSide in ipairs( rs.getSides() ) do
  6.     tValidSides[ sSide ] = true
  7. end
  8.  
  9. function open( sSide )
  10.     if type( sSide ) ~= "string" then
  11.         error( "string expected" )
  12.     end
  13.     if not tValidSides[sSide] then
  14.         error( "Invalid side" )
  15.     end
  16.     if peripheral.getType( sSide ) ~= "modem" then 
  17.         error( "No modem on "..sSide.." side" )
  18.     end
  19.     peripheral.call( sSide, "open", os.getComputerID() )
  20.     peripheral.call( sSide, "open", CHANNEL_BROADCAST )
  21. end
  22.  
  23. function close( sSide )
  24.     if type( sSide ) ~= "string" then
  25.         error( "string expected" )
  26.     end
  27.     if not tValidSides[sSide] then
  28.         error( "Invalid side" )
  29.     end
  30.     if peripheral.getType( sSide ) ~= "modem" then 
  31.         error( "No modem on "..sSide.." side" )
  32.     end
  33.     peripheral.call( sSide, "close", os.getComputerID() )
  34.     peripheral.call( sSide, "close", CHANNEL_BROADCAST )
  35. end
  36.  
  37. function isOpen( sSide )
  38.     if type( sSide ) ~= "string" then
  39.         error( "string expected" )
  40.     end
  41.     if not tValidSides[sSide] then
  42.         error( "Invalid side" )
  43.     end
  44.     if peripheral.getType( sSide ) == "modem" then 
  45.         return peripheral.call( sSide, "isOpen", os.getComputerID() ) and peripheral.call( sSide, "isOpen", CHANNEL_BROADCAST )
  46.     end
  47.     return false
  48. end
  49.  
  50. function send( nRecipient, sMessage )
  51.     for n,sSide in ipairs( rs.getSides() ) do
  52.         if isOpen( sSide ) then
  53.             peripheral.call( sSide, "transmit", nRecipient, os.getComputerID(), sMessage )
  54.             return true
  55.         end
  56.     end
  57.     error( "No open sides" )
  58. end
  59.  
  60. function broadcast( sMessage )
  61.     send( CHANNEL_BROADCAST, sMessage )
  62. end
  63.  
  64. function receive( nTimeout )
  65.     local timer = nil
  66.     local sFilter = nil
  67.     if nTimeout then
  68.         timer = os.startTimer( nTimeout )
  69.         sFilter = nil
  70.     else
  71.         sFilter = "rednet_message"
  72.     end
  73.     while true do
  74.         local e, p1, p2, p3, p4, p5 = os.pullEvent( sFilter )
  75.         if e == "rednet_message" then
  76.             local nSenderID, sMessage, nDistance = p1, p2, p3
  77.             return nSenderID, sMessage, nDistance
  78.         elseif e == "timer" and p1 == timer then
  79.             return nil
  80.         end
  81.     end
  82. end
  83.  
  84. local bRunning = false
  85. function run()
  86.     if bRunning then
  87.         error( "rednet is already running" )
  88.     end
  89.     bRunning = true
  90.    
  91.     while bRunning do
  92.         local sEvent, sSide, sChannel, sReplyChannel, sMessage, nDistance = os.pullEventRaw( "modem_message" )
  93.         if sEvent == "modem_message" and isOpen( sSide ) and (sChannel == os.getComputerID() or sChannel == CHANNEL_BROADCAST) then
  94.             os.queueEvent( "rednet_message", sReplyChannel, sMessage, nDistance )
  95.         end
  96.     end
  97. end
Advertisement
Add Comment
Please, Sign In to add comment