Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
sierra
Date:
Tue Feb 17 00:17:59 2015 +0000
Revision:
31:2dbed2eea0f2
Parent:
17:69536d02cb3c
Child:
32:fdf9f6fca8a2
rename 'fll_producers.cpp/h' to 'fllaux.cpp/h' (fll auxiliary)

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