Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
sierra
Date:
Tue Feb 17 06:28:32 2015 +0000
Revision:
34:422d4d6ae5ea
Parent:
33:cc84b10e6c67
Implement pause, resume, restart function by using joystick; ; Fix bug of DelayFlow::reset()

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;
sierra 34:422d4d6ae5ea 23 paused = true;
sierra 34:422d4d6ae5ea 24 temporary_size = 0;
sierra 34:422d4d6ae5ea 25
amutake 0:c80e972b4c59 26 }
amutake 0:c80e972b4c59 27
amutake 0:c80e972b4c59 28 void Sink::run()
amutake 0:c80e972b4c59 29 {
sierra 3:edbf31a8589f 30 button_t *btn;
sierra 4:9ee673ca05ad 31 while(1) {
sierra 34:422d4d6ae5ea 32 if (paused) {
sierra 34:422d4d6ae5ea 33 continue;
sierra 34:422d4d6ae5ea 34 }
amutake 2:165723d41023 35 mutex->lock();
sierra 3:edbf31a8589f 36 btn = mail_box->alloc();
sierra 4:9ee673ca05ad 37 if(!btn) {
sierra 4:9ee673ca05ad 38 mutex->unlock();
sierra 4:9ee673ca05ad 39 continue;
sierra 4:9ee673ca05ad 40 }
sierra 1:1abcd83947bf 41 *btn = source->await();
amutake 2:165723d41023 42 mail_box->put(btn);
amutake 2:165723d41023 43 mutex->unlock();
amutake 0:c80e972b4c59 44 }
amutake 0:c80e972b4c59 45 }
amutake 0:c80e972b4c59 46
sierra 34:422d4d6ae5ea 47 void Sink::resume()
sierra 34:422d4d6ae5ea 48 {
sierra 34:422d4d6ae5ea 49 if (!paused) {
sierra 34:422d4d6ae5ea 50 return;
sierra 34:422d4d6ae5ea 51 }
sierra 34:422d4d6ae5ea 52 button_t *btn;
sierra 34:422d4d6ae5ea 53 mutex->lock();
sierra 34:422d4d6ae5ea 54 for (int i = 0; i < temporary_size; i++) {
sierra 34:422d4d6ae5ea 55 btn = mail_box->alloc();
sierra 34:422d4d6ae5ea 56 *btn = temporary[i];
sierra 34:422d4d6ae5ea 57 mail_box->put(btn);
sierra 34:422d4d6ae5ea 58 }
sierra 34:422d4d6ae5ea 59 mutex->unlock();
sierra 34:422d4d6ae5ea 60 paused = false;
sierra 34:422d4d6ae5ea 61 }
sierra 34:422d4d6ae5ea 62
sierra 34:422d4d6ae5ea 63 void Sink::pause()
sierra 34:422d4d6ae5ea 64 {
sierra 34:422d4d6ae5ea 65 if (paused) {
sierra 34:422d4d6ae5ea 66 return;
sierra 34:422d4d6ae5ea 67 }
sierra 34:422d4d6ae5ea 68 paused = true;
sierra 34:422d4d6ae5ea 69 mutex->lock();
sierra 34:422d4d6ae5ea 70 osEvent e;
sierra 34:422d4d6ae5ea 71 int i = 0;
sierra 34:422d4d6ae5ea 72 do {
sierra 34:422d4d6ae5ea 73 e = mail_box->get(0);
sierra 34:422d4d6ae5ea 74 if(e.status == osEventMail) {
sierra 34:422d4d6ae5ea 75 mail_box->free((button_t*)e.value.p);
sierra 34:422d4d6ae5ea 76 temporary[i++] = *(button_t*)(e.value.p);
sierra 34:422d4d6ae5ea 77 }
sierra 34:422d4d6ae5ea 78 } while (e.status == osEventMail);
sierra 34:422d4d6ae5ea 79 temporary_size = i;
sierra 34:422d4d6ae5ea 80 mutex->unlock();
sierra 34:422d4d6ae5ea 81 }
sierra 34:422d4d6ae5ea 82
sierra 34:422d4d6ae5ea 83 void Sink::restart()
amutake 26:08387521c994 84 {
amutake 26:08387521c994 85 mutex->lock();
amutake 26:08387521c994 86 osEvent e;
amutake 26:08387521c994 87 do {
amutake 26:08387521c994 88 e = mail_box->get(0);
amutake 26:08387521c994 89 if(e.status == osEventMail) {
amutake 26:08387521c994 90 mail_box->free((button_t*)e.value.p);
amutake 26:08387521c994 91 }
amutake 26:08387521c994 92 } while (e.status == osEventMail);
amutake 26:08387521c994 93 // reset source
amutake 26:08387521c994 94 source->reset();
sierra 34:422d4d6ae5ea 95 temporary_size = 0;
amutake 26:08387521c994 96 mutex->unlock();
amutake 26:08387521c994 97 }
amutake 26:08387521c994 98
sierra 6:d0348b7a2f05 99 void Sink::reset(Producer* src)
amutake 0:c80e972b4c59 100 {
amutake 2:165723d41023 101 mutex->lock();
amutake 7:61b4825304e2 102 // consume current (and actually old) buffer
amutake 0:c80e972b4c59 103 osEvent e;
amutake 0:c80e972b4c59 104 do {
amutake 2:165723d41023 105 e = mail_box->get(0);
sierra 1:1abcd83947bf 106 if(e.status == osEventMail) {
sierra 3:edbf31a8589f 107 mail_box->free((button_t*)e.value.p);
sierra 1:1abcd83947bf 108 }
sierra 1:1abcd83947bf 109 } while (e.status == osEventMail);
amutake 7:61b4825304e2 110 // update source
amutake 0:c80e972b4c59 111 source = src;
amutake 2:165723d41023 112 mutex->unlock();
amutake 0:c80e972b4c59 113 }
amutake 0:c80e972b4c59 114
amutake 0:c80e972b4c59 115 // ------
amutake 0:c80e972b4c59 116 // Output
amutake 0:c80e972b4c59 117 // ------
sierra 32:fdf9f6fca8a2 118 Output::Output(rtos::Mail<button_t, MAIL_BOX_SIZE>* box, FLL *f)
amutake 0:c80e972b4c59 119 {
amutake 2:165723d41023 120 mail_box = box;
sierra 32:fdf9f6fca8a2 121 fll = f;
amutake 0:c80e972b4c59 122 }
amutake 0:c80e972b4c59 123
amutake 0:c80e972b4c59 124 void Output::run()
amutake 0:c80e972b4c59 125 {
amutake 2:165723d41023 126 osEvent e = mail_box->get(0);
amutake 17:69536d02cb3c 127 if (e.status == osEventMail) { // getting is success
sierra 3:edbf31a8589f 128 button_t b = *(button_t*)(e.value.p);
sierra 3:edbf31a8589f 129 mail_box->free((button_t*)e.value.p);
sierra 32:fdf9f6fca8a2 130 fll->press(b);
amutake 0:c80e972b4c59 131 } else {
sierra 32:fdf9f6fca8a2 132 fll->press(0); // if mail box is empty
amutake 0:c80e972b4c59 133 }
amutake 0:c80e972b4c59 134 }
amutake 0:c80e972b4c59 135
sierra 32:fdf9f6fca8a2 136 FLL::FLL(Producer* p)
sierra 32:fdf9f6fca8a2 137 {
sierra 32:fdf9f6fca8a2 138 producer = p;
sierra 34:422d4d6ae5ea 139
sierra 32:fdf9f6fca8a2 140 // button_no -> pin (R1 to L1)
sierra 32:fdf9f6fca8a2 141 PinName ps[] = {
sierra 34:422d4d6ae5ea 142 p5, p6, p7, p8, p9,
sierra 34:422d4d6ae5ea 143 p10, p11, p12, p13, p14, p15,
sierra 34:422d4d6ae5ea 144 p16, p17, p18, p19,
sierra 32:fdf9f6fca8a2 145 };
sierra 34:422d4d6ae5ea 146
sierra 32:fdf9f6fca8a2 147 for(int i = 0; i < BUTTON_NUM; i++) {
sierra 34:422d4d6ae5ea 148 off[i] = 1;
sierra 34:422d4d6ae5ea 149 pin[i] = new DigitalOut(ps[i], off[i]);
sierra 32:fdf9f6fca8a2 150 }
sierra 32:fdf9f6fca8a2 151 }
amutake 0:c80e972b4c59 152
sierra 32:fdf9f6fca8a2 153 FLL::~FLL()
sierra 32:fdf9f6fca8a2 154 {
sierra 32:fdf9f6fca8a2 155 for(int i = 0; i < BUTTON_NUM; i++) {
sierra 32:fdf9f6fca8a2 156 delete pin[i];
sierra 32:fdf9f6fca8a2 157 }
sierra 32:fdf9f6fca8a2 158 }
amutake 0:c80e972b4c59 159
sierra 32:fdf9f6fca8a2 160 void FLL::press(button_t btn)
amutake 0:c80e972b4c59 161 {
sierra 32:fdf9f6fca8a2 162 for(int i = 0; i < BUTTON_NUM; i++) {
sierra 32:fdf9f6fca8a2 163 if ((btn >> i) & 0x1) {
sierra 34:422d4d6ae5ea 164 pin[i]->write(!off[i]);
amutake 0:c80e972b4c59 165 } else {
sierra 34:422d4d6ae5ea 166 pin[i]->write(off[i]);
amutake 0:c80e972b4c59 167 }
amutake 0:c80e972b4c59 168 }
amutake 0:c80e972b4c59 169 }
amutake 8:d16a0fcc2735 170
sierra 32:fdf9f6fca8a2 171 void FLL::run()
amutake 17:69536d02cb3c 172 {
sierra 34:422d4d6ae5ea 173
amutake 8:d16a0fcc2735 174 Mail<button_t, MAIL_BOX_SIZE>* mail_box = new Mail<button_t, MAIL_BOX_SIZE>();
amutake 8:d16a0fcc2735 175 Mutex* mutex = new Mutex();
sierra 34:422d4d6ae5ea 176 Sink* sink = new Sink(producer, mail_box, mutex);
sierra 34:422d4d6ae5ea 177 Output* output = new Output(mail_box, this);
amutake 8:d16a0fcc2735 178
sierra 34:422d4d6ae5ea 179 InterruptIn reset_pin(p21);
sierra 34:422d4d6ae5ea 180 InterruptIn resume_pin(p22);
sierra 34:422d4d6ae5ea 181 InterruptIn pause_pin(p23);
sierra 34:422d4d6ae5ea 182 reset_pin.rise(sink, &Sink::restart);
sierra 34:422d4d6ae5ea 183 resume_pin.rise(sink, &Sink::resume);
sierra 34:422d4d6ae5ea 184 pause_pin.rise(sink, &Sink::pause);
sierra 34:422d4d6ae5ea 185
sierra 34:422d4d6ae5ea 186 Thread th(invoke_sinkrun, (void *)sink);
amutake 8:d16a0fcc2735 187
amutake 8:d16a0fcc2735 188 Ticker ticker;
amutake 8:d16a0fcc2735 189 ticker.attach(output, &Output::run, FRAME);
amutake 8:d16a0fcc2735 190
amutake 8:d16a0fcc2735 191 Thread::wait(osWaitForever);
sierra 32:fdf9f6fca8a2 192 }
sierra 32:fdf9f6fca8a2 193
sierra 32:fdf9f6fca8a2 194 static void invoke_sinkrun(const void *p)
sierra 32:fdf9f6fca8a2 195 {
sierra 32:fdf9f6fca8a2 196 ((Sink*)p)->run();
amutake 8:d16a0fcc2735 197 }