FINAL ACS TO BE USED FOR TESTING. COMMISSIONING, ACS MAIN, DATA ACQ ALL DONE.

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of ACS_FULL_Flowchart_BAE by Team Fox

Revision:
19:403cb36e22ed
Parent:
18:21740620c65e
--- a/ACS.cpp	Mon Jun 13 13:44:31 2016 +0000
+++ b/ACS.cpp	Tue Jun 28 10:11:54 2016 +0000
@@ -16,7 +16,6 @@
 extern uint8_t ACS_ATS_STATUS;
 extern uint8_t ACS_MAIN_STATUS;
 extern uint8_t ACS_STATUS;
-extern uint8_t ACS_DETUMBLING_ALGO_TYPE;
 
 extern DigitalOut ATS1_SW_ENABLE; // enable of att sens2 switch
 extern DigitalOut ATS2_SW_ENABLE; // enable of att sens switch
@@ -44,15 +43,12 @@
 Serial pc_acs(USBTX,USBRX); //for usb communication
 //CONTROL_ALGO
 
-float moment[3]; // Unit: Ampere*Meter^2
 float b_old[3]={1.15e-5,-0.245e-5,1.98e-5};  // Unit: Tesla
-float db[3];
 uint8_t flag_firsttime=1, alarmmode=0;
 
 
 
 
-void controlmodes(float b[3], float db[3], float omega[3], uint8_t controlmode1);
 float max_array(float arr[3]);
 void inverse(float mat[3][3],float inv[3][3]);
 
@@ -61,20 +57,21 @@
 
 
 
-void FCTN_ACS_CNTRLALGO ( float b[3] , float omega[3],int nominal)
+void FCTN_ACS_CNTRLALGO (float moment[3],float b[3] ,float omega[3],uint8_t nominal,uint8_t detumbling,uint8_t ACS_DETUMBLING_ALGO_TYPE)
 {
-
+    float db[3];
     float normalising_fact;
     float b_copy[3], omega_copy[3], db_copy[3];
     int i;
     if(flag_firsttime==1)
         {
             for(i=0;i<3;i++)
-        {
+                {
                 db[i]=0; // Unit: Tesla/Second
-        }
+                }
             flag_firsttime=0;
         }
+        
     else
     {
         for(i=0;i<3;i++)
@@ -83,18 +80,18 @@
         }
     }
     
-        if(nominal == 0)
+    if(nominal == 0)
         
         {
     
                 if(max_array(omega)<(0.8*OmegaMax) && alarmmode==1)
-            {
-                    alarmmode=0;
-            }
+                {
+                        alarmmode=0;
+                }
                 else if(max_array(omega)>OmegaMax&& alarmmode==0)
-            {
-                    alarmmode=1;
-            }
+                {
+                        alarmmode=1;
+                }
             
         }
         
@@ -108,51 +105,52 @@
         omega_copy[i]=omega[i];
     }
 
-    if((alarmmode==0)|| (nominal == 1))
-        {
-            controlmodes(b,db,omega,0);
-        for (i=0;i<3;i++)
+    if(((alarmmode==0)|| (nominal == 1))&&(detumbling==0))
         {
-            b[i]=b_copy[i];
-            db[i]=db_copy[i];
-            omega[i]=omega_copy[i];
-        }
-            if(max_array(moment)>MmntMax)
-            {
-                controlmodes(b,db,omega,1);
+            controlmodes(moment,b,db,omega,0x00,ACS_DETUMBLING_ALGO_TYPE);
             for (i=0;i<3;i++)
             {
                 b[i]=b_copy[i];
                 db[i]=db_copy[i];
                 omega[i]=omega_copy[i];
             }
-                if(max_array(moment)>MmntMax)
-                {
-                    normalising_fact=max_array(moment)/MmntMax;
-                    for(i=0;i<3;i++)
-                {
-                        moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
-                }
-                }
+            if(max_array(moment)>MmntMax)
+            {
+                    controlmodes(moment,b,db,omega,0x01,ACS_DETUMBLING_ALGO_TYPE);
+                    for (i=0;i<3;i++)
+                    {
+                        b[i]=b_copy[i];
+                        db[i]=db_copy[i];
+                        omega[i]=omega_copy[i];
+                    }
+                    if(max_array(moment)>MmntMax)
+                    {
+                            normalising_fact=max_array(moment)/MmntMax;
+                            for(i=0;i<3;i++)
+                            {
+                                    moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
+                            }
+                    }
             }
-            ACS_STATUS = 5;
+             
         }
-        else
+        
+    else
         {   
-            controlmodes(b,db,omega,1);
-        for (i=0;i<3;i++)
-        {
-            b[i]=b_copy[i];
-            db[i]=db_copy[i];
-            omega[i]=omega_copy[i];
-        }
+            controlmodes(moment,b,db,omega,0x01,ACS_DETUMBLING_ALGO_TYPE);
+            for (i=0;i<3;i++)
+            {
+                b[i]=b_copy[i];
+                db[i]=db_copy[i];
+                omega[i]=omega_copy[i];
+            }
             if(max_array(moment)>MmntMax)
             {
                 normalising_fact=max_array(moment)/MmntMax;
                 for(i=0;i<3;i++)
-            {
-                    moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
-            }
+                    {
+                            moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
+                    }
             }
         
         }
@@ -206,7 +204,7 @@
 }
 
 
