Team Fox / Mbed 2 deprecated BAE_QM_MAR9

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of workinQM_5thJan_azad by Team Fox

Revision:
20:949d13045431
Parent:
19:79e69017c855
Child:
34:1b41c34b12ea
Child:
39:670133e7ffd8
--- a/ACS.cpp	Sat Jun 04 11:29:13 2016 +0000
+++ b/ACS.cpp	Fri Jul 01 17:55:30 2016 +0000
@@ -7,10 +7,9 @@
 #include "pin_config.h"
 #include "ACS.h"
 #include "EPS.h"
-
-/*timer for determining the execution time*/
-//Timer time;
-
+/*variables will get get updated value from FLash 
+in case flash cups while testing i.e initial defaul values are kept as of now
+*/
 //********************************flags******************************************//
 extern uint32_t BAE_STATUS;
 extern uint32_t BAE_ENABLE;
@@ -19,6 +18,10 @@
 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
 
 extern uint8_t ACS_ATS_ENABLE;
 extern uint8_t ACS_DATA_ACQ_ENABLE;
@@ -39,56 +42,101 @@
 extern float data[6];
 extern BAE_HK_actual actual_data;
 
+//global para
+//FUNCTION
+float max_invjm [9]= {1.0000,1.0000,1.0000,0.0471,4.6159,4.1582,4.4047,0.0755,4.1582};
+float min_invjm[9] = {-1.0000,-1.0000,-1.0000,-0.0471,-4.6159,-4.1582,-4.4047,-0.0755,-4.1582};
+float max_jm[9] = {0.3755,0.0176,0.2672,0.4895,0.2174,0.0452,1.0000,0.1209,0.0572};
+float min_jm[9] = {-0.2491,-0.0457,0.2271,0.1556,0.2222,0.0175,0.9998,0.0361,0.0922};
+//se some other better way
+/*
+float max_bb[3] = {0,1.0*e-04*0.1633,1.0*e-04*0.1528};
+float min_bb[3] = {0,1.0*e-04*(-0.1736),1.0*e-04*(-0.1419)};
+*/
+float max_bb[3] = {0,1.0*0.0001*0.1633,1.0*0.0001*0.1528};
+float min_bb[3] = {0,1.0*0.0001*(-0.1736),1.0*0.0001*(-0.1419)};
 
-//DigitalOut gpo1(PTC0); // enable of att sens2 switch
-//DigitalOut gpo2(PTC16); // enable of att sens switch
+//ACS
+uint8_t controlmode_mms = 0;
+uint8_t ATS1_EVENT_STATUS_RGTR=0x00;
+uint8_t ATS1_SENTRAL_STATUS_RGTR=0x00;
+uint8_t ATS1_ERROR_RGTR=0x00;
+uint8_t ATS2_EVENT_STATUS_RGTR=0x00;
+uint8_t ATS2_SENTRAL_STATUS_RGTR=0x00;
+uint8_t ATS2_ERROR_RGTR=0x00;
+uint8_t invjm_mms[9];
+uint8_t jm_mms[9];
+uint8_t bb_mms[3];
+uint8_t singularity_flag=0;
+
+uint8_t ACS_MAG_TIME_DELAY;// = 65;
+uint8_t ACS_DEMAG_TIME_DELAY;// = 65;
+uint16_t ACS_Z_FIXED_MOMENT;// = 1.3;
+uint8_t ACS_TR_Z_SW_STATUS;//=1;
+uint8_t ACS_TR_XY_SW_STATUS;//=1;
+//GLOBAL PARA
+uint8_t ACS_TR_X_PWM;   //*
+uint8_t ACS_TR_Y_PWM;   //*
+uint8_t ACS_TR_Z_PWM;   //*
+//change
+uint16_t ACS_MM_X_COMSN = 1;
+uint16_t ACS_MM_Y_COMSN = 1;
+uint16_t ACS_MG_X_COMSN = 1;
+uint16_t ACS_MG_Y_COMSN = 1;
+uint16_t ACS_MM_Z_COMSN = 1;
+uint16_t ACS_MG_Z_COMSN = 1;
+
+uint8_t float_to_uint8(float min,float max,float val)
+{
+    if(val>max)
+        {return 0xff;
+        }
+    if(val<min)
+        {return 0x00;
+        }
+    float div=max-min;div=(255.0/div);val=((val-min)*div);
+    return (uint8_t)val;
+}
+
+
+void float_to_uint8_ARRAY(int d1,int d2, float *arr,float max[], float min[], uint8_t *valarr)
+{
+    for(int i=0;i<d1;i++)
+                    for(int j=0;j<d2;j++)
+                        {
+                            printf("\n\r%f",*((arr+(i*d1))+j));
+                            valarr[i*d1+j] = (uint8_t)float_to_uint8(min[i*d1+j],max[i*d1+j],*((arr+(i*d1))+j));
+                            printf("\n\r%d",valarr[i*d1+j]);
+                        }
+}
+
 
 
 Serial pc_acs(USBTX,USBRX); //for usb communication
+
 //CONTROL_ALGO
-
-float moment[3]; // Unit: Ampere*Meter^2
+float moment[3]; // Unit: Ampere*Meter^2//*
 float b_old[3]={1.15e-5,-0.245e-5,1.98e-5};  // Unit: Tesla
-int flag_firsttime=1, controlmode, alarmmode=0;
+float db[3];//*
+uint8_t flag_firsttime=1, alarmmode=0;
 
 
-
-void controller (float moment[3], float b1[3], float omega1[3], float b_old[3], int &alarmmode, int &flag_firsttime, int &controlmode);
-void controlmodes(float moment[3], float b[3], float db[3], float omega[3], int controlmode1, float MmntMax);
-float max_array(float arr[3]);
+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]);
 
 //CONTROLALGO PARAMETERS
