1516X Push Back 1.0
1516X's robot code for the 2025-2026 VEX Robotics Competition
Loading...
Searching...
No Matches
main.cpp File Reference
#include "main.h"
#include "crossBarrierDetection.h"
#include "globals.h"
#include "lemlib/chassis/chassis.hpp"
#include "liblvgl/core/lv_obj_pos.h"
#include "pros/distance.hpp"
#include "pros/misc.h"
#include "auton/autonRoutines.h"
#include "pros/misc.hpp"
#include "pros/motors.h"
#include "robodash/views/selector.hpp"
#include "colorSort.h"
#include "warnings.h"
#include <string>
#include "MCL.h"
#include "auton/autonFunctions.h"
#include "distanceReset.h"
#include <atomic>
#include <memory>

Go to the source code of this file.

Functions

static void update_alliance_btn (lv_obj_t *btn, Color newColor)
static void alliance_btn_event_handler (lv_event_t *e)
void create_alliance_selector ()
rd::Selector selector ({ {"Right", right_auton}, {"Left", left_auton}, {"Carry", carry_auton}, {"Elim", elim_auton}, {"AWP", awp_auton}, {"Skills", skills_auton} })
void initialize ()
void disabled ()
void competition_initialize ()
void autonomous ()
void opcontrol ()

Variables

rd::Console console

Function Documentation

◆ alliance_btn_event_handler()

void alliance_btn_event_handler ( lv_event_t * e)
static

Definition at line 38 of file main.cpp.

38 {
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}
Color allianceColor
Definition globals.cpp:96
static void update_alliance_btn(lv_obj_t *btn, Color newColor)
Definition main.cpp:22

References allianceColor, and update_alliance_btn().

Referenced by create_alliance_selector().

◆ autonomous()

void autonomous ( )

Definition at line 131 of file main.cpp.

131 {
132 selector.run_auton();
133}
rd::Selector selector({ {"Right", right_auton}, {"Left", left_auton}, {"Carry", carry_auton}, {"Elim", elim_auton}, {"AWP", awp_auton}, {"Skills", skills_auton} })

References selector().

◆ competition_initialize()

void competition_initialize ( )

Definition at line 127 of file main.cpp.

127 {
128 selector.focus();
129}

References selector().

◆ create_alliance_selector()

void create_alliance_selector ( )

Definition at line 53 of file main.cpp.

53 {
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}
static void alliance_btn_event_handler(lv_event_t *e)
Definition main.cpp:38

References alliance_btn_event_handler().

Referenced by initialize().

◆ disabled()

void disabled ( )

Definition at line 122 of file main.cpp.

122 {
123 selector.focus();
124
125}

References selector().

◆ initialize()

void initialize ( )

Definition at line 79 of file main.cpp.

79 {
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}
pros::Optical color_sensor(7)
lemlib::Chassis chassis
void create_alliance_selector()
Definition main.cpp:53
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

References chassis, color_sensor(), console, create_alliance_selector(), distance_sensor_disconnect_warning(), motor_disconnect_warning(), selector(), and temp_warning().

◆ opcontrol()

void opcontrol ( )

Definition at line 136 of file main.cpp.

136 {
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)
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)
pros::adi::Pneumatics intakeFunnel('B', true)
bool midgoal_first
Definition globals.cpp:98
pros::MotorGroup rightMotors
pros::MotorGroup leftMotors
Definition globals.cpp:22
pros::Controller controller

References allianceColor, basket(), blockBlocker(), chassis, color_sort_enable, controller, descore(), distanceReset(), intake(), intakeFunnel(), intakeMotor(), leftMotors, longgoal_offset, low_ramp_down_time, matchload(), midgoal_first, outtake(), ramp_up_time, resting_state(), rightMotors, score_longgoal(), score_midgoal(), scoringBand(), topMotor(), trapDoor(), distancePose::using_odom_x, distancePose::using_odom_y, distancePose::x, and distancePose::y.

◆ selector()

rd::Selector selector ( { {"Right", right_auton}, {"Left", left_auton}, {"Carry", carry_auton}, {"Elim", elim_auton}, {"AWP", awp_auton}, {"Skills", skills_auton} } )

◆ update_alliance_btn()

void update_alliance_btn ( lv_obj_t * btn,
Color newColor )
static

Definition at line 22 of file main.cpp.

22 {
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}

Referenced by alliance_btn_event_handler().

Variable Documentation

◆ console

rd::Console console

Definition at line 77 of file main.cpp.

Referenced by initialize().