-void controlmodes(float b[3], float db[3], float omega[3], uint8_t controlmode1)
+void controlmodes(float moment[3],float b[3], float db[3], float omega[3], uint8_t controlmode1,uint8_t ACS_DETUMBLING_ALGO_TYPE)
 {
     float bb[3]={0,0,0};
     float d[3]={0,0,0};
@@ -230,73 +228,75 @@
         if (singularity_flag==0)
         {
             for(i=0;i<3;i++)
-            {
-                db[i]=((db[i]*den*den)-(b[i]*(den2)))/(pow(den,3)); // Normalized db. Hence the unit is Second^(-1)
-            }
+                {
+                    db[i]=((db[i]*den*den)-(b[i]*(den2)))/(pow(den,3)); // Normalized db. Hence the unit is Second^(-1)
+                }
             for(i=0;i<3;i++)
-            {
-                b[i]/=den; // Mormalized b. Hence no unit.
-            }
+                {
+                    b[i]/=den; // Mormalized b. Hence no unit.
+                }
             if(b[2]>0.9 || b[2]<-0.9)
-            {
-                kz=kz2;
-                kmu=kmu2;
-                gamma=gamma2;
-            }
+                {
+                    kz=kz2;
+                    kmu=kmu2;
+                    gamma=gamma2;
+                }
             for(i=0;i<2;i++)
-            {
-                Mu[i]=b[i];
-                v[i]=-kmu*Mu[i];
-                dv[i]=-kmu*db[i];
-                z[i]=db[i]-v[i];
-                u[i]=-kz*z[i]+dv[i]-(Mu[i]/gamma);
-            }
+                {
+                    Mu[i]=b[i];
+                    v[i]=-kmu*Mu[i];
+                    dv[i]=-kmu*db[i];
+                    z[i]=db[i]-v[i];
+                    u[i]=-kz*z[i]+dv[i]-(Mu[i]/gamma);
+                }
             inverse(Jm,invJm,singularity_flag);
             for(i=0;i<3;i++)
-            {
-                for(j=0;j<3;j++)
                 {
-                    bb[i]+=omega[j]*(omega[(i+1)%3]*Jm[(i+2)%3][j]-omega[(i+2)%3]*Jm[(i+1)%3][j]);
+                    for(j=0;j<3;j++)
+                    {
+                        bb[i]+=omega[j]*(omega[(i+1)%3]*Jm[(i+2)%3][j]-omega[(i+2)%3]*Jm[(i+1)%3][j]);
+                    }
                 }
-            }
             for(i=0;i<3;i++)
-            {
-                for(j=0;j<3;j++)
                 {
-                    d[i]+=bb[j]*invJm[i][j];
+                    for(j=0;j<3;j++)
+                    {
+                        d[i]+=bb[j]*invJm[i][j];
+                    }
                 }
-            }
             bb[1]=u[0]-(d[1]*b[2])+(d[2]*b[1])-(omega[1]*db[2])+(omega[2]*db[1]);
             bb[2]=u[1]-(d[2]*b[0])+(d[0]*b[2])-(omega[2]*db[0])+(omega[0]*db[2]);
             bb[0]=0;
             for(i=0;i<3;i++)
-            {
-                d[i]=invJm[2][i];
-                invJm[1][i]=-b[2]*invJm[1][i]+b[1]*d[i];
-                invJm[2][i]=b[2]*invJm[0][i]-b[0]*d[i];
-                invJm[0][i]=b[i];
-            }
+                {
+                    d[i]=invJm[2][i];
+                    invJm[1][i]=-b[2]*invJm[1][i]+b[1]*d[i];
+                    invJm[2][i]=b[2]*invJm[0][i]-b[0]*d[i];
+                    invJm[0][i]=b[i];
+                }
             inverse(invJm,Jm,singularity_flag);
             if (singularity_flag==0)
-            {
-                for(i=0;i<3;i++)
                 {
-                    for(j=0;j<3;j++)
-                    {
-                        tauc[i]+=Jm[i][j]*bb[j]; // Unit: Newton*Meter^2
-                    }
+                        for(i=0;i<3;i++)
+                        {
+                            for(j=0;j<3;j++)
+                            {
+                                tauc[i]+=Jm[i][j]*bb[j]; // Unit: Newton*Meter^2
+                            }
+                        }
+                        for(i=0;i<3;i++)
+                        {
+                            bcopy[i]=b[i]*den;
+                        }
+                        for(i=0;i<3;i++)
+                        {
+                            Mmnt[i]=bcopy[(i+1)%3]*tauc[(i+2)%3]-bcopy[(i+2)%3]*tauc[(i+1)%3];
+                            Mmnt[i]/=(den*den); // Unit: Ampere*Meter^2
+                        }
                 }
-                for(i=0;i<3;i++)
-                {
-                    bcopy[i]=b[i]*den;
-                }
-                for(i=0;i<3;i++)
-                {
-                    Mmnt[i]=bcopy[(i+1)%3]*tauc[(i+2)%3]-bcopy[(i+2)%3]*tauc[(i+1)%3];
-                    Mmnt[i]/=(den*den); // Unit: Ampere*Meter^2
-                }
-            }
+                
         }
+        
         if (singularity_flag==1)
         {
             for (i=0;i<3;i++)
@@ -304,26 +304,29 @@
                 Mmnt[i]=2*MmntMax;
             }
         }
+        ACS_STATUS = 5;
     }
+    
     else if(controlmode1==1)
     {
-        if (ACS_DETUMBLING_ALGO_TYPE==0) // BOmega Algo
-        {
-            for(i=0;i<3;i++)
+            if (ACS_DETUMBLING_ALGO_TYPE==0) // BOmega Algo
             {
-                Mmnt[i]=-kdetumble*(b[(i+1)%3]*omega[(i+2)%3]-b[(i+2)%3]*omega[(i+1)%3]); // Unit: Ampere*Meter^2
+                for(i=0;i<3;i++)
+                {
+                    Mmnt[i]=-kdetumble*(b[(i+1)%3]*omega[(i+2)%3]-b[(i+2)%3]*omega[(i+1)%3]); // Unit: Ampere*Meter^2
+                }
+                ACS_STATUS = 6;
             }
-            ACS_STATUS = 6;
-        }
-        else if(ACS_DETUMBLING_ALGO_TYPE==1) // BDot Algo
-        {
-            for(i=0;i<3;i++)
+            else if(ACS_DETUMBLING_ALGO_TYPE==1) // BDot Algo
             {
-                Mmnt[i]=-kdetumble*db[i];
+                for(i=0;i<3;i++)
+                {
+                    Mmnt[i]=-kdetumble*db[i];
+                }
+                ACS_STATUS = 4;
             }
-            ACS_STATUS = 4;
-        }
     }
+    
     for(i=0;i<3;i++)
     {
         moment[i]=Mmnt[i]; // Unit: Ampere*Meter^2
@@ -336,17 +339,10 @@
 int SENSOR_INIT();
 int FCTN_ATS_DATA_ACQ(); //data is obtained
 int SENSOR_DATA_ACQ();
-void T_OUT(); //timeout function to stop infinite loop
 
 int CONFIG_UPLOAD();
-Timeout to; //Timeout variable to
-int toFlag; 
 
 int count =0; // Time for which the BAE uC is running (in seconds)
-void T_OUT()
-{
-    toFlag=0; //as T_OUT function gets called the while loop gets terminated
-}
 
 
 //DEFINING VARIABLES
@@ -358,7 +354,9 @@
 int16_t bit_data;
 uint16_t time_data;
 float gyro_data[3], mag_data[3];
-float gyro_error[3]= {0,0,0}, mag_error[3]= {0,0,0};
+
+
+int ack;
 
 int CONFIG_UPLOAD()
 {
@@ -391,17 +389,48 @@
     
 }
 
+
 int SENSOR_INIT()
 {
     
     pc_acs.printf("Entered sensor init\n \r");
     cmd[0]=RESETREQ;
     cmd[1]=BIT_RESREQ;
-    i2c.write(SLAVE_ADDR,cmd,2);                                //When 0x01 is written in reset request register Emulates a hard power down/power up
-    wait_ms(600);                                               //waiting for loading configuration file stored in EEPROM
+    wait(1);
+    ack = i2c.write(SLAVE_ADDR,cmd,2);                                //When 0x01 is written in reset request register Emulates a hard power down/power up
+    
+    pc_acs.printf("ACK for reset is %d\r\n",ack);                   //waiting for loading configuration file stored in EEPROM  
+    
+    if( ack!=0) 
+    {
+            cmd[0]=RESETREQ;
+            cmd[1]=BIT_RESREQ;
+            ack = i2c.write(SLAVE_ADDR,cmd,2);                                //repeat
+            if(ack !=0)
+                return 0;
+    }    
+    
+    wait_ms(600);
+                                            
     cmd[0]=SENTRALSTATUS;
-    i2c.write(SLAVE_ADDR,cmd,1);
-    i2c.read(SLAVE_ADDR_READ,&store,1);
+    ack = i2c.write(SLAVE_ADDR,cmd,1);
+    
+    if( ack!=0)
+    {
+        ack = i2c.write(SLAVE_ADDR,cmd,1);
+        if(ack!=0)
+            return 0;
+    }
+    ack = i2c.read(SLAVE_ADDR_READ,&store,1);
+    
+    if( ack!=0)
+    {
+        ack = i2c.read(SLAVE_ADDR_READ,&store,1);
+        if(ack!=0)
+            return 0;
+    }
+    
+
     
     pc_acs.printf("Sentral Status is %x\n \r",(int)store);
     
@@ -416,13 +445,33 @@
         default: {
             cmd[0]=RESETREQ;
             cmd[1]=BIT_RESREQ;
-            i2c.write(SLAVE_ADDR,cmd,2);
+            ack = i2c.write(SLAVE_ADDR,cmd,2);
+            if( ack!=0)
+                {
+                    ack = i2c.write(SLAVE_ADDR,cmd,2);
+                    if(ack!=0)
+                        return 0;
+                }
             wait_ms(600);
             
             cmd[0]=SENTRALSTATUS;
-            i2c.write(SLAVE_ADDR,cmd,1);
-            i2c.read(SLAVE_ADDR_READ,&store,1);
-            wait_ms(100);
+            ack = i2c.write(SLAVE_ADDR,cmd,1);
+            
+            if( ack!=0)
+            {
+                ack = i2c.write(SLAVE_ADDR,cmd,1);
+                if(ack!=0)
+                    return 0;
+            }
+            ack = i2c.read(SLAVE_ADDR_READ,&store,1);
+            
+            if( ack!=0)
+            {
+                ack = i2c.read(SLAVE_ADDR_READ,&store,1);
+                if(ack!=0)
+                    return 0;
+            }
+            
             pc_acs.printf("Sentral Status is %x\n \r",(int)store);
             
         }
@@ -430,12 +479,19 @@
 
     
     int manual=0;
-    if( ((int)store != 11 )&&((int)store != 11))
+    
+    if( ((int)store != 11 )&&((int)store != 3))
     {
 
             cmd[0]=RESETREQ;
             cmd[1]=BIT_RESREQ;
-            i2c.write(SLAVE_ADDR,cmd,2);
+            ack = i2c.write(SLAVE_ADDR,cmd,2);
+            if( ack!=0)
+                {
+                    ack = i2c.write(SLAVE_ADDR,cmd,2);
+                    if(ack!=0)
+                        return 0;
+                }
             wait_ms(600);
             
             manual = CONFIG_UPLOAD();
@@ -450,32 +506,87 @@
     
         cmd[0]=HOST_CTRL; //0x01 is written in HOST CONTROL register to enable the sensors
         cmd[1]=BIT_RUN_ENB;
-        i2c.write(SLAVE_ADDR,cmd,2);
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
+        
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+              }
         
         cmd[0]=MAGRATE; //Output data rate of 100Hz is used for magnetometer
         cmd[1]=BIT_MAGODR;
-        i2c.write(SLAVE_ADDR,cmd,2);
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+            }
         
         cmd[0]=GYRORATE; //Output data rate of 150Hz is used for gyroscope
         cmd[1]=BIT_GYROODR;
-        i2c.write(SLAVE_ADDR,cmd,2);
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
+        
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+            }
         
         cmd[0]=ACCERATE; //Output data rate of 0 Hz is used to disable accelerometer
