RIT VEXU Core API
Loading...
Searching...
No Matches
initializer.h
1#pragma once
2
3#include <functional>
4#include <string>
5#include <vector>
6#include "vex.h"
7
9#define INIT(name, func, meta) Initialization{name, func, meta}
10
12#define FUNC_INIT(func) Initialization{"", func, 1}
13
14// Creates an Initialization with a set-able metadata for weighted operations
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
30 const std::string name;
31 const std::function<void()> init;
32 const unsigned int meta;
33};
34
35
39namespace Selector {
40
42using selector_t = size_t();
43
45constexpr size_t NO_SELECTION_INDEX = SIZE_MAX;
46
52inline std::function<selector_t> select(size_t n) {
53 return [=]() {
54 return n;
55 };
56}
57
65inline std::function<selector_t> random(size_t a, size_t b) {
66 return [=]() {
67 if(b < a) return (size_t) 0;
68 if(a == b) return a;
69 return a + ((size_t) rand()) % (b - a);
70 };
71}
72
79inline std::function<selector_t> random(size_t n) {
80 return random(0, n);
81}
82
90template<size_t FLAG = NO_SELECTION_INDEX>
91inline std::function<selector_t> skippable(std::function<selector_t> selector) {
92 return (FLAG == NO_SELECTION_INDEX && selector) ? selector : select(FLAG);
93}
94
104inline 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) {
105 if(!selector) return [=]() { return fallback; };
106 struct thread_args {
107 std::function<selector_t> selector;
108 size_t output;
109 };
110 return [=]() {
111 vex::timer timer;
112 uint64_t thread_start = timer.systemHighResolution();
113 thread_args targs = {selector, NO_SELECTION_INDEX};
114
115 vex::thread sThread([](void* args) {
116 ((thread_args*) args)->output = ((thread_args*) args)->selector();
117 }, &targs);
118
119 while(sThread.joinable()) {
120 if(timer.systemHighResolution() - thread_start > microsec) sThread.interrupt();
121 else if(targs.output == NO_SELECTION_INDEX) {
122 vexDelay(100);
123 continue;
124 }
125
126 sThread.join();
127 }
128
129 if(targs.output == NO_SELECTION_INDEX) {
130 cancel(fallback);
131 return fallback;
132 } else return targs.output;
133 };
134}
135
142inline std::function<selector_t> delayed(std::function<selector_t> selector, unsigned int ms) {
143 return [=]() {
144 vexDelay(ms);
145 return selector();
146 };
147}
148
156inline std::function<selector_t> potentiometer(vex::pot& potentiometer, const size_t& initializations) {
157 return [=, &potentiometer]() {
158 vexDelay(250);
159 double region = 100.0 / initializations;
160 double angle = potentiometer.value(vex::percentUnits::pct);
161 return (size_t) ((angle < 100) ? angle : 99.9) / region;
162 };
163}
164
172inline std::function<selector_t> weighted_potentiometer(vex::pot& potentiometer, std::vector<Initialization>& initializations) {
173 return [&]() {
174 vexDelay(250);
175 size_t total_weights = 0;
176 for(Initialization initialization : initializations) total_weights += initialization.meta;
177
178 size_t angle = (potentiometer.value(vex::percentUnits::pct)/100.0)*total_weights;
179 for(int i = initializations.size()-1; i > 0; i--) {
180 if(initializations.at(i).meta == 0) continue;
181
182 total_weights -= initializations.at(i).meta;
183 if(angle >= total_weights) return i;
184 }
185 return 0;
186 };
187}
188
189}; // namespace Selector
190
191
196public:
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
216 void initialize();
217
222 const std::vector<Initialization>& initializations() const;
223
228 const std::size_t initialization_count() const;
229
234 const std::string selected_name() const;
235
240 unsigned int selected_meta() const;
241
246 unsigned int selected_index() const;
247
252 bool uninitialized() const;
253
254private:
255 std::function<Selector::selector_t> selector;
256 std::vector<Initialization> initialization_list;
257
258 std::function<void()> pre_init;
259 std::function<void()> post_init;
260
261 Initialization *selected_initialization = nullptr;
262 size_t selection = Selector::NO_SELECTION_INDEX;
263 bool initialized = false;
264};
const std::string selected_name() const
Definition initializer.cpp:58
const std::size_t initialization_count() const
Definition initializer.cpp:50
bool uninitialized() const
Definition initializer.cpp:82
const std::vector< Initialization > & initializations() const
Definition initializer.cpp:42
unsigned int selected_index() const
Definition initializer.cpp:74
unsigned int selected_meta() const
Definition initializer.cpp:66
Initializer(std::function< void()> initialize)
Definition initializer.cpp:8
void initialize()
Definition initializer.cpp:25
Definition initializer.h:39
std::function< selector_t > weighted_potentiometer(vex::pot &potentiometer, std::vector< Initialization > &initializations)
Definition initializer.h:172
std::function< selector_t > select(size_t n)
Definition initializer.h:52
size_t() selector_t
The type of an Initializer's Selector function.
Definition initializer.h:42
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:104
std::function< selector_t > skippable(std::function< selector_t > selector)
Definition initializer.h:91
std::function< selector_t > delayed(std::function< selector_t > selector, unsigned int ms)
Definition initializer.h:142
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:45
std::function< selector_t > potentiometer(vex::pot &potentiometer, const size_t &initializations)
Definition initializer.h:156
std::function< selector_t > random(size_t a, size_t b)
Definition initializer.h:65
Definition initializer.h:29
const unsigned int meta
The function that executes when this Initialization is selected.
Definition initializer.h:32
const std::function< void()> init
The name of the Initialization.
Definition initializer.h:31