RIT VEXU Core API
Loading...
Searching...
No Matches
legacy_bridge.h
1#pragma once
2
3#include <initializer_list>
4#include <vector>
5
6#include "legacy.h"
7#include "core/subsystems/screen/screen_controller.h"
8
9namespace LegacyScreen {
10
11class LegacyPage {
12public:
13
14 LegacyPage(vex::brain::lcd screen, std::initializer_list<Page *> pages);
15 LegacyPage(vex::brain::lcd screen, std::vector<Page *> pages);
16 LegacyPage() = default;
17
18 inline std::function<void()> handle() {
19 return [this]() {
20 if(this->pages.empty()) {
21 this->screen.clearScreen(vex::color::red);
22 return;
23 }
24
25 Page *front_page = this->pages[this->index];
26 std::optional<Point2d> pressing;
27
28 if((pressing = ScreenController::get_press_pos()).has_value()) {
29 this->x_press = pressing->x();
30 this->y_press = pressing->y();
31 }
32 bool just_pressed = pressing.has_value() && !this->was_pressed;
33
34 if (just_pressed && this->x_press < 40) {
35 this->index--;
36 if (this->index < 0) {
37 this->index += this->pages.size();
38 }
39 }
40 if (just_pressed && this->x_press > 440) {
41 this->index++;
42 this->index %= this->pages.size();
43 }
44
45 // Update all pages
46 for (auto page : this->pages) {
47 if (page == front_page) {
48 page->update(this->was_pressed, this->x_press, this->y_press);
49 } else {
50 page->update(false, 0, 0);
51 }
52 }
53
54 // Draw First Page
55 int frame = ScreenController::get_frame_count();
56 if (frame % 2 == 0) {
57 this->screen.clearScreen(vex::color::black);
58 this->screen.setPenColor("#FFFFFF");
59 this->screen.setFillColor("#000000");
60 front_page->draw(this->screen, false, frame / 5);
61
62 // Draw side boxes
63 this->screen.setPenColor("#202020");
64 this->screen.setFillColor("#202020");
65 this->screen.drawRectangle(0, 0, 40, 240);
66 this->screen.drawRectangle(440, 0, 40, 240);
67 this->screen.setPenColor("#FFFFFF");
68 // left arrow
69 this->screen.drawLine(30, 100, 15, 120);
70 this->screen.drawLine(30, 140, 15, 120);
71 // right arrow
72 this->screen.drawLine(450, 100, 465, 120);
73 this->screen.drawLine(450, 140, 465, 120);
74 }
75
76 this->was_pressed = pressing.has_value();
77 };
78 }
79
80private:
81
82 bool was_pressed;
83 int index;
84 int x_press;
85 int y_press;
86
87 std::vector<Page *> pages;
88 vex::brain::lcd screen;
89};
90
98inline std::function<void()> pre_initialize(vex::brain& brain, Initializer& initializer, LegacyPage* page, std::function<void()> o = nullptr) {
99 return [&, o, page]() {
100 if(o) o();
101
102 std::vector<Page*> pages; size_t initializations = 0;
103 do {
104 pages.push_back(new InitializerPage(initializer, initializations));
105 initializations += 8;
106 } while(initializations < initializer.initialization_count());
107
108 *page = LegacyPage(brain.Screen, pages);
109 ScreenController::set(page->handle());
110 };
111}
112
113} // namespace screen
const std::size_t initialization_count() const
Definition initializer.cpp:50
InitializerPage provides a way to Select a desired Initialization on the Screen.
Definition legacy.h:286