-
-
-void FCTN_ACS_CNTRLALGO(float b[3],float omega[3])
+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 b1[3];
-    float omega1[3];
-    b1[0] = b[0]/1000000.0;
-    b1[1] = b[1]/1000000.0;
-    b1[2] = b[2]/1000000.0;
-    
-    omega1[0] = omega[0]*3.14159/180;
-    omega1[1] = omega[1]*3.14159/180;
-    omega1[2] = omega[2]*3.14159/180;
-    controller (moment, b1, omega1, b_old, alarmmode, flag_firsttime, controlmode);
-    
-}
-void controller (float moment[3], float b1[3], float omega1[3], float b_old[3], int &alarmmode, int &flag_firsttime, int &controlmode)
-{
-    float db1[3]; // Unit: Tesla/Second
-    float sampling_time=10; // Unit: Seconds. Digital Control law excuted once in 10 seconds
-    float MmntMax=1.1; // Unit: Ampere*Meter^2
-    float OmegaMax=1*3.1415/180.0; // Unit: Radians/Second
+
     float normalising_fact;
-    float b1_copy[3], omega1_copy[3], db1_copy[3];
+    float b_copy[3], omega_copy[3], db_copy[3];
     int i;
     if(flag_firsttime==1)
         {
             for(i=0;i<3;i++)
         {
-                db1[i]=0; // Unit: Tesla/Second
+                db[i]=0; // Unit: Tesla/Second
         }
             flag_firsttime=0;
         }
@@ -96,83 +144,90 @@
     {
         for(i=0;i<3;i++)
         {
-            db1[i]= (b1[i]-b_old[i])/sampling_time; // Unit: Tesla/Second
+            db[i]= (b[i]-b_old[i])/sampling_time; // Unit: Tesla/Second
         }
     }
     
-        if(max_array(omega1)<(0.8*OmegaMax) && alarmmode==1)
-    {
-            alarmmode=0;
-    }
-        else if(max_array(omega1)>OmegaMax && alarmmode==0)
-    {
-            alarmmode=1;
-    }
-
+        if(nominal == 0)
+        
+        {
+    
+                if(max_array(omega)<(0.8*OmegaMax) && alarmmode==1)
+                {
+                        alarmmode=0;
+                }
+                else if(max_array(omega)>OmegaMax&& alarmmode==0)
+                {
+                        alarmmode=1;
+                }
+            
+        }
+          
     for (i=0;i<3;i++)
     {
-        b1_copy[i]=b1[i];
-        db1_copy[i]=db1[i];
-        omega1_copy[i]=omega1[i];
+        b_copy[i]=b[i];
+        db_copy[i]=db[i];
+        omega_copy[i]=omega[i];
     }
 
-    if(alarmmode==0)
+    if(((alarmmode==0)|| (nominal == 1))&&(detumbling==0))
         {
-            controlmode=0;
-            controlmodes(moment,b1,db1,omega1,controlmode,MmntMax);
-        for (i=0;i<3;i++)
-        {
-            b1[i]=b1_copy[i];
-            db1[i]=db1_copy[i];
-            omega1[i]=omega1_copy[i];
-        }
+            controlmode_mms = 0;
+            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)
             {
-                controlmode=1;
-                controlmodes(moment,b1,db1,omega1,controlmode,MmntMax);
-            for (i=0;i<3;i++)
-            {
-                b1[i]=b1_copy[i];
-                db1[i]=db1_copy[i];
-                omega1[i]=omega1_copy[i];
-            }
+                controlmode_mms = 1;
+                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;//*is this changed now
         }
         else
         {   
-            controlmode=1;
-            controlmodes(moment,b1,db1,omega1,controlmode,MmntMax);
-        for (i=0;i<3;i++)
-        {
-            b1[i]=b1_copy[i];
-            db1[i]=db1_copy[i];
-            omega1[i]=omega1_copy[i];
-        }
+            controlmode_mms = 1;
+            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
-            }
+                }
             }
         
         }
     for (i=0;i<3;i++)
     {
-        b_old[i]=b1[i];
+        b_old[i]=b[i];
     }
 }
 
-void inverse(float mat[3][3],float inv[3][3])
+void inverse(float mat[3][3],float inv[3][3],uint8_t &singularity_flag)
 {
     int i,j;
     float det=0;
@@ -184,11 +239,19 @@
         }
     }
     det+=(mat[0][0]*inv[0][0])+(mat[0][1]*inv[1][0])+(mat[0][2]*inv[2][0]);
-    for(i=0;i<3;i++)
+    if (det==0)
+    {
+        singularity_flag=1;
+    }
+    else
     {
-        for(j=0;j<3;j++)
+        singularity_flag=0;
+        for(i=0;i<3;i++)
         {
-            inv[i][j]/=det;
+            for(j=0;j<3;j++)
+            {
+                inv[i][j]/=det;
+            }
         }
     }
 }
@@ -207,8 +270,9 @@
     return temp_max;
 }
 
+uint8_t singularity_flag_mms=0;
 
-void controlmodes(float moment[3], float b[3], float db[3], float omega[3], int controlmode1, float MmntMax)
+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};
@@ -218,95 +282,119 @@
     int i, j;//temporary variables
     float Mu[2],z[2],dv[2],v[2],u[2],tauc[3]={0,0,0},Mmnt[3];//outputs
     float invJm[3][3];
