Frame Level Language for controlling DUALSHOCK2
Diff: fllaux.h
- Revision:
- 0:a436e2063a3d
- Child:
- 1:905fe1a0ca5a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fllaux.h Thu Feb 19 06:59:49 2015 +0000 @@ -0,0 +1,150 @@ +// utility producers + +#pragma once + +#include "fll.h" + +// ------- +// Sources +// ------- +// `Source` is a 0 input producer + +// yields given button sequence exactly once +class OnetimeSource : public Producer +{ +private: + int i; + button_t* button_seq; + int size; +public: + OnetimeSource(button_t *bs, int s); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +// 0 input and infinitely yields given button sequence +class RepeaterSource : public Producer +{ +private: + int i; + button_t* button_seq; + int size; +public: + RepeaterSource(button_t *bs, int s); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +typedef struct _button_time { + button_t button; + float sec; +} button_time; // TODO: rename + +// human friendly source +class EasySource : public Producer +{ +private: + button_time* bt_seq; + int bt_size; + int index; + int frame_i; + float lag; +public: + EasySource(button_time* seq, int size); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +// ----- +// Flows +// ----- +// `Flow` is a N inputs producer + +// abstract class for N inputs producer +class FoldFlow : public Producer +{ +private: + Producer** sources; + int sources_size; +public: + FoldFlow(Producer **srcs, int srcs_size); + virtual button_t fold(button_t *bs, int bs_size) = 0; + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +// merge N streams +// Example: +// [ Up, Right, Down, ... ] +// +--- MergeFlow ---> [ Up|Circle, Right, Down|Triangle, Up, Right|Circle, ... ] +// [ Circle, none, Triangle, none, ... ] +class MergeFlow : public FoldFlow +{ +public: + MergeFlow(Producer **srcs, int srcs_size) : FoldFlow(srcs, srcs_size) {} + virtual button_t fold(button_t *bs, int bs_size); +}; + +// 1 input, 1 output +// delay input source +class DelayFlow : public Producer +{ +private: + Producer* source; + float delay; // sec + float passing; + bool end; +public: + DelayFlow(Producer *src, float d); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +// use sources sequentially +class SequentialFlow : public Producer +{ +private: + Producer** sources; + int sources_size; + int index; +public: + SequentialFlow(Producer **srcs, int srcs_size); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +// 1 input, 1 output +// repeats upstream +class RepeaterFlow : public Producer +{ +private: + Producer* source; +public: + RepeaterFlow(Producer *src); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; + +// 1 input, 1 output +// expands upstream N times +class ExpanderFlow : public Producer +{ +private: + Producer* source; + int n_times; + int counter; + button_t now; + bool finished; +public: + ExpanderFlow(Producer* src, int n); + virtual button_t await(); + virtual bool is_finished(); + virtual void reset(); +}; \ No newline at end of file