309 lines
7.3 KiB
Lua
309 lines
7.3 KiB
Lua
--[[
|
|
Time Gates
|
|
]]
|
|
|
|
GateActions("Time")
|
|
|
|
GateActions["accumulator"] = {
|
|
name = "Accumulator",
|
|
inputs = { "A", "Hold", "Reset" },
|
|
timed = true,
|
|
output = function(gate, A, Hold, Reset)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
if (Reset > 0) then
|
|
gate.Accum = 0
|
|
elseif (Hold <= 0) then
|
|
gate.Accum = gate.Accum+A*DeltaTime
|
|
end
|
|
return gate.Accum or 0
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, A, Hold, Reset)
|
|
return "A:"..A.." Hold:"..Hold.." Reset:"..Reset.." = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["smoother"] = {
|
|
name = "Smoother",
|
|
inputs = { "A", "Rate" },
|
|
timed = true,
|
|
output = function(gate, A, Rate)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
local Delta = A-gate.Accum
|
|
if (Delta > 0) then
|
|
gate.Accum = gate.Accum+math.min(Delta, Rate*DeltaTime)
|
|
elseif (Delta < 0) then
|
|
gate.Accum = gate.Accum+math.max(Delta, -Rate*DeltaTime)
|
|
end
|
|
return gate.Accum or 0
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, A, Rate)
|
|
return "A:"..A.." Rate:"..Rate.." = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["timer"] = {
|
|
name = "Timer",
|
|
inputs = { "Run", "Reset" },
|
|
timed = true,
|
|
output = function(gate, Run, Reset)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
if ( Reset > 0 ) then
|
|
gate.Accum = 0
|
|
elseif ( Run > 0 ) then
|
|
gate.Accum = gate.Accum+DeltaTime
|
|
end
|
|
return gate.Accum or 0
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, Run, Reset)
|
|
return "Run:"..Run.." Reset:"..Reset.." = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["ostime"] = {
|
|
name = "OS Time",
|
|
inputs = { },
|
|
timed = true,
|
|
output = function(gate)
|
|
return os.date("%H")*3600+os.date("%M")*60+os.date("%S")
|
|
end,
|
|
label = function(Out)
|
|
return "OS Time = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["osdate"] = {
|
|
name = "OS Date",
|
|
inputs = { },
|
|
timed = true,
|
|
output = function(gate)
|
|
return os.date("%Y")*366+os.date("%j")
|
|
end,
|
|
label = function(Out)
|
|
return "OS Date = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["pulser"] = {
|
|
name = "Pulser",
|
|
inputs = { "Run", "Reset", "TickTime" },
|
|
timed = true,
|
|
output = function(gate, Run, Reset, TickTime)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
if ( Reset > 0 ) then
|
|
gate.Accum = 0
|
|
elseif ( Run > 0 ) then
|
|
gate.Accum = gate.Accum+DeltaTime
|
|
if (gate.Accum >= TickTime) then
|
|
gate.Accum = gate.Accum - TickTime
|
|
return 1
|
|
end
|
|
end
|
|
return 0
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, Run, Reset, TickTime)
|
|
return "Run:"..Run.." Reset:"..Reset.."TickTime:"..TickTime.." = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["squarepulse"] = {
|
|
name = "Square Pulse",
|
|
inputs = { "Run", "Reset", "PulseTime", "GapTime", "Min", "Max" },
|
|
timed = true,
|
|
output = function(gate, Run, Reset, PulseTime, GapTime, Min, Max)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
|
|
if (Reset > 0) then
|
|
gate.Accum = 0
|
|
elseif (Run > 0) then
|
|
gate.Accum = gate.Accum+DeltaTime
|
|
if (gate.Accum <= PulseTime) then
|
|
return Max
|
|
end
|
|
if (gate.Accum >= PulseTime + GapTime) then
|
|
gate.Accum = 0
|
|
end
|
|
end
|
|
return Min
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, Run, Reset, PulseTime, GapTime)
|
|
return "Run:"..Run.." Reset:"..Reset.." PulseTime:"..PulseTime.." GapTime:"..GapTime.." = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["sawpulse"] = {
|
|
name = "Saw Pulse",
|
|
inputs = { "Run", "Reset", "SlopeRaiseTime", "PulseTime", "SlopeDescendTime", "GapTime", "Min", "Max" },
|
|
timed = true,
|
|
output = function(gate, Run, Reset, SlopeRaiseTime, PulseTime, SlopeDescendTime, GapTime, Min, Max)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
|
|
if Reset > 0 then
|
|
gate.Accum = 0
|
|
return Min
|
|
end
|
|
if Run <= 0 then
|
|
return Min
|
|
end
|
|
|
|
SlopeRaiseTime = math.max(SlopeRaiseTime, 0)
|
|
PulseTime = math.max(PulseTime, 0)
|
|
SlopeDescendTime = math.max(SlopeDescendTime, 0)
|
|
GapTime = math.max(GapTime, 0)
|
|
|
|
gate.Accum = (gate.Accum + DeltaTime) % (SlopeRaiseTime + PulseTime + SlopeDescendTime + GapTime)
|
|
if gate.Accum < SlopeRaiseTime then
|
|
return Min + (Max - Min) * gate.Accum / SlopeRaiseTime
|
|
elseif gate.Accum < SlopeRaiseTime + PulseTime then
|
|
return Max
|
|
elseif gate.Accum < SlopeRaiseTime + PulseTime + SlopeDescendTime then
|
|
return Max + (Min - Max) * (gate.Accum - SlopeRaiseTime - PulseTime) / SlopeDescendTime
|
|
else
|
|
return Min
|
|
end
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, Run, Reset, PulseTime, GapTime)
|
|
return "Run:"..Run.." Reset:"..Reset.." PulseTime:"..PulseTime.." GapTime:"..GapTime.." = "..Out
|
|
end
|
|
}
|
|
|
|
|
|
GateActions["derive"] = {
|
|
name = "Derivative",
|
|
inputs = {"A"},
|
|
timed = false,
|
|
output = function(gate, A)
|
|
local t = CurTime()
|
|
local dT = t - gate.LastT
|
|
gate.LastT = t
|
|
local dA = A - gate.LastA
|
|
gate.LastA = A
|
|
if dT ~= 0 then
|
|
return dA/dT
|
|
else
|
|
return 0;
|
|
end
|
|
end,
|
|
reset = function(gate)
|
|
gate.LastT = CurTime()
|
|
gate.LastA = 0
|
|
end,
|
|
label = function(Out, A)
|
|
return "d/dt["..A.."] = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions["delay"] = {
|
|
name = "Delay",
|
|
inputs = { "Clk", "Delay", "Hold", "Reset" },
|
|
outputs = { "Out", "TimeElapsed", "Remaining" },
|
|
timed = true,
|
|
output = function(gate, Clk, Delay, Hold, Reset)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
local out = 0
|
|
|
|
if ( Reset > 0 ) then
|
|
gate.Stage = 0
|
|
gate.Accum = 0
|
|
end
|
|
|
|
if ( gate.Stage == 1 ) then
|
|
if ( gate.Accum >= Delay ) then
|
|
gate.Stage = 2
|
|
gate.Accum = 0
|
|
out = 1
|
|
else
|
|
gate.Accum = gate.Accum+DeltaTime
|
|
end
|
|
elseif ( gate.Stage == 2 ) then
|
|
if ( gate.Accum >= Hold ) then
|
|
gate.Stage = 0
|
|
gate.Accum = 0
|
|
out = 0
|
|
else
|
|
out = 1
|
|
gate.Accum = gate.Accum+DeltaTime
|
|
end
|
|
else
|
|
if ( Clk > 0 ) then
|
|
gate.Stage = 1
|
|
gate.Accum = 0
|
|
end
|
|
end
|
|
|
|
return out, gate.Accum, Delay-gate.Accum
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
gate.Stage = 0
|
|
end,
|
|
label = function(Out, Clk, Delay, Hold, Reset)
|
|
return "Clk: "..Clk.." Delay: "..Delay..
|
|
"\nHold: "..Hold.." Reset: "..Reset..
|
|
"\nTime Elapsed: "..Out.TimeElapsed.." = "..Out.Out
|
|
end
|
|
}
|
|
|
|
|
|
GateActions["monostable"] = {
|
|
name = "Monostable Timer",
|
|
inputs = { "Run", "Time", "Reset" },
|
|
timed = true,
|
|
output = function(gate, Run, Time, Reset)
|
|
local DeltaTime = CurTime()-(gate.PrevTime or CurTime())
|
|
gate.PrevTime = (gate.PrevTime or CurTime())+DeltaTime
|
|
if ( Reset > 0 ) then
|
|
gate.Accum = 0
|
|
elseif gate.Accum > 0 or Run > 0 then
|
|
gate.Accum = gate.Accum+DeltaTime
|
|
if(gate.Accum > Time) then
|
|
gate.Accum = 0
|
|
end
|
|
end
|
|
if(gate.Accum > 0)then
|
|
return 1
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
reset = function(gate)
|
|
gate.PrevTime = CurTime()
|
|
gate.Accum = 0
|
|
end,
|
|
label = function(Out, Run, Time, Reset)
|
|
return "Run:"..Run.." Time:"..Time.." Reset:"..Reset.." = "..Out
|
|
end
|
|
}
|
|
|
|
GateActions()
|