Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
amutake
Date:
Sat Feb 14 04:49:28 2015 +0000
Revision:
2:165723d41023
Parent:
1:1abcd83947bf
Child:
3:edbf31a8589f
Rename: Queue -> Mail

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 <vector>
amutake 0:c80e972b4c59 8 #include "fll.h"
amutake 0:c80e972b4c59 9
sierra 1:1abcd83947bf 10 Serial pc(USBTX, USBRX);
sierra 1:1abcd83947bf 11
amutake 0:c80e972b4c59 12 // ------
amutake 0:c80e972b4c59 13 // Source
amutake 0:c80e972b4c59 14 // ------
sierra 1:1abcd83947bf 15 Source::Source(button *bs, int s, bool l)
amutake 0:c80e972b4c59 16 {
amutake 0:c80e972b4c59 17 button_seq = bs;
sierra 1:1abcd83947bf 18 size = s;
amutake 0:c80e972b4c59 19 loop = l;
amutake 0:c80e972b4c59 20 i = 0;
amutake 0:c80e972b4c59 21 }
amutake 0:c80e972b4c59 22
amutake 0:c80e972b4c59 23 // TODO: without loop
amutake 0:c80e972b4c59 24 button Source::await()
amutake 0:c80e972b4c59 25 {
amutake 0:c80e972b4c59 26 if (size == 0) {
amutake 0:c80e972b4c59 27 return 0;
sierra 1:1abcd83947bf 28 }
sierra 1:1abcd83947bf 29
sierra 1:1abcd83947bf 30 i = i % size;
sierra 1:1abcd83947bf 31 return button_seq[i++];
amutake 0:c80e972b4c59 32 }
amutake 0:c80e972b4c59 33
amutake 0:c80e972b4c59 34 // ----
amutake 0:c80e972b4c59 35 // Flow
amutake 0:c80e972b4c59 36 // ----
amutake 0:c80e972b4c59 37 button Flow::await()
amutake 0:c80e972b4c59 38 {
amutake 0:c80e972b4c59 39 std::vector<button> bs;
amutake 0:c80e972b4c59 40 for (int k = 0; k < sources.size(); k++) {
amutake 0:c80e972b4c59 41 button b = sources[k]->await();
amutake 0:c80e972b4c59 42 bs.push_back(b);
amutake 0:c80e972b4c59 43 }
amutake 0:c80e972b4c59 44 return fold(bs);
amutake 0:c80e972b4c59 45 }
amutake 0:c80e972b4c59 46
amutake 0:c80e972b4c59 47
amutake 0:c80e972b4c59 48 // ----
amutake 0:c80e972b4c59 49 // Sink
amutake 0:c80e972b4c59 50 // ----
amutake 2:165723d41023 51 Sink::Sink(Source* src, rtos::Mail<button, MAIL_BOX_SIZE>* box, Mutex* mut)
amutake 0:c80e972b4c59 52 {
amutake 0:c80e972b4c59 53 source = src;
amutake 2:165723d41023 54 mail_box = box;
amutake 2:165723d41023 55 mutex = mut;
amutake 0:c80e972b4c59 56 }
amutake 0:c80e972b4c59 57
amutake 0:c80e972b4c59 58 // 何ミリ秒かごとに呼ばれる
amutake 0:c80e972b4c59 59 void Sink::run()
amutake 0:c80e972b4c59 60 {
amutake 0:c80e972b4c59 61 for (int i = 0; i < 8; i++) { // FIXME: 8?
amutake 2:165723d41023 62 mutex->lock();
amutake 2:165723d41023 63 button* btn = mail_box->alloc();
sierra 1:1abcd83947bf 64 if(!btn) break;
sierra 1:1abcd83947bf 65 *btn = source->await();
amutake 2:165723d41023 66 mail_box->put(btn);
amutake 2:165723d41023 67 mutex->unlock();
amutake 0:c80e972b4c59 68 }
amutake 0:c80e972b4c59 69 }
amutake 0:c80e972b4c59 70
amutake 0:c80e972b4c59 71 void Sink::reset(Source* src)
amutake 0:c80e972b4c59 72 {
amutake 2:165723d41023 73 mutex->lock();
amutake 0:c80e972b4c59 74 // queue を空にする
amutake 0:c80e972b4c59 75 osEvent e;
amutake 0:c80e972b4c59 76 do {
amutake 2:165723d41023 77 e = mail_box->get(0);
sierra 1:1abcd83947bf 78 if(e.status == osEventMail) {
amutake 2:165723d41023 79 mail_box->free((button*)e.value.p);
sierra 1:1abcd83947bf 80 }
sierra 1:1abcd83947bf 81 } while (e.status == osEventMail);
amutake 0:c80e972b4c59 82 // source の更新
amutake 0:c80e972b4c59 83 source = src;
amutake 2:165723d41023 84 mutex->unlock();
amutake 0:c80e972b4c59 85 }
amutake 0:c80e972b4c59 86
amutake 0:c80e972b4c59 87 // ------
amutake 0:c80e972b4c59 88 // Output
amutake 0:c80e972b4c59 89 // ------
amutake 2:165723d41023 90 Output::Output(rtos::Mail<button, MAIL_BOX_SIZE>* box)
amutake 0:c80e972b4c59 91 {
amutake 2:165723d41023 92 mail_box = box;
amutake 0:c80e972b4c59 93 }
amutake 0:c80e972b4c59 94
amutake 0:c80e972b4c59 95 void Output::run()
amutake 0:c80e972b4c59 96 {
amutake 2:165723d41023 97 osEvent e = mail_box->get(0);
sierra 1:1abcd83947bf 98 if (e.status == osEventMail) {
sierra 1:1abcd83947bf 99 button b = *(button*)(e.value.p);
amutake 0:c80e972b4c59 100 press(b);
amutake 2:165723d41023 101 mail_box->free((button*)e.value.p);
amutake 0:c80e972b4c59 102 } else {
amutake 0:c80e972b4c59 103 press(0); // Mail になかった
amutake 0:c80e972b4c59 104 }
amutake 0:c80e972b4c59 105 }
amutake 0:c80e972b4c59 106
amutake 0:c80e972b4c59 107 // fll_keymap.cpp
amutake 0:c80e972b4c59 108 //
amutake 0:c80e972b4c59 109 // | uint16 bit | button | mbed pin | low/high |
amutake 0:c80e972b4c59 110 // +------------+--------+----------+----------+
amutake 0:c80e972b4c59 111 // | 0x0000 | | | |
amutake 0:c80e972b4c59 112 // | 0x0000 | | | |
amutake 0:c80e972b4c59 113 // | 0x0000 | | | |
amutake 0:c80e972b4c59 114 // | 0x0000 | | | |
amutake 0:c80e972b4c59 115 // | 0x0000 | | | |
amutake 0:c80e972b4c59 116 // | 0x0000 | | | |
amutake 0:c80e972b4c59 117 // | 0x0000 | | | |
amutake 0:c80e972b4c59 118 // | 0x0000 | | | |
amutake 0:c80e972b4c59 119 // | 0x0000 | | | |
amutake 0:c80e972b4c59 120 // | 0x0000 | | | |
amutake 0:c80e972b4c59 121 // | 0x0000 | | | |
amutake 0:c80e972b4c59 122 // | 0x0000 | | | |
amutake 0:c80e972b4c59 123 // | 0x0000 | | | |
amutake 0:c80e972b4c59 124 // | 0x0000 | | | |
amutake 0:c80e972b4c59 125 // +------------+--------+----------+----------+
amutake 0:c80e972b4c59 126 //
amutake 0:c80e972b4c59 127 // Examples:
amutake 0:c80e972b4c59 128 // 0000 0000 0000 0000 === nothing is pressed
amutake 0:c80e972b4c59 129 // 0010 0100 1000 0001 === ?, ?, ? and ? are pressed
amutake 0:c80e972b4c59 130 typedef struct _table {
amutake 0:c80e972b4c59 131 button mask; // 0000 0000 0000 0001 ~ 0010 0000 0000 0000
amutake 0:c80e972b4c59 132 DigitalOut *pin; // pin5~pin19
amutake 0:c80e972b4c59 133 int on; // 1 or 0
amutake 0:c80e972b4c59 134 } table;
amutake 0:c80e972b4c59 135
amutake 0:c80e972b4c59 136 DigitalOut pinR2(p10);
amutake 0:c80e972b4c59 137 DigitalOut pinR1(p5);
amutake 0:c80e972b4c59 138 DigitalOut pinTriangle(p6);
amutake 0:c80e972b4c59 139 DigitalOut pinCircle(p7);
amutake 0:c80e972b4c59 140 DigitalOut pinCross(p8);
amutake 0:c80e972b4c59 141 DigitalOut pinSquare(p9);
amutake 0:c80e972b4c59 142 DigitalOut pinStart(p11);
amutake 0:c80e972b4c59 143 DigitalOut pinAnalog(p12);
amutake 0:c80e972b4c59 144 DigitalOut pinSelect(p13);
amutake 0:c80e972b4c59 145 DigitalOut pinRight(p18);
amutake 0:c80e972b4c59 146 DigitalOut pinDown(p16);
amutake 0:c80e972b4c59 147 DigitalOut pinLeft(p17);
amutake 0:c80e972b4c59 148 DigitalOut pinUp(p15);
amutake 0:c80e972b4c59 149 DigitalOut pinL1(p19);
amutake 0:c80e972b4c59 150 DigitalOut pinL2(p14);
amutake 0:c80e972b4c59 151
amutake 0:c80e972b4c59 152 table tables[] = {
amutake 0:c80e972b4c59 153 { R1, &pinR1, 0 },
amutake 0:c80e972b4c59 154 { B_TRIANGLE, &pinTriangle, 0 },
amutake 0:c80e972b4c59 155 { B_CIRCLE, &pinCircle, 0 },
amutake 0:c80e972b4c59 156 { B_CROSS, &pinCross, 0 },
amutake 0:c80e972b4c59 157 { B_SQUARE, &pinSquare, 0 },
amutake 0:c80e972b4c59 158 { B_R2, &pinR2, 0 },
amutake 0:c80e972b4c59 159 { B_START, &pinStart, 0 },
amutake 0:c80e972b4c59 160 { B_ANALOG, &pinAnalog, 0 },
amutake 0:c80e972b4c59 161 { B_SELECT, &pinSelect, 0 },
amutake 0:c80e972b4c59 162 { B_L2, &pinL2, 0 },
amutake 0:c80e972b4c59 163 { B_UP, &pinUp, 0 },
amutake 0:c80e972b4c59 164 { B_DOWN, &pinDown, 0 },
amutake 0:c80e972b4c59 165 { B_LEFT, &pinLeft, 0 },
amutake 0:c80e972b4c59 166 { B_RIGHT, &pinRight, 0 },
amutake 0:c80e972b4c59 167 { B_L1, &pinL1, 0 }
amutake 0:c80e972b4c59 168 };
amutake 0:c80e972b4c59 169
amutake 0:c80e972b4c59 170 // pc.printf("0x%02x\n", btn);
amutake 0:c80e972b4c59 171
amutake 0:c80e972b4c59 172 // 押されるボタンを押す
amutake 0:c80e972b4c59 173 void press(button btn)
amutake 0:c80e972b4c59 174 {
amutake 0:c80e972b4c59 175 for (int i = 0; i < sizeof(tables)/sizeof(table); i++) {
amutake 0:c80e972b4c59 176 table t = tables[i];
amutake 0:c80e972b4c59 177 if (btn & t.mask) {
amutake 0:c80e972b4c59 178 t.pin->write(t.on);
amutake 0:c80e972b4c59 179 } else {
amutake 0:c80e972b4c59 180 t.pin->write(1 - t.on);
amutake 0:c80e972b4c59 181 }
amutake 0:c80e972b4c59 182 }
amutake 0:c80e972b4c59 183 }