Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: fll mbed-rtos mbed
fll.cpp@34:422d4d6ae5ea, 2015-02-17 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