-        cmd[1]=0x00;
+        cmd[1]=0x00;  
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
         
-        i2c.write(SLAVE_ADDR,cmd,2);
-        wait_ms(100);
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+            }
+        
         cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register , to scaled sensor values
         cmd[1]=0x00;
-        i2c.write(SLAVE_ADDR,cmd,2);
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
+        
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+            }
         
         cmd[0]=ENB_EVT; //Enabling the CPU reset , error,gyro values and magnetometer values
         cmd[1]=BIT_EVT_ENB;
-        i2c.write(SLAVE_ADDR,cmd,2);
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+            }
         
         cmd[0]=SENTRALSTATUS;
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&store,1);
+        ack = i2c.write(SLAVE_ADDR,cmd,1);
+        
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,1);
+                  if(ack!=0)
+                  return 0;
+            }
+            
+        ack= i2c.read(SLAVE_ADDR_READ,&store,1);
+                if( ack!=0)
+            {
+                  ack= i2c.read(SLAVE_ADDR_READ,&store,1);
+                  if(ack!=0)
+                  return 0;
+            }
+            
+        
         pc_acs.printf("Sentral Status after initialising is %x\n \r",(int)store);
         
         if( (int)store == 3)      //Check if initialised properly and not in idle state
@@ -483,51 +594,7 @@
             pc_acs.printf("Exited sensor init successfully\n \r");  
             return 1;
         }
-        
-        else if((int)store == 11)
-        {
-            cmd[0]=HOST_CTRL; //0x01 is written in HOST CONTROL register to enable the sensors
-            cmd[1]=BIT_RUN_ENB;
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(100);
-            
-            cmd[0]=MAGRATE; //Output data rate of 100Hz is used for magnetometer
-            cmd[1]=BIT_MAGODR;
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(100);
-            cmd[0]=GYRORATE; //Output data rate of 150Hz is used for gyroscope
-            cmd[1]=BIT_GYROODR;
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(100);
-            cmd[0]=ACCERATE; //Output data rate of 0 Hz is used to disable accelerometer
-            cmd[1]=0x00;
-            wait_ms(100);
-            
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(100);
-            cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register we get scaled sensor values
-            cmd[1]=0x00;
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(100);
-            
-            cmd[0]=ENB_EVT; //enabling the error,gyro values and magnetometer values
-            cmd[1]=BIT_EVT_ENB;
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(100);
-            
-            cmd[0]=SENTRALSTATUS;
-            i2c.write(SLAVE_ADDR,cmd,1);
-            i2c.read(SLAVE_ADDR_READ,&store,1);
-            wait_ms(100);
-            pc_acs.printf("Sentral Status after trying again is %x\n \r",(int)store);
-            
-            if( (int)store != 3)
-                {
-                    pc_acs.printf("Problem with initialising\n \r");
-                    return 0;
-                }
-        }
-        
+
         pc_acs.printf("Sensor init failed \n \r") ;
         return 0;
 }
@@ -543,25 +610,24 @@
     pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
     
     
-    if((  (ACS_ATS_STATUS & 0xC0) != 0xC0)&&(  (ACS_ATS_STATUS & 0xC0) != 0x80))                  //Sensor1 status is not 10 or 11
+    if(((ACS_ATS_STATUS & 0xC0) != 0xC0)&&(  (ACS_ATS_STATUS & 0xC0) != 0x80))                  //Sensor1 status is not 10 or 11
     {
 
         pc_acs.printf("Sensor 1 marked working \n \r");
         working = SENSOR_INIT();
         if(working ==1)
             {
-                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
                 pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);                     //Sensor 1 INIT successful
                 pc_acs.printf("Attitude sensor init exitting. Init successful. Ideal case.Sensor 1\n \r");
                 ACS_INIT_STATUS = 0;
                 return 1;
             }
             
-            
-            
+
             pc_acs.printf("Sensor 1 not working.Powering off.\n \r");                             //Sensor 1 INIT failure and power off
             ATS1_SW_ENABLE = 1;
-            ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xE0;
+            ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
   
     }
     
@@ -573,15 +639,21 @@
             
             ATS2_SW_ENABLE = 0;
             wait_ms(5);
+            
             working = SENSOR_INIT();
             if(working ==1)
             {
                 pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
                 pc_acs.printf("Attitude sensor init exitting. Init successful. Ideal case.Sensor 2\n \r");    //Sensor2 INIT successful
-                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
                 ACS_INIT_STATUS = 0;
                 return 2;
             }
+            
+                ATS2_SW_ENABLE = 1;
+                wait_ms(5);
+                
+                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
         
         
     }
@@ -591,8 +663,8 @@
     
     
     
-    ATS2_SW_ENABLE = 1;
-    ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0E;
+
+    
     ACS_INIT_STATUS = 0; //set ACS_INIT_STATUS flag                                                              //Sensor 2 also not working
     return 0;
 }
