working version

Dependencies:   mbed mbed-rtos SimpleDMA FreescaleIAP eeprom

Fork of CDMS_CODE_FM_28JAN2017 by samp Srinivasan

Revision:
357:f3d48d62e00e
Parent:
356:197c93dc2012
--- a/CDMS_PL.h	Sat Feb 10 09:06:26 2018 +0000
+++ b/CDMS_PL.h	Sun Apr 03 15:35:53 2022 +0000
@@ -1,7 +1,6 @@
 int pl_next_index=-1;   
 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};
 uint32_t pl_time;
 uint32_t TIME_LATEST_PL=0;
@@ -200,8 +199,13 @@
                 pl_main_flag  = pl_main_flag & (~PL_DISABLED);
                 pl_main_flag |= PL_SUCCESS_I2C;
                 PL_STATUS = 0x04;
-                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-                pl_block[pl_next_index-1] |= EXECUTED;
+                if(pl_next_index >= 1)
+                {
+                    pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                    pl_block[pl_next_index-1] |= EXECUTED;
+                }
+                if(pl_next_index >=2)
+                    UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
             }
             else
             {
@@ -210,8 +214,13 @@
                 pl_main_flag  = pl_main_flag & (~PL_DISABLED);
                 pl_main_flag |= PL_ERR_I2C;
                 PL_STATUS = 0x05;
-                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-                pl_block[pl_next_index-1] |= RETRY;   
+                if(pl_next_index >= 1)
+                {
+                    pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                    pl_block[pl_next_index-1] |= RETRY;   
+                }
+                if(pl_next_index >=2)
+                    UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
             }
         }
         else
@@ -220,8 +229,13 @@
             pl_main_flag  = pl_main_flag & (~PL_DISABLED);
             pl_main_flag |= PL_ERR_I2C;
             PL_STATUS = 0x05;
-            pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-            pl_block[pl_next_index-1] |= RETRY;
+            if(pl_next_index >= 1)
+            {
+                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                pl_block[pl_next_index-1] |= RETRY;
+            }
+            if(pl_next_index >=2)
+                UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
         }
     }
     else if(GETshort_or_long_tm(tm_ptr)==0)                  //LONG TM
@@ -245,8 +259,13 @@
                 pl_main_flag  = pl_main_flag & (~PL_DISABLED);
                 pl_main_flag |= PL_SUCCESS_I2C;
                 PL_STATUS = 0x04;
-                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-                pl_block[pl_next_index-1] |= EXECUTED;
+                if(pl_next_index >= 1)
+                {
+                    pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                    pl_block[pl_next_index-1] |= EXECUTED;
+                }
+                if(pl_next_index >=2)
+                    UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
             }
             else
             {
@@ -254,8 +273,13 @@
                 pl_main_flag  = pl_main_flag & (~PL_DISABLED);
                 pl_main_flag |= PL_ERR_I2C;
                 PL_STATUS = 0x05;
-                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-                pl_block[pl_next_index-1] |= RETRY;   
+                if(pl_next_index >= 1)
+                {
+                    pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                    pl_block[pl_next_index-1] |= RETRY;  
+                }
+                if(pl_next_index >=2)
+                    UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
             }   
         }
         else
@@ -263,9 +287,14 @@
             gPC.printf("\n\rLong_TM CRC failed");
             pl_main_flag  = pl_main_flag & (~PL_DISABLED);
             pl_main_flag |= PL_ERR_I2C;
-            PL_STATUS = 0x05;     
-            pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-            pl_block[pl_next_index-1] |= RETRY;   
+            PL_STATUS = 0x05;
+            if(pl_next_index >= 1)     
+            {
+                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                pl_block[pl_next_index-1] |= RETRY;   
+            }
+            if(pl_next_index >=2)
+                UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
         }
     }    
 }
@@ -303,6 +332,83 @@
         schedule1[0] = {0,0,0,0,0,0,0,0};
     }
 }*/
