Simple library for scheduling events by polling time, that is, avoiding interrupts.

Dependents:   AVC_20110423 AVC_2012

Committer:
shimniok
Date:
Wed Apr 27 18:00:45 2011 +0000
Revision:
0:03d36a9a088b
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew 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 }