-    float kmu2=0.07,gamma2=1.9e4,kz2=0.4e-2,kmu=0.003,gamma=5.6e4,kz=0.1e-4,kdetumble=2000000;
-    int infflag;   // Flag variable to check if the moment value is infinity or NaN
+    float kmu2=0.07,gamma2=1.9e4,kz2=0.4e-2,kmu=0.003,gamma=5.6e4,kz=0.1e-4;
+    //uint8_t singularity_flag=0;
     
     if(controlmode1==0)
     {
         den=sqrt((b[0]*b[0])+(b[1]*b[1])+(b[2]*b[2]));
         den2=(b[0]*db[0])+(b[1]*db[1])+(b[2]*db[2]);
-        for(i=0;i<3;i++)
+        if (den==0)
         {
-            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.
+            singularity_flag_mms=1;
         }
-        if(b[2]>0.9 || b[2]<-0.9)
-        {
-            kz=kz2;
-            kmu=kmu2;
-            gamma=gamma2;
-        }
-        for(i=0;i<2;i++)
+        if (singularity_flag_mms==0)
         {
-            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);
-        for(i=0;i<3;i++)
-        {
-            for(j=0;j<3;j++)
+            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)
+            }
+            for(i=0;i<3;i++)
+            {
+                b[i]/=den; // Mormalized b. Hence no unit.
+            }
+            if(b[2]>0.9 || b[2]<-0.9)
+            {
+                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);
+            }
+            inverse(Jm,invJm,singularity_flag_mms);
+            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(i=0;i<3;i++)
             {
-                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++)
+                {
+                    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];
             }
-        }
-        for(i=0;i<3;i++)
-        {
-            for(j=0;j<3;j++)
+            inverse(invJm,Jm,singularity_flag_mms);
+            
+            //00000
+            float_to_uint8_ARRAY(3,3, (float*)invJm,max_invjm, min_invjm, invjm_mms);
+            float_to_uint8_ARRAY(3,3, (float*)Jm,max_jm, min_jm, jm_mms);
+            float_to_uint8_ARRAY(1,3, (float*)bb,max_bb, min_bb, bb_mms);
+            
+            if (singularity_flag_mms==0)
             {
-                d[i]+=bb[j]*invJm[i][j];
+                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
+                }
             }
         }
-        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++)
+        if (singularity_flag_mms==1)
         {
-            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);
-        for(i=0;i<3;i++)
-        {
-            for(j=0;j<3;j++)
+            for (i=0;i<3;i++)
             {
-                tauc[i]+=Jm[i][j]*bb[j]; // Unit: Newton*Meter^2
+                Mmnt[i]=2*MmntMax;
             }
         }
-        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
-        }
-        infflag=0;
-        for (i=0; i<3 && infflag==0; i++)
-        {
-            if (isinf(Mmnt[i])==1 || isnan(Mmnt[i])==1)
-                infflag=1;
-        }
-        if (infflag==1)
-        {
-            for (i=0; i<3; i++)
-                Mmnt[i]=2*MmntMax;
-        }
-        
+        ACS_STATUS = 5;
     }
     else if(controlmode1==1)
     {
-        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;
+        }
+        else if(ACS_DETUMBLING_ALGO_TYPE==1) // BDot Algo
+        {
+            for(i=0;i<3;i++)
+            {
+                Mmnt[i]=-kdetumble*db[i];
+            }
+            ACS_STATUS = 4;
         }
     }
     for(i=0;i<3;i++)
@@ -317,50 +405,108 @@
 
 I2C i2c (PTC9,PTC8); //PTC9-sda,PTC8-scl  for the attitude sensors and battery gauge
 
-void FCTN_ACS_INIT(void); //initialization of registers happens
-void FCTN_ATS_DATA_ACQ(); //data is obtained
-void T_OUT(); //timeout function to stop infinite loop
-Timeout to; //Timeout variable to
+int FCTN_ACS_INIT(); //initialization of registers happens
+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
-}
+//void T_OUT()
+//{
+//    toFlag=0; //as T_OUT function gets called the while loop gets terminated
+//}
 
 
 //DEFINING VARIABLES
 char cmd[2];
 char raw_gyro[6];
 char raw_mag[6];
+char reg_data[24];
 char store,status;
-int16_t bit_data;
-float gyro_data[3], mag_data[3],combined_values[6];
-float senstivity_gyro =6.5536; //senstivity is obtained from 2^15/5000dps
-float senstivity_mag  =32.768; //senstivity is obtained from 2^15/1000microtesla
-float gyro_error[3]= {0,0,0}, mag_error[3]= {0,0,0};
+//int16_t bit_data done in actual_data structure itself;
 
