Simple library for scheduling events by polling time, that is, avoiding interrupts.
Dependents: AVC_20110423 AVC_2012
Schedule.cpp@0:03d36a9a088b, 2011-04-27 (annotated)
- Committer:
- shimniok
- Date:
- Wed Apr 27 18:00:45 2011 +0000
- Revision:
- 0:03d36a9a088b
Initial revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shimniok | 0:03d36a9a088b | 1 | #include "Schedule.h" |
shimniok | 0:03d36a9a088b | 2 | |
shimniok | 0:03d36a9a088b | 3 | Schedule::Schedule(): _scale(0), _max(0), _clock(0) |
shimniok | 0:03d36a9a088b | 4 | { |
shimniok | 0:03d36a9a088b | 5 | for (int i=0; i < 64; i++) { |
shimniok | 0:03d36a9a088b | 6 | _schedule[i] = 0; |
shimniok | 0:03d36a9a088b | 7 | } |
shimniok | 0:03d36a9a088b | 8 | } |
shimniok | 0:03d36a9a088b | 9 | |
shimniok | 0:03d36a9a088b | 10 | Schedule::Schedule(unsigned int scale, tick max, value start, value stop, flag m): _scale(scale), _max(max), _clock(0) |
shimniok | 0:03d36a9a088b | 11 | { |
shimniok | 0:03d36a9a088b | 12 | Schedule::set(scale, max, start, stop, m); |
shimniok | 0:03d36a9a088b | 13 | } |
shimniok | 0:03d36a9a088b | 14 | |
shimniok | 0:03d36a9a088b | 15 | void Schedule::scale(unsigned int scale) |
shimniok | 0:03d36a9a088b | 16 | { |
shimniok | 0:03d36a9a088b | 17 | _scale = scale; |
shimniok | 0:03d36a9a088b | 18 | } |
shimniok | 0:03d36a9a088b | 19 | |
shimniok | 0:03d36a9a088b | 20 | |
shimniok | 0:03d36a9a088b | 21 | void Schedule::max(tick max) |
shimniok | 0:03d36a9a088b | 22 | { |
shimniok | 0:03d36a9a088b | 23 | if (_validTick(max)) |
shimniok | 0:03d36a9a088b | 24 | _max = max; |
shimniok | 0:03d36a9a088b | 25 | } |
shimniok | 0:03d36a9a088b | 26 | |
shimniok | 0:03d36a9a088b | 27 | |
shimniok | 0:03d36a9a088b | 28 | void Schedule::mode(flag m) |
shimniok | 0:03d36a9a088b | 29 | { |
shimniok | 0:03d36a9a088b | 30 | _mode = m; |
shimniok | 0:03d36a9a088b | 31 | } |
shimniok | 0:03d36a9a088b | 32 | |
shimniok | 0:03d36a9a088b | 33 | |
shimniok | 0:03d36a9a088b | 34 | void Schedule::set(unsigned int scale, tick max, value start, value stop, flag m) |
shimniok | 0:03d36a9a088b | 35 | { |
shimniok | 0:03d36a9a088b | 36 | if (_validTick(max)) { |
shimniok | 0:03d36a9a088b | 37 | _scale = scale; |
shimniok | 0:03d36a9a088b | 38 | _max = max; |
shimniok | 0:03d36a9a088b | 39 | _mode = m; |
shimniok | 0:03d36a9a088b | 40 | float slope = ((float) stop - (float) start) / (float) max; |
shimniok | 0:03d36a9a088b | 41 | for (int i=0; i <= max; i++) { |
shimniok | 0:03d36a9a088b | 42 | _schedule[i] = ((int) (slope*(float)i)) + start; |
shimniok | 0:03d36a9a088b | 43 | } |
shimniok | 0:03d36a9a088b | 44 | } |
shimniok | 0:03d36a9a088b | 45 | } |
shimniok | 0:03d36a9a088b | 46 | |
shimniok | 0:03d36a9a088b | 47 | |
shimniok | 0:03d36a9a088b | 48 | void Schedule::set(tick t, value v) |
shimniok | 0:03d36a9a088b | 49 | { |
shimniok | 0:03d36a9a088b | 50 | if (_validTick(t)) { |
shimniok | 0:03d36a9a088b | 51 | _schedule[t] = v; |
shimniok | 0:03d36a9a088b | 52 | if (t > _max) _max = t; |
shimniok | 0:03d36a9a088b | 53 | } |
shimniok | 0:03d36a9a088b | 54 | } |
shimniok | 0:03d36a9a088b | 55 | |
shimniok | 0:03d36a9a088b | 56 | |
shimniok | 0:03d36a9a088b | 57 | value Schedule::get() |
shimniok | 0:03d36a9a088b | 58 | { |
shimniok | 0:03d36a9a088b | 59 | if (done()) { |
shimniok | 0:03d36a9a088b | 60 | if (_mode == repeat) |
shimniok | 0:03d36a9a088b | 61 | _clock %= _max+1; |
shimniok | 0:03d36a9a088b | 62 | else if (_mode == hold) |
shimniok | 0:03d36a9a088b | 63 | _clock = _max; |
shimniok | 0:03d36a9a088b | 64 | else |
shimniok | 0:03d36a9a088b | 65 | return 0; |
shimniok | 0:03d36a9a088b | 66 | } |
shimniok | 0:03d36a9a088b | 67 | |
shimniok | 0:03d36a9a088b | 68 | return _schedule[_clock]; |
shimniok | 0:03d36a9a088b | 69 | } |
shimniok | 0:03d36a9a088b | 70 | |
shimniok | 0:03d36a9a088b | 71 | |
shimniok | 0:03d36a9a088b | 72 | value Schedule::next() |
shimniok | 0:03d36a9a088b | 73 | { |
shimniok | 0:03d36a9a088b | 74 | _clock++; |
shimniok | 0:03d36a9a088b | 75 | return get(); |
shimniok | 0:03d36a9a088b | 76 | } |
shimniok | 0:03d36a9a088b | 77 | |
shimniok | 0:03d36a9a088b | 78 | |
shimniok | 0:03d36a9a088b | 79 | bool Schedule::ticked(unsigned int time) |
shimniok | 0:03d36a9a088b | 80 | { |
shimniok | 0:03d36a9a088b | 81 | bool result = false; |
shimniok | 0:03d36a9a088b | 82 | |
shimniok | 0:03d36a9a088b | 83 | if ((time % _scale) == 0) { |
shimniok | 0:03d36a9a088b | 84 | _clock++; |
shimniok | 0:03d36a9a088b | 85 | result = true; |
shimniok | 0:03d36a9a088b | 86 | } |
shimniok | 0:03d36a9a088b | 87 | |
shimniok | 0:03d36a9a088b | 88 | return result; |
shimniok | 0:03d36a9a088b | 89 | } |
shimniok | 0:03d36a9a088b | 90 | |
shimniok | 0:03d36a9a088b | 91 | bool Schedule::done() |
shimniok | 0:03d36a9a088b | 92 | { |
shimniok | 0:03d36a9a088b | 93 | return (_clock > _max); |
shimniok | 0:03d36a9a088b | 94 | } |
shimniok | 0:03d36a9a088b | 95 | |
shimniok | 0:03d36a9a088b | 96 | bool Schedule::_validTick(tick t) |
shimniok | 0:03d36a9a088b | 97 | { |
shimniok | 0:03d36a9a088b | 98 | return (t < 64); // unsigned int, always > 0; if wraps around will be > 64 |
shimniok | 0:03d36a9a088b | 99 | } |