acidjazz / drmon

Draconic Reactor computercraft monitoring and failsafe interface
61 stars 85 forks source link

Automatic Shield Stabilization Not Working #16

Open VoidFyre opened 7 years ago

VoidFyre commented 7 years ago

I fixed the error on like 178 and got the program itself working, the fix mentioned in the previous posted issue, but now im realizing that the only thing not working is the automatic regulation of the shield. How can I fix this?

jefferyrlc commented 7 years ago

The reactor status has changed. The program is looking for a state of "online" when in reality it's "running" make the appropriate changes to your if statements and it should work.

jefferyrlc commented 7 years ago

To clarify more the status of the reactor is as follows

Cold (was offline) Warming_up (was charging) Running (was online) Cooling_down Abandon_all_hope (reactor is going to explode)

And the charged state is now defunct.

FrumpyPants commented 6 years ago

I went in and changed the if statements, however, the program still will not function in automatic mode. Has anyone else gotten it to work and if so, what exactly did you do? I do not need this program as a crutch, but it makes it super useful in outputting large amounts of RF with a single click or two. Thank you

jefferyrlc commented 6 years ago

I just tested this out again today and it still works for me, pasted below is the exact reator.lua I'm using:

-- modifiable variables local reactorSide = "back" local fluxgateSide = "right"

local targetStrength = 50 local maxTemperature = 8000 local safeTemperature = 3000 local lowestFieldPercent = 15

local activateOnCharged = 1

-- please leave things untouched from here on os.loadAPI("lib/f")

local version = "0.25" -- toggleable via the monitor, use our algorithm to achieve our target field strength or let the user tweak it local autoInputGate = 1 local curInputGate = 222000

-- monitor local mon, monitor, monX, monY

-- peripherals local reactor local fluxgate local inputfluxgate

-- reactor information local ri

-- last performed action local action = "None since reboot" local emergencyCharge = false local emergencyTemp = false

monitor = f.periphSearch("monitor") inputfluxgate = f.periphSearch("flux_gate") fluxgate = peripheral.wrap(fluxgateSide) reactor = peripheral.wrap(reactorSide)

if monitor == null then error("No valid monitor was found") end

if fluxgate == null then error("No valid fluxgate was found") end

if reactor == null then error("No valid reactor was found") end

if inputfluxgate == null then error("No valid flux gate was found") end

monX, monY = monitor.getSize() mon = {} mon.monitor,mon.X, mon.Y = monitor, monX, monY

--write settings to config file function save_config() sw = fs.open("config.txt", "w")
sw.writeLine(version) sw.writeLine(autoInputGate) sw.writeLine(curInputGate) sw.close() end

--read settings from file function load_config() sr = fs.open("config.txt", "r") version = sr.readLine() autoInputGate = tonumber(sr.readLine()) curInputGate = tonumber(sr.readLine()) sr.close() end

-- 1st time? save our settings, if not, load our settings if fs.exists("config.txt") == false then save_config() else load_config() end

function buttons()

while true do -- button handler event, side, xPos, yPos = os.pullEvent("monitor_touch")

-- output gate controls
-- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
-- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
if yPos == 8 then
  local cFlow = fluxgate.getSignalLowFlow()
  if xPos >= 2 and xPos <= 4 then
    cFlow = cFlow-1000
  elseif xPos >= 6 and xPos <= 9 then
    cFlow = cFlow-10000
  elseif xPos >= 10 and xPos <= 12 then
    cFlow = cFlow-100000
  elseif xPos >= 17 and xPos <= 19 then
    cFlow = cFlow+100000
  elseif xPos >= 21 and xPos <= 23 then
    cFlow = cFlow+10000
  elseif xPos >= 25 and xPos <= 27 then
    cFlow = cFlow+1000
  end
  fluxgate.setSignalLowFlow(cFlow)
end

-- input gate controls
-- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
-- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
if yPos == 10 and autoInputGate == 0 and xPos ~= 14 and xPos ~= 15 then
  if xPos >= 2 and xPos <= 4 then
    curInputGate = curInputGate-1000
  elseif xPos >= 6 and xPos <= 9 then
    curInputGate = curInputGate-10000
  elseif xPos >= 10 and xPos <= 12 then
    curInputGate = curInputGate-100000
  elseif xPos >= 17 and xPos <= 19 then
    curInputGate = curInputGate+100000
  elseif xPos >= 21 and xPos <= 23 then
    curInputGate = curInputGate+10000
  elseif xPos >= 25 and xPos <= 27 then
    curInputGate = curInputGate+1000
  end
  inputfluxgate.setSignalLowFlow(curInputGate)
  save_config()
end

-- input gate toggle
if yPos == 10 and ( xPos == 14 or xPos == 15) then
  if autoInputGate == 1 then
    autoInputGate = 0
  else
    autoInputGate = 1
  end
  save_config()
end

end end

function drawButtons(y)

-- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000 -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000

f.draw_text(mon, 2, y, " < ", colors.white, colors.gray) f.draw_text(mon, 6, y, " <<", colors.white, colors.gray) f.draw_text(mon, 10, y, "<<<", colors.white, colors.gray)

f.draw_text(mon, 17, y, ">>>", colors.white, colors.gray) f.draw_text(mon, 21, y, ">> ", colors.white, colors.gray) f.draw_text(mon, 25, y, " > ", colors.white, colors.gray) end

function update() while true do

f.clear(mon)

ri = reactor.getReactorInfo()

-- print out all the infos from .getReactorInfo() to term

if ri == nil then
  error("reactor has an invalid setup")
end

for k, v in pairs (ri) do
  print(k.. ": ".. tostring(v))