-void  FCTN_ACS_INIT()
-{
-    ACS_INIT_STATUS = 's';     //set ACS_INIT_STATUS flag
-    //FLAG();
-    pc_acs.printf("Attitude sensor init called \n \r");
-    //FLAG();
-   /* as of now no reset
-   cmd[0]=RESETREQ;
+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()
+{  
+    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(2000); //waiting for loading configuration file stored in EEPROM
-   // */
-    //wait_ms(3000);
+    wait_ms(575);
+    
+    //Verify magic number
+    
+    cmd[0]=HOST_CTRL; //0x02 is written in HOST CONTROL register to enable upload
+    cmd[1]=BIT_HOST_UPLD_ENB;
+    i2c.write(SLAVE_ADDR,cmd,2);
+    wait_ms(20);
+    
+    cmd[0]=UPLOAD_ADDR; //0x02 is written in HOST CONTROL register to enable upload
+    cmd[1]=0x0000;
+    i2c.write(SLAVE_ADDR,cmd,3);
+    wait_ms(20);
+
+    cmd[0]=HOST_CTRL; //0x00 is written in HOST CONTROL register to free upload
+    cmd[1]=0x00;
+    i2c.write(SLAVE_ADDR,cmd,2);
+    wait_ms(20);
+    
+    return 0;
+}
+
+int SENSOR_INIT()
+{   
+///    pc_acs.printf("Entered sensor init\n \r");
+    cmd[0]=RESETREQ;
+    cmd[1]=BIT_RESREQ;
+    ack = i2c.write(SLAVE_ADDR,cmd,2);                                //When 0x01 is written in reset request register Emulates a hard power down/power up
+    //wait_ms(575);                                               //waiting for loading configuration file stored in EEPROM
+    
+///    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(575);
+    
     cmd[0]=SENTRALSTATUS;
-    i2c.write(SLAVE_ADDR,cmd,1);
-    i2c.read(SLAVE_ADDR_READ,&store,1);
-    wait_ms(20); // initially 100
-    //to check whether EEPROM is uploaded
+    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);
+    
+    //to check whether EEPROM is uploaded properly
     switch((int)store) { 
-        case(3): { //actually this state correct
+        case(3): {
             break;
         }
         case(11): {
@@ -369,208 +515,899 @@
         default: {
             cmd[0]=RESETREQ;
             cmd[1]=BIT_RESREQ;
-            i2c.write(SLAVE_ADDR,cmd,2);
-            wait_ms(2000);//see if it can be changed
+            ack = i2c.write(SLAVE_ADDR,cmd,2);
+            if( ack!=0)
+                {
+                    ack = i2c.write(SLAVE_ADDR,cmd,2);
+                    if(ack!=0)
+                        return 0;
+                }
+            wait_ms(575);//should be 600
+            
+            cmd[0]=SENTRALSTATUS;
+            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);
+            
         }
     }
-    pc_acs.printf("\n\n\rwait is 1 \n\r");
-    pc_acs.printf("Sentral Status is %x\n \r",(int)store);
-    
-    /*ways to make the sensors work even if one sensor cups first making data rate 0x00
-    1>make data rate 0x00 change the enable events register value to 0x0A or 0x22 as suitable
-    2>change the condition for getting the values from the sensors i.e in data_acq function
-    3>check the other register values
-    
-    other method is pass through working in how it works / decoding SENtral algorithms
-    */
-    
-    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);
-    //___________________________________________________________________________________________________
-    
-    /*just leave it then see what happens?? the gyro data without inputing anything*/
+
+    int manual=0;
+    if( ((int)store != 11 )&&((int)store != 3))
+    {
+
+            cmd[0]=RESETREQ;
+            cmd[1]=BIT_RESREQ;
+            ack = i2c.write(SLAVE_ADDR,cmd,2);
+            if( ack!=0)
+                {
+                    ack = i2c.write(SLAVE_ADDR,cmd,2);
+                    if(ack!=0)
+                        return 0;
+                }
+            wait_ms(575);
+            
+            manual = CONFIG_UPLOAD();
+            
+            if(manual == 0)
+            {
+                //MANUAL CONFIGURATION FAILED
+                return 0;
+            }
+                     
+    }
+        cmd[0]=HOST_CTRL; //0x01 is written in HOST CONTROL register to enable the sensors
+        cmd[1]=BIT_RUN_ENB;
+        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;
+        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;
+        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;
+        ack = i2c.write(SLAVE_ADDR,cmd,2);
+        if( ack!=0)
+            {
+                  ack = i2c.write(SLAVE_ADDR,cmd,2);
+                  if(ack!=0)
+                  return 0;
+            }
+        //wait_ms(20);
+        cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register , to scaled sensor values
+        cmd[1]=0x00;
+        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;
+        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;
+        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
+        {
+///            pc_acs.printf("Exited sensor init successfully\n \r");  
+            return 1;
+        }
+        
+        
+////        pc_acs.printf("Sensor init failed \n \r") ;
+        return 0;
+}
+
+int FCTN_ACS_INIT()
+{
+    ACS_INIT_STATUS = 1;     //set ACS_INIT_STATUS flag
+
     
-    //___________________________________________________________________________________________________
-    cmd[0]=GYRORATE; //Output data rate of 150Hz is used for gyroscope
-    cmd[1]=BIT_GYROODR;
-    i2c.write(SLAVE_ADDR,cmd,2);
-    wait_ms(1);
-    cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register we get scaled sensor values
-    cmd[1]=0x00;//actually 0x00
-    i2c.write(SLAVE_ADDR,cmd,2);
-    wait_ms(1);
-    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(1);
-    //_______________________________________________________________________________//
-    
-/*start as of now this approach i.e pass through state*/
-/*
-        cmd[0]=0x35;//event status
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rEvent Status at start is %x\n \r",(int)status);
-            
-    cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register we get scaled sensor values
-    cmd[1]=0x01;//Places sentral in standby state
-    i2c.write(SLAVE_ADDR,cmd,2);
-    wait_ms(1);
+    int working=0;
+
+///    pc_acs.printf("Attitude sensor init called \n \r");
+///    pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
     
     
-    cmd[0]=0xA0; //Pass through control register
-    cmd[1]=0x01;//places SENtral in pass through state
-    i2c.write(SLAVE_ADDR,cmd,2);
-    wait_ms(1); 
+    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)|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)|0xC0;
+  
+    }
     
+///    pc_acs.printf("Sensor 1 not working. Trying Sensor 2\n \r");
     
-    cmd[0]=0x9E;//Pass through status reg
-    i2c.write(SLAVE_ADDR,cmd,1);
-    i2c.read(SLAVE_ADDR_READ,&store,1);
-    wait_ms(1);
-    printf("\n\r the value of the pass through status register is = %x",(int)store);    
+    if((  (ACS_ATS_STATUS & 0x0C) != 0x0C)&&(  (ACS_ATS_STATUS & 0x0C) != 0x08))                //Sensor1 status is not 10 or 11
+    {
+                        
+            
+            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)|0x07;
+                ACS_INIT_STATUS = 0;
+                return 2;
+            }
+            
+                ATS2_SW_ENABLE = 1;
+                wait_ms(5);
+                
+                ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
+        
+        
+    }
     
-        cmd[0]=0x35;//event status
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rEvent Status at end initialization is %x\n \r",(int)status);
-*/
-
-    //_______________________________________________________________________________//
+///    pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+///    pc_acs.printf("Sensor 2 also not working.Exit init.\n \r");
     
-    ACS_INIT_STATUS = 'c'; //set ACS_INIT_STATUS flag
+    ACS_INIT_STATUS = 0; //set ACS_INIT_STATUS flag                                                              //Sensor 2 also not working
+    return 0;
 }
 
