Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
amutake
Date:
Sat Feb 14 16:51:25 2015 +0000
Revision:
8:d16a0fcc2735
Parent:
7:61b4825304e2
Child:
9:0d6631edfc32
fll_run

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amutake 0:c80e972b4c59 1 // Frame Level Language
amutake 0:c80e972b4c59 2 // implementation
amutake 0:c80e972b4c59 3
amutake 0:c80e972b4c59 4 #include "mbed.h"
amutake 0:c80e972b4c59 5 #include "rtos.h"
amutake 0:c80e972b4c59 6 #include <stdint.h>
amutake 0:c80e972b4c59 7 #include "fll.h"
amutake 0:c80e972b4c59 8
amutake 7:61b4825304e2 9 // if you want to debug by `printf`, uncomment next line and put `pc.printf("...", ...);` into certain position.
amutake 7:61b4825304e2 10 // Serial pc(USBTX, USBRX);
sierra 1:1abcd83947bf 11
amutake 7:61b4825304e2 12 // --------------
sierra 6:d0348b7a2f05 13 // RepeaterSource
amutake 7:61b4825304e2 14 // --------------
sierra 6:d0348b7a2f05 15 RepeaterSource::RepeaterSource(button_t *bs, int s)
amutake 0:c80e972b4c59 16 {
sierra 6:d0348b7a2f05 17 button_seq = bs;
sierra 1:1abcd83947bf 18 size = s;
amutake 0:c80e972b4c59 19 i = 0;
amutake 0:c80e972b4c59 20 }
amutake 0:c80e972b4c59 21
sierra 6:d0348b7a2f05 22 button_t RepeaterSource::await()
amutake 0:c80e972b4c59 23 {
sierra 6:d0348b7a2f05 24 if(size == 0) {
amutake 0:c80e972b4c59 25 return 0;
sierra 6:d0348b7a2f05 26 } else if(size <= i) {
sierra 6:d0348b7a2f05 27 i = 0;
sierra 3:edbf31a8589f 28 }
sierra 6:d0348b7a2f05 29 return button_seq[i++];
amutake 0:c80e972b4c59 30 }
amutake 0:c80e972b4c59 31
amutake 7:61b4825304e2 32 // --------
sierra 6:d0348b7a2f05 33 // FoldFlow
amutake 7:61b4825304e2 34 // --------
sierra 6:d0348b7a2f05 35 FoldFlow::FoldFlow(Producer **srcs, int srcs_size) {
sierra 5:130721ce29f7 36 sources = srcs;
sierra 5:130721ce29f7 37 sources_size = srcs_size;
sierra 5:130721ce29f7 38 }
sierra 5:130721ce29f7 39
sierra 6:d0348b7a2f05 40 button_t FoldFlow::await()
amutake 0:c80e972b4c59 41 {
sierra 5:130721ce29f7 42 button_t *bs = (button_t*) malloc(sizeof(button_t) * sources_size);
sierra 5:130721ce29f7 43 for (int i = 0; i < sources_size; i++) {
sierra 5:130721ce29f7 44 bs[i] = sources[i]->await();
amutake 0:c80e972b4c59 45 }
sierra 5:130721ce29f7 46 button_t b = fold(bs, sources_size);
sierra 5:130721ce29f7 47 free(bs);
sierra 5:130721ce29f7 48 return b;
amutake 0:c80e972b4c59 49 }
amutake 0:c80e972b4c59 50
amutake 0:c80e972b4c59 51
amutake 0:c80e972b4c59 52 // ----
amutake 0:c80e972b4c59 53 // Sink
amutake 0:c80e972b4c59 54 // ----
sierra 6:d0348b7a2f05 55 Sink::Sink(Producer* src, rtos::Mail<button_t, MAIL_BOX_SIZE>* box, Mutex* mut)
amutake 0:c80e972b4c59 56 {
amutake 0:c80e972b4c59 57 source = src;
amutake 2:165723d41023 58 mail_box = box;
amutake 2:165723d41023 59 mutex = mut;
amutake 0:c80e972b4c59 60 }
amutake 0:c80e972b4c59 61
amutake 0:c80e972b4c59 62 void Sink::run()
amutake 0:c80e972b4c59 63 {
sierra 3:edbf31a8589f 64 button_t *btn;
sierra 4:9ee673ca05ad 65 while(1) {
amutake 2:165723d41023 66 mutex->lock();
sierra 3:edbf31a8589f 67 btn = mail_box->alloc();
sierra 4:9ee673ca05ad 68 if(!btn) {
sierra 4:9ee673ca05ad 69 mutex->unlock();
sierra 4:9ee673ca05ad 70 continue;
sierra 4:9ee673ca05ad 71 }
sierra 1:1abcd83947bf 72 *btn = source->await();
amutake 2:165723d41023 73 mail_box->put(btn);
amutake 2:165723d41023 74 mutex->unlock();
amutake 0:c80e972b4c59 75 }
amutake 0:c80e972b4c59 76 }
amutake 0:c80e972b4c59 77
sierra 6:d0348b7a2f05 78 void Sink::reset(Producer* src)
amutake 0:c80e972b4c59 79 {
amutake 2:165723d41023 80 mutex->lock();
amutake 7:61b4825304e2 81 // consume current (and actually old) buffer
amutake 0:c80e972b4c59 82 osEvent e;
amutake 0:c80e972b4c59 83 do {
amutake 2:165723d41023 84 e = mail_box->get(0);
sierra 1:1abcd83947bf 85 if(e.status == osEventMail) {
sierra 3:edbf31a8589f 86 mail_box->free((button_t*)e.value.p);
sierra 1:1abcd83947bf 87 }
sierra 1:1abcd83947bf 88 } while (e.status == osEventMail);
amutake 7:61b4825304e2 89 // update source
amutake 0:c80e972b4c59 90 source = src;
amutake 2:165723d41023 91 mutex->unlock();
amutake 0:c80e972b4c59 92 }
amutake 0:c80e972b4c59 93
amutake 0:c80e972b4c59 94 // ------
amutake 0:c80e972b4c59 95 // Output
amutake 0:c80e972b4c59 96 // ------
sierra 3:edbf31a8589f 97 Output::Output(rtos::Mail<button_t, MAIL_BOX_SIZE>* box)
amutake 0:c80e972b4c59 98 {
amutake 2:165723d41023 99 mail_box = box;
amutake 0:c80e972b4c59 100 }
amutake 0:c80e972b4c59 101
amutake 0:c80e972b4c59 102 void Output::run()
amutake 0:c80e972b4c59 103 {
amutake 2:165723d41023 104 osEvent e = mail_box->get(0);
amutake 7:61b4825304e2 105 if (e.status == osEventMail) { // getting is success
sierra 3:edbf31a8589f 106 button_t b = *(button_t*)(e.value.p);
sierra 3:edbf31a8589f 107 mail_box->free((button_t*)e.value.p);
amutake 0:c80e972b4c59 108 press(b);
amutake 0:c80e972b4c59 109 } else {
amutake 7:61b4825304e2 110 press(0); // if mail box is empty
amutake 0:c80e972b4c59 111 }
amutake 0:c80e972b4c59 112 }
amutake 0:c80e972b4c59 113
amutake 7:61b4825304e2 114 // --------------------
amutake 7:61b4825304e2 115 // button_t -> mbed pin
amutake 7:61b4825304e2 116 // --------------------
amutake 0:c80e972b4c59 117 typedef struct _table {
sierra 3:edbf31a8589f 118 button_t mask; // 0000 0000 0000 0001 ~ 0010 0000 0000 0000
amutake 0:c80e972b4c59 119 DigitalOut *pin; // pin5~pin19
amutake 0:c80e972b4c59 120 int on; // 1 or 0
amutake 0:c80e972b4c59 121 } table;
amutake 0:c80e972b4c59 122
amutake 0:c80e972b4c59 123 DigitalOut pinR2(p10);
amutake 0:c80e972b4c59 124 DigitalOut pinR1(p5);
amutake 0:c80e972b4c59 125 DigitalOut pinTriangle(p6);
amutake 0:c80e972b4c59 126 DigitalOut pinCircle(p7);
amutake 0:c80e972b4c59 127 DigitalOut pinCross(p8);
amutake 0:c80e972b4c59 128 DigitalOut pinSquare(p9);
amutake 0:c80e972b4c59 129 DigitalOut pinStart(p11);
amutake 0:c80e972b4c59 130 DigitalOut pinAnalog(p12);
amutake 0:c80e972b4c59 131 DigitalOut pinSelect(p13);
amutake 0:c80e972b4c59 132 DigitalOut pinRight(p18);
amutake 0:c80e972b4c59 133 DigitalOut pinDown(p16);
amutake 0:c80e972b4c59 134 DigitalOut pinLeft(p17);
amutake 0:c80e972b4c59 135 DigitalOut pinUp(p15);
amutake 0:c80e972b4c59 136 DigitalOut pinL1(p19);
amutake 0:c80e972b4c59 137 DigitalOut pinL2(p14);
amutake 0:c80e972b4c59 138
amutake 7:61b4825304e2 139 // button-pin mapping table
amutake 0:c80e972b4c59 140 table tables[] = {
amutake 0:c80e972b4c59 141 { R1, &pinR1, 0 },
amutake 7:61b4825304e2 142 { TRIANGLE, &pinTriangle, 0 },
amutake 7:61b4825304e2 143 { CIRCLE, &pinCircle, 0 },
amutake 7:61b4825304e2 144 { CROSS, &pinCross, 0 },
amutake 7:61b4825304e2 145 { SQUARE, &pinSquare, 0 },
amutake 7:61b4825304e2 146 { R2, &pinR2, 0 },
amutake 7:61b4825304e2 147 { START, &pinStart, 0 },
amutake 7:61b4825304e2 148 { ANALOG, &pinAnalog, 0 },
amutake 7:61b4825304e2 149 { SELECT, &pinSelect, 0 },
amutake 7:61b4825304e2 150 { L2, &pinL2, 0 },
amutake 7:61b4825304e2 151 { UP, &pinUp, 0 },
amutake 7:61b4825304e2 152 { DOWN, &pinDown, 0 },
amutake 7:61b4825304e2 153 { LEFT, &pinLeft, 0 },
amutake 7:61b4825304e2 154 { RIGHT, &pinRight, 0 },
amutake 7:61b4825304e2 155 { L1, &pinL1, 0 }
amutake 0:c80e972b4c59 156 };
amutake 0:c80e972b4c59 157
sierra 3:edbf31a8589f 158 void press(button_t btn)
amutake 0:c80e972b4c59 159 {
sierra 3:edbf31a8589f 160 table t;
amutake 0:c80e972b4c59 161 for (int i = 0; i < sizeof(tables)/sizeof(table); i++) {
sierra 3:edbf31a8589f 162 t = tables[i];
amutake 0:c80e972b4c59 163 if (btn & t.mask) {
amutake 0:c80e972b4c59 164 t.pin->write(t.on);
amutake 0:c80e972b4c59 165 } else {
amutake 0:c80e972b4c59 166 t.pin->write(1 - t.on);
amutake 0:c80e972b4c59 167 }
amutake 0:c80e972b4c59 168 }
amutake 0:c80e972b4c59 169 }
amutake 8:d16a0fcc2735 170
amutake 8:d16a0fcc2735 171 // ----
amutake 8:d16a0fcc2735 172 // main
amutake 8:d16a0fcc2735 173 // ----
amutake 8:d16a0fcc2735 174 void invoke_sinkrun(const void *p) {
amutake 8:d16a0fcc2735 175 ((Sink*)p)->run();
amutake 8:d16a0fcc2735 176 }
amutake 8:d16a0fcc2735 177
amutake 8:d16a0fcc2735 178 void fll_run(Producer* producer) {
amutake 8:d16a0fcc2735 179 Mail<button_t, MAIL_BOX_SIZE>* mail_box = new Mail<button_t, MAIL_BOX_SIZE>();
amutake 8:d16a0fcc2735 180 Mutex* mutex = new Mutex();
amutake 8:d16a0fcc2735 181
amutake 8:d16a0fcc2735 182 Sink* sink = new Sink(producer, mail_box, mutex);
amutake 8:d16a0fcc2735 183
amutake 8:d16a0fcc2735 184 Ticker ticker;
amutake 8:d16a0fcc2735 185 Output* output = new Output(mail_box);
amutake 8:d16a0fcc2735 186
amutake 8:d16a0fcc2735 187 Thread th(invoke_sinkrun, (void *)sink);
amutake 8:d16a0fcc2735 188 ticker.attach(output, &Output::run, FRAME);
amutake 8:d16a0fcc2735 189
amutake 8:d16a0fcc2735 190 Thread::wait(osWaitForever);
amutake 8:d16a0fcc2735 191 }