123123123123123123123123123

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
TonyYI
Date:
Thu Jul 03 14:52:44 2014 +0000
Parent:
2:442902ec3aa1
Commit message:
123123

Changed in this revision

communication.cpp Show annotated file Show diff for this revision Revisions of this file
communication.h Show annotated file Show diff for this revision Revisions of this file
compass.cpp Show annotated file Show diff for this revision Revisions of this file
compass.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
port.h Show annotated file Show diff for this revision Revisions of this file
--- a/communication.cpp	Thu Jul 03 10:59:37 2014 +0000
+++ b/communication.cpp	Thu Jul 03 14:52:44 2014 +0000
@@ -27,12 +27,12 @@
 **********************************************************/
 #include <communication.h>
 
-Communication::Communication(MySerial* _DEBUG, MySerial *_IntelToMbed, MySerial *_MbedToArduino)
+Communication::Communication(MySerial* _DEBUG, MySerial *_IntelToMbed, MySerial *_MbedToArduino, COMPASS* _compass)
 {
     this->_DEBUG = _DEBUG;
     this->_IntelToMbed = _IntelToMbed;
     this->_MbedToArduino = _MbedToArduino;
-    this->compass=new COMPASS(COMPASS_TX,COMPASS_RX);
+    this->_compass = _compass;
     init();
 }
 
@@ -40,15 +40,20 @@
 {
     delete[] buffer_IntelToMbed;
     delete[] buffer_MbedToArduino;
+    delete[] forward_msg_buffer;
     delete _DEBUG;
     delete _IntelToMbed;
     delete _MbedToArduino;
+    delete _compass;
 }
 
 void Communication::init()
 {
     buffer_IntelToMbed = new uint8_t[BUFFER_SIZE];
     buffer_MbedToArduino = new uint8_t[BUFFER_SIZE];
+    
+    forward_msg_buffer = new uint8_t[9]; //the message struct is 9 byte
+    
     in_IntelToMbed = 0;
     out_IntelToMbed = 0;
     in_MbedToArduino = 0;
@@ -120,7 +125,7 @@
         buffer_IntelToMbed[in_IntelToMbed++] = _x;
         if(in_IntelToMbed == BUFFER_SIZE)
         {
-            in_IntelToMbed &= 0x00;
+            in_IntelToMbed &= 0x0000;
         }
     }
     else if(communication_type == 1)
@@ -128,7 +133,7 @@
         buffer_MbedToArduino[in_MbedToArduino++] = _x;
         if(in_MbedToArduino == BUFFER_SIZE)
         {
-            in_MbedToArduino &= 0x00;
+            in_MbedToArduino &= 0x0000;
         }
     }
 }
@@ -151,6 +156,7 @@
                 if(_x == STARTER || _x == COMPASS_STARTER)
                 {
                     state_IntelToMbed++;
+                    forward_msg_buffer[0] = _x;
                 }
                 else
                 {
@@ -174,6 +180,7 @@
                 if(action_type == 0 || action_type == 1 || action_type == 2 || action_type == 3 || action_type == 4)
                 {
                     state_IntelToMbed++;
+                    forward_msg_buffer[1] = _x;
                 }
                 else
                 {
@@ -195,6 +202,7 @@
                 check_sum += _x;
                 move_dis = _x << 8;
                 state_IntelToMbed++;
+                forward_msg_buffer[2] = _x;
                 break;
             }
 
@@ -207,6 +215,7 @@
                 check_sum += _x;
                 move_dis |=  _x;
                 state_IntelToMbed++;
+                forward_msg_buffer[3] = _x;
                 break;
             }
 
@@ -221,6 +230,7 @@
                 if((action_type == 0 && (move_dir == 0 || move_dir == 1 || move_dir == 2 || move_dir == 3)) || (action_type == 1 && (move_dir == 0 || move_dir == 2)) || action_type == 2 || action_type == 3 || action_type == 4)
                 {
                     state_IntelToMbed++;
+                    forward_msg_buffer[4] = _x;
                 }
                 else
                 {
@@ -242,6 +252,7 @@
                 check_sum += _x;
                 rotate_dis = _x << 8;
                 state_IntelToMbed++;
+                forward_msg_buffer[5] = _x;
                 break;
             }
 
@@ -254,6 +265,7 @@
                 check_sum += _x;
                 rotate_dis |= _x;
                 state_IntelToMbed++;
+                forward_msg_buffer[6] = _x;
                 break;
             }
 
