Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FreescaleIAP SimpleDMA eeprom mbed-rtos mbed
Fork of CDMS_QM_03MAR2017_Flash_with_obsrs by
Revision 356:4484bf39526f, committed 2018-02-24
- Comitter:
 - samp1234
 - Date:
 - Sat Feb 24 10:28:56 2018 +0000
 - Parent:
 - 355:a5e72222ff26
 - Commit message:
 - EEPROM FM
 
Changed in this revision
--- a/CDMS_HK.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/CDMS_HK.h	Sat Feb 24 10:28:56 2018 +0000
@@ -10,6 +10,8 @@
 void FUNC_CDMS_GPIO_STATUS();
 void minMaxHkData();
 void COLLECT_CDMS_RAM();
+void IS_BAE_IN_DISTRESS();
+uint8_t SAVE_BAE(uint8_t);
 
 extern uint8_t beacon_array[134];
 //extern RSSI_MAX;
@@ -48,7 +50,6 @@
 void FCTN_CDMS_HK_MAIN(void const *args)
 {
     uint8_t sd_stat = 0;
-    uint8_t hk_count=0;
     while(1) {
         gPC.printf("waiting for HK sig\n\r");
         gHK_THREAD->signal_wait(HK_SIGNAL);
@@ -71,11 +72,15 @@
           
         //gPC.printf("\n\r%d\n",CDMS_WR_SD_FAULT_COUNTER);
         if(EN_CDMS_HK == 0x00)
+        {
+            gMutex.unlock();  //unlocked mutex
             continue;
+        }
         CDMS_HK_MAIN_STATUS = 0x01;
         CDMS_HK_MAIN_COUNTER++;
+        CDMS_I2C_ERR_BAE_CURRENT = CDMS_I2C_ERR_BAE_COUNTER;
+        
 
-       
         FCTN_CDMS_HK();         //collects temperatures
        
         if(!COM_RSSI_SET)
@@ -109,9 +114,9 @@
             CDMS_HEALTH_DATA[86+i] = CDMS_quant[i];
 
         // Here: Have to FIT flash data.
-        CDMS_HEALTH_DATA[106] = (EPS_V_A_EN_STATUS<<7) | ((BAE_STATUS<<5)&0x60) | ((SD_STATUS<<3)&0x18) | ((PL_STATUS<<1)&0x06) | (PL_EPS_LATCH_SW_EN & 0x01);
-     //  CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((CDMS_RTC_DISABLE<<5)&0x20);
-         CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((EN_RTC<<5)&0x20); // changed by samp
+        CDMS_HEALTH_DATA[106] = (EPS_V_A_EN_STATUS<<7) | ((BAE_STATUS<<5)&0x60) | ((SD_STATUS<<3)&0x18) | ((PL_BEE_SW_STATUS<<1)&0x06) | (PL_EPS_LATCH_SW_EN & 0x01);
+       CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((CDMS_RTC_DISABLE<<5)&0x20);
+     //    CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((EN_RTC<<5)&0x20); // changed by samp
          gPC.printf("\n\r 0x%08X",EN_RTC);
         CDMS_HEALTH_DATA[108] = CDMS_RESET_COUNTER >>8;
         CDMS_HEALTH_DATA[109] = CDMS_RESET_COUNTER;
@@ -185,25 +190,27 @@
 
         /*---------------------------------- BAE HK --------------------------------------------*/
         
-    //    gPC.printf("endHK_SD2");
+        //gPC.printf("\n\rDO IT NOW\r");
         BAE_HK_I2C = FCTN_I2C_READ(BAE_HK,134);
         //  gPC.printf("\nEntering BAE HK\t");
         if(BAE_HK_I2C == 0) {
-     //  gPC.printf("BAE_HK_");
+        gPC.printf("BAE_HK_");
             crc = crc16_gen((unsigned char *)BAE_HK,132);
             if(crc == ((uint16_t)BAE_HK[132] << 8) | (uint16_t)BAE_HK[133]) {
                 gPC.printf("BAE HK data recieved through I2C\t");
                 TIME_LATEST_I2C_BAE = FCTN_CDMS_RD_RTC() >> 7;
-                /*for(int i = 0; i<15; i++)
-                    gPC.printf("\r 0x%02X\n",BAE_HK[i]);*/
-                for(int i = 0; i<4; i++)
-                    BAE_HK[i] = time >> (3-i)*8;
+//                for(int i = 0; i<15; i++)                        //Changed to test - J
+//                    gPC.printf("%d\t",BAE_HK[i]);
+//                for(int i = 0; i<4; i++)
+//                    BAE_HK[i] = time >> (3-i)*8;
+                for(int i = 128; i<132; i++)
+                    BAE_HK[i] = time >> (131-i)*8;
                 BAE_HK_FRAME[0] = 0x28;
                 BAE_HK_FRAME[1] = (FSC_CURRENT[5]+1) >> 16;
                 BAE_HK_FRAME[2] = (FSC_CURRENT[5]+1) >> 8;
                 BAE_HK_FRAME[3] = FSC_CURRENT[5]+1;
                 for(int i = 0; i<128; i++)                       /*Adding actual CDMS Health data to TM frame*/
-                    BAE_HK_FRAME[4+i] = BAE_HK[i];
+                    BAE_HK_FRAME[4+i] = BAE_HK[4+i];
                 crc = crc16_gen(BAE_HK_FRAME,132);               /*Adding CRC to TM frame*/
                 BAE_HK_FRAME[132] = crc >> 8;
                 BAE_HK_FRAME[133] = crc;
@@ -285,6 +292,9 @@
         } else
             gPC.printf("long Bcn not sent\r\n");
         //gPC.printf("\rCompleted Beacon\n");
+        if (GIVE_UP_ON_BAE == 0)
+        IS_BAE_IN_DISTRESS();
+            
         gPC.printf("\rreleasing mutex for HK_MAIN \n\r");
       SCI_LED1 =0;
        gMutex.unlock();
@@ -333,6 +343,7 @@
 
         min_max_data.CDMS_temp_min = saveMin(min_max_data.CDMS_temp_min,quant_data.CDMS_temp_quant);
         min_max_data.CDMS_temp_max = saveMax(min_max_data.CDMS_temp_max,quant_data.CDMS_temp_quant);
+        GPIO_FAULTS = 0;
     }
     firstCount=false;
 }
@@ -446,6 +457,10 @@
     GPIO_STATUS=(COM_TX_CNTRL)?(GPIO_STATUS)|((uint16_t)(0x1<<1)):(GPIO_STATUS)&(~((uint16_t)(0x1<<1)));
     //  gPC.printf("%04x\n",GPIO_STATUS);
     gPC.printf("\n\rBAE_OC STATE = %04x",GPIO_STATUS);
+    if (((GPIO_STATUS) | (GPIO_FAULTS)) != 0xFFFF)
+    {
+        GPIO_FAULTS = (GPIO_FAULTS | (~(GPIO_STATUS)));
+    }
 }
 
 void VERIFY_COMRX()
@@ -507,13 +522,13 @@
             SD_FAULTCOUNT++;
             SD_STATUS = (SD_FAULTCOUNT == 3) ? DEVICE_DISABLED :DEVICE_OC_FAULT;
             if(SD_FAULTCOUNT == 3) {
-                FCTN_CDMS_WR_FLASH(2,DEVICE_DISABLED);
+                WRITE_TO_EEPROM(2,DEVICE_DISABLED);
                 gPC.printf("Declaring SD card permanantly Disabled");
             }
         } else {
             SD_STATUS = DEVICE_POWERED;
             if(SD_STATUS != DEVICE_POWERED)
-                FCTN_CDMS_WR_FLASH(2,DEVICE_POWERED);
+                WRITE_TO_EEPROM(2,DEVICE_POWERED);
             SD_FAULTCOUNT = 0;
         }
     }
@@ -534,13 +549,13 @@
             BAE_FAULTCOUNT++;
             BAE_STATUS = (BAE_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
             if(BAE_FAULTCOUNT == 3) {
-                FCTN_CDMS_WR_FLASH(1,DEVICE_DISABLED);
+                WRITE_TO_EEPROM(1,DEVICE_DISABLED);
                 gPC.printf("Declaring BAE permanantly Disabled");
             }
         } else {
             BAE_STATUS = DEVICE_POWERED;
             if(SD_STATUS != DEVICE_POWERED);
-            FCTN_CDMS_WR_FLASH(1,DEVICE_POWERED);
+            WRITE_TO_EEPROM(1,DEVICE_POWERED);
             BAE_FAULTCOUNT = 0;
         }
     }
@@ -548,8 +563,8 @@
 
 void HANDLE_HW_FAULT_PL()
 {
-    if(PL_STATUS != DEVICE_DISABLED) {
-        if(PL_STATUS == DEVICE_OC_FAULT) {
+    if(PL_BEE_SW_STATUS != DEVICE_DISABLED) {
+        if(PL_BEE_SW_STATUS == DEVICE_OC_FAULT) {
             gPC.printf("Switching on PL_BEE");
             PYLD_DFF_CLK = 0;
             PYLD_DFF = 1;           // Switching ON PL
@@ -569,25 +584,15 @@
             PYLD_DFF_CLK = 0;
             wait_us(1);
             PL_FAULTCOUNT++;
-            PL_STATUS = (PL_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
+            PL_BEE_SW_STATUS = (PL_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
             if(PL_FAULTCOUNT == 3) {
-               FCTN_CDMS_WR_FLASH(3,DEVICE_DISABLED);
+               WRITE_TO_EEPROM(4,DEVICE_DISABLED);
                 gPC.printf("Declaring PL_BEE permanantly Disabled");
             }
         } else {
-            if(PL_STATUS == DEVICE_OC_FAULT) {
-                gPC.printf("Switching off PL_BEE");
-                PYLD_DFF_CLK = 0;
-                PYLD_DFF = 0;             //Switching OFF PL
-                wait_us(1);
-                PYLD_DFF_CLK = 1;
-                wait_us(1);
-                PYLD_DFF_CLK = 0;
-                wait_us(1);
-            }
-            PL_STATUS = DEVICE_ENABLED;
-            if(PL_STATUS != DEVICE_ENABLED)
-                FCTN_CDMS_WR_FLASH(3,DEVICE_ENABLED);
+            PL_BEE_SW_STATUS = DEVICE_POWERED;
+            if(SD_STATUS != DEVICE_POWERED)
+            WRITE_TO_EEPROM(4,DEVICE_POWERED);
             PL_FAULTCOUNT = 0;
         }
     }
@@ -662,4 +667,38 @@
         CDMS_RAM[79+i] = FSC_OLD[5] >> (3-i)*8;
     CDMS_RAM[83] = 0x00;
     gPC.printf("\n\r%u %u %u %u %u",FSC_CURRENT[1],FSC_CURRENT[2],FSC_CURRENT[3],FSC_CURRENT[4],FSC_CURRENT[5]);
+}
+
+void IS_BAE_IN_DISTRESS()
+{
+    if((BAE_STATUS == 1)&&(CDMS_I2C_ERR_BAE_COUNTER == (CDMS_I2C_ERR_BAE_CURRENT + 2)))
+        {
+            if (CDMS_HK_MAIN_COUNTER == (CDMS_I2C_ERR_HK_LATEST + 1))
+            {
+                CDMS_I2C_ERR_HK_LATEST = CDMS_HK_MAIN_COUNTER;
+                KILL_BAE_COUNTER++;
+            }
+            else
+            {
+                CDMS_I2C_ERR_HK_LATEST = CDMS_HK_MAIN_COUNTER;
+                KILL_BAE_COUNTER = 1;
+            } 
+            if (KILL_BAE_COUNTER >= 3)
+            {
+                GIVE_UP_ON_BAE = SAVE_BAE(KILL_BAE_COUNTER);
+            }
+        }
+}
+
+uint8_t SAVE_BAE(uint8_t counter)
+{
+    BAE_SW_EN_DS = 0;
+    wait(5);
+    BAE_SW_EN_DS = 1;
+    
+    BAE_STATUS = DEVICE_POWERED;
+    WRITE_TO_EEPROM(1,DEVICE_POWERED);
+    if (counter == 6)
+    return 1;
+    return 0;
 }
\ No newline at end of file
--- a/CDMS_PL.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/CDMS_PL.h	Sat Feb 24 10:28:56 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};
@@ -139,6 +139,9 @@
     pl_tc_science->TC_string[9]  = (uint8_t)(crc16 & 0xFF00)>>8;\
     pl_tc_science->TC_string[10] = (uint8_t)(crc16 & 0x00FF);\
     tm_ptr_science =  FCTN_CDMS_RLY_TMTC(pl_tc_science);\
+    if(EN_PL == 0)\
+    VERIFY_TM_NON_PMS(tm_ptr_science);\
+    else\
     VERIFY_TM(tm_ptr_science);\
     delete pl_tc_science;\
     Base_tm *temp;\
@@ -172,9 +175,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)
 {
@@ -269,6 +272,62 @@
         }
     }    
 }
