Frame Level Language for controlling DUALSHOCK2
fllaux.cpp@1:905fe1a0ca5a, 2015-02-19 (annotated)
- Committer:
- amutake
- Date:
- Thu Feb 19 13:47:15 2015 +0000
- Revision:
- 1:905fe1a0ca5a
- Parent:
- 0:a436e2063a3d
Change logic of EasySource
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 | 1:905fe1a0ca5a | 68 | button_time single(button_t btn) |
amutake | 1:905fe1a0ca5a | 69 | { |
amutake | 1:905fe1a0ca5a | 70 | button_time bt = { btn, FRAME * 2 }; |
amutake | 1:905fe1a0ca5a | 71 | return bt; |
amutake | 1:905fe1a0ca5a | 72 | } |
amutake | 1:905fe1a0ca5a | 73 | |
amutake | 1:905fe1a0ca5a | 74 | button_time hold(button_t btn, float sec) |
amutake | 1:905fe1a0ca5a | 75 | { |
amutake | 1:905fe1a0ca5a | 76 | button_time bt = { btn, sec }; |
amutake | 1:905fe1a0ca5a | 77 | return bt; |
amutake | 1:905fe1a0ca5a | 78 | } |
amutake | 1:905fe1a0ca5a | 79 | |
amutake | 1:905fe1a0ca5a | 80 | button_time space(float sec) |
amutake | 1:905fe1a0ca5a | 81 | { |
amutake | 1:905fe1a0ca5a | 82 | button_time bt = { 0, sec }; |
amutake | 1:905fe1a0ca5a | 83 | return bt; |
amutake | 1:905fe1a0ca5a | 84 | } |
amutake | 1:905fe1a0ca5a | 85 | |
amutake | 0:a436e2063a3d | 86 | EasySource::EasySource(button_time* seq, int size) |
amutake | 0:a436e2063a3d | 87 | { |
amutake | 0:a436e2063a3d | 88 | bt_seq = seq; |
amutake | 0:a436e2063a3d | 89 | bt_size = size; |
amutake | 0:a436e2063a3d | 90 | index = 0; |
amutake | 0:a436e2063a3d | 91 | frame_i = 0; |
amutake | 1:905fe1a0ca5a | 92 | spacing = false; |
amutake | 1:905fe1a0ca5a | 93 | space_frame = 2; |
amutake | 1:905fe1a0ca5a | 94 | } |
amutake | 1:905fe1a0ca5a | 95 | |
amutake | 1:905fe1a0ca5a | 96 | EasySource::EasySource(button_time* seq, int size, int spacer) |
amutake | 1:905fe1a0ca5a | 97 | { |
amutake | 1:905fe1a0ca5a | 98 | bt_seq = seq; |
amutake | 1:905fe1a0ca5a | 99 | bt_size = size; |
amutake | 1:905fe1a0ca5a | 100 | index = 0; |
amutake | 1:905fe1a0ca5a | 101 | frame_i = 0; |
amutake | 1:905fe1a0ca5a | 102 | spacing = false; |
amutake | 1:905fe1a0ca5a | 103 | space_frame = spacer; |
amutake | 0:a436e2063a3d | 104 | } |
amutake | 0:a436e2063a3d | 105 | |
amutake | 0:a436e2063a3d | 106 | button_t EasySource::await() |
amutake | 0:a436e2063a3d | 107 | { |
amutake | 0:a436e2063a3d | 108 | if (index >= bt_size) { |
amutake | 0:a436e2063a3d | 109 | return 0; |
amutake | 0:a436e2063a3d | 110 | } |
amutake | 0:a436e2063a3d | 111 | |
amutake | 1:905fe1a0ca5a | 112 | if (spacing) { |
amutake | 1:905fe1a0ca5a | 113 | if (frame_i + 1 >= space_frame) { // final frame of spacer |
amutake | 1:905fe1a0ca5a | 114 | spacing = false; |
amutake | 1:905fe1a0ca5a | 115 | frame_i = 0; |
amutake | 1:905fe1a0ca5a | 116 | index++; |
amutake | 1:905fe1a0ca5a | 117 | } else { |
amutake | 1:905fe1a0ca5a | 118 | frame_i++; |
amutake | 1:905fe1a0ca5a | 119 | } |
amutake | 1:905fe1a0ca5a | 120 | return 0; |
amutake | 1:905fe1a0ca5a | 121 | } else { |
amutake | 1:905fe1a0ca5a | 122 | button_time bt = bt_seq[index]; |
amutake | 1:905fe1a0ca5a | 123 | float passing = frame_i * FRAME; // passing time since the begining of this note (sec) |
amutake | 0:a436e2063a3d | 124 | |
amutake | 1:905fe1a0ca5a | 125 | if (passing + FRAME >= bt.sec) { // final frame |
amutake | 1:905fe1a0ca5a | 126 | frame_i = 0; |
amutake | 1:905fe1a0ca5a | 127 | spacing = true; |
amutake | 1:905fe1a0ca5a | 128 | } else { |
amutake | 1:905fe1a0ca5a | 129 | frame_i++; |
amutake | 1:905fe1a0ca5a | 130 | } |
amutake | 1:905fe1a0ca5a | 131 | return bt.button; |
amutake | 0:a436e2063a3d | 132 | } |
amutake | 0:a436e2063a3d | 133 | } |
amutake | 0:a436e2063a3d | 134 | |
amutake | 0:a436e2063a3d | 135 | bool EasySource::is_finished() |
amutake | 0:a436e2063a3d | 136 | { |
amutake | 0:a436e2063a3d | 137 | return index >= bt_size; |
amutake | 0:a436e2063a3d | 138 | } |
amutake | 0:a436e2063a3d | 139 | |
amutake | 0:a436e2063a3d | 140 | void EasySource::reset() |
amutake | 0:a436e2063a3d | 141 | { |
amutake | 0:a436e2063a3d | 142 | index = 0; |
amutake | 0:a436e2063a3d | 143 | frame_i = 0; |
amutake | 1:905fe1a0ca5a | 144 | spacing = false; |
amutake | 0:a436e2063a3d | 145 | } |
amutake | 0:a436e2063a3d | 146 | |
amutake | 0:a436e2063a3d | 147 | // -------- |
amutake | 0:a436e2063a3d | 148 | // FoldFlow |
amutake | 0:a436e2063a3d | 149 | // -------- |
amutake | 0:a436e2063a3d | 150 | FoldFlow::FoldFlow(Producer **srcs, int srcs_size) |
amutake | 0:a436e2063a3d | 151 | { |
amutake | 0:a436e2063a3d | 152 | sources = srcs; |
amutake | 0:a436e2063a3d | 153 | sources_size = srcs_size; |
amutake | 0:a436e2063a3d | 154 | } |
amutake | 0:a436e2063a3d | 155 | |
amutake | 0:a436e2063a3d | 156 | button_t FoldFlow::await() |
amutake | 0:a436e2063a3d | 157 | { |
amutake | 0:a436e2063a3d | 158 | button_t *bs = (button_t*) malloc(sizeof(button_t) * sources_size); |
amutake | 0:a436e2063a3d | 159 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 160 | bs[i] = sources[i]->await(); |
amutake | 0:a436e2063a3d | 161 | } |
amutake | 0:a436e2063a3d | 162 | button_t b = fold(bs, sources_size); |
amutake | 0:a436e2063a3d | 163 | free(bs); |
amutake | 0:a436e2063a3d | 164 | return b; |
amutake | 0:a436e2063a3d | 165 | } |
amutake | 0:a436e2063a3d | 166 | |
amutake | 0:a436e2063a3d | 167 | bool FoldFlow::is_finished() |
amutake | 0:a436e2063a3d | 168 | { |
amutake | 0:a436e2063a3d | 169 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 170 | if (!sources[i]->is_finished()) { |
amutake | 0:a436e2063a3d | 171 | return false; |
amutake | 0:a436e2063a3d | 172 | } |
amutake | 0:a436e2063a3d | 173 | } |
amutake | 0:a436e2063a3d | 174 | return true; |
amutake | 0:a436e2063a3d | 175 | } |
amutake | 0:a436e2063a3d | 176 | |
amutake | 0:a436e2063a3d | 177 | void FoldFlow::reset() |
amutake | 0:a436e2063a3d | 178 | { |
amutake | 0:a436e2063a3d | 179 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 180 | sources[i]->reset(); |
amutake | 0:a436e2063a3d | 181 | } |
amutake | 0:a436e2063a3d | 182 | } |
amutake | 0:a436e2063a3d | 183 | |
amutake | 0:a436e2063a3d | 184 | // ---------- |
amutake | 0:a436e2063a3d | 185 | // MergeFlow |
amutake | 0:a436e2063a3d | 186 | // ---------- |
amutake | 0:a436e2063a3d | 187 | button_t MergeFlow::fold(button_t *bs, int bs_size) |
amutake | 0:a436e2063a3d | 188 | { |
amutake | 0:a436e2063a3d | 189 | button_t b = 0x00; |
amutake | 0:a436e2063a3d | 190 | for(int i = 0; i < bs_size; i++) { |
amutake | 0:a436e2063a3d | 191 | b |= bs[i]; |
amutake | 0:a436e2063a3d | 192 | } |
amutake | 0:a436e2063a3d | 193 | return b; |
amutake | 0:a436e2063a3d | 194 | } |
amutake | 0:a436e2063a3d | 195 | |
amutake | 0:a436e2063a3d | 196 | // --------- |
amutake | 0:a436e2063a3d | 197 | // DelayFlow |
amutake | 0:a436e2063a3d | 198 | // --------- |
amutake | 0:a436e2063a3d | 199 | DelayFlow::DelayFlow(Producer *src, float d) |
amutake | 0:a436e2063a3d | 200 | { |
amutake | 0:a436e2063a3d | 201 | source = src; |
amutake | 0:a436e2063a3d | 202 | delay = d; |
amutake | 0:a436e2063a3d | 203 | passing = 0; |
amutake | 0:a436e2063a3d | 204 | end = false; |
amutake | 0:a436e2063a3d | 205 | } |
amutake | 0:a436e2063a3d | 206 | |
amutake | 0:a436e2063a3d | 207 | button_t DelayFlow::await() |
amutake | 0:a436e2063a3d | 208 | { |
amutake | 0:a436e2063a3d | 209 | if (end) { |
amutake | 0:a436e2063a3d | 210 | return source->await(); |
amutake | 0:a436e2063a3d | 211 | } |
amutake | 0:a436e2063a3d | 212 | |
amutake | 0:a436e2063a3d | 213 | passing += FRAME; |
amutake | 0:a436e2063a3d | 214 | if (passing >= delay) { |
amutake | 0:a436e2063a3d | 215 | end = true; |
amutake | 0:a436e2063a3d | 216 | } |
amutake | 0:a436e2063a3d | 217 | return 0; |
amutake | 0:a436e2063a3d | 218 | } |
amutake | 0:a436e2063a3d | 219 | |
amutake | 0:a436e2063a3d | 220 | bool DelayFlow::is_finished() |
amutake | 0:a436e2063a3d | 221 | { |
amutake | 0:a436e2063a3d | 222 | return end && source->is_finished(); |
amutake | 0:a436e2063a3d | 223 | } |
amutake | 0:a436e2063a3d | 224 | |
amutake | 0:a436e2063a3d | 225 | void DelayFlow::reset() |
amutake | 0:a436e2063a3d | 226 | { |
amutake | 0:a436e2063a3d | 227 | source->reset(); |
amutake | 0:a436e2063a3d | 228 | passing = 0; |
amutake | 0:a436e2063a3d | 229 | end = false; |
amutake | 0:a436e2063a3d | 230 | } |
amutake | 0:a436e2063a3d | 231 | |
amutake | 0:a436e2063a3d | 232 | // -------------- |
amutake | 0:a436e2063a3d | 233 | // SequentialFlow |
amutake | 0:a436e2063a3d | 234 | // -------------- |
amutake | 0:a436e2063a3d | 235 | SequentialFlow::SequentialFlow(Producer **srcs, int srcs_size) |
amutake | 0:a436e2063a3d | 236 | { |
amutake | 0:a436e2063a3d | 237 | sources = srcs; |
amutake | 0:a436e2063a3d | 238 | sources_size = srcs_size; |
amutake | 0:a436e2063a3d | 239 | index = 0; |
amutake | 0:a436e2063a3d | 240 | } |
amutake | 0:a436e2063a3d | 241 | |
amutake | 0:a436e2063a3d | 242 | button_t SequentialFlow::await() |
amutake | 0:a436e2063a3d | 243 | { |
amutake | 0:a436e2063a3d | 244 | if (index >= sources_size) { |
amutake | 0:a436e2063a3d | 245 | return 0; |
amutake | 0:a436e2063a3d | 246 | } |
amutake | 0:a436e2063a3d | 247 | |
amutake | 0:a436e2063a3d | 248 | // FIXME |
amutake | 0:a436e2063a3d | 249 | // while(sources[index]->is_finished()) { |
amutake | 0:a436e2063a3d | 250 | // index++; |
amutake | 0:a436e2063a3d | 251 | if (sources[index]->is_finished()) { |
amutake | 0:a436e2063a3d | 252 | index++; |
amutake | 0:a436e2063a3d | 253 | if (index >= sources_size) { |
amutake | 0:a436e2063a3d | 254 | return 0; |
amutake | 0:a436e2063a3d | 255 | } |
amutake | 0:a436e2063a3d | 256 | } |
amutake | 0:a436e2063a3d | 257 | |
amutake | 0:a436e2063a3d | 258 | return sources[index]->await(); |
amutake | 0:a436e2063a3d | 259 | } |
amutake | 0:a436e2063a3d | 260 | |
amutake | 0:a436e2063a3d | 261 | bool SequentialFlow::is_finished() |
amutake | 0:a436e2063a3d | 262 | { |
amutake | 0:a436e2063a3d | 263 | return index >= sources_size; |
amutake | 0:a436e2063a3d | 264 | } |
amutake | 0:a436e2063a3d | 265 | |
amutake | 0:a436e2063a3d | 266 | void SequentialFlow::reset() |
amutake | 0:a436e2063a3d | 267 | { |
amutake | 0:a436e2063a3d | 268 | for (int i = 0; i < sources_size; i++) { |
amutake | 0:a436e2063a3d | 269 | sources[i]->reset(); |
amutake | 0:a436e2063a3d | 270 | } |
amutake | 0:a436e2063a3d | 271 | index = 0; |
amutake | 0:a436e2063a3d | 272 | } |
amutake | 0:a436e2063a3d | 273 | |
amutake | 0:a436e2063a3d | 274 | // ------------ |
amutake | 0:a436e2063a3d | 275 | // RepeaterFlow |
amutake | 0:a436e2063a3d | 276 | // ------------ |
amutake | 0:a436e2063a3d | 277 | RepeaterFlow::RepeaterFlow(Producer* src) |
amutake | 0:a436e2063a3d | 278 | { |
amutake | 0:a436e2063a3d | 279 | source = src; |
amutake | 0:a436e2063a3d | 280 | } |
amutake | 0:a436e2063a3d | 281 | |
amutake | 0:a436e2063a3d | 282 | button_t RepeaterFlow::await() |
amutake | 0:a436e2063a3d | 283 | { |
amutake | 0:a436e2063a3d | 284 | if (source->is_finished()) { |
amutake | 0:a436e2063a3d | 285 | source->reset(); |
amutake | 0:a436e2063a3d | 286 | } |
amutake | 0:a436e2063a3d | 287 | return source->await(); |
amutake | 0:a436e2063a3d | 288 | } |
amutake | 0:a436e2063a3d | 289 | |
amutake | 0:a436e2063a3d | 290 | bool RepeaterFlow::is_finished() |
amutake | 0:a436e2063a3d | 291 | { |
amutake | 0:a436e2063a3d | 292 | return false; |
amutake | 0:a436e2063a3d | 293 | } |
amutake | 0:a436e2063a3d | 294 | |
amutake | 0:a436e2063a3d | 295 | void RepeaterFlow::reset() |
amutake | 0:a436e2063a3d | 296 | { |
amutake | 0:a436e2063a3d | 297 | source->reset(); |
amutake | 0:a436e2063a3d | 298 | } |
amutake | 0:a436e2063a3d | 299 | |
amutake | 0:a436e2063a3d | 300 | // ------------ |
amutake | 0:a436e2063a3d | 301 | // ExpanderFlow |
amutake | 0:a436e2063a3d | 302 | // ------------ |
amutake | 0:a436e2063a3d | 303 | ExpanderFlow::ExpanderFlow(Producer* src, int n) |
amutake | 0:a436e2063a3d | 304 | { |
amutake | 0:a436e2063a3d | 305 | source = src; |
amutake | 0:a436e2063a3d | 306 | n_times = n; |
amutake | 0:a436e2063a3d | 307 | counter = 0; |
amutake | 0:a436e2063a3d | 308 | now = 0; |
amutake | 0:a436e2063a3d | 309 | finished = false; |
amutake | 0:a436e2063a3d | 310 | } |
amutake | 0:a436e2063a3d | 311 | |
amutake | 0:a436e2063a3d | 312 | button_t ExpanderFlow::await() |
amutake | 0:a436e2063a3d | 313 | { |
amutake | 0:a436e2063a3d | 314 | // already finished |
amutake | 0:a436e2063a3d | 315 | if (finished) { |
amutake | 0:a436e2063a3d | 316 | return 0; |
amutake | 0:a436e2063a3d | 317 | } |
amutake | 0:a436e2063a3d | 318 | |
amutake | 0:a436e2063a3d | 319 | // else, switch by counter |
amutake | 0:a436e2063a3d | 320 | if (counter == 0) { |
amutake | 0:a436e2063a3d | 321 | finished = source->is_finished(); |
amutake | 0:a436e2063a3d | 322 | if (!finished) { |
amutake | 0:a436e2063a3d | 323 | now = source->await(); |
amutake | 0:a436e2063a3d | 324 | counter++; |
amutake | 0:a436e2063a3d | 325 | } else { |
amutake | 0:a436e2063a3d | 326 | now = 0; |
amutake | 0:a436e2063a3d | 327 | } |
amutake | 0:a436e2063a3d | 328 | } else if (counter < n_times) { |
amutake | 0:a436e2063a3d | 329 | counter++; |
amutake | 0:a436e2063a3d | 330 | } else { // counter >= n_times |
amutake | 0:a436e2063a3d | 331 | counter = 0; |
amutake | 0:a436e2063a3d | 332 | } |
amutake | 0:a436e2063a3d | 333 | return now; |
amutake | 0:a436e2063a3d | 334 | } |
amutake | 0:a436e2063a3d | 335 | |
amutake | 0:a436e2063a3d | 336 | bool ExpanderFlow::is_finished() |
amutake | 0:a436e2063a3d | 337 | { |
amutake | 0:a436e2063a3d | 338 | return finished; |
amutake | 0:a436e2063a3d | 339 | } |
amutake | 0:a436e2063a3d | 340 | |
amutake | 0:a436e2063a3d | 341 | void ExpanderFlow::reset() |
amutake | 0:a436e2063a3d | 342 | { |
amutake | 0:a436e2063a3d | 343 | counter = 0; |
amutake | 0:a436e2063a3d | 344 | now = 0; |
amutake | 0:a436e2063a3d | 345 | source->reset(); |
amutake | 0:a436e2063a3d | 346 | finished = false; |
amutake | 0:a436e2063a3d | 347 | } |