blob: bb12ac2a7206e7e8c7caa9b4d7be4ca458f5c5d1 [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.
Brian Silverman87e708d2013-04-08 14:30:22 -070020const double kCompWristHallEffectStartAngle = 1.285;
Brian Silverman304b2bf2013-04-04 17:54:41 -070021const double kPracticeWristHallEffectStartAngle = 1.230;
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
Brian Silverman5cd007f2013-04-05 13:51:37 -070038const double kWristZeroingSpeed = 0.125;
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
Brian Silverman304b2bf2013-04-04 17:54:41 -070043const double kCompAngleAdjustHallEffectStartAngle[2] = {0.286375033, 1.5};
44const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305172594, 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;
Brian Silverman171ada42013-03-21 15:17:10 -070053const double kCompAngleAdjustLowerPhysicalLimit = 0.302;
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;
Brian Silverman171ada42013-03-21 15:17:10 -070059const double kCompAngleAdjustLowerLimit = 0.27;
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
Brian Silverman3cb1d802013-08-30 15:41:49 -070064const double kPracticeAngleAdjustDeadband = 0.825;
65const double kCompAngleAdjustDeadband = 0.825;
66
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
Brian Silverman3cb1d802013-08-30 15:41:49 -0700104 // Deadband voltage.
105 double angle_adjust_deadband;
106
brians343bc112013-02-10 01:53:46 +0000107 // what camera_center returns
108 int camera_center;
brians343bc112013-02-10 01:53:46 +0000109};
Austin Schuhfa033692013-02-24 01:00:55 -0800110
brians343bc112013-02-10 01:53:46 +0000111Values *values = NULL;
112// Attempts to retrieve a new Values instance and stores it in values if
113// necessary.
114// Returns a valid Values instance or NULL.
115const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800116 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000117 if (values == NULL) {
Brian Silverman8efe23e2013-07-07 23:31:37 -0700118 LOG(INFO, "creating a Constants for team %" PRIu16 "\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800119 ::aos::robot_state->team_id);
120 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000121 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800122 values = new Values{kCompWristHallEffectStartAngle,
123 kCompWristHallEffectStopAngle,
124 kCompWristUpperLimit,
125 kCompWristLowerLimit,
126 kCompWristUpperPhysicalLimit,
127 kCompWristLowerPhysicalLimit,
128 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700129 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800130 kCompAngleAdjustHallEffectStartAngle,
131 kCompAngleAdjustHallEffectStopAngle,
132 kCompAngleAdjustUpperLimit,
133 kCompAngleAdjustLowerLimit,
134 kCompAngleAdjustUpperPhysicalLimit,
135 kCompAngleAdjustLowerPhysicalLimit,
136 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700137 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700138 kCompAngleAdjustDeadband,
Austin Schuhfa033692013-02-24 01:00:55 -0800139 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000140 break;
141 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800142 values = new Values{kPracticeWristHallEffectStartAngle,
143 kPracticeWristHallEffectStopAngle,
144 kPracticeWristUpperLimit,
145 kPracticeWristLowerLimit,
146 kPracticeWristUpperPhysicalLimit,
147 kPracticeWristLowerPhysicalLimit,
148 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700149 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800150 kPracticeAngleAdjustHallEffectStartAngle,
151 kPracticeAngleAdjustHallEffectStopAngle,
152 kPracticeAngleAdjustUpperLimit,
153 kPracticeAngleAdjustLowerLimit,
154 kPracticeAngleAdjustUpperPhysicalLimit,
155 kPracticeAngleAdjustLowerPhysicalLimit,
156 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700157 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700158 kPracticeAngleAdjustDeadband,
Austin Schuhfa033692013-02-24 01:00:55 -0800159 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000160 break;
161 default:
Brian Silverman8efe23e2013-07-07 23:31:37 -0700162 LOG(ERROR, "unknown team #%" PRIu16 "\n",
brians343bc112013-02-10 01:53:46 +0000163 aos::robot_state->team_id);
164 return NULL;
165 }
166 }
167 return values;
168}
169
170} // namespace
171
James Kuszmaule06e2512013-03-02 15:04:53 -0800172bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000173 const Values *const values = GetValues();
174 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800175 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000176 return true;
177}
James Kuszmaule06e2512013-03-02 15:04:53 -0800178bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800179 const Values *const values = GetValues();
180 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800181 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800182 return true;
183}
James Kuszmaule06e2512013-03-02 15:04:53 -0800184bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800185 const Values *const values = GetValues();
186 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800187 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800188 return true;
189}
190
James Kuszmaule06e2512013-03-02 15:04:53 -0800191bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800192 const Values *const values = GetValues();
193 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800194 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800195 return true;
196}
197
James Kuszmaule06e2512013-03-02 15:04:53 -0800198bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800199 const Values *const values = GetValues();
200 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800201 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800202 return true;
203}
204
James Kuszmaule06e2512013-03-02 15:04:53 -0800205bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800206 const Values *const values = GetValues();
207 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800208 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800209 return true;
210}
211
James Kuszmaule06e2512013-03-02 15:04:53 -0800212bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800213 const Values *const values = GetValues();
214 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800215 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800216 return true;
217}
218
Austin Schuhdd3bc412013-03-16 17:02:40 -0700219bool wrist_zeroing_off_speed(double *speed) {
220 const Values *const values = GetValues();
221 if (values == NULL) return false;
222 *speed = values->wrist_zeroing_off_speed;
223 return true;
224}
225
Austin Schuhe20e93c2013-03-09 19:54:16 -0800226bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800227 const Values *const values = GetValues();
228 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800229 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
230 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800231 return true;
232}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800233bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800234 const Values *const values = GetValues();
235 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800236 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
237 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800238 return true;
239}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800240bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800241 const Values *const values = GetValues();
242 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800243 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800244 return true;
245}
246
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800247bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800248 const Values *const values = GetValues();
249 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800250 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800251 return true;
252}
253
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800254bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800255 const Values *const values = GetValues();
256 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800257 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800258 return true;
259}
260
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800261bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800262 const Values *const values = GetValues();
263 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800264 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800265 return true;
266}
267
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800268bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800269 const Values *const values = GetValues();
270 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800271 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800272 return true;
273}
274
Austin Schuhdd3bc412013-03-16 17:02:40 -0700275bool angle_adjust_zeroing_off_speed(double *speed) {
276 const Values *const values = GetValues();
277 if (values == NULL) return false;
278 *speed = values->angle_adjust_zeroing_off_speed;
279 return true;
280}
281
Brian Silverman3cb1d802013-08-30 15:41:49 -0700282bool angle_adjust_deadband(double *voltage) {
283 const Values *const values = GetValues();
284 if (values == NULL) return false;
285 *voltage = values->angle_adjust_deadband;
286 return true;
287}
288
brians343bc112013-02-10 01:53:46 +0000289bool camera_center(int *center) {
290 const Values *const values = GetValues();
291 if (values == NULL) return false;
292 *center = values->camera_center;
293 return true;
294}
brians343bc112013-02-10 01:53:46 +0000295
296} // namespace constants
297} // namespace frc971