View difference between Paste ID: eF4tTb65 and eqcB67gC
SHOW: | | - or go back to the newest paste.
1
--EyeDeck's extractor controller program
2
f = fs.open("buttonAPI","r")
3
if f == nil then
4-
ex = peripheral.wrap("front")
4+
  print("Attempting to fetch ButtonAPI...")
5-
cvt = peripheral.wrap("AdvancedGears_2")
5+
  bapi = http.get("http://idek.chir.uno/mc/buttonAPI.lua")
6-
coil = peripheral.wrap("AdvancedGears_3")
6+
  if (bapi) then
7-
mon = peripheral.wrap("left")
7+
    f = fs.open("buttonAPI","w")
8
    f.write(bapi.readAll())
9
    f.close()
10
    print("...complete, ButtonAPI has been downloaded.")
11
  else
12
    print("...failed, ButtonAPI could not be downloaded. Re-run this program to retry, or supply ButtonAPI manually.")
13
    error("ButtonAPI download failed")
14
  end
15
else
16
  f.close()
17-
buttonAPI.drawButton(mon,2,2,16,7,colors.black,colors.lime,"Start","startstop")
17+
18-
buttonAPI.drawButton(mon,20,2,16,7,colors.black,colors.blue,"Manual","manualauto")
18+
19
20-
isOn = false
20+
ex, cvt, coil, mon = nil, nil, nil, nil
21-
autoOn = false
21+
22
warning = {}
23
print("Checking peripherals...")
24
while ex == nil or cvt == nil or coil == nil or mon == nil do
25
  ex = peripheral.find("Extractor")
26-
    local item = ex.getStackInSlot(i)
26+
  adv1,adv2 = peripheral.find("AdvancedGear")
27
  mon = peripheral.find("monitor")
28
29
  if adv1.getName() == "CVT Unit" then
30
    cvt = adv1
31
    coil = adv2
32
  else
33
    cvt = adv2
34
    coil = adv1
35-
-- Prints a message to the console and halts execution until given handle exists
35+
36-
-- too lazy to implement yet
36+
37-
function sanityCheck(handle)
37+
  if ex == nil then
38
    if warning.ex == nil then
39
      print("Extractor missing!")
40
      warning.ex = true
41
    end
42
     sleep(2)
43
  elseif cvt == nil then
44
    if warning.cvt == nil then
45
      print("CVT missing!")
46
      warning.cvt = true
47
    end
48
    sleep(2)
49
  elseif coil == nil then
50
    if warning.coil == nil then
51
      print("Coil missing!")
52
      warning.coil = true
53
    end
54
    sleep(2)
55
  elseif mon == nil then
56-
      print("beginning extraction")
56+
    if warning.mon == nil then
57
      print("Monitor missing!")
58-
      
58+
      warning.mon = true
59
    end
60
    sleep(2)
61-
        
61+
  else
62
    break
63
  end
64-
          
64+
65
print("All peripherals present.")
66
67-
          sleep(4.2)
67+
peripherals = 0
68-
          
68+
69
--Returns right-most item in extractor, else if empty returns false
70
function notEmpty()
71-
          sleep(2.85)
71+
  item = {}
72
  for i = 4,1,-1 do
73
    item = getStackInSlot(ex,i)
74
    if item ~= nil then
75
      return item
76
    end
77
  end
78-
          
78+
 
79
  return false
80-
             coil.setTorque(0)
80+
81
82
function getStackInSlot(p,slot)
83
  sanityCheck()
84
  item = {}
85
  item.raw_name, item.dmg, item.qty, item.display_name = p.getSlot(slot-1)
86
  
87
  -- make sure that nil is returned instead of a useless object if there is no item or the script will break in 12 different places
88-
    
88+
  if item.qty ~= nil then
89
    return item
90-
    print("ceasing extraction")
90+
  else
91
    return nil
92
  end
93
end
94
95
-- A huge hack to prevent a crash when a peripheral is disconnected
96
function sanityCheck()
97
  if peripherals < 0 then
98
    print("A peripheral has been detached!\nWaiting for reattachment...")
99
    while peripherals < 0 do
100
      sleep(2)
101
    end
102
    print("Resuming.")
103-
    
103+
104
end
105
106
function writeState(state,val)
107
  if val == true then val = "1" else val = "0" end
108
  
109
  local file = fs.open(state,"w")
110
  file.write(val)
111
  file.close()
112
end
113
114
function readState(state)
115
  local file = fs.open(state,"r")
116
  local val
117
  
118
  if file == nil then
119
    val = false
120
  else
121
    val = file.readAll()
122
    if val == "1" then val = true else val = false end
123
    file.close()
124
  end
125
  
126
  return val
127
end
128
 
129
function updateDisplay(name)
130
  sanityCheck()
131-
  local lastItem = nil
131+
132
  local power_in_hours = math.floor(coil.getEnergy() / 37507786621 * 100)*.01
133
  
134
  if name == nil then -- prevent a crash just in case
135
    name = "nil"
136-
      item = ex.getStackInSlot(8)
136+
137
 
138-
      if item ~= nil then
138+
139-
        if lastItem == item then
139+
140
  -- extra spaces are a hack to clear the last item if necessary ("Ammonium Chloride Solution" is long)
141
  write("Extracting: ".. name .."                     \n                       ")
