Frame Level Language for controlling DUALSHOCK2

Dependents:   koibumi2000

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?

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