Advertisement
sanovskiy

Train route counter

Jul 20th, 2014
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.09 KB | None | 0 0
  1. local periList = peripheral.getNames()
  2. modem = false
  3. for i = 1, #periList do
  4.   if peripheral.getType(periList[i])=="modem" then
  5.     modem = peripheral.wrap(periList[i])
  6.     rednet.open(periList[i])
  7.   end
  8. end
  9.  
  10. if not(modem) then
  11.   error("No modem found")
  12. end
  13.  
  14. function SaveToFile(filename, value)
  15.   fs.delete(filename)
  16.   local file = fs.open(filename, "w")
  17.   file.writeLine(value .. "")
  18.   file.close()
  19.   return 0
  20. end
  21.  
  22. function LoadFromFile(filename)
  23.   local file = fs.open(filename, "r")
  24.   local data = file.readLine()
  25.   file.close()
  26.   return data
  27. end
  28.  
  29. function get_realtime()
  30.   s, d, p = rednet.receive()
  31.   return d
  32. end
  33.  
  34. function math_round(num, idp)
  35.   return tonumber(string.format("%." .. (idp or 0) .. "f", num))
  36. end
  37.  
  38. if fs.exists("counter.dat") then
  39.   temp = LoadFromFile("counter.dat")
  40.   counter = tonumber(temp)
  41. else
  42.   counter = 0
  43.   SaveToFile("counter.dat", counter)
  44. end
  45.  
  46. if fs.exists("last.dat") then
  47.   temp = LoadFromFile("last.dat")
  48.   last_passage = tonumber(temp)
  49. else
  50.   last_passage = -1
  51.   SaveToFile("last.dat", last_passage)
  52. end
  53.  
  54. if fs.exists("name.dat") then
  55.   name = LoadFromFile("name.dat")
  56. else
  57.   print("Enter route name:")
  58.   name = read()
  59.   SaveToFile("name.dat", name)
  60. end
  61.  
  62. pulse_counted = false
  63. if fs.exists("timings.dat") then
  64.   timings = textutils.unserialize(LoadFromFile("timings.dat"))
  65. else
  66.   timings = {}
  67.   SaveToFile("timings.dat", textutils.serialize(timings))
  68. end
  69.  
  70.  
  71. function checktrain()
  72.   while true do
  73.     os.pullEvent("redstone")
  74.     if rs.getInput("bottom") and not(pulse_counted) then
  75.       pulse_counted = true
  76.       counter = counter + 1;
  77.       passage = get_realtime()
  78.       if last_passage and last_passage>1 then
  79.         diff = passage - last_passage
  80.         average = get_average()
  81.         if average and average * 2 > diff then
  82.           table.insert(timings, diff)
  83.         end
  84.         SaveToFile("timings.dat", textutils.serialize(timings))
  85.       end
  86.       last_passage = passage
  87.       SaveToFile("last.dat", last_passage)
  88.       SaveToFile("counter.dat", counter)
  89.     end
  90.     if not(rs.getInput("bottom")) and pulse_counted then
  91.       pulse_counted = false
  92.     end
  93.   end
  94. end
  95.  
  96. function get_average ()
  97.     average = false
  98.     if #timings > 0 then
  99.       sum = 0
  100.       for i=1,#timings do
  101.         sum = sum + timings[i]
  102.       end    
  103.       average = math_round(sum/#timings,0)
  104.     end
  105.     return average
  106. end
  107.  
  108. function showStat()
  109.   while true do
  110.     term.clear()
  111.     term.setCursorPos(1,1)
  112.     print("Current route: "..name)
  113.     print("Current counter:"..counter)
  114.     if last_passage then
  115.       if last_passage and last_passage > 1 then
  116.         rtime = get_realtime()
  117.         from_last_passage = (rtime - last_passage) .. " seconds from last train"
  118.       else
  119.         from_last_passage = "No trains passed"
  120.       end
  121.       print(from_last_passage)
  122.     end
  123.     if #timings > 0 then
  124.       sum = 0
  125.       for i=1,#timings do
  126.         sum = sum + timings[i]
  127.       end    
  128.       average = math_round(sum/#timings,0)
  129.       print("Average route time:"..average)
  130.     end
  131.  
  132.     os.sleep(1)
  133.   end
  134. end
  135.  
  136. parallel.waitForAny(showStat,checktrain)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement