Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.
Dependencies: mbed Watchdog SDFileSystem DigoleSerialDisp
Schedule/Schedule.cpp@0:a6a169de725f, 2013-05-27 (annotated)
- Committer:
- shimniok
- Date:
- Mon May 27 13:26:03 2013 +0000
- Revision:
- 0:a6a169de725f
- Child:
- 23:a34af501ea89
Working version with priorities set and update time display
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shimniok | 0:a6a169de725f | 1 | #include "Schedule.h" |
shimniok | 0:a6a169de725f | 2 | |
shimniok | 0:a6a169de725f | 3 | Schedule::Schedule(): _scale(0), _max(0), _clock(0) |
shimniok | 0:a6a169de725f | 4 | { |
shimniok | 0:a6a169de725f | 5 | for (int i=0; i < 64; i++) { |
shimniok | 0:a6a169de725f | 6 | _schedule[i] = 0; |
shimniok | 0:a6a169de725f | 7 | } |
shimniok | 0:a6a169de725f | 8 | } |
shimniok | 0:a6a169de725f | 9 | |
shimniok | 0:a6a169de725f | 10 | Schedule::Schedule(unsigned int scale, tick max, value start, value stop, flag m): _scale(scale), _max(max), _clock(0) |
shimniok | 0:a6a169de725f | 11 | { |
shimniok | 0:a6a169de725f | 12 | Schedule::set(scale, max, start, stop, m); |
shimniok | 0:a6a169de725f | 13 | } |
shimniok | 0:a6a169de725f | 14 | |
shimniok | 0:a6a169de725f | 15 | void Schedule::scale(unsigned int scale) |
shimniok | 0:a6a169de725f | 16 | { |
shimniok | 0:a6a169de725f | 17 | _scale = scale; |
shimniok | 0:a6a169de725f | 18 | } |
shimniok | 0:a6a169de725f | 19 | |
shimniok | 0:a6a169de725f | 20 | |
shimniok | 0:a6a169de725f | 21 | void Schedule::max(tick max) |
shimniok | 0:a6a169de725f | 22 | { |
shimniok | 0:a6a169de725f | 23 | if (_validTick(max)) |
shimniok | 0:a6a169de725f | 24 | _max = max; |
shimniok | 0:a6a169de725f | 25 | } |
shimniok | 0:a6a169de725f | 26 | |
shimniok | 0:a6a169de725f | 27 | |
shimniok | 0:a6a169de725f | 28 | void Schedule::mode(flag m) |
shimniok | 0:a6a169de725f | 29 | { |
shimniok | 0:a6a169de725f | 30 | _mode = m; |
shimniok | 0:a6a169de725f | 31 | } |
shimniok | 0:a6a169de725f | 32 | |
shimniok | 0:a6a169de725f | 33 | |
shimniok | 0:a6a169de725f | 34 | void Schedule::set(unsigned int scale, tick max, value start, value stop, flag m) |
shimniok | 0:a6a169de725f | 35 | { |
shimniok | 0:a6a169de725f | 36 | if (_validTick(max)) { |
shimniok | 0:a6a169de725f | 37 | _scale = scale; |
shimniok | 0:a6a169de725f | 38 | _max = max; |
shimniok | 0:a6a169de725f | 39 | _mode = m; |
shimniok | 0:a6a169de725f | 40 | float slope = ((float) stop - (float) start) / (float) max; |
shimniok | 0:a6a169de725f | 41 | for (int i=0; i <= max; i++) { |
shimniok | 0:a6a169de725f | 42 | _schedule[i] = ((int) (slope*(float)i)) + start; |
shimniok | 0:a6a169de725f | 43 | } |
shimniok | 0:a6a169de725f | 44 | } |
shimniok | 0:a6a169de725f | 45 | } |
shimniok | 0:a6a169de725f | 46 | |
shimniok | 0:a6a169de725f | 47 | |
shimniok | 0:a6a169de725f | 48 | void Schedule::set(tick t, value v) |
shimniok | 0:a6a169de725f | 49 | { |
shimniok | 0:a6a169de725f | 50 | if (_validTick(t)) { |
shimniok | 0:a6a169de725f | 51 | _schedule[t] = v; |
shimniok | 0:a6a169de725f | 52 | if (t > _max) _max = t; |
shimniok | 0:a6a169de725f | 53 | } |
shimniok | 0:a6a169de725f | 54 | } |
shimniok | 0:a6a169de725f | 55 | |
shimniok | 0:a6a169de725f | 56 | |
shimniok | 0:a6a169de725f | 57 | value Schedule::get() |
shimniok | 0:a6a169de725f | 58 | { |
shimniok | 0:a6a169de725f | 59 | if (done()) { |
shimniok | 0:a6a169de725f | 60 | if (_mode == repeat) |
shimniok | 0:a6a169de725f | 61 | _clock %= _max+1; |
shimniok | 0:a6a169de725f | 62 | else if (_mode == hold) |
shimniok | 0:a6a169de725f | 63 | _clock = _max; |
shimniok | 0:a6a169de725f | 64 | else |
shimniok | 0:a6a169de725f | 65 | return 0; |
shimniok | 0:a6a169de725f | 66 | } |
shimniok | 0:a6a169de725f | 67 | |
shimniok | 0:a6a169de725f | 68 | return _schedule[_clock]; |
shimniok | 0:a6a169de725f | 69 | } |
shimniok | 0:a6a169de725f | 70 | |
shimniok | 0:a6a169de725f | 71 | |
shimniok | 0:a6a169de725f | 72 | value Schedule::next() |
shimniok | 0:a6a169de725f | 73 | { |
shimniok | 0:a6a169de725f | 74 | _clock++; |
shimniok | 0:a6a169de725f | 75 | return get(); |
shimniok | 0:a6a169de725f | 76 | } |
shimniok | 0:a6a169de725f | 77 | |
shimniok | 0:a6a169de725f | 78 | |
shimniok | 0:a6a169de725f | 79 | bool Schedule::ticked(unsigned int time) |
shimniok | 0:a6a169de725f | 80 | { |
shimniok | 0:a6a169de725f | 81 | bool result = false; |
shimniok | 0:a6a169de725f | 82 | |
shimniok | 0:a6a169de725f | 83 | if ((time % _scale) == 0) { |
shimniok | 0:a6a169de725f | 84 | _clock++; |
shimniok | 0:a6a169de725f | 85 | result = true; |
shimniok | 0:a6a169de725f | 86 | } |
shimniok | 0:a6a169de725f | 87 | |
shimniok | 0:a6a169de725f | 88 | return result; |
shimniok | 0:a6a169de725f | 89 | } |
shimniok | 0:a6a169de725f | 90 | |
shimniok | 0:a6a169de725f | 91 | bool Schedule::done() |
shimniok | 0:a6a169de725f | 92 | { |
shimniok | 0:a6a169de725f | 93 | return (_clock > _max); |
shimniok | 0:a6a169de725f | 94 | } |
shimniok | 0:a6a169de725f | 95 | |
shimniok | 0:a6a169de725f | 96 | bool Schedule::_validTick(tick t) |
shimniok | 0:a6a169de725f | 97 | { |
shimniok | 0:a6a169de725f | 98 | return (t < 64); // unsigned int, always > 0; if wraps around will be > 64 |
shimniok | 0:a6a169de725f | 99 | } |