blob: 8f9c165d766d8cff3a7e51bdb4e4df2e7f378995 [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 Silvermanc3486fe2013-09-21 23:52:42 -070021const double kPracticeWristHallEffectStartAngle = 1.182;
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 Silverman41c95932013-08-31 11:44:07 -070043// Angle measured from CAD with the top of the angle adjust at the top of the
44// wire guide is 0.773652098 radians.
45
46const double kCompAngleAdjustHallEffectStartAngle[2] = {0.301170496, 1.5};
Brian Silverman304b2bf2013-04-04 17:54:41 -070047const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305172594, 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
Brian Silverman77f41752013-03-16 13:56:32 -070052const double kPracticeAngleAdjustUpperPhysicalLimit = 0.904737;
53const double kCompAngleAdjustUpperPhysicalLimit = 0.904737;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080054
Brian Silverman41c95932013-08-31 11:44:07 -070055const double kPracticeAngleAdjustLowerPhysicalLimit = 0.270;
Brian Silverman171ada42013-03-21 15:17:10 -070056const double kCompAngleAdjustLowerPhysicalLimit = 0.302;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080057
Brian Silverman77f41752013-03-16 13:56:32 -070058const double kPracticeAngleAdjustUpperLimit = 0.87;
59const double kCompAngleAdjustUpperLimit = 0.87;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080060
Brian Silverman41c95932013-08-31 11:44:07 -070061const double kPracticeAngleAdjustLowerLimit = 0.31;
62const double kCompAngleAdjustLowerLimit = 0.28;
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
Brian Silverman41c95932013-08-31 11:44:07 -070067const double kPracticeAngleAdjustDeadband = 0.4;
Brian Silverman9c98ff72013-09-11 14:09:56 -070068const double kCompAngleAdjustDeadband = 0.65;
Brian Silverman3cb1d802013-08-30 15:41:49 -070069
brians343bc112013-02-10 01:53:46 +000070const int kCompCameraCenter = -2;
71const int kPracticeCameraCenter = -5;
72
73struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080074 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080075 double wrist_hall_effect_start_angle;
76 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080077
78 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080079 double wrist_upper_limit;
80 double wrist_lower_limit;
81
Austin Schuhfa033692013-02-24 01:00:55 -080082 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080083 double wrist_upper_physical_limit;
84 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080085
86 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080087 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070088 // Zeroing off speed.
89 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080090
James Kuszmaul4a4622b2013-03-02 16:28:29 -080091 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080092 const double *angle_adjust_hall_effect_start_angle;
93 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080094
95 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080096 double angle_adjust_upper_limit;
97 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080098 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080099 double angle_adjust_upper_physical_limit;
100 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800101
102 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800103 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -0700104 // Zeroing off speed.
105 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800106
Brian Silverman3cb1d802013-08-30 15:41:49 -0700107 // Deadband voltage.
108 double angle_adjust_deadband;
109
brians343bc112013-02-10 01:53:46 +0000110 // what camera_center returns
111 int camera_center;
brians343bc112013-02-10 01:53:46 +0000112};
Austin Schuhfa033692013-02-24 01:00:55 -0800113
brians343bc112013-02-10 01:53:46 +0000114Values *values = NULL;
115// Attempts to retrieve a new Values instance and stores it in values if
116// necessary.
117// Returns a valid Values instance or NULL.
118const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800119 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000120 if (values == NULL) {
Brian Silverman8efe23e2013-07-07 23:31:37 -0700121 LOG(INFO, "creating a Constants for team %" PRIu16 "\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800122 ::aos::robot_state->team_id);
123 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000124 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800125 values = new Values{kCompWristHallEffectStartAngle,
126 kCompWristHallEffectStopAngle,
127 kCompWristUpperLimit,
128 kCompWristLowerLimit,
129 kCompWristUpperPhysicalLimit,
130 kCompWristLowerPhysicalLimit,
131 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700132 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800133 kCompAngleAdjustHallEffectStartAngle,
134 kCompAngleAdjustHallEffectStopAngle,
135 kCompAngleAdjustUpperLimit,
136 kCompAngleAdjustLowerLimit,
137 kCompAngleAdjustUpperPhysicalLimit,
138 kCompAngleAdjustLowerPhysicalLimit,
139 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700140 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700141 kCompAngleAdjustDeadband,
Austin Schuhfa033692013-02-24 01:00:55 -0800142 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000143 break;
144 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800145 values = new Values{kPracticeWristHallEffectStartAngle,
146 kPracticeWristHallEffectStopAngle,
147 kPracticeWristUpperLimit,
148 kPracticeWristLowerLimit,
149 kPracticeWristUpperPhysicalLimit,
150 kPracticeWristLowerPhysicalLimit,
151 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700152 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800153 kPracticeAngleAdjustHallEffectStartAngle,
154 kPracticeAngleAdjustHallEffectStopAngle,
155 kPracticeAngleAdjustUpperLimit,
156 kPracticeAngleAdjustLowerLimit,
157 kPracticeAngleAdjustUpperPhysicalLimit,
158 kPracticeAngleAdjustLowerPhysicalLimit,
159 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700160 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700161 kPracticeAngleAdjustDeadband,
Austin Schuhfa033692013-02-24 01:00:55 -0800162 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000163 break;
164 default:
Brian Silverman8efe23e2013-07-07 23:31:37 -0700165 LOG(ERROR, "unknown team #%" PRIu16 "\n",
brians343bc112013-02-10 01:53:46 +0000166 aos::robot_state->team_id);
167 return NULL;
168 }
169 }
170 return values;
171}
172
173} // namespace
174
James Kuszmaule06e2512013-03-02 15:04:53 -0800175bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000176 const Values *const values = GetValues();
177 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800178 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000179 return true;
180}
James Kuszmaule06e2512013-03-02 15:04:53 -0800181bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800182 const Values *const values = GetValues();
183 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800184 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800185 return true;
186}
James Kuszmaule06e2512013-03-02 15:04:53 -0800187bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800188 const Values *const values = GetValues();
189 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800190 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800191 return true;
192}
193
James Kuszmaule06e2512013-03-02 15:04:53 -0800194bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800195 const Values *const values = GetValues();
196 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800197 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800198 return true;
199}
200
James Kuszmaule06e2512013-03-02 15:04:53 -0800201bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800202 const Values *const values = GetValues();
203 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800204 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800205 return true;
206}
207
James Kuszmaule06e2512013-03-02 15:04:53 -0800208bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800209 const Values *const values = GetValues();
210 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800211 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800212 return true;
213}
214
James Kuszmaule06e2512013-03-02 15:04:53 -0800215bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800216 const Values *const values = GetValues();
217 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800218 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800219 return true;
220}
221
Austin Schuhdd3bc412013-03-16 17:02:40 -0700222bool wrist_zeroing_off_speed(double *speed) {
223 const Values *const values = GetValues();
224 if (values == NULL) return false;
225 *speed = values->wrist_zeroing_off_speed;
226 return true;
227}
228
Austin Schuhe20e93c2013-03-09 19:54:16 -0800229bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800230 const Values *const values = GetValues();
231 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800232 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
233 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800234 return true;
235}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800236bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800237 const Values *const values = GetValues();
238 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800239 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
240 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800241 return true;
242}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800243bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800244 const Values *const values = GetValues();
245 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800246 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800247 return true;
248}
249
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800250bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800251 const Values *const values = GetValues();
252 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800253 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800254 return true;
255}
256
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800257bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800258 const Values *const values = GetValues();
259 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800260 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800261 return true;
262}
263
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800264bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800265 const Values *const values = GetValues();
266 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800267 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800268 return true;
269}
270
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800271bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800272 const Values *const values = GetValues();
273 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800274 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800275 return true;
276}
277
Austin Schuhdd3bc412013-03-16 17:02:40 -0700278bool angle_adjust_zeroing_off_speed(double *speed) {
279 const Values *const values = GetValues();
280 if (values == NULL) return false;
281 *speed = values->angle_adjust_zeroing_off_speed;
282 return true;
283}
284
Brian Silverman3cb1d802013-08-30 15:41:49 -0700285bool angle_adjust_deadband(double *voltage) {
286 const Values *const values = GetValues();
287 if (values == NULL) return false;
288 *voltage = values->angle_adjust_deadband;
289 return true;
290}
291
brians343bc112013-02-10 01:53:46 +0000292bool camera_center(int *center) {
293 const Values *const values = GetValues();
294 if (values == NULL) return false;
295 *center = values->camera_center;
296 return true;
297}
brians343bc112013-02-10 01:53:46 +0000298
299} // namespace constants
300} // namespace frc971