-void FCTN_ATS_DATA_ACQ()
+
+int SENSOR_DATA_ACQ()
 {
-    //time.start();
-    
-    ACS_DATA_ACQ_STATUS = 1;        //set ACS_DATA_ACQ_STATUS flag for att sens 2
-    if( ACS_ATS_ENABLE == 1)
-    {
-    FLAG();
-    pc_acs.printf("attitude sensor execution called \n \r");
-    toFlag=1; //toFlag is set to 1 so that it enters while loop
-    to.attach(&T_OUT,2); //after 2 seconds the while loop gets terminated 
-    while(toFlag) {
+        //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;
+        
+        uint8_t gyro_error=0;
+        uint8_t mag_error=0;
+        
+        //int ack1;
+        //int ack2;
+        
         cmd[0]=EVT_STATUS;
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(100);
-        pc_acs.printf("Event Status is %x\n \r",(int)status);
-        //if the 6th and 4th bit are 1 then it implies that gyro and magnetometer values are ready to take
-        if(((int)status&40)==40){ //when both work   
-/////          if((int)status==8){  //for just mag
-/////         if((int)status == 36){   //for just gyro as status 24(in binary) = 36 in decimal 
-/////           if((int)status==___yet to be decided___){ //for pass through state see how it tworks
-                
-            /*don't ask for info if the gyro cupped as interrupt makes it go haywire that is enables the pins for gyro*/
-           cmd[0]=GYRO_XOUT_H; //0x22 gyro LSB of x 
-          i2c.write(SLAVE_ADDR,cmd,1);
-            i2c.read(SLAVE_ADDR_READ,raw_gyro,6);
-
-/*editing the data*/
+        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;
+        }
 
-            cmd[0]=MAG_XOUT_H; //LSB of x
-            i2c.write(SLAVE_ADDR,cmd,1);
-            i2c.read(SLAVE_ADDR_READ,raw_mag,6);
-        //    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)raw_gyro[2*i+1]<<8)|(int16_t)raw_gyro[2*i]; 
-                gyro_data[i]=(float)bit_data;
-                gyro_data[i]=gyro_data[i]/senstivity_gyro;
-                gyro_data[i]+=gyro_error[i];
-               // pc_acs.printf("%f\t",gyro_data[i]);
-            }
-            
-/*read the status values to determine the actual condition/registers values for the gyro/mag off case */
-//starts here
+        event = (int)status; 
+        
+         if(ACS_ATS_STATUS&0xC0 == 0x40)
+        {
+            ATS1_EVENT_STATUS_RGTR = (uint8_t)event;
+        }
+        else if(ACS_ATS_STATUS&0x0C == 0x04)
+        {
+            ATS2_EVENT_STATUS_RGTR = (uint8_t)event;
+        }
+        
+        cmd[0]=SENTRALSTATUS;
+        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;
+        }
+        
 
-        cmd[0]=0x35;//event status
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rEvent Status at the end is %x",(int)status);
+        sentral = (int) status;
+        
+         if(ACS_ATS_STATUS&0xC0 == 0x40)
+        {
+            ATS1_SENTRAL_STATUS_RGTR = (uint8_t)sentral;
+        }
+        else if(ACS_ATS_STATUS&0x0C == 0x04)
+        {
+            ATS2_SENTRAL_STATUS_RGTR = (uint8_t)sentral;
+        }
+        
+///        pc_acs.printf("Event Status is %x\n \r",event);
+///        pc_acs.printf("Sentral Status is %x\n \r",sentral);
+          
         
         
-        cmd[0]=0x33;//enable events
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rEnable events is %x",(int)status);
-        
-        
-        cmd[0]=0x57;//gyro rate
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rgyro rate is %x",(int)status);
-        
-         
-        cmd[0]=0x55;//mag rate 0x00 indicate value lost 
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rmag rate is %x",(int)status);
-        
-        
-        cmd[0]=0x36;//sensorstatus
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rsensor Status is %x",(int)status);
-        
+        if  ( (event & 0x40 != 0x40 ) || (event & 0x08 != 0x08 ) || (event & 0x01 == 0x01 )|| (event & 0x02 == 0x02 )|| (sentral!= 3))    //check for any error in event status register
+        {
+            
+            
+            init = SENSOR_INIT();
+            
+            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; 
+            
+            cmd[0]=SENTRALSTATUS;
+            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;
+            }
+            
+            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     
+            {
+                
+                    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)
+                        {
+                            
+                            if(ACS_ATS_STATUS&0xC0 == 0x40)
+                            {
+                                ATS1_ERROR_RGTR = 0x01;
+                            }
+                            else if(ACS_ATS_STATUS&0x0C == 0x04)
+                            {
+                                ATS2_ERROR_RGTR = 0x01;
+                            }
+                            ack = i2c.read(SLAVE_ADDR_READ,&status,1);
+                            if(ack!=0)
+                                return 0;
+                        }
+                        
+                    error = (int)status; 
+                    
+                    if(ACS_ATS_STATUS&0xC0 == 0x40)
+                    {
+                        ATS1_ERROR_RGTR = (uint8_t)error;
+                    }
+                    else if(ACS_ATS_STATUS&0x0C == 0x04)
+                    {
+                        ATS2_ERROR_RGTR = (uint8_t)error;
+                    }
+
+                    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 0;
+                         
+                      }
+                      
+                      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 )
+                                {
+            
+                                      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
+            ack = i2c.read(SLAVE_ADDR_READ,reg_data,24);
+            if(ack != 0)
+            {
+                cmd[0]=MAG_XOUT_H; //LSB of x
+                i2c.write(SLAVE_ADDR,cmd,1);                        //Read gryo and mag registers together
+                ack = i2c.read(SLAVE_ADDR_READ,reg_data,24);
+                if(ack !=1)
+                    return 0;
+
+            }
+            
+            
+        //    pc_acs.printf("\nGyro Values:\n");
+        if (gyro_error!=1)
+        {
+            for(int i=0; i<3; i++) {
+                //concatenating gyro LSB and MSB to get 16 bit signed data values
+                actual_data.bit_data_acs_mg[i]= ((int16_t)reg_data[16+2*i+1]<<8)|(int16_t)reg_data[16+2*i]; 
+                gyro_data[i]=(float)actual_data.bit_data_acs_mg[i];
+                gyro_data[i]=gyro_data[i]/senstivity_gyro;
+                actual_data.AngularSpeed_actual[i] = gyro_data[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
+                actual_data.bit_data_acs_mm[i]= ((int16_t)reg_data[2*i+1]<<8)|(int16_t)reg_data[2*i];
+                 
+                mag_data[i]=(float)actual_data.bit_data_acs_mm[i];
+                mag_data[i]=mag_data[i]/senstivity_mag;
+                actual_data.Bvalue_actual[i] = mag_data[i];
+            }
+        }
+            
+            
+        if(mag_error == 1)
+        {
+ 
+          pc_acs.printf("Gyro only successful.\n \r");
+          return 1;
+        }
+        if(gyro_error == 1)
+        {
+            pc_acs.printf("Mag only successful.\n \r");
+            return 2;
+        }
         
-        cmd[0]=0x50;//error register
-        i2c.write(SLAVE_ADDR,cmd,1);
-        i2c.read(SLAVE_ADDR_READ,&status,1);
-        wait_ms(1);
-        pc_acs.printf("\n\rerror register value is %x\n \r",(int)status);
-                   
-//end here            
-            
-       //     pc_acs.printf("\nMag Values:\n");
-            for(int i=0; i<3; i++) {
-                //concatenating mag LSB and MSB to get 16 bit signed data values
-                bit_data= ((int16_t)raw_mag[2*i+1]<<8)|(int16_t)raw_mag[2*i];
-                mag_data[i]=(float)bit_data;
-                mag_data[i]=mag_data[i]/senstivity_mag;
-                mag_data[i]+=mag_error[i];
-                //pc_acs.printf("%f\t",mag_data[i]);
+        pc_acs.printf("Reading data success.\n \r");
+            return 3;
+}
+
+
+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);
+    
+    
+    if(( (ACS_ATS_STATUS & 0xC0) == 0x40))
+    {
+
+        acq = SENSOR_DATA_ACQ();
+        if(acq == 3)
+            {
+                
+                 ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
+                 
+                 //??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 3;
+            }
+        else if((acq == 2)||(acq==1))
+            {
+                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;
+ 
+                    }
             }
-            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];
-                //data[i+3]=mag_data[i];
+            
+        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;
+                            }
+                        
+                    }
+                 
             }
