Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
amutake
Date:
Mon Feb 16 18:06:40 2015 +0000
Revision:
26:08387521c994
Parent:
17:69536d02cb3c
Child:
33:cc84b10e6c67
Use p20 to reset the sink

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