Shohei Yasutake / Mbed 2 deprecated koibumi2000

Dependencies:   fll mbed-rtos mbed

Committer:
sierra
Date:
Sat Feb 14 08:14:07 2015 +0000
Revision:
29:2f3d6d09eaac
Parent:
6:d0348b7a2f05
Move auxiliary classes to fllaux.cpp

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
sierra 1:1abcd83947bf 9 Serial pc(USBTX, USBRX);
sierra 1:1abcd83947bf 10
amutake 0:c80e972b4c59 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 0:c80e972b4c59 41 // queue を空にする
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 0:c80e972b4c59 49 // 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);
sierra 1:1abcd83947bf 65 if (e.status == osEventMail) {
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 0:c80e972b4c59 70 press(0); // Mail になかった
amutake 0:c80e972b4c59 71 }
amutake 0:c80e972b4c59 72 }
amutake 0:c80e972b4c59 73
amutake 0:c80e972b4c59 74 // fll_keymap.cpp
amutake 0:c80e972b4c59 75 //
sierra 3:edbf31a8589f 76 // | uint16 bit | button_t | mbed pin | low/high |
amutake 0:c80e972b4c59 77 // +------------+--------+----------+----------+
amutake 0:c80e972b4c59 78 // | 0x0000 | | | |
amutake 0:c80e972b4c59 79 // | 0x0000 | | | |
amutake 0:c80e972b4c59 80 // | 0x0000 | | | |
amutake 0:c80e972b4c59 81 // | 0x0000 | | | |
amutake 0:c80e972b4c59 82 // | 0x0000 | | | |
amutake 0:c80e972b4c59 83 // | 0x0000 | | | |
amutake 0:c80e972b4c59 84 // | 0x0000 | | | |
amutake 0:c80e972b4c59 85 // | 0x0000 | | | |
amutake 0:c80e972b4c59 86 // | 0x0000 | | | |
amutake 0:c80e972b4c59 87 // | 0x0000 | | | |
amutake 0:c80e972b4c59 88 // | 0x0000 | | | |
amutake 0:c80e972b4c59 89 // | 0x0000 | | | |
amutake 0:c80e972b4c59 90 // | 0x0000 | | | |
amutake 0:c80e972b4c59 91 // | 0x0000 | | | |
amutake 0:c80e972b4c59 92 // +------------+--------+----------+----------+
amutake 0:c80e972b4c59 93 //
amutake 0:c80e972b4c59 94 // Examples:
amutake 0:c80e972b4c59 95 // 0000 0000 0000 0000 === nothing is pressed
amutake 0:c80e972b4c59 96 // 0010 0100 1000 0001 === ?, ?, ? and ? are pressed
amutake 0:c80e972b4c59 97 typedef struct _table {
sierra 3:edbf31a8589f 98 button_t mask; // 0000 0000 0000 0001 ~ 0010 0000 0000 0000
amutake 0:c80e972b4c59 99 DigitalOut *pin; // pin5~pin19
amutake 0:c80e972b4c59 100 int on; // 1 or 0
amutake 0:c80e972b4c59 101 } table;
amutake 0:c80e972b4c59 102
amutake 0:c80e972b4c59 103 DigitalOut pinR2(p10);
amutake 0:c80e972b4c59 104 DigitalOut pinR1(p5);
amutake 0:c80e972b4c59 105 DigitalOut pinTriangle(p6);
amutake 0:c80e972b4c59 106 DigitalOut pinCircle(p7);
amutake 0:c80e972b4c59 107 DigitalOut pinCross(p8);
amutake 0:c80e972b4c59 108 DigitalOut pinSquare(p9);
amutake 0:c80e972b4c59 109 DigitalOut pinStart(p11);
amutake 0:c80e972b4c59 110 DigitalOut pinAnalog(p12);
amutake 0:c80e972b4c59 111 DigitalOut pinSelect(p13);
amutake 0:c80e972b4c59 112 DigitalOut pinRight(p18);
amutake 0:c80e972b4c59 113 DigitalOut pinDown(p16);
amutake 0:c80e972b4c59 114 DigitalOut pinLeft(p17);
amutake 0:c80e972b4c59 115 DigitalOut pinUp(p15);
amutake 0:c80e972b4c59 116 DigitalOut pinL1(p19);
amutake 0:c80e972b4c59 117 DigitalOut pinL2(p14);
amutake 0:c80e972b4c59 118
amutake 0:c80e972b4c59 119 table tables[] = {
amutake 0:c80e972b4c59 120 { R1, &pinR1, 0 },
amutake 0:c80e972b4c59 121 { B_TRIANGLE, &pinTriangle, 0 },
amutake 0:c80e972b4c59 122 { B_CIRCLE, &pinCircle, 0 },
amutake 0:c80e972b4c59 123 { B_CROSS, &pinCross, 0 },
amutake 0:c80e972b4c59 124 { B_SQUARE, &pinSquare, 0 },
amutake 0:c80e972b4c59 125 { B_R2, &pinR2, 0 },
amutake 0:c80e972b4c59 126 { B_START, &pinStart, 0 },
amutake 0:c80e972b4c59 127 { B_ANALOG, &pinAnalog, 0 },
amutake 0:c80e972b4c59 128 { B_SELECT, &pinSelect, 0 },
amutake 0:c80e972b4c59 129 { B_L2, &pinL2, 0 },
amutake 0:c80e972b4c59 130 { B_UP, &pinUp, 0 },
amutake 0:c80e972b4c59 131 { B_DOWN, &pinDown, 0 },
amutake 0:c80e972b4c59 132 { B_LEFT, &pinLeft, 0 },
amutake 0:c80e972b4c59 133 { B_RIGHT, &pinRight, 0 },
amutake 0:c80e972b4c59 134 { B_L1, &pinL1, 0 }
amutake 0:c80e972b4c59 135 };
amutake 0:c80e972b4c59 136
amutake 0:c80e972b4c59 137 // pc.printf("0x%02x\n", btn);
amutake 0:c80e972b4c59 138
amutake 0:c80e972b4c59 139 // 押されるボタンを押す
sierra 3:edbf31a8589f 140 void press(button_t btn)
amutake 0:c80e972b4c59 141 {
sierra 3:edbf31a8589f 142 table t;
amutake 0:c80e972b4c59 143 for (int i = 0; i < sizeof(tables)/sizeof(table); i++) {
sierra 3:edbf31a8589f 144 t = tables[i];
amutake 0:c80e972b4c59 145 if (btn & t.mask) {
amutake 0:c80e972b4c59 146 t.pin->write(t.on);
amutake 0:c80e972b4c59 147 } else {
amutake 0:c80e972b4c59 148 t.pin->write(1 - t.on);
amutake 0:c80e972b4c59 149 }
amutake 0:c80e972b4c59 150 }
amutake 0:c80e972b4c59 151 }