+void SYS_RESET(){
+                    
+                    gPC.printf("\n\r Going into system reset\n");
+                    //DISABLE THE THREADS
+                    EN_PL = 0;
+                    EN_CDMS_HK = 0;
+                    EN_RCV_SC = 0;
+                    
+                    //SWITCH OFF BAE
+                    BAE_SW_EN_DS = 0;
+                    BAE_STATUS = DEVICE_DISABLED;
+                    WRITE_TO_EEPROM(1,DEVICE_DISABLED);
+                    gPC.printf("sw off bae\n");
+                    
+                    //PAYLOAD IN STANDBY MODE
+                    Base_tm *tm_ptr_standby;
+                    SET_PL_BEE_STANDBY(tm_ptr_standby);
+                    if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+                    {
+                        pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                        pl_main_flag |= PL_STANDBY; 
+                        PL_STATUS = 0x01;
+                        PL_STATE = 0x01;
+                    }        
+                    pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);   
+                    
+                    //SWITCH OFF SD CARD
+                    SD_SW_EN_DS = 0;
+                    SD_STATUS = DEVICE_DISABLED;
+                    WRITE_TO_EEPROM(2,DEVICE_DISABLED);
+                    gPC.printf("sw off sd\n");   
+                    
+                    //TURN ON
+                    WRITE_TO_EEPROM(2,DEVICE_POWERED);
+                    WRITE_TO_EEPROM(1,DEVICE_POWERED);    
+                    
+                    //UPDATE SYS_RESET TIME  
+                    TIME_LATEST_CDMS_EPS_RST_BACKUP = TIME_LATEST_CDMS_EPS_RST;
+                    WRITE_TO_EEPROM(21,(uint32_t)TIME_LATEST_CDMS_EPS_RST_BACKUP);
+                    WRITE_TO_EEPROM(20,TIME_LATEST_CDMS_EPS_RST_BACKUP>>32); 
+                    
+                    TIME_LATEST_CDMS_EPS_RST = FCTN_CDMS_RD_RTC();
+                    //Latest EPS_RST time stored in EEPROM
+                    WRITE_TO_EEPROM(19,(uint32_t)TIME_LATEST_CDMS_EPS_RST);
+                    WRITE_TO_EEPROM(18,TIME_LATEST_CDMS_EPS_RST>>32);                     
+                    
+
+}
+
+void BACK_NORMAL()
+{
+    //ENABLE THE THREADS
+    EN_PL = 1;
+    EN_CDMS_HK = 1;
+    EN_RCV_SC = 1;
+                    
+    //SWITCH ON BAE
+    BAE_SW_EN_DS = 1;
+    BAE_STATUS = DEVICE_POWERED;
+    WRITE_TO_EEPROM(1,DEVICE_POWERED);
+    gPC.printf("sw on bae\n");
+                    
+    //SWITCH ON SD CARD
+    SD_SW_EN_DS = 1;
+    SD_STATUS = DEVICE_POWERED;
+    WRITE_TO_EEPROM(2,DEVICE_POWERED);
+    gPC.printf("sw on sd\n");  
+                    
+    //UPDATE SYS_RESET TIME  
+    TIME_LATEST_CDMS_EPS_RST = TIME_LATEST_CDMS_EPS_RST_BACKUP ;
+    //Latest EPS_RST time stored in EEPROM
+    WRITE_TO_EEPROM(19,(uint32_t)TIME_LATEST_CDMS_EPS_RST);
+    WRITE_TO_EEPROM(18,TIME_LATEST_CDMS_EPS_RST>>32); 
+    
+}
+
+
 void FCTN_CDMS_PL_MAIN(void const *args)
 {
     if(EN_PL == 0x00)
@@ -337,6 +443,7 @@
     uint64_t temp_time;
     temp_time=FCTN_CDMS_RD_RTC();
     pl_time = (uint32_t)((temp_time>>7) & 0x000000000FFFFFFF);
+    gPC.printf("\n\r %u", pl_time);
 
     //call test3() here
     //test3(1);
@@ -349,6 +456,7 @@
     gPC.printf("\n\rHours :%d",((pl_time & 0x0001F000)>>12));
     gPC.printf("\tMin :%d",((pl_time & 0x00000FC0)>>6));
     gPC.printf("\t\tSec :%d",(pl_time & 0x0000003F));*/
+    pl_next_index = -1;
     if(pl_time!=0)                             //RTC read successful 
     {
         // run the loop until end of schedule is reached or month and day are both zeros or future block is found
@@ -371,7 +479,19 @@
         {
             pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
             pl_main_flag |= STATE_HIBERNATE;
-            PL_STATE = 0x02;
+            gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
+            Base_tm *tm_ptr_hibernate;
+            SET_PL_BEE_HIBERNATE(tm_ptr_hibernate);
+            if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+            {
+                pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_HIBERNATE;
+                PL_STATUS = 0x02;
+                PL_STATE = 0x02;
+                WRITE_TO_EEPROM(16,(uint32_t)PL_STATE);
+            }
+            pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
+            PL_MAIN_status = 0;
         } 
         else
         {                        
@@ -405,25 +525,21 @@
             {            
                 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;
+                pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+                pl_main_flag |= STATE_SCIENCE;
             }
         }
         else if((pl_block[pl_next_index-1] & UNEXECUTED)==1)
@@ -455,14 +571,18 @@
                 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;    
+                WRITE_TO_EEPROM(4,DEVICE_DISABLED);
+                PL_STATUS = 0;    
             }           
             pl_main_flag  = pl_main_flag & (~PL_DISABLED);
             pl_main_flag |= PL_OFF;
             PL_STATUS = 0x00;
+            PL_STATE = 0x00;
+            WRITE_TO_EEPROM(16,(uint32_t)PL_STATE);
             pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
-            pl_block[pl_next_index-1] |= EXECUTED;                              
+            pl_block[pl_next_index-1] |= EXECUTED;
+            if(pl_next_index >=2)
+                UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM                
             pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                    //Clearing PL_MAIN_STATUS
             PL_MAIN_status = 0;
             print_processed_block(pl_next_index-1);
@@ -477,7 +597,8 @@
                 gPC.printf("\n\rPowering on PL_BEE");
                 SET_PL_BEE_ON;
                 PL_BEE_SW_STATUS = 0x01;
-                FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
+                WRITE_TO_EEPROM(4,DEVICE_POWERED);
+                // PL_STATE = 0x01                                          //uncomment - Joel after finding out default startup state of PYLD
             }
             gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
             Base_tm *tm_ptr_standby;
