mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
118 lines
2.4 KiB
C++
118 lines
2.4 KiB
C++
|
//
|
||
|
// FILE: StopWatch.cpp
|
||
|
// AUTHOR: Rob Tillaart
|
||
|
// VERSION: 0.3.1
|
||
|
// DATE: 2011-01-04
|
||
|
// PURPOSE: Arduino Library implementing a stopwatch including seconds, milliseconds microseconds
|
||
|
// URL: https://github.com/RobTillaart/StopWatch_RT
|
||
|
//
|
||
|
// The library is based upon millis() and therefore
|
||
|
// has the same restrictions as millis() has wrt overflow.
|
||
|
//
|
||
|
// HISTORY:
|
||
|
// 0.1.00 2011-01-04 initial version
|
||
|
// 0.1.01 2011-01-04 Added better state
|
||
|
// 0.1.02 2011-06-15 Added state() + #defines + lib version
|
||
|
// 0.1.03 2012-01-22 Added several improvements
|
||
|
// By mromani & Rob Tillaart
|
||
|
// 0.1.4 2017-07-16 refactored
|
||
|
// 0.1.5 2017-09-13 removed const from functions
|
||
|
// 0.2.0 2020-05-07 updated metadata, removed pre 1.0 support; setResolution added, minutes added
|
||
|
// 0.2.1 2020-06-19 fix library.json
|
||
|
// 0.2.2 2020-07-14 fix #3 ESP support
|
||
|
// 0.3.0 2021-01-08 Arduino-CI + unit tests
|
||
|
// 0.3.1 2021-01-25 support Printable interface
|
||
|
|
||
|
|
||
|
#include "StopWatch.h"
|
||
|
|
||
|
|
||
|
StopWatch::StopWatch(const enum Resolution res)
|
||
|
{
|
||
|
setResolution(res);
|
||
|
}
|
||
|
|
||
|
|
||
|
void StopWatch::setResolution(const enum Resolution res)
|
||
|
{
|
||
|
reset();
|
||
|
_res = res;
|
||
|
switch(_res)
|
||
|
{
|
||
|
case MICROS:
|
||
|
_gettime = _micros;
|
||
|
break;
|
||
|
|
||
|
case SECONDS:
|
||
|
_gettime = seconds;
|
||
|
break;
|
||
|
|
||
|
case MINUTES:
|
||
|
_gettime = minutes;
|
||
|
break;
|
||
|
|
||
|
case MILLIS:
|
||
|
default:
|
||
|
_gettime = _millis;
|
||
|
_res = MILLIS; // for default!
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void StopWatch::reset()
|
||
|
{
|
||
|
_state = StopWatch::RESET;
|
||
|
_starttime = _stoptime = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void StopWatch::start()
|
||
|
{
|
||
|
if (_state == StopWatch::RESET || _state == StopWatch::STOPPED)
|
||
|
{
|
||
|
_state = StopWatch::RUNNING;
|
||
|
uint32_t t = _gettime();
|
||
|
_starttime += t - _stoptime;
|
||
|
_stoptime = t;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// made const as printTo expect a const object.
|
||
|
uint32_t StopWatch::elapsed() const
|
||
|
{
|
||
|
if (_state == StopWatch::RUNNING)
|
||
|
{
|
||
|
return _gettime() - _starttime;
|
||
|
}
|
||
|
return _stoptime - _starttime;
|
||
|
}
|
||
|
|
||
|
|
||
|
void StopWatch::stop()
|
||
|
{
|
||
|
if (_state == StopWatch::RUNNING)
|
||
|
{
|
||
|
_stoptime = _gettime();
|
||
|
_state = StopWatch::STOPPED;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// PRINTABLE
|
||
|
size_t StopWatch::printTo(Print& p) const
|
||
|
{
|
||
|
uint32_t ti = StopWatch::elapsed();
|
||
|
size_t n = p.print(ti);
|
||
|
switch(_res)
|
||
|
{
|
||
|
case MICROS: n += p.print(" us"); break;
|
||
|
case SECONDS: n += p.print(" s"); break;
|
||
|
case MINUTES: n += p.print(" m."); break;
|
||
|
case MILLIS: n += p.print(" ms"); break;
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|
||
|
// -- END OF FILE --
|