@@ -600,50 +672,55 @@
 
 int SENSOR_DATA_ACQ()
 {
-        int mag_only=0;
+
         pc_acs.printf("Entering Sensor data acq.\n \r");
         char status;
-        
         int sentral;
         int event;
         int sensor;
         int error;
         int init;
         
-        int ack1;
-        int ack2;
+        uint8_t gyro_error=0;
+        uint8_t mag_error=0;
+        
         
         cmd[0]=EVT_STATUS;
-        i2c.write(SLAVE_ADDR,cmd,1);
-        ack1 = i2c.read(SLAVE_ADDR_READ,&status,1);
-        //wait_ms(100);
+        
+        ack = i2c.write(SLAVE_ADDR,cmd,1);
+        if(ack!=0)
+        {
+            ack = i2c.write(SLAVE_ADDR,cmd,1);
+            if(ack!=0)
+                return 0;
+        }
+        ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+        if(ack!=0)
+        {
+            ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+            if(ack!=0)
+                return 0;
+        }
+        
         event = (int)status; 
         
         cmd[0]=SENTRALSTATUS;
-        i2c.write(SLAVE_ADDR,cmd,1);
-        ack2 = i2c.read(SLAVE_ADDR_READ,&status,1);
-        
-        printf("Ack1:  %d   Ack2 : %d\n",ack1,ack2);
-        
-        if((ack1!=0)||(ack2!=0))
+        ack = i2c.write(SLAVE_ADDR,cmd,1);
+        if(ack!=0)
         {
-                cmd[0]=EVT_STATUS;
-                i2c.write(SLAVE_ADDR,cmd,1);
-                ack1 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                //wait_ms(100);
-                cmd[0]=SENTRALSTATUS;
-                i2c.write(SLAVE_ADDR,cmd,1);
-                ack2 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                if((ack1!=0)||(ack2!=0))
-                    {           
-                        for(int i=0; i<3; i++) {
-                            actual_data.AngularSpeed_actual[i] = 0;        //acknowledgement failed
-                            actual_data.Bvalue_actual[i] = 0;
-                         }
-                        
-                        return 1;
-                    }
+            ack = i2c.write(SLAVE_ADDR,cmd,1);
+            if(ack!=0)
+                return 0;
         }
+        ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+        if(ack!=0)
+        {
+            ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+            if(ack!=0)
+                return 0;
+        }
+        
+
         
         sentral = (int) status;
         
@@ -659,264 +736,247 @@
             init = SENSOR_INIT();
             
             
-            int ack1,ack2;
             cmd[0]=EVT_STATUS;
-            i2c.write(SLAVE_ADDR,cmd,1);
-            ack1 = i2c.read(SLAVE_ADDR_READ,&status,1);
-            //wait_ms(100);
+        
+            ack = i2c.write(SLAVE_ADDR,cmd,1);
+            if(ack!=0)
+            {
+                ack = i2c.write(SLAVE_ADDR,cmd,1);
+                if(ack!=0)
+                    return 0;
+            }
+            ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+            if(ack!=0)
+            {
+                ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                if(ack!=0)
+                    return 0;
+            }
+        
             event = (int)status; 
             
             cmd[0]=SENTRALSTATUS;
-            i2c.write(SLAVE_ADDR,cmd,1);
-            ack2 = i2c.read(SLAVE_ADDR_READ,&status,1);
-            sentral = (int)status;
-            
-            if((ack1!=0)||(ack2!=0))
+            ack = i2c.write(SLAVE_ADDR,cmd,1);
+            if(ack!=0)
             {
-                    cmd[0]=EVT_STATUS;
-                    i2c.write(SLAVE_ADDR,cmd,1);
-                    ack1 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                    event = (int)status; 
-                    wait_ms(100);
-                    cmd[0]=SENTRALSTATUS;
-                    i2c.write(SLAVE_ADDR,cmd,1);
-                    ack2 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                    sentral = (int)status;
-                    wait_ms(100);
-                    
-                    if((ack1!=0)||(ack2!=0))
-                        {           
-                            for(int i=0; i<3; i++) {
-                                actual_data.AngularSpeed_actual[i] = 0;        //acknowledgement failed
-                                actual_data.Bvalue_actual[i] = 0;
-                             }
-                            
-                            return 1;
-                        }
+                ack = i2c.write(SLAVE_ADDR,cmd,1);
+                if(ack!=0)
+                    return 0;
             }
+            ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+            if(ack!=0)
+            {
+                ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                if(ack!=0)
+                    return 0;
+            }
+        
+
+        
+            sentral = (int) status;
             
             pc_acs.printf("Event Status after resetting and init is %x\n \r",event);
             
             if  ( (event & 0x40 != 0x40 ) || (event & 0x08 != 0x08) || (event & 0x01 == 0x01 )|| (event & 0x02 == 0x02 ) || (init == 0)||(sentral != 3))    //check for any error in event status     
-            {
-                
-                    int ack1,ack2;
-                    char status;
-                    cmd[0]=ERROR;
-                    i2c.write(SLAVE_ADDR,cmd,1);
-                    ack1 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                    error = (int)status; 
-
-                    cmd[0]=SENSORSTATUS;
-                    i2c.write(SLAVE_ADDR,cmd,1);
-                    ack2 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                    sensor = (int)status;
-
-                    
-                    if((ack1!=0)||(ack2!=0))
-                    {
-                        cmd[0]=ERROR;
-                        i2c.write(SLAVE_ADDR,cmd,1);
-                        ack1 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                        error = (int)status; 
-                        wait_ms(100);
-                        
-                        cmd[0]=SENSORSTATUS;
-                        i2c.write(SLAVE_ADDR,cmd,1);
-                        ack2 = i2c.read(SLAVE_ADDR_READ,&status,1);
-                        sensor = (int)status;
-                        wait_ms(100);
-                        
-                        if((ack1!=0)||(ack2!=0))
-                            {           
-                                for(int i=0; i<3; i++) {
-                                    actual_data.AngularSpeed_actual[i] = 0;        //acknowledgement failed
-                                    actual_data.Bvalue_actual[i] = 0;
-                                 }
-                                
-                                return 1;
-                            }
-                    }
-                    
-                    
-                    
-                    if((error!=0) || (sensor!=0))
-                     {
-                                if( (error&1 == 1) || (sensor&1 == 1) || (sensor&16 == 16)  )
-                                     {
-                                                
-                                            if( (error&4 == 4) || (sensor&4 == 4) || (sensor&64 == 64)  )
-                                                  {
-                                                         
-                                                        for(int i=0; i<3; i++) {
-                                                            actual_data.AngularSpeed_actual[i] = 0;        //Set values to 0
-                                                            actual_data.Bvalue_actual[i] = 0;
-                                                         }
-                                                         
-                                                         pc_acs.printf("error in both sensors.Exiting.\n \r");
-                                                         return 1;
-                                                  }
-                                             pc_acs.printf("error in gyro alone.Exiting.\n \r");
+                          {
                             
-                                            for(int i=0; i<3; i++) {
-                                                actual_data.AngularSpeed_actual[i] = 0;        //Set values to 0
-                                                }
-                                            
-                                            mag_only = 1; 
-                                            //return 2;
-                                      }  
-                                      
-                                      if(mag_only!= 1){
-                                        pc_acs.printf("error in something else.Exiting.\n \r");  
-                                        for(int i=0; i<3; i++) {
-                                                actual_data.AngularSpeed_actual[i] = 0;        //Set values to 0
-                                                actual_data.Bvalue_actual[i] = 0;
-                                            }
-                                        return 1;  
-                                        }                     
-                     }
-                     
-                     if((event & 1 == 1 ))
-                     {
-                         pc_acs.printf("error in CPU Reset.\n \r");
-                        for(int i=0; i<3; i++) {
-                            actual_data.AngularSpeed_actual[i] = 0;        //Set values to 0
-                            actual_data.Bvalue_actual[i] = 0;
-                            }
-                            return 1;
-                         
-                      }
-                      
-                    if((event & 8 != 8 )||(event & 32 != 32 ))
-                        {
-                            pc_acs.printf("Data not ready waiting...\n \r");
-                            //POLL
-                            wait_ms(1000);
-                            cmd[0]=EVT_STATUS;
-                            i2c.write(SLAVE_ADDR,cmd,1);
-                            i2c.read(SLAVE_ADDR_READ,&status,1);
-                            wait_ms(100);
-                            if((event & 8 != 8 )||(event & 32 != 32 ))
-                            {
-
-                                if(event & 32 != 32 )
-                                {
-                                    if(event & 8 != 8 )
+                                    cmd[0]=ERROR;
+                    
+                                    ack = i2c.write(SLAVE_ADDR,cmd,1);
+                                    if(ack!=0)
+                                    {
+                                        ack = i2c.write(SLAVE_ADDR,cmd,1);
+                                        if(ack!=0)
+                                            return 0;
+                                    }
+                                    ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                                    if(ack!=0)
                                     {
-                                        pc_acs.printf("Both data still not ready.Exiting..\n \r");
-                                        
-                                        for(int i=0; i<3; i++) {
-                                        actual_data.AngularSpeed_actual[i] = 0;        //Set values to 0
-                                        actual_data.Bvalue_actual[i] = 0;
-                                         }
-                                        return 1;
+                                        ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                                        if(ack!=0)
+                                            return 0;
                                     }
+                    
+                                    error = (int)status; 
                                     
-                                    pc_acs.printf("Mag data only ready.Read..\n \r");
-                                    mag_only = 1;
-                                    //return 2;
-                                    
-                                }
+                                    cmd[0]=SENSORSTATUS;
+                                    ack = i2c.write(SLAVE_ADDR,cmd,1);
+                                    if(ack!=0)
+                                    {
+                                        ack = i2c.write(SLAVE_ADDR,cmd,1);
+                                        if(ack!=0)
+                                            return 0;
+                                    }
+                                    ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                                    if(ack!=0)
+                                    {
+                                        ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                                        if(ack!=0)
+                                            return 0;
+                                    }
+                    
+            
+                    
+                                     sensor = (int) status;
+                                
                                 
                                 
-                            }
-                            
-                                             
-                        } 
-                        
-     
-            }
+                                    if((error!=0) || (sensor!=0))
+                                    {
+                                            if( (error&1 == 1) || (sensor&1 == 1) || (sensor&16 == 16)  )
+                                                 {
+                                                         pc_acs.printf("error in gyro alone..\n \r");
+                                                         gyro_error = 1;
+                                                  }  
+                                                  
+                                            if( (error&4 == 4) || (sensor&4 == 4) || (sensor&64 == 64)  )
+                                                    {
+                                                                     
+                                                            pc_acs.printf("error in mag alone.Exiting.\n \r");
+                                                            mag_error = 1;
+                                                    }
+                                                  
+                                             if( (gyro_error!=1)&&(mag_error!=1))
+                                             {
+                                                 pc_acs.printf("error in something else.Exiting.\n \r");
+                                                 return 0;
+                                                 
+                                            }              
+                                     }
+                                 
+                                     if((event & 1 == 1 ))
+                                     {
+                                         pc_acs.printf("error in CPU Reset.\n \r");
+                                            return 1;
+                                         
+                                      }
+                                  
+                                    if((event & 8 != 8 )||(event & 32 != 32 ))
+                                    {
+                                            pc_acs.printf("Data not ready waiting...\n \r");
+                                            //POLL
+                                            wait_ms(200);
+                                            
+                                            cmd[0]=EVT_STATUS;
+                    
+                                            ack = i2c.write(SLAVE_ADDR,cmd,1);
+                                            if(ack!=0)
+                                            {
+                                                ack = i2c.write(SLAVE_ADDR,cmd,1);
+                                                if(ack!=0)
+                                                    return 0;
+                                            }
+                                            ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                                            if(ack!=0)
+                                            {
+                                                ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                                                if(ack!=0)
+                                                    return 0;
+                                            }
+                                        
+                                            event = (int)status; 
+                                            if(event & 32 != 32 )
+                                            {
             
-                if(mag_only !=1)
-                {
-                        if(mag_only!= 1){
-                        pc_acs.printf("Error in something else.Exiting.\n \r");  
-                        for(int i=0; i<3; i++) {
-                                actual_data.AngularSpeed_actual[i] = 0;        //Set values to 0
-                                actual_data.Bvalue_actual[i] = 0;
-                            }
-                        return 1;  
-                } 
+                                                pc_acs.printf("Mag data only ready.Read..\n \r");
+                                                gyro_error = 1;
+                                                
+                                            }
+                                            
+                                            if(event & 8 != 8 )
+                                            {
+                                                    pc_acs.printf("Both data still not ready.Exiting..\n \r");
+                                                    mag_error=1;
+                                            }
+                                            
+            
+                                        
+                                                         
+                                    } 
+                                    
+                 
+                          }
+            
+                    if((mag_error !=1)&&(gyro_error!=1))
+                    {
+                            pc_acs.printf("Error in something else.Exiting.\n \r");  
+                            return 0;  
+                    } 
+                    
+                    if((mag_error !=1)&&(gyro_error!=1))
+                    {
+                            pc_acs.printf("Error in both gyro and mag.Exiting.\n \r");  
+                            return 0;  
+                    } 
                 
-            }
+        }
             
             
             
                     
             
