Advertisement
infiniteblock

Untitled

Mar 21st, 2020
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.78 KB | None | 0 0
  1. if warpdriveCommons then os.unloadAPI("warpdriveCommons") end
  2. if not os.loadAPI("warpdrive/warpdriveCommons") then error("missing warpdriveCommons") end
  3. local w = warpdriveCommons.w
  4.  
  5. local data
  6.  
  7. ----------- Force field support
  8.  
  9. local ffield_projectorAddresses = {}
  10. local ffield_projectors = {}
  11. local ffield_projector_indexSelected = 1
  12. local ffield_projector_indexFirstLine = 1
  13. local ffield_projector_lines = 10
  14.  
  15. function ffield_boot(isDetailed)
  16.   if #ffield_projectorAddresses == 0 and #ffield_relayAddresses == 0 then
  17.     return
  18.   end
  19.  
  20.   if isDetailed == nil then
  21.     isDetailed = true
  22.   end
  23.  
  24.   if isDetailed then
  25.     w.write("Booting Cores")
  26.    
  27.     w.writeLn("...")
  28.     w.sleep(0.1)
  29.   end
  30.  
  31.   -- getting projectors parameters
  32.   ffield_projectors = {}
  33.   for key, address in pairs(ffield_projectorAddresses) do
  34.     local device = w.device_get(address)
  35.     local x, y, z = device.getLocalPosition()
  36.     local name1 = device.name()
  37.   --  local beamFrequency = device.beamFrequency()
  38.       local projector = {
  39.       address = address,
  40.       device = device,
  41.       position = { x = x, y = y, z = z },
  42.       name = name1,
  43.       shape = shape,
  44.       isEnabled = isEnabled }
  45.     if isDetailed then
  46.       w.writeLn(ffield_projector_getDescription(projector))
  47.     end
  48.     table.insert(ffield_projectors, projector)
  49.   end
  50.  
  51. end
  52.  
  53. function ffield_save()
  54.   -- nothing
  55. end
  56.  
  57. function ffield_read(parData)
  58.   data = parData
  59. end
  60.  
  61. function ffield_projector_getDescription(projector)
  62.   if projector == nil or projector.device == nil then
  63.     return "~invalid~"
  64.   end
  65.   local description = "#" .. w.format_string(projector.name, 20)
  66.           .. " @ X" .. w.format_integer(projector.position.x, 7) .. " Y " .. w.format_integer(projector.position.y, 3) .. " Z " .. w.format_integer(projector.position.z, 7) .. ") "
  67.   return description
  68. end
  69.  
  70. function ffield_projector_getIndexes()
  71.   if ffield_projectors ~= nil then
  72.     if ffield_projector_indexSelected > #ffield_projectors then
  73.       ffield_projector_indexSelected = 1
  74.     elseif ffield_projector_indexSelected < 1 then
  75.       ffield_projector_indexSelected = #ffield_projectors
  76.     end
  77.     if ffield_projector_indexFirstLine > ffield_projector_indexSelected then
  78.       ffield_projector_indexFirstLine = ffield_projector_indexSelected
  79.     elseif ffield_projector_indexFirstLine + ffield_projector_lines < ffield_projector_indexSelected then
  80.       ffield_projector_indexFirstLine = ffield_projector_indexSelected - ffield_projector_lines
  81.     end
  82.     return ffield_projector_indexFirstLine, ffield_projector_indexSelected
  83.   else
  84.     return 1, 1
  85.   end
  86. end
  87.  
  88. function ffield_projector_get(index)
  89.   local indexToUse = index
  90.   local projector
  91.  
  92.   if ffield_projectors ~= nil then
  93.     if indexToUse > #ffield_projectors then
  94.       indexToUse = 1
  95.     elseif indexToUse < 1 then
  96.       indexToUse = #ffield_projectors
  97.     end
  98.     projector = ffield_projectors[indexToUse]
  99.   end
  100.  
  101.   if projector == nil then
  102.     ffield_boot(false)
  103.     w.status_showWarning("Invalid projector index " .. index)
  104.     projector = {
  105.       address = "-",
  106.       device = nil,
  107.       position = { x = 0, y = 0, z = 0 },
  108.       name = "-",
  109.       beamFrequency = -1,
  110.       shape = "NONE",
  111.       isEnabled = false }
  112.   end
  113.  
  114.   return projector
  115. end
  116.  
  117. function ffield_projector_getSelected()
  118.   return ffield_projector_get(ffield_projector_indexSelected)
  119. end
  120.  
  121. function ffield_enable(projectorOrRelay, enable)
  122.   if projectorOrRelay == nil or projectorOrRelay.device == nil then
  123.     return
  124.   end
  125.   local enableToApply = enable
  126.   if enableToApply == nil then
  127.     enableToApply = not projectorOrRelay.device.enable()
  128.   end
  129.   projectorOrRelay.isEnabled = projectorOrRelay.device.enable(enableToApply)
  130.   return projectorOrRelay.isEnabled
  131. end
  132.  
  133. function ffield_projector_key(character, keycode)
  134.   if character == 's' or character == 'S' then
  135.     for key, projector in pairs(ffield_projectors) do
  136.       ffield_enable(projector, true)
  137.     end
  138.     return true
  139.   elseif character == 'p' or character == 'P' then
  140.     for key, projector in pairs(ffield_projectors) do
  141.       ffield_enable(projector, false)
  142.     end
  143.     return true
  144.   elseif character == 'e' or character == 'E' then
  145.     local projector = ffield_projector_getSelected()
  146.     if projector ~= nil and projector.device ~= nil then
  147.       ffield_enable(projector)
  148.     end
  149.     return true
  150.   elseif character == 'c' or character == 'C' then -- C or keycode == 46
  151.     ffield_projector_config()
  152.     w.data_save()
  153.     return true
  154.   elseif keycode == 200 or keycode == 203 or character == '-' then -- Up or Left or -
  155.     ffield_projector_indexSelected = ffield_projector_indexSelected - 1
  156.     return true
  157.   elseif keycode == 208 or keycode == 205 or character == '+' then -- Down or Right or +
  158.     ffield_projector_indexSelected = ffield_projector_indexSelected + 1
  159.     return true
  160.   end
  161.   return false
  162. end
  163.  
  164. function ffield_projector_page()
  165.   w.page_begin(w.data_getName() .. " - Monitored Cores")
  166.  
  167.   -- w.setCursorPos(1, 2)
  168.   if #ffield_projectors == 0 then
  169.     w.setColorDisabled()
  170.     w.writeCentered(2, "No force field projector defined, connect one and reboot!")
  171.   else
  172.     w.setColorNormal()
  173.     local indexFirstLine, indexSelected = ffield_projector_getIndexes()
  174.     w.writeCentered(2, "Monitored Core " .. indexSelected .. " of " .. #ffield_projectors .. " is selected")
  175.     local indexLastLine = math.min(indexFirstLine + ffield_projector_lines, #ffield_projectors)
  176.     for indexCurrent = indexFirstLine, indexLastLine do
  177.       if indexCurrent == indexSelected then
  178.         w.setColorSelected()
  179.         w.clearLine()
  180.         w.write(">")
  181.       else
  182.         w.setColorNormal()
  183.         w.write(" ")
  184.       end
  185.       local projector = ffield_projector_get(indexCurrent)
  186.       local description = ffield_projector_getDescription(projector)
  187.       w.write(description)
  188.       w.writeLn("")
  189.     end
  190.   end
  191.  
  192.   w.setCursorPos(1, 16)
  193.   w.setColorNormal()
  194.   w.write("  -----------------------------------------------")
  195.  
  196.   w.setCursorPos(1, 17)
  197.   w.setColorControl()
  198. end
  199.  
  200. function ffield_register()
  201.   w.device_register("warpdriveShipController",
  202.       function(deviceType, address, wrap) table.insert(ffield_projectorAddresses, address) end,
  203.       function() end)
  204. end
  205.  
  206. ----------- connections status
  207.  
  208. function connections_page(isBooting)
  209.   w.page_begin(w.data_getName() .. " - Connections")
  210.  
  211.   w.writeLn("")
  212.  
  213.   local monitors = w.device_getMonitors()
  214.   if #monitors == 0 then
  215.     w.setColorDisabled()
  216.     w.writeLn("No Monitor detected")
  217.   elseif #monitors == 1 then
  218.     w.setColorSuccess()
  219.     w.writeLn("1 monitor detected")
  220.   else
  221.     w.setColorSuccess()
  222.     w.writeLn(#monitors .. " Monitors detected")
  223.   end
  224.  
  225.   if #ffield_projectorAddresses == 0 then
  226.     w.setColorDisabled()
  227.     w.writeLn("No Ship Controllers Detected.")
  228.   elseif #ffield_projectorAddresses == 1 then
  229.     w.setColorSuccess()
  230.     w.writeLn("1 Ship Controller Detected.")
  231.   else
  232.     w.setColorSuccess()
  233.     w.writeLn(#ffield_projectorAddresses .. " Ship Controllers Detected.")
  234.   end
  235.  
  236.   if isBooting then
  237.     ffield_boot()
  238.   end
  239.  
  240.   w.writeLn("")
  241.   w.setColorNormal()
  242.   w.writeLn("This is a keyboard controlled user interface.")
  243.   w.write("Key controls are written like so: ")
  244.   w.setColorControl()
  245.   w.write("Action (key)")
  246.   w.setColorNormal()
  247.   w.writeLn(".")
  248.   w.write("For example, typing ")
  249.   w.setColorControl()
  250.   w.write(" 1 ")
  251.   w.setColorNormal()
  252.   w.writeLn(" will open Cores.")
  253. end
  254.  
  255. ----------- Boot sequence
  256.  
  257. w.page_setEndText(" Home (0), Cores (1), Notifications (2)")
  258. w.page_register('0', connections_page, nil)
  259. w.page_register('1', ffield_projector_page, ffield_projector_key)
  260. w.page_register('2', ffield_relay_page, ffield_relay_key)
  261. ffield_register()
  262.  
  263. w.boot()
  264. w.run()
  265. w.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement