中継機能つけた受け取りオムニ

Dependencies:   mbed MultiSerial

Revision:
3:1f1498403eec
Parent:
2:d0de0fab161f
Child:
4:5da566692b79
--- a/main.cpp	Tue Aug 19 11:24:13 2014 +0000
+++ b/main.cpp	Tue Aug 19 11:58:06 2014 +0000
@@ -15,6 +15,12 @@
 #include <math.h>
 #include "RawSerial.h"
 
+#define DATA_NUM 4 //DATA_NUM[byte]通信
+#define MY_KEYCODE 0xAA//keycode
+#define EN_KEYCODE 0xAA//keycode
+#define KEY 0//number of first data
+#define CHECK DATA_NUM-1//number of last data
+
 DigitalOut check(LED1);
 BusOut motors(p21,p22,p23,p24,p25,p26,p27,p28);
 
@@ -22,22 +28,40 @@
 RawSerial xbee(p13,p14);
 
 //i2c init
-
 int addr = 0x01;
 char buff[1];
 
-uint8_t value=0;
-uint8_t omni_value=0;
+//serial init
+volatile uint8_t INdata[DATA_NUM]={0};
 
 //armMbed.frequency(10000);
 
 void getData() //serial xbee to mbed
-{   
-    value = xbee.getc();
-
-    buff[0]=value>>4;
-    omni_value=value<<4;                    
+{  
+    static uint8_t RX=0, i;
+    static uint8_t RXdata[DATA_NUM]={EN_KEYCODE};
+    static uint8_t RX_CHECKCODE=0;
+    RXdata[RX] = xbee.getc();
+    if(RXdata[KEY]==EN_KEYCODE){
+        RX++;
+    }
+    
+    if(RX==CHECK){
+        for(i=KEY+1, RX_CHECKCODE=0; i<CHECK; i++){
+            RX_CHECKCODE ^= RXdata[i];
+        }//CHECKCODE作成
+    }
+    if(RX >= DATA_NUM){
+        if(RXdata[CHECK]==RX_CHECKCODE){
+            INdata[1] = RXdata[1];
+            INdata[2] = RXdata[2];
+        }
+        RX=0;
+    }
+             
+    buff[0]=INdata[1];                  
     armMbed.write(addr,buff,1);
+    buff[0]=0;
 }
 
 int main()
@@ -45,11 +69,11 @@
     xbee.attach(&getData, RawSerial::RxIrq);
 
     for(;;){
-            if(omni_value==0x0) motors = 0;
-            if(omni_value&0x10) motors = 0x05; //p21,p23 
-            if(omni_value&0x20) motors = 0x0A; //p22,p24 
-            if(omni_value&0x40) motors = 0x50; //p25,p27        
-            if(omni_value&0x80) motors = 0xA0; //p26,p28
+            if(INdata[2]==0x0) motors = 0;
+            if(INdata[2]&0x10) motors = 0x05; //p21,p23 
+            if(INdata[2]&0x20) motors = 0x0A; //p22,p24 
+            if(INdata[2]&0x40) motors = 0x50; //p25,p27        
+            if(INdata[2]&0x80) motors = 0xA0; //p26,p28
             
              check = !check;
         }