Evenly distribute charge across multiple batteries
authorKevin Zheng <kevinz5000@gmail.com>
Thu, 28 Nov 2013 20:20:38 +0000 (14:20 -0600)
committerKevin Zheng <kevinz5000@gmail.com>
Wed, 6 Aug 2014 17:08:48 +0000 (12:08 -0500)
technic/machines/switching_station.lua

index 6b59277aeb0618f6402f3ec5bec081351a3d8d33..55179175477aff7a1fbdbb64c745257ae98bf9ec 100644 (file)
@@ -1,7 +1,10 @@
 -- SWITCHING STATION
 -- The switching station is the center of all power distribution on an electric network.
--- The station will collect all produced power from producers (PR) and batteries (BA)
--- and distribute it to receivers (RE) and depleted batteries (BA).
+--
+-- The station collects power from sources (PR), distributes it to sinks (RE),
+-- and uses the excess/shortfall to charge and discharge batteries (BA).
+--
+-- For now, all supply and demand values are expressed in kW.
 --
 -- It works like this:
 --  All PR,BA,RE nodes are indexed and tagged with the switching station.
@@ -237,6 +240,30 @@ minetest.register_abm({
                local eu_input_str     = tier.."_EU_input"
                local eu_supply_str    = tier.."_EU_supply"
 
+               -- Distribute charge equally across multiple batteries.
+               local charge_total = 0
+               local battery_count = 0
+
+               for n, pos1 in pairs(BA_nodes) do
+                       meta1 = minetest.get_meta(pos1)
+                       local charge = meta1:get_int("internal_EU_charge")
+
+                       if (meta1:get_int(eu_demand_str) ~= 0) then
+                               charge_total = charge_total + charge
+                               battery_count = battery_count + 1
+                       end
+               end
+
+               local charge_distributed = math.floor(charge_total / battery_count)
+
+               for n, pos1 in pairs(BA_nodes) do
+                       meta1 = minetest.get_meta(pos1)
+
+                       if (meta1:get_int(eu_demand_str) ~= 0) then
+                               meta1:set_int("internal_EU_charge", charge_distributed)
+                       end
+               end
+
                -- Get all the power from the PR nodes
                local PR_eu_supply = 0 -- Total power
                for _, pos1 in pairs(PR_nodes) do