Simple library for scheduling events by polling time, that is, avoiding interrupts.
Dependents: AVC_20110423 AVC_2012
Schedule.cpp
- Committer:
- shimniok
- Date:
- 2011-04-27
- Revision:
- 0:03d36a9a088b
File content as of revision 0:03d36a9a088b:
#include "Schedule.h" Schedule::Schedule(): _scale(0), _max(0), _clock(0) { for (int i=0; i < 64; i++) { _schedule[i] = 0; } } Schedule::Schedule(unsigned int scale, tick max, value start, value stop, flag m): _scale(scale), _max(max), _clock(0) { Schedule::set(scale, max, start, stop, m); } void Schedule::scale(unsigned int scale) { _scale = scale; } void Schedule::max(tick max) { if (_validTick(max)) _max = max; } void Schedule::mode(flag m) { _mode = m; } void Schedule::set(unsigned int scale, tick max, value start, value stop, flag m) { if (_validTick(max)) { _scale = scale; _max = max; _mode = m; float slope = ((float) stop - (float) start) / (float) max; for (int i=0; i <= max; i++) { _schedule[i] = ((int) (slope*(float)i)) + start; } } } void Schedule::set(tick t, value v) { if (_validTick(t)) { _schedule[t] = v; if (t > _max) _max = t; } } value Schedule::get() { if (done()) { if (_mode == repeat) _clock %= _max+1; else if (_mode == hold) _clock = _max; else return 0; } return _schedule[_clock]; } value Schedule::next() { _clock++; return get(); } bool Schedule::ticked(unsigned int time) { bool result = false; if ((time % _scale) == 0) { _clock++; result = true; } return result; } bool Schedule::done() { return (_clock > _max); } bool Schedule::_validTick(tick t) { return (t < 64); // unsigned int, always > 0; if wraps around will be > 64 }