@@ -487,6 +608,8 @@
                 pl_main_flag = pl_main_flag & (~PL_DISABLED);
                 pl_main_flag |= PL_STANDBY; 
                 PL_STATUS = 0x01;
+                PL_STATE = 0x01;
+                WRITE_TO_EEPROM(16,(uint32_t)PL_STATE);
             }        
             pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS 
             PL_MAIN_status = 0;
@@ -497,146 +620,60 @@
         }
         case STATE_HIBERNATE: 
         {
-            gPC.printf("\n\rEntered PL_HIBERNATE case");
-            if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0)
-            {                
-                if(PL_BEE_SW_STATUS == 0x03) 
-                {
-                    gPC.printf("Powering on PL_BEE\r\n");                    
-                    SET_PL_BEE_ON;
-                    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;
-                SET_PL_BEE_HIBERNATE(tm_ptr_hibernate);
-                if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
-                {
-                    pl_main_flag = pl_main_flag & (~PL_DISABLED);
-                    pl_main_flag |= PL_HIBERNATE;
-                    PL_STATUS = 0x02;
-                }
-            }
-            else 
+            gPC.printf("\n\rEntered PL_HIBERNATE case");                
+            if(PL_BEE_SW_STATUS == 0x03) 
             {
-                pl_main_flag |= PL_LOW_POWER;
-                PL_LOW_power = 1;
-                if(PL_BEE_SW_STATUS == 0x03) 
-                {
-                    gPC.printf("\n\rPowering on PL_BEE");
-                    SET_PL_BEE_ON;
-                    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;
-                SET_PL_BEE_STANDBY(tm_ptr_standby);
-                if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
-                {
-                    pl_main_flag = pl_main_flag & (~PL_DISABLED);
-                    pl_main_flag |= PL_STANDBY; 
-                    PL_STATUS = 0x01;
-                }        
-                pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS 
-                PL_MAIN_status = 0;
-                print_processed_block(pl_next_index-1);
-                print_exit(temp);
-                return;
-                                                                                //////DELETE THE TM AND TC LATER
-            }            
+                gPC.printf("Powering on PL_BEE\r\n");                    
+                SET_PL_BEE_ON;
+                PL_BEE_SW_STATUS = 0x01;
+                WRITE_TO_EEPROM(4,DEVICE_POWERED);
+                // PL_STATE = 0x01                                          //uncomment - Joel after finding out default startup state of PYLD
+            }
+            gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
+            Base_tm *tm_ptr_hibernate;
+            SET_PL_BEE_HIBERNATE(tm_ptr_hibernate);
+            if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+            {
+                pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_HIBERNATE;
+                PL_STATUS = 0x02;
+                PL_STATE = 0x02;
+                WRITE_TO_EEPROM(16,(uint32_t)PL_STATE);
+            }
             pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
             PL_MAIN_status = 0;
             print_processed_block(pl_next_index-1);
             print_exit(temp);
             return;
-                                                                            //////DELETE THE TM LATER
         }
         case STATE_SCIENCE:
         {
             gPC.printf("\n\rEntered PL_SCIENCE case");
-            if(POWER_LEVEL==3 || POWER_LEVEL==0)                            //POWER_LEVEL = 0 = NA
+            if(PL_BEE_SW_STATUS == 0x03)
             {
-                gPC.printf("\n\rPOWER_LEVEL = 3 or NA");
-                if(PL_BEE_SW_STATUS == 0x03)
-                {
-                    gPC.printf("\n\rPowering on PL_BEE");
-                    SET_PL_BEE_ON;
-                    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;
-                SET_PL_BEE_SCIENCE(tm_ptr_science);
-                if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
-                {
-                    pl_main_flag = pl_main_flag & (~PL_DISABLED);
-                    pl_main_flag |= PL_SCIENCE; 
-                    PL_STATUS = 0x03;
-                }
-                pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
-                PL_MAIN_status = 0;
-                print_processed_block(pl_next_index-1);
-                print_exit(temp);
-                return;
+                gPC.printf("\n\rPowering on PL_BEE");
+                SET_PL_BEE_ON;
+                PL_BEE_SW_STATUS = 1;
+                //FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED);
+                WRITE_TO_EEPROM(4,DEVICE_POWERED);
+                // PL_STATE = 0x01                                          //uncomment - Joel after finding out default startup state of PYLD
             }
-            else
-            {   
-                gPC.printf("\n\rPower level = 2,3 or NA");
-                pl_main_flag |= PL_LOW_POWER;
-                PL_LOW_power = 1;
-                if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0)
-                {                
-                    if(PL_BEE_SW_STATUS == 0x03) 
-                    {
-                        gPC.printf("\n\rPowering on PL_BEE");
-                        SET_PL_BEE_ON;
-                        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;
-                    SET_PL_BEE_HIBERNATE(tm_ptr_hibernate);
-                    if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
-                    {
-                        pl_main_flag = pl_main_flag & (~PL_DISABLED);
-                        pl_main_flag |= PL_HIBERNATE; 
-                        PL_STATUS = 0x02;
-                    }
-                }
-                else 
-                {
-                    pl_main_flag |= PL_LOW_POWER;
-                    PL_LOW_power = 1;
-                    if(PL_BEE_SW_STATUS == 0x03) 
-                    {
-                        gPC.printf("\n\rPowering on PL_BEE");
-                        SET_PL_BEE_ON;
-                        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;
-                    SET_PL_BEE_STANDBY(tm_ptr_standby);
-                    if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
-                    {
-                        pl_main_flag = pl_main_flag & (~PL_DISABLED);
-                        pl_main_flag |= PL_STANDBY; 
-                        PL_STATUS = 0x01;
-                    }        
-                    pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS 
-                    PL_MAIN_status = 0;
-                    print_processed_block(pl_next_index-1);
-                    print_exit(temp);
-                    return;                                               
-                                                                                    //////DELETE THE TM AND TC LATER
-                }            
-                pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
-                PL_MAIN_status = 0;
-                print_processed_block(pl_next_index-1);
-                print_exit(temp);
-                return;
-                                                                                //////DELETE THE TM LATER
+            gPC.printf("\n\rCommanding PL_BEE to go to Science State");  
+            Base_tm *tm_ptr_science;
+            SET_PL_BEE_SCIENCE(tm_ptr_science);
+            if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+            {
+                pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_SCIENCE; 
+                PL_STATUS = 0x03;
+                PL_STATE = 0x03;
+                WRITE_TO_EEPROM(16,(uint32_t)PL_STATE);
             }
+            pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
+            PL_MAIN_status = 0;
+            print_processed_block(pl_next_index-1);
+            print_exit(temp);
+            return;
         }
         default:
         {
@@ -646,6 +683,8 @@
             PL_STATUS = 0x06;
             pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
             pl_block[pl_next_index-1] |= EXECUTED;
+            if(pl_next_index >=2)
+                UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]);     //1to2 , updating the previous status to EEPROM
             pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
             PL_MAIN_status = 0;
             print_processed_block(pl_next_index-1);
@@ -653,5 +692,35 @@
             return;
         }
     }
