105 lines
1.8 KiB
Lua
105 lines
1.8 KiB
Lua
|
|
PortTypes = {
|
|
output = 0,
|
|
input = 1,
|
|
}
|
|
|
|
PortDirections = {
|
|
[0] = {-1, 0, 0},
|
|
[1] = {0, 1, 0},
|
|
[2] = {1, 0, 0},
|
|
[3] = {0, -1, 0},
|
|
[4] = {0, 0, 1},
|
|
[5] = {0, 0, -1}
|
|
}
|
|
|
|
Port = {}
|
|
|
|
FFI.cdef[[
|
|
struct Gate;
|
|
struct Port {
|
|
bool state;
|
|
char type;
|
|
char direction;
|
|
bool causeupdate;
|
|
int position[3];
|
|
struct Gate* gate;
|
|
struct Net* group;
|
|
};
|
|
]]
|
|
|
|
function Port.new(self, type, direction, position, causeupdate, sim)
|
|
local o = {
|
|
type = type,
|
|
direction = direction,
|
|
position = position,
|
|
causeupdate = causeupdate,
|
|
state = false,
|
|
gate = nil,
|
|
group = nil,
|
|
sim = sim,
|
|
}
|
|
setmetatable(o, self)
|
|
self.__index = self
|
|
return o
|
|
end
|
|
|
|
function Port.setstate(port, state)
|
|
if state ~= port.state then
|
|
port.state = state
|
|
Simulation.queuegroup(Port.getsim(port), port.group)
|
|
end
|
|
end
|
|
|
|
function Port.setinputstate(port, state)
|
|
if state ~= port.state then
|
|
port.state = state
|
|
if port.causeupdate then
|
|
Simulation.queuegate(Port.getsim(port), port.gate)
|
|
end
|
|
end
|
|
end
|
|
|
|
function Port.getconnectionposition(port)
|
|
local offset = PortDirections[port.direction]
|
|
return {port.position[1]+offset[1], port.position[2]+offset[2], port.position[3]+offset[3]}
|
|
end
|
|
|
|
function Port.isrising(port)
|
|
if port.group == nil then
|
|
return false
|
|
end
|
|
return port.group.state and (port.group.updatetick == Port.getsim(port).currenttick)
|
|
end
|
|
|
|
function Port.isfalling(port)
|
|
if port.group == nil then
|
|
return false
|
|
end
|
|
return port.group.state == false and (port.updatetick == Port.getsim(port).currenttick)
|
|
end
|
|
|
|
function Port.setgate(port, gate)
|
|
port.gate = gate
|
|
end
|
|
|
|
function Port.setgroup(port, group)
|
|
port.group = group
|
|
end
|
|
|
|
function Port.getgroup(port)
|
|
return port.group
|
|
end
|
|
|
|
function Port.gettype(port)
|
|
return port.type
|
|
end
|
|
|
|
function Port.getstate(port)
|
|
return port.state
|
|
end
|
|
|
|
function Port.getsim(port)
|
|
return port.sim
|
|
end
|