-          //  return(combined_values); //returning poiter combined values
-        } 
-       //checking for the error
-        else if (((int)status&2)==2) {
-            FCTN_ACS_INIT(); //when there is any error then Again inilization is done to remove error
-        }
+
+  
     }
-    }
-    else    //ACS_DATA_ACQ_STATUS = ACS_DATA_ACQ_FAILURE
-    {
-       ACS_DATA_ACQ_STATUS = 'f';   
-    }
-    ACS_DATA_ACQ_STATUS = 0;        //clear ACS_DATA_ACQ_STATUS flag for att sens 2
+    
+    if(( (ACS_ATS_STATUS & 0x0C) == 0x04))
+        {
+            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
+                {
+                    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");
+                    if((ACS_ATS_STATUS & 0xF0 == 0x30) ||((ACS_ATS_STATUS & 0xF0 == 0x20)&&(acq==1))||((ACS_ATS_STATUS & 0xF0 == 0x10)&&(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
+                            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;   
+                                }
+                           
+                            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();
+                                    
+                                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.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                                                                                          //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 == 0)
+                {
+                    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;
+                                }
+                        }
+                }
+        }
+    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");
+    return 0;
 }
 
 void FCTN_ACS_GENPWM_MAIN(float Moment[3])
 {
-    printf("\n\rEntered executable PWMGEN function\n"); // entering the PWMGEN executable function
+////    printf("\n\rEntered executable PWMGEN function\n"); // entering the PWMGEN executable function
     
     float l_duty_cycle_x=0;    //Duty cycle of Moment in x direction
     float l_current_x=0;       //Current sent in x TR's
@@ -580,10 +1417,7 @@
     float l_current_z=0;       //Current sent in z TR's
  
     
-    for(int i = 0 ; i<3;i++)
-    {
-     //   printf(" %f \t ",Moment[i]);  // taking the moment values from control algorithm as inputs
-    }
+////    printf("\r\r");
     
     //-----------------------------  x-direction TR  --------------------------------------------//
     
@@ -598,40 +1432,41 @@
     }
     
     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);
+////    printf("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);
+////        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);
+////        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.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);
+////        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)
     {
-        printf("\n \r l_current_x====0");
+////        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);
+////        printf("DC for trx is %f \r \n",l_duty_cycle_x);
         PWM1.period(TIME_PERIOD);
         PWM1 = l_duty_cycle_x/100 ;            
     }
     else                                           //not necessary
     {
         g_err_flag_TR_x = 1;
-    } 
+    }
+    pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x); 
          
     //------------------------------------- y-direction TR--------------------------------------//
     
@@ -647,33 +1482,33 @@
     
     
     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);