+void VERIFY_TM_NON_PMS(Base_tm *tm_ptr)
+{
+    uint8_t temp = tm_ptr->TM_string[2];            //Obatining ACK_CODE
+    if(GETshort_or_long_tm(tm_ptr)==1)              //short TM
+    {
+        gPC.printf("\n\rSHORT TM received non PMS");
+        uint16_t crc16 = crc16_gen(tm_ptr->TM_string, 11);        
+        if(tm_ptr->TM_string[12]==((uint8_t)(crc16 & 0x00FF)) && tm_ptr->TM_string[11]==((uint8_t)((crc16 & 0xFF00)>>8)))        
+        {            
+            if(temp==0xA0 || temp==0xC0)
+            {
+                gPC.printf("\n\rACK_CODE Success");
+                if(temp==0xA0)
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                else
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+            }
+            else
+            {
+                gPC.printf("\n\rACK_CODE failure (0x%02X)",temp);
+                PL_RCV_SC_STATUS = 2;
+            }
+        }
+        else
+        {
+            gPC.printf("\n\rShort_TM CRC failed");
+            PL_RCV_SC_STATUS = 3;
+        }
+    }
+    else if(GETshort_or_long_tm(tm_ptr)==0)                  //LONG TM
+    {
+        gPC.printf("\n\rLONG TM received");
+        uint16_t crc16 = crc16_gen(tm_ptr->TM_string,132);        
+        if(tm_ptr->TM_string[133]==((uint8_t)(crc16 & 0x00FF)) && tm_ptr->TM_string[132]==((uint8_t)((crc16 & 0xFF00)>>8)))        
+        {
+            if(temp==0xA0 || temp==0xC0)
+            {
+                gPC.printf("\n\rACK_CODE Success");
+                if(temp==0xA0)
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                else
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+            }
+            else
+            {
+                gPC.printf("\n\rACK_CODE failure (0x%02X)",temp);
+                PL_RCV_SC_STATUS = 2;
+            }   
+        }
+        else
+        {
+            gPC.printf("\n\rLong_TM CRC failed");  
+            PL_RCV_SC_STATUS = 3;
+        }
+    }    
+}
 void test1(uint8_t t)
 {
     //Output should be PL_STATUS = PL_DISABLED
@@ -318,16 +377,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;
@@ -358,6 +421,8 @@
                 break;
             }
         }
+        if(((pl_block[pl_next_index+1] & 0x3FE00000) >> 21)!=0)
+        {pl_next_index += 1;}
     }
     if((pl_next_index==-1) || pl_time==0)           //RTC read failed or Future block not found
     {       
@@ -385,67 +450,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;
+                WRITE_TO_EEPROM(4,DEVICE_DISABLED);
                 PL_STATUS=0;    
             }           
             pl_main_flag  = pl_main_flag & (~PL_DISABLED);
@@ -462,11 +531,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;
+                WRITE_TO_EEPROM(4,DEVICE_POWERED);
             }
             gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
             Base_tm *tm_ptr_standby;
@@ -489,11 +559,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;
+                    WRITE_TO_EEPROM(4,DEVICE_POWERED);
                 }
                 gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
                 Base_tm *tm_ptr_hibernate;
@@ -509,11 +580,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;
+                    WRITE_TO_EEPROM(4,DEVICE_POWERED);
                 }
                 gPC.printf("\n\rCommanding PL_BEE to go to Standby State");
                 Base_tm *tm_ptr_standby;
@@ -544,11 +616,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;
+                    WRITE_TO_EEPROM(4,DEVICE_POWERED);
                 }
                 gPC.printf("\n\rCommanding PL_BEE to go to Science State");  
                 Base_tm *tm_ptr_science;
@@ -572,11 +645,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;
+                        WRITE_TO_EEPROM(4,DEVICE_POWERED);
                     }
                     gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
                     Base_tm *tm_ptr_hibernate;
@@ -592,11 +666,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;
+                        WRITE_TO_EEPROM(4,DEVICE_POWERED);
                     }
                     gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
                     Base_tm *tm_ptr_standby;
@@ -636,5 +711,6 @@
             print_exit(temp);
             return;
         }
+    }
     }    
 }
\ No newline at end of file
--- a/COM_MNG_TMTC.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/COM_MNG_TMTC.h	Sat Feb 24 10:28:56 2018 +0000
@@ -10,7 +10,6 @@
 //added RLY_TMTC function
 //added included related files
 
-//#include "Flash.h"
 
 //DigitalIn tm_status_4m_slv(PIN39); //I2C interrupt to CDMS from BAE
 //DigitalIn tm_status_4m_pl(PIN61); //I2C interrupt to CDMS from PL
@@ -18,7 +17,8 @@
 #define COM_MNG_TMTC_H
 
 #include "dmaSPIslave.h"
-
+//#include "FMS_all.h"//remove these
+//#include "Compression.h"//remove these
 #define RESET_CDMS NVIC_SystemReset()
 
 
@@ -446,6 +446,8 @@
                             FCTN_CDMS_RD_L_RAM(tm_ptr);
                             if(mid == 0x0001)
                             FCTN_CDMS_MAX_MIN(tm_ptr);
+                            if(mid == 0x0002)
+                            FCTN_SCP_CALIB_A(tm_ptr, mid);
                             
                             crc16 = crc16_gen(tm_ptr->TM_string,132);
                             tm_ptr->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
@@ -461,16 +463,16 @@
                             Base_tm *tm_ptr_short = new Short_tm;
                             if(mid == 0x0101 || mid==0x0102 || mid == 0x0103 || mid == 0x0100)                                  //allowable MID values?
                             {
-                                
-                                ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+                                //FCTN_CDMS_WR_S_FLASH(mid,(uint32_t)(tc_ptr->TC_string[5]<<24)+(uint32_t)(tc_ptr->TC_string[6]<<16)+(uint32_t)(tc_ptr->TC_string[7]<<8)+(uint32_t)(tc_ptr->TC_string[8]));                                                     
+                                ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));  
                                 return tm_ptr_short;
                             }                                                        
