95 lines
2.3 KiB
Python
95 lines
2.3 KiB
Python
from eca import *
|
|
|
|
import random
|
|
|
|
# This function will be called to set up the HTTP server
|
|
def add_request_handlers(httpd):
|
|
# use the library content from the template_static dir instead of our own
|
|
# this is a bit finicky, since execution now depends on a proper working directory.
|
|
httpd.add_content('/lib/', 'template_static/lib')
|
|
httpd.add_content('/style/', 'template_static/style')
|
|
|
|
|
|
# binds the 'setup' function as the action for the 'init' event
|
|
# the action will be called with the context and the event
|
|
@event('init')
|
|
def setup(ctx, e):
|
|
ctx.count = 0
|
|
ctx.samples = {
|
|
'sensor0': 0.0,
|
|
'sensor1': 0.0
|
|
}
|
|
|
|
fire('sample', {
|
|
'previous': 0.0,
|
|
'name': 'sensor0',
|
|
'failure-chance': 0.0,
|
|
'reboot-chance': 1.0,
|
|
'delay': 0.05
|
|
})
|
|
|
|
fire('sample', {
|
|
'previous': 0.0,
|
|
'name': 'sensor1',
|
|
'failure-chance': 0.05,
|
|
'reboot-chance': 0.1,
|
|
'delay': 0.05
|
|
})
|
|
|
|
fire('sample', {
|
|
'previous': None,
|
|
'name': 'sensor2',
|
|
'failure-chance': 0.2,
|
|
'reboot-chance': 0.8,
|
|
'delay': 0.1
|
|
})
|
|
|
|
fire('tick')
|
|
|
|
|
|
# define a normal Python function
|
|
def clip(lower, value, upper):
|
|
return max(lower, min(value, upper))
|
|
|
|
@event('sample')
|
|
@condition(lambda c,e: e.get('previous') is not None)
|
|
def generate_sample(ctx, e):
|
|
sample = e.get('previous')
|
|
# failure chance off...
|
|
if e.get('failure-chance') > random.random():
|
|
sample = None
|
|
del ctx.samples[e.get('name')]
|
|
else:
|
|
# base sample on previous one
|
|
sample = clip(-100, e.get('previous') + random.uniform(+5.0, -5.0), 100)
|
|
ctx.samples[e.get('name')] = sample
|
|
|
|
# chain event
|
|
data = dict(e.data)
|
|
data.update({'previous': sample})
|
|
fire('sample', data, delay=e.get('delay'))
|
|
|
|
@event('sample')
|
|
@condition(lambda c,e: e.get('previous') is None)
|
|
def try_reboot(ctx, e):
|
|
sample = e.get('previous')
|
|
if e.get('reboot-chance') > random.random():
|
|
sample = random.uniform(100,-100)
|
|
ctx.samples[e.get('name')] = sample
|
|
|
|
data = dict(e.data)
|
|
data.update({'previous': sample})
|
|
fire('sample', data, delay=e.get('delay'))
|
|
|
|
|
|
@event('tick')
|
|
def tick(ctx, e):
|
|
# emit to outside world
|
|
emit('sample',{
|
|
'action': 'add',
|
|
'values': ctx.samples
|
|
})
|
|
fire('tick', delay=0.05);
|
|
|
|
|