+////    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);
+////        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);
+////        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);
+////        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)
     {
-        printf("\n \r l_current_y====0");
+////        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);
+////        printf("DC for try is %f \r \n",l_duty_cycle_y);
         PWM2.period(TIME_PERIOD);
         PWM2 = l_duty_cycle_y/100 ;            
     }
@@ -681,252 +1516,75 @@
     {
       g_err_flag_TR_y = 1;
     } 
-             
+    pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);          
     //----------------------------------------------- z-direction TR -------------------------//  
     
-      
+    
+     
     float l_moment_z = Moment[2];         //Moment in z direction
     
-    phase_TR_z = 1;   // setting the default current direction
+    phase_TR_z = 1;  // setting the default current direction
     if (l_moment_z <0)
     {
-        phase_TR_z = 0; //if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high 
+        phase_TR_z = 0;   //if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high  
         l_moment_z = abs(l_moment_z);
     }
     
     
     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);
-        if( l_current_z>0 && l_current_z < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
+////    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);
+////        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;
     }
     else if (l_current_z >= 0.0016 && l_current_z < 0.0171)
     {
         l_duty_cycle_z = - 76880*pow(l_current_z,3) + 1280.8*pow(l_current_z,2) + 583.78*l_current_z + 0.0281; // calculating upto 10% dutycycle by polynomial interpolation
-        printf("DC for trz is %f \r \n",l_duty_cycle_z);
+////        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;            
     }
     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);
+////        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;            
-    }
+    }        
     else if(l_current_z==0)
     {
-        printf("\n \r l_current_z====0");
+////        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);
+////        printf("DC for trz is %f \r \n",l_duty_cycle_z);
         PWM3.period(TIME_PERIOD);
         PWM3 = l_duty_cycle_z/100 ;            
     }
     else                               // not necessary
     {
-        g_err_flag_TR_z = 1;
-    }   
+      g_err_flag_TR_z = 1;
+    } 
+    pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
     
+//changed
+     if(phase_TR_x)
+     ACS_TR_X_PWM = float_to_uint8(-1,1,PWM1);
+     else
+     ACS_TR_X_PWM = float_to_uint8(-1,1,-PWM1);
+     if(phase_TR_y)
+     ACS_TR_Y_PWM = float_to_uint8(-1,1,PWM2);
+     else
+     ACS_TR_Y_PWM = float_to_uint8(-1,1,-PWM2);
+     if(phase_TR_z)    
+     ACS_TR_Z_PWM = float_to_uint8(-1,1,PWM3);
+     else
+     ACS_TR_Z_PWM = float_to_uint8(-1,1,-PWM2);
+        
     //-----------------------------------------exiting the function-----------------------------------//
     
-    printf("\n\rExited executable PWMGEN function\n\r"); // stating the successful exit of TR function
+////    printf("\n\rExited executable PWMGEN function\n\r"); // stating the successful exit of TR function
  
 }
