Frame Level Language for controlling DUALSHOCK2
fllaux.cpp@0:a436e2063a3d, 2015-02-19 (annotated)
- Committer:
- amutake
- Date:
- Thu Feb 19 06:59:49 2015 +0000
- Revision:
- 0:a436e2063a3d
- Child:
- 1:905fe1a0ca5a
fll is now a library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
amutake | 0:a436e2063a3d | 1 | // utility producers |
amutake | 0:a436e2063a3d | 2 | |
amutake | 0:a436e2063a3d | 3 | #include "fll.h" |
amutake | 0:a436e2063a3d | 4 | #include "fllaux.h" |
amutake | 0:a436e2063a3d | 5 | |
amutake | 0:a436e2063a3d | 6 | // ------------- |
amutake | 0:a436e2063a3d | 7 | // OnetimeSource |
amutake | 0:a436e2063a3d | 8 | // ------------- |
amutake | 0:a436e2063a3d | 9 | OnetimeSource::OnetimeSource(button_t *bs, int s) |
amutake | 0:a436e2063a3d | 10 | { |
amutake | 0:a436e2063a3d | 11 | button_seq = bs; |
amutake | 0:a436e2063a3d | 12 | size = s; |
amutake | 0:a436e2063a3d | 13 | i = 0; |
amutake | 0:a436e2063a3d | 14 | } |
amutake | 0:a436e2063a3d | 15 | |
amutake | 0:a436e2063a3d | 16 | button_t OnetimeSource::await() |
amutake | 0:a436e2063a3d | 17 | { |
amutake | 0:a436e2063a3d | 18 | if (size <= i) { |
amutake | 0:a436e2063a3d | 19 | return 0; |
amutake | 0:a436e2063a3d | 20 | } else { |
amutake | 0:a436e2063a3d | 21 | return button_seq[i++]; |
amutake | 0:a436e2063a3d | 22 | } |
amutake | 0:a436e2063a3d | 23 | } |
amutake | 0:a436e2063a3d | 24 | |
amutake | 0:a436e2063a3d | 25 | bool OnetimeSource::is_finished() |
amutake | 0:a436e2063a3d | 26 | { |
amutake | 0:a436e2063a3d | 27 | return (size <= i); |
amutake | 0:a436e2063a3d | 28 | } |
amutake | 0:a436e2063a3d | 29 | |
amutake | 0:a436e2063a3d | 30 | void OnetimeSource::reset() |
amutake | 0:a436e2063a3d | 31 | { |
amutake | 0:a436e2063a3d | 32 | i = 0; |
amutake | 0:a436e2063a3d | 33 | } |
amutake | 0:a436e2063a3d | 34 | |
amutake | 0:a436e2063a3d | 35 | // -------------- |
amutake | 0:a436e2063a3d | 36 | // RepeaterSource |
amutake | 0:a436e2063a3d | 37 | // -------------- |
amutake | 0:a436e2063a3d | 38 | RepeaterSource::RepeaterSource(button_t *bs, int s) |
amutake | 0:a436e2063a3d | 39 | { |
amutake | 0:a436e2063a3d | 40 | button_seq = bs; |
amutake | 0:a436e2063a3d | 41 | size = s; |
amutake | 0:a436e2063a3d | 42 | i = 0; |
amutake | 0:a436e2063a3d | 43 | } |
amutake | 0:a436e2063a3d | 44 | |
amutake | 0:a436e2063a3d | 45 | button_t RepeaterSource::await() |
amutake | 0:a436e2063a3d | 46 | { |
amutake | 0:a436e2063a3d | 47 | if(size == 0) { |
amutake | 0:a436e2063a3d | 48 | return 0; |
amutake | 0:a436e2063a3d | 49 | } else if(size <= i) { |
amutake | 0:a436e2063a3d | 50 | i = 0; |
amutake | 0:a436e2063a3d | 51 | } |
amutake | 0:a436e2063a3d | 52 | return button_seq[i++]; |
amutake | 0:a436e2063a3d | 53 | } |
amutake | 0:a436e2063a3d | 54 | |
amutake | 0:a436e2063a3d | 55 | bool RepeaterSource::is_finished() |
amutake | 0:a436e2063a3d | 56 | { |
amutake | 0:a436e2063a3d | 57 | return false; |
amutake | 0:a436e2063a3d | 58 | } |
amutake | 0:a436e2063a3d | 59 | |
amutake | 0:a436e2063a3d | 60 | void RepeaterSource::reset() |
amutake | 0:a436e2063a3d | 61 | { |
amutake | 0:a436e2063a3d | 62 | i = 0; |
amutake | 0:a436e2063a3d | 63 | } |
amutake | 0:a436e2063a3d | 64 | |
amutake | 0:a436e2063a3d | 65 | // ---------- |
amutake | 0:a436e2063a3d | 66 | // EasySource |
amutake | 0:a436e2063a3d | 67 | // ---------- |
amutake | 0:a436e2063a3d | 68 | EasySource::EasySource(button_time* seq, int size) |
amutake | 0:a436e2063a3d | 69 | { |
amutake | 0:a436e2063a3d | 70 | bt_seq = seq; |
amutake | 0:a436e2063a3d | 71 | bt_size = size; |
amutake | 0:a436e2063a3d | 72 | index = 0; |
amutake | 0:a436e2063a3d | 73 | frame_i = 0; |
amutake | 0:a436e2063a3d | 74 | lag = 0; |
amutake | 0:a436e2063a3d | 75 | } |
amutake | 0:a436e2063a3d | 76 | |
amutake | 0:a436e2063a3d | 77 | button_t EasySource::await() |
amutake | 0:a436e2063a3d | 78 | { |
amutake | 0:a436e2063a3d | 79 | if (index >= bt_size) { |
amutake | 0:a436e2063a3d | 80 | return 0; |
amutake | 0:a436e2063a3d | 81 | } |
amutake | 0:a436e2063a3d | 82 | |
amutake | 0:a436e2063a3d | 83 | button_time bt = bt_seq[index]; |
amutake | 0:a436e2063a3d | 84 | float passing = frame_i * FRAME; // passing time since the begining of this note (sec) |
amutake | 0:a436e2063a3d | 85 | |
amutake | 0:a436e2063a3d | 86 | frame_i++; |
amutake | 0:a436e2063a3d | 87 | |
amutake | 0:a436e2063a3d | 88 | button_t btn = 0; |
amutake | 0:a436e2063a3d | 89 | if (passing + FRAME >= bt.sec - lag) { // final frame |
amutake | 0:a436e2063a3d | 90 | frame_i = 0; |
amutake | 0:a436e2063a3d | 91 | index++; |
amutake | 0:a436e2063a3d | 92 | lag = passing + FRAME - (bt.sec - lag); |
amutake | 0:a436e2063a3d | 93 | } else if (frame_i < 4) { // pressing time |
amutake | 0:a436e2063a3d | 94 | btn = bt.button; |
amutake | 0:a436e2063a3d | 95 | } |
amutake | 0:a436e2063a3d | 96 | return btn; |
amutake | 0:a436e2063a3d | 97 | } |
amutake | 0:a436e2063a3d | 98 | |
amutake | 0:a436e2063a3d | 99 | bool EasySource::is_finished() |
amutake | 0:a436e2063a3d | 100 | { |
amutake | 0:a436e2063a3d | 101 | return index >= bt_size; |
amutake | 0:a436e2063a3d | 102 | } |
amutake | 0:a436e2063a3d | 103 | |
amutake | 0:a436e2063a3d | 104 | void EasySource::reset() |
amutake | 0:a436e2063a3d | 105 | { |
amutake | 0:a436e2063a3d | 106 | index = 0; |
amutake | 0:a436e2063a3d | 107 | frame_i = 0; |
amutake | 0:a436e2063a3d | 108 | lag = 0; |
amutake | 0:a436e2063a3d | 109 | } |
amutake | 0:a436e2063a3d | 110 | |
amutake | 0:a436e2063a3d | 111 | // -------- |
amutake | 0:a436e2063a3d | 112 | // FoldFlow |
amutake | 0:a436e2063a3d | 113 | // -------- |
amutake | 0:a436e2063a3d | 114 | FoldFlow::FoldFlow(Producer **srcs, int srcs_size) |
amutake | 0:a436e2063a3d | 115 | { |
amutake | 0:a436e2063a3d | 116 | sources = srcs; |
amutake | 0:a436e2063a3d | 117 | sources_size = srcs_size; |
amutake | 0:a436e2063a3d | 118 | } |
amutake | 0:a436e2063a3d | 119 | |
amutake | 0:a436e2063a3d | 120 | button_t FoldFlow::await() |
amutake | 0:a436e2063a3d | 121 | { |
amutake | 0:a436e2063a3d | 122 | button_t *bs = (button_t*) malloc(sizeof(button_t) * sources_size); |
amutake | 0:a436e2063a3d | 123 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 124 | bs[i] = sources[i]->await(); |
amutake | 0:a436e2063a3d | 125 | } |
amutake | 0:a436e2063a3d | 126 | button_t b = fold(bs, sources_size); |
amutake | 0:a436e2063a3d | 127 | free(bs); |
amutake | 0:a436e2063a3d | 128 | return b; |
amutake | 0:a436e2063a3d | 129 | } |
amutake | 0:a436e2063a3d | 130 | |
amutake | 0:a436e2063a3d | 131 | bool FoldFlow::is_finished() |
amutake | 0:a436e2063a3d | 132 | { |
amutake | 0:a436e2063a3d | 133 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 134 | if (!sources[i]->is_finished()) { |
amutake | 0:a436e2063a3d | 135 | return false; |
amutake | 0:a436e2063a3d | 136 | } |
amutake | 0:a436e2063a3d | 137 | } |
amutake | 0:a436e2063a3d | 138 | return true; |
amutake | 0:a436e2063a3d | 139 | } |
amutake | 0:a436e2063a3d | 140 | |
amutake | 0:a436e2063a3d | 141 | void FoldFlow::reset() |
amutake | 0:a436e2063a3d | 142 | { |
amutake | 0:a436e2063a3d | 143 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 144 | sources[i]->reset(); |
amutake | 0:a436e2063a3d | 145 | } |
amutake | 0:a436e2063a3d | 146 | } |
amutake | 0:a436e2063a3d | 147 | |
amutake | 0:a436e2063a3d | 148 | // ---------- |
amutake | 0:a436e2063a3d | 149 | // MergeFlow |
amutake | 0:a436e2063a3d | 150 | // ---------- |
amutake | 0:a436e2063a3d | 151 | button_t MergeFlow::fold(button_t *bs, int bs_size) |
amutake | 0:a436e2063a3d | 152 | { |
amutake | 0:a436e2063a3d | 153 | button_t b = 0x00; |
amutake | 0:a436e2063a3d | 154 | for(int i = 0; i < bs_size; i++) { |
amutake | 0:a436e2063a3d | 155 | b |= bs[i]; |
amutake | 0:a436e2063a3d | 156 | } |
amutake | 0:a436e2063a3d | 157 | return b; |
amutake | 0:a436e2063a3d | 158 | } |
amutake | 0:a436e2063a3d | 159 | |
amutake | 0:a436e2063a3d | 160 | // --------- |
amutake | 0:a436e2063a3d | 161 | // DelayFlow |
amutake | 0:a436e2063a3d | 162 | // --------- |
amutake | 0:a436e2063a3d | 163 | DelayFlow::DelayFlow(Producer *src, float d) |
amutake | 0:a436e2063a3d | 164 | { |
amutake | 0:a436e2063a3d | 165 | source = src; |
amutake | 0:a436e2063a3d | 166 | delay = d; |
amutake | 0:a436e2063a3d | 167 | passing = 0; |
amutake | 0:a436e2063a3d | 168 | end = false; |
amutake | 0:a436e2063a3d | 169 | } |
amutake | 0:a436e2063a3d | 170 | |
amutake | 0:a436e2063a3d | 171 | button_t DelayFlow::await() |
amutake | 0:a436e2063a3d | 172 | { |
amutake | 0:a436e2063a3d | 173 | if (end) { |
amutake | 0:a436e2063a3d | 174 | return source->await(); |
amutake | 0:a436e2063a3d | 175 | } |
amutake | 0:a436e2063a3d | 176 | |
amutake | 0:a436e2063a3d | 177 | passing += FRAME; |
amutake | 0:a436e2063a3d | 178 | if (passing >= delay) { |
amutake | 0:a436e2063a3d | 179 | end = true; |
amutake | 0:a436e2063a3d | 180 | } |
amutake | 0:a436e2063a3d | 181 | return 0; |
amutake | 0:a436e2063a3d | 182 | } |
amutake | 0:a436e2063a3d | 183 | |
amutake | 0:a436e2063a3d | 184 | bool DelayFlow::is_finished() |
amutake | 0:a436e2063a3d | 185 | { |
amutake | 0:a436e2063a3d | 186 | return end && source->is_finished(); |
amutake | 0:a436e2063a3d | 187 | } |
amutake | 0:a436e2063a3d | 188 | |
amutake | 0:a436e2063a3d | 189 | void DelayFlow::reset() |
amutake | 0:a436e2063a3d | 190 | { |
amutake | 0:a436e2063a3d | 191 | source->reset(); |
amutake | 0:a436e2063a3d | 192 | passing = 0; |
amutake | 0:a436e2063a3d | 193 | end = false; |
amutake | 0:a436e2063a3d | 194 | } |
amutake | 0:a436e2063a3d | 195 | |
amutake | 0:a436e2063a3d | 196 | // -------------- |
amutake | 0:a436e2063a3d | 197 | // SequentialFlow |
amutake | 0:a436e2063a3d | 198 | // -------------- |
amutake | 0:a436e2063a3d | 199 | SequentialFlow::SequentialFlow(Producer **srcs, int srcs_size) |
amutake | 0:a436e2063a3d | 200 | { |
amutake | 0:a436e2063a3d | 201 | sources = srcs; |
amutake | 0:a436e2063a3d | 202 | sources_size = srcs_size; |
amutake | 0:a436e2063a3d | 203 | index = 0; |
amutake | 0:a436e2063a3d | 204 | } |
amutake | 0:a436e2063a3d | 205 | |
amutake | 0:a436e2063a3d | 206 | button_t SequentialFlow::await() |
amutake | 0:a436e2063a3d | 207 | { |
amutake | 0:a436e2063a3d | 208 | if (index >= sources_size) { |
amutake | 0:a436e2063a3d | 209 | return 0; |
amutake | 0:a436e2063a3d | 210 | } |
amutake | 0:a436e2063a3d | 211 | |
amutake | 0:a436e2063a3d | 212 | // FIXME |
amutake | 0:a436e2063a3d | 213 | // while(sources[index]->is_finished()) { |
amutake | 0:a436e2063a3d | 214 | // index++; |
amutake | 0:a436e2063a3d | 215 | if (sources[index]->is_finished()) { |
amutake | 0:a436e2063a3d | 216 | index++; |
amutake | 0:a436e2063a3d | 217 | if (index >= sources_size) { |
amutake | 0:a436e2063a3d | 218 | return 0; |
amutake | 0:a436e2063a3d | 219 | } |
amutake | 0:a436e2063a3d | 220 | } |
amutake | 0:a436e2063a3d | 221 | |
amutake | 0:a436e2063a3d | 222 | return sources[index]->await(); |
amutake | 0:a436e2063a3d | 223 | } |
amutake | 0:a436e2063a3d | 224 | |
amutake | 0:a436e2063a3d | 225 | bool SequentialFlow::is_finished() |
amutake | 0:a436e2063a3d | 226 | { |
amutake | 0:a436e2063a3d | 227 | return index >= sources_size; |
amutake | 0:a436e2063a3d | 228 | } |
amutake | 0:a436e2063a3d | 229 | |
amutake | 0:a436e2063a3d | 230 | void SequentialFlow::reset() |
amutake | 0:a436e2063a3d | 231 | { |
amutake | 0:a436e2063a3d | 232 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 233 | sources[i]->reset(); |
amutake | 0:a436e2063a3d | 234 | } |
amutake | 0:a436e2063a3d | 235 | index = 0; |
amutake | 0:a436e2063a3d | 236 | } |
amutake | 0:a436e2063a3d | 237 | |
amutake | 0:a436e2063a3d | 238 | // ------------ |
amutake | 0:a436e2063a3d | 239 | // RepeaterFlow |
amutake | 0:a436e2063a3d | 240 | // ------------ |
amutake | 0:a436e2063a3d | 241 | RepeaterFlow::RepeaterFlow(Producer* src) |
amutake | 0:a436e2063a3d | 242 | { |
amutake | 0:a436e2063a3d | 243 | source = src; |
amutake | 0:a436e2063a3d | 244 | } |
amutake | 0:a436e2063a3d | 245 | |
amutake | 0:a436e2063a3d | 246 | button_t RepeaterFlow::await() |
amutake | 0:a436e2063a3d | 247 | { |
amutake | 0:a436e2063a3d | 248 | if (source->is_finished()) { |
amutake | 0:a436e2063a3d | 249 | source->reset(); |
amutake | 0:a436e2063a3d | 250 | } |
amutake | 0:a436e2063a3d | 251 | return source->await(); |
amutake | 0:a436e2063a3d | 252 | } |
amutake | 0:a436e2063a3d | 253 | |
amutake | 0:a436e2063a3d | 254 | bool RepeaterFlow::is_finished() |
amutake | 0:a436e2063a3d | 255 | { |
amutake | 0:a436e2063a3d | 256 | return false; |
amutake | 0:a436e2063a3d | 257 | } |
amutake | 0:a436e2063a3d | 258 | |
amutake | 0:a436e2063a3d | 259 | void RepeaterFlow::reset() |
amutake | 0:a436e2063a3d | 260 | { |
amutake | 0:a436e2063a3d | 261 | source->reset(); |
amutake | 0:a436e2063a3d | 262 | } |
amutake | 0:a436e2063a3d | 263 | |
amutake | 0:a436e2063a3d | 264 | // ------------ |
amutake | 0:a436e2063a3d | 265 | // ExpanderFlow |
amutake | 0:a436e2063a3d | 266 | // ------------ |
amutake | 0:a436e2063a3d | 267 | ExpanderFlow::ExpanderFlow(Producer* src, int n) |
amutake | 0:a436e2063a3d | 268 | { |
amutake | 0:a436e2063a3d | 269 | source = src; |
amutake | 0:a436e2063a3d | 270 | n_times = n; |
amutake | 0:a436e2063a3d | 271 | counter = 0; |
amutake | 0:a436e2063a3d | 272 | now = 0; |
amutake | 0:a436e2063a3d | 273 | finished = false; |
amutake | 0:a436e2063a3d | 274 | } |
amutake | 0:a436e2063a3d | 275 | |
amutake | 0:a436e2063a3d | 276 | button_t ExpanderFlow::await() |
amutake | 0:a436e2063a3d | 277 | { |
amutake | 0:a436e2063a3d | 278 | // already finished |
amutake | 0:a436e2063a3d | 279 | if (finished) { |
amutake | 0:a436e2063a3d | 280 | return 0; |
amutake | 0:a436e2063a3d | 281 | } |
amutake | 0:a436e2063a3d | 282 | |
amutake | 0:a436e2063a3d | 283 | // else, switch by counter |
amutake | 0:a436e2063a3d | 284 | if (counter == 0) { |
amutake | 0:a436e2063a3d | 285 | finished = source->is_finished(); |
amutake | 0:a436e2063a3d | 286 | if (!finished) { |
amutake | 0:a436e2063a3d | 287 | now = source->await(); |
amutake | 0:a436e2063a3d | 288 | counter++; |
amutake | 0:a436e2063a3d | 289 | } else { |
amutake | 0:a436e2063a3d | 290 | now = 0; |
amutake | 0:a436e2063a3d | 291 | } |
amutake | 0:a436e2063a3d | 292 | } else if (counter < n_times) { |
amutake | 0:a436e2063a3d | 293 | counter++; |
amutake | 0:a436e2063a3d | 294 | } else { // counter >= n_times |
amutake | 0:a436e2063a3d | 295 | counter = 0; |
amutake | 0:a436e2063a3d | 296 | } |
amutake | 0:a436e2063a3d | 297 | return now; |
amutake | 0:a436e2063a3d | 298 | } |
amutake | 0:a436e2063a3d | 299 | |
amutake | 0:a436e2063a3d | 300 | bool ExpanderFlow::is_finished() |
amutake | 0:a436e2063a3d | 301 | { |
amutake | 0:a436e2063a3d | 302 | return finished; |
amutake | 0:a436e2063a3d | 303 | } |
amutake | 0:a436e2063a3d | 304 | |
amutake | 0:a436e2063a3d | 305 | void ExpanderFlow::reset() |
amutake | 0:a436e2063a3d | 306 | { |
amutake | 0:a436e2063a3d | 307 | counter = 0; |
amutake | 0:a436e2063a3d | 308 | now = 0; |
amutake | 0:a436e2063a3d | 309 | source->reset(); |
amutake | 0:a436e2063a3d | 310 | finished = false; |
amutake | 0:a436e2063a3d | 311 | } |