blob: 79907c3e82f1b45ed6c5499cf44ecacb5d23655c [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
James Kuszmaule06e2512013-03-02 15:04:53 -080040const double kWristZeroingSpeed = 1.0;
Austin Schuhfa033692013-02-24 01:00:55 -080041
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080042const int kAngleAdjustHallEffect = 2;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080043
Austin Schuhb5191b92013-03-10 18:22:24 -070044const double kCompAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
45const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305432, 1.5};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080046
Austin Schuhb5191b92013-03-10 18:22:24 -070047const double kCompAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
48const double kPracticeAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080049
Austin Schuhb5191b92013-03-10 18:22:24 -070050const double kPracticeAngleAdjustUpperPhysicalLimit = 0.894481;
51const double kCompAngleAdjustUpperPhysicalLimit = 0.894481;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080052
Austin Schuhb5191b92013-03-10 18:22:24 -070053const double kPracticeAngleAdjustLowerPhysicalLimit = 0.283616;
54const double kCompAngleAdjustLowerPhysicalLimit = 0.283616;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080055
Austin Schuhb5191b92013-03-10 18:22:24 -070056const double kPracticeAngleAdjustUpperLimit = 0.85;
57const double kCompAngleAdjustUpperLimit = 0.85;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080058
Austin Schuhb5191b92013-03-10 18:22:24 -070059const double kPracticeAngleAdjustLowerLimit = 0.32;
60const double kCompAngleAdjustLowerLimit = 0.32;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080061
Austin Schuhb5191b92013-03-10 18:22:24 -070062const double kAngleAdjustZeroingSpeed = -0.04;
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 Schuhfa033692013-02-24 01:00:55 -080082
James Kuszmaul4a4622b2013-03-02 16:28:29 -080083 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080084 const double *angle_adjust_hall_effect_start_angle;
85 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080086
87 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080088 double angle_adjust_upper_limit;
89 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080090 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080091 double angle_adjust_upper_physical_limit;
92 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080093
94 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080095 double angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080096
brians343bc112013-02-10 01:53:46 +000097 // what camera_center returns
98 int camera_center;
brians343bc112013-02-10 01:53:46 +000099};
Austin Schuhfa033692013-02-24 01:00:55 -0800100
brians343bc112013-02-10 01:53:46 +0000101Values *values = NULL;
102// Attempts to retrieve a new Values instance and stores it in values if
103// necessary.
104// Returns a valid Values instance or NULL.
105const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800106 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000107 if (values == NULL) {
108 LOG(INFO, "creating a Constants for team %"PRIu16"\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800109 ::aos::robot_state->team_id);
110 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000111 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800112 values = new Values{kCompWristHallEffectStartAngle,
113 kCompWristHallEffectStopAngle,
114 kCompWristUpperLimit,
115 kCompWristLowerLimit,
116 kCompWristUpperPhysicalLimit,
117 kCompWristLowerPhysicalLimit,
118 kWristZeroingSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800119 kCompAngleAdjustHallEffectStartAngle,
120 kCompAngleAdjustHallEffectStopAngle,
121 kCompAngleAdjustUpperLimit,
122 kCompAngleAdjustLowerLimit,
123 kCompAngleAdjustUpperPhysicalLimit,
124 kCompAngleAdjustLowerPhysicalLimit,
125 kAngleAdjustZeroingSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800126 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000127 break;
128 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800129 values = new Values{kPracticeWristHallEffectStartAngle,
130 kPracticeWristHallEffectStopAngle,
131 kPracticeWristUpperLimit,
132 kPracticeWristLowerLimit,
133 kPracticeWristUpperPhysicalLimit,
134 kPracticeWristLowerPhysicalLimit,
135 kWristZeroingSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800136 kPracticeAngleAdjustHallEffectStartAngle,
137 kPracticeAngleAdjustHallEffectStopAngle,
138 kPracticeAngleAdjustUpperLimit,
139 kPracticeAngleAdjustLowerLimit,
140 kPracticeAngleAdjustUpperPhysicalLimit,
141 kPracticeAngleAdjustLowerPhysicalLimit,
142 kAngleAdjustZeroingSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800143 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000144 break;
145 default:
146 LOG(ERROR, "unknown team #%"PRIu16"\n",
147 aos::robot_state->team_id);
148 return NULL;
149 }
150 }
151 return values;
152}
153
154} // namespace
155
James Kuszmaule06e2512013-03-02 15:04:53 -0800156bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000157 const Values *const values = GetValues();
158 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800159 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000160 return true;
161}
James Kuszmaule06e2512013-03-02 15:04:53 -0800162bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800163 const Values *const values = GetValues();
164 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800165 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800166 return true;
167}
James Kuszmaule06e2512013-03-02 15:04:53 -0800168bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800169 const Values *const values = GetValues();
170 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800171 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800172 return true;
173}
174
James Kuszmaule06e2512013-03-02 15:04:53 -0800175bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800176 const Values *const values = GetValues();
177 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800178 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800179 return true;
180}
181
James Kuszmaule06e2512013-03-02 15:04:53 -0800182bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800183 const Values *const values = GetValues();
184 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800185 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800186 return true;
187}
188
James Kuszmaule06e2512013-03-02 15:04:53 -0800189bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800190 const Values *const values = GetValues();
191 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800192 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800193 return true;
194}
195
James Kuszmaule06e2512013-03-02 15:04:53 -0800196bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800197 const Values *const values = GetValues();
198 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800199 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800200 return true;
201}
202
Austin Schuhe20e93c2013-03-09 19:54:16 -0800203bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800204 const Values *const values = GetValues();
205 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800206 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
207 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800208 return true;
209}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800210bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800211 const Values *const values = GetValues();
212 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800213 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
214 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800215 return true;
216}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800217bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800218 const Values *const values = GetValues();
219 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800220 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800221 return true;
222}
223
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800224bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800225 const Values *const values = GetValues();
226 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800227 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800228 return true;
229}
230
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800231bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800232 const Values *const values = GetValues();
233 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800234 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800235 return true;
236}
237
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800238bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800239 const Values *const values = GetValues();
240 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800241 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800242 return true;
243}
244
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800245bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800246 const Values *const values = GetValues();
247 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800248 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800249 return true;
250}
251
brians343bc112013-02-10 01:53:46 +0000252bool camera_center(int *center) {
253 const Values *const values = GetValues();
254 if (values == NULL) return false;
255 *center = values->camera_center;
256 return true;
257}
brians343bc112013-02-10 01:53:46 +0000258
259} // namespace constants
260} // namespace frc971