OX V1

Dependencies:   mbed

Revision:
0:6182212860fb
Child:
1:6514e03fe62f
diff -r 000000000000 -r 6182212860fb main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Dec 05 15:55:28 2016 +0000
@@ -0,0 +1,336 @@
+#include "mbed.h"
+#include "Moop.h"
+#include "bmu.h"
+#include "Latrix.h"
+#include "zmu9250.h"
+#include "MPU9250.h"
+
+InterruptIn lim(PinName D3);
+InterruptIn rotate(PinName  D4);
+InterruptIn choose(PinName  D5);
+Ticker flipper;
+Ticker Update;
+
+Moop map;
+
+Serial pc(PinName  USBTX,PinName  USBRX);
+Serial mas(PinName D8,PinName D2);
+
+bmuimu imu;
+Latrix ledMatrix;
+
+Time t;
+
+bool anach = false;
+bool buttonState = {0,0,0}; // button limit switchm rotate and choose state respectively.
+unsigned int count = 10; // count down.
+char data[50];
+char elem;
+bool error = false; // store error in ambigous imu data. 
+int helperRoll = 0, helperPitch=0,helperYaw=0;
+unsigned int indx = 0;
+unsigned int state = 0;
+
+// state    0 = initial / start.
+//          1 = waiting for limit switch.
+
+unsigned int turn = 0; // turn.
+
+unsigned int x = 0, y = 0, z = 0,lx=0,ly=0,lz=0;
+int winStatus = 0;
+
+void Rise(int but)
+{
+    buttonState[but-3] = 1;
+}
+
+void Fall(int but)
+{
+    buttonState[but-3] = 0;   
+}
+
+void Update()
+{
+    imu.Update();   
+}
+
+void Sent(char arrayi[],float it,int siz)
+{
+    for (int i = 0;i<siz;i++)
+        {
+            mas.putc(arrayi[i]);
+            wait(it);
+        }   
+}
+
+void getStr()
+{
+    while (mas.readable())
+    {
+        
+        elem = mas.getc();
+        pc.printf("char is %d\n\r",elem);
+        if ((elem == '\n'))
+        {
+            pc.printf("string is %s\n\r",data);   
+            for(int i=0;i<indx;i++)
+            {
+                if (indx > 2)
+                {
+                    dete[i] = data[i];      
+                }
+            }
+            for(int i=0;i<30;i++)
+            {
+                data[i] = '\0';
+            }
+            indx = 0;
+            break;
+        }else
+        {
+            data[indx] = elem;
+            indx += 1;
+        }
+            
+    }  
+}
+
+void ShowMap()
+{
+    int mmapx[5][5][5] = {0};
+    int mmapy[5][5][5] = {0};
+    for(int i=0;i<5;i++)
+    {
+        for(int j = 0;j<5;j++)
+        {
+            for (int k =0;k<5;k++)
+            {
+                mmapx[i][j] = map.check1[i][j][k]*pow(2,k);
+                Sent(char(mmapx[i]+64)[j],0.1,1);
+                Sent("\n",0.1,1);
+                mmapy[i][j] = map.check2[i][j][k]*pow(2,k);
+                Sent(char(mmapy[i]+64)[j],0.1,1);
+                Sent("\n",0.1,1);
+            }   
+        }   
+    }
+    int page = 0;
+    while(1)
+    {
+        if (page == 5)
+        {
+            page = 4;   
+        }else if(page == -1)
+        {
+            page = 0;   
+        }
+        ledMatrix.Show(mmapx[page],mmapy[page]);
+        if(buttonState[2]==1)
+        {
+            while(buttonState[2]==1)
+            {
+                
+            }
+            page += 1;   
+        }
+        else if(buttonState[1]==1)
+        {
+            while(buttonState[1]==1)
+            {
+                
+            }
+            page -= 1;   
+        }   
+    }
+}
+
+void Loose()
+{
+    ledMatrix.Loose();
+    Sent("los\n",0.1,4);
+    ShowMap();
+}
+
+void Wiin()
+{
+    ledMatrix.Wiin();
+    Sent("lwin\n",0.1,4);
+    ShowMap();
+}
+
+
+
+bool chooseAnother()
+{
+    Sent('cho\n',0.1,4);
+    while(1)
+    {
+        if ((dete[0]='c')&&(dete[1]='h')&&(dete[2]='0'))   
+        {
+            return true;
+        }else if ((dete[0]='c')&&(dete[1]='h')&&(dete[2]='x')) 
+        {
+            return false;
+        }
+    }
+}
+
+bool anotherRotate()
+{
+    Sent('rot\n',0.1,4);
+    while(1)
+    {
+        if ((dete[0]='r')&&(dete[1]='o')&&(dete[2]='t'))   
+        {
+            return true;
+        }else if ((dete[0]='r')&&(dete[1]='o')&&(dete[2]='x')) 
+        {
+            return false;
+        }
+    }
+}
+
+int main()// main program of 
+{
+    lim.rise(&Rise(3));
+    lim.fall(&Fall(3));
+    rotate.rise(&Rise(4));
+    rotate.fall(&Fall(4));
+    choose.rise(&Rise(5));
+    choose.fall(&Fall(5));
+    
+    ledMatrix.Initial(); // set initial pattern in led matrix.
+    wait(5); // wait 5 second for putting the box down to set initial position of imu.
+    //imu.Initial(); // set initial for imu.
+    Update.attach(&Update,1.0); //timer interrupt for recieving bluetooth. 
+    while((dete[0]!='i')||(dete[1]!='n')||(dete[2]!='i')||(dete[3]!='t'))
+    {
+    }
+    ledMatrix.Wbox(); // set led to tell the player that the game is ready and this is the woman-box.
+    t.start();
+    while (1) // void loop.
+    {
+        state = 1;
+        
+        if (buttonState[0] == 1) // if the boxes are connected.
+        {
+            x = map.GetCoordinateX();
+            y = map.GetCoordinateY(); 
+            z = map.GetCoordinateZ(); // get the position of main box which linking with map or the box not be choosen.
+            /*Sent("helr\n",0.1,5); // tell the other box, that we want helper roll.
+            while((dete[0]!='h')||(dete[1]!='e')||(dete[2]!='l')||(dete[3]!='r'))
+            {
+                pc.printf("srt %s\n\r",dete);     
+            }
+            helperRoll = int(  ((int(dete[4+ii])-48)*100)+((int(dete[5+ii])-48)*10)+(int(dete[6+ii])-48)  ); //get roll from another box.
+            Sent("help\n",0.1,5); // tell the other box, that we want helper roll.
+            while((dete[0]!='h')||(dete[1]!='e')||(dete[2]!='l')||(dete[3]!='p'))
+            {
+                pc.printf("srt %s\n\r",dete);     
+            }
+            helperPitch = int(  ((int(dete[4+ii])-48)*100)+((int(dete[5+ii])-48)*10)+(int(dete[6+ii])-48)  ); //get roll from another box.
+            Sent("hely\n",0.1,5); // tell the other box, that we want helper roll.
+            while((dete[0]!='h')||(dete[1]!='e')||(dete[2]!='l')||(dete[3]!='y'))
+            {
+                pc.printf("srt %s\n\r",dete);     
+            }
+            helperYaw = int(  ((int(dete[4+ii])-48)*100)+((int(dete[5+ii])-48)*10)+(int(dete[6+ii])-48)  ); //get roll from another box.*/
+            //Sent("ok\n",0.1,3); //free the otherbox.
+            
+            error = imu.getposition(x,y,z)//,helperRoll,helperPitch,helperYaw); // calculate position from imu.
+            if (error)
+            {
+                ledMatrix.Error()
+                while(buttonState[0] == 1)
+                {
+                       
+                }
+            }else
+            {
+                lx = x;
+                ly = y;
+                lz = z;
+                x = imu.getX();
+                y = imu.getY();
+                z = imu.getZ(); // get new possition.
+                
+                winStatus = map.Update(x,y,z)//,helperRoll); //update new position in map.
+                
+                map.ChangeOX([x,y,z,lx,ly,lz])
+                if (winStatus == 1)  
+                {
+                    Wiin(); // win 3 in a row.
+                }else if (winStatus == -1)
+                {
+                    Loose();// lose out of map or un valid position.
+                }else 
+                {
+                    Sent("mapc\n",0.1,4); //map complete.
+                    ledMatrix.MapComplete(); // show that this position is ok.
+                    while(1)
+                    {
+                        anach = chooseAnother() // wheather thr others box is choosen. 
+                        if ((buttonState[2]==1) && (!anach)) 
+                        {
+                            Sent("ch1\n",0.1,4);
+                            
+                            map.Choose(1); // choose main box.
+                        }else if((buttonState[2]==0) && (anach))
+                        {
+                            map.Choose(0); // choose another box.
+                            
+                        }else if(buttonState[2]==0) 
+                        {
+                            if((buttonState[1]==0)||(anotherRotate())) // click buutton some rotate box.
+                            {
+                                state = 3;
+                                while((buttonState[1]==0)&&(anotherRotate()))
+                                {
+                                    
+                                }
+                                
+                                int yyaaww = imu.Rotate(); // check wheater rotating is error. 
+                                if (false)
+                                {
+                                    ledMatrix.Error();
+                                       
+                                }else
+                                {
+                                    map.Rotate(0,0,yyaaww)//imu.Rotate_Yaw); // private variable/arttribute in imu class.
+                                    ledMatrix.RotateComplete();   
+                                }
+                            }  
+                        } //close choose or rotate.
+                     } //close while true.
+                     turn += 1; 
+                     Sent("T++\n",0.1,4);
+                     t.start();
+                     state = 2;
+                     ledMatrix.ChooseComplete();
+                } // close winState.
+            } // close not error.
+            
+        }else // if the boxes aren't connect.
+        {
+            if (count == 0) // time out.
+            {
+                t.stop();
+                Loose(); // lose state
+            }else if(turn != 0)
+            {
+                t.stop();
+                if (t.read() > 1.0);
+                {
+                    t.start();
+                    count -= 1; // time decreasing.
+                }
+            } // close check time
+            ledMatrix.CountDown(count);.
+            Sent("Tur\n",0.1,4)
+        } // close boxes aren't connect.
+        
+    } // close loop.
+    
+    
+    
+} // close main.*/
\ No newline at end of file