blob: 1443a48a1af887d1c9a61d28a085f8342b1d4ab5 [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"
Brian Silverman3204dd82013-03-12 18:42:01 -07008#include "aos/common/logging/logging.h"
brians343bc112013-02-10 01:53:46 +00009
Brian Silverman20fdbef2013-03-09 13:42:03 -080010#ifndef M_PI
11#define M_PI 3.14159265358979323846
12#endif
13
brians343bc112013-02-10 01:53:46 +000014namespace frc971 {
15namespace constants {
16
17namespace {
18
Brian Silverman18f6d872013-03-16 13:55:46 -070019// It has about 0.029043 of gearbox slop.
20const double kCompWristHallEffectStartAngle = 1.0872860614359172;
21const double kPracticeWristHallEffectStartAngle = 1.0872860614359172;
Austin Schuhfa033692013-02-24 01:00:55 -080022
James Kuszmaule06e2512013-03-02 15:04:53 -080023const double kCompWristHallEffectStopAngle = 100 * M_PI / 180.0;
24const double kPracticeWristHallEffectStopAngle = 100 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080025
Brian Silverman18f6d872013-03-16 13:55:46 -070026const double kPracticeWristUpperPhysicalLimit = 1.677562;
27const double kCompWristUpperPhysicalLimit = 1.677562;
Austin Schuhfa033692013-02-24 01:00:55 -080028
Brian Silverman18f6d872013-03-16 13:55:46 -070029const double kPracticeWristLowerPhysicalLimit = -0.746128;
30const double kCompWristLowerPhysicalLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080031
Brian Silverman18f6d872013-03-16 13:55:46 -070032const double kPracticeWristUpperLimit = 1.615385;
33const double kCompWristUpperLimit = 1.615385;
Austin Schuhfa033692013-02-24 01:00:55 -080034
Brian Silverman18f6d872013-03-16 13:55:46 -070035const double kPracticeWristLowerLimit = -0.746128;
36const double kCompWristLowerLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080037
Austin Schuhdd3bc412013-03-16 17:02:40 -070038const double kWristZeroingSpeed = 0.25;
Brian Silvermanbcaf3842013-03-16 23:49:35 -070039const double kWristZeroingOffSpeed = 0.35;
Austin Schuhfa033692013-02-24 01:00:55 -080040
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080041const int kAngleAdjustHallEffect = 2;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080042
Austin Schuhb5191b92013-03-10 18:22:24 -070043const double kCompAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
44const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080045
Austin Schuhb5191b92013-03-10 18:22:24 -070046const double kCompAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
47const double kPracticeAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080048
Brian Silverman77f41752013-03-16 13:56:32 -070049const double kPracticeAngleAdjustUpperPhysicalLimit = 0.904737;
50const double kCompAngleAdjustUpperPhysicalLimit = 0.904737;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080051
Brian Silverman77f41752013-03-16 13:56:32 -070052const double kPracticeAngleAdjustLowerPhysicalLimit = 0.272451;
53const double kCompAngleAdjustLowerPhysicalLimit = 0.272451;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080054
Brian Silverman77f41752013-03-16 13:56:32 -070055const double kPracticeAngleAdjustUpperLimit = 0.87;
56const double kCompAngleAdjustUpperLimit = 0.87;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080057
Brian Silverman77f41752013-03-16 13:56:32 -070058const double kPracticeAngleAdjustLowerLimit = 0.30;
59const double kCompAngleAdjustLowerLimit = 0.30;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080060
Austin Schuh9644e1c2013-03-12 00:40:36 -070061const double kAngleAdjustZeroingSpeed = -0.2;
Austin Schuhdd3bc412013-03-16 17:02:40 -070062const double kAngleAdjustZeroingOffSpeed = -0.5;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080063
brians343bc112013-02-10 01:53:46 +000064const int kCompCameraCenter = -2;
65const int kPracticeCameraCenter = -5;
66
67struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080068 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080069 double wrist_hall_effect_start_angle;
70 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080071
72 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080073 double wrist_upper_limit;
74 double wrist_lower_limit;
75
Austin Schuhfa033692013-02-24 01:00:55 -080076 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080077 double wrist_upper_physical_limit;
78 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080079
80 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080081 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070082 // Zeroing off speed.
83 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080084
James Kuszmaul4a4622b2013-03-02 16:28:29 -080085 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080086 const double *angle_adjust_hall_effect_start_angle;
87 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080088
89 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080090 double angle_adjust_upper_limit;
91 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080092 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080093 double angle_adjust_upper_physical_limit;
94 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080095
96 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080097 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070098 // Zeroing off speed.
99 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800100
brians343bc112013-02-10 01:53:46 +0000101 // what camera_center returns
102 int camera_center;
brians343bc112013-02-10 01:53:46 +0000103};
Austin Schuhfa033692013-02-24 01:00:55 -0800104
brians343bc112013-02-10 01:53:46 +0000105Values *values = NULL;
106// Attempts to retrieve a new Values instance and stores it in values if
107// necessary.
108// Returns a valid Values instance or NULL.
109const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800110 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000111 if (values == NULL) {
112 LOG(INFO, "creating a Constants for team %"PRIu16"\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800113 ::aos::robot_state->team_id);
114 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000115 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800116 values = new Values{kCompWristHallEffectStartAngle,
117 kCompWristHallEffectStopAngle,
118 kCompWristUpperLimit,
119 kCompWristLowerLimit,
120 kCompWristUpperPhysicalLimit,
121 kCompWristLowerPhysicalLimit,
122 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700123 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800124 kCompAngleAdjustHallEffectStartAngle,
125 kCompAngleAdjustHallEffectStopAngle,
126 kCompAngleAdjustUpperLimit,
127 kCompAngleAdjustLowerLimit,
128 kCompAngleAdjustUpperPhysicalLimit,
129 kCompAngleAdjustLowerPhysicalLimit,
130 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700131 kAngleAdjustZeroingOffSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800132 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000133 break;
134 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800135 values = new Values{kPracticeWristHallEffectStartAngle,
136 kPracticeWristHallEffectStopAngle,
137 kPracticeWristUpperLimit,
138 kPracticeWristLowerLimit,
139 kPracticeWristUpperPhysicalLimit,
140 kPracticeWristLowerPhysicalLimit,
141 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700142 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800143 kPracticeAngleAdjustHallEffectStartAngle,
144 kPracticeAngleAdjustHallEffectStopAngle,
145 kPracticeAngleAdjustUpperLimit,
146 kPracticeAngleAdjustLowerLimit,
147 kPracticeAngleAdjustUpperPhysicalLimit,
148 kPracticeAngleAdjustLowerPhysicalLimit,
149 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700150 kAngleAdjustZeroingOffSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800151 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000152 break;
153 default:
154 LOG(ERROR, "unknown team #%"PRIu16"\n",
155 aos::robot_state->team_id);
156 return NULL;
157 }
158 }
159 return values;
160}
161
162} // namespace
163
James Kuszmaule06e2512013-03-02 15:04:53 -0800164bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000165 const Values *const values = GetValues();
166 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800167 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000168 return true;
169}
James Kuszmaule06e2512013-03-02 15:04:53 -0800170bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800171 const Values *const values = GetValues();
172 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800173 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800174 return true;
175}
James Kuszmaule06e2512013-03-02 15:04:53 -0800176bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800177 const Values *const values = GetValues();
178 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800179 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800180 return true;
181}
182
James Kuszmaule06e2512013-03-02 15:04:53 -0800183bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800184 const Values *const values = GetValues();
185 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800186 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800187 return true;
188}
189
James Kuszmaule06e2512013-03-02 15:04:53 -0800190bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800191 const Values *const values = GetValues();
192 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800193 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800194 return true;
195}
196
James Kuszmaule06e2512013-03-02 15:04:53 -0800197bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800198 const Values *const values = GetValues();
199 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800200 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800201 return true;
202}
203
James Kuszmaule06e2512013-03-02 15:04:53 -0800204bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800205 const Values *const values = GetValues();
206 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800207 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800208 return true;
209}
210
Austin Schuhdd3bc412013-03-16 17:02:40 -0700211bool wrist_zeroing_off_speed(double *speed) {
212 const Values *const values = GetValues();
213 if (values == NULL) return false;
214 *speed = values->wrist_zeroing_off_speed;
215 return true;
216}
217
Austin Schuhe20e93c2013-03-09 19:54:16 -0800218bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800219 const Values *const values = GetValues();
220 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800221 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
222 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800223 return true;
224}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800225bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800226 const Values *const values = GetValues();
227 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800228 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
229 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800230 return true;
231}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800232bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800233 const Values *const values = GetValues();
234 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800235 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800236 return true;
237}
238
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800239bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800240 const Values *const values = GetValues();
241 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800242 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800243 return true;
244}
245
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800246bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800247 const Values *const values = GetValues();
248 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800249 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800250 return true;
251}
252
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800253bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800254 const Values *const values = GetValues();
255 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800256 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800257 return true;
258}
259
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800260bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800261 const Values *const values = GetValues();
262 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800263 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800264 return true;
265}
266
Austin Schuhdd3bc412013-03-16 17:02:40 -0700267bool angle_adjust_zeroing_off_speed(double *speed) {
268 const Values *const values = GetValues();
269 if (values == NULL) return false;
270 *speed = values->angle_adjust_zeroing_off_speed;
271 return true;
272}
273
brians343bc112013-02-10 01:53:46 +0000274bool camera_center(int *center) {
275 const Values *const values = GetValues();
276 if (values == NULL) return false;
277 *center = values->camera_center;
278 return true;
279}
brians343bc112013-02-10 01:53:46 +0000280
281} // namespace constants
282} // namespace frc971