Frame Level Language for controlling DUALSHOCK2

Dependents:   koibumi2000

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?

UserRevisionLine numberNew 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 }