11//
22// FILE: CountDown.cpp
33// AUTHOR: Rob Tillaart
4- // VERSION: 0.2.7
4+ // VERSION: 0.3.0
55// PURPOSE: CountDown library for Arduino
66// URL: https://github.com/RobTillaart/CountDown
77//
1313
1414CountDown::CountDown (const enum Resolution res)
1515{
16+ // _res = MILLIS; // set in setResolution
17+ // _ticks = 0; // set in setResolution
18+ _state = CountDown::STOPPED;
19+ _remaining = 0 ;
20+ _startTime = 0 ;
1621 setResolution (res);
1722 stop ();
1823}
@@ -25,29 +30,37 @@ void CountDown::setResolution(const enum Resolution res)
2530}
2631
2732
33+ char CountDown::getUnits ()
34+ {
35+ return _res;
36+ }
37+
38+
2839bool CountDown::start (uint32_t ticks)
2940{
3041 _ticks = ticks;
3142 _state = CountDown::RUNNING;
3243 if (_res == MICROS)
3344 {
34- _starttime = micros ();
45+ _startTime = micros ();
3546 }
36- else
47+ else
3748 {
38- _starttime = millis ();
49+ _startTime = millis ();
3950 }
40- return true ; // can not overflow
51+ return true ; // can not overflow
4152}
4253
4354
4455bool CountDown::start (uint8_t days, uint16_t hours, uint32_t minutes, uint32_t seconds)
4556{
46- float _days = seconds / 86400.0 + minutes / 1440.0 + hours / 24.0 + days;
57+ float _days = seconds / 86400.0 + minutes / 1440.0 + hours / 24.0 + days;
4758 bool rv = (_days < 49.7102696 );
4859
4960 uint32_t ticks = 86400UL * days + 3600UL * hours + 60UL * minutes + seconds;
50- if (ticks > 4294967 ) ticks = 4294967 ; // prevent underlying millis() overflow
61+ // prevent underlying millis() overflow
62+ // 4294967 = number of SECONDS in 2^32 milliseconds
63+ if (ticks > 4294967 ) ticks = 4294967 ;
5164 setResolution (SECONDS);
5265 start (ticks);
5366
@@ -57,11 +70,13 @@ bool CountDown::start(uint8_t days, uint16_t hours, uint32_t minutes, uint32_t s
5770
5871bool CountDown::start (uint8_t days, uint16_t hours, uint32_t minutes)
5972{
60- float _days = minutes / 1440.0 + hours / 24.0 + days;
73+ float _days = minutes / 1440.0 + hours / 24.0 + days;
6174 bool rv = (_days < 49.7102696 );
6275
63- uint32_t ticks = 86400UL * days + 3600UL * hours + 60UL * minutes;
64- if (ticks > 4294967 ) ticks = 4294967 ; // prevent underlying millis() overflow
76+ uint32_t ticks = 1440UL * days + 60UL * hours + minutes;
77+ // prevent underlying millis() overflow
78+ // 71582 = number of MINUTES in 2^32 milliseconds
79+ if (ticks > 71582 ) ticks = 71582 ;
6580 setResolution (MINUTES);
6681 start (ticks);
6782
@@ -85,21 +100,32 @@ void CountDown::cont()
85100}
86101
87102
88- bool CountDown::isRunning ()
103+ uint32_t CountDown::remaining ()
104+ {
105+ calcRemaining ();
106+ if (_remaining == 0 ) _state = CountDown::STOPPED;
107+ return _remaining;
108+ }
109+
110+
111+ bool CountDown::isRunning ()
89112{
90113 calcRemaining ();
91114 return (_state == CountDown::RUNNING);
92115}
93116
94117
95- uint32_t CountDown::remaining ()
118+ bool CountDown::isStopped ()
96119{
97120 calcRemaining ();
98- if (_remaining == 0 ) _state = CountDown::STOPPED;
99- return _remaining;
121+ return (_state == CountDown::STOPPED);
100122}
101123
102124
125+ // ////////////////////////////////////////////////
126+ //
127+ // PRIVATE
128+ //
103129void CountDown::calcRemaining ()
104130{
105131 uint32_t t = 0 ;
@@ -108,28 +134,28 @@ void CountDown::calcRemaining()
108134 switch (_res)
109135 {
110136 case MINUTES:
111- t = (millis () - _starttime ) / 60000UL ;
137+ t = (millis () - _startTime ) / 60000UL ;
112138 break ;
113139 case SECONDS:
114- t = (millis () - _starttime ) / 1000UL ;;
140+ t = (millis () - _startTime ) / 1000UL ;;
115141 break ;
116142 case MICROS:
117- t = micros () - _starttime ;
143+ t = micros () - _startTime ;
118144 break ;
119145 case MILLIS:
120146 default :
121- t = millis () - _starttime ;
147+ t = millis () - _startTime ;
122148 break ;
123149 }
124150 _remaining = _ticks > t ? _ticks - t : 0 ;
125- if (_remaining == 0 )
151+ if (_remaining == 0 )
126152 {
127153 _state = CountDown::STOPPED;
128154 }
129155 return ;
130156 }
131- // do not change
132157}
133158
134159
135160// -- END OF FILE --
161+
0 commit comments