+ added support for micros & seconds (thx mromani)

+ major refactor
This commit is contained in:
Rob Tillaart 2013-09-30 19:25:09 +02:00
parent fae951f02a
commit b812c2ca38
4 changed files with 72 additions and 64 deletions

View File

@ -1,67 +1,83 @@
//
// FILE: StopWatch.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.02
// VERSION: 0.1.03
// PURPOSE: Simple StopWatch library for Arduino
//
// The library is based upon millis() and therefor has the same restrictions as millis() has wrt overflow.
// 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
//
// Released to the public domain
//
#include "StopWatch.h"
#include "wiring.h"
StopWatch::StopWatch()
StopWatch::StopWatch(enum Resolution res)
{
reset();
_res = res;
switch(_res) {
case MICROS:
_gettime = micros;
break;
case MILLIS:
_gettime = millis;
break;
case SECONDS:
_gettime = seconds;
break;
default:
_gettime = millis;
break;
}
reset();
}
void StopWatch::reset()
{
_state = STOPWATCH_RESET;
_starttime = _stoptime = 0;
_state = StopWatch::RESET;
_starttime = _stoptime = 0;
}
void StopWatch::start()
{
if (STOPWATCH_RESET == _state || STOPWATCH_STOPPED == _state)
{
_state = STOPWATCH_RUNNING;
unsigned long t = millis();
_starttime += t - _stoptime;
_stoptime = t;
}
if (_state == StopWatch::RESET || _state == StopWatch::STOPPED)
{
_state = StopWatch::RUNNING;
unsigned long t = _gettime();
_starttime += t - _stoptime;
_stoptime = t;
}
}
unsigned long StopWatch::value()
{
if (STOPWATCH_RUNNING == _state) _stoptime = millis();
return _stoptime - _starttime;
if (_state == StopWatch::RUNNING) _stoptime = _gettime();
return _stoptime - _starttime;
}
void StopWatch::stop()
{
if (STOPWATCH_RUNNING == _state)
{
_state = STOPWATCH_STOPPED;
_stoptime = millis();
}
if (_state == StopWatch::RUNNING)
{
_state = StopWatch::STOPPED;
_stoptime = _gettime();
}
}
bool StopWatch::isRunning()
{
return (STOPWATCH_RUNNING == _state);
return (_state == StopWatch::RUNNING);
}
int StopWatch::state()
enum StopWatch::State StopWatch::state()
{
return _state;
return _state;
}
// END OF FILE

View File

@ -5,33 +5,41 @@
// AUTHOR: Rob Tillaart
// PURPOSE: Simple StopWatch library for Arduino
// HISTORY: See StopWatch.cpp
// URL: http://www.arduino.cc/playground/Code/StopWatchClass
// URL: http://playground.arduino.cc/Code/StopWatchClass
//
// Released to the public domain
//
#define STOPWATCH_LIB_VERSION "0.1.03"
#define STOPWATCH_LIB_VERSION "0.1.02"
#define STOPWATCH_RESET 0
#define STOPWATCH_RUNNING 1
#define STOPWATCH_STOPPED 2
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class StopWatch
{
public:
StopWatch();
void start();
void stop();
void reset();
unsigned long value();
bool isRunning();
int state();
enum State { RESET, RUNNING, STOPPED };
enum Resolution { MILLIS, MICROS, SECONDS };
StopWatch(enum Resolution res = MILLIS);
void start();
void stop();
void reset();
unsigned long value();
unsigned long elapsed() { return value(); };
bool isRunning();
enum State state();
enum Resolution resolution() { return _res; };
private:
int _state;
unsigned long _starttime;
unsigned long _stoptime;
enum State _state;
enum Resolution _res;
unsigned long _starttime;
unsigned long _stoptime;
unsigned long (*_gettime)(void);
static unsigned long seconds() { return millis()/1000; };
};
#endif

View File

@ -1,14 +1,11 @@
#include <StopWatch.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
StopWatch sw_millis; // MILLIS (default)
StopWatch sw_micros(StopWatch::MICROS);
StopWatch sw_secs(StopWatch::SECONDS);
void setup() {
lcd.begin(16,2);
void setup()
{
Serial.begin(9600);
sw_millis.start();
sw_micros.start();
@ -16,22 +13,14 @@ void setup() {
}
void loop() {
void loop()
{
Serial.print("sw_millis=");
Serial.println(sw_millis.elapsed());
Serial.print("sw_micros=");
Serial.println(sw_micros.elapsed());
Serial.print("sw_secs=");
Serial.println(sw_secs.elapsed());
lcd.clear();
lcd.print("s=");
lcd.print(sw_secs.elapsed());
lcd.print(" ms=");
lcd.print(sw_millis.elapsed());
lcd.setCursor(0, 1);
lcd.print("us=");
lcd.print(sw_micros.elapsed());
delay(1000);
}

View File

@ -1,9 +1,4 @@
TODO
=====================
add examples
- for micros
- for seconds
- multiple SW with different timing
-
0.1.03 has a breaking interface