受け取りのコントローラのプログラム

Dependencies:   TextLCD mbed MultiSerial Pswitch_Lib

Committer:
lilac0112_1
Date:
Thu Sep 04 01:32:01 2014 +0000
Revision:
0:d3702a4e32ea
Child:
1:84625a611c5f
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lilac0112_1 0:d3702a4e32ea 1 #include "mbed.h"
lilac0112_1 0:d3702a4e32ea 2 #include "TextLCD.h"
lilac0112_1 0:d3702a4e32ea 3
lilac0112_1 0:d3702a4e32ea 4 #define DATA_NUM 8+2//2byte→KEYCODE(拝啓)とCHECKCODE(敬具) 8byte→やりとりするデータ
lilac0112_1 0:d3702a4e32ea 5 #define TX_KEYCODE 0xAA//あちらのKEYCODE
lilac0112_1 0:d3702a4e32ea 6 #define RX_KEYCODE 0xAA//こちらのKEYCODE
lilac0112_1 0:d3702a4e32ea 7 #define KEY 0//KEYCODEは配列の最初
lilac0112_1 0:d3702a4e32ea 8 #define CHECK DATA_NUM-1//CHECKCODEは配列の最後
lilac0112_1 0:d3702a4e32ea 9 #define INTERVAL .5
lilac0112_1 0:d3702a4e32ea 10
lilac0112_1 0:d3702a4e32ea 11 enum HAND{RIGHT=0, LEFT};
lilac0112_1 0:d3702a4e32ea 12 enum FINGER{INDEX=0, MIDDLE};
lilac0112_1 0:d3702a4e32ea 13 enum COMPASS{NORTH=0, EAST, SOUTH, WEST};
lilac0112_1 0:d3702a4e32ea 14 enum COLOR{YELLOW=0, RED, GREEN, BLUE};
lilac0112_1 0:d3702a4e32ea 15
lilac0112_1 0:d3702a4e32ea 16 volatile uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0};
lilac0112_1 0:d3702a4e32ea 17 volatile uint8_t count=0;
lilac0112_1 0:d3702a4e32ea 18
lilac0112_1 0:d3702a4e32ea 19 void SetUp();
lilac0112_1 0:d3702a4e32ea 20 bool GetBit(uint8_t n, uint8_t bit);
lilac0112_1 0:d3702a4e32ea 21 uint8_t LinkBit(bool eight, bool seven, bool six, bool five, bool fore, bool three, bool two, bool one);
lilac0112_1 0:d3702a4e32ea 22 void illumination();
lilac0112_1 0:d3702a4e32ea 23 void TX();
lilac0112_1 0:d3702a4e32ea 24 void RX();
lilac0112_1 0:d3702a4e32ea 25
lilac0112_1 0:d3702a4e32ea 26 Ticker flick;
lilac0112_1 0:d3702a4e32ea 27 BusOut LED(LED1, LED2, LED3, LED4);
lilac0112_1 0:d3702a4e32ea 28
lilac0112_1 0:d3702a4e32ea 29 DigitalOut YLED(p6);
lilac0112_1 0:d3702a4e32ea 30
lilac0112_1 0:d3702a4e32ea 31 DigitalIn CrossKey[4][2]={{p8, p30}, {p11, p29}, {p15, p28}, {p16, p27}};//p7, p12=reserve
lilac0112_1 0:d3702a4e32ea 32 DigitalIn SideKey[2][2]={{p17, p20}, {p18, p19}};
lilac0112_1 0:d3702a4e32ea 33 DigitalIn Toggle(p5);
lilac0112_1 0:d3702a4e32ea 34
lilac0112_1 0:d3702a4e32ea 35 Serial Xbee(p9, p10);//or p13, p14
lilac0112_1 0:d3702a4e32ea 36 Serial pc(USBTX, USBRX);
lilac0112_1 0:d3702a4e32ea 37
lilac0112_1 0:d3702a4e32ea 38 TextLCD lcd(p26, p25, p24, p23, p22, p21, TextLCD::LCD16x2); // rs, e, d4-d7
lilac0112_1 0:d3702a4e32ea 39
lilac0112_1 0:d3702a4e32ea 40 int main() {
lilac0112_1 0:d3702a4e32ea 41
lilac0112_1 0:d3702a4e32ea 42 SetUp();
lilac0112_1 0:d3702a4e32ea 43
lilac0112_1 0:d3702a4e32ea 44 while(1) {
lilac0112_1 0:d3702a4e32ea 45
lilac0112_1 0:d3702a4e32ea 46 YLED=!Toggle;
lilac0112_1 0:d3702a4e32ea 47
lilac0112_1 0:d3702a4e32ea 48 EXdata[1] = LinkBit(!CrossKey[YELLOW][LEFT], !CrossKey[RED][LEFT], !CrossKey[GREEN][LEFT], !CrossKey[BLUE][LEFT],
lilac0112_1 0:d3702a4e32ea 49 !CrossKey[YELLOW][RIGHT], !CrossKey[RED][RIGHT], !CrossKey[GREEN][RIGHT], !CrossKey[BLUE][RIGHT]);
lilac0112_1 0:d3702a4e32ea 50 EXdata[2] = LinkBit(0, 0, 0, 0, !SideKey[INDEX][LEFT], !SideKey[MIDDLE][LEFT], !SideKey[INDEX][RIGHT], !SideKey[MIDDLE][RIGHT]);
lilac0112_1 0:d3702a4e32ea 51 EXdata[3] = LinkBit(0, 0, 0, 0, 0, 0, 0, 0);
lilac0112_1 0:d3702a4e32ea 52 EXdata[4] = LinkBit(0, 0, 0, 0, 0, 0, 0, 0);
lilac0112_1 0:d3702a4e32ea 53 EXdata[5] = LinkBit(0, 0, 0, 0, 0, 0, 0, 0);
lilac0112_1 0:d3702a4e32ea 54 EXdata[6] = LinkBit(0, 0, 0, 0, 0, 0, 0, 0);
lilac0112_1 0:d3702a4e32ea 55 EXdata[7] = LinkBit(0, 0, 0, 0, 0, 0, 0, 0);
lilac0112_1 0:d3702a4e32ea 56 EXdata[8] = LinkBit(0, 0, 0, 0, 0, 0, 0, 0);
lilac0112_1 0:d3702a4e32ea 57 }
lilac0112_1 0:d3702a4e32ea 58 }
lilac0112_1 0:d3702a4e32ea 59
lilac0112_1 0:d3702a4e32ea 60 void SetUp(void){
lilac0112_1 0:d3702a4e32ea 61
lilac0112_1 0:d3702a4e32ea 62 uint8_t i=1;
lilac0112_1 0:d3702a4e32ea 63
lilac0112_1 0:d3702a4e32ea 64 lcd.printf("Hello World!\n");
lilac0112_1 0:d3702a4e32ea 65
lilac0112_1 0:d3702a4e32ea 66 CrossKey[NORTH][RIGHT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 67 CrossKey[EAST][RIGHT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 68 CrossKey[WEST][RIGHT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 69 CrossKey[SOUTH][RIGHT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 70 CrossKey[NORTH][LEFT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 71 CrossKey[EAST][LEFT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 72 CrossKey[WEST][LEFT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 73 CrossKey[SOUTH][LEFT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 74
lilac0112_1 0:d3702a4e32ea 75 SideKey[INDEX][RIGHT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 76 SideKey[MIDDLE][RIGHT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 77 SideKey[INDEX][LEFT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 78 SideKey[MIDDLE][LEFT].mode(PullUp);
lilac0112_1 0:d3702a4e32ea 79
lilac0112_1 0:d3702a4e32ea 80 Toggle.mode(PullUp);
lilac0112_1 0:d3702a4e32ea 81
lilac0112_1 0:d3702a4e32ea 82 //flick.attach(illumination, INTERVAL);
lilac0112_1 0:d3702a4e32ea 83
lilac0112_1 0:d3702a4e32ea 84 Xbee.attach(&TX, Serial::TxIrq);//送信バッファ空き割込み
lilac0112_1 0:d3702a4e32ea 85 //Xbee.attach(&RX, Serial::RxIrq);//受信割込み
lilac0112_1 0:d3702a4e32ea 86
lilac0112_1 0:d3702a4e32ea 87 Xbee.putc(i);//送信開始
lilac0112_1 0:d3702a4e32ea 88 //i = Xbee.getc();//受信開始
lilac0112_1 0:d3702a4e32ea 89 }
lilac0112_1 0:d3702a4e32ea 90 bool GetBit(uint8_t n, uint8_t bit){//整数nのbitビット目は1か0か.
lilac0112_1 0:d3702a4e32ea 91 return (n>>(bit-1))%2;
lilac0112_1 0:d3702a4e32ea 92 }
lilac0112_1 0:d3702a4e32ea 93 uint8_t LinkBit(bool eight, bool seven, bool six, bool five, bool fore, bool three, bool two, bool one){//0と1を集めて整数を作る
lilac0112_1 0:d3702a4e32ea 94 return 0x80*eight + 0x40*seven + 0x20*six + 0x10*five + 0x08*fore + 0x04*three + 0x02*two + 0x01*one;
lilac0112_1 0:d3702a4e32ea 95 }
lilac0112_1 0:d3702a4e32ea 96 void illumination(void){//literally
lilac0112_1 0:d3702a4e32ea 97 count++;
lilac0112_1 0:d3702a4e32ea 98 LED = count;
lilac0112_1 0:d3702a4e32ea 99 }
lilac0112_1 0:d3702a4e32ea 100 void TX(void){//送信バッファ空き割り込み用関数
lilac0112_1 0:d3702a4e32ea 101
lilac0112_1 0:d3702a4e32ea 102 static uint8_t Tx=DATA_NUM, i;
lilac0112_1 0:d3702a4e32ea 103 static uint8_t TXdata[DATA_NUM]={TX_KEYCODE};
lilac0112_1 0:d3702a4e32ea 104 static uint8_t TXcheckcode=0;
lilac0112_1 0:d3702a4e32ea 105
lilac0112_1 0:d3702a4e32ea 106 if(Tx >= DATA_NUM){
lilac0112_1 0:d3702a4e32ea 107
lilac0112_1 0:d3702a4e32ea 108 TXdata[KEY] = TX_KEYCODE;//Hello.
lilac0112_1 0:d3702a4e32ea 109
lilac0112_1 0:d3702a4e32ea 110 TXdata[1] = EXdata[1];
lilac0112_1 0:d3702a4e32ea 111 TXdata[2] = EXdata[2];
lilac0112_1 0:d3702a4e32ea 112 TXdata[3] = EXdata[3];
lilac0112_1 0:d3702a4e32ea 113 TXdata[4] = EXdata[4];
lilac0112_1 0:d3702a4e32ea 114 TXdata[5] = EXdata[5];
lilac0112_1 0:d3702a4e32ea 115 TXdata[6] = EXdata[6];
lilac0112_1 0:d3702a4e32ea 116 TXdata[7] = EXdata[7];
lilac0112_1 0:d3702a4e32ea 117 TXdata[8] = EXdata[8];
lilac0112_1 0:d3702a4e32ea 118 //送信するデータ = メインで処理されたデータ
lilac0112_1 0:d3702a4e32ea 119
lilac0112_1 0:d3702a4e32ea 120 for(i=KEY+1, TXcheckcode=0; i<CHECK; i++){//CHECKCODEの生成
lilac0112_1 0:d3702a4e32ea 121 TXcheckcode ^= TXdata[i];
lilac0112_1 0:d3702a4e32ea 122 }
lilac0112_1 0:d3702a4e32ea 123
lilac0112_1 0:d3702a4e32ea 124 TXdata[CHECK] = TXcheckcode;//Good bye.
lilac0112_1 0:d3702a4e32ea 125 Tx=0;//配列をリセット
lilac0112_1 0:d3702a4e32ea 126
lilac0112_1 0:d3702a4e32ea 127 }
lilac0112_1 0:d3702a4e32ea 128 Xbee.putc(TXdata[Tx]);//データを送信する
lilac0112_1 0:d3702a4e32ea 129 Tx++;//配列を入れ替える
lilac0112_1 0:d3702a4e32ea 130
lilac0112_1 0:d3702a4e32ea 131 }
lilac0112_1 0:d3702a4e32ea 132 void RX(void){//受信割り込み用関数
lilac0112_1 0:d3702a4e32ea 133
lilac0112_1 0:d3702a4e32ea 134 static uint8_t Rx=0, i;
lilac0112_1 0:d3702a4e32ea 135 static uint8_t RXdata[DATA_NUM]={RX_KEYCODE};
lilac0112_1 0:d3702a4e32ea 136 static uint8_t RXcheckcode=0;
lilac0112_1 0:d3702a4e32ea 137
lilac0112_1 0:d3702a4e32ea 138 RXdata[Rx] = Xbee.getc();//データを受け取る
lilac0112_1 0:d3702a4e32ea 139
lilac0112_1 0:d3702a4e32ea 140 if(RXdata[KEY]==RX_KEYCODE){//KEYCODEが一致したら配列を入れ替える
lilac0112_1 0:d3702a4e32ea 141 Rx++;
lilac0112_1 0:d3702a4e32ea 142 }
lilac0112_1 0:d3702a4e32ea 143
lilac0112_1 0:d3702a4e32ea 144 if(Rx==CHECK){//CHECKCODEの生成
lilac0112_1 0:d3702a4e32ea 145 for(i=KEY+1, RXcheckcode=0; i<CHECK; i++){
lilac0112_1 0:d3702a4e32ea 146 RXcheckcode ^= RXdata[i];
lilac0112_1 0:d3702a4e32ea 147 }
lilac0112_1 0:d3702a4e32ea 148 }
lilac0112_1 0:d3702a4e32ea 149
lilac0112_1 0:d3702a4e32ea 150 if(Rx >= DATA_NUM){
lilac0112_1 0:d3702a4e32ea 151 if(RXdata[CHECK]==RXcheckcode){//CHECKCODEが合致したらデータを適用する
lilac0112_1 0:d3702a4e32ea 152
lilac0112_1 0:d3702a4e32ea 153 INdata[1] = RXdata[1];
lilac0112_1 0:d3702a4e32ea 154 INdata[2] = RXdata[2];
lilac0112_1 0:d3702a4e32ea 155 INdata[3] = RXdata[3];
lilac0112_1 0:d3702a4e32ea 156 INdata[4] = RXdata[4];
lilac0112_1 0:d3702a4e32ea 157 INdata[5] = RXdata[5];
lilac0112_1 0:d3702a4e32ea 158 INdata[6] = RXdata[6];
lilac0112_1 0:d3702a4e32ea 159 INdata[7] = RXdata[7];
lilac0112_1 0:d3702a4e32ea 160 INdata[8] = RXdata[8];
lilac0112_1 0:d3702a4e32ea 161 //メインで処理されるデータ = 受け取ったデータ
lilac0112_1 0:d3702a4e32ea 162
lilac0112_1 0:d3702a4e32ea 163 }
lilac0112_1 0:d3702a4e32ea 164 Rx=0;//配列をリセット
lilac0112_1 0:d3702a4e32ea 165 }
lilac0112_1 0:d3702a4e32ea 166
lilac0112_1 0:d3702a4e32ea 167 }