blob: c4671abe881489207468da57f849a830e987f8c4 [file] [log] [blame]
Theo Bafrali3274a182019-02-17 20:01:38 -08001#ifndef Y2019_CONTROL_LOOPS_SUPERSTRUCTURE_VACUUM_H_
2#define Y2019_CONTROL_LOOPS_SUPERSTRUCTURE_VACUUM_H_
3
Alex Perrycb7da4b2019-08-28 19:35:56 -07004#include "aos/events/event_loop.h"
5#include "frc971/control_loops/control_loops_generated.h"
6#include "frc971/control_loops/profiled_subsystem_generated.h"
7#include "y2019/control_loops/superstructure/superstructure_goal_generated.h"
8#include "y2019/control_loops/superstructure/superstructure_output_generated.h"
Theo Bafrali3274a182019-02-17 20:01:38 -08009
10namespace y2019 {
11namespace control_loops {
12namespace superstructure {
13
14class Vacuum {
15 public:
16 Vacuum() {}
17 void Iterate(const SuctionGoal *unsafe_goal, float suction_pressure,
Alex Perrycb7da4b2019-08-28 19:35:56 -070018 OutputT *output, bool *has_piece, aos::EventLoop *event_loop);
Theo Bafrali3274a182019-02-17 20:01:38 -080019
Theo Bafrali3274a182019-02-17 20:01:38 -080020 // Voltage to the vaccum pump when we are attempting to acquire a piece
Austin Schuhc2ee66b2019-02-19 13:37:46 -080021 static constexpr double kPumpVoltage = 8.0;
Theo Bafrali3274a182019-02-17 20:01:38 -080022
23 // Voltage to the vaccum pump when we have a piece
Austin Schuh47bb88d2019-02-19 16:49:44 -080024 static constexpr double kPumpHasPieceVoltage = 2.25;
Theo Bafrali3274a182019-02-17 20:01:38 -080025
26 // Time to continue at the higher pump voltage after getting a gamepiece
27 static constexpr aos::monotonic_clock::duration kTimeAtHigherVoltage =
Austin Schuhc2ee66b2019-02-19 13:37:46 -080028 std::chrono::milliseconds(100);
Theo Bafrali3274a182019-02-17 20:01:38 -080029
Tyler Chatow7db827f2019-02-24 00:10:13 -080030 // Time required for the game piece to be released from a vacuum
31 static constexpr aos::monotonic_clock::duration kReleaseTime =
32 std::chrono::milliseconds(250);
Theo Bafrali3274a182019-02-17 20:01:38 -080033
34 private:
35 bool had_piece_ = false;
Tyler Chatow7db827f2019-02-24 00:10:13 -080036 aos::monotonic_clock::time_point last_release_time_ =
Theo Bafrali3274a182019-02-17 20:01:38 -080037 aos::monotonic_clock::epoch();
Austin Schuh54629412019-04-14 19:53:59 -070038 // Time since the last time we had a game piece while disabled.
39 aos::monotonic_clock::time_point last_disable_has_piece_time_ =
40 aos::monotonic_clock::min_time;
Theo Bafrali3274a182019-02-17 20:01:38 -080041 aos::monotonic_clock::time_point time_at_last_acquisition_ =
42 aos::monotonic_clock::epoch();
43 double filtered_pressure_ = 1.0;
44
Austin Schuh54629412019-04-14 19:53:59 -070045 bool filtered_had_piece_near_disabled_ = false;
46
47 static constexpr double kVacuumOnThreshold = 0.70;
48 static constexpr double kVacuumOffThreshold = 0.85;
Theo Bafrali3274a182019-02-17 20:01:38 -080049
50 static constexpr double kFilterTimeConstant = 0.1;
51 static constexpr double dt = .00505;
52 static constexpr double kSuctionAlpha =
53 dt * (1 - kFilterTimeConstant) / (kFilterTimeConstant);
54
55 DISALLOW_COPY_AND_ASSIGN(Vacuum);
56};
57
58} // namespace superstructure
59} // namespace control_loops
60} // namespace y2019
61
62#endif // Y2019_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_