| 
				   | 
				
| Line 12: | 
Line 12: | 
 | 3x Resitor 2.2Ω<br>  |  | 3x Resitor 2.2Ω<br>  | 
 | 6x Relais<br>  |  | 6x Relais<br>  | 
 | ----
  |  | 
 | 
  |  | 
 | '''Diagram''':
  |  | 
 | 
  |  | 
 | [[File:diagram_cb.png|frameless|800px]]
  |  | 
 | 
  |  | 
 | 
  |  | 
  | 
 | ----  |  | ----  | 
 | 
  |  | 
  | 
 | '''Code''':
  |  | [[Technical documentation]]  | 
 |    |  | 
 | Arduino.ino:
  |  | 
 | <pre>
  |  | 
 | #include "Unit.h"
  |  | 
 | #include "RunningAverage.h"
  |  | 
 | #include "StopWatch.h"
  |  | 
 |    |  | 
 | bool doprint=true;
  |  | 
 |    |  | 
 | const int threshold=20;
  |  | 
 | const int neg_threshold=-10;
  |  | 
 | const int array_size=15;
  |  | 
 | const int fill_array=200;
  |  | 
 |    |  | 
 | unsigned int grow_time=36000;
  |  | 
 | unsigned int break_time=7200;
  |  | 
 | unsigned int wait_time=1200;
  |  | 
 |    |  | 
 | const int unit_one_sensor=A0;
  |  | 
 | const int unit_two_sensor=A1;
  |  | 
 | const int unit_thr_sensor=A2;
  |  | 
 |    |  | 
 | int unit_one_plus=4;
  |  | 
 | int unit_one_minus=5;
  |  | 
 |    |  | 
 | int unit_two_plus=6;
  |  | 
 | int unit_two_minus=7;
  |  | 
 |    |  | 
 | int unit_thr_plus=8;
  |  | 
 | int unit_thr_minus=9;
  |  | 
 |    |  | 
 | Unit one(unit_one_sensor, unit_one_minus, unit_one_plus, 1, threshold, array_size, fill_array);
  |  | 
 | Unit two(unit_two_sensor, unit_two_minus, unit_two_plus, 2, threshold, array_size, fill_array);
  |  | 
 | Unit thr(unit_thr_sensor, unit_thr_minus, unit_thr_plus, 3, threshold, array_size, fill_array);
  |  | 
 |    |  | 
 |    |  | 
 | void setup(){
  |  | 
 |    |  | 
 |   pinMode(unit_one_minus,OUTPUT); 
  |  | 
 |   pinMode(unit_one_plus,OUTPUT); 
  |  | 
 |   pinMode(unit_two_minus,OUTPUT);
  |  | 
 |   pinMode(unit_two_plus,OUTPUT); 
  |  | 
 |   pinMode(unit_thr_minus,OUTPUT); 
  |  | 
 |   pinMode(unit_thr_plus,OUTPUT);
  |  | 
 |    |  | 
 |   Serial.begin(19200);
  |  | 
 |   
  |  | 
 |   Serial.println("burnout_011"); 
  |  | 
 |   
  |  | 
 |   one.wachse();
  |  | 
 |   two.wachse();
  |  | 
 |   thr.wachse();
  |  | 
 |    |  | 
 | }
  |  | 
 |    |  | 
 | void loop(){
  |  | 
 |  /*
  |  | 
 |   one.run();
  |  | 
 |   two.run();
  |  | 
 |   thr.run();
  |  | 
 |   */
  |  | 
 |   one.run_timed(grow_time, break_time, wait_time);
  |  | 
 |   two.run_timed(grow_time, break_time, wait_time);
  |  | 
 |   thr.run_timed(grow_time, break_time, wait_time);
  |  | 
 |    |  | 
 |   
  |  | 
 |   if(doprint)
  |  | 
 |   {  
  |  | 
 |     one.do_print();
  |  | 
 |     two.do_print();
  |  | 
 |     thr.do_print();
  |  | 
 |     Serial.println(); 
  |  | 
 |   }
  |  | 
 |   delay(1);
  |  | 
 | }
  |  | 
 | </pre>
  |  | 
 |    |  | 
 | Unit.h
  |  | 
 | <pre>
  |  | 
 | #ifndef Unit_h
  |  | 
 | #define Unit_h
  |  | 
 |    |  | 
 | #include "RunningAverage.h"
  |  | 
 | #include "StopWatch.h"
  |  | 
 |    |  | 
 | class Unit
  |  | 
 | {
  |  | 
 | public:  
  |  | 
 |   Unit(void);
  |  | 
 |   Unit(int const& sensor, int const& minus, int const& plus, int const& unitid, int const& threshold, int const& size, int const& fillarray);
  |  | 
 |   ~Unit();  
  |  | 
 |   void wachse();
  |  | 
 |   void breche();
  |  | 
 |   void warte();
  |  | 
 |    |  | 
 |   int state();
  |  | 
 |    |  | 
 |   void run();
  |  | 
 |   void run_timed(unsigned int const& grow_time, unsigned int const& break_time, unsigned int const& wait_time);
  |  | 
 |    |  | 
 |   void emergency_break();
  |  | 
 |   void do_print();
  |  | 
 |   void fill_spaces(int const& value);
  |  | 
 |    |  | 
 |    |  | 
 | private:  
  |  | 
 |   int m_sensor;
  |  | 
 |   int m_relais_minus;  
  |  | 
 |   int m_relais_plus;  
  |  | 
 |   int m_state;
  |  | 
 |   int m_unitid;
  |  | 
 |   int m_threshold;
  |  | 
 |   int m_fillarray;
  |  | 
 |    |  | 
 |   RunningAverage m_RA;
  |  | 
 |   RunningAverage m_delta_RA;
  |  | 
 |    |  | 
 |   StopWatch m_sw;
  |  | 
 |    |  | 
 |    |  | 
 |   int m_readings;
  |  | 
 |    |  | 
 | };
  |  | 
 |    |  | 
 | #endif
  |  | 
 |    |  | 
 | </pre>
  |  | 
 |    |  | 
 | Unit.cpp
  |  | 
 |    |  | 
 | <pre>
  |  | 
 | #include "Unit.h"
  |  | 
 | #include "RunningAverage.h"
  |  | 
 | #include "StopWatch.h"
  |  | 
 |    |  | 
 | #include <Arduino.h>
  |  | 
 |    |  | 
 | Unit::Unit(int const& sensor, int const& r_minus, int const& r_plus, int const& unitid, int const& threshold, int const& size, int const& fillarray)
  |  | 
 | {
  |  | 
 |   m_sensor=sensor;
  |  | 
 |   m_relais_minus = r_minus;
  |  | 
 |   m_relais_plus = r_plus;
  |  | 
 |   m_unitid=unitid;
  |  | 
 |   m_threshold=threshold;
  |  | 
 |    |  | 
 |   m_state=0;  
  |  | 
 |   m_fillarray=fillarray;
  |  | 
 |   m_sw.start();
  |  | 
 |    |  | 
 |   m_RA.init(size);
  |  | 
 |   m_delta_RA.init(size);
  |  | 
 |    |  | 
 |   digitalWrite(m_relais_minus, HIGH);
  |  | 
 |   digitalWrite(m_relais_plus, HIGH);  
  |  | 
 | }
  |  | 
 |    |  | 
 | Unit::~Unit()
  |  | 
 | {
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::wachse()
  |  | 
 | {    
  |  | 
 |   digitalWrite(m_relais_minus, LOW);
  |  | 
 |   digitalWrite(m_relais_plus, HIGH);  
  |  | 
 |    |  | 
 |   m_state=1;
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::breche()
  |  | 
 | {
  |  | 
 |   digitalWrite(m_relais_minus, HIGH);
  |  | 
 |   delay(10);
  |  | 
 |   digitalWrite(m_relais_plus, LOW);
  |  | 
 |    |  | 
 |   m_state=2;
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::warte()
  |  | 
 | {
  |  | 
 |   digitalWrite(m_relais_minus, HIGH);
  |  | 
 |   digitalWrite(m_relais_plus, HIGH);
  |  | 
 |    |  | 
 |   m_state=3;
  |  | 
 | }
  |  | 
 |    |  | 
 | int Unit::state()
  |  | 
 | {
  |  | 
 |   return m_state;
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::run()
  |  | 
 | {
  |  | 
 |   m_readings=analogRead(m_sensor);
  |  | 
 |    |  | 
 |   emergency_break();
  |  | 
 |    |  | 
 |   m_RA.addValue(m_readings);
  |  | 
 |   m_delta_RA.addValue(m_readings-m_RA.getAverage());
  |  | 
 |    |  | 
 |   if(m_fillarray>0)
  |  | 
 |   {
  |  | 
 |     m_fillarray--;
  |  | 
 |   }
  |  | 
 |   else if(m_readings<=1000)
  |  | 
 |   {	
  |  | 
 |     if(m_delta_RA.getAverage()>m_threshold)
  |  | 
 |     {
  |  | 
 |       breche();
  |  | 
 |     }
  |  | 
 |    |  | 
 |     if(m_delta_RA.getAverage()<(-m_threshold))
  |  | 
 |     {
  |  | 
 |       wachse();
  |  | 
 |     }
  |  | 
 |   }
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::run_timed(unsigned int const&  grow_time, unsigned int const& break_time, unsigned int const& wait_time)
  |  | 
 | {
  |  | 
 |   m_readings=analogRead(m_sensor);
  |  | 
 |    |  | 
 |   emergency_break();
  |  | 
 |    |  | 
 |   m_RA.addValue(m_readings);
  |  | 
 |   m_delta_RA.addValue(m_readings-m_RA.getAverage());
  |  | 
 |    |  | 
 |   if(m_fillarray>0)
  |  | 
 |   {
  |  | 
 |     m_fillarray--;
  |  | 
 |   }
  |  | 
 |   else if(m_readings<=1000)
  |  | 
 |   {	
  |  | 
 |     if(m_delta_RA.getAverage()>m_threshold)
  |  | 
 |     {
  |  | 
 |       breche();
  |  | 
 |       m_sw.reset();
  |  | 
 |       m_sw.start();
  |  | 
 |     }
  |  | 
 |    |  | 
 |     if(m_delta_RA.getAverage()<(-m_threshold))
  |  | 
 |     {
  |  | 
 |       wachse();
  |  | 
 |       m_sw.reset();
  |  | 
 |       m_sw.start();
  |  | 
 |     }
  |  | 
 |    |  | 
 |     if(m_state==1 && m_sw.elapsed()>grow_time)
  |  | 
 |     {
  |  | 
 |       breche();
  |  | 
 |     }
  |  | 
 |    |  | 
 |     if(m_state==2 && m_sw.elapsed()>break_time)
  |  | 
 |     {
  |  | 
 |       wachse();
  |  | 
 |     }
  |  | 
 |    |  | 
 |     if(m_state==3 && m_sw.elapsed()>wait_time)
  |  | 
 |     {
  |  | 
 |       wachse();
  |  | 
 |     }
  |  | 
 |   }
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::do_print()
  |  | 
 | {
  |  | 
 |   Serial.print(" unit");
  |  | 
 |   Serial.print(m_unitid);
  |  | 
 |   Serial.print(": ");
  |  | 
 |   Serial.print(m_state);
  |  | 
 |   fill_spaces(m_readings);
  |  | 
 |   Serial.print(m_readings);
  |  | 
 |   Serial.print("  ");
  |  | 
 |   fill_spaces(m_delta_RA.getAverage());
  |  | 
 |   Serial.print(m_delta_RA.getAverage());
  |  | 
 |   Serial.print("#");
  |  | 
 |   fill_spaces(m_fillarray);
  |  | 
 |   Serial.print(m_fillarray);
  |  | 
 |   Serial.print("->");
  |  | 
 |   fill_spaces(m_sw.elapsed());
  |  | 
 |   Serial.print(m_sw.elapsed());
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::emergency_break()
  |  | 
 | {
  |  | 
 |   if(m_readings>1000 && m_readings < 1010)
  |  | 
 |   {
  |  | 
 |     Serial.print(" | ");
  |  | 
 |     Serial.print(m_readings);
  |  | 
 |     Serial.print("  ");
  |  | 
 |     Serial.print("HIGH");
  |  | 
 |     Serial.print(" E_1 UNIT");
  |  | 
 |     Serial.print(m_unitid);
  |  | 
 |     Serial.print(": ");
  |  | 
 |     Serial.print(m_state);
  |  | 
 |     Serial.print(" | ");
  |  | 
 |    |  | 
 |     breche();
  |  | 
 |     m_sw.reset();
  |  | 
 |     m_sw.start();
  |  | 
 |    |  | 
 |   }
  |  | 
 |    |  | 
 |   if(m_readings>=1010)
  |  | 
 |   {
  |  | 
 |     Serial.print(" # ");
  |  | 
 |     Serial.print(m_readings);
  |  | 
 |     Serial.print(" # ");
  |  | 
 |     Serial.print("HIGH");
  |  | 
 |     Serial.print(" E_2 UNIT");
  |  | 
 |     Serial.print(m_unitid);
  |  | 
 |     Serial.print(": ");
  |  | 
 |     Serial.print(m_state);
  |  | 
 |     Serial.print(" # ");
  |  | 
 |    |  | 
 |     wachse();
  |  | 
 |     delay(10);
  |  | 
 |     breche();
  |  | 
 |     m_sw.reset();
  |  | 
 |     m_sw.start();
  |  | 
 |    |  | 
 |   }
  |  | 
 |    |  | 
 |   if(m_readings>1022)
  |  | 
 |   {
  |  | 
 |     Serial.print(" | ");
  |  | 
 |     Serial.print(m_readings);
  |  | 
 |     Serial.print("  ");
  |  | 
 |     Serial.print("HIGH");
  |  | 
 |     Serial.print(" E_3 UNIT");
  |  | 
 |     Serial.print(m_unitid);
  |  | 
 |     Serial.print(": ");
  |  | 
 |     Serial.print(m_state);
  |  | 
 |     Serial.print(" | ");
  |  | 
 |    |  | 
 |     warte();
  |  | 
 |     m_sw.reset();
  |  | 
 |     m_sw.start();
  |  | 
 |   }
  |  | 
 | }
  |  | 
 |    |  | 
 | void Unit::fill_spaces(int const& value)
  |  | 
 | {
  |  | 
 |   if(value<1000 && value>=0)
  |  | 
 |   {
  |  | 
 |     Serial.print(" ");
  |  | 
 |     if(value<100)
  |  | 
 |     {
  |  | 
 |       Serial.print(" ");
  |  | 
 |       if(value<10)
  |  | 
 |       {
  |  | 
 |         Serial.print(" ");
  |  | 
 |       }
  |  | 
 |     }
  |  | 
 |   }
  |  | 
 |    |  | 
 |   if(value>-1000 && value<0)
  |  | 
 |   {
  |  | 
 |     if(value>-100)
  |  | 
 |     {
  |  | 
 |       Serial.print(" ");
  |  | 
 |       if(value>-10)
  |  | 
 |       {
  |  | 
 |         Serial.print(" ");
  |  | 
 |       }
  |  | 
 |     }
  |  | 
 |   }
  |  | 
 | }
  |  | 
 | </pre>
  |  | 
 |    |  | 
 | RunningAverage.h
  |  | 
 | <pre>
  |  | 
 | #ifndef RunningAverage_h
  |  | 
 | #define RunningAverage_h
  |  | 
 | // 
  |  | 
 | //    FILE: RunningAverage.h
  |  | 
 | //  AUTHOR: Rob dot Tillaart at gmail dot com
  |  | 
 | // PURPOSE: RunningAverage library for Arduino
  |  | 
 | //     URL: http://playground.arduino.cc/Main/RunningAverage
  |  | 
 | // HISTORY: See RunningAverage.cpp
  |  | 
 | //
  |  | 
 | // Released to the public domain
  |  | 
 | //
  |  | 
 |    |  | 
 | // backwards compatibility
  |  | 
 | // clr() clear()
  |  | 
 | // add(x) addValue(x)
  |  | 
 | // avg() getAverage()
  |  | 
 |    |  | 
 | #define RUNNINGAVERAGE_LIB_VERSION "0.2.02"
  |  | 
 |    |  | 
 | class RunningAverage 
  |  | 
 | {
  |  | 
 | public:
  |  | 
 |   RunningAverage();
  |  | 
 |   RunningAverage(int);
  |  | 
 |   ~RunningAverage();
  |  | 
 |   void clear();
  |  | 
 |   void init(int n);
  |  | 
 |   void addValue(int);
  |  | 
 |   int getAverage();
  |  | 
 |   void fillValue(int, int);
  |  | 
 |    |  | 
 | protected:
  |  | 
 |   int _size;
  |  | 
 |   int _cnt;
  |  | 
 |   int _idx;
  |  | 
 |   int _sum;
  |  | 
 |   int * _ar;
  |  | 
 | };
  |  | 
 |    |  | 
 | #endif
  |  | 
 | // END OF FILE
  |  | 
 | </pre>
  |  | 
 |    |  | 
 | RunningAverage.cpp
  |  | 
 | <pre>
  |  | 
 | // 
  |  | 
 | //    FILE: RunningAverage.cpp
  |  | 
 | //  AUTHOR: Rob Tillaart
  |  | 
 | // VERSION: 0.2.02
  |  | 
 | // PURPOSE: RunningAverage library for Arduino
  |  | 
 | //
  |  | 
 | // The library stores the last N individual values in a circular buffer, 
  |  | 
 | // to calculate the running average. 
  |  | 
 | //
  |  | 
 | // HISTORY: 
  |  | 
 | // 0.1.00 - 2011-01-30 initial version
  |  | 
 | // 0.1.01 - 2011-02-28 fixed missing destructor in .h
  |  | 
 | // 0.2.00 - 2012-??-?? Yuval Naveh added trimValue (found on web)
  |  | 
 | //          http://stromputer.googlecode.com/svn-history/r74/trunk/Arduino/Libraries/RunningAverage/RunningAverage.cpp
  |  | 
 | // 0.2.01 - 2012-11-21 refactored
  |  | 
 | // 0.2.02 - 2012-12-30 refactored trimValue -> fillValue
  |  | 
 | //
  |  | 
 | // Released to the public domain
  |  | 
 | //
  |  | 
 |    |  | 
 | #include "RunningAverage.h"
  |  | 
 | #include <stdlib.h>
  |  | 
 |    |  | 
 | RunningAverage::RunningAverage()
  |  | 
 | {
  |  | 
 |    |  | 
 | }
  |  | 
 |    |  | 
 | RunningAverage::RunningAverage(int n)
  |  | 
 | {
  |  | 
 |   _size = n;
  |  | 
 |   _ar = (int*) malloc(_size * sizeof(int));
  |  | 
 |   clear();
  |  | 
 | }
  |  | 
 |    |  | 
 | RunningAverage::~RunningAverage()
  |  | 
 | {
  |  | 
 |   free(_ar);
  |  | 
 | }
  |  | 
 |    |  | 
 | // resets all counters
  |  | 
 | void RunningAverage::clear() 
  |  | 
 | { 
  |  | 
 |   _cnt = 0;
  |  | 
 |   _idx = 0;
  |  | 
 |   _sum = 0.0;
  |  | 
 |   for (int i = 0; i< _size; i++) _ar[i] = 0.0;  // needed to keep addValue simple
  |  | 
 | }
  |  | 
 |    |  | 
 | void RunningAverage::init(int n)
  |  | 
 | {
  |  | 
 |   _size = n;
  |  | 
 |   _ar = (int*) malloc(_size * sizeof(int));
  |  | 
 |   clear();
  |  | 
 | }
  |  | 
 |    |  | 
 | // adds a new value to the data-set
  |  | 
 | void RunningAverage::addValue(int f)
  |  | 
 | {
  |  | 
 |   _sum -= _ar[_idx];
  |  | 
 |   _ar[_idx] = f;
  |  | 
 |   _sum += _ar[_idx];
  |  | 
 |   _idx++;
  |  | 
 |   if (_idx == _size) _idx = 0;  // faster than %
  |  | 
 |   if (_cnt < _size) _cnt++;
  |  | 
 | }
  |  | 
 |    |  | 
 | // returns the average of the data-set added sofar
  |  | 
 | int RunningAverage::getAverage()
  |  | 
 | {
  |  | 
 |   if (_cnt == 0) return 0; // NaN ?  math.h
  |  | 
 |   return _sum / _cnt;
  |  | 
 | }
  |  | 
 |    |  | 
 | // fill the average with a value
  |  | 
 | // the param number determines how often value is added (weight)
  |  | 
 | // number should preferably be between 1 and size
  |  | 
 | void RunningAverage::fillValue(int value, int number)
  |  | 
 | {
  |  | 
 |   clear();
  |  | 
 |   for (int i = 0; i < number; i++) 
  |  | 
 |   {
  |  | 
 |     addValue(value);
  |  | 
 |   }
  |  | 
 | }
  |  | 
 | // END OF FILE
  |  | 
 | </pre>
  |  | 
 |    |  | 
 | Stopwatch.h
  |  | 
 | <pre>
  |  | 
 | #ifndef StopWatch_h
  |  | 
 | #define StopWatch_h
  |  | 
 | // 
  |  | 
 | //    FILE: StopWatch.h
  |  | 
 | //  AUTHOR: Rob Tillaart
  |  | 
 | // PURPOSE: Simple StopWatch library for Arduino
  |  | 
 | // HISTORY: See StopWatch.cpp
  |  | 
 | //     URL: http://playground.arduino.cc/Code/StopWatchClass
  |  | 
 | //
  |  | 
 | // Released to the public domain
  |  | 
 | //
  |  | 
 |    |  | 
 | #define STOPWATCH_LIB_VERSION "0.1.03"
  |  | 
 |    |  | 
 | #if ARDUINO >= 100
  |  | 
 | #include "Arduino.h"
  |  | 
 | #else
  |  | 
 | #include "WProgram.h"
  |  | 
 | #endif
  |  | 
 |    |  | 
 | class StopWatch 
  |  | 
 | {
  |  | 
 | public:
  |  | 
 |   enum State { 
  |  | 
 |     RESET, RUNNING, STOPPED   };
  |  | 
 |   enum Resolution { 
  |  | 
 |     MILLIS, MICROS, SECONDS   };
  |  | 
 |   StopWatch(enum Resolution res = SECONDS);
  |  | 
 |   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:
  |  | 
 |   enum State _state;
  |  | 
 |   enum Resolution _res;
  |  | 
 |   unsigned long _starttime;
  |  | 
 |   unsigned long _stoptime;
  |  | 
 |   unsigned long (*_gettime)(void);
  |  | 
 |   static unsigned long seconds() { 
  |  | 
 |     return millis()/1000; 
  |  | 
 |   };
  |  | 
 | };
  |  | 
 |    |  | 
 | #endif
  |  | 
 | // END OF FILE
  |  | 
 | </pre>
  |  | 
 |    |  | 
 | StopWatch.cpp
  |  | 
 | <pre>
  |  | 
 | // 
  |  | 
 | //    FILE: StopWatch.cpp
  |  | 
 | //  AUTHOR: Rob Tillaart
  |  | 
 | // VERSION: 0.1.03
  |  | 
 | // PURPOSE: Simple StopWatch library for Arduino
  |  | 
 | //
  |  | 
 | // 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"
  |  | 
 |    |  | 
 | StopWatch::StopWatch(enum Resolution res)
  |  | 
 | {
  |  | 
 |   _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;
  |  | 
 | }
  |  | 
 |    |  | 
 | void StopWatch::start()
  |  | 
 | {
  |  | 
 |   if (_state == StopWatch::RESET || _state == StopWatch::STOPPED)
  |  | 
 |   {
  |  | 
 |     _state = StopWatch::RUNNING;
  |  | 
 |     unsigned long t = _gettime();
  |  | 
 |     _starttime += t - _stoptime;
  |  | 
 |     _stoptime = t;
  |  | 
 |   }
  |  | 
 | }
  |  | 
 |    |  | 
 | unsigned long StopWatch::value()
  |  | 
 | {
  |  | 
 |   if (_state == StopWatch::RUNNING) _stoptime = _gettime();
  |  | 
 |   return _stoptime - _starttime;
  |  | 
 | }
  |  | 
 |    |  | 
 | void StopWatch::stop()
  |  | 
 | {
  |  | 
 |   if (_state == StopWatch::RUNNING)
  |  | 
 |   {
  |  | 
 |     _state = StopWatch::STOPPED;
  |  | 
 |     _stoptime = _gettime();
  |  | 
 |   }
  |  | 
 | }
  |  | 
 |    |  | 
 | bool StopWatch::isRunning()
  |  | 
 | {
  |  | 
 |   return (_state == StopWatch::RUNNING);
  |  | 
 | }
  |  | 
 |    |  | 
 | enum StopWatch::State StopWatch::state()
  |  | 
 | {
  |  | 
 |   return _state;
  |  | 
 | }
  |  | 
 | // END OF FILE
  |  | 
 | </pre>
  |  |