From 987cc5a6a425b1f9bcd9000608dc389a45c675a1 Mon Sep 17 00:00:00 2001 From: you <ovvv@web.de> Date: Mon, 05 Jun 2017 16:51:59 +0200 Subject: [PATCH] Add api documentation (#361) --- technic/machines/switching_station.lua | 121 +++++++++++++++++++++++++-------------- 1 files changed, 77 insertions(+), 44 deletions(-) diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua index f925817..40b40e7 100644 --- a/technic/machines/switching_station.lua +++ b/technic/machines/switching_station.lua @@ -1,40 +1,14 @@ --- SWITCHING STATION --- The switching station is the center of all power distribution on an electric network. --- --- 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. --- The tagging is to allow more stations to be built without allowing a cheat --- with duplicating power. --- All the RE nodes are queried for their current EU demand. Those which are off --- would require no or a small standby EU demand, while those which are on would --- require more. --- If the total demand is less than the available power they are all updated with the --- demand number. --- If any surplus exists from the PR nodes the batteries will be charged evenly with this. --- If the total demand requires draw on the batteries they will be discharged evenly. --- --- If the total demand is more than the available power all RE nodes will be shut down. --- We have a brown-out situation. --- --- Hence all the power distribution logic resides in this single node. --- --- Nodes connected to the network will have one or more of these parameters as meta data: --- <LV|MV|HV>_EU_supply : Exists for PR and BA node types. This is the EU value supplied by the node. Output --- <LV|MV|HV>_EU_demand : Exists for RE and BA node types. This is the EU value the node requires to run. Output --- <LV|MV|HV>_EU_input : Exists for RE and BA node types. This is the actual EU value the network can give the node. Input --- --- The reason the LV|MV|HV type is prepended toe meta data is because some machine could require several supplies to work. --- This way the supplies are separated per network. +-- See also technic/doc/api.md technic.networks = {} technic.cables = {} +local mesecons_path = minetest.get_modpath("mesecons") +local digilines_path = minetest.get_modpath("digilines") + local S = technic.getter + +local cable_entry = "^technic_cable_connection_overlay.png" minetest.register_craft({ output = "technic:switching_station", @@ -45,11 +19,22 @@ } }) +local mesecon_def +if mesecons_path then + mesecon_def = {effector = { + rules = mesecon.rules.default, + }} +end + minetest.register_node("technic:switching_station",{ description = S("Switching Station"), - tiles = {"technic_water_mill_top_active.png", "technic_water_mill_top_active.png", - "technic_water_mill_top_active.png", "technic_water_mill_top_active.png", - "technic_water_mill_top_active.png", "technic_water_mill_top_active.png"}, + tiles = { + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png"..cable_entry, + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png", + "technic_water_mill_top_active.png"}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_all_tiers=1}, connect_sides = {"bottom"}, sounds = default.node_sound_wood_defaults(), @@ -57,12 +42,45 @@ local meta = minetest.get_meta(pos) meta:set_string("infotext", S("Switching Station")) meta:set_string("active", 1) + meta:set_string("channel", "switching_station"..minetest.pos_to_string(pos)) + meta:set_string("formspec", "field[channel;Channel;${channel}]") end, after_dig_node = function(pos) minetest.forceload_free_block(pos) pos.y = pos.y - 1 minetest.forceload_free_block(pos) end, + on_receive_fields = function(pos, formname, fields, sender) + if not fields.channel then + return + end + local plname = sender:get_player_name() + if minetest.is_protected(pos, plname) then + minetest.record_protection_violation(pos, plname) + return + end + local meta = minetest.get_meta(pos) + meta:set_string("channel", fields.channel) + end, + mesecons = mesecon_def, + digiline = { + receptor = {action = function() end}, + effector = { + action = function(pos, node, channel, msg) + if msg ~= "GET" and msg ~= "get" then + return + end + local meta = minetest.get_meta(pos) + if channel ~= meta:get_string("channel") then + return + end + digilines.receptor_send(pos, digilines.rules.default, channel, { + supply = meta:get_int("supply"), + demand = meta:get_int("demand") + }) + end + }, + }, }) -------------------------------------------------- @@ -190,7 +208,7 @@ local BA_nodes local RE_nodes local machine_name = S("Switching Station") - + -- Which kind of network are we on: pos1 = {x=pos.x, y=pos.y-1, z=pos.z} @@ -216,9 +234,9 @@ minetest.forceload_free_block(pos1) return end - + -- Run all the nodes - local function run_nodes(list) + local function run_nodes(list, run_stage) for _, pos2 in ipairs(list) do technic.get_or_load_node(pos2) local node2 = minetest.get_node(pos2) @@ -227,14 +245,14 @@ nodedef = minetest.registered_nodes[node2.name] end if nodedef and nodedef.technic_run then - nodedef.technic_run(pos2, node2) + nodedef.technic_run(pos2, node2, run_stage) end end end - - run_nodes(PR_nodes) - run_nodes(RE_nodes) - run_nodes(BA_nodes) + + run_nodes(PR_nodes, technic.producer) + run_nodes(RE_nodes, technic.receiver) + run_nodes(BA_nodes, technic.battery) -- Strings for the meta data local eu_demand_str = tier.."_EU_demand" @@ -301,6 +319,19 @@ S("@1. Supply: @2 Demand: @3", machine_name, technic.pretty_num(PR_eu_supply), technic.pretty_num(RE_eu_demand))) + -- If mesecon signal and power supply or demand changed then + -- send them via digilines. + if mesecons_path and digilines_path and mesecon.is_powered(pos) then + if PR_eu_supply ~= meta:get_int("supply") or + RE_eu_demand ~= meta:get_int("demand") then + local channel = meta:get_string("channel") + digilines.receptor_send(pos, digilines.rules.default, channel, { + supply = PR_eu_supply, + demand = RE_eu_demand + }) + end + end + -- Data that will be used by the power monitor meta:set_int("supply",PR_eu_supply) meta:set_int("demand",RE_eu_demand) @@ -366,7 +397,7 @@ meta1 = minetest.get_meta(pos1) meta1:set_int(eu_input_str, 0) end - + end, }) @@ -385,6 +416,7 @@ end end minetest.register_abm({ + label = "Machines: timeout check", nodenames = {"group:technic_machine"}, interval = 1, chance = 1, @@ -410,6 +442,7 @@ --Re-enable disabled switching station if necessary, similar to the timeout above minetest.register_abm({ + label = "Machines: re-enable check", nodenames = {"technic:switching_station"}, interval = 1, chance = 1, -- Gitblit v1.8.0