-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWheelPOV.cpp
69 lines (55 loc) · 1.31 KB
/
WheelPOV.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "WheelPOV.hpp"
#include <Arduino.h>
void WheelPOV::init() {
pinMode(mHallPin, INPUT);
}
void WheelPOV::update() {
updateAngle();
if (mAngle != mPrevAngle && mRevolutionTime > 0) {
updateLEDs();
}
}
void WheelPOV::setHallPin(int hallPin) {
mHallPin = hallPin;
}
void WheelPOV::setRadius(int radius) {
mRadius = radius;
mCircumference = 2 * PI * radius;
}
void WheelPOV::setMaxRevolutionTime(unsigned long maxRevolutionTime) {
mMaxRevolutionTime = maxRevolutionTime;
}
int WheelPOV::hallPin() const {
return mHallPin;
}
int WheelPOV::radius() const {
return mRadius;
}
int WheelPOV::circumference() const {
return mCircumference;
}
unsigned long WheelPOV::maxRevolutionTime() const {
return mMaxRevolutionTime;
}
void WheelPOV::updateAngle() {
const unsigned long now = millis();
const bool bPrevActivated = bActivated;
bActivated = isNearMagnet();
if (bActivated != bPrevActivated) {
if (bActivated) {
mRevolutionTime = now - mLastActivateTime;
mLastActivateTime = now;
}
}
if (mRevolutionTime > 0) {
const unsigned long angleTime = now - mLastActivateTime;
mAngle = (360 * angleTime / mRevolutionTime) % 360;
if (now - mLastActivateTime > mRevolutionTime) {
mRevolutionTime = 0;
clearLEDs();
}
}
}
bool WheelPOV::isNearMagnet() const {
return digitalRead(mHallPin) == LOW;
}