blob: 36d8b31bcf646ed931be846a91151cb056652b73 [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
James Kuszmaule06e2512013-03-02 15:04:53 -080022const double kCompWristHallEffectStartAngle = 72 * M_PI / 180.0;
23const double kPracticeWristHallEffectStartAngle = 72 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080024
James Kuszmaule06e2512013-03-02 15:04:53 -080025const double kCompWristHallEffectStopAngle = 100 * M_PI / 180.0;
26const double kPracticeWristHallEffectStopAngle = 100 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080027
James Kuszmaule06e2512013-03-02 15:04:53 -080028const double kPracticeWristUpperPhysicalLimit = 95 * M_PI / 180.0;
29const double kCompWristUpperPhysicalLimit = 95 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080030
James Kuszmaule06e2512013-03-02 15:04:53 -080031const double kPracticeWristLowerPhysicalLimit = -37.5 * M_PI / 180.0;
32const double kCompWristLowerPhysicalLimit = -37.5 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080033
James Kuszmaule06e2512013-03-02 15:04:53 -080034const double kPracticeWristUpperLimit = 93 * M_PI / 180.0;
35const double kCompWristUpperLimit = 93 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080036
James Kuszmaule06e2512013-03-02 15:04:53 -080037const double kPracticeWristLowerLimit = -36 * M_PI / 180.0;
38const double kCompWristLowerLimit = -36 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080039
Austin Schuhdd3bc412013-03-16 17:02:40 -070040const double kWristZeroingSpeed = 0.25;
41const double kWristZeroingOffSpeed = 1.0;
Austin Schuhfa033692013-02-24 01:00:55 -080042
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080043const int kAngleAdjustHallEffect = 2;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080044
Austin Schuhb5191b92013-03-10 18:22:24 -070045const double kCompAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
46const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080047
Austin Schuhb5191b92013-03-10 18:22:24 -070048const double kCompAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
49const double kPracticeAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080050
Austin Schuhb5191b92013-03-10 18:22:24 -070051const double kPracticeAngleAdjustUpperPhysicalLimit = 0.894481;
52const double kCompAngleAdjustUpperPhysicalLimit = 0.894481;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080053
Austin Schuhb5191b92013-03-10 18:22:24 -070054const double kPracticeAngleAdjustLowerPhysicalLimit = 0.283616;
55const double kCompAngleAdjustLowerPhysicalLimit = 0.283616;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080056
Austin Schuhb5191b92013-03-10 18:22:24 -070057const double kPracticeAngleAdjustUpperLimit = 0.85;
58const double kCompAngleAdjustUpperLimit = 0.85;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080059
Austin Schuhb5191b92013-03-10 18:22:24 -070060const double kPracticeAngleAdjustLowerLimit = 0.32;
61const double kCompAngleAdjustLowerLimit = 0.32;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080062
Austin Schuh9644e1c2013-03-12 00:40:36 -070063const double kAngleAdjustZeroingSpeed = -0.2;
Austin Schuhdd3bc412013-03-16 17:02:40 -070064const double kAngleAdjustZeroingOffSpeed = -0.5;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080065
brians343bc112013-02-10 01:53:46 +000066const int kCompCameraCenter = -2;
67const int kPracticeCameraCenter = -5;
68
69struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080070 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080071 double wrist_hall_effect_start_angle;
72 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080073
74 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080075 double wrist_upper_limit;
76 double wrist_lower_limit;
77
Austin Schuhfa033692013-02-24 01:00:55 -080078 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080079 double wrist_upper_physical_limit;
80 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080081
82 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080083 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070084 // Zeroing off speed.
85 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080086
James Kuszmaul4a4622b2013-03-02 16:28:29 -080087 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080088 const double *angle_adjust_hall_effect_start_angle;
89 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080090
91 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080092 double angle_adjust_upper_limit;
93 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080094 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080095 double angle_adjust_upper_physical_limit;
96 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080097
98 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080099 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -0700100 // Zeroing off speed.
101 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800102
brians343bc112013-02-10 01:53:46 +0000103 // what camera_center returns
104 int camera_center;
brians343bc112013-02-10 01:53:46 +0000105};
Austin Schuhfa033692013-02-24 01:00:55 -0800106
brians343bc112013-02-10 01:53:46 +0000107Values *values = NULL;
108// Attempts to retrieve a new Values instance and stores it in values if
109// necessary.
110// Returns a valid Values instance or NULL.
111const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800112 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000113 if (values == NULL) {
114 LOG(INFO, "creating a Constants for team %"PRIu16"\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800115 ::aos::robot_state->team_id);
116 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000117 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800118 values = new Values{kCompWristHallEffectStartAngle,
119 kCompWristHallEffectStopAngle,
120 kCompWristUpperLimit,
121 kCompWristLowerLimit,
122 kCompWristUpperPhysicalLimit,
123 kCompWristLowerPhysicalLimit,
124 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700125 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800126 kCompAngleAdjustHallEffectStartAngle,
127 kCompAngleAdjustHallEffectStopAngle,
128 kCompAngleAdjustUpperLimit,
129 kCompAngleAdjustLowerLimit,
130 kCompAngleAdjustUpperPhysicalLimit,
131 kCompAngleAdjustLowerPhysicalLimit,
132 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700133 kAngleAdjustZeroingOffSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800134 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000135 break;
136 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800137 values = new Values{kPracticeWristHallEffectStartAngle,
138 kPracticeWristHallEffectStopAngle,
139 kPracticeWristUpperLimit,
140 kPracticeWristLowerLimit,
141 kPracticeWristUpperPhysicalLimit,
142 kPracticeWristLowerPhysicalLimit,
143 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700144 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800145 kPracticeAngleAdjustHallEffectStartAngle,
146 kPracticeAngleAdjustHallEffectStopAngle,
147 kPracticeAngleAdjustUpperLimit,
148 kPracticeAngleAdjustLowerLimit,
149 kPracticeAngleAdjustUpperPhysicalLimit,
150 kPracticeAngleAdjustLowerPhysicalLimit,
151 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700152 kAngleAdjustZeroingOffSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800153 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000154 break;
155 default:
156 LOG(ERROR, "unknown team #%"PRIu16"\n",
157 aos::robot_state->team_id);
158 return NULL;
159 }
160 }
161 return values;
162}
163
164} // namespace
165
James Kuszmaule06e2512013-03-02 15:04:53 -0800166bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000167 const Values *const values = GetValues();
168 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800169 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000170 return true;
171}
James Kuszmaule06e2512013-03-02 15:04:53 -0800172bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800173 const Values *const values = GetValues();
174 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800175 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800176 return true;
177}
James Kuszmaule06e2512013-03-02 15:04:53 -0800178bool wrist_upper_limit(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_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800182 return true;
183}
184
James Kuszmaule06e2512013-03-02 15:04:53 -0800185bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800186 const Values *const values = GetValues();
187 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800188 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800189 return true;
190}
191
James Kuszmaule06e2512013-03-02 15:04:53 -0800192bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800193 const Values *const values = GetValues();
194 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800195 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800196 return true;
197}
198
James Kuszmaule06e2512013-03-02 15:04:53 -0800199bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800200 const Values *const values = GetValues();
201 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800202 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800203 return true;
204}
205
James Kuszmaule06e2512013-03-02 15:04:53 -0800206bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800207 const Values *const values = GetValues();
208 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800209 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800210 return true;
211}
212
Austin Schuhdd3bc412013-03-16 17:02:40 -0700213bool wrist_zeroing_off_speed(double *speed) {
214 const Values *const values = GetValues();
215 if (values == NULL) return false;
216 *speed = values->wrist_zeroing_off_speed;
217 return true;
218}
219
Austin Schuhe20e93c2013-03-09 19:54:16 -0800220bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800221 const Values *const values = GetValues();
222 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800223 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
224 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800225 return true;
226}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800227bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800228 const Values *const values = GetValues();
229 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800230 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
231 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800232 return true;
233}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800234bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800235 const Values *const values = GetValues();
236 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800237 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800238 return true;
239}
240
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800241bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800242 const Values *const values = GetValues();
243 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800244 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800245 return true;
246}
247
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800248bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800249 const Values *const values = GetValues();
250 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800251 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800252 return true;
253}
254
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800255bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800256 const Values *const values = GetValues();
257 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800258 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800259 return true;
260}
261
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800262bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800263 const Values *const values = GetValues();
264 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800265 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800266 return true;
267}
268
Austin Schuhdd3bc412013-03-16 17:02:40 -0700269bool angle_adjust_zeroing_off_speed(double *speed) {
270 const Values *const values = GetValues();
271 if (values == NULL) return false;
272 *speed = values->angle_adjust_zeroing_off_speed;
273 return true;
274}
275
brians343bc112013-02-10 01:53:46 +0000276bool camera_center(int *center) {
277 const Values *const values = GetValues();
278 if (values == NULL) return false;
279 *center = values->camera_center;
280 return true;
281}
brians343bc112013-02-10 01:53:46 +0000282
283} // namespace constants
284} // namespace frc971