A Ton (Timer On) is used to provide an \'on delay\' system so as to avoid using wait()

Dependents:   NEWlcd_menu_v2 Garage_Control

Committer:
AjK
Date:
Fri Mar 04 14:15:47 2011 +0000
Revision:
3:123a1b30970a
Parent:
2:aa908ad1559a
1.3 See ChangeLog.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 0:748acff4e3c8 1 /*
AjK 0:748acff4e3c8 2 Copyright (c) 2011 Andy Kirkham
AjK 0:748acff4e3c8 3
AjK 0:748acff4e3c8 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AjK 0:748acff4e3c8 5 of this software and associated documentation files (the "Software"), to deal
AjK 0:748acff4e3c8 6 in the Software without restriction, including without limitation the rights
AjK 0:748acff4e3c8 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AjK 0:748acff4e3c8 8 copies of the Software, and to permit persons to whom the Software is
AjK 0:748acff4e3c8 9 furnished to do so, subject to the following conditions:
AjK 0:748acff4e3c8 10
AjK 0:748acff4e3c8 11 The above copyright notice and this permission notice shall be included in
AjK 0:748acff4e3c8 12 all copies or substantial portions of the Software.
AjK 0:748acff4e3c8 13
AjK 0:748acff4e3c8 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AjK 0:748acff4e3c8 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AjK 0:748acff4e3c8 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AjK 0:748acff4e3c8 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AjK 0:748acff4e3c8 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AjK 0:748acff4e3c8 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AjK 0:748acff4e3c8 20 THE SOFTWARE.
AjK 0:748acff4e3c8 21 */
AjK 0:748acff4e3c8 22
AjK 0:748acff4e3c8 23 #ifndef AJK_TON_H
AjK 0:748acff4e3c8 24 #define AJK_TON_H
AjK 0:748acff4e3c8 25
AjK 0:748acff4e3c8 26 #include "mbed.h"
AjK 0:748acff4e3c8 27
AjK 0:748acff4e3c8 28 namespace AjK {
AjK 0:748acff4e3c8 29
AjK 0:748acff4e3c8 30 /** @defgroup API The Ton API */
AjK 0:748acff4e3c8 31
AjK 0:748acff4e3c8 32 /** Ton module
AjK 0:748acff4e3c8 33 *
AjK 0:748acff4e3c8 34 * @author Andy Kirkham
AjK 0:748acff4e3c8 35 * @see API
AjK 0:748acff4e3c8 36 * @see example1.h
AjK 0:748acff4e3c8 37 * @see example2.h
AjK 0:748acff4e3c8 38 *
AjK 0:748acff4e3c8 39 */
AjK 0:748acff4e3c8 40 class Ton {
AjK 0:748acff4e3c8 41
AjK 0:748acff4e3c8 42 protected:
AjK 0:748acff4e3c8 43 bool _lastInput;
AjK 0:748acff4e3c8 44 int _counter;
AjK 0:748acff4e3c8 45 int _reload;
AjK 0:748acff4e3c8 46 int _mode;
AjK 0:748acff4e3c8 47 Ticker _tick;
AjK 0:748acff4e3c8 48
AjK 0:748acff4e3c8 49 /** init
AjK 0:748acff4e3c8 50 * Used to init the properties.
AjK 0:748acff4e3c8 51 */
AjK 0:748acff4e3c8 52 void init(void) {
AjK 0:748acff4e3c8 53 _lastInput = false;
AjK 0:748acff4e3c8 54 _mode = InputResets;
AjK 0:748acff4e3c8 55 _tick.attach_us(this, &Ton::ticktock, 1000);
AjK 0:748acff4e3c8 56 }
AjK 0:748acff4e3c8 57
AjK 0:748acff4e3c8 58 public:
AjK 0:748acff4e3c8 59 friend class Ticker;
AjK 0:748acff4e3c8 60
AjK 1:55c67a056031 61 enum Ops { On = 1, Off = 0 };
AjK 1:55c67a056031 62
AjK 0:748acff4e3c8 63 /** Mode
AjK 0:748acff4e3c8 64 */
AjK 0:748acff4e3c8 65 enum Mode {
AjK 0:748acff4e3c8 66 InputResets = 0, /*!< Loss of input resets the timer. */
AjK 0:748acff4e3c8 67 InputPauses /*!< Loss of input pauses the timer. */
AjK 0:748acff4e3c8 68 };
AjK 0:748acff4e3c8 69
AjK 0:748acff4e3c8 70 /** ticktock
AjK 0:748acff4e3c8 71 * Used by the Ticker object to call to once per millisecond.
AjK 0:748acff4e3c8 72 */
AjK 0:748acff4e3c8 73 void ticktock(void) {
AjK 0:748acff4e3c8 74 switch (_mode) {
AjK 0:748acff4e3c8 75 case InputResets:
AjK 0:748acff4e3c8 76 if (_lastInput) {
AjK 0:748acff4e3c8 77 if (_counter > 0) _counter--;
AjK 0:748acff4e3c8 78 }
AjK 0:748acff4e3c8 79 else {
AjK 0:748acff4e3c8 80 _counter = _reload;
AjK 0:748acff4e3c8 81 }
AjK 0:748acff4e3c8 82 break;
AjK 0:748acff4e3c8 83 case InputPauses:
AjK 0:748acff4e3c8 84 if (_lastInput) {
AjK 0:748acff4e3c8 85 if (_counter > 0) _counter--;
AjK 0:748acff4e3c8 86 }
AjK 0:748acff4e3c8 87 break;
AjK 0:748acff4e3c8 88 }
AjK 0:748acff4e3c8 89 }
AjK 0:748acff4e3c8 90
AjK 2:aa908ad1559a 91 /** isRunning
AjK 2:aa908ad1559a 92 * Is the timer active?
AjK 2:aa908ad1559a 93 * @return true if active, false otherwise.
AjK 2:aa908ad1559a 94 */
AjK 2:aa908ad1559a 95 bool isRunning(void) {
AjK 3:123a1b30970a 96 bool b = false;
AjK 2:aa908ad1559a 97 switch (_mode) {
AjK 2:aa908ad1559a 98 case InputResets:
AjK 3:123a1b30970a 99 b = _lastInput;
AjK 2:aa908ad1559a 100 break;
AjK 2:aa908ad1559a 101 case InputPauses:
AjK 3:123a1b30970a 102 b = _counter > 0;
AjK 2:aa908ad1559a 103 }
AjK 3:123a1b30970a 104 return b;
AjK 2:aa908ad1559a 105 }
AjK 2:aa908ad1559a 106
AjK 0:748acff4e3c8 107 /** setTime
AjK 0:748acff4e3c8 108 * Used to set the timer value, in milliseconds.
AjK 0:748acff4e3c8 109 * @ingroup API
AjK 0:748acff4e3c8 110 * @param int i The value to time.
AjK 0:748acff4e3c8 111 */
AjK 0:748acff4e3c8 112 void setTime(int i) { _counter = _reload = i; }
AjK 0:748acff4e3c8 113
AjK 0:748acff4e3c8 114 /** getTime
AjK 0:748acff4e3c8 115 * Used to get the timer value, in milliseconds.
AjK 0:748acff4e3c8 116 * @ingroup API
AjK 0:748acff4e3c8 117 * @return int The value to time.
AjK 0:748acff4e3c8 118 */
AjK 0:748acff4e3c8 119 int getTime(void) { return _reload; }
AjK 0:748acff4e3c8 120
AjK 0:748acff4e3c8 121 /** getTimeLeft
AjK 0:748acff4e3c8 122 * Used to get the timer value remaining, in milliseconds.
AjK 0:748acff4e3c8 123 * @ingroup API
AjK 0:748acff4e3c8 124 * @return int The time remaining to zero (timeout).
AjK 0:748acff4e3c8 125 */
AjK 0:748acff4e3c8 126 int getTimeLeft(void) { return _reload - _counter; }
AjK 0:748acff4e3c8 127
AjK 0:748acff4e3c8 128 /** setMode
AjK 0:748acff4e3c8 129 * Set the Ton operational mode.
AjK 0:748acff4e3c8 130 * Valid values are Ton::InputResets or Ton::InputPauses.
AjK 0:748acff4e3c8 131 * The default mode is Ton::InputPauses
AjK 0:748acff4e3c8 132 * @ingroup API
AjK 0:748acff4e3c8 133 * @see Mode
AjK 0:748acff4e3c8 134 * @param enum Mode
AjK 0:748acff4e3c8 135 */
AjK 0:748acff4e3c8 136 void setMode(Mode i) { _mode = i; }
AjK 0:748acff4e3c8 137
AjK 0:748acff4e3c8 138 /** reset
AjK 0:748acff4e3c8 139 * Resets the timer to the default value.
AjK 0:748acff4e3c8 140 * @ingroup API
AjK 0:748acff4e3c8 141 */
AjK 0:748acff4e3c8 142 void reset(void) { _counter = _reload; }
AjK 0:748acff4e3c8 143
AjK 0:748acff4e3c8 144 /** reset
AjK 0:748acff4e3c8 145 * Overloaded method, reset the timer to the value supplied.
AjK 0:748acff4e3c8 146 * @ingroup API
AjK 0:748acff4e3c8 147 * @param int i The time to count.
AjK 0:748acff4e3c8 148 */
AjK 0:748acff4e3c8 149 void reset(int i) { _counter = _reload = i; }
AjK 0:748acff4e3c8 150
AjK 0:748acff4e3c8 151 /** Constructor
AjK 0:748acff4e3c8 152 */
AjK 0:748acff4e3c8 153 Ton(int to, int mode = InputResets) { init(); _counter = _reload = to; _mode = mode; }
AjK 0:748acff4e3c8 154
AjK 0:748acff4e3c8 155 /** Destructor
AjK 0:748acff4e3c8 156 */
AjK 0:748acff4e3c8 157 ~Ton() { _tick.detach(); }
AjK 0:748acff4e3c8 158
AjK 0:748acff4e3c8 159 /** operator=
AjK 0:748acff4e3c8 160 * Controls the starting of the timer.
AjK 0:748acff4e3c8 161 * @ingroup API
AjK 0:748acff4e3c8 162 */
AjK 0:748acff4e3c8 163 Ton& operator= (int value) {
AjK 0:748acff4e3c8 164 _lastInput = value ? true : false;
AjK 0:748acff4e3c8 165 if (_mode == InputResets && !_lastInput) _counter = _reload;
AjK 0:748acff4e3c8 166 return *this;
AjK 0:748acff4e3c8 167 }
AjK 0:748acff4e3c8 168
AjK 0:748acff4e3c8 169 /** operator int()
AjK 0:748acff4e3c8 170 * @ingroup API
AjK 0:748acff4e3c8 171 * @return zero if not timed out yet, non-zero otherwise.
AjK 0:748acff4e3c8 172 */
AjK 0:748acff4e3c8 173 operator int() {
AjK 0:748acff4e3c8 174 return (_counter == 0) ? 1 : 0;
AjK 0:748acff4e3c8 175 }
AjK 0:748acff4e3c8 176
AjK 0:748acff4e3c8 177 };
AjK 0:748acff4e3c8 178
AjK 0:748acff4e3c8 179 }; // namespace AjK ends.
AjK 0:748acff4e3c8 180
AjK 0:748acff4e3c8 181 using namespace AjK;
AjK 0:748acff4e3c8 182
AjK 0:748acff4e3c8 183 #endif