-
-                            //FCTN_CDMS_WR_S_FLASH(mid,(uint32_t)(tc_ptr->TC_string[5]<<24)+(uint32_t)(tc_ptr->TC_string[6]<<16)+(uint32_t)(tc_ptr->TC_string[7]<<8)+(uint32_t)(tc_ptr->TC_string[8]));                                                     
-
-                            ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));              
-
-                            return tm_ptr_short;
+                            else
+                            {
+                                ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }
+                            
                         }
                         case 0x6:   //service subtye = WR_L_FLASH
                         {
@@ -486,9 +488,7 @@
                                 for(uint8_t z=24;z<32;z++)
                                     flasharray_thres[z] = scp_threshold_m0[z+8];
                                 
-   //                            FCTN_CDMS_WR_S_FLASH(mid,flasharray_thres);
-                                erase_sector(strt_add_thres);
-                                program_flash(strt_add_thres, (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
      
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -501,9 +501,7 @@
                                 for(uint8_t z=0;z<12;z++)
                                     flasharray_thres[z] = scp_threshold_m0[z+40];
                                 
-  //                              FCTN_CDMS_WR_S_FLASH(mid,flasharray_thres);
-                                erase_sector(strt_add_thres+SECTOR_SIZE);
-                                program_flash(strt_add_thres+SECTOR_SIZE, (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
                                 
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -516,9 +514,7 @@
                                 for(uint8_t z=0;z<32;z++)
                                     flasharray_thres[z] = scp_threshold_m1[z];
                                 
-  //                              THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
-                                 erase_sector(strt_add_thres+(2*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(2*SECTOR_SIZE), (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
                                 
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -531,9 +527,7 @@
                                 for(uint8_t z=0;z<20;z++)
                                     flasharray_thres[z] = scp_threshold_m1[z+32];
                                 
- //                               THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
-                                erase_sector(strt_add_thres+(3*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(3*SECTOR_SIZE), (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
                                 
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -560,10 +554,7 @@
                                 flasharray_thres[10] = scp_sfp_threshold_m0_2[1];
                                 flasharray_thres[11] = scp_sfp_threshold_m0_2[2];
                                 
-  //                              THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
-    
-                                erase_sector(strt_add_thres+(4*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(4*SECTOR_SIZE), (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
                                 
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -580,10 +571,8 @@
                                 for(uint8_t z=24;z<32;z++)
                                     flasharray_thres[z] = sfp_threshold_m0[z+8];
                                 
-  //                              THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
-                                erase_sector(strt_add_thres+(5*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(5*SECTOR_SIZE), (char*)flasharray_thres,32);
-                                
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
+                             
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
@@ -595,9 +584,8 @@
                                 for(uint8_t z=0;z<12;z++)
                                     flasharray_thres[z] = sfp_threshold_m0[z+40];
                                 
- //                               THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
-                                        erase_sector(strt_add_thres+(6*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(6*SECTOR_SIZE), (char*)flasharray_thres,32);                             
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
+                           
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
@@ -609,10 +597,7 @@
                                 for(uint8_t z=0;z<32;z++)
                                     flasharray_thres[z] = sfp_threshold_m1[z];
                                 
- //                               THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
- 
-                                erase_sector(strt_add_thres+(7*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(7*SECTOR_SIZE), (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
                                 
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -625,9 +610,7 @@
                                 for(uint8_t z=0;z<20;z++)
                                     flasharray_thres[z] = sfp_threshold_m1[z+32];
                                 
-//                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
-                                erase_sector(strt_add_thres+(8*SECTOR_SIZE));
-                                program_flash(strt_add_thres+(8*SECTOR_SIZE), (char*)flasharray_thres,32);
+                                THRES_WRITE_TO_EEPROM(mid,flasharray_thres);
                                 
                                 Base_tm *tm_ptr_short = new Short_tm;
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
@@ -651,7 +634,7 @@
                         if(GETpid(tc_ptr)==0x01)
                         {
                             Base_tm *tm_ptr_short = new Short_tm;
-                            if(CDMS_STANDBY==1)
+                            if(EN_CDMS_HK == 0 && EN_PL == 0 && EN_RCV_SC == 0)
                             {   
                                 //gPC.printf("TC_PL_INIT\r\n");                         // call PWR_SWCH_ON function
                                 
@@ -660,7 +643,7 @@
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
                             }                
-                            else if(CDMS_STANDBY==0)
+                            else
                             {
                                 ACK_L234(tm_ptr_short,0x87,GETpacket_seq_count(tc_ptr));                        //TC cannot be processed now
                                 return tm_ptr_short;
@@ -669,16 +652,17 @@
                         else if(GETpid(tc_ptr)==0x02)
                         {
                             Base_tm *tm_ptr_short = new Short_tm;
-                            if(CDMS_STANDBY==1)
+                            if(EN_CDMS_HK == 0 && EN_PL == 0 && EN_RCV_SC == 0)
                             {   
                                 //gPC.printf("TC_PL_MAIN\r\n");                         // call PWR_SWCH_ON function
-                                
+                                EN_PL = 1;
                                 P_PL_MAIN();
-
+                                EN_PL = 0;
+                                
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
                             }                
-                            else if(CDMS_STANDBY==0)
+                            else 
                             {
                                 ACK_L234(tm_ptr_short,0x87,GETpacket_seq_count(tc_ptr));                        //TC cannot be processed now
                                 return tm_ptr_short;
@@ -687,7 +671,7 @@
                         else if(GETpid(tc_ptr)==0x03)
                         {                            
                             Base_tm *tm_ptr_short = new Short_tm;
-                            if(CDMS_STANDBY==1)
+                            if(EN_CDMS_HK == 0 && EN_PL == 0 && EN_RCV_SC == 0)
                             {   
                                 //gPC.printf("PL_COM_INIT\r\n");                        // call PWR_SWCH_ON function
                                 
@@ -696,7 +680,7 @@
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
                             }                
-                            else if(CDMS_STANDBY==0)
+                            else
                             {
                                 ACK_L234(tm_ptr_short,0x87,GETpacket_seq_count(tc_ptr));                        //TC cannot be processed now
                                 return tm_ptr_short;
@@ -705,34 +689,59 @@
                         else if(GETpid(tc_ptr)==0x04)
                         {                            
                             Base_tm *tm_ptr_short = new Short_tm;
-                            if(CDMS_STANDBY==1)
+                            if(EN_CDMS_HK == 0 && EN_PL == 0 && EN_RCV_SC == 0)
                             {   
                                 //gPC.printf("TC_P_CDMS_HK_MAIN\r\n"); // call PWR_SWCH_ON function
+                                EN_CDMS_HK = 1;
+                                hk_count = 0;
+                                gHK_THREAD->signal_set(HK_SIGNAL);
+                                wait(1);
+                                EN_CDMS_HK = 0;
                                 
-                                //gHK_THREAD->signal_set(HK_SIGNAL);
-
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
                             }                
-                            else if(CDMS_STANDBY==0)
+                            else
                             {
                                 ACK_L234(tm_ptr_short,0x87,GETpacket_seq_count(tc_ptr));                        //TC cannot be processed now
                                 return tm_ptr_short;
                             }
                         }
                         else if(GETpid(tc_ptr)==0x05)
-                        {                            
+                        {   gPC.printf("...............0x%02X",GETpid(tc_ptr));                         
                             Base_tm *tm_ptr_short = new Short_tm;
-                            if(CDMS_STANDBY==1)
+                            if(EN_CDMS_HK == 0 && EN_PL == 0 && EN_RCV_SC == 0)
                             {   
+                                PL_RCV_SC_STATUS = 1;
                                 //gPC.printf("TC_SW_ON_SD\r\n");                        // call PWR_SWCH_ON function
-                                
-                                P_PL_RCV_SC_DATA();
-
-                                ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
-                                return tm_ptr_short;
+                                if(PL_STATE != 0x03)
+                                {   
+                                    Base_tm *tm_ptr_science;
+                                    SET_PL_BEE_SCIENCE(tm_ptr_science);
+                                }
+                                if(PL_RCV_SC_STATUS == 1)
+                                {
+                                    EN_RCV_SC = 1;
+                                    P_PL_RCV_SC_DATA();
+                                    EN_RCV_SC = 0;
+                                    PL_STATE = 0x03;
+                                    ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
+                                    return tm_ptr_short;
+                                }
+                                else if(PL_RCV_SC_STATUS == 2)
+                                {
+                                    gPC.printf("Not in Sci Ack failure\r\n");
+                                    ACK_L234(tm_ptr_short,0x8B,GETpacket_seq_count(tc_ptr));
+                                    return tm_ptr_short;
+                                }
+                                else if(PL_RCV_SC_STATUS == 3)
+                                {
+                                    gPC.printf("Not in Sci CRC failure\r\n");
+                                    ACK_L234(tm_ptr_short,0x8C,GETpacket_seq_count(tc_ptr));
+                                    return tm_ptr_short;
+                                }
                             }                
-                            else if(CDMS_STANDBY==0)
+                            else
                             {
                                 ACK_L234(tm_ptr_short,0x87,GETpacket_seq_count(tc_ptr));                        //TC cannot be processed now
                                 return tm_ptr_short;
@@ -741,7 +750,7 @@
                         else if(GETpid(tc_ptr)==0x06)
                         {                            
                             Base_tm *tm_ptr_short = new Short_tm;
-                            if(CDMS_STANDBY==1)
+                            if(EN_CDMS_HK == 0 && EN_PL == 0 && EN_RCV_SC == 0)
                             {   
                                 //gPC.printf("TC_SW_ON_RTC\r\n"); // call PWR_SWCH_ON function
                                 gPC.printf("SD _INIT\r\n");
@@ -750,7 +759,7 @@
                                 ACK_L234(tm_ptr_short,0xA0,GETpacket_seq_count(tc_ptr));
                                 return tm_ptr_short;
                             }                
-                            else if(CDMS_STANDBY==0)
+                            else
                             {
                                 ACK_L234(tm_ptr_short,0x87,GETpacket_seq_count(tc_ptr));                        //TC cannot be processed now
                                 return tm_ptr_short;
@@ -927,9 +936,9 @@
                             
                             if(tc_ptr->TC_string[4] == 0x00 || tc_ptr->TC_string[4] == 0x01)
                             EN_PL = tc_ptr->TC_string[4];
-                            else if(tc_ptr->TC_string[5] == 0x00 || tc_ptr->TC_string[5] == 0x01)
+                            if(tc_ptr->TC_string[5] == 0x00 || tc_ptr->TC_string[5] == 0x01)        //was else if changed to if to match the flowcharts - J
                             EN_CDMS_HK = tc_ptr->TC_string[5];
-                            else if(tc_ptr->TC_string[6] == 0x00 || tc_ptr->TC_string[6] == 0x01)
+                            if(tc_ptr->TC_string[6] == 0x00 || tc_ptr->TC_string[6] == 0x01)
                             EN_RCV_SC = tc_ptr->TC_string[6];
                             
                             Base_tm *tm_ptr_short = new Short_tm;
@@ -949,19 +958,22 @@
                         {          
                             //gPC.printf("TC_CDMS_RD_RTC\r\n"); // call PWR_SWCH_ON function
                             
-                            uint32_t time_temp = FCTN_CDMS_RD_RTC();                        //RTC_RD_EROR has to incorporated
+                            uint64_t time_temp = FCTN_CDMS_RD_RTC();                        //RTC_RD_EROR has to incorporated
                             Base_tm *tm_ptr = new Long_tm;
                             tm_ptr->TM_string[0] = 0x78;     
                             tm_ptr->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
                             tm_ptr->TM_string[2] = 0xA0;
                             tm_ptr->TM_string[3] = 0x00;
-                            tm_ptr->TM_string[4] = (uint8_t)((time_temp & 0xFF000000)>>24);
-                            tm_ptr->TM_string[5] = (uint8_t)((time_temp & 0x00FF0000)>>16);
-                            tm_ptr->TM_string[6] = (uint8_t)((time_temp & 0x0000FF00)>>8);
-                            tm_ptr->TM_string[7] = (uint8_t)((time_temp & 0x000000FF));
-                            for(uint8_t i=0;i<124;i++)
+                            tm_ptr->TM_string[4] = (uint8_t)((time_temp & 0x600000000)>>33);
+                            tm_ptr->TM_string[5] = (uint8_t)((time_temp & 0x1E0000000)>>29);
+                            tm_ptr->TM_string[6] = (uint8_t)((time_temp & 0x01F000000)>>24);
+                            tm_ptr->TM_string[7] = (uint8_t)((time_temp & 0x000F80000)>>19);
+                            tm_ptr->TM_string[8] = (uint8_t)((time_temp & 0x00007E000)>>13);
+                            tm_ptr->TM_string[9] = (uint8_t)((time_temp & 0x000001F80)>>7);
+                            tm_ptr->TM_string[10] = (uint8_t)((time_temp & 0x00000007F));
+                            for(uint8_t i=0;i<121;i++)
                             {
-                                tm_ptr->TM_string[i+8] = 0x00;
+                                tm_ptr->TM_string[i+11] = 0x00;
                             }
                             crc16 = crc16_gen(tm_ptr->TM_string,132);
                             tm_ptr->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
@@ -1000,9 +1012,9 @@
                                 return tm_ptr;
                             }
                         }
-                        else if(GETpid(tc_ptr)==0xF1)
+                        else if(GETpid(tc_ptr)==0xF2)
                         {
-                            CDMS_CALIB_RTC((uint64_t)(tc_ptr->TC_string[4])<<32 + (uint64_t)(tc_ptr->TC_string[5])<<24 + (uint64_t)(tc_ptr->TC_string[5])<<16 + (uint64_t)(tc_ptr->TC_string[6])<<8  +(uint64_t)(tc_ptr->TC_string[7]));
+                            CDMS_CALIB_RTC(((uint32_t)(tc_ptr->TC_string[5])<<24) + ((uint32_t)(tc_ptr->TC_string[6])<<16) + ((uint32_t)(tc_ptr->TC_string[7])<<8) + ((uint32_t)(tc_ptr->TC_string[8])));
                             Base_tm *tm_ptr_short = new Short_tm;
                             ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
                             return tm_ptr_short;
@@ -1162,10 +1174,11 @@
                 TIME_LATEST_I2C_SPEED = FCTN_CDMS_RD_RTC() >> 7;
                 //wait(0.2);
                 int poll=0;
-                while(poll<2000 && PL_I2C_Intr==0)
+                //gPC.printf("\n\r%d",PL_I2C_Intr);
+                while(poll<12000 && PL_I2C_Intr==0)
                 {
-                 // gPC.printf("\n\rPL_I2C_Intr is low");
-                    wait_us(10);
+                    //gPC.printf("\n\rPL_I2C_Intr is low");
+                    wait_us(500);
                     poll+=1;
                 }    
             if(PL_I2C_Intr == 1)
@@ -1430,7 +1443,7 @@
         /*Enable threads*/\
         gPAY_SPI->bulkRead_resume(&payload_isr_fun);\
         HK_counter->start(10000);\
-        gSESSION_TIMEOUT.detach();\
+        /*.detach();*/\
     }\
 }
 
@@ -1612,8 +1625,12 @@
                             }\
                             /*SEND call sign, ACK_L1, NON OBSRS TM TO GS*/\
                             snd_tm.head_pointer(tm_ptr_head);\
+                            sent_tmfrom_SDcard = false;\
                             gPC.puts("enter_adf\r\n");\
+                            COM_RST.reset();\
+                            COM_RST.start();\
                             transmit_adf();\
+                            COM_RST.stop();\
                             gPC.puts("exit_adf\r\n");\
                             /*DELETE THE TM AFTER USE*/\
                             tm_ptr = tm_ptr_head;\
@@ -1637,7 +1654,10 @@
                             /*EXECUTION OF SD-CARD DATA SENDING (OBSRS)*/\
                             execute_OBSRS_TC(current_TC);\
                             gPC.puts("en_adf");\
+                            COM_RST.reset();\
+                            COM_RST.start();\
                             transmit_adf();\
+                            COM_RST.stop();\
                             gPC.puts("ex_adf");\
                         }\
                     }\
@@ -1683,13 +1703,14 @@
             gPC.printf("completed or session timed out: %x\r\n", gMASTER_STATE);\
         /*COMPLETED EXECUTION OF TC*/\
         gMASTER_STATE = TCL_STATE_COMPLETED;\
+        gPC.printf("\n flags2 = %u \n", gFLAGS);\
         COM_POWER_OFF_TX;\
         reset_all;\
         /*ENABLE THREADS*/\
         resume_pl_dma = 1;\
         /*gPAY_SPI->bulkRead_resume(&payload_isr_fun)*/;\
         HK_counter->start(10000);\
-        gSESSION_TIMEOUT.detach();\
+        /*.detach();*/\
         gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);\
         gFLAGS = gFLAGS & (~COM_SESSION_FLAG);\
     }\
--- a/COM_POWER_ON_TX.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/COM_POWER_ON_TX.h	Sat Feb 24 10:28:56 2018 +0000
@@ -116,10 +116,23 @@
     if( !(gFLAGS & COM_TX_FLAG) ){
         gFLAGS = gFLAGS | COM_TX_FLAG;
         //gPC.puts("Inside COM_TX_FLAG\r\n");
-        gFLAGS = gFLAGS | BAE_SW_EN_FLAG ;
+        if ((BAE_STATUS & 0x03) == 1)
+        {
+            gFLAGS = gFLAGS | BAE_SW_EN_FLAG ;
+        }
         if( gFLAGS & BAE_SW_EN_FLAG ){
             /*WARNING: INFINITE WHILE LOOP POSSIBLE: if standby ack received and bcn tx main status = 0*/
             bool retryFlag = true;
+            pdir_ss1=PTE->PDIR;
+            i2c_count_cdms_bae = 0;
+            gPC.printf("\npdir %d\n",pdir_ss1); 
+            while(((pdir_ss1 & 0x03000000)!=0x03000000)&& i2c_count_cdms_bae<30)   //SDA and SCL are high - bus idle
+            {
+                wait_us(10000);
+                pdir_ss1=PTE->PDIR;
+                i2c_count_cdms_bae++;
+                gPC.printf("waiting for i2c to clear\n"); 
+            }
             while( retryFlag == true ){
                 Base_tm *tm_ptr = NULL;
                 gPC.puts("setting Bcn off\r\n");
@@ -146,7 +159,7 @@
                 else{
                     gPC.puts("not A0\r\n");
                     SW_RST_BAE();
-                    wait_ms(100);
+                    wait_ms(2000);
                     Base_tm *tm_ptr2 = NULL;
                     gPC.puts("settin bcn off\r\n");
                     SET_BCN_STANDBY(tm_ptr2);
@@ -213,6 +226,7 @@
         }
         else{
             gPC.puts("RF_SW_CNTRL_TX\r\n");
+            gPC.printf("You so cool Man");
             RF_SW_CNTRL_TX = 1;
             Thread::wait(25);
             RF_SW_CNTRL_TX = 0;
@@ -253,8 +267,12 @@
         }
         get_tc_list(power_on_tm->next_TM, 0x00);
         /*Call Sign, ACK_L1, TC_LIST*/
-        /*snd_tm.head_pointer(power_on_tm_head);*/
-        /*transmit_adf();*/
+        sent_tmfrom_SDcard = false;
+        snd_tm.head_pointer(power_on_tm_head);
+        COM_RST.reset();//com thread saviour
+        COM_RST.start();
+        transmit_adf();
+        COM_RST.stop();
         uint8_t transmissionPass = 0xFF;
         /*PENDING: get acknowledgement of transmission*/
         /*deleting the telemetry*/
--- a/COM_RCV_TC.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/COM_RCV_TC.h	Sat Feb 24 10:28:56 2018 +0000
@@ -125,6 +125,10 @@
     //gPC.puts("received data : \n");
     
     while( data_node != NULL ){
+        if(COM_RST.read()>30){
+        gPC.printf("STUCK IN VALIDATION--DROPPING TC\R\N");
+        break;
+        }
         for(int iBuf = 0 ; iBuf < RX_BUFFER_LENGTH ; ++iBuf ){
             uint8_t test_this = data_node->values[iBuf];
             //gPC.printf("0x%02X ",test_this);
--- a/Compression.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/Compression.h	Sat Feb 24 10:28:56 2018 +0000
@@ -1891,7 +1891,7 @@
                 }
                 if(sd_stat)
                 {
-                    gPC.printf("\n\n\rsd write fail---------------------------------------");
+                    //gPC.printf("\n\n\rsd write fail---------------------------------------");
                 }
                 
              //  gPC.printf("timer end %d::",timer_test.read_ms());                                                    ///changed recently
--- a/DefinitionsAndGlobals.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/DefinitionsAndGlobals.h	Sat Feb 24 10:28:56 2018 +0000
@@ -2,6 +2,7 @@
 // **************DEFINITIONS*********************
 
 #define dma 1
+Timer COM_RST;//to resume other threads if COM gets stuck
 
 // COM_RX
     #define RX_TIMEOUT_LIMIT 0.5
@@ -17,8 +18,8 @@
     #define SPI_CLK PTE2
     #define SPI_CS_ADF PTA15
     #define SPI_CS_SDC PIN20
-  //   #define SPI_CS_RTC PIN26 // actual
-     #define SPI_CS_RTC PIN60 // sbc with jumper v1.0
+    #define SPI_CS_RTC PIN26 // actual
+    //#define SPI_CS_RTC PIN60 // sbc with jumper v1.0
     
 // COM_TX
     #define COM_TX_CONFIG_LIMIT 3
@@ -39,13 +40,15 @@
     #define SBC 1
     
   //  #if SBC
-    DigitalOut CDMS_I2C_GPIO(PIN67,1);
-    DigitalIn BAE_I2C_GPIO(PIN1);
+  //  DigitalOut CDMS_I2C_GPIO(PIN67,1);
+  //  DigitalIn BAE_I2C_GPIO(PIN1);
+     uint32_t pdir_ss1;
+     uint8_t i2c_count_cdms_bae;
   //  #endif
     
   //  #if !SBC
-  //  DigitalIn BAE_I2C_GPIO(PIN67);
-  //  DigitalOut CDMS_I2C_GPIO(PIN39,0);    
+    DigitalIn BAE_I2C_GPIO(PIN67);
+    DigitalOut CDMS_I2C_GPIO(PIN39,0);    
 // #endif
 
 // TC LIST
@@ -55,22 +58,22 @@
     #define TCL_STATE_COMPLETED 0x03
 
 // LIST OF FLAGS
-    #define UART_INT_FLAG 0x0001
+    #define UART_INT_FLAG 0x0001//
     #define NEW_TC_RECEIVED 0x0002
-    #define COM_SESSION_FLAG 0x0004
+    #define COM_SESSION_FLAG 0x0004//
     #define COM_RX_FLAG 0x0008
     #define COM_MNG_TMTC_RUNNING_FLAG 0x0010
-    #define COM_SESSION_VALIDITY 0x0020
+    #define COM_SESSION_VALIDITY 0x0020//
     #define ALL_CRC_PASS_FLAG 0x0040
     #define COM_PA_HOT_FLAG 0x0080
     #define COM_PA_OC_FLAG 0x8000
     #define COM_TX_FLAG 0x0100
     #define COM_SESSION_TIMEOUT_FLAG 0x0200
     #define COM_AUTO_POWER_OFF_BAE_FLAG 0x0400
-    #define BAE_SW_EN_FLAG 0x0800
+    #define BAE_SW_EN_FLAG 0x0800//
     #define RF_SW_STATUS_FLAG 0x1000
     #define COM_INIT_STATUS_FLAG 0x2000
-    #define COM_TX_STATUS_FLAG 0x4000
+    #define COM_TX_STATUS_FLAG 0x4000//
 
 //RF relay STATUS
     #define RF_COM_TX 0
@@ -142,6 +145,7 @@
     #define PAY_SPI_CLK PTE17
     #define PAY_SPI_CS PTE16
     #define SCIENCE_SIGNAL 0x04
+    #define RCVED_SCI_DATA_SIGNAL 0x06 //FOR P_PL_RCV_SC_DATA
 
 //BEACON
     #define BCN_APID_SOURCE 0x41
@@ -155,10 +159,10 @@
     #define BAE_RESET_PID 0x33
 
 //RF RELAY
-  //  #define RF_RELAY_CNTRL_TX PTA12
-  //  #define RF_RELAY_CNTRL_BCN PTA7 
-  #define RF_RELAY_CNTRL_TX PTB7
-    #define RF_RELAY_CNTRL_BCN PTB17 
+    #define RF_RELAY_CNTRL_TX PTA12
+    #define RF_RELAY_CNTRL_BCN PTA7 
+  //#define RF_RELAY_CNTRL_TX PTB7
+    //#define RF_RELAY_CNTRL_BCN PTB17 
     
 //CDMS HK
 #define HK_SIGNAL 0x05
@@ -210,7 +214,7 @@
 
 //COM_RX
 DigitalOut COM_RX_CNTRL(PIN55,1);//changed!! earlier version had PIN72
-DigitalOut COM_TX_CNTRL(PIN56,1);
+DigitalOut COM_TX_CNTRL(PIN56,0);
 //DigitalIn COM_TX_OC_FAULT(PIN69);
 DigitalIn COM_TX_OC_FAULT(PIN58);
 
@@ -253,10 +257,10 @@
 RtosTimer *HK_counter;
 
 // CDMS HK
-uint8_t CDMS_STANDBY;
 uint8_t CDMS_HEALTH_DATA[128];
 uint8_t CDMS_RAM[59] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 uint16_t GPIO_STATUS;
+uint16_t GPIO_FAULTS;
 uint8_t CDMS_HK_MAIN_STATUS;    
 uint8_t COMRX_STATUS;
 uint8_t RTC_FAULTCOUNT = 0;
@@ -293,7 +297,7 @@
 //DigitalIn COMTX_OC_FAULT (PIN69);
 DigitalIn BAE_OC_FAULT (PIN92);
 DigitalOut PL_GPIO_1_STATUS (PIN71); // PYLD EPS CNTRL Signal1 / PYLD_EPS_CNTRL_SIG1
-DigitalOut PL_GPIO_2_STATUS (PIN81);//PYLD EPS CNTRL 2 / PYLD_EPS_CNTRL_2
+DigitalOut PL_GPIO_2_STATUS (PIN81,0);//PYLD EPS CNTRL 2 / PYLD_EPS_CNTRL_2
 DigitalOut PL_GPIO_3_STATUS (PIN80,1);// PYLD EPS CNTRL 3 / PYLD_EPS_CNTRL_3
 DigitalIn PL_BEE_SW_OC_FAULT (PIN91);
 DigitalIn PL_EPS_LATCH_SW_OC_FAULT (PIN5);
@@ -345,12 +349,17 @@
 //Counter's
 uint16_t CDMS_I2C_ERR_SPEED_COUNTER = 0;
 uint16_t CDMS_I2C_ERR_BAE_COUNTER = 0;
+uint16_t CDMS_I2C_ERR_BAE_CURRENT = 0;
+uint8_t KILL_BAE_COUNTER = 0;
+uint8_t GIVE_UP_ON_BAE = 0;
 uint16_t CDMS_HK_MAIN_COUNTER = 0;
+uint16_t CDMS_I2C_ERR_HK_LATEST = 0;
 uint16_t COMRX_RESET_COUNTER = 0;
 uint16_t PL_MAIN_COUNTER = 0;
 uint16_t PL_RCV_SC_DATA_COUNTER = 0;
 uint16_t CDMS_WR_SD_FAULT_COUNTER = 0;
 uint16_t SD_LIB_WRITES = 0;
+uint8_t hk_count=0;
 
 //CDMS RAM parameters
 uint8_t PL_INIT_STATUS = 0;
@@ -378,9 +387,9 @@
 uint8_t EPS_V_A_EN_STATUS;
 //uint8_t BAE_SW_STATUS;
 //uint8_t CDMS_SD_SW_STATUS;
-//uint8_t PL_BEE_SW_STATUS;*
+uint8_t PL_BEE_SW_STATUS;
 uint8_t PL_EPS_LATCH_SW_EN;
-uint8_t RTC_INIT_STATUS;
+uint8_t RTC_INIT_STATUS; //added on 27-5-2017 - Joel
 uint8_t CDMS_RTC_DISABLE;
 uint16_t CDMS_RESET_COUNTER;
 uint32_t TIME_LATEST_CDSMS_RESET;
@@ -390,9 +399,11 @@
 uint8_t COM_PA_TMP_HIGH;
 uint8_t COM_PA_TMP_IN_TX;
 uint8_t COM_PA_RECOVERY_TIMEOUT;
-uint8_t COM_SESSION_TIMEOUT = 300;  //confirm with Anirudh 
+uint8_t COM_SESSION_TIMEOUT;  //confirm with Anirudh 
 uint8_t COM_RSSI_MIN;
-uint16_t SD_LIB_BLK_CURRENT;
+//uint16_t SD_LIB_BLK_CURRENT_1;
+//uint16_t SD_LIB_BLK_CURRENT_2;
+uint32_t SD_LIB_BLK_CURRENT;
 
 // Ambigouties
 uint8_t EN_RTC = 0x01;
@@ -402,4 +413,6 @@
 uint8_t COM_OC_SET = 0;
 uint8_t COM_RSSI_SET = 0;
 uint8_t resume_pl_dma = 0;
-
+bool PL_SC_TEST = false;    //P_PL_RCV_SC_DATA used as a flag for signal
+uint8_t PL_RCV_SC_STATUS;
+uint8_t TEST = 0;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EEPROM.h	Sat Feb 24 10:28:56 2018 +0000
@@ -0,0 +1,79 @@
+#ifndef EEPROM_H
+#define EEPROM_H
+
+#define ee_scl PIN86
+#define ee_sda PIN87
+#define check 10
+
+EEPROM e2prom(ee_sda, ee_scl, 0, EEPROM::T24C512);
+int32_t INITIAL_EEPROM[32] = {1,1,1,1,1,0,0,0,0,35001,0xff,300,85,20,20,3,80000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+uint32_t flasharray_thres[32];
+
+void WRITE_TO_EEPROM(uint32_t address, int32_t data_block)
+{
+    e2prom.write(address*4+10,data_block);
+}
+
+void THRES_WRITE_TO_EEPROM(uint16_t mid, uint32_t* thres_data)
+{
+    int8_t data[128];
+    memcpy(data,&thres_data,128);
+    
+    if(mid <11 & mid >1)
+    {
+        e2prom.write((uint32_t)(mid-1)*128,data,128);
+    }    
+}
+
+void THRES_READ_FROM_EEPROM(uint16_t mid, uint32_t* thres_data)
+{
+    int8_t data[128];
+    if(mid <11 & mid >1)
+    {
+        e2prom.read((uint32_t)(mid-1)*128,data,128);
+        memcpy(&thres_data,data,128);
+    }    
+}
+
+uint32_t READ_FROM_EERPOM(uint32_t address)
+{
+    int32_t data;
+    e2prom.read(address*4+10, data);
+    return (uint32_t)data;
+}
+
+void INIT_EEPROM()
+{
+    int32_t test_buffer;
+    e2prom.ready();
+    e2prom.read(2,test_buffer);
+    if(test_buffer == 0)
+    {
+        for(int i=0;i<32;i++)
+            WRITE_TO_EEPROM( i, INITIAL_EEPROM[i]);
+        
+        e2prom.write(2,1);
+        gPC.printf("starting flash");
+    }
+    
+    gPC.printf("I happen only once right??\n");
+    EPS_V_A_EN_STATUS         = READ_FROM_EERPOM(0);
+    BAE_STATUS                = READ_FROM_EERPOM(1);
+    SD_STATUS                 = READ_FROM_EERPOM(2);
+    PL_STATUS                 = READ_FROM_EERPOM(3);
+    PL_BEE_SW_STATUS          = READ_FROM_EERPOM(4);
+    RTC_INIT_STATUS           = READ_FROM_EERPOM(5);
+    CDMS_RTC_DISABLE          = READ_FROM_EERPOM(6);
+    CDMS_RESET_COUNTER        = READ_FROM_EERPOM(7);
+    TIME_LATEST_CDSMS_RESET   = READ_FROM_EERPOM(8);
+    COM_TC_BYTES_LIMIT        = READ_FROM_EERPOM(9);
+    COM_RX_CURRENT_MAX        = READ_FROM_EERPOM(10);
+    COM_RX_DISABLE_TIMEOUT    = READ_FROM_EERPOM(11);
+    COM_PA_TMP_HIGH           = READ_FROM_EERPOM(12);
+    COM_PA_RECOVERY_TIMEOUT   = READ_FROM_EERPOM(13);
+    COM_SESSION_TIMEOUT       = READ_FROM_EERPOM(14);
+    COM_RSSI_MIN              = READ_FROM_EERPOM(15);
+    SD_LIB_BLK_CURRENT        = READ_FROM_EERPOM(16);
+}
+
+#endif
\ No newline at end of file
--- a/FMS_all.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/FMS_all.h	Sat Feb 24 10:28:56 2018 +0000
@@ -1,16 +1,20 @@
 #ifndef FMS_ALL_INCLUDED
 #define FMS_ALL_INCLUDED
-
+//#include "ThreadsAndFunctions.h"
 // Includes MMS RAM functions also
 
 /*===================================================FMS Functions=================================================*/
-
-
+//==========for P_PL_RCV_SC_DATA==========// 
+dmaSPISlave *gPAY_SPI;
+void payload_isr_fun(){
+    gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL);
+  
+}
+//=========================================//
 //Run processes
 void P_PL_INIT();
 void P_PL_MAIN();
 void P_COM_INIT();
-void P_CDMS_HK_MAIN();
 void P_PL_RCV_SC_DATA();
 void P_CDMS_INIT_SD();
 
@@ -51,7 +55,8 @@
 
 void P_PL_INIT()
 {
-    
+    gPC.printf("No such TC, here have some motivation instead\r\n");
+    gPC.printf("This satellite will work , you just have to believe\r\n");
 }
 
 void P_PL_MAIN()
@@ -64,14 +69,19 @@
     P_COM_INIT;
 }
 
-void P_CDMS_HK_MAIN()
-{
-    FCTN_CDMS_HK_MAIN((void *)NULL);
-}
+void P_PL_RCV_SC_DATA()
+{   gPC.printf("\r\nFM TC....Testing Payload science mode\r\n");
+    PL_SC_TEST = true;
+    PL_GPIO_2_STATUS=0;
+    gPAY_SPI->bulkRead_resume(&payload_isr_fun);//runs science thread while com is waiting
+    gMutex.unlock();
+    //gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL);
+    Thread::signal_wait( RCVED_SCI_DATA_SIGNAL );
+    //gPC.printf("\r\nit works!!!\r\n");
+    PL_GPIO_2_STATUS = 1;
+    gPAY_SPI->bulkRead_pause();
 
-void P_PL_RCV_SC_DATA()
-{
-    
+    gMutex.lock();
 }
 
 void P_CDMS_INIT_SD()
@@ -81,22 +91,21 @@
 
 void CDMS_SD_SW_ON()
 {
-    SD_CARD_fromuC_ENA3 = 1; 
-    SD_CARD_fromISO_ENA4 = 1;
+   // SD_CARD_fromuC_ENA3 = 1; 
+ //   SD_CARD_fromISO_ENA4 = 1;
     SD_SW_EN_DS = 1;
     SD_STATUS = DEVICE_POWERED;
-    FCTN_CDMS_WR_FLASH(2,DEVICE_POWERED);
+    WRITE_TO_EEPROM(2,DEVICE_POWERED);
     gPC.printf("sw on sd\n");
 }
 
 void CDMS_SD_SW_OFF()
 {
-    SD_CARD_fromuC_ENA3 = 0; 
-    SD_CARD_fromISO_ENA4 = 0;
+ //   SD_CARD_fromuC_ENA3 = 0; 
+ //   SD_CARD_fromISO_ENA4 = 0;
     SD_SW_EN_DS = 0;
-   // SD_STATUS = DEVICE_DISABLED;
-   SD_STATUS = 0;
-   FCTN_CDMS_WR_FLASH(2,DEVICE_DISABLED);
+    SD_STATUS = DEVICE_DISABLED;
+    WRITE_TO_EEPROM(2,DEVICE_DISABLED);
     gPC.printf("sw off sd\n");
 }
 
@@ -106,16 +115,22 @@
     SPI_mutex.lock();
     gCS_RTC=1;
     gCS_RTC=0;
-    spi.write(0x81); //register address with write flag
-    spi.write(0x00);//disabling stop bit in the seconds register
-   gCS_RTC=1;
-   gCS_RTC=0;
+    spi.write(0x01); //reading seconds register
+    uint8_t response =spi.write(0x01);
+    response = response & 0x7F;
+    gCS_RTC=1;
+    gCS_RTC=0;
     spi.write(0x8C); //register address with write flag
     spi.write(0x00);//enabling halt bit in the seconds register
     gCS_RTC=1;
-     EN_RTC = 0x01;
+    gCS_RTC=0;
+    spi.write(0x81); //register address with write flag
+    spi.write(response);//disabling stop bit in the seconds register
+    gCS_RTC=1;
+
+     //EN_RTC = 0x01;
     CDMS_RTC_DISABLE =1;
-    FCTN_CDMS_WR_FLASH(6,DEVICE_POWERED);
+    WRITE_TO_EEPROM(6,DEVICE_POWERED);
   //  gPC.printf("0x%08X \n", READ_FROM_EERPOM(6));
     SPI_mutex.unlock();
     gPC.printf("sw on rtc\n");
@@ -126,17 +141,22 @@
     SPI_mutex.lock();
     gCS_RTC=1;
     gCS_RTC=0;
+    spi.write(0x01); //reading seconds register
+    uint8_t response =spi.write(0x01);
+    response = response + 0x80;
+    gCS_RTC=1;
+    gCS_RTC=0;
     spi.write(0x81); //register address with write flag
-    spi.write(0x80);//enabling stop bit in the seconds register
+    spi.write(response);//enabling stop bit in the seconds register + also preserving the second bits in the register
     gCS_RTC=1;
     gCS_RTC=0;
     spi.write(0x8C); //register address with write flag
     spi.write(0x40);//enabling halt bit in the seconds register
     gCS_RTC=1;
    
-   EN_RTC  = 0x00;
-   CDMS_RTC_DISABLE = 0;
-    FCTN_CDMS_WR_FLASH(6,0x00);
+   //EN_RTC  = 0x00;
+    CDMS_RTC_DISABLE = 0;
+    WRITE_TO_EEPROM(6,0x00);
     SPI_mutex.unlock();
     gPC.printf("sw off rtc\n");
 }
@@ -145,16 +165,15 @@
 {
     BAE_SW_EN_DS = 1;
     BAE_STATUS = DEVICE_POWERED;
-    FCTN_CDMS_WR_FLASH(1,DEVICE_POWERED);
+    WRITE_TO_EEPROM(1,DEVICE_POWERED);
     gPC.printf("sw on bae\n");
 }
 
 void SW_OFF_BAE()
 {
     BAE_SW_EN_DS = 0;
- //   BAE_STATUS = DEVICE_DISABLED;
-     BAE_STATUS = 0;
-     FCTN_CDMS_WR_FLASH(1,DEVICE_DISABLED);
+    BAE_STATUS = DEVICE_DISABLED;
+    WRITE_TO_EEPROM(1,DEVICE_DISABLED);
     gPC.printf("sw off bae\n");
 }
 
@@ -167,8 +186,8 @@
     wait_us(1);
     PYLD_DFF_CLK = 0;
     wait_us(1);
-    PL_STATUS = DEVICE_POWERED;
-    FCTN_CDMS_WR_FLASH(3,DEVICE_POWERED);
+    PL_BEE_SW_STATUS = DEVICE_POWERED;
+    WRITE_TO_EEPROM(4,DEVICE_POWERED);
 }
 
 void SW_OFF_PL_BEE()
@@ -180,9 +199,8 @@
     wait_us(1);
     PYLD_DFF_CLK = 0;
     wait_us(1);
- //   PL_STATUS = DEVICE_DISABLED;
-    PL_STATUS = 0;
-   FCTN_CDMS_WR_FLASH(3,DEVICE_DISABLED);
+    PL_BEE_SW_STATUS = DEVICE_DISABLED;
+    WRITE_TO_EEPROM(4,DEVICE_DISABLED);
 }
 
 void SW_ON_PL_EPS()
@@ -195,8 +213,6 @@
     PYLD_EPS_DFF_PWR_CLK = 0;
     wait_us(1);
     PL_EPS_LATCH_SW_EN = 1;
-    
-    FCTN_CDMS_WR_FLASH(4,1);
 }
 
 void SW_OFF_PL_EPS()
@@ -209,22 +225,21 @@
     PYLD_EPS_DFF_PWR_CLK = 0;
     wait_us(1);
     PL_EPS_LATCH_SW_EN = 0;
-    
-    FCTN_CDMS_WR_FLASH(4,0);
 }
 
 void SW_ON_V_A_EN()
 {
     V_A_EN = 1;
     EPS_V_A_EN_STATUS = 1;
-   FCTN_CDMS_WR_FLASH(0,1);
+    WRITE_TO_EEPROM(0,1);
+   
 }
 
 void SW_OFF_V_A_EN()
 {
     V_A_EN = 0;
     EPS_V_A_EN_STATUS = 0;
-   FCTN_CDMS_WR_FLASH(0,0);
+    WRITE_TO_EEPROM(0,0);
 }
 
 void RST_SD()
@@ -237,7 +252,7 @@
     SD_CARD_fromISO_ENA4 = 1;
     SD_SW_EN_DS = 1;
     SD_STATUS = DEVICE_POWERED;
-    FCTN_CDMS_WR_FLASH(2,DEVICE_POWERED);
+    WRITE_TO_EEPROM(2,DEVICE_POWERED);
     gPC.printf("rst sd\n");
 }
 
@@ -248,17 +263,15 @@
    BAE_SW_EN_DS = 1;
    
     BAE_STATUS = DEVICE_POWERED;
-    FCTN_CDMS_WR_FLASH(1,DEVICE_POWERED);
+    WRITE_TO_EEPROM(1,DEVICE_POWERED);
     gPC.printf("rst bae\n");
 }
 
 void SW_RST_PL_BEE()
 {
-    PYLD_DFF = 0;
+    SW_OFF_PL_BEE();
     wait_ms(10);
-    PYLD_DFF = 1;
-    PL_STATUS = DEVICE_POWERED;
-    FCTN_CDMS_WR_FLASH(3,DEVICE_POWERED);
+    SW_ON_PL_BEE();
 }
 
 void RST_BAE()
@@ -302,6 +315,10 @@
 void RST_HK_COUNTER()
 {
     firstCount = true;
+    CDMS_HK_MAIN_COUNTER = 0;
+    PL_MAIN_COUNTER = 0;
+    PL_RCV_SC_DATA_COUNTER = 0;
+    COMRX_RESET_COUNTER = 0;
 }
 
 int8_t CDMS_RD_SD_HK(uint8_t *sd_statusbits)
@@ -319,36 +336,50 @@
     return p;
 }
 
-void CDMS_CALIB_RTC(uint64_t time)
+void CDMS_CALIB_RTC(uint32_t time)
 {
+    gPC.printf("\n\r Hello : %u",time);
     SPI_mutex.lock();
     gCS_RTC=1;
     spi.format(8,0);
     spi.frequency(1000000);
  
+    gPC.printf("\n\rseconds: %u",((((((uint8_t)(time) & 0x3F)/10)<<4)+(((uint8_t)(time) & 0x3F)%10)) & 0x7F));
+    gCS_RTC=0;
+    spi.write(0x81);
+    spi.write((((((uint8_t)(time) & 0x3F)/10)<<4)+(((uint8_t)(time) & 0x3F)%10)) & 0x7F);//set seconds plus stop bit = 0
+    gCS_RTC=1;
+     
+    gPC.printf("\n\rminutes: %u",(((((uint8_t)(time>>6) & 0x3F)/10)<<4)+(((uint8_t)(time>>6) & 0x3F)%10)));
     gCS_RTC=0;
     spi.write(0x82);
-    spi.write((uint8_t)time);//set minutes
+    spi.write(((((uint8_t)(time>>6) & 0x3F)/10)<<4)+(((uint8_t)(time>>6) & 0x3F)%10));//set minutes
     gCS_RTC=1;
  
+    gPC.printf("\n\rhours: %u",(((((uint8_t)(time>>12) & 0x1F)/10)<<4)+(((uint8_t)(time>>12) & 0x1F)%10)));
     gCS_RTC=0;
     spi.write(0x83); 
-    spi.write((uint8_t)(time>>8) & 0x3F); //set hours
+    spi.write(((((uint8_t)(time>>12) & 0x1F)/10)<<4)+(((uint8_t)(time>>12) & 0x1F)%10)); //set hours
     gCS_RTC=1;
     
+    gPC.printf("\n\rdate : %u",(((((uint8_t)(time>>17) & 0x1F)/10)<<4)+(((uint8_t)(time>>17) & 0x1F)%10)));
     gCS_RTC=0;
     spi.write(0x85); 
-    spi.write((uint8_t)(time>>16) & 0x3F); //set date
+    spi.write(((((uint8_t)(time>>17) & 0x1F)/10)<<4)+(((uint8_t)(time>>17) & 0x1F)%10)); //set date
     gCS_RTC=1;
     
+    gPC.printf("\n\rmonth : %u",(((((uint8_t)(time>>22) & 0x0F)/10)<<4)+(((uint8_t)(time>>22) & 0x0F)%10)));
     gCS_RTC=0;
     spi.write(0x86); 
-    spi.write((uint8_t)(time>>24) & 0x1F); //set month
+    spi.write(((((uint8_t)(time>>22) & 0x0F)/10)<<4)+(((uint8_t)(time>>22) & 0x0F)%10)); //set month
     gCS_RTC=1;
     
+    uint8_t temp = ((((uint8_t)(time>>26) & 0xFF)/10)<<4)+(((uint8_t)(time>>26) & 0xFF)%10);
+    gPC.printf("\n\rtemp : %u",((((uint8_t)(time>>26) & 0xFF)/10)<<4)+(((uint8_t)(time>>26) & 0xFF)%10));
+    uint8_t year = (temp == 0x00)?0x16:(temp == 0x01)?0x17:(temp == 0x02)?0x18:(temp == 0x03)?0x019:0x16;
     gCS_RTC=0;
     spi.write(0x87); 
-    spi.write((uint8_t)(time>>32)); //set year to 00(2000)
+    spi.write(year); //set year
     gCS_RTC=1;
     gPC.puts("\n\r rtc initalised \n");
     SPI_mutex.unlock();
@@ -383,6 +414,8 @@
     
 }
 
+void FCTN_CDMS_MAX_MIN(Base_tm *);                      //idk Joel
+
 void FCTN_CDMS_MAX_MIN(Base_tm *tm_pointer)
 { 
     tm_pointer->TM_string[4] = MAX_COM_ADF_TMP+40;
@@ -403,12 +436,26 @@
         tm_pointer->TM_string[i+26] = (uint8_t)(min_max_data.temp_min[i]);
     }
 
-    tm_pointer->TM_string[42] = GPIO_STATUS>>8;
-    tm_pointer->TM_string[43] = (GPIO_STATUS<<3) & 0x00FF;
+    tm_pointer->TM_string[42] = GPIO_FAULTS>>8;
+    tm_pointer->TM_string[43] = (GPIO_FAULTS<<3) & 0x00FF;
     
     TIME_LATEST_RTC= FCTN_CDMS_RD_RTC() >> 7;
     for(int i = 0; i<4; i++)
         tm_pointer->TM_string[44+i] = TIME_LATEST_RTC >> (3-i)*8; 
 }
 
+void FCTN_SCP_CALIB_A(Base_tm *, uint16_t);
+
+void FCTN_SCP_CALIB_A(Base_tm *tm_pointer, uint16_t mid)
+{
+    uint32_t temp_e2prom[32] = {0};
+//    THRES_READ_FROM_EEPROM(mid, temp_e2prom);
+    for(uint8_t i = 0; i < 32; i++)
+    {
+        tm_pointer->TM_string[(4*i)+4] = (temp_e2prom[i]>>24);
+        tm_pointer->TM_string[(4*i)+5] = (temp_e2prom[i]>>16);
+        tm_pointer->TM_string[(4*i)+6] = (temp_e2prom[i]>>8);
+        tm_pointer->TM_string[(4*i)+7] = temp_e2prom[i];
+    }
+}
 #endif
\ No newline at end of file
--- a/Flash.h	Tue Mar 28 08:50:07 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-#include "FreescaleIAP.h"
-
-int strt_add_thres = flash_size() - (11*SECTOR_SIZE);
-uint32_t flasharray_thres[32] = {0};
-
-void FCTN_CDMS_WR_FLASH(uint16_t , uint32_t);
-int strt_add = flash_size() - (2*SECTOR_SIZE);
-uint32_t flasharray[32];    //256+(3*1024)
-uint32_t INITIAL_FLASH[32];
-
-/*corrected*/
-int *nativeflash = (int*)strt_add;
-
-void FLASH_INI()
-{
-    INITIAL_FLASH[16] = 80000;
-    uint32_t read[32]; 
-    for(int i=0;i<32;i++)
-    {  
-        read[i] = nativeflash[i];
-    }
-            
-    if(read[0] == -1)
-    {
-        for(int j=0;j<32;j++)
-        {   
-            FCTN_CDMS_WR_FLASH(j,INITIAL_FLASH[j]); 
-        } 
-    }
-    else
-    {
-        for(int j=0;j<32;j++)
-        {   
-            read[j] = nativeflash[j];
-        }
-    }
-    EPS_V_A_EN_STATUS = read[0];
-    BAE_STATUS = read[1]; 
-    SD_STATUS = read[2];
-    PL_STATUS = read[3];
-    PL_EPS_LATCH_SW_EN = read[4];
-    RTC_INIT_STATUS = read[5];
-    CDMS_RTC_DISABLE = read[6];
-    CDMS_RESET_COUNTER = read[7];
-    TIME_LATEST_CDSMS_RESET = read[8];
-    COM_TC_BYTES_LIMIT = read[9];
-    COM_RX_CURRENT_MAX = read[10];
-    COM_RX_DISABLE_TIMEOUT = read[11];
-    COM_PA_TMP_HIGH = read[12];
-    COM_PA_RECOVERY_TIMEOUT = read[13];
-    COM_SESSION_TIMEOUT = read[14];
-    COM_RSSI_MIN = read[15];
-    SD_LIB_BLK_CURRENT = read[16];
-    CDMS_RESET_COUNTER = read[17];
-}
-
-/*Writing to the Flash*/
-void FCTN_CDMS_WR_FLASH(uint16_t j,uint32_t datablock)  //j-position to write address  ; fdata - flash data to be written
-{
-    for(int i=0;i<17;i++)
-    {
-        flasharray[i]=nativeflash[i];
-    }
-    flasharray[j]=datablock;
-    erase_sector(strt_add);
-    program_flash(strt_add, (char*)flasharray,32);
-}
-/*End*/
-
-/*===================================================MMS Functions=================================================*/
-
-void FCTN_CDMS_WR_S_FLASH(uint16_t mid,uint32_t datablock);
-
-void FCTN_CDMS_WR_S_FLASH(uint16_t mid,uint32_t datablock)
-{
-    if(mid == 0x0100)
-    {
-        FCTN_CDMS_WR_FLASH(11,(datablock>>16) & 0x000000FF);
-        FCTN_CDMS_WR_FLASH(13,(datablock>>8) & 0x000000FF);
-        FCTN_CDMS_WR_FLASH(14,datablock & 0x000000FF);
-    }
-    else if(mid == 0x0101)
-    {
-        FCTN_CDMS_WR_FLASH(12,(datablock>>16) & 0x000000FF);
-        FCTN_CDMS_WR_FLASH(10,(datablock>>8) & 0x000000FF);
-        FCTN_CDMS_WR_FLASH(15,datablock & 0x000000FF);
-    }
-    else if(mid == 0x0102)
-    {
-        FCTN_CDMS_WR_FLASH(9,datablock & 0x0000FFFF);
-    }
-    else if(mid == 0x0103)
-    {
-        FCTN_CDMS_WR_FLASH(6,datablock & 0x00000001);
-    } 
-}
-
-int verify_flash_sector(int mid,uint32_t* flasharray_thres)
-{
-    int add = strt_add_thres + ((mid-1)*SECTOR_SIZE);
-    int result = 0;
-    int* testflash = (int*)add;
-    for(int i=0;i<32;i++)
-    {  
-        if(testflash[i] == flasharray_thres[i])
-            continue;
-        else
-        {
-            return 1;
-        }
-    }
-    return 0;
-}
\ No newline at end of file
--- a/OBSRS.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/OBSRS.h	Sat Feb 24 10:28:56 2018 +0000
@@ -117,9 +117,35 @@
 }
 
 #define check_PA_temp {\
-/* pending temperature check function*/\
 /*   return 0 or 1*/\
-    PA_HOT=0;\
+uint8_t pa_temp = 0;\
+    float pa_temp1 = 0;\
+    SelectLinec0=0;\
+    SelectLinec1=0;\
+    SelectLinec2=0;\
+    SelectLinec3=1;\
+    wait_ms(0.1);\
+    pa_temp1 = TempInput.read();\
+    pa_temp1 = pa_temp1 * 3.3;\
+    float resistance;\
+    resistance = 24000 * pa_temp1/(3.3 - pa_temp1);\
+    if(pa_temp1 > 1.47) {\
+        pa_temp1 = (3694/log(24.032242*resistance))-273;\
+    }\
+    else{\
+        pa_temp1 = (3365.4/log(7.60573*resistance))-273;\
+    }\
+    /*gPC.printf("\n%f\n",pa_temp1);*/\
+    COM_PA_IC_TMP = quantiz(tstart_thermistor,tstep_thermistor,pa_temp1);\
+    COM_PA_TMP_IN_TX = COM_PA_IC_TMP;\
+    if (COM_PA_IC_TMP > COM_PA_TMP_HIGH){\
+        PA_HOT = 1;\
+        /*gPC.puts("PA is measured HOT\r\n");*/\
+    }\
+    else{\
+        PA_HOT = 0;\
+        /*gPC.puts("PA is measured not HOT\r\n");*/\
+    }\
 }
 
 
@@ -358,6 +384,7 @@
 void send_tm_from_SD_card_fun(unsigned char * buffer_112,bool & last_buffer){
 /*    gPC.printf("\n\rsend tm sd called\r\n");*/
     for(counter_buffer_112=0;counter_buffer_112<112;counter_buffer_112++){
+        //gPC.printf("%d\r\n",counter_buffer_112);
         if(restart_adf_flag)
             buffer_112[counter_buffer_112] = 0;
         else if(enable_new_segment){                     // starting new segment
--- a/ThreadsAndFunctions.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/ThreadsAndFunctions.h	Sat Feb 24 10:28:56 2018 +0000
@@ -1,18 +1,16 @@
 //Science Thread
 //SPI ISR
-
+#include "FMS_all.h"//this is to include the 'dmaSPISlave' and payload_isr_fun
 #include "COM_MNG_TMTC.h"
 #include "adf.h"
 #include "dmaSPIslave.h"
-
+//dmaSPISlave *gPAY_SPI;
+//void payload_isr_fun(){
+//    gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL);
+//  
+//}
 
 
-dmaSPISlave *gPAY_SPI;
-
-void payload_isr_fun(){
-    gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL);
-  
-}
 
 void payload_isr_fun_dma(void const *args ){
     gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL);
@@ -30,10 +28,14 @@
     while(true){
         gPC.printf("waiting for Sci sig\n\r");
         gSCIENCE_THREAD->signal_wait(SCIENCE_SIGNAL);
-         
         gPC.printf("checking mutex in Sci\n\r");
         gMutex.lock();
         
+        if (EN_RCV_SC == 0)
+        {
+            gMutex.unlock();
+            continue;
+        }
         gPC.printf("locked mutex,entered in Sci thread\n\r"); 
   
         DMA_LED1 = 1;
@@ -45,11 +47,11 @@
       //  srp(gPAYLOAD_BUFFER);//skip one apcket when cdms resets
         //gPC.puts("exit_srp\r\n");
         //wait(2);/*timeout to be decided*/
-        if(dma)
+        if(dma)  //something wrong here
         {
      //       TIME_LATEST_I2C_SPEED = FCTN_CDMS_RD_RTC() >> 7;   
             PL_RCV_SC_DATA_COUNTER++;
-            gPAY_SPI->bulkRead_start();
+            gPAY_SPI->bulkRead_start();//something wrong here
          //     DMA_LED1 = !DMA_LED1; // added by samp
             //gPAY_SPI->bulkRead_pause();
             //gPAY_SPI->bulkRead_resume(&payload_isr_fun);
@@ -88,7 +90,11 @@
         gPC.printf("\r\nreleasing mutex for Sci\n\r");
         DMA_LED1 =0;
         //__enable_irq();
-        gMutex.unlock(); 
+        if(PL_SC_TEST){
+          PL_SC_TEST = false;
+          gCOM_MNG_TMTC_THREAD->signal_set(RCVED_SCI_DATA_SIGNAL);//used for P_PL_RCV_SC_DATA
+        }
+        gMutex.unlock();
     }
 }
 
@@ -106,12 +112,14 @@
 void rx_read(){
     gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = RX1M.getc();
     //Checking RSSI
+    //gPC.printf("\nfck ths sht\n");
     if(!COM_RSSI_SET)
     RSSI_VOLTAGE = COMRX_RSSI_VOLTAGE.read() * 3.3;//to be checked
     RSSI_MAX = RSSI_VOLTAGE;
     COM_RSSI_SET = 1;
   
     gFLAGS = gFLAGS | UART_INT_FLAG;
+    
     gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT);
 }
 
@@ -195,11 +203,15 @@
         Thread::signal_wait( COM_MNG_TMTC_SIGNAL_UART_INT );
         if( gFLAGS & UART_INT_FLAG ){
             gFLAGS = gFLAGS & (~UART_INT_FLAG);
+            //gPC.puts("in uart");
             if( !(gFLAGS & COM_SESSION_FLAG) ){
                 // DISABLE THREADS
+               // gPC.puts("1\r\n");
                 HK_counter->stop();
-                gPAY_SPI->bulkRead_pause();
-                 PL_GPIO_3_STATUS=1;
+                resume_pl_dma = 0;
+                PL_GPIO_2_STATUS = 1;//STOP SCIENCE TRANSFER &  CONTROL pin NOT STATUS
+                //gPAY_SPI->bulkRead_pause();
+                //PL_GPIO_3_STATUS=1;//problem with this
                 gFLAGS = gFLAGS | COM_SESSION_FLAG;
                 gSESSION_TIMEOUT.attach(&after_session, COM_SESSION_TIMEOUT);
                 gFLAGS = gFLAGS | COM_RX_FLAG;
@@ -214,42 +226,50 @@
             else if( gFLAGS & COM_RX_FLAG ){
                 //gLEDR = 0;
                 //gLEDG = 1;
+                                //gPC.puts("2\r\n");
+
                 PUT_RAW_BYTE;
             }
             else{
                 //gLEDR = 1;
                 //gLEDG = 0;
+                               // gPC.puts("3\r\n");
+
                 gFLAGS = gFLAGS | COM_RX_FLAG;
                 PUT_RAW_BYTE;
             }
             if(gTOTAL_RAW_BYTES > BYTE_OVERFLOW_CONSTANT){
+                                //gPC.puts("4\r\n");
+
                 RX1M.attach(NULL);
                 gCOM_RX_DISABLE.attach(&after_com_disable, COM_RX_DISABLE_TIMEOUT);
                 after_receive();
             }
         }
         else if( gFLAGS & NEW_TC_RECEIVED ){
-            gPC.puts("\n\n\n\r\rNEW TC RECEIVED\r\n");
+            gFLAGS = gFLAGS & (~NEW_TC_RECEIVED);
             /*Thread::wait(2000);*/
-            gFLAGS = gFLAGS & (~NEW_TC_RECEIVED);
             gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG;
 
             // DISABLE THE RX1M INTERRUPT
             RX1M.attach(NULL);
-            
+            //gPC.printf("\n flags = %u \n", gFLAGS);
+            gPC.puts("\n\n\n\r\rNEW TC RECEIVED\r\n");
+            //gPC.printf("\n %u \n", gFLAGS);
             // VERIFY CRC, REPEATED PSC AND UPDATE TOTAL_VALID_TC, INCORRECT SIZE TC, CRC FAIL TC
             while(gRX_COUNT < (RX_BUFFER_LENGTH)){
                 gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = 0x00;
                 ++gRX_COUNT;
             }
             gRX_COUNT = 0;
+            COM_RST.reset();//com thread saviour
+            COM_RST.start();
             raw_data_to_tc();
+            COM_RST.stop();
             gFLAGS = gFLAGS & (~COM_RX_FLAG);
-            
             //Mutex
             gMutex.lock();
-            
-            if( gTOTAL_VALID_TC > 0 ){
+            if( gTOTAL_VALID_TC > 1 ){
                 gPC.printf("valid TC rx: %u\r\n", gTOTAL_VALID_TC);
                 //gTOTAL_VALID_TC = 1;
                 if( gTOTAL_VALID_TC < COM_MAX_TC_LIMIT ){
@@ -414,11 +434,11 @@
         if(resume_pl_dma)
         {
             
-            
-            resume_pl_dma = 0;
+            PL_GPIO_2_STATUS=0;
+           // resume_pl_dma = 0;
         }
         //gPC.puts("dma started");
-        gPAY_SPI->bulkRead_resume(&payload_isr_fun);
+        //gPAY_SPI->bulkRead_resume(&payload_isr_fun);
         gMutex.unlock();
         
     }
--- a/adf.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/adf.h	Sat Feb 24 10:28:56 2018 +0000
@@ -34,6 +34,7 @@
 uint8_t firstbyte;
 uint8_t secondbyte;
 unsigned char buffer_112[112];
+int loop_conter = 0;
 //ADF temperature reading
 #define temp_correction_value 0
 
@@ -407,6 +408,7 @@
 
 #define write_data {\
     counter++;\
+    /*gPC.printf("%d\r\n",counter);*/\
     if(counter==584){\
         finish_write_data=true;\
         restart_adf_flag=true;\
@@ -668,13 +670,19 @@
 bool configure = true;
 void transmit_adf(){
     configure =true;
-    
 while(retransmit||configure){
     configure =0;
     retransmit=0;
+    loop_conter = 0;//to prevent from going into infinite while loop
 while(power_reset_count<POWER_RESET_THRS){     
     restart_adf_flag=false;
     bool tx_err=false;
+    if(sent_tmfrom_SDcard == false){
+        if(COM_RST>100){
+            gPC.printf("\r\nSTUCK IN LOOP EXITING\r\n ");
+            break;
+            }
+        }
     configure_adf;
     send_data;
     /*PA MCR level*/;
@@ -682,13 +690,20 @@
         spi.write(0x1B);
         spi.write(0x07);
    //     spi.write(0x35);
-    spi.write(0x36);
+   // spi.write(0x36);
+    spi.write(0x38);  //PA Output = 30.8
         gCS_ADF=1;
     CMD(CMD_PHY_TX);
     wait_us(2000);
     T.start();
     while(loop_on){
-        wait_us(20);
+        if(sent_tmfrom_SDcard == false){
+        if(COM_RST>100){
+            gPC.printf("\r\nSTUCK IN LOOP EXITING\r\n ");
+            break;
+            }
+        }
+        wait_us(15);
         check;
         if(data_irq_err||tx_err){
             hw_reset_err_cnt++;
@@ -703,6 +718,8 @@
         break;
     }
     gPC.puts("after while looprn");
+    loop_conter++;
+    if (loop_conter > 2){break;gPC.printf("\nERROR: TM DROPPED");}//to prevent from going into infinite while loop
     
 }
 if(restart_adf_flag){
--- a/cdms_rtc.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/cdms_rtc.h	Sat Feb 24 10:28:56 2018 +0000
@@ -76,17 +76,17 @@
     
     gCS_RTC=0;
     spi.write(0x87); 
-    spi.write(0x00); //set year to 00(2000)
+    spi.write(0x16); //set year to 00(2000)
     gCS_RTC=1;
     gPC.puts("\n\r rtc initalised \n");
     RTC_INIT_STATUS = 1;
-   FCTN_CDMS_WR_FLASH(5,1);
+    WRITE_TO_EEPROM(5,1);
     SPI_mutex.unlock();
 }
  
 uint64_t FCTN_CDMS_RD_RTC()
 {   
-    if(EN_RTC == 0)
+    if(EN_RTC == 0)  
     return 0;
     SPI_mutex.lock(); 
     uint8_t response;
@@ -140,19 +140,19 @@
     
     gCS_RTC=1;
     gCS_RTC=0;
-    response =spi.write(0x00);
+    spi.write(0x07);
+    response = spi.write(0x01);
     uint8_t year = ((response&0xF0)>>4)*10+(response&0x0F)*1;
     year = (year == 16)?0x00:(year == 17)?0x01:(year == 18)?0x02:(year == 19)?0x03:0x00;
     gCS_RTC=1;
     
-    uint8_t Time_stamp[8] = {year, month, date, day, hours, minutes, seconds, centiseconds};
     
     time = time|(((uint64_t)(centiseconds&0x7F)));
     time = time|(((uint64_t)(seconds&0x3F))<<7);
     time = time|(((uint64_t)(minutes&0x3F))<<13);
     time = time|(((uint64_t)(hours&0x1F))<<19);
-    time = time|(((uint64_t)(day&0x1F))<<24);
-    time = time|(((uint64_t)(month&0x07))<<29);
+    time = time|(((uint64_t)(date&0x1F))<<24);
+    time = time|(((uint64_t)(month&0x0F))<<29);
     time = time|(((uint64_t)(year&0x03))<<33);
     time = (time&0x00000007FFFFFFFF);
     SPI_mutex.unlock();
--- a/cdms_sd.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/cdms_sd.h	Sat Feb 24 10:28:56 2018 +0000
@@ -22,10 +22,10 @@
 
 uint32_t SD_SCP_FIRST=10001;
 uint32_t SD_SCP_LAST=20000;
-uint32_t SD_SFF_AT_FIRST=20001;
-uint32_t SD_SFF_AT_LAST = 30000;
-uint32_t SD_SFF_BT_FIRST =30001;
-uint32_t SD_SFF_BT_LAST=40000;
+uint32_t SD_SFF_AT_FIRST=30001;
+uint32_t SD_SFF_AT_LAST = 40000;
+uint32_t SD_SFF_BT_FIRST =20001;
+uint32_t SD_SFF_BT_LAST=30000;
 uint32_t SD_HK_ARCH_FIRST=40001;
 uint32_t SD_HK_ARCH_LAST= 50000;
 uint32_t LOG_FIRST =50001;
@@ -133,7 +133,7 @@
     if(SD_MNG_SECT != SD_LIB_BLK_CURRENT)
     {
         SD_LIB_BLK_CURRENT = SD_MNG_SECT;
-        FCTN_CDMS_WR_FLASH(16,SD_LIB_BLK_CURRENT);      
+        WRITE_TO_EEPROM(16,SD_LIB_BLK_CURRENT);      
     }
     SD_LIB_WRITES = SD_LIB_WRITES%(int)0xFFFF;
     disk_write(buffer,SD_MNG_SECT);
@@ -327,7 +327,7 @@
     }
      if(sid==0x05)
     {
-        block_number= LOG_FIRST +(fsc%(LOG_FIRST - LOG_FIRST +1))-1;
+        block_number= LOG_FIRST +(fsc%(LOG_LAST - LOG_FIRST +1))-1;
         //block_number= LOG_FIRST +fsc;
         result= disk_write(buffer,block_number);
         if(result == 0)
@@ -385,7 +385,7 @@
         if(!(FSC_OLD[5]<=fsc && fsc<=FSC_CURRENT[5])){
             return 0x86;
         }
-        block_number= LOG_FIRST +(fsc%(LOG_FIRST - LOG_FIRST +1))-1;
+        block_number= LOG_FIRST +(fsc%(LOG_LAST - LOG_FIRST +1))-1;
         result= disk_read(buffer,block_number);
     }
     else
--- a/common_functions.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/common_functions.h	Sat Feb 24 10:28:56 2018 +0000
@@ -185,7 +185,7 @@
     gPC.printf("PA V  = %f r\n",pa_volt);\
     COM_PA_IC_TMP = quantiz(tstart_thermistor,tstep_thermistor,pa_temp1);\
     COM_PA_TMP_IN_TX = COM_PA_IC_TMP;\
-    /*comment this ater*/\
+    /*pending comment this later*/\
      COM_PA_IC_TMP = 0;\
     /*COM_PA_TMP_HIGH to be found*/\
     if (COM_PA_IC_TMP > COM_PA_TMP_HIGH){\
--- a/main.cpp	Tue Mar 28 08:50:07 2017 +0000
+++ b/main.cpp	Sat Feb 24 10:28:56 2018 +0000
@@ -1,7 +1,7 @@
 // TESTING PUSH PULL IN MAIN CPP
 
 #include "mbed.h"
-//#include "eeprom.h"
+#include "eeprom.h"
 
 #define DEBUG 1
 
@@ -15,8 +15,7 @@
 #include "DefinitionsAndGlobals.h"
 #include "crc.h"
 #include "i2c.h"
-//#include "EEPROM.h"
-#include "Flash.h"
+#include "EEPROM.h"
 #include "COM_SND_TM_functions.h"
 #include "cdms_rtc.h"
 #include "COM_SND_TM.h"
@@ -47,7 +46,7 @@
     RF_SW_CNTRL_BCN = 0;
     PYLD_DFF = 1;
     
-    for(int i= 0; i< 10 ; i++)
+    for(int i= 0; i< 10 ; i++)                      //probably remove as PMS must turn on PYLD for FM
     {PYLD_DFF_CLK = !PYLD_DFF_CLK;
     wait_us(10);} 
     
@@ -61,16 +60,21 @@
     gRX_COUNT = 0;
     RX1M.attach(&rx_read, Serial::RxIrq);
     
-   gPC.baud(1200);//changed for bypassing COM
+    gPC.baud(1200);//changed for bypassing COM
    
     
     //Base_tm *tm_ptr = NULL;
     //SET_BCN_STANDBY(tm_ptr);
-    //gPC.puts("set Bcn off\r\n");
+    gPC.puts("set Bcn off\r\n");
     
     // COMMON SPI
     spi.format(8,0);
     spi.frequency(500000);
+   
+
+    if ((BAE_STATUS & 0x03) == 0x03)
+    {SW_OFF_BAE();}
+    uint8_t sd_stat_temp = SD_STATUS & 0x03;                        //Joel
     SD_CARD_fromuC_ENA3 = 0; 
     SD_CARD_fromISO_ENA4 = 0;
     SD_SW_EN_DS = 0; 
@@ -78,23 +82,41 @@
     SD_CARD_fromuC_ENA3 = 1; 
     SD_CARD_fromISO_ENA4 = 1;
     SD_SW_EN_DS = 1;
-    
+        
     wait(1);
     // SD CARD
     cs_sd = 1;
     gCS_RTC = 1;
     gCS_ADF = 1;
     
-  //  CDMS_RTC_DISABLE = 1;
+  
     
-    FCTN_CDMS_INIT_RTC();/* rtc initialization*/
+    CDMS_RTC_DISABLE = 1;
+    if((CDMS_RTC_DISABLE & 0x01) == 0)
+    {
+      EN_RTC = 0;
+    }
+    if((RTC_INIT_STATUS & 0x01) != 1)                  //Joel
+     {
+        FCTN_CDMS_INIT_RTC();/* rtc initialization*/
+     }
     FCTN_CDMS_SD_INIT();/* sd card initialization*/
-   // INIT_EEPROM(); // added by samp
+    INIT_EEPROM();
+    if(sd_stat_temp ==  DEVICE_DISABLED)
+    {
+        SD_STATUS = sd_stat_temp;
+        SD_SW_EN_DS = 0;
+    }
+    else if(sd_stat_temp == DEVICE_OC_FAULT)
+    {
+        SD_STATUS = sd_stat_temp;
+    }
 
-    CDMS_RESET_COUNTER++;
-    FCTN_CDMS_WR_FLASH(17,CDMS_RESET_COUNTER);
+    CDMS_RESET_COUNTER+=1;
+    WRITE_TO_EEPROM(7,CDMS_RESET_COUNTER);
+    gPC.printf("\n\r%d\n",CDMS_RESET_COUNTER);
     TIME_LATEST_CDSMS_RESET = FCTN_CDMS_RD_RTC() >> 7;
-    FCTN_CDMS_WR_FLASH(8,TIME_LATEST_CDSMS_RESET);
+    WRITE_TO_EEPROM(8,TIME_LATEST_CDSMS_RESET);
     
    // gPC.printf("%d \n", READ_FROM_EERPOM(8));
     uint8_t test[512];
@@ -102,8 +124,9 @@
     for(int i =0; i<512; i++)
         test[i] = 0;
     disk_write(test,80000);
-   
-    //SD_MNG_SECT = SD_LIB_BLK_CURRENT;
+
+    SD_MNG_SECT = SD_LIB_BLK_CURRENT;
+
     FCTN_SD_MNGR();
 
     #if DEBUG
    