Adding farm management
authorOlav Bakke Svendsen <mail@olavbs.no>
Tue, 17 Oct 2023 05:17:18 +0000 (07:17 +0200)
committerOlav Bakke Svendsen <mail@olavbs.no>
Tue, 17 Oct 2023 05:17:18 +0000 (07:17 +0200)
steam/temporary-coal-feeder.lua

index 096d7d84099bc3aef874b97308c908eeac95e6d0..7324f9f14f3c00304a4f57635e56d4beff43f5fc 100644 (file)
@@ -3,9 +3,15 @@
 local refill_when = function(amt) return amt < 2 end
 local refill_amt  = 2
 
+local start_wood_when = function(amt) return amt < 1000 end
+local stop_wood_when = function(amt) return amt > 40000 end
+local rs_wood_side = "back"
+local start_coal_when = function(amt) return amt < 500  end
+local stop_coal_when = function(amt) return amt > 8000 end
+local rs_coal_side = "left"
+
 local main_monitor_name = "monitor_3"
 local main_monitor = peripheral.wrap(main_monitor_name)
--- local treefarm_monitor = peripheral.wrap("monitor_0")
 
 local coal_barrels = {}
 for _,n in pairs({ "1", "0" }) do
@@ -25,19 +31,26 @@ for _,p in pairs(peripheral.getNames()) do
   end
 end
 
-local find_coal = function()
-  local stock = {}
+local take_stock = function()
+  local coal_stock = {}
   for addr, barrel in pairs(coal_barrels) do
     local item = barrel.getItemDetail(1)
     local amt = item and item.count or 0
-    stock[addr] = amt
+    coal_stock[addr] = amt
+  end
+  local wood_stock = 0
+  for slot, item in pairs(tree_barrel.list()) do
+    if item.name and item.name == "minecraft:spruce_log" then
+      wood_stock = item.count
+      break
+    end
   end
-  return stock
+  return coal_stock, wood_stock
 end
 
-local fullest_coal_barrel = function(stock)
+local fullest_coal_barrel = function(coal_stock)
   local r = { addr = false, count = 0 }
-  for barrel_addr, count in pairs(stock) do
+  for barrel_addr, count in pairs(coal_stock) do
     if count >= r.count then
       r = { addr = barrel_addr, count = count }
     end
@@ -45,16 +58,16 @@ local fullest_coal_barrel = function(stock)
   return r.addr, r.count
 end
 
-local feed = function(stock)
-  local stock = stock
+local feed = function(coal_stock)
+  local coal_stock = coal_stock
   for deployer_addr,deployer in pairs(deployers) do
     local deployer_item = deployer.getItemDetail(1)
     if refill_when(deployer_item and deployer_item.count or 0) then
       local f = function() return false, "No coal available" end
-      local barrel_addr, count = fullest_coal_barrel(stock)
+      local barrel_addr, count = fullest_coal_barrel(coal_stock)
 --       for barrel_addr,count in pairs(stock) do
       if count >= refill_amt then
-        stock[barrel_addr] = count - refill_amt
+        coal_stock[barrel_addr] = count - refill_amt
         f = function() return deployer.pullItems(barrel_addr, 1, refill_amt, 1) end
 --           break
       end
@@ -67,13 +80,39 @@ local feed = function(stock)
   end
 end
 
+local manage_farms = function(coal_stock, wood_stock)
+  local coal_online = not rs.getOutput(rs_coal_side)
+  local wood_online = not rs.getOutput(rs_wood_side)
+
+  local total_coal = 0
+  for _, v in pairs(coal_stock) do
+    total_coal = total_coal + v
+  end
+
+  if coal_online then
+    if stop_coal_when(total_coal) then rs.setOutput(rs_coal_side, true) end
+  else
+    if start_coal_when(total_coal) then rs.setOutput(rs_coal_side, false) end
+  end
+
+  if wood_online then
+    if stop_wood_when(wood_stock) then rs.setOutput(rs_wood_side, true) end
+  else
+    if start_wood_when(wood_stock) then rs.setOutput(rs_wood_side, false) end
+  end
+
+  coal_online = not rs.getOutput(rs_coal_side)
+  wood_online = not rs.getOutput(rs_wood_side)
+  return coal_online, wood_online
+end
+
 local coal_at_boot = false
 local minutes_passed = -1
 
-local print_stats = function(monitor, stock)
+local print_stats = function(monitor, coal_stock, wood_stock, coal_online, wood_online)
   local total_coal = 0
   local str = ""
-  for k,v in pairs(stock) do
+  for k,v in pairs(coal_stock) do
     total_coal = total_coal + v
     str = str.." + "..tostring(v)
   end
@@ -88,18 +127,32 @@ local print_stats = function(monitor, stock)
   monitor.setCursorPos(1,4)
   monitor.setTextColor(colors.gray)
   monitor.write(string.gsub(str, "^%s++%s*", ""))
+
+  monitor.setCursorPos(1,6)
+  monitor.setTextColor(colors.white)
+  monitor.write("treefarm:          ")
+  monitor.setTextColor(wood_online and colors.green or colors.red)
+  monitor.write(wood_online and "online" or "offline")
+
+  monitor.setCursorPos(1,7)
+  monitor.setTextColor(colors.white)
+  monitor.write("charcoal blasters: ")
+  monitor.setTextColor(coal_online and colors.green or colors.red)
+  monitor.write(wood_online and "online" or "offline")
+
   monitor.setCursorPos(1,12)
+  monitor.setTextColor(colors.gray)
   monitor.write("refreshes once every minute")
   
   -- this doesn't work for some reason..
-  monitor.setTextColor(colors.white)
-  coal_at_boot = coal_at_boot or total_coal
-  minutes_passed = minutes_passed + 1
-  if minutes_passed < 0 then
-    local avg = (coal_at_boot - total_coal)/minutes_passed
-    monitor.setCursorPos(1,6)
-    monitor.write("losing on average "..tostring(avg).."cc/m")
-  end
+--   monitor.setTextColor(colors.white)
+--   coal_at_boot = coal_at_boot or total_coal
+--   minutes_passed = minutes_passed + 1
+--   if minutes_passed < 0 then
+--     local avg = (coal_at_boot - total_coal)/minutes_passed
+--     monitor.setCursorPos(1,6)
+--     monitor.write("losing on average "..tostring(avg).."cc/m")
+--   end
 end
 
 local spinner_chars = {"\\","-","/","|"}
@@ -129,10 +182,11 @@ while true do
     main_timer = os.startTimer(60)
     os.cancelTimer(spinner_timer)
     print_spinner(main_monitor, 29,12, "?")
-    local stock = find_coal()
-    print_stats(main_monitor, stock)
+    local coal_stock, wood_stock = take_stock()
+    local coal_online, wood_online = manage_farms(coal_stock, wood_stock)
+    print_stats(main_monitor, coal_stock, wood_stock, coal_online, wood_online)
     print_spinner(main_monitor, 29,12, "*")
-    feed(stock)
+    feed(coal_stock)
     spinner_timer = os.startTimer(0)
   elseif e[1] == "timer" and e[2] == spinner_timer then
     spinner_timer = os.startTimer(0.5)