-    }    
+    }  
+    RESET_WATCHDOG(); 
+    //CHECK FOR SYS POWER RESET
+    sys_pwr_rst.input();
+    int sys_val = sys_pwr_rst.read();
+    gPC.printf("\rsys_reset_val = %d\n",sys_val);
+    if(sys_val == 1)
+    {
+        //ACKNOWLEDGE SYS RST
+        sys_pwr_rst.output();
+        sys_pwr_rst = 0;
+        gPC.printf("\rsys_reset_val = %d\n",sys_pwr_rst.read());
+            
+        SYS_RESET();
+        while(1){
+            wait_ms(10000);
+            //RESET_WATCHDOG();                 //uncomment in the FM SBC with watchdog enabled
+            uint64_t cur_rtc = FCTN_CDMS_RD_RTC();
+            uint32_t T_check1 = ((((cur_rtc - TIME_LATEST_CDMS_EPS_RST) >> 7)& 0x00000FC0)>>6);
+            //gPC.printf("\r%d\n",T_check1 );
+            //gPC.printf("\r%d\n",TIME_LATEST_CDMS_EPS_RST);
+            //gPC.printf("\r%d\n",cur_rtc);
+            if(T_check1 >=  5*T_OFF_RST)
+            {
+                break;
+            }            
+        }
+        BACK_NORMAL();                    
+    }
+    gPC.printf("\rTIME_LATEST_CDMS_EPS_RST = %d\n",TIME_LATEST_CDMS_EPS_RST);
+        
 }
\ No newline at end of file