142
  term.setCursorPos(2,12)
143
  write("Power remaining: ".. power_in_hours .."h         ")
144-
        
144+
145
end
146-
        
146+
 
147
function exLoop()
148-
          jammed = true
148+
149
    if isOn then
150
      print("Beginning extraction...")
151
      jammed = false
152-
    
152+
     
153
      while isOn do
154
        local currentItem = notEmpty()
155
       
156
        if currentItem ~= false and jammed == false then
157
          updateDisplay(currentItem.display_name)
158
          coil.setSpeed(4096)
159
         
160
          sanityCheck()
161
          cvt.setRatio(1)
162
          coil.setTorque(4096)
163-
parallel.waitForAll(uiLoop, exLoop, jamLoop)
163+
          sleep(0.75) --sleep(4.2)
164
         
165
          sanityCheck()
166
          cvt.setRatio(32)
167
          coil.setTorque(256)
168
          sleep(0.5) --sleep(2.85)
169
        else
170
          if jammed == true then
171
            updateDisplay("Jammed (check output)")
172
          else
173
            updateDisplay("Idle")
174
          end
175
         
176
          if autoOn then
177
            sanityCheck()
178
            coil.setTorque(0)
179
            sleep(8)
180
          else
181
            isOn = false
182
            buttonAPI.drawButton(mon,2,2,16,7,colors.black,colors.lime,"Start")
183
          end
184
        end
185
      end
186
   
187
    sanityCheck()
188
    coil.setTorque(0)
189
    print("Ceasing extraction.")
190
 
191
    else -- isOn == false
192
      sleep(2)
193
    end
194
  end
195
end
196
 
197
function uiLoop()
198
  while true do
199
    sanityCheck()
200
    event, _, x, y = os.pullEvent("monitor_touch")
201
    local button_name = buttonAPI.getButton(x,y)
202
    --print(button_name .. " pressed at " .. x .. "," .. y)
203
   
204
    if button_name == "startstop" then
205
      if isOn == false then
206
        buttonAPI.drawButton(mon,2,2,16,7,colors.black,colors.red,"Stop")
207
        isOn = true
208
      else
209
        buttonAPI.drawButton(mon,2,2,16,7,colors.black,colors.lime,"Start")
210
        isOn = false
211
      end
212
      writeState("isOn",isOn)
213
    elseif button_name == "manualauto" then
214
      if autoOn == false then
215
        buttonAPI.drawButton(mon,20,2,16,7,colors.black,colors.yellow,"Automatic")
216
        autoOn = true
217
      else
218
        buttonAPI.drawButton(mon,20,2,16,7,colors.black,colors.blue,"Manual")
219
        autoOn = false
220
      end
221
      writeState("autoOn",autoOn)
222
    end
223
  end  
224
end
225
 
226
--[[
227
  While main function is active, if the item in the output slot remains
228
  unchanged for ~12 seconds or longer, assume the machine has jammed
229
  and set a variable to stop the main loop.
230
--]]
231
function jamLoop()
232
  local jamCount = 0
233
  local lastItem = {}
234
  local item = nil
235
 
236
  while true do
237
    if isOn then
238
      item = getStackInSlot(ex,9)
239
      if item == nil then
240
        item = getStackInSlot(ex,8)
241
      end
242
 
243
      if item == nil then
244
        lastItem = {}
245
        jammed = false
246
        jamCount = 0
247
      else
248
        -- comparing the item object directly doesn't work anymore, test count and name instead
249
        if lastItem.display_name == item.display_name and lastItem.qty == item.qty then
250
          jamCount = jamCount + 1
251
        else
252
          jamCount = 0
253
        end
254
       
255
        lastItem = item
256
       
257
        if jamCount >= 3 then
258
          if jammed == false then
259
            jammed = true
260
            print("Extractor jammed!")
261
          end
262
        else
263
          jammed = false
264
        end
265
      end
266
    end
267
   
268
    sleep(4)
269
  end
270
end
271
272
function peripheralLoop()  
273
  while true do
274
    local event = os.pullEvent()
275
    if event == "peripheral" then
276
      peripherals = peripherals + 1
277
      print("A peripheral has been detached!")
278
    end
279
    if event == "peripheral_detach" then
280
      peripherals = peripherals - 1
281
      print("A peripheral has been reattached!")
282
    end
283
  end
284
end
285
  
286
mon.setTextScale(0.5)
287
mon.setBackgroundColor(colors.black)
288
mon.setTextColor(colors.white)
289
mon.clear()
290
 
291
coil.setSpeed(4096)
292
coil.setTorque(0)
293
294
isOn = readState("isOn")
295
autoOn = readState("autoOn")
296
297
buttonAPI.drawButton(mon,2,2,16,7,colors.black,isOn and colors.red or colors.lime,isOn and "Stop" or "Start","startstop")
298
buttonAPI.drawButton(mon,20,2,16,7,colors.black,autoOn and colors.yellow or colors.blue,autoOn and "Automatic" or "Manual","manualauto")
299
 
300
if (notEmpty() ~= false) then
301
  updateDisplay(notEmpty().display_name)
302
else
303
  updateDisplay("Idle")
304
end
305
 
306
parallel.waitForAll(uiLoop, exLoop, jamLoop, peripheralLoop)