Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- =========================================================
- -- beacon[receiver]
- -- =========================================================
- -- ----------------------------------------------------
- -- Utilities
- -- ----------------------------------------------------
- function lFixText(text, length)
- return string.sub(text .. string.rep(" ", length), 1, length)
- end
- function rFixText(text, length)
- return string.sub(string.rep(" ", length) .. text, -length)
- end
- -- ----------------------------------------------------
- -- Config
- -- ----------------------------------------------------
- local PROTOCOL_NAME = "BEACON"
- local DISPLAY_INTERVAL = 1.5
- local MODEM_DIRECTION = "back"
- local LOST_COUNT = 5
- -- =========================================================
- -- beacon[receiver]
- -- =========================================================
- rednet.open(MODEM_DIRECTION)
- local timerId = os.startTimer(DISPLAY_INTERVAL)
- local dataTable = { }
- while true do
- local rslt = { os.pullEvent() }
- if "modem_message" == rslt[1] then
- local event, side, frequency, replyFrequency, message, distance = rslt[1], rslt[2], rslt[3], rslt[4], rslt[5], rslt[6]
- if rednet.CHANNEL_BROADCAST == frequency then
- if nil ~= message and message.sProtocol == PROTOCOL_NAME then
- local dat = { }
- dat.id = replyFrequency
- dat.label = message.message
- dat.distance = distance
- dat.lostCount = LOST_COUNT
- if nil ~= dataTable[dat.id] then
- dat.previousDistance = dataTable[dat.id].distance
- else
- dat.previousDistance = -1
- end
- dataTable[dat.id] = dat
- end
- end
- elseif "timer" == rslt[1] then
- local event, tId = rslt[1], rslt[2]
- if timerId == tId then
- timerId = os.startTimer(DISPLAY_INTERVAL)
- term.clear()
- term.setCursorPos(1, 1)
- local signalCount = 0
- for key, dat in pairs(dataTable) do
- if 0 < dat.lostCount then
- local tDist
- if -1 == dat.distance then
- tDist = "-----"
- else
- local distVal = math.floor(dat.distance * 10) / 10
- if 0 == (distVal * 10) % 10 then
- tDist = rFixText(tostring(distVal) .. ".0", 5)
- else
- tDist = rFixText(tostring(distVal), 5)
- end
- end
- local noMove
- if math.floor(dat.previousDistance * 10) == math.floor(dat.distance * 10) then
- noMove = "?"
- else
- noMove = " "
- end
- local tId = tostring(dat.id)
- local tLabel = lFixText(dat.label, 20)
- print(tDist .. noMove .. "[" .. tId .. "]" .. tLabel)
- if LOST_COUNT == dat.lostCount then
- signalCount = signalCount + 1
- end
- end
- dat.lostCount = dat.lostCount - 1
- dat.previousDistance = dat.distance
- dat.distance = -1
- end
- if 0 == signalCount then
- print("No signal")
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement