1516X Push Back 1.0
1516X's robot code for the 2025-2026 VEX Robotics Competition
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include "main.h"
2#include "crossBarrierDetection.h"
3#include "globals.h"
4#include "lemlib/chassis/chassis.hpp"
5#include "liblvgl/core/lv_obj_pos.h"
6#include "pros/distance.hpp"
7#include "pros/misc.h"
8#include "auton/autonRoutines.h"
9#include "pros/misc.hpp"
10#include "pros/motors.h"
11#include "robodash/views/selector.hpp"
12#include "colorSort.h"
13#include "warnings.h"
14#include <string>
15#include "MCL.h"
16#include "auton/autonFunctions.h"
17#include "distanceReset.h"
18#include <atomic> // For std::atomic
19#include <memory> // For std::unique_ptr and std::make_unique
20
21
22static void update_alliance_btn(lv_obj_t* btn, Color newColor) {
23 lv_obj_t* label = lv_obj_get_child(btn, 0);
24
25 if (newColor == Color::RED) {
26 lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_RED), 0);
27 lv_label_set_text(label, "RED");
28 } else {
29 lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_BLUE), 0);
30 lv_label_set_text(label, "BLUE");
31 }
32
33 std::cout << "Alliance switched to: "
34 << (newColor == Color::RED ? "Red" : "Blue")
35 << std::endl;
36}
37
38static void alliance_btn_event_handler(lv_event_t* e) {
39 lv_obj_t* btn = lv_event_get_target(e);
40
41 if (allianceColor == RED) {
42 allianceColor = Color::BLUE;
43 } else {
44 allianceColor = Color::RED;
45 }
46
47 lv_async_call([](void* user_data){
48 lv_obj_t* btn = (lv_obj_t*)user_data;
50 }, btn);
51}
52
54 lv_obj_t* btn = lv_btn_create(lv_layer_top());
55 lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, -10, -10);
56 lv_obj_set_size(btn, 80, 40);
57
58 lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_RED), 0);
59
60 lv_obj_t* label = lv_label_create(btn);
61 lv_label_set_text(label, "RED");
62 lv_obj_center(label);
63
64 lv_obj_add_event_cb(btn, alliance_btn_event_handler, LV_EVENT_CLICKED, nullptr);
65}
66
67
68rd::Selector selector({
69 {"Right", right_auton},
70 {"Left", left_auton},
71 {"Carry", carry_auton},
72 {"Elim", elim_auton},
73 {"AWP", awp_auton},
74 {"Skills", skills_auton}
75});
76
77rd::Console console;
78
79void initialize() {
80 chassis.calibrate();
85 double start_x = -51.25;
86 double start_y = -18.5;
87 double start_theta = 180.0;
88 chassis.setPose(start_x, start_y, start_theta);
89
90 //MCL::StartMCL(start_x, start_y, start_theta);
91
92 //pros::Task mcl_task(MCL::MonteCarlo);
93 chassis.setPose(0,0,0);
94 selector.focus();
95 color_sensor.set_led_pwm(100);
96 chassis.setPose(-50, 0, 270);
97 pros::Task screen_task([&]() {
98 while (true) {
99 console.clear();
100
101 lemlib::Pose odomPose = chassis.getPose();
102 //distancePose pose = distanceReset(false);
103 console.printf("X: %.3f Y: %.3f\n", odomPose.x, odomPose.y);
104 console.printf("Theta: %.3f\n\n", odomPose.theta);
105 //console.printf("Calculated Angle %.3f", calculateAngle(odomPose.theta));
106 //console.printf("X_DSR: %.3f Y_DSR: %.3f\n", pose.x, pose.y);
107
108 /*
109 console.printf("X: %.2f Y: %.2f\n", MCL::global_X, MCL::global_Y);
110 console.printf("Theta: %.2f\n", MCL::global_Theta);
111
112 console.printf("Conf: %.1f%%\n", MCL::global_Confidence * 100.0);
113
114 double error_dist = std::hypot(odomPose.x - MCL::global_X, odomPose.y - MCL::global_Y);
115 console.printf("Delta Dist: %.2f in\n", error_dist);
116 */
117 pros::delay(50);
118 }
119 });
120}
121
122void disabled() {
123 selector.focus();
124
125}
126
128 selector.focus();
129}
130
132 selector.run_auton();
133}
134
135
136void opcontrol() {
137 midgoal_first = false;
138 bool trapDoor_commanded = false;
139 bool matchload_on = false;
140
141 std::unique_ptr<pros::Task> longgoalTask = nullptr;
142 int stall_timer = 0;
143 int task_run_time = 0;
144
145 static std::atomic<bool> macro_finished{false};
146 static std::atomic<bool> macro_abort{false};
147
148 enum class ScoringMode {
149 NONE, INTAKE, OUTTAKE, MIDGOAL, LONGGOAL, MANUAL_UP
150 };
151
152 while (true) {
153 int throttle = controller.get_analog(pros::E_CONTROLLER_ANALOG_LEFT_Y);
154 int steer = controller.get_analog(pros::E_CONTROLLER_ANALOG_RIGHT_X);
155
156 if (controller.get_digital_new_press(pros::E_CONTROLLER_DIGITAL_X)) {
157 trapDoor_commanded = !trapDoor_commanded;
158 if (trapDoor_commanded) trapDoor.extend();
159 }
160
161 if (controller.get_digital_new_press(pros::E_CONTROLLER_DIGITAL_B)) {
162 if (matchload.is_extended()) {
163 matchload.retract();
164 matchload_on = false;
165 } else {
166 matchload.extend();
167 matchload_on = true;
168 }
169 }
170
171 if (controller.get_digital_new_press(pros::E_CONTROLLER_DIGITAL_RIGHT)) {
173 controller.rumble(".");
174 }
175
176 if (controller.get_digital_new_press(pros::E_CONTROLLER_DIGITAL_A)) {
177 basket.toggle();
178 if (!scoringBand.is_extended()) scoringBand.extend();
179 }
180
181
182 if (controller.get_digital_new_press(pros::E_CONTROLLER_DIGITAL_LEFT)) {
183
184 if (longgoalTask != nullptr) {
185 macro_abort = true;
186 chassis.cancelMotion();
187 }
188
189 else {
190 stall_timer = 0;
191 task_run_time = 0;
192 macro_finished = false;
193 macro_abort = false;
194
195 longgoalTask = std::make_unique<pros::Task>([] {
196 distancePose pose = distanceReset(true);
197
198 if (!pose.using_odom_x && !pose.using_odom_y &&
199 std::abs(std::abs(pose.x) - (22 + longgoal_offset)) < 4 &&
200 std::abs(std::abs(pose.y) - 47.5) < 4) {
201
202 int x_mult = pose.x < 0 ? -1 : 1;
203 int y_mult = pose.y < 0 ? -1 : 1;
204
205 chassis.moveToPoint(49 * x_mult, 47.5 * y_mult, 3000, {.earlyExitRange = 2});
206 if (macro_abort) { macro_finished = true; return; }
207
208 descore.retract();
209 chassis.waitUntilDone();
210 if (macro_abort) { macro_finished = true; return; }
211
212 chassis.moveToPose((22 + longgoal_offset) * x_mult,
213 (47.5 * y_mult) + 13.5, x_mult > 0 ? 90 : 270, 1500,
214 {.forwards = false, .lead = 0.2, .minSpeed = 20, .earlyExitRange = 8});
215 if (macro_abort) { macro_finished = true; return; }
216
217 chassis.moveToPose(-16 * x_mult,
218 (47.5 * y_mult) + 12.5, x_mult > 0 ? 90 : 270, 1500,
219 {.forwards = false, .lead = 0.3});
220 }
221
222 macro_finished = true;
223 });
224 }
225 }
226 if (longgoalTask != nullptr) {
227 task_run_time += 10;
228
229
230 if (macro_finished) {
231 longgoalTask = nullptr;
232 }
233
234 else if (std::abs(throttle) > 15 || std::abs(steer) > 15) {
235 macro_abort = true;
236 chassis.cancelMotion();
237 }
238
239 else if (task_run_time > 3500) {
240 macro_abort = true;
241 chassis.cancelMotion();
242 controller.rumble("-");
243 }
244
245 else if (task_run_time > 500) {
246 double left_vel = std::abs(leftMotors.get_actual_velocity());
247 double right_vel = std::abs(rightMotors.get_actual_velocity());
248
249 if (left_vel < 10.0 && right_vel < 10.0) {
250 stall_timer += 10;
251 } else {
252 stall_timer = 0;
253 }
254
255 if (stall_timer > 500) {
256 macro_abort = true;
257 chassis.cancelMotion();
258 controller.rumble("- -");
259 }
260 }
261 } else {
262 stall_timer = 0;
263 task_run_time = 0;
264 }
265
266
267 if (controller.get_digital_new_press(pros::E_CONTROLLER_DIGITAL_L2)) {
268 midgoal_first = true;
269 if (!trapDoor.is_extended()) {
270 trapDoor.extend();
271 }
272 }
273
274 if (controller.get_digital(pros::E_CONTROLLER_DIGITAL_DOWN)) {
275 descore.retract();
276 } else {
277 descore.extend();
278 }
279
280 ScoringMode scoringMode = ScoringMode::NONE;
281 if (controller.get_digital(pros::E_CONTROLLER_DIGITAL_L1)) {
282 scoringMode = ScoringMode::LONGGOAL;
283 } else if (controller.get_digital(pros::E_CONTROLLER_DIGITAL_L2)) {
284 scoringMode = ScoringMode::MIDGOAL;
285 } else if (controller.get_digital(pros::E_CONTROLLER_DIGITAL_UP)) {
286 scoringMode = ScoringMode::MANUAL_UP;
287 } else if (controller.get_digital(pros::E_CONTROLLER_DIGITAL_R2)) {
288 scoringMode = ScoringMode::OUTTAKE;
289 } else if (controller.get_digital(pros::E_CONTROLLER_DIGITAL_R1)) {
290 scoringMode = ScoringMode::INTAKE;
291 }
292
293 switch (scoringMode) {
294 case ScoringMode::INTAKE:
295 intake();
296 break;
297 case ScoringMode::OUTTAKE:
298 outtake(8500);
299 if (intakeFunnel.is_extended()) intakeFunnel.retract();
300 low_ramp_down_time += 10;
301 break;
302 case ScoringMode::MIDGOAL:
304 ramp_up_time += 10;
305 break;
306 case ScoringMode::LONGGOAL:
308 break;
309 case ScoringMode::MANUAL_UP:
310 topMotor.move(12000);
311 intakeMotor.move(-12000);
312 break;
313 case ScoringMode::NONE:
314 ramp_up_time = 0;
315 resting_state(trapDoor_commanded);
316 midgoal_first = false;
317 intakeFunnel.extend();
319 if (!color_sort_enable && scoringBand.is_extended()) {
320 scoringBand.retract();
321 }
322 break;
323 }
324
325 if (color_sort_enable) blockBlocker.extend();
326 else blockBlocker.retract();
327
328 leftMotors.set_brake_mode(pros::E_MOTOR_BRAKE_COAST);
329 rightMotors.set_brake_mode(pros::E_MOTOR_BRAKE_COAST);
330
331 if (longgoalTask == nullptr) {
332 chassis.curvature(throttle, steer, false);
333 }
334
335 pros::delay(10);
336 }
337}
void outtake(int power=12000)
void intake(int power=12000)
void score_longgoal(int power=12000, Color allianceColor=Color::RED)
void score_midgoal(int power=12000)
void resting_state(bool trapDoor_commanded=false)
void left_auton()
void carry_auton()
void skills_auton()
void awp_auton()
void right_auton()
void elim_auton()
const int longgoal_offset
distancePose distanceReset(bool setPose=false, bool filter=true)
pros::adi::Pneumatics blockBlocker('G', false)
int ramp_up_time
Definition globals.cpp:99
pros::adi::Pneumatics basket('F', false)
pros::adi::Pneumatics scoringBand('C', false)
pros::adi::Pneumatics trapDoor('A', false)
pros::Motor intakeMotor(18, pros::v5::MotorGears::blue)
pros::Motor topMotor(19, pros::v5::MotorGears::blue)
bool color_sort_enable
Definition globals.cpp:97
pros::adi::Pneumatics matchload('E', false)
int low_ramp_down_time
Definition globals.cpp:100
pros::adi::Pneumatics descore('D', false)
Color allianceColor
Definition globals.cpp:96
pros::Optical color_sensor(7)
pros::adi::Pneumatics intakeFunnel('B', true)
bool midgoal_first
Definition globals.cpp:98
pros::MotorGroup rightMotors
lemlib::Chassis chassis
pros::MotorGroup leftMotors
Definition globals.cpp:22
pros::Controller controller
void initialize()
Definition main.cpp:79
void autonomous()
Definition main.cpp:131
rd::Selector selector({ {"Right", right_auton}, {"Left", left_auton}, {"Carry", carry_auton}, {"Elim", elim_auton}, {"AWP", awp_auton}, {"Skills", skills_auton} })
void disabled()
Definition main.cpp:122
void create_alliance_selector()
Definition main.cpp:53
void competition_initialize()
Definition main.cpp:127
static void update_alliance_btn(lv_obj_t *btn, Color newColor)
Definition main.cpp:22
void opcontrol()
Definition main.cpp:136
static void alliance_btn_event_handler(lv_event_t *e)
Definition main.cpp:38
rd::Console console
Definition main.cpp:77
void distance_sensor_disconnect_warning()
Definition warnings.cpp:105
void motor_disconnect_warning()
Definition warnings.cpp:60
void temp_warning()
Definition warnings.cpp:5