-
-
-/*void FCTN_ACS_GENPWM_MAIN(float Moment[3])
-{
-    printf("\n\rEntered executable PWMGEN function\n"); // entering the PWMGEN executable function
-    
-    float l_duty_cycle_x=0;    //Duty cycle of Moment in x direction
-    float l_current_x=0;       //Current sent in x TR's
-    float l_duty_cycle_y=0;    //Duty cycle of Moment in y direction
-    float l_current_y=0;       //Current sent in y TR's
-    float l_duty_cycle_z=0;    //Duty cycle of Moment in z direction
-    float l_current_z=0;       //Current sent in z TR's
- 
-    
-    for(int i = 0 ; i<3;i++)
-    {
-       printf("pwm %f \t ",Moment[i]);  // taking the moment values from control algorithm as inputs
-    }
-    
-    //-----------------------------  x-direction TR  --------------------------------------------//
-    
-    
-    float l_moment_x = Moment[0];         //Moment in x direction
-    
-    phase_TR_x = 1;  // setting the default current direction
-    if (l_moment_x <0)
-    {
-        phase_TR_x = 0;    // if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high 
-        l_moment_x = abs(l_moment_x);
-    }
-    
-    l_current_x = l_moment_x * TR_CONSTANT ;        //Moment and Current always have the linear relationship
-    pc_acs.printf("current in trx is %f \r \n",l_current_x);
-    if( l_current_x>0 && l_current_x < 0.006 ) //Current and Duty cycle have the linear relationship between 1% and 100%
-    {
-        l_duty_cycle_x =  6*1000000*pow(l_current_x,4) - 377291*pow(l_current_x,3) + 4689.6*pow(l_current_x,2) + 149.19*l_current_x - 0.0008; // calculating upto 0.1% dutycycle by polynomial interpolation 
-        pc_acs.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.006 && l_current_x < 0.0116)
-    { 
-        l_duty_cycle_x = 1*100000000*pow(l_current_x,4) - 5*1000000*pow(l_current_x,3) + 62603*pow(l_current_x,2) - 199.29*l_current_x + 0.7648;// calculating upto 1% dutycycle by polynomial interpolation
-        pc_acs.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.0116 && l_current_x < 0.0624)
-    {
-        l_duty_cycle_x = 212444*pow(l_current_x,4) - 33244*pow(l_current_x,3) + 1778.4*pow(l_current_x,2) + 120.91*l_current_x + 0.3878; // calculating upto 10% dutycycle by polynomial interpolation
-        pc_acs.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.0624 && l_current_x < 0.555)
-    {
-        l_duty_cycle_x =  331.15*pow(l_current_x,4) - 368.09*pow(l_current_x,3) + 140.43*pow(l_current_x,2) + 158.59*l_current_x + 0.0338; // calculating upto 100% dutycycle by polynomial interpolation
-        pc_acs.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)
-    {
-        printf("\n \r l_current_x====0");
-        l_duty_cycle_x = 0;      // default value of duty cycle
-        pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
-        PWM1.period(TIME_PERIOD);
-        PWM1 = l_duty_cycle_x/100 ;            
-    }
-    else                                           //not necessary
-    {
-        g_err_flag_TR_x = 1;
-    } 
-         
-    //------------------------------------- y-direction TR--------------------------------------//
-    
-     
-    float l_moment_y = Moment[1];         //Moment in y direction
-    
-    phase_TR_y = 1;  // setting the default current direction
-    if (l_moment_y <0)
-    {
-        phase_TR_y = 0;   //if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high  
-        l_moment_y = abs(l_moment_y);
-    }
-    
-    
-    l_current_y = l_moment_y * TR_CONSTANT ;        //Moment and Current always have the linear relationship
-     pc_acs.printf("current in try is %f \r \n",l_current_y);
-    if( l_current_y>0 && l_current_y < 0.006 )//Current and Duty cycle have the linear relationship between 1% and 100%
-    {
-        l_duty_cycle_y =  6*1000000*pow(l_current_y,4) - 377291*pow(l_current_y,3) + 4689.6*pow(l_current_y,2) + 149.19*l_current_y - 0.0008; // calculating upto 0.1% dutycycle by polynomial interpolation
-        pc_acs.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.006 && l_current_y < 0.0116)
-    { 
-        l_duty_cycle_y = 1*100000000*pow(l_current_y,4) - 5*1000000*pow(l_current_y,3) + 62603*pow(l_current_y,2) - 199.29*l_current_y + 0.7648;// calculating upto 1% dutycycle by polynomial interpolation
-        pc_acs.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.0116&& l_current_y < 0.0624)
-    {
-        l_duty_cycle_y = 212444*pow(l_current_y,4) - 33244*pow(l_current_y,3) + 1778.4*pow(l_current_y,2) + 120.91*l_current_y + 0.3878;// calculating upto 10% dutycycle by polynomial interpolation
-        pc_acs.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.0624 && l_current_y < 0.555)
-    {
-        l_duty_cycle_y =  331.15*pow(l_current_y,4) - 368.09*pow(l_current_y,3) + 140.43*pow(l_current_y,2) + 158.59*l_current_y + 0.0338;// calculating upto 100% dutycycle by polynomial interpolation
-        pc_acs.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)
-    {
-        printf("\n \r l_current_y====0");
-        l_duty_cycle_y = 0; // default value of duty cycle
-        pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
-        PWM2.period(TIME_PERIOD);
-        PWM2 = l_duty_cycle_y/100 ;            
-    }
-    else                               // not necessary
-    {
-      g_err_flag_TR_y = 1;
-    } 
-             
-    //----------------------------------------------- z-direction TR -------------------------//  
-    
-      
-    float l_moment_z = Moment[2];         //Moment in z direction
-    
-    phase_TR_z = 1;   // setting the default current direction
-    if (l_moment_z <0)
-    {
-        phase_TR_z = 0; //if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high 
-        l_moment_z = abs(l_moment_z);
-    }
-    
-    
-    l_current_z = l_moment_z * TR_CONSTANT ;        //Moment and Current always have the linear relationship
-     pc_acs.printf("current in trz is %f \r \n",l_current_z);
-    if( l_current_z>0 && l_current_z < 0.006 )//Current and Duty cycle have the linear relationship between 1% and 100%
-    {
-        l_duty_cycle_z =  6*1000000*pow(l_current_z,4) - 377291*pow(l_current_z,3) + 4689.6*pow(l_current_z,2) + 149.19*l_current_z - 0.0008;// calculating upto 0.1% dutycycle by polynomial interpolation
-        pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
-        PWM3.period(TIME_PERIOD);
-        PWM3 = l_duty_cycle_z/100 ;
-    }
-    else if( l_current_z >= 0.006 && l_current_z < 0.0116)
-    { 
-        l_duty_cycle_z = 1*100000000*pow(l_current_z,4) - 5*1000000*pow(l_current_z,3) + 62603*pow(l_current_z,2) - 199.29*l_current_z + 0.7648;// calculating upto 1% dutycycle by polynomial interpolation
-        pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
-        PWM3.period(TIME_PERIOD);
-        PWM3 = l_duty_cycle_z/100 ;             
-    }
-    else if (l_current_z >= 0.0116 && l_current_z < 0.0624)
-    {
-        l_duty_cycle_z = 212444*pow(l_current_z,4) - 33244*pow(l_current_z,3) + 1778.4*pow(l_current_z,2) + 120.91*l_current_z + 0.3878;// calculating upto 10% dutycycle by polynomial interpolation
-        pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
-        PWM3.period(TIME_PERIOD);
-        PWM3 = l_duty_cycle_z/100 ;            
-    }
-    else if(l_current_z >= 0.0624 && l_current_z < 0.555)
-    {
-        l_duty_cycle_z =  331.15*pow(l_current_z,4) - 368.09*pow(l_current_z,3) + 140.43*pow(l_current_z,2) + 158.59*l_current_z + 0.0338;// calculating upto 100% dutycycle by polynomial interpolation
-        pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
-        PWM3.period(TIME_PERIOD);
-        PWM3 = l_duty_cycle_z/100 ;            
-    }
-    else if(l_current_z==0)
-    {
-        printf("\n \r l_current_z====0");
-        l_duty_cycle_z = 0; // default value of duty cycle
-        pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
-        PWM3.period(TIME_PERIOD);
-        PWM3 = l_duty_cycle_z/100 ;            
-    }
-    else                               // not necessary
-    {
-        g_err_flag_TR_z = 1;
-    }   
-    
-    //-----------------------------------------exiting the function-----------------------------------//
-    
-    printf("\n\rExited executable PWMGEN function\n\r"); // stating the successful exit of TR function
- 
-}*/
-
-
-    
\ No newline at end of file
+  
\ No newline at end of file