Advertisement
Jonas_spielt

Haltestelleneingangsmonitor

Dec 17th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.98 KB | None | 0 0
  1. if not fs.exists("crypt") then
  2.     shell.run("pastebin get STRXsMfE crypt")
  3. end
  4. os.loadAPI("crypt")
  5. --Haltestelle hier eintragen:
  6. local haltestellen = {"ecke_einstein_park","zweitehaltestelle"}
  7.  
  8.  
  9. function randomNumber()
  10.     return tonumber(tostring({}):sub(8),16)
  11. end
  12.  
  13. function newStringFind(x, y)
  14.     local a,b = string.find(x, y)
  15.     return a
  16. end
  17.  
  18. function calcTimeDiff(time1, time2)
  19.     local hour1 = tonumber(string.sub(time1, 1, newStringFind(time1, ":")-1))
  20.     local minute1 = tonumber(string.sub(time1, newStringFind(time1, ":")+1))
  21.     local hour2 = tonumber(string.sub(time2, 1, newStringFind(time2, ":")-1))
  22.     local minute2 = tonumber(string.sub(time2, newStringFind(time2, ":")+1))
  23.     local diff = 0
  24.     if hour1 > hour2 then
  25.         diff = diff + (hour1*60) - (hour2*60)
  26.     elseif hour1 < hour2 then
  27.         diff = diff + 1440 + (hour1*60) - (hour2*60)
  28.     end
  29.     diff = diff + minute1 - minute2
  30.     log("Calculated Time Diff ["..time1..","..time2.."]: "..diff)
  31.     return diff
  32. end
  33. --UI
  34. local mon = peripheral.find("monitor")
  35. local prevterm = term.redirect(mon)
  36. local xsize,ysize = term.getSize()
  37.  
  38. function drawArrows()
  39.     while true do
  40.         local i = 1
  41.         while i <= ysize do
  42.             term.setCursorPos(0,i)
  43.             term.setTextColor(colors.black)
  44.             term.write("\127 ")
  45.             term.setCursorPos(17,i)
  46.             term.write("\127 ")
  47.             term.setTextColor(colors.gray)
  48.             term.setCursorPos(0,i+1)
  49.             term.write("\127 ")
  50.             term.setCursorPos(17,i+1)
  51.             term.write("\127 ")
  52.             i = i + 1
  53.         end
  54.         sleep(0.5)
  55.         i = 1
  56.         while i <= ysize do
  57.             term.setCursorPos(0,i)
  58.             term.setTextColor(colors.gray)
  59.             term.write("\127 ")
  60.             term.setCursorPos(17,i)
  61.             term.write("\127 ")
  62.             term.setTextColor(colors.black)
  63.             term.setCursorPos(0,i+1)
  64.             term.write("\127 ")
  65.             term.setCursorPos(17,i+1)
  66.             term.write("\127 ")
  67.             i = i + 1
  68.         end
  69.         sleep(0.5)
  70.     end
  71. end
  72.  
  73. arrivals = {}
  74.  
  75. function drawArrivals()
  76.     while true do
  77.         if type(arrivals) == "table" then
  78.             local len = table.getn(arrivals)
  79.             if len > 0 then
  80.                 local array = arrivals
  81.                 local j
  82.                 local tempTime = textutils.formatTime(os.time(),true)
  83.                 for j = 2, len do
  84.                     local elem = array[j]
  85.                     local key = calcTimeDiff(array[j][1], tempTime)
  86.                     local i = j - 1
  87.                     while i > 0 and calcTimeDiff(array[j][1], tempTime) > key do
  88.                         array[i + 1] = array[i]
  89.                         i = i - 1
  90.                     end
  91.                     array[i + 1] = elem
  92.                 end
  93.                 local j = 1
  94.                 local i = 1
  95.                 while i < ysize and j <= len do
  96.                     term.setCursorPos(1,i)
  97.                     term.setBackgroundColor(colors.black)
  98.                     term.setTextColor(colors.orange)
  99.                     term.clearLine()
  100.                     term.setCursorPos(1,i)
  101.                     local diff = calcTimeDiff(arrivals[j][1], textutils.formatTime(os.time(), true))
  102.                     if diff < 0 and diff > -30 then
  103.                         if diff % 2 == 0 then
  104.                             term.write("")
  105.                         else
  106.                             term.write("Jetzt: "..arrivals[j][2])
  107.                         end
  108.                     else
  109.                         if diff < 30 then
  110.                             term.write("In "..diff.." Min: "..arrivals[j][2])
  111.                         else
  112.                             term.write(arrivals[j][1].."  "..arrivals[j][2])
  113.                         end
  114.                     end
  115.                     i = i + 1
  116.                     j = j + 1
  117.                 end
  118.                 while i < ysize do
  119.                     term.setCursorPos(1,i)
  120.                     term.setBackgroundColor(colors.black)
  121.                     term.clearLine()
  122.                     i = i + 1
  123.                 end
  124.             end
  125.         end
  126.         sleep(1)
  127.     end
  128. end
  129.  
  130. --Network
  131. local modem = nil
  132. local modem1, modem2 = peripheral.find("modem")
  133. if modem1.isWireless() then
  134.     modem = modem1
  135. elseif modem2.isWireless() then
  136.     modem = modem2
  137. else
  138.     print("Error: Wireless Modem needed")
  139. end
  140. modem.open(1800)
  141.  
  142. function getBasestation()
  143.     local messg = {}
  144.     messg["Protocol"] = "LTE"
  145.     messg["Sender"] = os.getComputerID()..".transport.ctOS"
  146.     messg["Receipient"] = "BROADCAST"
  147.     messg["Request"] = "broadcast_station_ping"
  148.     messg["LTE"] = {}
  149.     messg["LTE"]["SI"] = "STATIC_TRANSPORT"
  150.     local t = os.startTimer(2)
  151.     local returns = nil
  152.     local function a()
  153.         modem.transmit(1800, 1800, messg)
  154.         sleep(1)
  155.     end
  156.     local function b()
  157.         while true do
  158.             local sEvent, sModem, nChannel, nReplyChannel, tMessage = os.pullEvent()
  159.             if sEvent == "modem_message" and type(tMessage) == "table" and tMessage["Receipient"] == os.getComputerID()..".transport.ctOS" and tMessage["Request"] == "broadcast_station_pingres" then
  160.                 os.cancelTimer(t)
  161.                 returns = tMessage["Sender"]
  162.                 return
  163.             elseif sEvent == "timer" and sModem == t then
  164.                 local old = term.redirect(mon)
  165.                 term.setBackgroundColor(colors.red)
  166.                 term.clear()
  167.                 term.setTextColor(colors.white)
  168.                 term.setCursorPos(5,5)
  169.                 term.write("Ausser")
  170.                 term.setCursorPos(5,6)
  171.                 term.write("Betrieb")
  172.                 term.redirect(old)
  173.                 sleep(5)
  174.                 os.reboot()
  175.                 return
  176.             end
  177.         end
  178.     end
  179.     parallel.waitForAny(a,b)
  180.     return returns
  181. end
  182. function networkRegistration()
  183.     local basestation = getBasestation()
  184.     local packet = {}
  185.     packet["Sender"] = os.getComputerID()..".transport.ctOS"
  186.     packet["Receipient"] = basestation
  187.     packet["Protocol"] = "LTE"
  188.     packet["LTE"] = {}
  189.     packet["LTE"]["Request"] = "LTE_CLIENT_REGISTER"
  190.     packet["LTE"]["SI"] = "STATIC_TRANSPORT"
  191.     packet["LTE"]["Static"] = true
  192.     packet["Data"] = crypt.encrypt("LTE_INTERN_HELLO", "STATIC_TRANSPORT")
  193.     modem.transmit(1800, 1800, packet)
  194.     local timer = os.startTimer(5)
  195.     while true do
  196.         local event, p1, p2, p3, p4 = os.pullEvent()
  197.         if event == "modem_message" and type(p4) == "table" and p4["Receipient"] == os.getComputerID()..".transport.ctOS" and p4["Sender"] == basestation and p4["LTE"] and p4["LTE"]["Request"] == "LTE_CLIENT_WELCOME" then
  198.             break
  199.         elseif event == "timer" and p1 == timer then
  200.             local old = term.redirect(mon)
  201.             term.setBackgroundColor(colors.red)
  202.             term.clear()
  203.             term.setTextColor(colors.white)
  204.             term.setCursorPos(5,5)
  205.             term.write("Ausser")
  206.             term.setCursorPos(5,6)
  207.             term.write("Betrieb")
  208.             term.redirect(old)
  209.             sleep(5)
  210.             os.reboot()
  211.             break
  212.         end
  213.     end
  214. end
  215.  
  216. function getArrivals()
  217.     while true do
  218.         networkRegistration()
  219.         arrivals = {}
  220.         for key, haltestelle in pairs(haltestellen) do
  221.             local message = {}
  222.             message["Protocol"] = "ctOS"
  223.             message["Sender"] = haltestelle..".transport.ctOS"
  224.             message["Receipient"] = "center.transport.ctOS"
  225.             message["Request"] = "Arrivals.get"
  226.             message["Data"] = crypt.encrypt("Fill", "STATIC_TRANSPORT")
  227.             message["nMessageID"] = randomNumber()
  228.             message["ResponseID"] = message["nMessageID"]+1
  229.             message["LTE"] = {}
  230.             message["LTE"]["SI"] = "STATIC_TRANSPORT"
  231.             modem.transmit(1800, 1800, message)
  232.             local timerx = os.startTimer(25)
  233.             while true do
  234.                 local event, modemSide, senderChannel, replyChannel, tmessage, senderDistance = os.pullEvent()
  235.                 if event == "modem_message" then
  236.                     if tmessage["Protocol"] == "ctOS" then
  237.                         if tmessage["Receipient"] == haltestelle..".transport.ctOS" and tmessage["LTE"]["Receipient"] == "STATIC_TRANSPORT" and tmessage["ResponseID"] == message["ResponseID"] then
  238.                             local data = crypt.decrypt(tmessage["Data"], "STATIC_TRANSPORT")
  239.                             if type(data) == "table" and table.getn(data) > 0 then
  240.                                 for key, entry in pairs(data) do
  241.                                     table.insert(arrivals, entry)
  242.                                 end
  243.                             end
  244.                             break
  245.                         end
  246.                     end
  247.                 elseif event == "timer" and modemSide == timerx then
  248.                     break
  249.                 end
  250.             end
  251.         end
  252.         sleep(30)
  253.     end
  254. end
  255.  
  256.  
  257. networkRegistration()
  258. term.setBackgroundColor(colors.white)
  259. term.setTextColor(colors.black)
  260. term.clear()
  261. parallel.waitForAll(drawArrows, getArrivals, drawArrivals)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement