working version

Dependencies:   mbed mbed-rtos SimpleDMA FreescaleIAP eeprom

Fork of CDMS_CODE_FM_28JAN2017 by samp Srinivasan

Revision:
356:197c93dc2012
Parent:
342:77b0d59897f7
Child:
357:f3d48d62e00e
--- a/CDMS_PL.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/CDMS_PL.h	Sat Feb 10 09:06:26 2018 +0000
@@ -1,5 +1,5 @@
 int pl_next_index=-1;   
-uint8_t pl_main_flag=0;
+uint8_t pl_main_flag=0x04;
 uint8_t PL_PREV_STATE=0x00;
 uint8_t POWER_LEVEL = 3;                                //Would be present in HK data extracted 
 uint32_t pl_block[192]={0};
@@ -172,9 +172,9 @@
     //gPC.printf("\n\rAt exit");
     char state[][17] = {"STATE_OFF","STATE_STANDBY","STATE_HIBERNATE","STATE_SCIENCE"};
     char status[][17] = {"PL_OFF","PL_STANDBY","PL_HIBERNATE","PL_SCIENCE","PL_SUCCESS_I2C","PL_ERR_I2C","PL_INVALID_STATE","PL_DISABLED"};
-    //gPC.printf("\n\rPL_state:%s -> %s",state[(uint8_t)temp[0]],state[(uint8_t)temp2[0]]);
-    //gPC.printf("\n\rPL_status:%s -> %s",status[(uint8_t)temp[1]],status[(uint8_t)temp2[1]]);
-    //gPC.printf("\n\rPL_PREV_state:%s -> %s",state[(uint8_t)temp[2]],state[(uint8_t)temp2[2]]);
+    gPC.printf("\n\rPL_state:%s -> %s",state[(uint8_t)temp[0]],state[(uint8_t)temp2[0]]);
+    gPC.printf("\n\rPL_status:%s -> %s",status[(uint8_t)temp[1]],status[(uint8_t)temp2[1]]);
+    gPC.printf("\n\rPL_PREV_state:%s -> %s",state[(uint8_t)temp[2]],state[(uint8_t)temp2[2]]);
 }
 void VERIFY_TM(Base_tm *tm_ptr)
 {
@@ -318,16 +318,20 @@
     temp[2] = (PL_PREV_STATE & STATE_SCIENCE)>>2;
     //test2(1);
 
-    if(PL_STATUS==2 || PL_STATUS==3)
+    if(PL_BEE_SW_STATUS==2 || PL_BEE_SW_STATUS==3)
     {
         gPC.printf("\n\rDevice Disabled or OC Fault");
-        pl_main_flag  = pl_main_flag & (~PL_DISABLED);
-        pl_main_flag |= PL_DISABLED;                        //setting PL_STATUS as PL_DISABLED
-        PL_STATUS = 0x07;
-        pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);    //Clearing pl_main status
-        PL_MAIN_status = 0;
-        print_exit(temp);
-        return;
+        if(PL_STATUS != 0x00)
+        {
+            pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+            pl_main_flag |= PL_DISABLED;                        //setting PL_STATUS as PL_DISABLED
+            PL_STATUS = 0x07;
+            pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);    //Clearing pl_main status
+            PL_MAIN_status = 0;
+            print_exit(temp);
+            return;
+        }
+        gPC.printf("\n\r PL IN OFF BY PMS - continuing...");
     }
     PL_PREV_STATE = (pl_main_flag & STATE_SCIENCE);         //saving current pl_state
     uint64_t temp_time;
@@ -357,6 +361,8 @@
                 gPC.printf("\n\rFuture block found at index = %d",pl_next_index);
                 break;
             }
+            if(((pl_block[i+1] & 0x3FE00000) >> 21) == 0)
+            {pl_next_index = i + 1;}
         }
     }
     if((pl_next_index==-1) || pl_time==0)           //RTC read failed or Future block not found
@@ -385,67 +391,71 @@
     }           
     
     //Processing the PL schedule
-    if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)||((pl_block[pl_next_index-1] & UNEXECUTED)==2))
-    {        
-        if(((pl_block[pl_next_index-1] & UNEXECUTED)==3))
-            gPC.printf("\n\rElapsed blocked not executed");
-        else
-            gPC.printf("\n\rElapsed block marked for retry");
+    if(pl_next_index != -1 && pl_next_index != 0)
+    {    
+        if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)||((pl_block[pl_next_index-1] & UNEXECUTED)==2))
+        {        
+            if(((pl_block[pl_next_index-1] & UNEXECUTED)==3))
+                gPC.printf("\n\rElapsed blocked not executed");
+            else
+                gPC.printf("\n\rElapsed block marked for retry");
 
-        gPC.printf("\n\r Retrieving pl_state from schedule");
-        if((pl_block[pl_next_index-1] & 0x0000000C)==0)                
-        {            
-            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
-            pl_main_flag |= STATE_OFF;
-            PL_STATE = 0x00;
-        }
-        if((pl_block[pl_next_index-1] & 0x0000000C)==4)
-        {
-            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
-            pl_main_flag |= STATE_STANDBY;
-            PL_STATE = 0x01;
-        }
-        if((pl_block[pl_next_index-1] & 0x0000000C)==8)
-        {
-            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
-            pl_main_flag |= STATE_HIBERNATE;
-            PL_STATE = 0x02;
-        }
-        if((pl_block[pl_next_index-1] & 0x0000000C)==12)
-        {
+            gPC.printf("\n\r Retrieving pl_state from schedule");
+            if((pl_block[pl_next_index-1] & 0x0000000C)==0)                
+            {            
+                pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+                pl_main_flag |= STATE_OFF;
+                PL_STATE = 0x00;
+            }
+            if((pl_block[pl_next_index-1] & 0x0000000C)==4)
+            {
+                pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+                pl_main_flag |= STATE_STANDBY;
+                PL_STATE = 0x01;
+            }
+            if((pl_block[pl_next_index-1] & 0x0000000C)==8)
+            {
+                pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+                pl_main_flag |= STATE_HIBERNATE;
+                PL_STATE = 0x02;
+            }
+            if((pl_block[pl_next_index-1] & 0x0000000C)==12)
+            {
             pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
             pl_main_flag |= STATE_SCIENCE;
             PL_STATE = 0x03;
+            }
         }
-    }
-    else if((pl_block[pl_next_index-1] & UNEXECUTED)==1)
-    {
-        gPC.printf("\n\rElapsed block is executed");
-        pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                  //Clearing pl_main status
-        PL_MAIN_status = 0;
-        print_exit(temp);
-        return;   
-    }      
-    else if((pl_block[pl_next_index-1] & UNEXECUTED)==0)  
-    {
-        //gPC.printf("\n\rEmpty Schedule Block");        
-        pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                  //Clearing pl_main status
-        PL_MAIN_status = 0;
-        print_exit(temp);
-        return;
-    }
+        else if((pl_block[pl_next_index-1] & UNEXECUTED)==1)
+        {
+            gPC.printf("\n\rElapsed block is executed");
+            pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                  //Clearing pl_main status
+            PL_MAIN_status = 0;
+            print_exit(temp);
+            return;   
+        }      
+        else if((pl_block[pl_next_index-1] & UNEXECUTED)==0)  
+        {
+            gPC.printf("\n\rEmpty Schedule Block");        
+            pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                  //Clearing pl_main status
+            PL_MAIN_status = 0;
+            print_exit(temp);
+            return;
+        }
     switch(pl_main_flag & STATE_SCIENCE)                                  //Checking PL_STATE
     {
         case STATE_OFF: 
         {
             gPC.printf("\n\rEntered PL_OFF case");
-            if(PL_STATUS!=0) 
+            if(PL_BEE_SW_STATUS != 0x03) 
             {
                 gPC.printf("\n\rCommanding PL_BEE to go to Standby State");
                 Base_tm *tm_ptr_standby;
                 SET_PL_BEE_STANDBY(tm_ptr_standby);                             //No ack needed now
                 gPC.printf("\n\rPowering OFF PL_BEE");
                 SET_PL_BEE_OFF;
+                PL_BEE_SW_STATUS = 0x03;
+                FCTN_CDMS_WR_FLASH(4,DEVICE_DISABLED);
                 PL_STATUS=0;    
             }           
             pl_main_flag  = pl_main_flag & (~PL_DISABLED);
@@ -462,11 +472,12 @@
         case STATE_STANDBY: 
         {            
             gPC.printf("\n\rEntered PL_STANDBY case");
-            if(PL_STATUS==0) 
+            if(PL_BEE_SW_STATUS == 0x03) 
             {
                 gPC.printf("\n\rPowering on PL_BEE");
                 SET_PL_BEE_ON;
-                PL_STATUS=1;
+                PL_BEE_SW_STATUS = 0x01;
+                FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
             }
             gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
             Base_tm *tm_ptr_standby;
@@ -489,11 +500,12 @@
             gPC.printf("\n\rEntered PL_HIBERNATE case");
             if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0)
             {                
-                if(PL_STATUS==0) 
+                if(PL_BEE_SW_STATUS == 0x03) 
                 {
                     gPC.printf("Powering on PL_BEE\r\n");                    
                     SET_PL_BEE_ON;
-                    PL_STATUS=1;
+                    PL_BEE_SW_STATUS = 0x01;
+                    FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
                 }
                 gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
                 Base_tm *tm_ptr_hibernate;
@@ -509,11 +521,12 @@
             {
                 pl_main_flag |= PL_LOW_POWER;
                 PL_LOW_power = 1;
-                if(PL_STATUS==0) 
+                if(PL_BEE_SW_STATUS == 0x03) 
                 {
                     gPC.printf("\n\rPowering on PL_BEE");
                     SET_PL_BEE_ON;
-                    PL_STATUS=1;
+                    PL_BEE_SW_STATUS = 1;
+                    FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
                 }
                 gPC.printf("\n\rCommanding PL_BEE to go to Standby State");
                 Base_tm *tm_ptr_standby;
@@ -544,11 +557,12 @@
             if(POWER_LEVEL==3 || POWER_LEVEL==0)                            //POWER_LEVEL = 0 = NA
             {
                 gPC.printf("\n\rPOWER_LEVEL = 3 or NA");
-                if(PL_STATUS==0)
+                if(PL_BEE_SW_STATUS == 0x03)
                 {
                     gPC.printf("\n\rPowering on PL_BEE");
                     SET_PL_BEE_ON;
-                    PL_STATUS=1;
+                    PL_BEE_SW_STATUS = 1;
+                    FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
                 }
                 gPC.printf("\n\rCommanding PL_BEE to go to Science State");  
                 Base_tm *tm_ptr_science;
@@ -572,11 +586,12 @@
                 PL_LOW_power = 1;
                 if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0)
                 {                
-                    if(PL_STATUS==0) 
+                    if(PL_BEE_SW_STATUS == 0x03) 
                     {
                         gPC.printf("\n\rPowering on PL_BEE");
                         SET_PL_BEE_ON;
-                        PL_STATUS=1;
+                        PL_BEE_SW_STATUS = 1;
+                        FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
                     }
                     gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
                     Base_tm *tm_ptr_hibernate;
@@ -592,11 +607,12 @@
                 {
                     pl_main_flag |= PL_LOW_POWER;
                     PL_LOW_power = 1;
-                    if(PL_STATUS==0) 
+                    if(PL_BEE_SW_STATUS == 0x03) 
                     {
                         gPC.printf("\n\rPowering on PL_BEE");
                         SET_PL_BEE_ON;
-                        PL_STATUS=1;
+                        PL_BEE_SW_STATUS = 1;
+                        FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
                     }
                     gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
                     Base_tm *tm_ptr_standby;
@@ -636,5 +652,6 @@
             print_exit(temp);
             return;
         }
+    }
     }    
 }
\ No newline at end of file