blob: 1b53c062fea413b6dedc70a23fb2e98a0f8e4791 [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>
James Kuszmaul4a4622b2013-03-02 16:28:29 -08005#include <array>
brians343bc112013-02-10 01:53:46 +00006
Brian Silverman20fdbef2013-03-09 13:42:03 -08007#include "aos/common/inttypes.h"
brians343bc112013-02-10 01:53:46 +00008#include "aos/common/messages/RobotState.q.h"
9#include "aos/atom_code/output/MotorOutput.h"
10
Brian Silverman20fdbef2013-03-09 13:42:03 -080011#ifndef M_PI
12#define M_PI 3.14159265358979323846
13#endif
14
James Kuszmaul4a4622b2013-03-02 16:28:29 -080015// Note: So far, none of the Angle Adjust numbers have been measured.
16// Do not rely on them for real life.
17
brians343bc112013-02-10 01:53:46 +000018namespace frc971 {
19namespace constants {
20
21namespace {
22
James Kuszmaule06e2512013-03-02 15:04:53 -080023const double kCompWristHallEffectStartAngle = 72 * M_PI / 180.0;
24const double kPracticeWristHallEffectStartAngle = 72 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080025
James Kuszmaule06e2512013-03-02 15:04:53 -080026const double kCompWristHallEffectStopAngle = 100 * M_PI / 180.0;
27const double kPracticeWristHallEffectStopAngle = 100 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080028
James Kuszmaule06e2512013-03-02 15:04:53 -080029const double kPracticeWristUpperPhysicalLimit = 95 * M_PI / 180.0;
30const double kCompWristUpperPhysicalLimit = 95 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080031
James Kuszmaule06e2512013-03-02 15:04:53 -080032const double kPracticeWristLowerPhysicalLimit = -37.5 * M_PI / 180.0;
33const double kCompWristLowerPhysicalLimit = -37.5 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080034
James Kuszmaule06e2512013-03-02 15:04:53 -080035const double kPracticeWristUpperLimit = 93 * M_PI / 180.0;
36const double kCompWristUpperLimit = 93 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080037
James Kuszmaule06e2512013-03-02 15:04:53 -080038const double kPracticeWristLowerLimit = -36 * M_PI / 180.0;
39const double kCompWristLowerLimit = -36 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080040
James Kuszmaule06e2512013-03-02 15:04:53 -080041const double kWristZeroingSpeed = 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
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080045const ::std::array<double, kAngleAdjustHallEffect>
46 kCompAngleAdjustHallEffectStartAngle = {{-0.1, 1.0}};
47const ::std::array<double, kAngleAdjustHallEffect>
48 kPracticeAngleAdjustHallEffectStartAngle = {{-0.1, 1.0}};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080049
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080050const ::std::array<double, kAngleAdjustHallEffect>
51 kCompAngleAdjustHallEffectStopAngle = {{0.5, 1.5}};
52const ::std::array<double, kAngleAdjustHallEffect>
53 kPracticeAngleAdjustHallEffectStopAngle = {{0.5, 1.5}};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080054
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080055const double kPracticeAngleAdjustUpperPhysicalLimit = 3.0;
56const double kCompAngleAdjustUpperPhysicalLimit = 3.0;
57
58const double kPracticeAngleAdjustLowerPhysicalLimit = 0.0;
59const double kCompAngleAdjustLowerPhysicalLimit = 0.0;
60
61const double kPracticeAngleAdjustUpperLimit = 3.0;
62const double kCompAngleAdjustUpperLimit = 3.0;
63
64const double kPracticeAngleAdjustLowerLimit = 0.0;
65const double kCompAngleAdjustLowerLimit = 0.0;
66
67const double kAngleAdjustZeroingSpeed = 1.0;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080068
brians343bc112013-02-10 01:53:46 +000069const int kCompCameraCenter = -2;
70const int kPracticeCameraCenter = -5;
71
72struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080073 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080074 double wrist_hall_effect_start_angle;
75 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080076
77 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080078 double wrist_upper_limit;
79 double wrist_lower_limit;
80
Austin Schuhfa033692013-02-24 01:00:55 -080081 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080082 double wrist_upper_physical_limit;
83 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080084
85 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080086 double wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080087
James Kuszmaul4a4622b2013-03-02 16:28:29 -080088 // AngleAdjust hall effect positive and negative edges.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080089 ::std::array<double, 2> angle_adjust_hall_effect_start_angle;
90 ::std::array<double, 2> 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;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800101
brians343bc112013-02-10 01:53:46 +0000102 // what camera_center returns
103 int camera_center;
brians343bc112013-02-10 01:53:46 +0000104};
Austin Schuhfa033692013-02-24 01:00:55 -0800105
brians343bc112013-02-10 01:53:46 +0000106Values *values = NULL;
107// Attempts to retrieve a new Values instance and stores it in values if
108// necessary.
109// Returns a valid Values instance or NULL.
110const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800111 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000112 if (values == NULL) {
113 LOG(INFO, "creating a Constants for team %"PRIu16"\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800114 ::aos::robot_state->team_id);
115 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000116 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800117 values = new Values{kCompWristHallEffectStartAngle,
118 kCompWristHallEffectStopAngle,
119 kCompWristUpperLimit,
120 kCompWristLowerLimit,
121 kCompWristUpperPhysicalLimit,
122 kCompWristLowerPhysicalLimit,
123 kWristZeroingSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800124 kCompAngleAdjustHallEffectStartAngle,
125 kCompAngleAdjustHallEffectStopAngle,
126 kCompAngleAdjustUpperLimit,
127 kCompAngleAdjustLowerLimit,
128 kCompAngleAdjustUpperPhysicalLimit,
129 kCompAngleAdjustLowerPhysicalLimit,
130 kAngleAdjustZeroingSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800131 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000132 break;
133 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800134 values = new Values{kPracticeWristHallEffectStartAngle,
135 kPracticeWristHallEffectStopAngle,
136 kPracticeWristUpperLimit,
137 kPracticeWristLowerLimit,
138 kPracticeWristUpperPhysicalLimit,
139 kPracticeWristLowerPhysicalLimit,
140 kWristZeroingSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800141 kPracticeAngleAdjustHallEffectStartAngle,
142 kPracticeAngleAdjustHallEffectStopAngle,
143 kPracticeAngleAdjustUpperLimit,
144 kPracticeAngleAdjustLowerLimit,
145 kPracticeAngleAdjustUpperPhysicalLimit,
146 kPracticeAngleAdjustLowerPhysicalLimit,
147 kAngleAdjustZeroingSpeed,
Austin Schuhfa033692013-02-24 01:00:55 -0800148 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000149 break;
150 default:
151 LOG(ERROR, "unknown team #%"PRIu16"\n",
152 aos::robot_state->team_id);
153 return NULL;
154 }
155 }
156 return values;
157}
158
159} // namespace
160
James Kuszmaule06e2512013-03-02 15:04:53 -0800161bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000162 const Values *const values = GetValues();
163 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800164 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000165 return true;
166}
James Kuszmaule06e2512013-03-02 15:04:53 -0800167bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800168 const Values *const values = GetValues();
169 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800170 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800171 return true;
172}
James Kuszmaule06e2512013-03-02 15:04:53 -0800173bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800174 const Values *const values = GetValues();
175 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800176 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800177 return true;
178}
179
James Kuszmaule06e2512013-03-02 15:04:53 -0800180bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800181 const Values *const values = GetValues();
182 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800183 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800184 return true;
185}
186
James Kuszmaule06e2512013-03-02 15:04:53 -0800187bool wrist_upper_physical_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_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800191 return true;
192}
193
James Kuszmaule06e2512013-03-02 15:04:53 -0800194bool wrist_lower_physical_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_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800198 return true;
199}
200
James Kuszmaule06e2512013-03-02 15:04:53 -0800201bool wrist_zeroing_speed(double *speed) {
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 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800205 return true;
206}
207
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800208bool angle_adjust_hall_effect_start_angle(
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800209 ::std::array<double, 2> *angle) {
210 const Values *const values = GetValues();
211 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800212 *angle = values->angle_adjust_hall_effect_start_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800213 return true;
214}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800215bool angle_adjust_hall_effect_stop_angle(
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800216 ::std::array<double, 2> *angle) {
217 const Values *const values = GetValues();
218 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800219 *angle = values->angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800220 return true;
221}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800222bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800223 const Values *const values = GetValues();
224 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800225 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800226 return true;
227}
228
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800229bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800230 const Values *const values = GetValues();
231 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800232 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800233 return true;
234}
235
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800236bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800237 const Values *const values = GetValues();
238 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800239 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800240 return true;
241}
242
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800243bool angle_adjust_lower_physical_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_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800247 return true;
248}
249
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800250bool angle_adjust_zeroing_speed(double *speed) {
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 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800254 return true;
255}
256
brians343bc112013-02-10 01:53:46 +0000257bool camera_center(int *center) {
258 const Values *const values = GetValues();
259 if (values == NULL) return false;
260 *center = values->camera_center;
261 return true;
262}
brians343bc112013-02-10 01:53:46 +0000263
264} // namespace constants
265} // namespace frc971