-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDriveTrain.cpp
105 lines (96 loc) · 2.47 KB
/
DriveTrain.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
101
102
103
104
105
#include <WPILib.h>
#include "DriveTrain.h"
#include "Logger.h"
#include "Singleton.h"
DriveTrain::DriveTrain()
{
Singleton<Logger>::GetInstance().Logf("DriveTrain() initializing.");
this->left = new Jaguar(1, 1);
this->right = new Jaguar(1, 2);
this->left->SetSafetyEnabled(false);
this->right->SetSafetyEnabled(false);
}
DriveTrain::~DriveTrain()
{
Singleton<Logger>::GetInstance().Logf("~DriveTrain() stopping.");
delete this->left;
delete this->right;
}
void DriveTrain::DriveArcade(double x, double y)
{
#if 0
//left->Set(-(y-x));
//right->Set(y+x);
/*
Quad 1: ((x*45) - (y*45)) + 45
Quad 2: 0 - ((x*45) + (y*45)) - 135)
Quad 3: ((0-x)*45)-((0-y)*45) + 225
Quad 4: 0 - (((0-x)*45) + ((0-y)*45) - 315)
*/
float angle = 0.00;
float sens = .2;
if (x >= sens && y >= sens) { // Quad 1
angle = ((x*45) - (y*45)) + 45;
} else if (x >= sens && y <= sens) { // Quad 2
angle = 0 - (((x*45) + (y*45)) - 135);
} else if (x <= sens && y <= sens) { // Quad 3
angle = ((0-x)*45)-((0-y)*45) + 225;
} else if (x <= sens && y >= sens) { // Quad 4
angle = 0 - (((0-x)*45) + ((0-y)*45) - 315);
}
/* Translate Gyro angle into human-readable form */
if (gyro < 0) {
gyro = 0 - gyro;
gyro = 360 - gyro;
gyro = round(gyro, 1) % 360;
} else {
gyro = round(gyro, 1) % 360;
}
float turn = 0.00;
int sturn = 0; // Default - Still
// Calculate Smallest Turn Angle
float turn1 = 0.00; // Up, through zero
float turn2 = 0.00; // Down, through 180
turn1 = angle + (360 - gyro);
turn2 = gyro - angle;
if (turn1 < turn2 && turn1 >= 0) {
turn = turn1;
sturn = 1; // Right
} else if (turn2 < turn1 && turn2 >= 0) {
turn = turn2;
sturn = -1; // Left
} else if (turn1 == turn2) {
turn = turn1;
sturn = -1; // Left - Random
} else {
// ?! Don't Turn !?
}
// Override turn
if (turn <= 15 && turn >= -15) {
sturn = 0;
}
// Spin Motor Speeds according to sturn
float sensX = x;
if (sensX < 0) sensX = 0 - sensX;
dstation->PrintfLine(DriverStationLCD::kUser_Line4, "%i", sturn);
dstation->PrintfLine(DriverStationLCD::kUser_Line5, "%f", angle);
dstation->PrintfLine(DriverStationLCD::kUser_Line6, "%f", turn2);
if (sturn == -1) {
left->Set(.5);
right->Set(-.5);
} else if (sturn == 1) {
left->Set(-.5);
right->Set(.5);
} else {
left->Set(-(y-x));
right->Set(y+x);
}
}
#else
#endif
}
void DriveTrain::DriveTank(double __left, double __right)
{
left->Set(__left);
right->Set(__right);
}