View difference between Paste ID: XZk4Z7cc and cHrnJ0r1
SHOW: | | - or go back to the newest paste.
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 name = device.name()
36
    fn = ""
37
    file = name:gsub(" ","")
38
    stt = "disk/"..file
39
    f = fs.open(stt,"r");
40
    fn = f.readAll();
41
   x, y, z = fn
42
    f.close();   
43
   -- local pos = device.getLocalPosition()
44
    local name1 = device.name()
45
    local projector = {
46
      address = address,
47
      device = device,
48
      position = { x = x, y = y, z = z },
49
      name = name1,
50
      shape = shape,
51
      isEnabled = isEnabled }
52
    if isDetailed then
53
      w.writeLn(ffield_projector_getDescription(projector))
54
    end
55
    
56
    table.insert(ffield_projectors, projector)
57
  end
58
  
59
end
60
61
62
function ffield_save()
63
  -- nothing
64
end
65
66
function ffield_read(parData)
67
  data = parData
68
end
69
70
function ffield_projector_getDescription(projector)
71
  if projector == nil or projector.device == nil then
72
    return "~invalid~"
73
  end
74
    fn = ""
75-
          .. " @ " .. print("hi")
75+
76
    stt = "disk/"..file
77
    f = fs.open(stt,"r");
78
    fn = f.readAll();
79
   x, y, z = fn
80
    f.close();   
81
  local description = "#" .. w.format_string(projector.name, 20)
82
          .. " @ " .. print("fn")
83
          --.. " Y " .. w.format_integer(y1, 3) .. " Z " .. w.format_integer(z1, 7) .. ") "
84
  return description
85
end
86
87
function ffield_projector_getIndexes()
88
  if ffield_projectors ~= nil then
89
    if ffield_projector_indexSelected > #ffield_projectors then
90
      ffield_projector_indexSelected = 1
91
    elseif ffield_projector_indexSelected < 1 then
92
      ffield_projector_indexSelected = #ffield_projectors
93
    end
94
    if ffield_projector_indexFirstLine > ffield_projector_indexSelected then
95
      ffield_projector_indexFirstLine = ffield_projector_indexSelected
96
    elseif ffield_projector_indexFirstLine + ffield_projector_lines < ffield_projector_indexSelected then
97
      ffield_projector_indexFirstLine = ffield_projector_indexSelected - ffield_projector_lines
98
    end
99
    return ffield_projector_indexFirstLine, ffield_projector_indexSelected
100
  else
101
    return 1, 1
102
  end
103
end
104
105
function ffield_projector_get(index)
106
  local indexToUse = index
107
  local projector
108
  
109
  if ffield_projectors ~= nil then
110
    if indexToUse > #ffield_projectors then
111
      indexToUse = 1
112
    elseif indexToUse < 1 then
113
      indexToUse = #ffield_projectors
114
    end
115
    projector = ffield_projectors[indexToUse]
116
  end
117
  
118
  if projector == nil then
119
    ffield_boot(false)
120
    w.status_showWarning("Invalid projector index " .. index)
121
    projector = {
122
      address = "-",
123
      device = nil,
124
      position = { x = 0, y = 0, z = 0 },
125
      name = "-",
126
      beamFrequency = -1,
127
      shape = "NONE",
128
      isEnabled = false }
129
  end
130
  
131
  return projector
132
end
133
134
function ffield_projector_getSelected()
135
  return ffield_projector_get(ffield_projector_indexSelected)
136
end
137
138
function ffield_enable(projectorOrRelay, enable)
139
  if projectorOrRelay == nil or projectorOrRelay.device == nil then
140
    return
141
  end
142
  local enableToApply = enable
143
  if enableToApply == nil then
144
    enableToApply = not projectorOrRelay.device.enable()
145
  end
146
  projectorOrRelay.isEnabled = projectorOrRelay.device.enable(enableToApply)
147
  return projectorOrRelay.isEnabled
148
end
149
150
function ffield_projector_key(character, keycode)
151
  if character == 's' or character == 'S' then
152
    for key, projector in pairs(ffield_projectors) do
153
      ffield_enable(projector, true)
154
    end
155
    return true
156
  elseif character == 'p' or character == 'P' then
157
    for key, projector in pairs(ffield_projectors) do
158
      ffield_enable(projector, false)
159
    end
160
    return true
161
  elseif character == 'e' or character == 'E' then