end
print("Output Gate: ", fluxgate.getSignalLowFlow())
print("Input Gate: ", inputfluxgate.getSignalLowFlow())

-- monitor output

local statusColor
statusColor = colors.red

if ri.status == "running" or ri.status == "charged" then
  statusColor = colors.green
elseif ri.status == "cold" then
  statusColor = colors.gray
elseif ri.status == "warming_up" then
  statusColor = colors.orange
end

f.draw_text_lr(mon, 2, 2, 1, "Reactor Status", string.upper(ri.status), colors.white, statusColor, colors.black)

f.draw_text_lr(mon, 2, 4, 1, "Generation", f.format_int(ri.generationRate) .. " rf/t", colors.white, colors.lime, colors.black)

local tempColor = colors.red
if ri.temperature <= 5000 then tempColor = colors.green end
if ri.temperature >= 5000 and ri.temperature <= 6500 then tempColor = colors.orange end
f.draw_text_lr(mon, 2, 6, 1, "Temperature", f.format_int(ri.temperature) .. "C", colors.white, tempColor, colors.black)

f.draw_text_lr(mon, 2, 7, 1, "Output Gate", f.format_int(fluxgate.getSignalLowFlow()) .. " rf/t", colors.white, colors.blue, colors.black)

-- buttons
drawButtons(8)

f.draw_text_lr(mon, 2, 9, 1, "Input Gate", f.format_int(inputfluxgate.getSignalLowFlow()) .. " rf/t", colors.white, colors.blue, colors.black)

if autoInputGate == 1 then
  f.draw_text(mon, 14, 10, "AU", colors.white, colors.gray)
else
  f.draw_text(mon, 14, 10, "MA", colors.white, colors.gray)
  drawButtons(10)
end

local satPercent
satPercent = math.ceil(ri.energySaturation / ri.maxEnergySaturation * 10000)*.01

f.draw_text_lr(mon, 2, 11, 1, "Energy Saturation", satPercent .. "%", colors.white, colors.white, colors.black)
f.progress_bar(mon, 2, 12, mon.X-2, satPercent, 100, colors.blue, colors.gray)

local fieldPercent, fieldColor
fieldPercent = math.ceil(ri.fieldStrength / ri.maxFieldStrength * 10000)*.01

fieldColor = colors.red
if fieldPercent >= 50 then fieldColor = colors.green end
if fieldPercent < 50 and fieldPercent > 30 then fieldColor = colors.orange end

if autoInputGate == 1 then 
  f.draw_text_lr(mon, 2, 14, 1, "Field Strength T:" .. targetStrength, fieldPercent .. "%", colors.white, fieldColor, colors.black)
else
  f.draw_text_lr(mon, 2, 14, 1, "Field Strength", fieldPercent .. "%", colors.white, fieldColor, colors.black)
end
f.progress_bar(mon, 2, 15, mon.X-2, fieldPercent, 100, fieldColor, colors.gray)

local fuelPercent, fuelColor

fuelPercent = 100 - math.ceil(ri.fuelConversion / ri.maxFuelConversion * 10000)*.01

fuelColor = colors.red

if fuelPercent >= 70 then fuelColor = colors.green end
if fuelPercent < 70 and fuelPercent > 30 then fuelColor = colors.orange end

f.draw_text_lr(mon, 2, 17, 1, "Fuel ", fuelPercent .. "%", colors.white, fuelColor, colors.black)
f.progress_bar(mon, 2, 18, mon.X-2, fuelPercent, 100, fuelColor, colors.gray)

f.draw_text_lr(mon, 2, 19, 1, "Action ", action, colors.gray, colors.gray, colors.black)

-- actual reactor interaction
--
if emergencyCharge == true then
  reactor.chargeReactor()
end

-- are we warming_up? open the floodgates
if ri.status == "warming_up" then
  inputfluxgate.setSignalLowFlow(900000)
  emergencyCharge = false
end

-- are we stopping from a shutdown and our temp is better? activate
if emergencyTemp == true and ri.status == "stopping" and ri.temperature < safeTemperature then
  reactor.activateReactor()
  emergencyTemp = false
end

-- are we charged? lets activate
if ri.status == "warming_up" and ri.temperature >= 2000 and activateOnCharged == 1 then
  reactor.activateReactor()
end

-- are we on? regulate the input fludgate to our target field strength
-- or set it to our saved setting since we are on manual
if ri.status == "running" then
  if autoInputGate == 1 then 
    fluxval = ri.fieldDrainRate / (1 - (targetStrength/100) )
    print("Target Gate: ".. fluxval)
    inputfluxgate.setSignalLowFlow(fluxval)
  else
    inputfluxgate.setSignalLowFlow(curInputGate)
  end
end

-- safeguards
--

-- out of fuel, kill it
if fuelPercent <= 10 then
  reactor.stopReactor()
  action = "Fuel below 10%, refuel"
end

-- field strength is too dangerous, kill and it try and charge it before it blows
if fieldPercent <= lowestFieldPercent and ri.status == "running" then
  action = "Field Str < " ..lowestFieldPercent.."%"
  reactor.stopReactor()
  reactor.chargeReactor()
  emergencyCharge = true
end

-- temperature too high, kill it and activate it when its cool
if ri.temperature > maxTemperature then
  reactor.stopReactor()
  action = "Temp > " .. maxTemperature
  emergencyTemp = true
end

sleep(0.1)

end end

parallel.waitForAny(buttons, update)

jefferyrlc commented 6 years ago

Some other things to point out:

make sure your input flux is pointing towards the reactor energy injector, and that your input source is on the other side (the input of the arrow you can see on the side). if you don't have it setup this way, no program is going to be able to control power input because it won't have any.