-
Notifications
You must be signed in to change notification settings - Fork 0
/
rail_motor.cpp
100 lines (78 loc) · 2.74 KB
/
rail_motor.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "constants.h"
#include "display_service.h"
#include "keypad_service.h"
#include "state_manager.h"
#include "string.h"
#include "rail_motor.h"
RailMotor & RailMotor::getInstance() {
static RailMotor instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
void RailMotor::moveForward() {
if (StateManager::getInstance().getMovingDirection() == MOVING_FORWARD || StateManager::getInstance().isSafetyMode()) {
return;
}
analogWrite(MAIN_MOTOR_OUT1, 255);
analogWrite(MAIN_MOTOR_OUT2, 0);
Serial.println(F("Moteur principal: rotation avant"));
setLight(GREEN, false);
StateManager::getInstance().changeMovingDirection(MOVING_FORWARD);
}
void RailMotor::moveBackward() {
if (StateManager::getInstance().getMovingDirection() == MOVING_BACKWARD || StateManager::getInstance().isSafetyMode()) {
return;
}
analogWrite(MAIN_MOTOR_OUT1, 0);
analogWrite(MAIN_MOTOR_OUT2, 255);
Serial.println(F("Moteur principal: rotation arrière"));
setLight(GREEN_BACKWARD, false);
StateManager::getInstance().changeMovingDirection(MOVING_BACKWARD);
}
void RailMotor::stop() {
if (StateManager::getInstance().getMovingDirection() == MOVING_IDLE) {
return;
}
analogWrite(MAIN_MOTOR_OUT1, 0);
analogWrite(MAIN_MOTOR_OUT2, 0);
Serial.println(F("Moteur principal: arrêt"));
setLight(RED, false);
StateManager::getInstance().stop();
}
void RailMotor::inverseMovingDirection() {
MovingDirection previousState = StateManager::getInstance().getMovingDirection();
Serial.println(F("Moteur principal: inversion direction"));
stop();
delay(1000);
if (previousState == MOVING_FORWARD) {
moveBackward();
} else if (previousState == MOVING_BACKWARD) {
moveForward();
}
}
// PRIVATE
RailMotor::RailMotor() {
pinMode(MAIN_MOTOR_OUT1, OUTPUT);
pinMode(MAIN_MOTOR_OUT2, OUTPUT);
pinMode(GREEN_FORWARD_LIGHT, OUTPUT);
pinMode(RED_LIGHT, OUTPUT);
pinMode(GREEN_BACKWARD_LIGHT, OUTPUT);
// Set to LOW so no power is flowing through the output
analogWrite(MAIN_MOTOR_OUT1, 0);
analogWrite(MAIN_MOTOR_OUT2, 0);
digitalWrite(GREEN_FORWARD_LIGHT, LOW);
digitalWrite(RED_LIGHT, HIGH);
digitalWrite(GREEN_BACKWARD_LIGHT, LOW);
}
void RailMotor::setLight(LightColor lightColor, bool blinking) {
digitalWrite(GREEN_FORWARD_LIGHT, LOW);
digitalWrite(RED_LIGHT, LOW);
digitalWrite(GREEN_BACKWARD_LIGHT, LOW);
if (lightColor == GREEN) {
digitalWrite(GREEN_FORWARD_LIGHT, HIGH);
} else if (lightColor == GREEN_BACKWARD) {
digitalWrite(GREEN_BACKWARD_LIGHT, HIGH);
} else {
digitalWrite(RED_LIGHT, HIGH);
}
}