A Ton (Timer On) is used to provide an \'on delay\' system so as to avoid using wait()
Dependents: NEWlcd_menu_v2 Garage_Control
Ton.h@3:123a1b30970a, 2011-03-04 (annotated)
- 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?
User | Revision | Line number | New 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 |