-        }
+
         
             
             
             cmd[0]=MAG_XOUT_H; //LSB of x
             i2c.write(SLAVE_ADDR,cmd,1);                        //Read gryo and mag registers together
-            ack1 = i2c.read(SLAVE_ADDR_READ,reg_data,24);
+            ack = i2c.read(SLAVE_ADDR_READ,reg_data,24);
             
-            if(ack1 != 0)
+            if(ack != 0)
             {
                 wait_ms(100);
                 cmd[0]=MAG_XOUT_H; //LSB of x
                 i2c.write(SLAVE_ADDR,cmd,1);                        //Read gryo and mag registers together
-                ack1 = i2c.read(SLAVE_ADDR_READ,reg_data,24);
+                ack = i2c.read(SLAVE_ADDR_READ,reg_data,24);
                 wait_ms(100);
-                if(ack1 !=1)
-                {
-                        for(int i=0;i<3;i++)
-                        {
-                            actual_data.Bvalue_actual[i] = 0;
-                            actual_data.AngularSpeed_actual[i] = 0;
-                        }
-                        return 1;
-                }
-                
+                if(ack !=1)
+                    return 0;
+
             }
             
             
         //    pc_acs.printf("\nGyro Values:\n");
-            for(int i=0; i<3; i++) {
-                //concatenating gyro LSB and MSB to get 16 bit signed data values
-                bit_data= ((int16_t)reg_data[16+2*i+1]<<8)|(int16_t)reg_data[16+2*i]; 
-                gyro_data[i]=(float)bit_data;
-                gyro_data[i]=gyro_data[i]/senstivity_gyro;
-                gyro_data[i]+=gyro_error[i];
+        
+            if (gyro_error!=1)
+            {
+                for(int i=0; i<3; i++) {
+                    //concatenating gyro LSB and MSB to get 16 bit signed data values
+                    bit_data= ((int16_t)reg_data[16+2*i+1]<<8)|(int16_t)reg_data[16+2*i]; 
+                    gyro_data[i]=(float)bit_data;
+                    gyro_data[i]=gyro_data[i]/senstivity_gyro;
+                    actual_data.AngularSpeed_actual[i] = gyro_data[i];
+                }
             }
             
-            for(int i=0; i<3; i++) {
-                //concatenating mag LSB and MSB to get 16 bit signed data values                      Extract data
-                bit_data= ((int16_t)reg_data[2*i+1]<<8)|(int16_t)reg_data[2*i]; 
-                mag_data[i]=(float)bit_data;
-                mag_data[i]=mag_data[i]/senstivity_mag;
-                mag_data[i]+=mag_error[i];
+            
+            if(mag_error!=1){
+                for(int i=0; i<3; i++) {
+                    //concatenating mag LSB and MSB to get 16 bit signed data values                      Extract data
+                    bit_data= ((int16_t)reg_data[2*i+1]<<8)|(int16_t)reg_data[2*i]; 
+                    mag_data[i]=(float)bit_data;
+                    mag_data[i]=mag_data[i]/senstivity_mag;
+                    actual_data.Bvalue_actual[i] = mag_data[i];
+                }
             }
-            for(int i=0; i<3; i++) {
-               // data[i]=gyro_data[i];
-                actual_data.AngularSpeed_actual[i] = gyro_data[i];
-                actual_data.Bvalue_actual[i] = mag_data[i];
-            }
-                
+            
+ 
 
        
-        if(mag_only == 0)
+        if(mag_error == 1)
         {
  
-          pc_acs.printf("Reading data successful.\n \r");
-          return 0;
+          pc_acs.printf("Gyro only successful.\n \r");
+          return 1;
         }
-        else if(mag_only == 1)
+        if(gyro_error == 1)
         {
-                
-                for(int i=0;i<3;i++)
-                {
-                    actual_data.AngularSpeed_actual[i] = 0;
-                }
-                
-                
-                pc_acs.printf("Reading data partial success.\n \r");
-                return 2;
+            pc_acs.printf("Mag only successful.\n \r");
+            return 2;
         }
         
-            pc_acs.printf("Reading data success.\n \r");
-            return 0;
+        pc_acs.printf("Reading data success.\n \r");
+            return 3;
         
 }
 
@@ -925,173 +985,434 @@
 int FCTN_ATS_DATA_ACQ()
 {
     
+    for(int i=0; i<3; i++) {
+        actual_data.AngularSpeed_actual[i] = 0;
+        actual_data.Bvalue_actual[i] = 0;
+       }
+    
     int acq;
+    int init;
     
     pc_acs.printf("DATA_ACQ  called \n \r");
     pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
     
-    // 0 success //1 full failure //2 partial failure
 
     
-    
-    if(( (ACS_ATS_STATUS & 0xC0) == 0x40))
+    if(( (ACS_ATS_STATUS & 0xC0) == 0x40))                 //ATS1 status is 01XX to check if ATS1 is ON
+    {
+
+            acq = SENSOR_DATA_ACQ();                           //ATS1 should already be on   //acquire data 3 full success, 0 full failure , 1 gyro only , 2 mag only
+        
+            if(acq == 3)                                        //Both available read and exit
+                {
+                    
+                     ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
+                     
+                     pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+                     pc_acs.printf(" Sensor 1 data acq successful.Exit Data ACQ\n \r");
+                     return 3;
+                }
+            else if((acq == 2)||(acq==1))                       //Only mag or only gyro
+                {
+
+                            pc_acs.printf(" Sensor 1 data partial success.Try other sensor.\n \r");
+        
+                            
+                            if(  (ACS_ATS_STATUS & 0x0F == 0x03) ||((ACS_ATS_STATUS & 0x0F == 0x02)&&(acq==1))||((ACS_ATS_STATUS & 0x0F == 0x01)&&(acq==2)) )
+                                
+                            {
+                            
+                                //other sensor both working, off or 
+                                //other sensor gyro working, this sensor not working , off
+                                //other sensor mag working, this sensor not working,off
+                                    
+                                    
+                                ATS1_SW_ENABLE = 1;                                                 //switch off sensor 1
+                                wait_ms(5);
+                                if(acq == 1)
+                                    {
+                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x10;                   //Update sensor 1 status
+                                    }
+                                if(acq==2)
+                                    {
+                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x20;   
+                                    }
+                            
+        
+                                ATS2_SW_ENABLE = 0;                                                 //switch on sensor 2
+                                wait_ms(5);
+                                    
+                                init = SENSOR_INIT();                                               //sensor 2 init
+                                    
+                                if( init == 0)
+                                    {
+        
+                                                pc_acs.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");         
+                                                ATS2_SW_ENABLE = 1;
+                                                wait_ms(5);
+                                                ATS1_SW_ENABLE = 0;
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;            //Update not working and switch back to 1
+                                                if(acq == 1)
+                                                    {
+                                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50;                   //Update sensor 1 status
+                                                    }
+                                                if(acq==2)
+                                                    {
+                                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;   
+                                                    }
+                                                return acq;
+                                    }
+                                    
+                                int acq2;
+                                acq2 = SENSOR_DATA_ACQ();
+                                    
+                                if(acq2 == 3)
+                                    {
+                                        ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07; 
+                                         pc_acs.printf(" Sensor 2 data acq success.Exiting.\n \r");                 //Sensor 2 working, exit
+                                        return 3;
+                                    }
+                                            
+                                else if(acq2 == 1)
+                                    {
+                                        if(acq==2)
+                                             {
+                                                ATS2_SW_ENABLE = 1;
+                                                wait_ms(5);
+                                                ATS1_SW_ENABLE = 0;                                                  //Sensor 2 gyro only,sensor 1 mag only
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x01;
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+                                                return 3;
+                                              }
+                                         else
+                                              {
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05;                         //Sensor 2 gyro only,sensor 1 gyro only
+                                                return 1;
+                                              }
+                                     }
+                                                    
+                                else if(acq2==2)                                                                    //Sensor 2 mag only, exit in both cases
+                                     {
+                                          ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;  
+                                          return 2; 
+                                      }
+        
+
+                                    
+                                else if(acq2 == 0)                                                                  //Sensor 2 not working, switch back to sensor 1
+                                        {
+                                            
+                                                pc_acs.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
+                                                ATS2_SW_ENABLE = 1;
+                                                wait_ms(5);                                                          //In status change 00 to 01 for sensor 1, other two bits are same
+                                                ATS1_SW_ENABLE = 0;
+                                                wait_ms(5);
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x3F)|0x40;
+                                                return acq;
+                                                
+                                        }
+                                
+                            }
+                        
+                            else                                                                                          //Sensor 2 not working or both sensors gyro/mag ONLY
+                            {
+                                if(acq == 1)
+                                    {
+                                        ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50;                                       //return Sensor 2 status and update acq
+                                        return 1;
+                                    }
+                                if(acq==2)
+                                    {
+                                        ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60; 
+                                        return 2;  
+                                    }
+                                pc_acs.printf(" Sensor 1 data partial success.Sensor 2 marked not working.Exiting.\n \r");
+                                return acq;
+ 
+                            }
+            }
+            
+        else if(acq == 0)
+            {
+                 pc_acs.printf(" Sensor 1 data acq failure.Try sensor 2.\n \r");                                            //Sensor 1 not working at all
+                 ATS1_SW_ENABLE = 1;
+                 wait_ms(5);                                                                                                //Switch ON sensor 2
+                 ATS2_SW_ENABLE = 0;
+                 wait_ms(5);
+                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
+                 if( (ACS_ATS_STATUS & 0x0C) == 0x00)                                                                       //Sensor 2 is 00XX
+                    {
+                        
+                        
+                                    init = SENSOR_INIT();
+                                    
+                                    if( init == 0)
+                                    {
+
+                                                pc_acs.printf(" Sensor 2 also data acq failure.\n \r");
+                                                ATS2_SW_ENABLE = 1;
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;                                //Sensor 2 also not working exit
+                                                return 0;
+                                    }
+                                    
+                                    int acq2;
+                                    acq2 = SENSOR_DATA_ACQ();
+                                    
+                                    if(acq2 == 3)
+                                        {
+                                            ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
+                                             pc_acs.printf(" Sensor 2 data acq success.Exiting.\n \r");                     //Sensor 2 working
+                                            return 3;
+                                        }
+
+                                    else if(acq2 == 1)
+                                             {
+
+                                                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05;
+                                                 return 1;
+
+                                            }
+                                                    
+                                    else if(acq2 == 2)
+                                            {
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;  
+                                              return 2; 
+                                            }
+        
+                                    
+                                    else if(acq2 == 0)
+                                        {
+                                            
+                                                pc_acs.printf(" Sensor 2 data acq failure..\n \r");
+                                                ATS2_SW_ENABLE = 1;
+
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
+                                                return 0;
+                                                
+                                        }
+                        
+                    }
+                 
+            }
+     }     
+     
+     
+    if(( (ACS_ATS_STATUS & 0x0C) == 0x04))                 //ATS2 status is 01XX to check if ATS2 is ON
     {
 
-        acq = SENSOR_DATA_ACQ();
-        if(acq == 0)
-            {
-                
-                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
-                 
-                 ACS_DATA_ACQ_STATUS = 0;        //clear ACS_DATA_ACQ_STATUS flag for att sens 2
-                 pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
-                 pc_acs.printf(" Sensor 1 data acq successful.Exit Data ACQ\n \r");
-                 return 0;
-            }
-        else if(acq == 2)
-            {
-                    ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x40;
-                    pc_acs.printf(" Sensor 1 data partial success.Exiting.\n \r");
-                    return 2;
+            acq = SENSOR_DATA_ACQ();                           //ATS2 should already be on   //acquire data 3 full success, 0 full failure , 1 gyro only , 2 mag only
+        
+            if(acq == 3)                                        //Both available read and exit
+                {
                     
-                    /*if((ACS_ATS_STATUS & 0x0F == 0x00))
-                        {
-                            pc_acs.printf(" Sensor 1 data acq partial success.Trying Sensor 2\n \r");
-                            ATS1_SW_ENABLE = 1;
-                            ATS2_SW_ENABLE = 0;
-                            wait_ms(5);
-                            ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x20;
+                     ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
+                     
+                     pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+                     pc_acs.printf(" Sensor 2 data acq successful.Exit Data ACQ\n \r");
+                     return 3;
+                }
+            else if((acq == 2)||(acq==1))                       //Only mag or only gyro
+                {
+
+                            pc_acs.printf(" Sensor 2 data partial success.Try other sensor.\n \r");
+        
                             
-                            int acq;
-                            acq = SENSOR_DATA_ACQ();
+                            if(  (ACS_ATS_STATUS & 0xF0 == 0x30) ||((ACS_ATS_STATUS & 0xF0 == 0x20)&&(acq==1))||((ACS_ATS_STATUS & 0xF0 == 0x10)&&(acq==2)) )
+                                
+                            {
                             
-                            if(acq == 0)
-                                {
-                                ACS_DATA_ACQ_STATUS = 0;
-                                 pc_acs.printf(" Sensor 2 data acq success.Exiting.\n \r");
-                                return 0;
-                                
-                                }
-                            else if(acq == 2)
-                                {
-                                ACS_DATA_ACQ_STATUS = 2;
-                                pc_acs.printf(" Sensor 2 data acq partial success.Exiting.\n \r");
-                                return 2;
-                                }
+                                //other sensor both working, off or 
+                                //other sensor gyro working, this sensor not working , off
+                                //other sensor mag working, this sensor not working,off
+                                    
+                                    
+                                ATS2_SW_ENABLE = 1;                                                 //switch off sensor 2
+                                wait_ms(5);
+                                if(acq == 1)
+                                    {
+                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x01;                   //Update sensor 2 status
+                                    }
+                                if(acq==2)
+                                    {
+                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x02;   
+                                    }
                             
-                            else if(acq == 1)
-                                {
+        
+                                ATS1_SW_ENABLE = 0;                                                 //switch on sensor 1
+                                wait_ms(5);
+                                    
+                                init = SENSOR_INIT();                                               //sensor 2 init
+                                    
+                                if( init == 0)
+                                    {
+        
+                                                pc_acs.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");         
+                                                ATS1_SW_ENABLE = 1;
+                                                wait_ms(5);
+                                                ATS2_SW_ENABLE = 0;
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;            //Update not working and switch back to 2
+                                                if(acq == 1)
+                                                    {
+                                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05;                   //Update sensor 1 status
+                                                    }
+                                                if(acq==2)
+                                                    {
+                                                       ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;   
+                                                    }
+                                                return acq;
+                                    }
+                                    
+                                int acq2;
+                                acq2 = SENSOR_DATA_ACQ();
                                     
-                                        int acq;
-                                        pc_acs.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
-                                        ATS2_SW_ENABLE = 1;
-                                        ATS1_SW_ENABLE = 0;
-                                        wait_ms(5);
-                                        acq = SENSOR_DATA_ACQ();
-                                        if(acq == 0)
-                                            {   
-                                                pc_acs.printf(" Sensor 1 data acq success.Exiting.\n \r");
-                                                ACS_DATA_ACQ_STATUS = 0;
-                                                return 0;
-                                            }
-                                        else if(acq == 2)
-                                            {
-                                                pc_acs.printf(" Sensor 1 data acq partial success.Exiting.\n \r");
-                                                ACS_DATA_ACQ_STATUS = 2;
-                                                return 2;
-                                            }
-                                        else
-                                            {
-                                                pc_acs.printf(" Sensor 1 data acq failure.Exiting.\n \r");
-                                                ATS1_SW_ENABLE = 0;
-                                                ACS_DATA_ACQ_STATUS = 1;
+                                if(acq2 == 3)
+                                    {
+                                        ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70; 
+                                         pc_acs.printf(" Sensor 1 data acq success.Exiting.\n \r");                 //Sensor 1 working, exit
+                                        return 3;
+                                    }
+                                            
+                                else if(acq2 == 1)
+                                    {
+                                        if(acq==2)
+                                             {
+                                                ATS1_SW_ENABLE = 1;
+                                                wait_ms(5);
+                                                ATS2_SW_ENABLE = 0;                                                  //Sensor 1 gyro only,sensor 2 mag only
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x10;
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+                                                return 3;
+                                              }
+                                         else
+                                              {
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50;                         //Sensor 1 gyro only,sensor 2 gyro only
                                                 return 1;
-                                            }
+                                              }
+                                     }
+                                                    
+                                else if(acq2==2)                                                                    //Sensor 1 mag only, exit in both cases
+                                     {
+                                          ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;  
+                                          return 2; 
+                                      }
+        
+
+                                    
+                                else if(acq2 == 0)                                                                  //Sensor 1 not working, switch back to sensor 2
+                                        {
                                             
-                                                pc_acs.printf(" Sensor 1 data acq failure.Exiting.\n \r");
-                                                ATS1_SW_ENABLE = 0;
-                                                ACS_DATA_ACQ_STATUS = 1;
-                                                return 1;
-        
-                                }
+                                                pc_acs.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
+                                                ATS1_SW_ENABLE = 1;
+                                                wait_ms(5);                                                          //In status change 00 to 01 for sensor 2, other two bits are same
+                                                ATS2_SW_ENABLE = 0;
+                                                wait_ms(5);
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF3)|0x04;
+                                                return acq;
+                                                
+                                        }
+                                
+                            }
                         
-                        }
-                        
-                        else
-                        {
-                            ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x40;
-                            pc_acs.printf(" Sensor 1 data partial success.Sensor 2 marked not working.Exiting.\n \r");
-                            return 2;
-                            
-                            
-                        }*/
-
+                            else                                                                                          //Sensor 1 not working or both sensors gyro/mag ONLY
+                            {
+                                if(acq == 1)
+                                    {
+                                        ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05;                                       //return Sensor 1 status and update acq
+                                        return 1;
+                                    }
+                                if(acq==2)
+                                    {
+                                        ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06; 
+                                        return 2;  
+                                    }
+                                pc_acs.printf(" Sensor 2 data partial success.Sensor 1 marked not working.Exiting.\n \r");
+                                return acq;
+ 
+                            }
             }
             
-        else if(acq == 1)
+        else if(acq == 0)
             {
-                 pc_acs.printf(" Sensor 1 data acq failure.Try sensor 2.\n \r");
-                 ATS1_SW_ENABLE = 1;
-                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xE0;
+                 pc_acs.printf(" Sensor 2 data acq failure.Try sensor 1.\n \r");                                            //Sensor 2 not working at all
+                 ATS2_SW_ENABLE = 1;
+                 wait_ms(5);                                                                                                //Switch ON sensor 1
+                 ATS1_SW_ENABLE = 0;
+                 wait_ms(5);
+                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
+                 if( (ACS_ATS_STATUS & 0xC0) == 0x00)                                                                       //Sensor 1 is 00XX
+                    {
+                        
+                        
+                                    init = SENSOR_INIT();
+                                    
+                                    if( init == 0)
+                                    {
+
+                                                pc_acs.printf(" Sensor 1 also data acq failure.\n \r");
+                                                ATS2_SW_ENABLE = 1;
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;                                //Sensor 1 also not working exit
+                                                return 0;
+                                    }
+                                    
+                                    int acq2;
+                                    acq2 = SENSOR_DATA_ACQ();
+                                    
+                                    if(acq2 == 3)
+                                        {
+                                            ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
+                                             pc_acs.printf(" Sensor 1 data acq success.Exiting.\n \r");                     //Sensor 1 working
+                                            return 3;
+                                        }
+
+                                    else if(acq2 == 1)
+                                             {
+
+                                                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50;
+                                                 return 1;
+
+                                            }
+                                                    
+                                    else if(acq2 == 2)
+                                            {
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;  
+                                              return 2; 
+                                            }
+        
+                                    
+                                    else if(acq2 == 0)
+                                        {
+                                            
+                                                pc_acs.printf(" Sensor 1 data acq failure..\n \r");
+                                                ATS1_SW_ENABLE = 1;
+
+                                                ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
+                                                return 0;
+                                                
+                                        }
+                        
+                    }
+                 
             }
-            
+     }    
 
   
-    }
+
     
-        
-        
                                
-        ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xE0;
     
       
-    if(( (ACS_ATS_STATUS & 0x0C) == 0x04))
-    {
-        ATS2_SW_ENABLE = 0;
-        wait_ms(5); 
-        
-        acq = SENSOR_DATA_ACQ();
-        if(acq == 0)
-            {
-                 pc_acs.printf(" Sensor 2 data acq success.Exiting.\n \r");
-                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
-                 ACS_DATA_ACQ_STATUS = 0;        //clear ACS_DATA_ACQ_STATUS flag for att sens 2
-                 return 0;
-            }
-        else if(acq == 2)
-            {
-                 
-                 pc_acs.printf(" Sensor 2 data acq partial success.Exiting.\n \r");
-                 
-                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x04;
-                 ACS_DATA_ACQ_STATUS = 2;        //clear ACS_DATA_ACQ_STATUS flag for att sens 2
-                 return 2;
-
-            }
-            
-            else if(acq == 1)
-            {
-                pc_acs.printf(" Sensor 2 data acq failure.Exiting.\n \r");
-                ATS2_SW_ENABLE = 1;
-                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0E;
-                //Sensor 2 also not working
-            }
-            
-            
-            
-
-       
-    }
+    
     
 
+
+  
     
-         ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0E;
-         
+
+
     pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
     pc_acs.printf(" Both sensors data acq failure.Exiting.\n \r");
     
-    ACS_DATA_ACQ_STATUS = 1;        //set ACS_DATA_ACQ_STATUS flag for att sens 2
-    return 1;
+    return 0;
 }
 
 void FCTN_ACS_GENPWM_MAIN(float Moment[3])
