Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
amutake
Date:
Mon Feb 16 12:10:18 2015 +0000
Revision:
17:69536d02cb3c
Parent:
16:253d933a7633
Child:
26:08387521c994
Child:
31:2dbed2eea0f2
wait until joystick button is pressed

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