blob: 6977e7d3bad714580277e38357feb51828618aa8 [file] [log] [blame]
joe2d92e852014-01-25 14:31:24 -08001#include "frc971/control_loops/shooters/shooters.h"
2
3#include <stdio.h>
4
5#include <algorithm>
6
7#include "aos/common/control_loop/control_loops.q.h"
8#include "aos/common/logging/logging.h"
9
10#include "frc971/constants.h"
11#include "frc971/control_loops/shooters/top_shooter_motor_plant.h"
12#include "frc971/control_loops/shooters/bottom_shooter_motor_plant.h"
13
14namespace frc971 {
15namespace control_loops {
16
17ShooterMotor::ShooterMotor(control_loops::ShooterLoop *my_shooter)
18 : aos::control_loops::ControlLoop<control_loops::ShooterLoop>(my_shooter),
19 zeroed_joint_(MakeShooterLoop()) {
20 {
21 using ::frc971::constants::GetValues;
22 ZeroedJoint<1>::ConfigurationData config_data;
23
24 config_data.lower_limit = GetValues().shooter_lower_limit;
25 config_data.upper_limit = GetValues().shooter_upper_limit;
joef84ed442014-01-29 21:42:01 -080026 config_data.hall_effect_start_position[0] =
27 GetValues().shooter_hall_effect_start_position;
joe2d92e852014-01-25 14:31:24 -080028 config_data.zeroing_off_speed = GetValues().shooter_zeroing_off_speed;
29 config_data.zeroing_speed = GetValues().shooter_zeroing_speed;
30
31 config_data.max_zeroing_voltage = 5.0;
32 config_data.deadband_voltage = 0.0;
33
34 zeroed_joint_.set_config_data(config_data);
35 }
36}
37
Ben Fredrickson1e512ff2014-02-15 21:36:52 +000038enum {
39 STATE_INITIALIZE,
40 STATE_REQUEST_LOAD,
41 STATE_LOAD_BACKTRACK,
42 STATE_LOAD,
43 STATE_LOADING_PROBLEM,
44 STATE_PREPARE_SHOT,
45 STATE_BRAKE_SET,
46 STATE_READY,
47 STATE_REQUEST_FIRE,
48 STATE_PREPARE_FIRE,
49 STATE_FIRE,
50 STATE_UNLOAD,
51 STATE_UNLOAD_MOVE,
52 STATE_READY_UNLOAD
53} State;
54
55// Positive is out, and positive power is out.
joe2d92e852014-01-25 14:31:24 -080056void ShooterMotor::RunIteration(
57 const ::aos::control_loops::Goal *goal,
58 const control_loops::ShooterLoop::Position *position,
59 ::aos::control_loops::Output *output,
60 ::aos::control_loops::Status * status) {
Ben Fredrickson1e512ff2014-02-15 21:36:52 +000061 constexpr double dt = 0.01;
62
63 if (goal == NULL || position == NULL ||
64 output == NULL || status == NULL) {
65 transform-position_ptr = NULL;
66 if (output) output->voltage = 0;
67 LOG(ERROR, "Thought I would just check for null and die.\n");
68 }
joe2d92e852014-01-25 14:31:24 -080069
70 // Disable the motors now so that all early returns will return with the
71 // motors disabled.
Ben Fredrickson1e512ff2014-02-15 21:36:52 +000072 output->voltage = 0;
joe2d92e852014-01-25 14:31:24 -080073
74 ZeroedJoint<1>::PositionData transformed_position;
75 ZeroedJoint<1>::PositionData *transformed_position_ptr =
76 &transformed_position;
Ben Fredrickson1e512ff2014-02-15 21:36:52 +000077 transformed_position.position = position->pos;
78 transformed_position.hall_effects[0] = position->hall_effect;
79 transformed_position.hall_effect_positions[0] = position->calibration;
joe2d92e852014-01-25 14:31:24 -080080
81 const double voltage = zeroed_joint_.Update(transformed_position_ptr,
82 output != NULL,
83 goal->goal, 0.0);
84
Ben Fredrickson1e512ff2014-02-15 21:36:52 +000085 const frc971::constants::Values &values = constants::GetValues();
86
87 switch (state_) {
88 case STATE_INITIALIZE:
89 shooter_.zeroing_state() = ZeroedStateFeedbackLoop::UNKNOWN_POSITION;
90 if (position->pusher_distal_hall_effect){
91 } else if (position->pusher_proximal_hall_effect) {
92 calibration_position_ = position->position -
93 } else {
94 }
95
96
97 break;
98 case STATE_REQUEST_LOAD:
99 break;
100 case STATE_LOAD_BACKTRACK:
101 break;
102 case STATE_LOAD:
103 break;
104 case STATE_LOADING_PROBLEM:
105 break;
106 case STATE_PREPARE_SHOT:
107 break;
108 case STATE_BRAKE_SET:
109 break;
110 case STATE_READY:
111 break;
112 case STATE_REQUEST_FIRE:
113 break;
114 case STATE_PREPARE_FIRE:
115 break;
116 case STATE_FIRE:
117 break;
118 case STATE_UNLOAD:
119 break;
120 case STATE_UNLOAD_MOVE:
121 break;
122 case STATE_READY_UNLOAD:
123 break;
124 }
125
joe2d92e852014-01-25 14:31:24 -0800126 if (position) {
127 LOG(DEBUG, "pos: %f hall: %s absolute: %f\n",
128 position->pos,
129 position->hall_effect ? "true" : "false",
130 zeroed_joint_.absolute_position());
131 }
132
Ben Fredrickson1e512ff2014-02-15 21:36:52 +0000133 output->voltage = voltage;
joe2d92e852014-01-25 14:31:24 -0800134 status->done = ::std::abs(zeroed_joint_.absolute_position() - goal->goal) < 0.004;
135}
136
137} // namespace control_loops
138} // namespace frc971