Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
amutake
Date:
Fri Feb 13 13:19:29 2015 +0000
Revision:
0:c80e972b4c59
Child:
1:1abcd83947bf
initial

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
amutake 0:c80e972b4c59 10 // ------
amutake 0:c80e972b4c59 11 // Source
amutake 0:c80e972b4c59 12 // ------
amutake 0:c80e972b4c59 13 Source::Source(std::vector<button>* bs, bool l)
amutake 0:c80e972b4c59 14 {
amutake 0:c80e972b4c59 15 button_seq = bs;
amutake 0:c80e972b4c59 16 loop = l;
amutake 0:c80e972b4c59 17 i = 0;
amutake 0:c80e972b4c59 18 }
amutake 0:c80e972b4c59 19
amutake 0:c80e972b4c59 20 // TODO: without loop
amutake 0:c80e972b4c59 21 button Source::await()
amutake 0:c80e972b4c59 22 {
amutake 0:c80e972b4c59 23 int size = button_seq->size();
amutake 0:c80e972b4c59 24 if (size == 0) {
amutake 0:c80e972b4c59 25 return 0;
amutake 0:c80e972b4c59 26 } else if (i >= size) {
amutake 0:c80e972b4c59 27 i = 0;
amutake 0:c80e972b4c59 28 return button_seq->at(0);
amutake 0:c80e972b4c59 29 } else {
amutake 0:c80e972b4c59 30 return button_seq->at(i++);
amutake 0:c80e972b4c59 31 }
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 // Carry
amutake 0:c80e972b4c59 49 // -----
amutake 0:c80e972b4c59 50 Carry::Carry()
amutake 0:c80e972b4c59 51 {
amutake 0:c80e972b4c59 52 btn = Carry::none;
amutake 0:c80e972b4c59 53 }
amutake 0:c80e972b4c59 54
amutake 0:c80e972b4c59 55 bool Carry::is_empty()
amutake 0:c80e972b4c59 56 {
amutake 0:c80e972b4c59 57 if (btn & Carry::none) { // TODO: 冗長
amutake 0:c80e972b4c59 58 return true;
amutake 0:c80e972b4c59 59 } else {
amutake 0:c80e972b4c59 60 return false;
amutake 0:c80e972b4c59 61 }
amutake 0:c80e972b4c59 62 }
amutake 0:c80e972b4c59 63 button Carry::get()
amutake 0:c80e972b4c59 64 {
amutake 0:c80e972b4c59 65 return btn;
amutake 0:c80e972b4c59 66 }
amutake 0:c80e972b4c59 67 void Carry::set(button b)
amutake 0:c80e972b4c59 68 {
amutake 0:c80e972b4c59 69 btn = b;
amutake 0:c80e972b4c59 70 }
amutake 0:c80e972b4c59 71 void Carry::empty()
amutake 0:c80e972b4c59 72 {
amutake 0:c80e972b4c59 73 btn = Carry::none;
amutake 0:c80e972b4c59 74 }
amutake 0:c80e972b4c59 75
amutake 0:c80e972b4c59 76 // ----
amutake 0:c80e972b4c59 77 // Sink
amutake 0:c80e972b4c59 78 // ----
amutake 0:c80e972b4c59 79 Sink::Sink(Source* src, rtos::Mail<button, QUEUE_SIZE>* q, Mutex* mut)
amutake 0:c80e972b4c59 80 {
amutake 0:c80e972b4c59 81 source = src;
amutake 0:c80e972b4c59 82 carry = new Carry();
amutake 0:c80e972b4c59 83 queue = q;
amutake 0:c80e972b4c59 84 queueMutex = mut;
amutake 0:c80e972b4c59 85 }
amutake 0:c80e972b4c59 86
amutake 0:c80e972b4c59 87 // 何ミリ秒かごとに呼ばれる
amutake 0:c80e972b4c59 88 void Sink::run()
amutake 0:c80e972b4c59 89 {
amutake 0:c80e972b4c59 90 for (int i = 0; i < 8; i++) { // FIXME: 8?
amutake 0:c80e972b4c59 91 button* btn = queue->alloc();
amutake 0:c80e972b4c59 92 // carry がないならストリームから Pull
amutake 0:c80e972b4c59 93 if (carry->is_empty()) {
amutake 0:c80e972b4c59 94 *btn = source->await();
amutake 0:c80e972b4c59 95 } else {
amutake 0:c80e972b4c59 96 *btn = carry->get();
amutake 0:c80e972b4c59 97 }
amutake 0:c80e972b4c59 98 queueMutex->lock();
amutake 0:c80e972b4c59 99 osStatus status = queue->put(btn);
amutake 0:c80e972b4c59 100 queueMutex->unlock();
amutake 0:c80e972b4c59 101 if (status != osOK) {
amutake 0:c80e972b4c59 102 carry->set(*btn);
amutake 0:c80e972b4c59 103 break;
amutake 0:c80e972b4c59 104 }
amutake 0:c80e972b4c59 105 }
amutake 0:c80e972b4c59 106 }
amutake 0:c80e972b4c59 107
amutake 0:c80e972b4c59 108 void Sink::reset(Source* src)
amutake 0:c80e972b4c59 109 {
amutake 0:c80e972b4c59 110 queueMutex->lock();
amutake 0:c80e972b4c59 111 // queue を空にする
amutake 0:c80e972b4c59 112 osEvent e;
amutake 0:c80e972b4c59 113 do {
amutake 0:c80e972b4c59 114 e = queue->get();
amutake 0:c80e972b4c59 115 } while (e.status == osOK);
amutake 0:c80e972b4c59 116 // source の更新
amutake 0:c80e972b4c59 117 source = src;
amutake 0:c80e972b4c59 118 queueMutex->unlock();
amutake 0:c80e972b4c59 119 }
amutake 0:c80e972b4c59 120
amutake 0:c80e972b4c59 121 // ------
amutake 0:c80e972b4c59 122 // Output
amutake 0:c80e972b4c59 123 // ------
amutake 0:c80e972b4c59 124 Output::Output(rtos::Mail<button, QUEUE_SIZE>* q)
amutake 0:c80e972b4c59 125 {
amutake 0:c80e972b4c59 126 queue = q;
amutake 0:c80e972b4c59 127 }
amutake 0:c80e972b4c59 128
amutake 0:c80e972b4c59 129 void Output::run()
amutake 0:c80e972b4c59 130 {
amutake 0:c80e972b4c59 131 osEvent e = queue->get();
amutake 0:c80e972b4c59 132 if (e.status == osEventMessage) {
amutake 0:c80e972b4c59 133 button b = (button)e.value.v;
amutake 0:c80e972b4c59 134 press(b);
amutake 0:c80e972b4c59 135 } else {
amutake 0:c80e972b4c59 136 press(0); // Mail になかった
amutake 0:c80e972b4c59 137 }
amutake 0:c80e972b4c59 138 }
amutake 0:c80e972b4c59 139
amutake 0:c80e972b4c59 140 // fll_keymap.cpp
amutake 0:c80e972b4c59 141 //
amutake 0:c80e972b4c59 142 // | uint16 bit | button | mbed pin | low/high |
amutake 0:c80e972b4c59 143 // +------------+--------+----------+----------+
amutake 0:c80e972b4c59 144 // | 0x0000 | | | |
amutake 0:c80e972b4c59 145 // | 0x0000 | | | |
amutake 0:c80e972b4c59 146 // | 0x0000 | | | |
amutake 0:c80e972b4c59 147 // | 0x0000 | | | |
amutake 0:c80e972b4c59 148 // | 0x0000 | | | |
amutake 0:c80e972b4c59 149 // | 0x0000 | | | |
amutake 0:c80e972b4c59 150 // | 0x0000 | | | |
amutake 0:c80e972b4c59 151 // | 0x0000 | | | |
amutake 0:c80e972b4c59 152 // | 0x0000 | | | |
amutake 0:c80e972b4c59 153 // | 0x0000 | | | |
amutake 0:c80e972b4c59 154 // | 0x0000 | | | |
amutake 0:c80e972b4c59 155 // | 0x0000 | | | |
amutake 0:c80e972b4c59 156 // | 0x0000 | | | |
amutake 0:c80e972b4c59 157 // | 0x0000 | | | |
amutake 0:c80e972b4c59 158 // +------------+--------+----------+----------+
amutake 0:c80e972b4c59 159 //
amutake 0:c80e972b4c59 160 // Examples:
amutake 0:c80e972b4c59 161 // 0000 0000 0000 0000 === nothing is pressed
amutake 0:c80e972b4c59 162 // 0010 0100 1000 0001 === ?, ?, ? and ? are pressed
amutake 0:c80e972b4c59 163 typedef struct _table {
amutake 0:c80e972b4c59 164 button mask; // 0000 0000 0000 0001 ~ 0010 0000 0000 0000
amutake 0:c80e972b4c59 165 DigitalOut *pin; // pin5~pin19
amutake 0:c80e972b4c59 166 int on; // 1 or 0
amutake 0:c80e972b4c59 167 } table;
amutake 0:c80e972b4c59 168
amutake 0:c80e972b4c59 169 DigitalOut pinR2(p10);
amutake 0:c80e972b4c59 170 DigitalOut pinR1(p5);
amutake 0:c80e972b4c59 171 DigitalOut pinTriangle(p6);
amutake 0:c80e972b4c59 172 DigitalOut pinCircle(p7);
amutake 0:c80e972b4c59 173 DigitalOut pinCross(p8);
amutake 0:c80e972b4c59 174 DigitalOut pinSquare(p9);
amutake 0:c80e972b4c59 175 DigitalOut pinStart(p11);
amutake 0:c80e972b4c59 176 DigitalOut pinAnalog(p12);
amutake 0:c80e972b4c59 177 DigitalOut pinSelect(p13);
amutake 0:c80e972b4c59 178 DigitalOut pinRight(p18);
amutake 0:c80e972b4c59 179 DigitalOut pinDown(p16);
amutake 0:c80e972b4c59 180 DigitalOut pinLeft(p17);
amutake 0:c80e972b4c59 181 DigitalOut pinUp(p15);
amutake 0:c80e972b4c59 182 DigitalOut pinL1(p19);
amutake 0:c80e972b4c59 183 DigitalOut pinL2(p14);
amutake 0:c80e972b4c59 184
amutake 0:c80e972b4c59 185 table tables[] = {
amutake 0:c80e972b4c59 186 { R1, &pinR1, 0 },
amutake 0:c80e972b4c59 187 { B_TRIANGLE, &pinTriangle, 0 },
amutake 0:c80e972b4c59 188 { B_CIRCLE, &pinCircle, 0 },
amutake 0:c80e972b4c59 189 { B_CROSS, &pinCross, 0 },
amutake 0:c80e972b4c59 190 { B_SQUARE, &pinSquare, 0 },
amutake 0:c80e972b4c59 191 { B_R2, &pinR2, 0 },
amutake 0:c80e972b4c59 192 { B_START, &pinStart, 0 },
amutake 0:c80e972b4c59 193 { B_ANALOG, &pinAnalog, 0 },
amutake 0:c80e972b4c59 194 { B_SELECT, &pinSelect, 0 },
amutake 0:c80e972b4c59 195 { B_L2, &pinL2, 0 },
amutake 0:c80e972b4c59 196 { B_UP, &pinUp, 0 },
amutake 0:c80e972b4c59 197 { B_DOWN, &pinDown, 0 },
amutake 0:c80e972b4c59 198 { B_LEFT, &pinLeft, 0 },
amutake 0:c80e972b4c59 199 { B_RIGHT, &pinRight, 0 },
amutake 0:c80e972b4c59 200 { B_L1, &pinL1, 0 }
amutake 0:c80e972b4c59 201 };
amutake 0:c80e972b4c59 202
amutake 0:c80e972b4c59 203 // Serial pc(USBTX, USBRX);
amutake 0:c80e972b4c59 204 // pc.printf("0x%02x\n", btn);
amutake 0:c80e972b4c59 205
amutake 0:c80e972b4c59 206 // 押されるボタンを押す
amutake 0:c80e972b4c59 207 void press(button btn)
amutake 0:c80e972b4c59 208 {
amutake 0:c80e972b4c59 209 for (int i = 0; i < sizeof(tables)/sizeof(table); i++) {
amutake 0:c80e972b4c59 210 table t = tables[i];
amutake 0:c80e972b4c59 211 if (btn & t.mask) {
amutake 0:c80e972b4c59 212 t.pin->write(t.on);
amutake 0:c80e972b4c59 213 } else {
amutake 0:c80e972b4c59 214 t.pin->write(1 - t.on);
amutake 0:c80e972b4c59 215 }
amutake 0:c80e972b4c59 216 }
amutake 0:c80e972b4c59 217 }