This library provides simple interface for the table football goal counter based on a IR LED or laser diode and phototransistor.
Dependents: goal_counter_project
Revision 4:fc48ef79f484, committed 2019-01-14
- Comitter:
- nxf46245
- Date:
- Mon Jan 14 17:48:02 2019 +0000
- Parent:
- 3:ce69ad70270a
- Commit message:
- Code cleaning, added timeout between two goals
Changed in this revision
| GoalCounter.cpp | Show annotated file Show diff for this revision Revisions of this file |
| GoalCounter.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/GoalCounter.cpp Sun Jan 13 16:43:27 2019 +0000
+++ b/GoalCounter.cpp Mon Jan 14 17:48:02 2019 +0000
@@ -2,28 +2,41 @@
GoalCounter::GoalCounter(PinName pin, Timer * t) : _t(t) {
- InterruptIn *_interrupt = new InterruptIn(pin);
+ InterruptIn *_interrupt = new InterruptIn(pin); // Initialize instace of InterruptIn
+ // It has to be done dynamically because of non-copyable class
- _interrupt->fall(callback(this, &GoalCounter::tstart));
+ _interrupt->fall(callback(this, &GoalCounter::tstart)); // Set callbacks to timer
_interrupt->rise(callback(this, &GoalCounter::tstop));
_score = 0;
_time = 0;
- is_goal = 0;
+ is_goal = 0;
+ _begin = 0;
+ _end = 0;
+ _last_end = 0;
+ _time_between = 0;
+
+ _t->start();
+}
+
+GoalCounter::~GoalCounter()
+{
+ delete[] _interrupt; // free up dynamically allocated memory
}
void GoalCounter::tstart() {
- _t->start();
+ _begin = _t->read(); // read value of the timer
}
void GoalCounter::tstop() {
- _t->stop();
- _time = _t->read();
- _t->reset();
-
- if ( _time > 0 && _time < 2 && _score < 10) {
+ _end = _t->read();
+ _time = _end - _begin;
+ _time_between = _begin - _last_end;
+
+ if ( _time > 0 && _time < 2 && _score < 10 && _time_between > 1) {
_score++;
_balltimes[_score] = _time;
+ _last_end = _end;
is_goal = 1;
}
}
@@ -34,7 +47,7 @@
}
float GoalCounter::get_balltime(uint8_t score) {
- if (score <= 10 && score > 0)
+ if (score <= _score && score > 0)
return _balltimes[score];
else
return -1;
@@ -46,7 +59,7 @@
}
float GoalCounter::get_ballspeed(uint8_t score) {
- if (score <= 10 && score > 0) {
+ if (score <= _score && score > 0) {
float speed = 0.034f/_balltimes[score]*3.6f;
return speed;
}
--- a/GoalCounter.h Sun Jan 13 16:43:27 2019 +0000
+++ b/GoalCounter.h Mon Jan 14 17:48:02 2019 +0000
@@ -36,19 +36,27 @@
class GoalCounter {
public:
/**
- * Constructor
+ * Constructor
*
- * @param pin Input pin where is the outpout of phototransistor connected
- * @param timer reference to the Timer instance
+ * @param pin Input pin where is the outpout of phototransistor connected
+ * @param timer reference to the Timer instance
*
*/
- GoalCounter(PinName pin, Timer * t);
+ GoalCounter(PinName pin, Timer * t);
/**
- * Starts the timer, this function is called from the interrupt pin callback
+ * Destructor
+ *
+ * Destroys instance
+ */
+ ~GoalCounter();
+ /**
+ * Reads value of the timer,
+ * this function is called from the interrupt pin fall edge callback
*/
void tstart();
/**
- * Stops the timer, this function is called from the interrupt pin callback
+ * Reads value from the timer and measures interval between end and beginning
+ * Called from the interrupt pin rise edge callback
*/
void tstop();
/**
@@ -79,7 +87,7 @@
*/
float get_ballspeed();
/**
- * Variable is 1 when the goal is detected
+ * Variable is 1 (true) when the goal is detected
*/
volatile uint8_t is_goal;
@@ -87,9 +95,12 @@
InterruptIn * _interrupt;
volatile uint8_t _score;
Timer * _t;
- float _balltimes[11];
+ float _balltimes[11]; // sorry for the FP arithmetics, i was too lazy to rewrite it
float _time;
-
+ float _begin;
+ float _end;
+ float _last_end;
+ float _time_between;
};
#endif
\ No newline at end of file