Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
sierra
Date:
Tue Feb 17 03:22:36 2015 +0000
Revision:
33:cc84b10e6c67
Parent:
26:08387521c994
Parent:
32:fdf9f6fca8a2
Child:
34:422d4d6ae5ea
Merged

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
sierra 32:fdf9f6fca8a2 10 void invoke_sinkrun(const void *p);
sierra 32:fdf9f6fca8a2 11
amutake 7:61b4825304e2 12 // if you want to debug by `printf`, uncomment next line and put `pc.printf("...", ...);` into certain position.
amutake 7:61b4825304e2 13 // Serial pc(USBTX, USBRX);
sierra 1:1abcd83947bf 14
amutake 0:c80e972b4c59 15 // ----
amutake 0:c80e972b4c59 16 // Sink
amutake 0:c80e972b4c59 17 // ----
sierra 6:d0348b7a2f05 18 Sink::Sink(Producer* src, rtos::Mail<button_t, MAIL_BOX_SIZE>* box, Mutex* mut)
amutake 0:c80e972b4c59 19 {
amutake 0:c80e972b4c59 20 source = src;
amutake 2:165723d41023 21 mail_box = box;
amutake 2:165723d41023 22 mutex = mut;
amutake 0:c80e972b4c59 23 }
amutake 0:c80e972b4c59 24
amutake 0:c80e972b4c59 25 void Sink::run()
amutake 0:c80e972b4c59 26 {
sierra 3:edbf31a8589f 27 button_t *btn;
sierra 4:9ee673ca05ad 28 while(1) {
amutake 2:165723d41023 29 mutex->lock();
sierra 3:edbf31a8589f 30 btn = mail_box->alloc();
sierra 4:9ee673ca05ad 31 if(!btn) {
sierra 4:9ee673ca05ad 32 mutex->unlock();
sierra 4:9ee673ca05ad 33 continue;
sierra 4:9ee673ca05ad 34 }
sierra 1:1abcd83947bf 35 *btn = source->await();
amutake 2:165723d41023 36 mail_box->put(btn);
amutake 2:165723d41023 37 mutex->unlock();
amutake 0:c80e972b4c59 38 }
amutake 0:c80e972b4c59 39 }
amutake 0:c80e972b4c59 40
amutake 26:08387521c994 41 void Sink::reset()
amutake 26:08387521c994 42 {
amutake 26:08387521c994 43 mutex->lock();
amutake 26:08387521c994 44 osEvent e;
amutake 26:08387521c994 45 do {
amutake 26:08387521c994 46 e = mail_box->get(0);
amutake 26:08387521c994 47 if(e.status == osEventMail) {
amutake 26:08387521c994 48 mail_box->free((button_t*)e.value.p);
amutake 26:08387521c994 49 }
amutake 26:08387521c994 50 } while (e.status == osEventMail);
amutake 26:08387521c994 51 // reset source
amutake 26:08387521c994 52 source->reset();
amutake 26:08387521c994 53 mutex->unlock();
amutake 26:08387521c994 54 }
amutake 26:08387521c994 55
sierra 6:d0348b7a2f05 56 void Sink::reset(Producer* src)
amutake 0:c80e972b4c59 57 {
amutake 2:165723d41023 58 mutex->lock();
amutake 7:61b4825304e2 59 // consume current (and actually old) buffer
amutake 0:c80e972b4c59 60 osEvent e;
amutake 0:c80e972b4c59 61 do {
amutake 2:165723d41023 62 e = mail_box->get(0);
sierra 1:1abcd83947bf 63 if(e.status == osEventMail) {
sierra 3:edbf31a8589f 64 mail_box->free((button_t*)e.value.p);
sierra 1:1abcd83947bf 65 }
sierra 1:1abcd83947bf 66 } while (e.status == osEventMail);
amutake 7:61b4825304e2 67 // update source
amutake 0:c80e972b4c59 68 source = src;
amutake 2:165723d41023 69 mutex->unlock();
amutake 0:c80e972b4c59 70 }
amutake 0:c80e972b4c59 71
amutake 0:c80e972b4c59 72 // ------
amutake 0:c80e972b4c59 73 // Output
amutake 0:c80e972b4c59 74 // ------
sierra 32:fdf9f6fca8a2 75 Output::Output(rtos::Mail<button_t, MAIL_BOX_SIZE>* box, FLL *f)
amutake 0:c80e972b4c59 76 {
amutake 2:165723d41023 77 mail_box = box;
sierra 32:fdf9f6fca8a2 78 fll = f;
amutake 0:c80e972b4c59 79 }
amutake 0:c80e972b4c59 80
amutake 0:c80e972b4c59 81 void Output::run()
amutake 0:c80e972b4c59 82 {
amutake 2:165723d41023 83 osEvent e = mail_box->get(0);
amutake 17:69536d02cb3c 84 if (e.status == osEventMail) { // getting is success
sierra 3:edbf31a8589f 85 button_t b = *(button_t*)(e.value.p);
sierra 3:edbf31a8589f 86 mail_box->free((button_t*)e.value.p);
sierra 32:fdf9f6fca8a2 87 fll->press(b);
amutake 0:c80e972b4c59 88 } else {
sierra 32:fdf9f6fca8a2 89 fll->press(0); // if mail box is empty
amutake 0:c80e972b4c59 90 }
amutake 0:c80e972b4c59 91 }
amutake 0:c80e972b4c59 92
sierra 32:fdf9f6fca8a2 93 FLL::FLL(Producer* p)
sierra 32:fdf9f6fca8a2 94 {
sierra 32:fdf9f6fca8a2 95 producer = p;
sierra 32:fdf9f6fca8a2 96
sierra 32:fdf9f6fca8a2 97 // button_no -> pin (R1 to L1)
sierra 32:fdf9f6fca8a2 98 PinName ps[] = {
sierra 32:fdf9f6fca8a2 99 p10, p5, p6, p7, p8, p9,
sierra 32:fdf9f6fca8a2 100 p11, p12, p13, p18, p16, p17, p15,
sierra 32:fdf9f6fca8a2 101 p19, p14,
sierra 32:fdf9f6fca8a2 102 };
sierra 32:fdf9f6fca8a2 103
sierra 32:fdf9f6fca8a2 104 for(int i = 0; i < BUTTON_NUM; i++) {
sierra 32:fdf9f6fca8a2 105 off[i] = new int(1);
sierra 32:fdf9f6fca8a2 106 pin[i] = new DigitalOut(ps[i], *off[i]);
sierra 32:fdf9f6fca8a2 107 }
sierra 32:fdf9f6fca8a2 108 }
amutake 0:c80e972b4c59 109
sierra 32:fdf9f6fca8a2 110 FLL::~FLL()
sierra 32:fdf9f6fca8a2 111 {
sierra 32:fdf9f6fca8a2 112 for(int i = 0; i < BUTTON_NUM; i++) {
sierra 32:fdf9f6fca8a2 113 delete off[i];
sierra 32:fdf9f6fca8a2 114 delete pin[i];
sierra 32:fdf9f6fca8a2 115 }
sierra 32:fdf9f6fca8a2 116 }
amutake 0:c80e972b4c59 117
amutake 7:61b4825304e2 118 // button-pin mapping table
sierra 32:fdf9f6fca8a2 119 void FLL::press(button_t btn)
amutake 0:c80e972b4c59 120 {
sierra 32:fdf9f6fca8a2 121 for(int i = 0; i < BUTTON_NUM; i++) {
sierra 32:fdf9f6fca8a2 122 if ((btn >> i) & 0x1) {
sierra 32:fdf9f6fca8a2 123 pin[i]->write(!(*off[i]));
amutake 0:c80e972b4c59 124 } else {
sierra 32:fdf9f6fca8a2 125 pin[i]->write(*off[i]);
amutake 0:c80e972b4c59 126 }
amutake 0:c80e972b4c59 127 }
amutake 0:c80e972b4c59 128 }
amutake 8:d16a0fcc2735 129
sierra 32:fdf9f6fca8a2 130 void FLL::run()
amutake 17:69536d02cb3c 131 {
amutake 8:d16a0fcc2735 132 Mail<button_t, MAIL_BOX_SIZE>* mail_box = new Mail<button_t, MAIL_BOX_SIZE>();
amutake 8:d16a0fcc2735 133 Mutex* mutex = new Mutex();
amutake 8:d16a0fcc2735 134
amutake 8:d16a0fcc2735 135 Sink* sink = new Sink(producer, mail_box, mutex);
amutake 26:08387521c994 136 InterruptIn reset_pin(p20);
amutake 26:08387521c994 137 reset_pin.fall(sink, &Sink::reset);
amutake 8:d16a0fcc2735 138
amutake 8:d16a0fcc2735 139 Ticker ticker;
sierra 32:fdf9f6fca8a2 140 Output* output = new Output(mail_box, this);
amutake 8:d16a0fcc2735 141
amutake 8:d16a0fcc2735 142 Thread th(invoke_sinkrun, (void *)sink);
amutake 8:d16a0fcc2735 143 ticker.attach(output, &Output::run, FRAME);
amutake 8:d16a0fcc2735 144
amutake 8:d16a0fcc2735 145 Thread::wait(osWaitForever);
sierra 32:fdf9f6fca8a2 146 }
sierra 32:fdf9f6fca8a2 147
sierra 32:fdf9f6fca8a2 148 static void invoke_sinkrun(const void *p)
sierra 32:fdf9f6fca8a2 149 {
sierra 32:fdf9f6fca8a2 150 ((Sink*)p)->run();
amutake 8:d16a0fcc2735 151 }