Guest User

controller

a guest
Jul 14th, 2023
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.90 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. local ffield_relayAddresses = {}
  16. local ffield_relays = {}
  17. local ffield_relay_indexSelected = 1
  18. local ffield_relay_indexFirstLine = 1
  19. local ffield_relay_lines = 10
  20.  
  21. function ffield_boot(isDetailed)
  22.   if #ffield_projectorAddresses == 0 and #ffield_relayAddresses == 0 then
  23.     return
  24.   end
  25.  
  26.   if isDetailed == nil then
  27.     isDetailed = true
  28.   end
  29.  
  30.   if isDetailed then
  31.     w.write("Booting Force field projectors and relays")
  32.    
  33.     w.writeLn("...")
  34.     w.sleep(0.1)
  35.   end
  36.  
  37.   -- getting projectors parameters
  38.   ffield_projectors = {}
  39.   for key, address in pairs(ffield_projectorAddresses) do
  40.     local device = w.device_get(address)
  41.     local x, y, z = device.getLocalPosition()
  42.     local name = device.name()
  43.     if name == "" then name = "-not defined-" end
  44.     local beamFrequency = device.beamFrequency()
  45.     -- local isEnabled = device.enable()
  46.     local status, isEnabled, isConnected, isPowered, shape, energy = device.state()
  47.     -- @TODO add tier reporting
  48.     local projector = {
  49.       address = address,
  50.       device = device,
  51.       position = { x = x, y = y, z = z },
  52.       name = name,
  53.       beamFrequency = beamFrequency,
  54.       shape = shape,
  55.       isEnabled = isEnabled }
  56.     if isDetailed then
  57.       w.writeLn(ffield_projector_getDescription(projector))
  58.     end
  59.     table.insert(ffield_projectors, projector)
  60.   end
  61.  
  62.   -- getting relays parameters
  63.   ffield_relays = {}
  64.   for key, address in pairs(ffield_relayAddresses) do
  65.     local device = w.device_get(address)
  66.     local x, y, z = device.getLocalPosition()
  67.     local name = device.name()
  68.     if name == "" then name = "-not defined-" end
  69.     local beamFrequency = device.beamFrequency()
  70.     local isEnabled = device.enable()
  71.     local relay = {
  72.       address = address,
  73.       device = device,
  74.       position = { x = x, y = y, z = z },
  75.       name = name,
  76.       beamFrequency = beamFrequency,
  77.       isEnabled = isEnabled }
  78.     if isDetailed then
  79.       w.writeLn(ffield_relay_getDescription(relay))
  80.     end
  81.     table.insert(ffield_relays, relay)
  82.   end
  83. end
  84.  
  85. function ffield_save()
  86.   -- nothing
  87. end
  88.  
  89. function ffield_read(parData)
  90.   data = parData
  91. end
  92.  
  93. function ffield_projector_getDescription(projector)
  94.   if projector == nil or projector.device == nil then
  95.     return "~invalid~"
  96.   end
  97.   local description = "#" .. w.format_integer(projector.beamFrequency, 5)
  98.           .. " @ (" .. w.format_integer(projector.position.x, 7) .. " " .. w.format_integer(projector.position.y, 3) .. " " .. w.format_integer(projector.position.z, 7) .. ") "
  99.           .. w.format_string(projector.shape, 10)
  100.           .. " "
  101.   if projector.isEnabled then
  102.     description = description .. "Enabled"
  103.   else
  104.     description = description .. "Disabled"
  105.   end
  106.   return description
  107. end
  108.  
  109. function ffield_projector_getIndexes()
  110.   if ffield_projectors ~= nil then
  111.     if ffield_projector_indexSelected > #ffield_projectors then
  112.       ffield_projector_indexSelected = 1
  113.     elseif ffield_projector_indexSelected < 1 then
  114.       ffield_projector_indexSelected = #ffield_projectors
  115.     end
  116.     if ffield_projector_indexFirstLine > ffield_projector_indexSelected then
  117.       ffield_projector_indexFirstLine = ffield_projector_indexSelected
  118.     elseif ffield_projector_indexFirstLine + ffield_projector_lines < ffield_projector_indexSelected then
  119.       ffield_projector_indexFirstLine = ffield_projector_indexSelected - ffield_projector_lines
  120.     end
  121.     return ffield_projector_indexFirstLine, ffield_projector_indexSelected
  122.   else
  123.     return 1, 1
  124.   end
  125. end
  126.  
  127. function ffield_projector_get(index)
  128.   local indexToUse = index
  129.   local projector
  130.  
  131.   if ffield_projectors ~= nil then
  132.     if indexToUse > #ffield_projectors then
  133.       indexToUse = 1
  134.     elseif indexToUse < 1 then
  135.       indexToUse = #ffield_projectors
  136.     end
  137.     projector = ffield_projectors[indexToUse]
  138.   end
  139.  
  140.   if projector == nil then
  141.     ffield_boot(false)
  142.     w.status_showWarning("Invalid projector index " .. index)
  143.     projector = {
  144.       address = "-",
  145.       device = nil,
  146.       position = { x = 0, y = 0, z = 0 },
  147.       name = "-",
  148.       beamFrequency = -1,
  149.       shape = "NONE",
  150.       isEnabled = false }
  151.   end
  152.  
  153.   return projector
  154. end
  155.  
  156. function ffield_projector_getSelected()
  157.   return ffield_projector_get(ffield_projector_indexSelected)
  158. end
  159.  
  160. function ffield_enable(projectorOrRelay, enable)
  161.   if projectorOrRelay == nil or projectorOrRelay.device == nil then
  162.     return
  163.   end
  164.   local enableToApply = enable
  165.   if enableToApply == nil then
  166.     enableToApply = not projectorOrRelay.device.enable()
  167.   end
  168.   projectorOrRelay.isEnabled = projectorOrRelay.device.enable(enableToApply)
  169.   return projectorOrRelay.isEnabled
  170. end
  171.  
  172. function ffield_projector_key(character, keycode)
  173.   if character == 's' or character == 'S' then
  174.     for key, projector in pairs(ffield_projectors) do
  175.       ffield_enable(projector, true)
  176.     end
  177.     return true
  178.   elseif character == 'p' or character == 'P' then
  179.     for key, projector in pairs(ffield_projectors) do
  180.       ffield_enable(projector, false)
  181.     end
  182.     return true
  183.   elseif character == 'e' or character == 'E' then
  184.     local projector = ffield_projector_getSelected()
  185.     if projector ~= nil and projector.device ~= nil then
  186.       ffield_enable(projector)
  187.     end
  188.     return true
  189.   elseif character == 'c' or character == 'C' then -- C or keycode == 46
  190.     ffield_projector_config()
  191.     w.data_save()
  192.     return true
  193.   elseif keycode == 200 or keycode == 203 or character == '-' then -- Up or Left or -
  194.     ffield_projector_indexSelected = ffield_projector_indexSelected - 1
  195.     return true
  196.   elseif keycode == 208 or keycode == 205 or character == '+' then -- Down or Right or +
  197.     ffield_projector_indexSelected = ffield_projector_indexSelected + 1
  198.     return true
  199.   end
  200.   return false
  201. end
  202.  
  203. function ffield_projector_page()
  204.   w.page_begin(w.data_getName() .. " - Force field projectors")
  205.  
  206.   -- w.setCursorPos(1, 2)
  207.   if #ffield_projectors == 0 then
  208.     w.setColorDisabled()
  209.     w.writeCentered(2, "No force field projector defined, connect one and reboot!")
  210.   else
  211.     w.setColorNormal()
  212.     local indexFirstLine, indexSelected = ffield_projector_getIndexes()
  213.     w.writeCentered(2, "Force field projector " .. indexSelected .. " of " .. #ffield_projectors .. " is selected")
  214.     local indexLastLine = math.min(indexFirstLine + ffield_projector_lines, #ffield_projectors)
  215.     for indexCurrent = indexFirstLine, indexLastLine do
  216.       if indexCurrent == indexSelected then
  217.         w.setColorSelected()
  218.         w.clearLine()
  219.         w.write(">")
  220.       else
  221.         w.setColorNormal()
  222.         w.write(" ")
  223.       end
  224.       local projector = ffield_projector_get(indexCurrent)
  225.       local description = ffield_projector_getDescription(projector)
  226.       w.write(description)
  227.       w.writeLn("")
  228.     end
  229.   end
  230.  
  231.   w.setCursorPos(1, 14)
  232.   w.setColorNormal()
  233.   w.write("  -----------------------------------------------")
  234.  
  235.   w.setCursorPos(1, 15)
  236.   w.setColorControl()
  237.   w.writeFullLine(" Start/stoP all force field projectors (S/P)")
  238.   w.writeFullLine(" Configure (C) or togglE (E) selected projector")
  239.   w.writeFullLine(" select force field projector (Up, Down)")
  240. end
  241.  
  242. function ffield_projector_config()
  243.   local projector = ffield_projector_getSelected()
  244.   if projector == nil then
  245.     return
  246.   end
  247.   w.page_begin(w.data_getName() .. " - Projector configuration")
  248.  
  249.   w.setCursorPos(1, 2)
  250.   w.setColorNormal()
  251.   projector.position.x, projector.position.y, projector.position.z = projector.device.getLocalPosition()
  252.   w.write("Projector @ " .. w.format_integer(projector.position.x, 7) .. " " .. w.format_integer(projector.position.y, 3) .. " " .. w.format_integer(projector.position.z, 7))
  253.  
  254.   -- name
  255.   w.setCursorPos(1, 16)
  256.   w.setColorHelp()
  257.   w.writeFullLine(" Press enter to validate.")
  258.   w.setCursorPos(1, 3)
  259.   w.setColorNormal()
  260.   w.writeLn("Name (" .. projector.name .. "):")
  261.   local nameOriginal = projector.name
  262.   projector.name = w.input_readText(projector.name)
  263.   w.setCursorPos(1, 3)
  264.   w.setColorNormal()
  265.   w.clearLine()
  266.   if nameOriginal ~= projector.name then
  267.     w.setColorSuccess()
  268.   else
  269.     w.setColorNormal()
  270.   end
  271.   projector.name = projector.device.name(projector.name)
  272.   w.writeLn("Name set to " .. projector.name)
  273.   w.setColorNormal()
  274.   w.clearLine()
  275.  
  276.   -- beam frequency
  277.   projector.beamFrequency = projector.device.beamFrequency()
  278.   w.setCursorPos(1, 16)
  279.   w.setColorHelp()
  280.   w.writeFullLine(" Enter a number between 0 and 65000.")
  281.   local frequency
  282.   repeat
  283.     w.setCursorPos(1, 5)
  284.     w.setColorNormal()
  285.     w.clearLine()
  286.     w.write("Beam frequency (" .. w.format_integer(projector.beamFrequency, 5) .. "): ")
  287.     frequency = w.input_readInteger(projector.beamFrequency)
  288.     if frequency ~= 0 and (frequency < 0 or frequency > 65000) then
  289.       w.status_showWarning("This is not a valid beam frequency. Try again.")
  290.     end
  291.   until frequency > 0 and frequency <= 65000
  292.   w.setCursorPos(1, 4)
  293.   w.clearLine()
  294.   if frequency ~= projector.beamFrequency then
  295.     w.setColorSuccess()
  296.   else
  297.     w.setColorNormal()
  298.   end
  299.   projector.beamFrequency = projector.device.beamFrequency(frequency)
  300.   w.write("Beam frequency set to " .. projector.beamFrequency)
  301.   w.setColorNormal()
  302.   w.setCursorPos(1, 5)
  303.   w.clearLine()
  304.   w.setCursorPos(1, 16)
  305.   w.clearLine()
  306.  
  307.   -- translation
  308.   ffield_config_xyz(5, "Translation", "%", "translation where 0 is centered", projector.device.translation, 100)
  309.  
  310.   -- rotation
  311.   ffield_config_xyz(6, "Rotation", "", "rotation in deg where 0 is centered", projector.device.rotation, 1)
  312.  
  313.   -- scale
  314.   ffield_config_xyz(7, "Min scale", "%", "min scale where -100 is full scale", projector.device.min, 100)
  315.   ffield_config_xyz(8, "Max scale", "%", "max scale where 100 is full scale", projector.device.max, 100)
  316.  
  317.   w.sleep(0.5)
  318. end
  319.  
  320. function ffield_config_xyz(yCursor, title, unit, help, method, factor)
  321.   local xOriginal, yOriginal, zOriginal = method()
  322.   local x = factor * xOriginal
  323.   local y = factor * yOriginal
  324.   local z = factor * zOriginal
  325.   w.setCursorPos(1, yCursor + 1)
  326.   w.setColorNormal()
  327.   w.write(title .. " is currently set to " .. w.format_integer(x, 4) .. " "  .. unit .. " " .. w.format_integer(y, 4) .. " "  .. unit .. " " .. w.format_integer(z, 4) .. " "  .. unit)
  328.  
  329.   w.setCursorPos(1, 16)
  330.   w.setColorHelp()
  331.   w.writeFullLine(" Enter X " .. help)
  332.  
  333.   w.setCursorPos(1, yCursor + 3)
  334.   w.setColorNormal()
  335.   w.write(title .. " along X axis (" .. w.format_integer(x, 4) .. "): ")
  336.   x = w.input_readInteger(x)
  337.  
  338.   w.setCursorPos(1, 16)
  339.   w.setColorHelp()
  340.   w.writeFullLine(" Enter Y " .. help)
  341.  
  342.   w.setCursorPos(1, yCursor + 4)
  343.   w.setColorNormal()
  344.   w.write(title .. " along Y axis (" .. w.format_integer(y, 4) .. "): ")
  345.   y = w.input_readInteger(y)
  346.  
  347.   w.setCursorPos(1, 16)
  348.   w.setColorHelp()
  349.   w.writeFullLine(" Enter Z " .. help)
  350.  
  351.   w.setCursorPos(1, yCursor + 5)
  352.   w.setColorNormal()
  353.   w.write(title .. " along Z axis (" .. w.format_integer(z, 4) .. "): ")
  354.   z = w.input_readInteger(z)
  355.  
  356.   w.setCursorPos(1, 16)
  357.   w.clearLine()
  358.  
  359.   local xSet = x / factor
  360.   local ySet = y / factor
  361.   local zSet = z / factor
  362.   local message
  363.   x, y, z, message = method(xSet, ySet, zSet)
  364.   x = factor * x
  365.   y = factor * y
  366.   z = factor * z
  367.   w.setCursorPos(1, yCursor)
  368.   if message ~= nil then
  369.     w.setColorWarning()
  370.     w.write(title .. " error: " .. message)
  371.     w.status_showWarning(message)
  372.   else
  373.     if xOriginal ~= xSet or yOriginal ~= ySet or zOriginal ~= zSet then
  374.       w.setColorSuccess()
  375.     else
  376.       w.setColorNormal()
  377.     end
  378.     w.write(title .. " set to " .. w.format_integer(x, 4) .. " "  .. unit .. " " .. w.format_integer(y, 4) .. " "  .. unit .. " " .. w.format_integer(z, 4) .. " "  .. unit)
  379.   end
  380.   w.setColorNormal()
  381.   w.setCursorPos(1, yCursor + 1)
  382.   w.clearLine()
  383.   w.setCursorPos(1, yCursor + 3)
  384.   w.clearLine()
  385.   w.setCursorPos(1, yCursor + 4)
  386.   w.clearLine()
  387.   w.setCursorPos(1, yCursor + 5)
  388.   w.clearLine()
  389. end
  390.  
  391. function ffield_relay_getDescription(relay)
  392.   if relay == nil or relay.device == nil then
  393.     return "~invalid~"
  394.   end
  395.   local description = "#" .. w.format_integer(relay.beamFrequency, 5)
  396.           .. " @ (" .. w.format_integer(relay.position.x, 7) .. " " .. w.format_integer(relay.position.y, 3) .. " " .. w.format_integer(relay.position.z, 7) .. ") "
  397.   if relay.isEnabled then
  398.     description = description .. "Enabled"
  399.   else
  400.     description = description .. "Disabled"
  401.   end
  402.   return description
  403. end
  404.  
  405. function ffield_relay_getIndexes()
  406.   if ffield_relays ~= nil then
  407.     if ffield_relay_indexSelected > #ffield_relays then
  408.       ffield_relay_indexSelected = 1
  409.     elseif ffield_relay_indexSelected < 1 then
  410.       ffield_relay_indexSelected = #ffield_relays
  411.     end
  412.     if ffield_relay_indexFirstLine > ffield_relay_indexSelected then
  413.       ffield_relay_indexFirstLine = ffield_relay_indexSelected
  414.     elseif ffield_relay_indexFirstLine + ffield_relay_lines < ffield_relay_indexSelected then
  415.       ffield_relay_indexFirstLine = ffield_relay_indexSelected - ffield_relay_lines
  416.     end
  417.     return ffield_relay_indexFirstLine, ffield_relay_indexSelected
  418.   else
  419.     return 1, 1
  420.   end
  421. end
  422.  
  423. function ffield_relay_get(index)
  424.   local indexToUse = index
  425.   local relay
  426.  
  427.   if ffield_relays ~= nil then
  428.     if indexToUse > #ffield_relays then
  429.       indexToUse = 1
  430.     elseif indexToUse < 1 then
  431.       indexToUse = #ffield_relays
  432.     end
  433.     relay = ffield_relays[indexToUse]
  434.   end
  435.  
  436.   if relay == nil then
  437.     ffield_boot(false)
  438.     w.status_showWarning("Invalid relay index " .. index)
  439.     relay = {
  440.       address = "-",
  441.       device = nil,
  442.       position = { x = 0, y = 0, z = 0 },
  443.       name = "-",
  444.       beamFrequency = -1,
  445.       isEnabled = false }
  446.   end
  447.  
  448.   return relay
  449. end
  450.  
  451. function ffield_relay_getSelected()
  452.   return ffield_relay_get(ffield_relay_indexSelected)
  453. end
  454.  
  455. function ffield_relay_key(character, keycode)
  456.   if character == 's' or character == 'S' then
  457.     for key, relay in pairs(ffield_relays) do
  458.       ffield_enable(relay, true)
  459.     end
  460.     return true
  461.   elseif character == 'p' or character == 'P' then
  462.     for key, relay in pairs(ffield_relays) do
  463.       ffield_enable(relay, false)
  464.     end
  465.     return true
  466.   elseif character == 'e' or character == 'E' then
  467.     local relay = ffield_relay_getSelected()
  468.     ffield_enable(relay)
  469.     return true
  470.   elseif character == 'c' or character == 'C' then -- C or keycode == 46
  471.     ffield_relay_config()
  472.     w.data_save()
  473.     return true
  474.   elseif keycode == 200 or keycode == 203 or character == '-' then -- Up or Left or -
  475.     ffield_relay_indexSelected = ffield_relay_indexSelected - 1
  476.     return true
  477.   elseif keycode == 208 or keycode == 205 or character == '+' then -- Down or Right or +
  478.     ffield_relay_indexSelected = ffield_relay_indexSelected + 1
  479.     return true
  480.   end
  481.   return false
  482. end
  483.  
  484. function ffield_relay_page()
  485.   w.page_begin(w.data_getName() .. " - Force field relays")
  486.  
  487.   -- w.setCursorPos(1, 2)
  488.   if #ffield_relays == 0 then
  489.     w.setColorDisabled()
  490.     w.writeCentered(2, "No force field relay defined, connect one and reboot!")
  491.   else
  492.     w.setColorNormal()
  493.     local indexFirstLine, indexSelected = ffield_relay_getIndexes()
  494.     w.writeCentered(2, "Force field relay " .. indexSelected .. " of " .. #ffield_relays .. " is selected")
  495.     local indexLastLine = math.min(indexFirstLine + ffield_relay_lines, #ffield_relays)
  496.     for indexCurrent = indexFirstLine, indexLastLine do
  497.       if indexCurrent == indexSelected then
  498.         w.setColorSelected()
  499.         w.clearLine()
  500.         w.write(">")
  501.       else
  502.         w.setColorNormal()
  503.         w.write(" ")
  504.       end
  505.       local relay = ffield_relay_get(indexCurrent)
  506.       local description = ffield_relay_getDescription(relay)
  507.       w.write(description)
  508.       w.writeLn("")
  509.     end
  510.   end
  511.  
  512.   w.setCursorPos(1, 14)
  513.   w.setColorNormal()
  514.   w.write("  -----------------------------------------------")
  515.  
  516.   w.setCursorPos(1, 15)
  517.   w.setColorControl()
  518.   w.writeFullLine(" Start/stoP all force field relays (S/P)")
  519.   w.writeFullLine(" Configure (C) or togglE (E) selected relay")
  520.   w.writeFullLine(" select force field relay (Up, Down)")
  521. end
  522.  
  523. function ffield_relay_config()
  524.   local relay = ffield_relay_getSelected()
  525.   if relay == nil then
  526.     return
  527.   end
  528.   w.page_begin(w.data_getName() .. " - Relay configuration")
  529.  
  530.   w.setCursorPos(1, 2)
  531.   w.setColorNormal()
  532.   relay.position.x, relay.position.y, relay.position.z = relay.device.getLocalPosition()
  533.   w.write("Relay @ " .. w.format_integer(relay.position.x, 7) .. " " .. w.format_integer(relay.position.y, 3) .. " " .. w.format_integer(relay.position.z, 7))
  534.  
  535.   -- name
  536.   w.setCursorPos(1, 16)
  537.   w.setColorHelp()
  538.   w.writeFullLine(" Press enter to validate.")
  539.   w.setCursorPos(1, 3)
  540.   w.setColorNormal()
  541.   w.writeLn("Name (" .. relay.name .. "):")
  542.   local nameOriginal = relay.name
  543.   relay.name = w.input_readText(relay.name)
  544.   w.setCursorPos(1, 3)
  545.   w.setColorNormal()
  546.   w.clearLine()
  547.   if nameOriginal ~= relay.name then
  548.     w.setColorSuccess()
  549.   else
  550.     w.setColorNormal()
  551.   end
  552.   relay.name = relay.device.name(relay.name)
  553.   w.writeLn("Name set to " .. relay.name)
  554.   w.setColorNormal()
  555.   w.clearLine()
  556.  
  557.   -- beam frequency
  558.   relay.beamFrequency = relay.device.beamFrequency()
  559.   w.setCursorPos(1, 16)
  560.   w.setColorHelp()
  561.   w.writeFullLine(" Enter a number between 0 and 65000.")
  562.   local frequency
  563.   repeat
  564.     w.setCursorPos(1, 5)
  565.     w.setColorNormal()
  566.     w.clearLine()
  567.     w.write("Beam frequency (" .. w.format_integer(relay.beamFrequency, 5) .. "): ")
  568.     frequency = w.input_readInteger(relay.beamFrequency)
  569.     if frequency ~= 0 and (frequency < 0 or frequency > 65000) then
  570.       w.status_showWarning("This is not a valid beam frequency. Try again.")
  571.     end
  572.   until frequency > 0 and frequency <= 65000
  573.   w.setCursorPos(1, 4)
  574.   w.clearLine()
  575.   if frequency ~= relay.beamFrequency then
  576.     w.setColorSuccess()
  577.   else
  578.     w.setColorNormal()
  579.   end
  580.   relay.beamFrequency = relay.device.beamFrequency(frequency)
  581.   w.write("Beam frequency set to " .. relay.beamFrequency)
  582.   w.setColorNormal()
  583.   w.setCursorPos(1, 5)
  584.   w.clearLine()
  585.   w.setCursorPos(1, 6)
  586.   w.clearLine()
  587. end
  588.  
  589. function ffield_register()
  590.   w.device_register("warpdriveForceFieldProjector",
  591.       function(deviceType, address, wrap) table.insert(ffield_projectorAddresses, address) end,
  592.       function() end)
  593.   w.device_register("warpdriveForceFieldRelay",
  594.       function(deviceType, address, wrap) table.insert(ffield_relayAddresses, address) end,
  595.       function() end)
  596.   w.data_register("ffield", ffield_read, ffield_save, nil)
  597. end
  598.  
  599. ----------- connections status
  600.  
  601. function connections_page(isBooting)
  602.   w.page_begin(w.data_getName() .. " - Connections")
  603.  
  604.   w.writeLn("")
  605.  
  606.   local monitors = w.device_getMonitors()
  607.   if #monitors == 0 then
  608.     w.setColorDisabled()
  609.     w.writeLn("No Monitor detected")
  610.   elseif #monitors == 1 then
  611.     w.setColorSuccess()
  612.     w.writeLn("1 monitor detected")
  613.   else
  614.     w.setColorSuccess()
  615.     w.writeLn(#monitors .. " Monitors detected")
  616.   end
  617.  
  618.   if #ffield_projectorAddresses == 0 then
  619.     w.setColorDisabled()
  620.     w.writeLn("No force field projector detected")
  621.   elseif #ffield_projectorAddresses == 1 then
  622.     w.setColorSuccess()
  623.     w.writeLn("1 force field projector detected")
  624.   else
  625.     w.setColorSuccess()
  626.     w.writeLn(#ffield_projectorAddresses .. " force field projectors detected")
  627.   end
  628.  
  629.   if #ffield_relayAddresses == 0 then
  630.     w.setColorDisabled()
  631.     w.writeLn("No force field relay detected")
  632.   elseif #ffield_relayAddresses == 1 then
  633.     w.setColorSuccess()
  634.     w.writeLn("1 force field relay detected")
  635.   else
  636.     w.setColorSuccess()
  637.     w.writeLn(#ffield_relayAddresses .. " force field relays detected")
  638.   end
  639.  
  640.   if isBooting then
  641.     ffield_boot()
  642.   end
  643.  
  644.   w.writeLn("")
  645.   w.setColorNormal()
  646.   w.writeLn("This is a keyboard controlled user interface.")
  647.   w.write("Key controls are written like so: ")
  648.   w.setColorControl()
  649.   w.write("Action (key)")
  650.   w.setColorNormal()
  651.   w.writeLn(".")
  652.   w.write("For example, typing ")
  653.   w.setColorControl()
  654.   w.write(" 1 ")
  655.   w.setColorNormal()
  656.   w.writeLn(" will open Force field projectors.")
  657. end
  658.  
  659. ----------- Boot sequence
  660.  
  661. w.page_setEndText(" Home (0), Projectors (1), Relays (2)")
  662. w.page_register('0', connections_page, nil)
  663. w.page_register('1', ffield_projector_page, ffield_projector_key)
  664. w.page_register('2', ffield_relay_page, ffield_relay_key)
  665. ffield_register()
  666.  
  667. w.boot()
  668. w.run()
  669. w.close()
Add Comment
Please, Sign In to add comment