38 ret.
len = snprintf((
char*)ret.buf, ret.
size,
39 "Experiment Logger (@%" PRIu32
"ms): ", time);
43 :
Logger(underlying), time(time) {
45 void start(uint32_t) {
info(
"started\n"); }
46 void stop(uint32_t) {
info(
"stopped\n"); }
47 void timeout(uint32_t) {
warn(
"timed out!\n"); }
69 k.
every(1, *
this, &Experiment::tick);
77 reg.
setHandler(1, *
this, &Experiment::handleFrame);
82 case INIT:
return init;
83 case STOP:
return stop;
84 default:
return timeout;
90 case IDLE:
return idle;
91 default:
return running;
97 const uint32_t&
time{time_};
100 heartbeat.timeout = ms;
101 heartbeat.reset(
time);
106 void call()
override{
110 timeout.
call(
new TMP{notify});
118 void statemachine() {
122 if (
state != old)
switch(old) {
138 if (heartbeat && heartbeat(
time)) {
154 bool reset(uint32_t now) {
155 when = now + timeout;
160 void tick(uint32_t, uint32_t dt) {
165 void handleFrame(
Frame &f) {
171 } b = f.
unpack<
decltype(b)>();
173 (bool)heartbeat && heartbeat.reset(
time);
Experiment Controller.
Definition experiment.h:33
void registerWith(FrameRegistry ®)
set frame registry from which Experiment will receive frames
Definition experiment.h:76
State
States during which recurring tasks can be called using during.
Definition experiment.h:51
@ RUN
running Experiment state
Definition experiment.h:55
@ IDLE
initial Experiment state
Definition experiment.h:53
ELog log
Logging facility.
Definition experiment.h:113
void setHeartbeatTimeout(uint32_t ms, Sink< Frame > ¬ify)
set Heartbeat timeout in ms
Definition experiment.h:99
const uint32_t & time
const access to Experiment time
Definition experiment.h:97
Schedule::Recurring::Registry & during(State s)
register recurring callbacks during Experiment states
Definition experiment.h:88
Schedule::Evented::Registry & onEvent(Event e)
register callbacks for Experiment state change events
Definition experiment.h:80
Event
Events upon which tasks can be called using onEvent.
Definition experiment.h:58
@ TIMEOUT
Event generated on missed heartbeat.
Definition experiment.h:64
@ INIT
Event generated on experiment start.
Definition experiment.h:60
@ STOP
Event generated on experiment end.
Definition experiment.h:62
Experiment(FrameRegistry *fr=nullptr)
construct. if FrameRegistry is not available at this point, call registerWith at the earliest conveni...
Definition experiment.h:68
const State & state
const access to Experiment state
Definition experiment.h:95
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
size_t size
total capacity of buffer
Definition buffer.h:23
size_t len
number of items stored in buffer
Definition buffer.h:21
simple solution for keeping track of timeouts
Definition deadline.h:15
Registry for dispatching frames to their registered destinations.
Definition frameregistry.h:61
void setHandler(uint8_t id, FuncHandler::Func f)
register pure function FrameHandler for given id
Definition frameregistry.h:91
pyWisp communication frame
Definition frameregistry.h:10
Frame & pack(T value)
pack value into Frame
Definition frameregistry.h:22
uint8_t id
buffer id: [0..63]
Definition frameregistry.h:14
T unpack()
return unpacked value from Frame
Definition frameregistry.h:46
simple printf-style logging infrastructure
Definition logger.h:21
void info(const char *fmt,...)
Info log level.
Definition logger.h:43
void warn(const char *fmt,...)
Warn log level.
Definition logger.h:50
registry of evented calls
Definition evented.h:61
void call(Func::Call func)
register function to be scheduled for calling on Event
Definition evented.h:63
registry of recurring calls
Definition timed.h:65
void reset()
reset calling times of all registered functions
Definition timed.h:83
void every(uint32_t dt_ms, typename Func::Call func)
register a function to be called every dt_ms
Definition timed.h:68
represents an object that can be scheduled for later calling
Definition schedule.h:20
bool schedule(uint32_t time, Schedule::Registry ®)
schedule all registered schedulables of registry if necessary
Definition schedule.h:52
generic object sink, i.e.
Definition streams.h:15
void trypush(T &&t)
use this if you don't care if it's going to be successful. data gets discarded if sink is full.
Definition streams.h:28