Add digiline interface and is_passive function to LuaATC

master
orwell96 2018-04-25 17:14:03 +02:00
parent 8b576357ef
commit 1feae7a1ea
6 changed files with 58 additions and 8 deletions

View File

@ -63,6 +63,10 @@ setstate(pos, newstate)
Set the state of the passive component at position 'pos'.
pos can be either a position vector (created by POS()) or a string, the name of this passive component.
is_passive(pos)
Checks whether there is a passive component at the position pos (and/or whether a passive component with this name exists)
pos can be either a position vector (created by POS()) or a string, the name of this passive component.
interrupt(time, message)
Cause LuaAutomation to trigger an 'int' event on this component after the given time in seconds with the specified 'message' field. 'message' can be of any Lua data type.
Not available in init code!
@ -71,6 +75,10 @@ interrupt_pos(pos, message)
Immediately trigger an 'ext_int' event on the active component at position pos. 'message' is like in interrupt().
USE WITH CARE, or better don't use! Incorrect use can result in expotential growth of interrupts.
digiline_send(channel, message)
Make this active component send a digiline message on the specified channel.
Not available in init code!
## Components and events
The event table is a table of the following format:
@ -110,6 +118,9 @@ Fired when an interrupt set by the 'interrupt' function runs out. 'message' is t
{type="ext_int", ext_int=true, message=<message>}
Fired when another node called 'interrupt_pos' on this position. 'message' is the message passed to the interrupt_pos function.
{type="digiline", digiline=true, channel=<channel>, msg=<message>}
Fired when the controller receives a digiline message.
In addition to the default environment functions, the following functions are available:
atc_send(<atc_command>)
@ -132,7 +143,7 @@ set_line(number)
# Operator panel
This simple node executes its actions when punched. It can be used to change a switch and update the corresponding signals or similar applications.
The event fired is {type="punch", punch=true} by default. In case of an interrupt, the events are similar to the ones of the ATC rail.
The event fired is {type="punch", punch=true} by default. In case of an interrupt or a digiline message, the events are similar to the ones of the ATC rail.
### Passive components

View File

@ -111,9 +111,19 @@ function ac.run_in_env(pos, evtdata, customfct_p)
end
local customfct=customfct_p or {}
-- add interrupt function
customfct.interrupt=function(t, imesg)
assertt(t, "number")
assert(t >= 0)
atlatc.interrupt.add(t, pos, {type="int", int=true, message=imesg})
end
-- add digiline_send function, if digiline is loaded
if digiline then
customfct.digiline_send=function(channel, msg)
assertt(channel, "string")
digiline:receptor_send(pos, digiline.rules.default, channel, msg)
end
end
local datain=nodetbl.data or {}
local succ, dataout = atlatc.envs[nodetbl.env]:execute_code(datain, nodetbl.code, evtdata, customfct)
@ -131,4 +141,8 @@ function ac.run_in_env(pos, evtdata, customfct_p)
end
end
function ac.on_digiline_receive(pos, node, channel, msg)
atlatc.interrupt.add(0, pos, {type="digiline", digiline=true, channel = channel, msg = msg})
end
atlatc.active=ac

View File

@ -119,9 +119,15 @@ advtrains.register_tracks("default", {
},
luaautomation = {
fire_event=r.fire_event
}
},
digiline = {
receptor = {},
effector = {
action = atlatc.active.on_digiline_receive
},
},
}
end
end,
}, advtrains.trackpresets.t_30deg_straightonly)

View File

@ -86,7 +86,7 @@ local function safe_string_find(...)
end
local mp=minetest.get_modpath("advtrains_luaautomation")
local p_api_getstate, p_api_setstate = dofile(mp.."/passive.lua")
local p_api_getstate, p_api_setstate, p_api_is_passive = dofile(mp.."/passive.lua")
local static_env = {
--core LUA functions
@ -150,7 +150,8 @@ local static_env = {
POS = function(x,y,z) return {x=x, y=y, z=z} end,
getstate = p_api_getstate,
setstate = p_api_setstate,
--interrupts are handled per node, position unknown.
is_passive = p_api_is_passive,
--interrupts are handled per node, position unknown. (same goes for digilines)
--however external interrupts can be set here.
interrupt_pos = function(pos, imesg)
if not type(pos)=="table" or not pos.x or not pos.y or not pos.z then

View File

@ -18,6 +18,11 @@ minetest.register_node("advtrains_luaautomation:oppanel", {
on_punch = on_punch,
luaautomation = {
fire_event=atlatc.active.run_in_env
}
},
digiline = {
receptor = {},
effector = {
action = atlatc.active.on_digiline_receive
},
},
})

View File

@ -34,6 +34,19 @@ local function setstate(parpos, newstate)
end
end
local function is_passive(parpos)
local pos=atlatc.pcnaming.resolve_pos(parpos)
if type(pos)~="table" or (not pos.x or not pos.y or not pos.z) then
return false
end
local node=advtrains.ndb.get_node(pos)
local ndef=minetest.registered_nodes[node.name]
if ndef and ndef.luaautomation and ndef.luaautomation.getstate then
return true
end
return false
end
-- gets called from environment.lua
-- return the values here to keep them local
return getstate, setstate
return getstate, setstate, is_passive