RIT VEXU Core API
Loading...
Searching...
No Matches
initializer.h
1#pragma once
2
3#include "vex/vex.h"
4#include <functional>
5#include <string>
6#include <vector>
7
9#define INIT(name, func, meta) Initialization{name, func, meta}
10
12#define FUNC_INIT(func) Initialization{"", func, 1}
13
15#define WEIGHTED_INIT(func, weight) Initialization{"", func, weight}
16
18#define RED_INIT(name, func) Initialization{name, func, ClrRed }
19
21#define BLUE_INIT(name, func) Initialization{name, func, ClrBlue}
22
24#define NEUTRAL_INIT(name, func) Initialization{name, func, ClrGray}
25
26
29 const std::string name;
30 const std::function<void()> init;
31 const unsigned int meta;
32};
33
34
35
37namespace Selector {
38
40using selector_t = size_t();
41
43constexpr size_t NO_SELECTION_INDEX = SIZE_MAX;
44
50inline std::function<selector_t> select(size_t n) {
51 return [=]() {
52 return n;
53 };
54}
55
63inline std::function<selector_t> random(size_t a, size_t b) {
64 return [=]() {
65 if(b < a) return (size_t) 0;
66 if(a == b) return a;
67 return a + ((size_t) rand()) % (b - a);
68 };
69}
70
77inline std::function<selector_t> random(size_t n) {
78 return random(0, n);
79}
80
88template<size_t FLAG = NO_SELECTION_INDEX>
89inline std::function<selector_t> skippable(std::function<selector_t> selector) {
90 return (FLAG == NO_SELECTION_INDEX && selector) ? selector : select(FLAG);
91}
92
102inline std::function<selector_t> timeout(std::function<selector_t> selector, uint64_t microsec, unsigned int fallback = NO_SELECTION_INDEX, std::function<void(size_t)> cancel = nullptr) {
103 if(!selector) return [=]() { return fallback; };
104 struct thread_args {
105 std::function<selector_t> selector;
106 size_t output;
107 };
108 return [=]() {
109 vex::timer timer;
110 uint64_t thread_start = timer.systemHighResolution();
111 thread_args targs = {selector, NO_SELECTION_INDEX};
112
113 vex::thread sThread([](void* args) {
114 ((thread_args*) args)->output = ((thread_args*) args)->selector();
115 }, &targs);
116
117 while(sThread.joinable()) {
118 if(timer.systemHighResolution() - thread_start > microsec) sThread.interrupt();
119 else if(targs.output == NO_SELECTION_INDEX) {
120 vexDelay(100);
121 continue;
122 }
123
124 sThread.join();
125 }
126
127 if(targs.output == NO_SELECTION_INDEX) {
128 cancel(fallback);
129 return fallback;
130 } else return targs.output;
131 };
132}
133
140inline std::function<selector_t> delayed(std::function<selector_t> selector, unsigned int ms) {
141 return [=]() {
142 vexDelay(ms);
143 return selector();
144 };
145}
146
154inline std::function<selector_t> potentiometer(vex::pot& potentiometer, const size_t& initializations) {
155 return [=, &potentiometer]() {
156 vexDelay(250);
157 double region = 100.0 / initializations;
158 double angle = potentiometer.value(vex::percentUnits::pct);
159 return (size_t) ((angle < 100) ? angle : 99.9) / region;
160 };
161}
162
170inline std::function<selector_t> weighted_potentiometer(vex::pot& potentiometer, std::vector<Initialization>& initializations) {
171 return [&]() {
172 vexDelay(250);
173 size_t total_weights = 0;
174 for(Initialization initialization : initializations) total_weights += initialization.meta;
175
176 size_t angle = (potentiometer.value(vex::percentUnits::pct)/100.0)*total_weights;
177 for(int i = initializations.size()-1; i > 0; i--) {
178 if(initializations.at(i).meta == 0) continue;
179
180 total_weights -= initializations.at(i).meta;
181 if(angle >= total_weights) return i;
182 }
183 return 0;
184 };
185}
186
187}; // namespace Selector
188
189
195public:
201 Initializer(std::function<void()> initialize);
202
210 Initializer(std::vector<Initialization> initializations, std::function<Selector::selector_t> selector,
211 std::function<void()> pre_init = nullptr, std::function<void()> post_init = nullptr);
212
213
215 void initialize();
216
221 const std::vector<Initialization>& initializations() const;
222
227 const std::size_t initialization_count() const;
228
233 const std::string selected_name() const;
234
239 unsigned int selected_meta() const;
240
245 unsigned int selected_index() const;
246
251 bool uninitialized() const;
252
253private:
254 std::function<Selector::selector_t> selector;
255 std::vector<Initialization> initialization_list;
256
257 std::function<void()> pre_init;
258 std::function<void()> post_init;
259
260 Initialization *selected_initialization = nullptr;
261 size_t selection = Selector::NO_SELECTION_INDEX;
262 bool initialized = false;
263};
const std::string selected_name() const
Definition initializer.cpp:56
const std::size_t initialization_count() const
Definition initializer.cpp:48
bool uninitialized() const
Definition initializer.cpp:80
const std::vector< Initialization > & initializations() const
Definition initializer.cpp:40
unsigned int selected_index() const
Definition initializer.cpp:72
unsigned int selected_meta() const
Definition initializer.cpp:64
Initializer(std::function< void()> initialize)
Definition initializer.cpp:8
void initialize()
Initializes the robot.
Definition initializer.cpp:23
A namespace containing predefined selector functions and wrappers that can be passed to an Initialize...
Definition initializer.h:37
std::function< selector_t > weighted_potentiometer(vex::pot &potentiometer, std::vector< Initialization > &initializations)
Definition initializer.h:170
std::function< selector_t > select(size_t n)
Definition initializer.h:50
size_t() selector_t
The type of an Initializer's Selector function.
Definition initializer.h:40
std::function< selector_t > timeout(std::function< selector_t > selector, uint64_t microsec, unsigned int fallback=NO_SELECTION_INDEX, std::function< void(size_t)> cancel=nullptr)
Definition initializer.h:102
std::function< selector_t > skippable(std::function< selector_t > selector)
Definition initializer.h:89
std::function< selector_t > delayed(std::function< selector_t > selector, unsigned int ms)
Definition initializer.h:140
constexpr size_t NO_SELECTION_INDEX
A constant index that is used in selector functions to represent when a selection has not yet been ma...
Definition initializer.h:43
std::function< selector_t > potentiometer(vex::pot &potentiometer, const size_t &initializations)
Definition initializer.h:154
std::function< selector_t > random(size_t a, size_t b)
Definition initializer.h:63
Initialization is a helper structure of the Initializer class used to group an initialization functio...
Definition initializer.h:28
const unsigned int meta
The function that executes when this Initialization is selected.
Definition initializer.h:31
const std::function< void()> init
The name of the Initialization.
Definition initializer.h:30