blob: 9f3616bbec3f38d4bbcffe91c1dac61f8d63f74e [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "frc971/constants.h"
2
3#include <stddef.h>
Austin Schuh464ee1a2013-03-01 22:37:39 -08004#include <math.h>
brians343bc112013-02-10 01:53:46 +00005
Brian Silverman20fdbef2013-03-09 13:42:03 -08006#include "aos/common/inttypes.h"
brians343bc112013-02-10 01:53:46 +00007#include "aos/common/messages/RobotState.q.h"
8#include "aos/atom_code/output/MotorOutput.h"
9
Brian Silverman20fdbef2013-03-09 13:42:03 -080010#ifndef M_PI
11#define M_PI 3.14159265358979323846
12#endif
13
James Kuszmaul4a4622b2013-03-02 16:28:29 -080014// Note: So far, none of the Angle Adjust numbers have been measured.
15// Do not rely on them for real life.
16
brians343bc112013-02-10 01:53:46 +000017namespace frc971 {
18namespace constants {
19
20namespace {
21
Brian Silverman18f6d872013-03-16 13:55:46 -070022// It has about 0.029043 of gearbox slop.
23const double kCompWristHallEffectStartAngle = 1.0872860614359172;
24const double kPracticeWristHallEffectStartAngle = 1.0872860614359172;
Austin Schuhfa033692013-02-24 01:00:55 -080025
James Kuszmaule06e2512013-03-02 15:04:53 -080026const double kCompWristHallEffectStopAngle = 100 * M_PI / 180.0;
27const double kPracticeWristHallEffectStopAngle = 100 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080028
Brian Silverman18f6d872013-03-16 13:55:46 -070029const double kPracticeWristUpperPhysicalLimit = 1.677562;
30const double kCompWristUpperPhysicalLimit = 1.677562;
Austin Schuhfa033692013-02-24 01:00:55 -080031
Brian Silverman18f6d872013-03-16 13:55:46 -070032const double kPracticeWristLowerPhysicalLimit = -0.746128;
33const double kCompWristLowerPhysicalLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080034
Brian Silverman18f6d872013-03-16 13:55:46 -070035const double kPracticeWristUpperLimit = 1.615385;
36const double kCompWristUpperLimit = 1.615385;
Austin Schuhfa033692013-02-24 01:00:55 -080037
Brian Silverman18f6d872013-03-16 13:55:46 -070038const double kPracticeWristLowerLimit = -0.746128;
39const double kCompWristLowerLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080040
Austin Schuhdd3bc412013-03-16 17:02:40 -070041const double kWristZeroingSpeed = 0.25;
42const double kWristZeroingOffSpeed = 1.0;
Austin Schuhfa033692013-02-24 01:00:55 -080043
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080044const int kAngleAdjustHallEffect = 2;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080045
Austin Schuhb5191b92013-03-10 18:22:24 -070046const double kCompAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
47const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080048
Austin Schuhb5191b92013-03-10 18:22:24 -070049const double kCompAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
50const double kPracticeAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080051
Austin Schuhb5191b92013-03-10 18:22:24 -070052const double kPracticeAngleAdjustUpperPhysicalLimit = 0.894481;
53const double kCompAngleAdjustUpperPhysicalLimit = 0.894481;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080054
Austin Schuhb5191b92013-03-10 18:22:24 -070055const double kPracticeAngleAdjustLowerPhysicalLimit = 0.283616;
56const double kCompAngleAdjustLowerPhysicalLimit = 0.283616;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080057
Austin Schuhb5191b92013-03-10 18:22:24 -070058const double kPracticeAngleAdjustUpperLimit = 0.85;
59const double kCompAngleAdjustUpperLimit = 0.85;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080060
Austin Schuhb5191b92013-03-10 18:22:24 -070061const double kPracticeAngleAdjustLowerLimit = 0.32;
62const double kCompAngleAdjustLowerLimit = 0.32;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080063
Austin Schuh9644e1c2013-03-12 00:40:36 -070064const double kAngleAdjustZeroingSpeed = -0.2;
Austin Schuhdd3bc412013-03-16 17:02:40 -070065const double kAngleAdjustZeroingOffSpeed = -0.5;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080066
brians343bc112013-02-10 01:53:46 +000067const int kCompCameraCenter = -2;
68const int kPracticeCameraCenter = -5;
69
70struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080071 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080072 double wrist_hall_effect_start_angle;
73 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080074
75 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080076 double wrist_upper_limit;
77 double wrist_lower_limit;
78
Austin Schuhfa033692013-02-24 01:00:55 -080079 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080080 double wrist_upper_physical_limit;
81 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080082
83 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080084 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070085 // Zeroing off speed.
86 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080087
James Kuszmaul4a4622b2013-03-02 16:28:29 -080088 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080089 const double *angle_adjust_hall_effect_start_angle;
90 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080091
92 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080093 double angle_adjust_upper_limit;
94 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080095 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080096 double angle_adjust_upper_physical_limit;
97 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080098
99 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800100 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -0700101 // Zeroing off speed.
102 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800103
brians343bc112013-02-10 01:53:46 +0000104 // what camera_center returns
105 int camera_center;
brians343bc112013-02-10 01:53:46 +0000106};
Austin Schuhfa033692013-02-24 01:00:55 -0800107
brians343bc112013-02-10 01:53:46 +0000108Values *values = NULL;
109// Attempts to retrieve a new Values instance and stores it in values if
110// necessary.
111// Returns a valid Values instance or NULL.
112const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800113 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000114 if (values == NULL) {
115 LOG(INFO, "creating a Constants for team %"PRIu16"\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800116 ::aos::robot_state->team_id);
117 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000118 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800119 values = new Values{kCompWristHallEffectStartAngle,
120 kCompWristHallEffectStopAngle,
121 kCompWristUpperLimit,
122 kCompWristLowerLimit,
123 kCompWristUpperPhysicalLimit,
124 kCompWristLowerPhysicalLimit,
125 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700126 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800127 kCompAngleAdjustHallEffectStartAngle,
128 kCompAngleAdjustHallEffectStopAngle,
129 kCompAngleAdjustUpperLimit,
130 kCompAngleAdjustLowerLimit,
131 kCompAngleAdjustUpperPhysicalLimit,
132 kCompAngleAdjustLowerPhysicalLimit,
133 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700134 kAngleAdjustZeroingOffSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800135 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000136 break;
137 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800138 values = new Values{kPracticeWristHallEffectStartAngle,
139 kPracticeWristHallEffectStopAngle,
140 kPracticeWristUpperLimit,
141 kPracticeWristLowerLimit,
142 kPracticeWristUpperPhysicalLimit,
143 kPracticeWristLowerPhysicalLimit,
144 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700145 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800146 kPracticeAngleAdjustHallEffectStartAngle,
147 kPracticeAngleAdjustHallEffectStopAngle,
148 kPracticeAngleAdjustUpperLimit,
149 kPracticeAngleAdjustLowerLimit,
150 kPracticeAngleAdjustUpperPhysicalLimit,
151 kPracticeAngleAdjustLowerPhysicalLimit,
152 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700153 kAngleAdjustZeroingOffSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800154 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000155 break;
156 default:
157 LOG(ERROR, "unknown team #%"PRIu16"\n",
158 aos::robot_state->team_id);
159 return NULL;
160 }
161 }
162 return values;
163}
164
165} // namespace
166
James Kuszmaule06e2512013-03-02 15:04:53 -0800167bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000168 const Values *const values = GetValues();
169 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800170 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000171 return true;
172}
James Kuszmaule06e2512013-03-02 15:04:53 -0800173bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800174 const Values *const values = GetValues();
175 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800176 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800177 return true;
178}
James Kuszmaule06e2512013-03-02 15:04:53 -0800179bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800180 const Values *const values = GetValues();
181 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800182 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800183 return true;
184}
185
James Kuszmaule06e2512013-03-02 15:04:53 -0800186bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800187 const Values *const values = GetValues();
188 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800189 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800190 return true;
191}
192
James Kuszmaule06e2512013-03-02 15:04:53 -0800193bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800194 const Values *const values = GetValues();
195 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800196 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800197 return true;
198}
199
James Kuszmaule06e2512013-03-02 15:04:53 -0800200bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800201 const Values *const values = GetValues();
202 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800203 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800204 return true;
205}
206
James Kuszmaule06e2512013-03-02 15:04:53 -0800207bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800208 const Values *const values = GetValues();
209 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800210 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800211 return true;
212}
213
Austin Schuhdd3bc412013-03-16 17:02:40 -0700214bool wrist_zeroing_off_speed(double *speed) {
215 const Values *const values = GetValues();
216 if (values == NULL) return false;
217 *speed = values->wrist_zeroing_off_speed;
218 return true;
219}
220
Austin Schuhe20e93c2013-03-09 19:54:16 -0800221bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800222 const Values *const values = GetValues();
223 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800224 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
225 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800226 return true;
227}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800228bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800229 const Values *const values = GetValues();
230 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800231 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
232 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800233 return true;
234}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800235bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800236 const Values *const values = GetValues();
237 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800238 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800239 return true;
240}
241
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800242bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800243 const Values *const values = GetValues();
244 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800245 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800246 return true;
247}
248
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800249bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800250 const Values *const values = GetValues();
251 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800252 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800253 return true;
254}
255
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800256bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800257 const Values *const values = GetValues();
258 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800259 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800260 return true;
261}
262
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800263bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800264 const Values *const values = GetValues();
265 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800266 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800267 return true;
268}
269
Austin Schuhdd3bc412013-03-16 17:02:40 -0700270bool angle_adjust_zeroing_off_speed(double *speed) {
271 const Values *const values = GetValues();
272 if (values == NULL) return false;
273 *speed = values->angle_adjust_zeroing_off_speed;
274 return true;
275}
276
brians343bc112013-02-10 01:53:46 +0000277bool camera_center(int *center) {
278 const Values *const values = GetValues();
279 if (values == NULL) return false;
280 *center = values->camera_center;
281 return true;
282}
brians343bc112013-02-10 01:53:46 +0000283
284} // namespace constants
285} // namespace frc971