162
    local projector = ffield_projector_getSelected()
163
    if projector ~= nil and projector.device ~= nil then
164
      ffield_enable(projector)
165
    end
166
    return true
167
  elseif character == 'c' or character == 'C' then -- C or keycode == 46
168
    ffield_projector_config()
169
    w.data_save()
170
    return true
171
  elseif keycode == 200 or keycode == 203 or character == '-' then -- Up or Left or -
172
    ffield_projector_indexSelected = ffield_projector_indexSelected - 1
173
    return true
174
  elseif keycode == 208 or keycode == 205 or character == '+' then -- Down or Right or +
175
    ffield_projector_indexSelected = ffield_projector_indexSelected + 1
176
    return true
177
  end
178
  return false
179
end
180
181
function ffield_projector_page()
182
  w.page_begin(w.data_getName() .. " - Monitored Cores")
183
  
184
  -- w.setCursorPos(1, 2)
185
  if #ffield_projectors == 0 then
186
    w.setColorDisabled()
187
    w.writeCentered(2, "No force field projector defined, connect one and reboot!")
188
  else
189
    w.setColorNormal()
190
    local indexFirstLine, indexSelected = ffield_projector_getIndexes()
191
    w.writeCentered(2, "Monitored Core " .. indexSelected .. " of " .. #ffield_projectors .. " is selected")
192
    local indexLastLine = math.min(indexFirstLine + ffield_projector_lines, #ffield_projectors)
193
    for indexCurrent = indexFirstLine, indexLastLine do
194
      if indexCurrent == indexSelected then
195
        w.setColorSelected()
196
        w.clearLine()
197
        w.write(">")
198
      else
199
        w.setColorNormal()
200
        w.write(" ")
201
      end
202
      local projector = ffield_projector_get(indexCurrent)
203
      local description = ffield_projector_getDescription(projector)
204
      w.write(description)
205
      w.writeLn("")
206
    end
207
  end
208
  
209
  w.setCursorPos(1, 16)
210
  w.setColorNormal()
211
  w.write("  -----------------------------------------------")
212
  
213
  w.setCursorPos(1, 17)
214
  w.setColorControl()
215
end
216
217
function ffield_register()
218
  w.device_register("warpdriveShipController",
219
      function(deviceType, address, wrap) table.insert(ffield_projectorAddresses, address) end,
220
      function() end)
221
end
222
223
----------- connections status
224
225
function connections_page(isBooting)
226
  w.page_begin(w.data_getName() .. " - Connections")
227
  
228
  w.writeLn("")
229
  
230
  local monitors = w.device_getMonitors()
231
  if #monitors == 0 then
232
    w.setColorDisabled()
233
    w.writeLn("No Monitor detected")
234
  elseif #monitors == 1 then
235
    w.setColorSuccess()
236
    w.writeLn("1 monitor detected")
237
  else
238
    w.setColorSuccess()
239
    w.writeLn(#monitors .. " Monitors detected")
240
  end
241
  
242
  if #ffield_projectorAddresses == 0 then
243
    w.setColorDisabled()
244
    w.writeLn("No Ship Controllers Detected.")
245
  elseif #ffield_projectorAddresses == 1 then
246
    w.setColorSuccess()
247
    w.writeLn("1 Ship Controller Detected.")
248
  else
249
    w.setColorSuccess()
250
    w.writeLn(#ffield_projectorAddresses .. " Ship Controllers Detected.")
251
  end
252
  
253
  if isBooting then
254
    ffield_boot()
255
  end
256
  
257
  w.writeLn("")
258
  w.setColorNormal()
259
  w.writeLn("This is a keyboard controlled user interface.")
260
  w.write("Key controls are written like so: ")
261
  w.setColorControl()
262
  w.write("Action (key)")
263
  w.setColorNormal()
264
  w.writeLn(".")
265
  w.write("For example, typing ")
266
  w.setColorControl()
267
  w.write(" 1 ")
268
  w.setColorNormal()
269
  w.writeLn(" will open Cores.")
270
end
271
272
----------- Boot sequence
273
274
w.page_setEndText(" Home (0), Cores (1), Notifications (2)")
275
w.page_register('0', connections_page, nil)
276
w.page_register('1', ffield_projector_page, ffield_projector_key)
277
w.page_register('2', ffield_relay_page, ffield_relay_key)
278
ffield_register()
279
280
w.boot()
281
w.run()
282
w.close()