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

Committer:
shimniok
Date:
Fri Nov 30 16:11:53 2018 +0000
Revision:
25:bb5356402687
Parent:
23:a34af501ea89
Initial publish of revised version.

Who changed what in which revision?

UserRevisionLine numberNew 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 23:a34af501ea89 41 for (tick 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 }