@@ -268,6 +280,7 @@
                 if(action_type == 3 || action_type == 4 || (action_type == 1 && ((rotate_dir >> 6) == 0)) || ((action_type == 0 || action_type == 2) && ((rotate_dir >> 6) == 3)))
                 {
                     state_IntelToMbed++;
+                    forward_msg_buffer[7] = _x;
                 }
                 else
                 {
@@ -288,6 +301,7 @@
                 }
                 if(check_sum == _x)
                 {
+                    forward_msg_buffer[8] = _x;
                     switch(action_type)
                     {
                         case 0: //car movement
@@ -338,22 +352,27 @@
 void Communication::forwardMessage()
 {
     //message structure is defined in source/motion_platform/intel_board/lib/message.h
-    uint8_t i = out_IntelToMbed - 9; //message size is 9 bytes
-    putByte(buffer_IntelToMbed[i++], 2); //starter, 2 means MbedToArduino
-    putByte(buffer_IntelToMbed[i++], 2); //action_type
-    putByte(buffer_IntelToMbed[i++], 2); //move_dis
-    putByte(buffer_IntelToMbed[i++], 2);
-    putByte(buffer_IntelToMbed[i++], 2); //move_dir
-    putByte(buffer_IntelToMbed[i++], 2); //rotate_dis
-    putByte(buffer_IntelToMbed[i++], 2);
-    putByte(buffer_IntelToMbed[i++], 2); //rotate_dir
-    putByte(buffer_IntelToMbed[i++], 2); //checksum
+    putByte(forward_msg_buffer[0], 2); //starter, 2 means MbedToArduino
+    putByte(forward_msg_buffer[1], 2); //action_type
+    putByte(forward_msg_buffer[2], 2); //move_dis
+    putByte(forward_msg_buffer[3], 2);
+    putByte(forward_msg_buffer[4], 2); //move_dir
+    putByte(forward_msg_buffer[5], 2); //rotate_dis
+    putByte(forward_msg_buffer[6], 2);
+    putByte(forward_msg_buffer[7], 2); //rotate_dir
+    putByte(forward_msg_buffer[8], 2); //checksum
 }
 
 void Communication::ACK(Lifter* lifter, Camera_platform* camera_platform)
 {
     if(action_type == 0) //car movement
     {
+        for(int i = 0; i < 9; i++)
+        {
+            uint8_t _y = getByte(1);
+            printf("Communication::ACK(). Get byte: %x\r\n", _y);
+        }
+        
         while(info_ok_MbedToArduino != 1)
         {
             if(in_MbedToArduino != out_MbedToArduino)
@@ -363,13 +382,21 @@
                 {
                     case 0: //checking starter
                     {
-                        //putByte('0', 1);
+                        if(DEBUG_ON)
+                        {
+                            _DEBUG->printf("Communication::ACK(). Checking SARTER...\r\n");
+                        }
+                        
                         if(_x == STARTER)
                         {
                             state_MbedToArduino++;
                         }
                         else
                         {
+                            if(DEBUG_ON)
+                            {
+                                _DEBUG->printf("Communication::ACK(). ERROR when checking SARTER: %x\r\n", _x);
+                            }
                             state_MbedToArduino = 0;
                         }
                         break;
@@ -377,13 +404,21 @@
 
                     case 1: //checking 'O'
                     {
-                        //putByte('1', 1);
+                        if(DEBUG_ON)
+                        {
+                            _DEBUG->printf("Communication::ACK(). Checking O...\r\n");
+                        }
+                        
                         if(_x == 0x4f) //O
                         {
                             state_MbedToArduino++;
                         }
                         else
                         {
+                            if(DEBUG_ON)
+                            {
+                                _DEBUG->printf("Communication::ACK(). ERROR when checking O: %x\r\n", _x);
+                            }
                             state_MbedToArduino = 0;
                         }
                         break;
@@ -391,13 +426,21 @@
 
                     case 2: //checking 'K'
                     {
-                        //putByte('2', 1);
+                        if(DEBUG_ON)
+                        {
+                            _DEBUG->printf("Communication::ACK(). Checking K...\r\n");
+                        }
+                        
                         if(_x == 0x4b) //K
                         {
                             state_MbedToArduino++;
                         }
                         else
                         {
+                            if(DEBUG_ON)
+                            {
+                                _DEBUG->printf("Communication::ACK(). ERROR when checking K: %x\r\n", _x);
+                            }
                             state_MbedToArduino = 0;
                         }
                         break;
@@ -405,11 +448,22 @@
 
                     case 3: //checking check_sum_MbedToArduino
                     {
-                        //putByte('3', 1);
+                        if(DEBUG_ON)
+                        {
+                            _DEBUG->printf("Communication::ACK(). Checking CHECK_SUM...\r\n");
+                        }
+                        
                         if(_x == 0x9a) //checksum
                         {
                             info_ok_MbedToArduino = 1;
                         }
+                        else
+                        {
+                            if(DEBUG_ON)
+                            {
+                                _DEBUG->printf("Communication::ACK(). ERROR when checking CHECK_SUM: %x\r\n", _x);
+                            }
+                        }
                         
                         state_MbedToArduino = 0;
                         break;
--- a/communication.h	Thu Jul 03 10:59:37 2014 +0000
+++ b/communication.h	Thu Jul 03 14:52:44 2014 +0000
@@ -48,7 +48,7 @@
 class Communication
 {
 public:
-    Communication(MySerial* _DEBUG, MySerial *_IntelToMbed, MySerial *_MbedToArduino);
+    Communication(MySerial* _DEBUG, MySerial *_IntelToMbed, MySerial *_MbedToArduino, COMPASS *_compass);
     ~Communication();
 
     void putToBuffer(uint8_t _x, uint8_t communication_type); //0 is IntelToMbed, 1 is MbedTOArduino
@@ -74,6 +74,7 @@
     void init();
     uint8_t* buffer_IntelToMbed;
     uint8_t* buffer_MbedToArduino;
+    uint8_t* forward_msg_buffer; //for forwarding message to the car
     uint16_t in_IntelToMbed;
     uint16_t out_IntelToMbed;
     uint16_t in_MbedToArduino;
@@ -93,6 +94,7 @@
     MySerial *_DEBUG;
     MySerial *_IntelToMbed;
     MySerial *_MbedToArduino;
+    COMPASS *_compass;
 };
 
 #endif
\ No newline at end of file
--- a/compass.cpp	Thu Jul 03 10:59:37 2014 +0000
+++ b/compass.cpp	Thu Jul 03 14:52:44 2014 +0000
@@ -1,28 +1,126 @@
 #include "compass.h"
+/*
+Serial pc(USBTX, USBRX);
+
 
-COMPASS::COMPASS(PinName tx, PinName rx)
+*/
+
+COMPASS::COMPASS(MySerial* serial)
 {
-   this->serial= new MySerial(tx,rx);
+   this->_serial = serial;
+   
    serial->baud(56000);
    serial->format(8,SerialBase::None, 1);
+   
    init();
 }
 
-
 uint16_t COMPASS::read()
 {
+    printf("before resume  \r\n");
     resume();
-    buffer[0]=serial->getc();
-    buffer[1]=serial->getc();
-    stop();
-    degree=(uint8_t)(buffer[0])*256+(uint8_t)(buffer[1]);
-    return degree;
+    printf("after resume \r\n");
+
+    wait(0.5);
+         printf("before run \r\n");
+
+    run();
+             printf("after run \r\n");
+
+    printf("enter while buffer_count: %d \r\n",buffer_count);
+
+    
+    
+    printf("enter while 1 \r\n");
+    while(1)
+    {
+          if(buffer_count<=2)
+         {
+             buffer_count=0;
+             break;
+         }
+         
+         buffer_count--;
+         uint8_t tempc1=buffer[buffer_count];
+         buffer_count--;
+         uint8_t tempc2=buffer[buffer_count];
+         
+                 temp[0]= tempc1;
+                 temp[1]= tempc2;
+                 
+                 if( 0xa0==( (temp[0]) & 0xe0))
+                 { 
+                    flag=1;
+                    printf("match !!!!!\r\n");
+                 }
+             
+            
+            
+        
+        
+        if(flag==1)
+        {
+                      twobytes=(temp[0])*256+(uint8_t)(temp[1]);
+            
+                     digits= temp[1] & 0x0f;
+            
+                      tens= (temp[1]>>4) & 0x0f;
+            
+                      hundreds= temp[0] & 0x07;
+        
+                     _degree=100*hundreds+10*tens+digits;
+                      printf("buffer[0]: %x\r\n",temp[0]);
+                      printf("buffer[1]: %x\r\n",temp[1]);
+                     temp[0]=0;
+                     temp[1]=0;
+                     flag=0;
+           
+            buffer_count=0;
+            
+             
+             // printf("hundreds: %d\r\n",hundreds);
+//              printf("tens: %d\r\n",tens);
+//              printf("digits: %d\r\n",digits);
+          
+               resume();
+               
+               
+               _degree+=90;
+               
+               if(_degree>=360)
+               _degree-=360;
+              
+                   printf("degree: %d\r\n",_degree);
+              printf("----------------------\r\n");
+               return _degree;
+//            break;
+        }
+   
+    }
+     // printf("leave while 1 \r\n");
+//       wait(0.5);
+//       
+//     printf("before resume2 \r\n");
+//
+//     
+//           printf("after resume2 \r\n");
+
+           
+         
+    return 0;
 }
 
 void COMPASS::init() 
 {
-    run();
-    stop();
+    buffer[0]=0;
+    buffer[1]=0;
+    count=0;
+    flag=0;
+    buffer_count=0;
+    for(int i=0;i<_BUFFER_SIZE;i++)
+    {
+        buffer[i]=0;
+    }
 }
 
 void COMPASS::run() 
@@ -30,19 +128,16 @@
     write2Bytes(RUN_MSB,RUN_LSB);
 }
 
-
 void COMPASS::stop() 
 {
     write2Bytes(STOP_MSB,STOP_LSB);
 }
 
-
 void COMPASS::resume() 
 {
     write2Bytes(RESUME_MSB,RESUME_LSB);
 }
 
-
 void COMPASS::reset() 
 {
     write2Bytes(RST_MSB,RST_LSB);
@@ -50,9 +145,42 @@
 
 void COMPASS::write2Bytes(char msb, char lsb) 
 {
-    serial->putc(msb);
-    serial->putc(lsb);
-   
+    _serial->putc(lsb);
+    _serial->putc(msb);
+    
 }
 
- 
+void COMPASS::putToBuffer(uint8_t data) 
+{
+    if(buffer_count<_BUFFER_SIZE-10)
+    buffer_count++;
+    else
+     {
+     printf("Error full buffer \r\n");
+     buffer_count=0;
+     }
+     
+    buffer[buffer_count]=data;
+    
+}
+//
+//void COMPASS::check_time_out()
+//{
+//    if(flag == 1)
+//    {
+//        ON();
+//        wait(5);
+//        mbed_reset();
+//    }
+//    else
+//    {
+//        OFF();
+//    }
+//}
+//
+//void COMPASS::time_out_init()
+//{
+//    setFlag();
+//    time_out.detach();
+//    time_out.attach(this, &Buzzer::check_time_out, TIME_OUT);
+//}
--- a/compass.h	Thu Jul 03 10:59:37 2014 +0000
+++ b/compass.h	Thu Jul 03 14:52:44 2014 +0000
@@ -22,7 +22,7 @@
 #define COMPASS_TX      p9
 #define COMPASS_RX      p10
 
-
+#define _BUFFER_SIZE 512
 
 #define DECLINATIONANGLE  -0.0457
 #define OFFSET 0
@@ -31,28 +31,35 @@
 
 class COMPASS 
 {
-
 public:
+    COMPASS(MySerial* serial);
+    uint16_t read();
+    void putToBuffer(uint8_t data);
 
-   COMPASS(PinName TX, PinName RX);
-    uint16_t read();
-    
     
 private:
-     
-    MySerial *serial;
-    char buffer[2];
-    uint16_t degree;
+    MySerial* _serial;
+    uint16_t _degree;
+    uint8_t flag;
+    uint8_t count;
+    float declinationAngle;
+    int offset;
+    uint16_t buffer_count;
+    char temp[2];
+    char buffer[_BUFFER_SIZE];
+    uint16_t twobytes;
+    uint8_t hundreds,tens,digits;
     
     void init();
+    void write2Bytes(char msb, char lsb);
+    
     void run();
     void stop();
     void resume();
     void reset();
-    void write2Bytes(char msb, char lsb);
     
-    float declinationAngle;
-    int offset;
+  //  void check_time_out();
+//    void time_out_init();
 };
 
 #endif /* COMPASS_H */
\ No newline at end of file
--- a/main.cpp	Thu Jul 03 10:59:37 2014 +0000
+++ b/main.cpp	Thu Jul 03 14:52:44 2014 +0000
@@ -40,34 +40,42 @@
         buzzer.time_out_init();
         if(com.getInfoOK(0) == 1) //car
         {
+            printf("main(). Car action starting...\r\n");
             com.forwardMessage();
             com.ACK(&lifter, &camera_platform);
             com.resetInfoOK(0);
             com.resetInfoOK(1);
+            printf("main(). Car action ended...\r\n");
         }
         else if(com.getInfoOK(0) == 2) //lifter
         {
+            printf("main(). Lifter action starting...\r\n");
             lifter.lifterMove(com.getMoveDis(), com.getMoveDir(), com.getRotateDis(), com.getRotateDir());
             com.ACK(&lifter, &camera_platform);
             com.resetInfoOK(0);
             com.resetInfoOK(1);
+            printf("main(). Lifter action ended...\r\n");
         }
         else if(com.getInfoOK(0) == 3) //camera_platform
         {
+            printf("main(). camera_platform action starting...\r\n");
             camera_platform.cameraPlatformMove(com.getMoveDis(), com.getMoveDir(), com.getRotateDis(), com.getRotateDir());
             com.ACK(&lifter, &camera_platform);
             com.resetInfoOK(0);
             com.resetInfoOK(1);
+            printf("main(). Camera_platform action ended...\r\n");
         }
         else if(com.getInfoOK(0) == 4) //compass
         {
+            printf("main(). Compass action starting...\r\n");
             com.ACK(&lifter, &camera_platform);
             com.resetInfoOK(0);
             com.resetInfoOK(1);
+            printf("main(). Compass action ended...\r\n");
         }
-        
-         else if(com.getInfoOK(0) == 5) //compass
+        else if(com.getInfoOK(0) == 5) //buzzer
         {
+            printf("main(). Buzzer action starting...\r\n");
             buzzer.ON();
             wait(0.1);
             buzzer.OFF();
@@ -78,6 +86,7 @@
             com.ACK(&lifter, &camera_platform);
             com.resetInfoOK(0);
             com.resetInfoOK(1);
+            printf("main(). Buzzer action ended...\r\n");
         }
         
         buzzer.cleanFlag();
--- a/port.h	Thu Jul 03 10:59:37 2014 +0000
+++ b/port.h	Thu Jul 03 14:52:44 2014 +0000
@@ -34,6 +34,7 @@
 MyDigitalOut IntelToMbed_LED(LED1); //uart port LED between Intel Board and Mbed
 MyDigitalOut MbedToArduino_LED(LED2); //uart port LED between Mbed and Arduino
 MySerial DEBUG(USBTX, USBRX); //usb serial port between computer and Mbed
+MySerial CompassData(p9, p10); ////uart port between compass and Mbed
 MySerial IntelToMbed(p13, p14); //uart port between Intel Board and Mbed
 MySerial MbedToArduino(p28, p27); //uart port between Mbed and Arduino
 MyPwmOut lifter_pwmUp(p21);
@@ -48,8 +49,9 @@
 
 MyDigitalOut buzzer_pin(p29);
 Buzzer buzzer(&buzzer_pin);
+COMPASS compass(&CompassData);
 
-Communication com(&DEBUG, &IntelToMbed, &MbedToArduino);
+Communication com(&DEBUG, &IntelToMbed, &MbedToArduino, &compass);
 Lifter lifter(&lifter_enable, &lifter_pwmUp, &lifter_pwmDown, &lifter_encoder_A, &lifter_encoder_B);
 Camera_platform camera_platform(&camera_platform_pwmRoll, &camera_platform_pwmPitch, &camera_platform_pwmYaw);
 
@@ -67,6 +69,13 @@
     com.putToBuffer(_x, 1); //function inside Communication::
     //__enable_irq();
 }
+void compassHandler()
+{
+    //__disable_irq();//disable interupt when receiving data from XBEE_UART
+    uint8_t _x = CompassData.getc();
+    compass.putToBuffer(_x); //function inside Communication::
+    //__enable_irq();
+}
 
 void LifterPulseHandler()
 {
@@ -100,6 +109,9 @@
     MbedToArduino.baud(9600);
     MbedToArduino.attach(&MbedToArduinoRxHandler); //serial interrupt function
     
+    CompassData.baud(56000);
+    CompassData.attach(&compassHandler);
+    
     lifter_encoder_A.fall(&LifterPulseHandler); //interrupt
     
     camera_platform_pwmRoll.period_ms(20); //20ms periodic, 1000us to 2000us