52 lines
987 B
Plaintext
52 lines
987 B
Plaintext
def makeIntegrator() {
|
|
var value := 0.0
|
|
var input := fn { 0.0 }
|
|
|
|
var input1 := input()
|
|
var t1 := timer.now()
|
|
|
|
def update() {
|
|
def t2 := timer.now()
|
|
def input2 :float64 := input()
|
|
def dt := (t2 - t1) / 1000
|
|
|
|
value += (input1 + input2) * dt / 2
|
|
|
|
t1 := t2
|
|
input1 := input2
|
|
}
|
|
|
|
var task() {
|
|
update <- ()
|
|
task <- ()
|
|
}
|
|
task()
|
|
|
|
def integrator {
|
|
to input(new) :void { input := new }
|
|
to output() :float64 { return value }
|
|
to shutdown() { task := fn {} }
|
|
}
|
|
return integrator
|
|
}
|
|
|
|
def test() {
|
|
def result
|
|
|
|
def pi := (-1.0).acos()
|
|
def freq := pi / 1000
|
|
|
|
def base := timer.now()
|
|
def i := makeIntegrator()
|
|
|
|
i.input(fn { (freq * timer.now()).sin() })
|
|
timer.whenPast(base + 2000, fn {
|
|
i.input(fn {0})
|
|
})
|
|
timer.whenPast(base + 2500, fn {
|
|
bind result := i.output()
|
|
i.shutdown()
|
|
})
|
|
return result
|
|
}
|