@@ -1121,25 +1442,22 @@
     }
     
     l_current_x = l_moment_x * TR_CONSTANT ;        //Moment and Current always have the linear relationship
-    printf("current in trx is %f \r \n",l_current_x);
+    pc_acs.printf("\r\n current in trx is %f \r \n",l_current_x);
     if( l_current_x>0 && l_current_x < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
     {
         l_duty_cycle_x =  3*10000000*pow(l_current_x,3)- 90216*pow(l_current_x,2) + 697.78*l_current_x - 0.0048; // calculating upto 0.1% dutycycle by polynomial interpolation 
-        printf("DC for trx is %f \r \n",l_duty_cycle_x);
         PWM1.period(TIME_PERIOD);
         PWM1 = l_duty_cycle_x/100 ;
     }
     else if (l_current_x >= 0.0016 && l_current_x < 0.0171)
     {
         l_duty_cycle_x = - 76880*pow(l_current_x,3) + 1280.8*pow(l_current_x,2) + 583.78*l_current_x + 0.0281; // calculating upto 10% dutycycle by polynomial interpolation
-        printf("DC for trx is %f \r \n",l_duty_cycle_x);
         PWM1.period(TIME_PERIOD);
-        PWM1 = l_duty_cycle_x/100 ;            
+        PWM1 = l_duty_cycle_x/100;            
     }
     else if(l_current_x >= 0.0171 && l_current_x < 0.1678)
     {
         l_duty_cycle_x =  275.92*pow(l_current_x,2) + 546.13*l_current_x + 0.5316; // calculating upto 100% dutycycle by polynomial interpolation
-        printf("DC for trx is %f \r \n",l_duty_cycle_x);
         PWM1.period(TIME_PERIOD);
         PWM1 = l_duty_cycle_x/100 ;            
     }
@@ -1147,7 +1465,6 @@
     {
         printf("\n \r l_current_x====0");
         l_duty_cycle_x = 0;      // default value of duty cycle
-        printf("DC for trx is %f \r \n",l_duty_cycle_x);
         PWM1.period(TIME_PERIOD);
         PWM1 = l_duty_cycle_x/100 ;            
     }
@@ -1155,6 +1472,8 @@
     {
         g_err_flag_TR_x = 1;
     } 
+    
+    pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
          
     //------------------------------------- y-direction TR--------------------------------------//
     
@@ -1170,25 +1489,22 @@
     
     
     l_current_y = l_moment_y * TR_CONSTANT ;        //Moment and Current always have the linear relationship
-    printf("current in try is %f \r \n",l_current_y);
+    pc_acs.printf("current in try is %f \r \n",l_current_y);
     if( l_current_y>0 && l_current_y < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
     {
         l_duty_cycle_y =  3*10000000*pow(l_current_y,3)- 90216*pow(l_current_y,2) + 697.78*l_current_y - 0.0048; // calculating upto 0.1% dutycycle by polynomial interpolation 
-        printf("DC for try is %f \r \n",l_duty_cycle_y);
         PWM2.period(TIME_PERIOD);
         PWM2 = l_duty_cycle_y/100 ;
     }
     else if (l_current_y >= 0.0016 && l_current_y < 0.0171)
     {
         l_duty_cycle_y = - 76880*pow(l_current_y,3) + 1280.8*pow(l_current_y,2) + 583.78*l_current_y + 0.0281; // calculating upto 10% dutycycle by polynomial interpolation
-        printf("DC for try is %f \r \n",l_duty_cycle_y);
         PWM2.period(TIME_PERIOD);
         PWM2 = l_duty_cycle_y/100 ;            
     }
     else if(l_current_y >= 0.0171 && l_current_y < 0.1678)
     {
         l_duty_cycle_y =  275.92*pow(l_current_y,2) + 546.13*l_current_y + 0.5316; // calculating upto 100% dutycycle by polynomial interpolation
-        printf("DC for try is %f \r \n",l_duty_cycle_y);
         PWM2.period(TIME_PERIOD);
         PWM2 = l_duty_cycle_y/100 ;            
     }        
@@ -1196,7 +1512,6 @@
     {
         printf("\n \r l_current_y====0");
         l_duty_cycle_y = 0; // default value of duty cycle
-        printf("DC for try is %f \r \n",l_duty_cycle_y);
         PWM2.period(TIME_PERIOD);
         PWM2 = l_duty_cycle_y/100 ;            
     }
@@ -1204,6 +1519,8 @@
     {
       g_err_flag_TR_y = 1;
     } 
+    
+    pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
              
     //----------------------------------------------- z-direction TR -------------------------//  
     
@@ -1220,11 +1537,10 @@
     
     
     l_current_z = l_moment_z * TR_CONSTANT ;        //Moment and Current always have the linear relationship
-    printf("current in trz is %f \r \n",l_current_z);
+    pc_acs.printf("current in trz is %f \r \n",l_current_z);
     if( l_current_z>0 && l_current_z < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
     {
         l_duty_cycle_z =  3*10000000*pow(l_current_z,3)- 90216*pow(l_current_z,2) + 697.78*l_current_z - 0.0048; // calculating upto 0.1% dutycycle by polynomial interpolation 
-        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;
     }
@@ -1238,7 +1554,6 @@
     else if(l_current_z >= 0.0171 && l_current_z < 0.1678)
     {
         l_duty_cycle_z =  275.92*pow(l_current_z,2) + 546.13*l_current_z + 0.5316; // calculating upto 100% dutycycle by polynomial interpolation
-        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;            
     }        
@@ -1246,7 +1561,6 @@
     {
         printf("\n \r l_current_z====0");
         l_duty_cycle_z = 0; // default value of duty cycle
-        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;            
     }
@@ -1255,6 +1569,8 @@
       g_err_flag_TR_z = 1;
     } 
     
+    pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
+    
     //-----------------------------------------exiting the function-----------------------------------//
     
     printf("\n\rExited executable PWMGEN function\n\r"); // stating the successful exit of TR function