working version

Dependencies:   mbed mbed-rtos SimpleDMA FreescaleIAP eeprom

Fork of CDMS_CODE_FM_28JAN2017 by samp Srinivasan

Revision:
210:f4acf895b598
Parent:
198:17200a427e71
Child:
213:867de6d350fa
Child:
214:6848a51af734
Child:
224:3ac1f91e0ebc
--- a/COM_MNG_TMTC.h	Sat Jul 02 14:54:52 2016 +0000
+++ b/COM_MNG_TMTC.h	Sat Jul 02 15:28:21 2016 +0000
@@ -10,6 +10,10 @@
 //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
 
 uint8_t received = 0;
 uint16_t mid1;
@@ -22,6 +26,11 @@
 uint16_t mid;
 uint32_t block;
 
+uint8_t ACK_CODE;
+
+void TM_PMS_PL_SCHEDULE(Base_tm* tm_pointer1,uint8_t psc);
+void ACK_L234(Base_tm* tm_pointer_short1,uint8_t ackCode,uint8_t psc);
+
 #define delete_TC(tc_ptr) {\
     if(tc_ptr == gHEAD_NODE_TCL){\
         gHEAD_NODE_TCL = tc_ptr->next_TC;\
@@ -147,7 +156,7 @@
         }\
     }\
     else{\
-        if( (gMASTER_STATE == TCL_STATE_INCOMPLETE) || (gMASTER_STATE == TCL_STATE_COMPLETED) ){\
+        if( (gMASTER_STATE == TCL_STATE_INCOMPLETE) || (gMASTER_STATE == TCL_STATE_COMPLETED) || (gMASTER_STATE == TCL_STATE_ABORTED) ){\
             gMASTER_STATE = TCL_STATE_INCOMPLETE;\
         }\
     }\
@@ -177,11 +186,6 @@
         testTC = testTC->next_TC;\
         ++overflowCount;\
     }\
-    if(returnHere == 0xFF)\
-    {\
-        uint16_t temp = TC_STATE_SUCCESSFULLY_EXECUTED;\
-        PUTexec_status(testTC,temp);\
-    }\
 }
 
 /*
@@ -195,674 +199,753 @@
 /*tm_ptr is the next_TM of a linked list, and should have the value NULL, i.e. tm_ptr should be the next_TM pointer of thte last node */
 
 // CDMS TEAM CODE START
-inline Base_tm* FCTN_CDMS_RLY_TMTC(Base_tc *tc_ptr){
-    uint8_t ACKCODE = 0xB0;
-    //printf("\rTC execution in progress\r\n");
+void ACK_L234(Base_tm* tm_pointer_short1,uint8_t ackCode,uint8_t psc)
+{
+    tm_pointer_short1->TM_string[0] = 0xB0; 
+    tm_pointer_short1->TM_string[1] = psc;
+    tm_pointer_short1->TM_string[2] = ackCode;
+    tm_pointer_short1->TM_string[3] = 0x00;
+    tm_pointer_short1->TM_string[4] = 0x00;
+    for(uint8_t i=0;i<6;i++)
+        tm_pointer_short1->TM_string[i+5] = 0;
+    crc16 = crc16_gen(tm_pointer_short1->TM_string,11);
+    tm_pointer_short1->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer_short1->TM_string[12] = (uint8_t)(crc16&0x00FF);
+    tm_pointer_short1->next_TM = NULL;                                                 
+}
+void TM_PMS_PL_SCHEDULE(Base_tm *tm_pointer1,uint8_t psc)
+{
+    Base_tm *tm_pointer2 = NULL;
+    if(!(tm_pointer2  = new Long_tm))
+    {
+       gPC.printf("\n\rError: out of memory");
+       return;   
+    }
+    Base_tm *tm_pointer3 = NULL;
+    if(!(tm_pointer3  = new Long_tm))
+    {
+       gPC.printf("\n\rError: out of memory");
+       return;   
+    }
+    Base_tm *tm_pointer4 = NULL;
+    if(!(tm_pointer4  = new Long_tm))
+    {
+       gPC.printf("\n\rError: out of memory");
+       return;   
+    }
+    Base_tm *tm_pointer5 = NULL;
+    if(!(tm_pointer5  = new Long_tm))
+    {
+       gPC.printf("\n\rError: out of memory");
+       return;   
+    }    
+    Base_tm *tm_pointer6 = NULL;
+    if(!(tm_pointer6  = new Long_tm))
+    {
+       gPC.printf("\n\rError: out of memory");
+       return;   
+    }
+    tm_pointer1->TM_string[0] = 0x48;     
+    tm_pointer1->TM_string[1] = psc;
+    tm_pointer1->TM_string[2] = 0xA0;
+    tm_pointer1->TM_string[3] = 0x01;
+    for(uint8_t i=0;i<128;i+=4)
+    {
+        tm_pointer1->TM_string[i+4] = (uint8_t)((pl_block[i/4] & 0xFF000000)>>24);
+        tm_pointer1->TM_string[i+5] = (uint8_t)((pl_block[i/4] & 0x00FF0000)>>16);
+        tm_pointer1->TM_string[i+6] = (uint8_t)((pl_block[i/4] & 0x0000FF00)>>8);
+        tm_pointer1->TM_string[i+7] = (uint8_t)((pl_block[i/4] & 0x000000FF));                        
+    }
+    crc16 = crc16_gen(tm_pointer1->TM_string,132);
+    tm_pointer1->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer1->TM_string[133] = (uint8_t)(crc16&0x00FF);    
+    tm_pointer1->next_TM = tm_pointer2;
+    
+    tm_pointer2->TM_string[0] = 0x48;     
+    tm_pointer2->TM_string[1] = psc;
+    tm_pointer2->TM_string[2] = 0xA0;
+    tm_pointer2->TM_string[3] = 0x02;
+    for(uint8_t i=0;i<128;i+=4)
+    {
+        tm_pointer2->TM_string[i+4] = (uint8_t)((pl_block[(i/4)+32] & 0xFF000000)>>24);
+        tm_pointer2->TM_string[i+5] = (uint8_t)((pl_block[(i/4)+32] & 0x00FF0000)>>16);
+        tm_pointer2->TM_string[i+6] = (uint8_t)((pl_block[(i/4)+32] & 0x0000FF00)>>8);
+        tm_pointer2->TM_string[i+7] = (uint8_t)((pl_block[(i/4)+32] & 0x000000FF));                        
+    }
+    crc16 = crc16_gen(tm_pointer2->TM_string,132);
+    tm_pointer2->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer2->TM_string[133] = (uint8_t)(crc16&0x00FF);
+    tm_pointer2->next_TM = tm_pointer3;
+
+    tm_pointer3->TM_string[0] = 0x48;     
+    tm_pointer3->TM_string[1] = psc;
+    tm_pointer3->TM_string[2] = 0xA0;
+    tm_pointer3->TM_string[3] = 0x03;
+    for(uint8_t i=0;i<128;i+=4)
+    {
+        tm_pointer3->TM_string[i+4] = (uint8_t)((pl_block[(i/4)+64] & 0xFF000000)>>24);
+        tm_pointer3->TM_string[i+5] = (uint8_t)((pl_block[(i/4)+64] & 0x00FF0000)>>16);
+        tm_pointer3->TM_string[i+6] = (uint8_t)((pl_block[(i/4)+64] & 0x0000FF00)>>8);
+        tm_pointer3->TM_string[i+7] = (uint8_t)((pl_block[(i/4)+64] & 0x000000FF));                        
+    }
+    crc16 = crc16_gen(tm_pointer3->TM_string,132);
+    tm_pointer3->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer3->TM_string[133] = (uint8_t)(crc16&0x00FF);
+    tm_pointer3->next_TM = tm_pointer4;
+
+    tm_pointer4->TM_string[0] = 0x48;     
+    tm_pointer4->TM_string[1] = psc;
+    tm_pointer4->TM_string[2] = 0xA0;
+    tm_pointer4->TM_string[3] = 0x04;
+    for(uint8_t i=0;i<128;i+=4)
+    {
+        tm_pointer4->TM_string[i+4] = (uint8_t)((pl_block[(i/4)+96] & 0xFF000000)>>24);
+        tm_pointer4->TM_string[i+5] = (uint8_t)((pl_block[(i/4)+96] & 0x00FF0000)>>16);
+        tm_pointer4->TM_string[i+6] = (uint8_t)((pl_block[(i/4)+96] & 0x0000FF00)>>8);
+        tm_pointer4->TM_string[i+7] = (uint8_t)((pl_block[(i/4)+96] & 0x000000FF));                        
+    }
+    crc16 = crc16_gen(tm_pointer4->TM_string,132);
+    tm_pointer4->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer4->TM_string[133] = (uint8_t)(crc16&0x00FF);                        
+    tm_pointer4->next_TM = tm_pointer5;
+
+    tm_pointer5->TM_string[0] = 0x48;     
+    tm_pointer5->TM_string[1] = psc;
+    tm_pointer5->TM_string[2] = 0xA0;
+    tm_pointer5->TM_string[3] = 0x05;
+    for(uint8_t i=0;i<128;i+=4)
+    {
+        tm_pointer5->TM_string[i+4] = (uint8_t)((pl_block[(i/4)+128] & 0xFF000000)>>24);
+        tm_pointer5->TM_string[i+5] = (uint8_t)((pl_block[(i/4)+128] & 0x00FF0000)>>16);
+        tm_pointer5->TM_string[i+6] = (uint8_t)((pl_block[(i/4)+128] & 0x0000FF00)>>8);
+        tm_pointer5->TM_string[i+7] = (uint8_t)((pl_block[(i/4)+128] & 0x000000FF));                        
+    }
+    crc16 = crc16_gen(tm_pointer5->TM_string,132);
+    tm_pointer5->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer5->TM_string[133] = (uint8_t)(crc16&0x00FF);
+    tm_pointer5->next_TM = tm_pointer6;
+
+    tm_pointer6->TM_string[0] = 0x48;     
+    tm_pointer6->TM_string[1] = psc;
+    tm_pointer6->TM_string[2] = 0xA0;
+    tm_pointer6->TM_string[3] = 0x06;
+    for(uint8_t i=0;i<128;i+=4)
+    {
+        tm_pointer6->TM_string[i+4] = (uint8_t)((pl_block[(i/4)+160] & 0xFF000000)>>24);
+        tm_pointer6->TM_string[i+5] = (uint8_t)((pl_block[(i/4)+160] & 0x00FF0000)>>16);
+        tm_pointer6->TM_string[i+6] = (uint8_t)((pl_block[(i/4)+160] & 0x0000FF00)>>8);
+        tm_pointer6->TM_string[i+7] = (uint8_t)((pl_block[(i/4)+160] & 0x000000FF));                        
+    }
+    crc16 = crc16_gen(tm_pointer6->TM_string,132);
+    tm_pointer6->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+    tm_pointer6->TM_string[133] = (uint8_t)(crc16&0x00FF);
+    tm_pointer6->next_TM = NULL;
+}
+Base_tm* FCTN_CDMS_RLY_TMTC(Base_tc *tc_ptr)
+{
+    //uint8_t ACKCODE = 0xB0;
+    bool y;
+    //gPC.printf("\rTC execution in progress\r\n");
     Base_tm *tm_pointer = new Long_tm;
     Base_tm *tm_ptr = tm_pointer;
+    //Base_tm *tm_ptr = new Long_tm;
+    Base_tm *tm_pointer_short = new Short_tm;
+    Base_tm *tm_ptr_short = tm_pointer_short;
     received = 0;
-    switch(GETapid(tc_ptr))
+    switch(GETapid(tc_ptr))             //checking APID's
     {
         case 1: //apid=01 implies it corresponds to bae
         {
+            BAE_I2C_mutex.lock();
             gPC.printf("Telecommand is for BAE\r\n");
-            //printf("Sending TC to BAE...\r\n"); //interrupt to be sent to the bae
-
-                FCTN_I2C_WRITE((char*)tc_ptr->TC_string,TC_SHORT_SIZE);
-            
-            while(1)
+            gPC.printf("Sending TC to BAE...\r\n"); //interrupt to be sent to the bae
+            y = FCTN_I2C_WRITE((char*)tc_ptr->TC_string,TC_LONG_SIZE);                         // Check for SHORT and LONG TC and then send
+                
+            if(y==1)                                                            
+            {                                                                               
+                ACK_L234(tm_ptr_short,0x03,GETpacket_seq_count(tc_ptr));
+                return tm_ptr_short;
+            }                                  
+            else if(y==0)
             {
-                wait(1); //TimeOut instead of wait
-                if(BAE_I2C_GPIO == 1)
+                //wait(0.2);
+                uint8_t poll=0;
+                while(poll<60 && BAE_I2C_GPIO==0)
                 {
+                    wait_ms(50);
+                    poll+=1;
+                }    
+                if(BAE_I2C_GPIO == 1)                                            //name to be changed later
+                {
+                    gPC.printf("BAE_I2C_GPIO is high\r\n");
                     
-                    //printf("receiving...\r\n");
-                    int r = FCTN_I2C_READ((char*)tm_pointer->TM_string,135);
-                    //printf("%s", tm_pointer->TM_string);
-                    if(r)
+                    y=FCTN_I2C_READ((char*)tm_pointer->TM_string,TM_LONG_SIZE);            //rify later about the size
+                    if(y==0)
+                    {
+                        tm_pointer->next_TM=NULL;
+                        return tm_ptr;
+                    }
+                    else if(y==1)
                     {
-                        received = 0;
-                        }
-                        else received = 1;
-                    
-                    break; //only for testing purpose
+                        ACK_L234(tm_ptr_short,0x85,GETpacket_seq_count(tc_ptr));                
+                        //gPC.printf("\n\rPTE->PDIR = 0x%08X",PTE->PDIR);
+                        return tm_ptr_short;
+                        break;  
+                    }
                 }
-                else
+                else if(BAE_I2C_GPIO == 0)                                       //name to be changed later
                 {
-                    break;
+                    gPC.printf("BAE_I2C_GPIO is not high\r\n");                    
+                    ACK_L234(tm_ptr_short,0x84,GETpacket_seq_count(tc_ptr));
+                    return tm_ptr_short;
                 }
             }
-            if(received < 1 )
-            {
-                //printf("Telemetry is not received from BAE\r\n");
-                //tm_pointer = new Short_tm;
-                tm_pointer->TM_string[0] = 0xB0;
-                tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                tm_pointer->TM_string[2] = 0x00;
-                tm_pointer->TM_string[3] = 0x00; //ackcode to be decided
-                tm_pointer->TM_string[4] = 0x00;
-                for(uint8_t i=0;i<6;i++)
-                {
-                    tm_pointer->TM_string[i+5] = 0;
-                }
-                crc16 = crc16_gen(tm_ptr->TM_string,11);
-                tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                tm_pointer->next_TM = NULL;                 return tm_ptr;
-            }
-            else
-            {
-                tm_pointer->next_TM = NULL; return tm_ptr;
-                }
+            BAE_I2C_mutex.unlock();
         }
-        case 2:
+
+        case 2: // APID = 2 corresponds to CDMS
         {
             //gPC.printf("Telecommand is for CDMS\r\n"); //apid = 10 corresponds to cdms
             switch(GETservice_type(tc_ptr))
             {
-                case 0x60:
+                /*case 0x60:  //service type = 0x6
                 {
-                        //gPC.printf("service:MMS\r\n");
-                        switch(GETservice_subtype(tc_ptr))
-                        {
-                            case 0x1:
-                            {
-                            //printf("sub_service:Read from RAM_Memory\r\n");
-                            mid=(uint16_t)(tc_ptr->TC_string[3]<<4)+(uint16_t)(tc_ptr->TC_string[4]);                                                       
-                                                             
-                                    //Data[0] = FCTN_CDMS_RD_FLASH(0);
-                                    //Data[1] = FCTN_CDMS_RD_FLASH(1);
-                                    //tm_pointer = new Long_tm;
-                                    tm_pointer->TM_string[0] = 0x30;
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                                    tm_pointer->TM_string[2] = (uint8_t)(flash_counter);
-                                    for(uint8_t i=0;i<4;i++)
-                                    {
-                                        tm_pointer->TM_string[3+i] = (uint8_t)((Data[0]>>(8*i))&0x00FF);
-                                    }
-                                    for(uint8_t i=4;i<8;i++)
-                                    {
-                                        tm_pointer->TM_string[3+i] = (uint8_t)((Data[1]>>(8*i))&0x00FF);
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,9);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                tm_pointer->next_TM = NULL;                 return tm_ptr;
-                            }                            
-                            case 0x2:
-                            {
-                            gPC.printf("sub_service:Read from Flash_Memory\r\n");
-                            mid=(uint16_t)(tc_ptr->TC_string[3]<<4)+(uint16_t)(tc_ptr->TC_string[4]);                           
-                                                                                             
-                                    //Data[0] = FCTN_CDMS_RD_FLASH(0);
-                                    //Data[1] = FCTN_CDMS_RD_FLASH(1);                                                                                             
-                                    //tm_pointer = new Long_tm;
-                                    tm_pointer->TM_string[0] = 0xB0;
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                                    tm_pointer->TM_string[2] = ACKCODE;
-                                    for(uint8_t i=0;i<4;i++)
-                                    {
-                                        tm_pointer->TM_string[3+i] = (uint8_t)((Data[0]>>(8*i))&0x00FF);
-                                    }
-                                    for(uint8_t i=4;i<8;i++)
-                                    {
-                                        tm_pointer->TM_string[3+i] = (uint8_t)((Data[1]>>(8*i))&0x00FF);
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                tm_pointer->next_TM = NULL;                 return tm_ptr;
-                            }                           
-                            case 0x5:
-                            {
-                            //printf("WRITE ON FLASH_MEMORY\r\n");                          
-                                    mid=(uint16_t)(tc_ptr->TC_string[3]<<4)+(uint16_t)(tc_ptr->TC_string[4]);                                   
-                                    block = (((uint32_t)(tc_ptr->TC_string[5])<<24)|((uint32_t)(tc_ptr->TC_string[5])<<16)|((uint32_t)(tc_ptr->TC_string[5])<<8)|((uint32_t)(tc_ptr->TC_string[5])));
-                                    //FCTN_CDMS_WR_FLASH(mid,block);
-                                    //tm_pointer = new Short_tm;
-                                    tm_pointer->TM_string[0] = 0xB0;
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                                    tm_pointer->TM_string[2] = 0x01;
-                                    tm_pointer->TM_string[3] = ACKCODE;  //ackcode to be decided
-                                    tm_pointer->TM_string[4] = 0x01;
-                                    for(uint8_t i=0;i<6;i++)
-                                    {
-                                        tm_pointer->TM_string[i+5] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                            }                                                    
-                            default:
-                            {
-                                //printf("INVALID TC\r\n"); //Send Invalid TC Telemetry
-                                //tm_pointer = new Short_tm;
-                                tm_pointer->TM_string[0] = 0xB0;
-                                tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                                tm_pointer->TM_string[2] = 0x01;
-                                tm_pointer->TM_string[3] = ACKCODE;  //ackcode to be decided
-                                tm_pointer->TM_string[4] = 0x01;
-                                for(uint8_t i=0;i<6;i++)
-                                {
-                                    tm_pointer->TM_string[i+5] = 0;
-                                }
-                                crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                tm_pointer->next_TM = NULL;                 return tm_ptr;                               
-                            }
-                            break;
-                        }
-                    }                                                                   
-                    case 0x8:
+                    gPC.printf("service:MMS\r\n");
+                    switch(GETservice_subtype(tc_ptr))      
                     {
-                        //printf("service:FUNCTION MANAGEMENT SERVICE\r\n"); 
-                        if(GETservice_subtype(tc_ptr)==0x1)
-                            {                               
-                              if(GETpid(tc_ptr)==0x01)
-                                {
-                                    //printf("TC_PL_INIT\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }                                
-                                else if(GETpid(tc_ptr)==0x02)
-                                {
-                                    //printf("TC_PL_MAIN\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                               else if(GETpid(tc_ptr)==0x03)
-                                {
-                                    //printf("TC_COM_INIT\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x04)
-                                {
-                                    //printf("TC_CDMS_HK_MAIN\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                    
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;                                   
-                                }
-                                else if(GETpid(tc_ptr)==0x11)
-                                {
-                                    //printf("TC_SW_ON_SD\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x12)
-                                {
-                                    //printf("TC_SW_ON_RTC\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                    
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x13)
-                                {
-                                    //printf("TC_SW_ON_BAE\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x14)
-                                {
-                                    //printf("TC_SW_ON_PL_DL\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                    
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                 else if(GETpid(tc_ptr)==0x15)
-                                {
-                                    //printf("TC_SW_ON_PL_AG_HV\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                 else if(GETpid(tc_ptr)==0x16)
-                                {
-                                    //printf("TC_SW_ON_V_A_EN\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;                                   
-                                }
-                                else if(GETpid(tc_ptr)==0x21)
-                                {
-                                    //printf("TC_SW_OFF_SD\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x22)
-                                {
-                                    //printf("TC_SW_OFF_RTC\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                    
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x23)
-                                {
-                                    //printf("TC_SW_OFF_BAE\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x24)
-                                {
-                                    //printf("TC_SW_OFF_PL_DL\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                 else if(GETpid(tc_ptr)==0x25)
-                                {
-                                    //printf("TC_SW_OFF_PL_AG_HV\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                 else if(GETpid(tc_ptr)==0x26)
-                                {
-                                    //printf("TC_SW_OFF_V_A_EN\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                    
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x31)
-                                {
-                                    //printf("TC_RST_SD\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x32)
-                                {
-                                    //printf("TC_RST_RTC\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x33)
-                                {
-                                    //printf("TC_RST_BAE\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0x34)
-                                {
-                                    //printf("TC_RST_PL_DL\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0xC1)
-                                {
-                                    //printf("RESET_HK_COUNTER\r\n"); // call PWR_SWCH_ON function
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = ACKCODE;                                   
-                                    for(uint8_t i=3;i<11;i++)
-                                    {
-                                        tm_pointer->TM_string[i] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                    break;
-                                }
-                                else if(GETpid(tc_ptr)==0xF1)
-                                {
-                                    //printf("RD_RTC\r\n"); //call RD_RTC
-                                    //tm_pointer = new Short_tm;
-                                    tm_pointer->TM_string[0] = 0xD0;
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                                    tm_pointer->TM_string[2] = 0x01;
-                                    uint64_t time = FCTN_CDMS_RD_RTC();
-                                    tm_pointer->TM_string[3] = (uint8_t)((time&0xFF00000000000000)>>56);
-                                    tm_pointer->TM_string[4] = (uint8_t)((time&0x00FF000000000000)>>48);
-                                    tm_pointer->TM_string[5] = (uint8_t)((time&0x0000FF0000000000)>>40);
-                                    tm_pointer->TM_string[6] = (uint8_t)((time&0x000000FF00000000)>>32);
-                                    tm_pointer->TM_string[7] = (uint8_t)((time&0x00000000FF000000)>>24);
-                                    tm_pointer->TM_string[8] = (uint8_t)((time&0x0000000000FF0000)>>16);
-                                    tm_pointer->TM_string[9] = (uint8_t)((time&0x000000000000FF00)>>8);
-                                    tm_pointer->TM_string[10] = (uint8_t)(time&0x00000000000000FF);
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                }                               
-                                else 
-                                {
-                                    //printf("INVALID TC\r\n");
-                                    //tm_pointer = new Short_tm; 
-                                    tm_pointer->TM_string[0] = 0xB0; 
-                                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                                    tm_pointer->TM_string[2] = 0x01;
-                                    tm_pointer->TM_string[3] = ACKCODE; //ackcode to be decided
-                                    tm_pointer->TM_string[4] = 0x01;
-                                    for(uint8_t i=0;i<6;i++)
-                                    {
-                                        tm_pointer->TM_string[i+5] = 0;
-                                    }
-                                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                                }
-                            }                          
-                                              
-                                     
+                        case 0x2:   //service subtye                        
+                        {
+                            //gPC.printf("sub_service:Read LONG_RAM_Memory\r\n");
+                            mid=((uint16_t)(tc_ptr->TC_string[3]<<4))+((uint16_t)(tc_ptr->TC_string[4]));                                                       
+                            if(mid!=0x0000 && mid!=0x0001)
+                            {
+                                ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }
+                            FCTN_CDMS_RD_L_RAM(tm_pointer);
+
+                            tm_pointer->TM_string[0] = 0x30;
+                            tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
+                            tm_pointer->TM_string[2] = 0xA0;
+                            tm_pointer->TM_string[3] = 0x00;                            //spare bits
+                            
+                            crc16 = crc16_gen(tm_ptr->TM_string,132);
+                            tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
+                            tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
+                            tm_pointer->next_TM = NULL;
+                            return tm_ptr;
+                        }                           
+                        case 0x5:                           // change the cases appropriately
+                        {
+                            //gPC.printf("WRITE ON SHORT_FLASH_MEMORY\r\n");                          
+                            mid=(uint16_t)(tc_ptr->TC_string[3]<<4)+(uint16_t)(tc_ptr->TC_string[4]);
+                            //32 bits at a time           
+
+                            if(mid!= && mid!=)                                  //allowable MID values?
+                            {
+                                ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                                                        
+
+                            FCTN_CDMS_WR_S_FLASH(tc_ptr);                            
+
+                            ACK_L234(tm_ptr_short,???,GETpacket_seq_count(tc_ptr));                     //ackCode = ? for success
+
+                            return tm_ptr_short;
+                        }
+                        case 0x6:
+                        {
+                            //gPC.printf("WRITE ON LONG_FLASH_MEMORY\r\n");                          
+                            mid=(uint16_t)(tc_ptr->TC_string[3]<<4)+(uint16_t)(tc_ptr->TC_string[4]);           
+                            //1024 bits at a time
+
+                            if(mid<0x0002 || mid>0x000A)                                  //allowable MID values?
+                            {
+                                ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));                     //ackCode = ? for invalid mid
+                                return tm_ptr_short;
+                            }    
+
+                            ///Send TM for success after writing onto flash
+                            FCTN_CDMS_WR_L_FLASH(mid);
+
+                            return tm_ptr_short;
+                        }                                                    
+                        default:
+                        {
+                            gPC.printf("INVALID SERVICE SUBTYPE\r\n");
+                            ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;
+                        }
+                    } 
+                }  */                                                                 
+                case 0x80:
+                {
+                    gPC.printf("service:FUNCTION MANAGEMENT SERVICE\r\n"); 
+                    if(GETservice_subtype(tc_ptr)==0x1)
+                    {                               
+                        if(GETpid(tc_ptr)==0x01)
+                        {
+                            if(CDMS_STANDBY==1)
+                            {   
+                                //gPC.printf("TC_PL_INIT\r\n");                         // call PWR_SWCH_ON function
+                                
+                                P_PL_INIT();
+
+                                ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                
+                            else if(CDMS_STANDBY==0)
+                            {
+                                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)==0x02)
+                        {
+                            if(CDMS_STANDBY==1)
+                            {   
+                                //gPC.printf("TC_PL_MAIN\r\n");                         // call PWR_SWCH_ON function
+                                
+                                P_PL_MAIN();
+
+                                ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                
+                            else if(CDMS_STANDBY==0)
+                            {
+                                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)==0x03)
+                        {                            
+                            if(CDMS_STANDBY==1)
+                            {   
+                                //gPC.printf("PL_COM_INIT\r\n");                        // call PWR_SWCH_ON function
+                                
+                                P_COM_INIT();
+
+                                ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                
+                            else if(CDMS_STANDBY==0)
+                            {
+                                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)==0x04)
+                        {                            
+                            if(CDMS_STANDBY==1)
+                            {   
+                                //gPC.printf("TC_P_CDMS_HK_MAIN\r\n"); // call PWR_SWCH_ON function
+                                
+                                P_CDMS_HK_MAIN();
+
+                                ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                
+                            else if(CDMS_STANDBY==0)
+                            {
+                                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)
+                        {                            
+                            if(CDMS_STANDBY==1)
+                            {   
+                                //gPC.printf("TC_SW_ON_SD\r\n");                        // call PWR_SWCH_ON function
+                                
+                                P_PL_RCV_SC_DATA();
+
+                                ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                
+                            else if(CDMS_STANDBY==0)
+                            {
+                                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)==0x06)
+                        {                            
+                            if(CDMS_STANDBY==1)
+                            {   
+                                //gPC.printf("TC_SW_ON_RTC\r\n"); // call PWR_SWCH_ON function
+                                
+                                P_CDMS_INIT_SD();
+
+                                ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                                return tm_ptr_short;
+                            }                
+                            else if(CDMS_STANDBY==0)
+                            {
+                                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)==0x11)
+                        {       
+                            //gPC.printf("TC_SW_ON_SD\r\n"); // call PWR_SWCH_ON function
+                            
+                            CDMS_SD_SW_ON();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                       
+                        }
+                        else if(GETpid(tc_ptr)==0x21)
+                        {       
+                            //gPC.printf("TC_SW_ON_SD\r\n"); // call PWR_SWCH_ON function
+                            
+                            CDMS_SD_SW_OFF();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;     
+                        }
+                        else if(GETpid(tc_ptr)==0x13)
+                        {                           
+                            //gPC.printf("TC_SW_ON_BAE\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_ON_BAE();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                            
+                        }
+                        else if(GETpid(tc_ptr)==0x23)
+                        {                           
+                            //gPC.printf("TC_SW_OFF_BAE\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_OFF_BAE();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                        
+                        }
+                        else if(GETpid(tc_ptr)==0x14)
+                        {                            
+                            //gPC.printf("TC_SW_ON_PL_BEE\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_ON_PL_BEE();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                        
+                        }
+                        else if(GETpid(tc_ptr)==0x24)
+                        {                   
+                            //gPC.printf("TC_SW_OFF_PL_BEE\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_OFF_PL_BEE();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;    
+                        }
+                        else if(GETpid(tc_ptr)==0x15)
+                        {                            
+                            //gPC.printf("TC_SW_ON_PL_EPS\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_ON_PL_EPS();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));     
+                            return tm_ptr_short;                            
+                        }
+                        else if(GETpid(tc_ptr)==0x25)
+                        {                            
+                            //gPC.printf("TC_SW_OFF_PL_EPS\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_OFF_PL_EPS();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                            
+                        }
+                        else if(GETpid(tc_ptr)==0x16)
+                        {                            
+                                                                                       
+                            //gPC.printf("TC_SW_ON_V_A_EN\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_ON_V_A_EN();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                        
+                        }
+                        else if(GETpid(tc_ptr)==0x26)
+                        {                        
+                            //gPC.printf("TC_SW_OFF_V_A_EN\r\n"); // call PWR_SWCH_ON function
+                            
+                            SW_OFF_V_A_EN();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                    
+                        }
+                        else if(GETpid(tc_ptr)==0x31)
+                        {                            
+                            //gPC.printf("TC_RST_SD\r\n"); // call PWR_SWCH_ON function
+                            
+                            RST_SD();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                        
+                        }
+                        else if(GETpid(tc_ptr)==0x33)
+                        {                            
+                            //gPC.printf("TC_RST_BAE\r\n"); // call PWR_SWCH_ON function
+                            
+                            RST_BAE();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                            
+                        }
+                        else if(GETpid(tc_ptr)==0x34)
+                        {                            
+                            //gPC.printf("TC_RST_PL_BEE\r\n"); // call PWR_SWCH_ON function
+                            
+                            RST_PL_BEE();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                        
+                        }
+                        else if(GETpid(tc_ptr)==0x38)
+                        {
+                            //gPC.printf()
+                            
+                            CDMS_INTERNAL_RESET();
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                        }
+                        else if(GETpid(tc_ptr)==0x40)
+                        {                         
+                            //gPC.printf("RESET_HK_COUNTER\r\n"); // call PWR_SWCH_ON function
+                            
+                            RST_HK_COUNTER();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;                                                    
+                        }
+                        else if(GETpid(tc_ptr)==0x41)
+                        {                            
+                            //gPC.printf("RESET_HK_COUNTER\r\n"); // call PWR_SWCH_ON function
+                            
+                            RST_HK_COUNTER();
+
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                            return tm_ptr_short;    
+                        }
+                        else if(GETpid(tc_ptr)==0xF1)
+                        {          
+                            //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
+                            tm_pointer->TM_string[0] = 0x78;     
+                            tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
+                            tm_pointer->TM_string[2] = 0xA0;
+                            tm_pointer->TM_string[3] = 0x00;
+                            tm_pointer->TM_string[4] = (uint8_t)((time & 0xFF000000)>>24);
+                            tm_pointer->TM_string[5] = (uint8_t)((time & 0x00FF0000)>>16);
+                            tm_pointer->TM_string[6] = (uint8_t)((time & 0x0000FF00)>>8);
+                            tm_pointer->TM_string[7] = (uint8_t)((time & 0x000000FF));
+                            for(uint8_t i=0;i<124;i++)
+                            {
+                                tm_pointer->TM_string[i+8] = 0x00;
+                            }
+                            crc16 = crc16_gen(tm_ptr->TM_string,132);
+                            tm_pointer->TM_string[132] = (uint8_t)((crc16&0xFF00)>>8);
+                            tm_pointer->TM_string[133] = (uint8_t)(crc16&0x00FF);
+                            tm_pointer->next_TM = NULL;                 
+                            return tm_ptr; */                                                    //incomplete
+                        }
+                        else if(GETpid(tc_ptr)==0xF0)
+                        {
+                            uint8_t statusbits[64];
+                            CDMS_RD_SD_HK(statusbits);
+                            ACK_L234(tm_ptr_short,0xC0,GETpacket_seq_count(tc_ptr));
+                        }                               
+                        else 
+                        {
+                            gPC.printf("INVALID FID\r\n");
+                            ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));  
+                            return tm_ptr_short;
+                        }
+                    }
+                    else 
+                    {
+                        gPC.printf("INVALID SERVICE SUBTYPE\r\n");
+                        ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));  
+                        return tm_ptr_short;
+                    }                                    
+                }
+                case 0x70:
+                {
+                    gPC.printf("\n\n\rService:PAYLOAD MANAGEMENT SERVICE"); 
+                    if(GETservice_subtype(tc_ptr)==0x1)                     //make sure it is LONG TC before executing else INVALID TC
+                    {
+                        gPC.printf("\n\rTC with subtype = 0x1");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        for(uint8_t i=0,j=0;i<32;i++)
+                        {
+                            pl_block[i] &= 0x00000000;
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[3+j]))<<24);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[4+j]))<<16);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[5+j]))<<8);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[6+j])));
+                            j+=4;
+                        }                        
+                        return tm_ptr;
+                    }                    
+                    else if(GETservice_subtype(tc_ptr)==0x2)
+                    {
+                        gPC.printf("\n\rTC with subtype = 0x2");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        for(uint8_t i=32,j=0;i<64;i++,j+=4)
+                        {
+                            pl_block[i] &= 0x00000000;
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[3+j]))<<24);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[4+j]))<<16);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[5+j]))<<8);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[6+j])));
+                        }
+                        return tm_ptr;
+                    }
+                    else if(GETservice_subtype(tc_ptr)==0x3)
+                    {
+                        gPC.printf("\n\rTC with subtype = 0x3");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        for(uint8_t i=64,j=0;i<96;i++,j+=4)
+                        {
+                            pl_block[i] &= 0x00000000;
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[3+j]))<<24);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[4+j]))<<16);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[5+j]))<<8);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[6+j])));
+                        }
+                        return tm_ptr;
+                    }
+                    else if(GETservice_subtype(tc_ptr)==0x4)
+                    {
+                        gPC.printf("\n\rTC with subtype = 0x4");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        for(uint8_t i=96,j=0;i<128;i++,j+=4)
+                        {
+                            pl_block[i] &= 0x00000000;
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[3+j]))<<24);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[4+j]))<<16);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[5+j]))<<8);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[6+j])));
+                        }
+                        return tm_ptr;
+                    }
+                    else if(GETservice_subtype(tc_ptr)==0x5)
+                    {   
+                        gPC.printf("\n\rTC with subtype = 0x5");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        for(uint8_t i=128,j=0;i<160;i++,j+=4)
+                        {
+                            pl_block[i] &= 0x00000000;
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[3+j]))<<24);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[4+j]))<<16);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[5+j]))<<8);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[6+j])));
+                        }
+                        return tm_ptr;    
+                    }
+                    else if(GETservice_subtype(tc_ptr)==0x6)
+                    {
+                        gPC.printf("\n\rTC with subtype = 0x6");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        for(uint8_t i=160,j=0;i<192;i++,j+=4)
+                        {
+                            pl_block[i] &= 0x00000000;
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[3+j]))<<24);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[4+j]))<<16);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[5+j]))<<8);
+                            pl_block[i] |= (((uint32_t)(tc_ptr->TC_string[6+j])));
+                        }
+                        return tm_ptr;
+                    }
+                    else if(GETservice_subtype(tc_ptr)==0xF)
+                    {
+                        gPC.printf("\n\rTC with subtype = 0xF");
+                        TM_PMS_PL_SCHEDULE(tm_ptr,GETpacket_seq_count(tc_ptr));
+                        return tm_ptr;
+                    }
+                    else
+                    {
+                        gPC.printf("INVALID SERVICE SUBTYPE\r\n");
+                        ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));  
+                        return tm_ptr_short;
+                    }
                 }
                 default:
                 {
-                    //printf("INVALID TC"); //send invalid TC TM
-                    //tm_pointer = new Short_tm; 
-                    tm_pointer->TM_string[0] = 0xB0; 
-                    tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-                    tm_pointer->TM_string[2] = 0x01;
-                    tm_pointer->TM_string[3] = ACKCODE; //ackcode to be decided
-                    tm_pointer->TM_string[4] = 0x01;
-                    for(uint8_t i=0;i<6;i++)
-                    {
-                        tm_pointer->TM_string[i+5] = 0;
-                    }
-                    crc16 = crc16_gen(tm_ptr->TM_string,11);
-                    tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                    tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-                    tm_pointer->next_TM = NULL;                 return tm_ptr;
-                    break;
+                    gPC.printf("ILLEGAL TC"); 
+                    ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+                    return tm_ptr_short;                    
                 }
             }
         }
         case 3:
         {
-            #if DEBUG
-            gPC.printf("Telecommand is for PL\r\n");
-            #endif
-            received = 0;
-
-            if(GETservice_subtype(tc_ptr) == 0xD0 || GETservice_subtype(tc_ptr) == 0xD2 || GETservice_subtype(tc_ptr) == 0xD3)
-            {
-                PL_TM_SIZE = TM_LONG_SIZE;
-            }
-            else
-            {
-                PL_TM_SIZE = TM_LONG_SIZE;
-            }   
-                
+            //#if DEBUG
+            gPC.printf("\n\rTelecommand is for PL\r\n");
+            //#endif
             if(GETshort_or_long_tc(tc_ptr) == LONG_TC_CODE)
-                FCTN_I2C_WRITE_PL((char*)tc_ptr->TC_string,TC_LONG_SIZE);
-            else 
-            {
-                FCTN_I2C_WRITE_PL((char*)tc_ptr->TC_string,TC_SHORT_SIZE);
-            }
-            
-            
-            while(1)
-            {
-                if(PYLD_I2C_Int == 1)
-                {
-                    
-                    //printf("receiving...\r\n");
-                    FCTN_I2C_READ_PL((char*)tm_pointer->TM_string,134);
-                    gPC.printf("%s", tm_pointer->TM_string);
-                    received+=1;
-                    break; //only for testing purpose
-                }
-            }
-            if(received < 1 )
+                y=FCTN_I2C_WRITE_PL((char*)tc_ptr->TC_string,TC_LONG_SIZE);
+            else if(GETshort_or_long_tc(tc_ptr) == SHORT_TC_CODE)
+                y=FCTN_I2C_WRITE_PL((char*)tc_ptr->TC_string,TC_SHORT_SIZE);
+                
+            if(y==1)                                                            
+            {                                                                               
+                ACK_L234(tm_ptr_short,0x03,GETpacket_seq_count(tc_ptr));
+                return tm_ptr_short;
+                break;
+            }                                  
+            else if(y==0)
             {
-                gPC.printf("Telemetry is not received from BAE\r\n");
-                tm_pointer = new Short_tm;
-                tm_pointer->TM_string[0] = 0xB0;
-                tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);
-                tm_pointer->TM_string[2] = 0x00;
-                tm_pointer->TM_string[3] = 0x00; //ackcode to be decided
-                tm_pointer->TM_string[4] = 0x00;
-                for(uint8_t i=0;i<6;i++)
+                //wait(0.2);
+                uint8_t poll=0;
+                while(poll<60 && PL_I2C_Intr==0)
+                {
+                    wait_ms(50);
+                    poll+=1;
+                }    
+                if(PL_I2C_Intr == 1)                                            //name to be changed later
                 {
-                    tm_pointer->TM_string[i+5] = 0;
+                    gPC.printf("PL_I2C_Intr is high\r\n");
+                    
+                    y=FCTN_I2C_READ_PL((char*)tm_pointer->TM_string,TM_LONG_SIZE);            //rify later about the size
+                    if(y==0)
+                    {
+                        tm_pointer->next_TM=NULL;
+                        return tm_ptr;
+                        break;  
+                    }
+                    else if(y==1)
+                    {
+                        ACK_L234(tm_ptr_short,0x85,GETpacket_seq_count(tc_ptr));                
+                        //gPC.printf("\n\rPTE->PDIR = 0x%08X",PTE->PDIR);
+                        return tm_ptr_short;
+                        break;  
+                    }
                 }
-                crc16 = crc16_gen(tm_ptr->TM_string,11);
-                tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-                tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-            }
-            tm_pointer->next_TM = NULL;                 return tm_ptr;          
-            break;
+                else if(PL_I2C_Intr == 0)                                       //name to be changed later
+                {
+                    gPC.printf("PL_I2C_Intr is not high\r\n");                    
+                    ACK_L234(tm_ptr_short,0x84,GETpacket_seq_count(tc_ptr));
+                    return tm_ptr_short;
+                }
+            }                             
         }
-        default: //invalid TC
+        default:    //invalid TC
         {
-            //printf("INVALID TC\r\n");
-            //tm_pointer = new Short_tm; 
-            tm_pointer->TM_string[0] = 0xB0; 
-            tm_pointer->TM_string[1] = GETpacket_seq_count(tc_ptr);                                    
-            tm_pointer->TM_string[2] = 0x01;
-            tm_pointer->TM_string[3] = ACKCODE; //ackcode to be decided
-            tm_pointer->TM_string[4] = 0x01;
-            for(uint8_t i=0;i<6;i++)
-            {
-                tm_pointer->TM_string[i+5] = 0;
-            }
-            crc16 = crc16_gen(tm_ptr->TM_string,11);
-            tm_pointer->TM_string[11] = (uint8_t)((crc16&0xFF00)>>8);
-            tm_pointer->TM_string[12] = (uint8_t)(crc16&0x00FF);
-            tm_pointer->next_TM = NULL;                 return tm_ptr;
-            break;
+            gPC.printf("INVALID TC\r\n");                 
+            ACK_L234(tm_ptr_short,0x02,GETpacket_seq_count(tc_ptr));
+            return tm_ptr_short;
         }
-     }
+    }
+    return;
 }
 // CDMS TEAM CODE END
 // EXECUTE OBOSC
 #define execute_obosc_core(tc_ptr, tm_ptr, reset_flag) {\
+    if (DEBUG)\
+        gPC.puts("Inside execute_obosc_core\r\n");\
     uint8_t service_subtype = (tc_ptr->TC_string[2]) & 0x0F;\
     uint8_t temp8 = 0x00;\
     Base_tc *modify_this = gHEAD_NODE_TCL;\
@@ -891,7 +974,7 @@
                     ++modify_overflow;\
                 }\
                 else{\
-                    /*PENDING: RESET CDMS*/\
+                    RESET_CDMS;\
                     break;\
                 }\
             }\
@@ -914,7 +997,7 @@
                     ++modify_overflow;\
                 }\
                 else{\
-                    /*PENDING: RESET CDMS*/\
+                    RESET_CDMS;\
                     break;\
                 }\
             }\
@@ -966,7 +1049,8 @@
         /*CHANGE THE ACK CODE TO INVALID TC*/\
         ackl234new->TM_string[2] = 0xA2;\
     }\
-    /*gPC.puts("completed obosc\r\n");*/\
+    if (DEBUG)\
+        gPC.puts("completed obosc\r\n");\
 }
 
 /*tm_ptr is the next_TM of a linked list, and should have the value NULL, i.e. tm_ptr should be the next_TM pointer of thte last node */
@@ -974,6 +1058,10 @@
 
 #define EXECUTE_OBOSC_ONLY {\
     int reset_flag = 0;\
+    if (DEBUG)\
+        gPC.puts("iNSIDE EXECUTE_OBOSC_ONLY\r\n");\
+    Base_tm *obosc_tm_core = NULL;\            
+    Base_tm *obosc_tm = obosc_tm_core;\                    
     for(uint8_t execute_psc = PSC_START_VALUE ; execute_psc < gTOTAL_VALID_TC ; ++execute_psc){\
         Base_tc* current_TC = gHEAD_NODE_TCL;\
         int overCount = 0;\
@@ -988,30 +1076,17 @@
                         if( (current_exec_status == TC_STATE_SUCCESSFULLY_EXECUTED) || (current_exec_status == TC_STATE_DISABLED) )\
                             break;\
                         else if( (current_exec_status == TC_STATE_UNEXECUTED) || (current_exec_status == TC_STATE_MARKED_RETRY) ){\
-                            /*gPC.printf("It is obosc: %u\r\n", execute_psc);*/\
+                            if (DEBUG)\
+                                gPC.printf("It is obosc: %u\r\n", execute_psc);\
                             /*EXECUTION OF OBOSC TC*/\
                             /*WARNING: LARGE MEMORY UTILIZATION FOR TC-LIST-REPORT */\
-                            Base_tm *obosc_tm_head = NULL;\
-                            get_call_sign(obosc_tm_head);\
-                            Base_tm *obosc_tm_core = NULL;\
                             execute_obosc_core(current_TC, obosc_tm_core, reset_flag);\
+                            Base_tm *obosc_tm_current = obosc_tm_core;\
+                            while(obosc_tm_core != NULL){\
+                               obosc_tm_core = obosc_tm_core->next_TM;\
+                            }\
                             uint16_t temp16 = TC_STATE_SUCCESSFULLY_EXECUTED;\
                             PUTexec_status(current_TC, temp16);\
-                            Base_tm *obosc_tm_current = obosc_tm_head;\
-                            get_ack_l1(obosc_tm_current->next_TM);\
-                            int overflowCountOBONLY = 0;\
-                            while( obosc_tm_current->next_TM != NULL ){\
-                                if( overflowCountOBONLY < TM_OVERFLOW_CONSTANT ){\
-                                    obosc_tm_current = obosc_tm_current->next_TM;\
-                                    ++overflowCountOBONLY;\
-                                }\
-                                else{\
-                                    /*PENDING: RESET CDMS*/\
-                                    break;\
-                                }\
-                            }\
-                            obosc_tm_current->next_TM = obosc_tm_core;\
-                            obosc_tm_current = obosc_tm_head;\
                             while( obosc_tm_current != NULL ){\
                                 int length = TM_SHORT_SIZE;\
                                 if( GETshort_or_long_tm(obosc_tm_current) == SHORT_TM_CODE ){\
@@ -1025,24 +1100,6 @@
                                 }\
                                 obosc_tm_current = obosc_tm_current->next_TM;\
                             }\
-                            /*Sending OBOSC TM to GS*/\
-                            /*snd_tm.head_pointer(obosc_tm_head);*/\
-                            /*transmit_adf;*/\
-                            /*DELETE THE TM AFTER USE*/\
-                            obosc_tm_current = obosc_tm_head;\
-                            int overCount = 0;\
-                            while( obosc_tm_current != NULL ){\
-                                if( (overCount < TM_OVERFLOW_CONSTANT) ){\
-                                    Base_tm *temp = obosc_tm_current->next_TM;\
-                                    delete obosc_tm_current;\
-                                    obosc_tm_current = temp;\
-                                    ++overCount;\
-                                }\
-                                else{\
-                                    /*PENDING: RESET CDMS: MEMORY LEAK FOUND*/\
-                                    break;\
-                                }\
-                            }\
                             if ( reset_flag ==1 ){\
                                 reset_all;\
                             }\
@@ -1058,13 +1115,52 @@
             }\
         }\
     }\
+    if(obosc_tm_core != NULL){\
+        Base_tm *obosc_tm_head = NULL;\
+        get_call_sign(obosc_tm_head);\
+        Base_tm *obosc_tm_current = obosc_tm_head;\
+        get_ack_l1(obosc_tm_current->next_TM);\
+        int overflowCountOBONLY = 0;\
+        while( obosc_tm_current->next_TM != NULL ){\
+            if( overflowCountOBONLY < TM_OVERFLOW_CONSTANT ){\
+                obosc_tm_current = obosc_tm_current->next_TM;\
+                ++overflowCountOBONLY;\
+            }\
+            else{\
+                RESET_CDMS;\
+                break;\
+            }\
+        }\
+        obosc_tm_current->next_TM = obosc_tm;\
+        /*Sending OBOSC TM to GS*/\
+        /*snd_tm.head_pointer(obosc_tm_head);*/\
+        /*transmit_adf;*/\
+        /*DELETE THE TM AFTER USE*/\
+        obosc_tm_current = obosc_tm_head;\
+        int overCount = 0;\
+        while( obosc_tm_current != NULL ){\
+            if( (overCount < TM_OVERFLOW_CONSTANT) ){\
+                Base_tm *temp = obosc_tm_current->next_TM;\
+                delete obosc_tm_current;\
+                obosc_tm_current = temp;\
+                ++overCount;\
+            }\
+            else{\
+                RESET_CDMS;\
+                break;\
+            }\
+        }\
+    }\    
 }
 
 #define EXECUTE_TC {\
     gMASTER_STATE = TCL_STATE_EXECUTING;\
+    if (DEBUG)\
+        gPC.puts("iNSIDE EXECUTE_TC\r\n");\
     /*gPC.printf("%u\r\n", gTOTAL_VALID_TC);*/\
     for(uint8_t execute_psc = PSC_START_VALUE ; execute_psc < gTOTAL_VALID_TC ; ++execute_psc ){\
-        /*gPC.printf("executing normal %u\r\n", execute_psc);*/\
+        if (DEBUG)\
+            gPC.printf("executing normal %u\r\n", execute_psc);\
         /*gLEDG = !gLEDG;*/\
         /*gLEDR = !gLEDR;*/\
         Base_tc* current_TC = gHEAD_NODE_TCL;\
@@ -1075,6 +1171,10 @@
                     uint8_t current_exec_status = GETexec_status(current_TC);\
                     if( (current_exec_status == TC_STATE_SUCCESSFULLY_EXECUTED) || (current_exec_status == TC_STATE_DISABLED) ){\
                         /*gPC.printf("disabled or completed at %u\n", execute_psc);*/\
+                        if( execute_psc == (gTOTAL_VALID_TC-1) ){\
+                            /*LAST TC IS EXECUTED*/\
+                            gMASTER_STATE = TCL_STATE_COMPLETED;\
+                        }\
                         break;\
                     }\
                     else if( (current_exec_status == TC_STATE_EXECUTION_FAILED) && (GETabort_on_nack(current_TC) == 1) ){\
@@ -1113,7 +1213,7 @@
                                 ++overflowCountExecute;\
                             }\
                             else{\
-                                /*PENDING: RESET CDMS*/\
+                                RESET_CDMS;\
                                 break;\
                             }\
                         }\
@@ -1124,7 +1224,8 @@
                         uint8_t temp81 = 0x00;\
                         isit_sdcard(current_TC, temp81);\
                         if( temp81 == 0x00 ){\
-                            /*gPC.printf("non sd card at %u\r\n", execute_psc);*/\
+                            if (DEBUG)\
+                                gPC.printf("non sd card at %u\r\n", execute_psc);\
                             /*EXECUTION OF NON SD-CARD (BOTH OBOSC and CDMS functions)*/\
                             Base_tm *tm_ptr_head = NULL;\
                             get_call_sign(tm_ptr_head);\
@@ -1165,25 +1266,6 @@
                                 /*LAST TC IS EXECUTED*/\
                                 gMASTER_STATE = TCL_STATE_COMPLETED;\
                             }\
-                            else{\
-                                uint8_t check1 = 1;\
-                                for( uint8_t test_psc = execute_psc+1 ; test_psc < gTOTAL_VALID_TC ; ++test_psc ){\
-                                    Base_tc* test_TC = gHEAD_NODE_TCL;\
-                                    while(test_TC != NULL){\
-                                        if( GETpacket_seq_count(test_TC) == test_psc ){\
-                                            uint8_t checkval;\
-                                            isit_obosc(test_TC, checkval);\
-                                            if( checkval == 0 ){\
-                                                check1 = 0;\
-                                            }\
-                                        }\
-                                        test_TC = test_TC->next_TC;\
-                                    }\
-                                }\
-                                if( check1 == 0x01 ){\
-                                    gMASTER_STATE = TCL_STATE_COMPLETED;\
-                                }\
-                            }\
                             /*update last executed L1_ack*/\
                             if( put_tm_here != NULL ){\
                                 if( GETshort_or_long_tm(put_tm_here) == SHORT_TM_CODE ){\
@@ -1209,7 +1291,7 @@
                                     ++overflowCountExecute;\
                                 }\
                                 else{\
-                                    /*PENDING: RESET CDMS*/\
+                                    RESET_CDMS;\
                                     break;\
                                 }\
                             }\
@@ -1250,13 +1332,14 @@
                                     ++overflowCountExecute;\
                                 }\
                                 else{\
-                                    /*PENDING: RESET CDMS*/\
+                                    RESET_CDMS;\
                                     break;\
                                 }\ 
                             }\
                         }\
                         else{\
-                            /*gPC.printf("sd card at %u\r\n", execute_psc);*/\
+                            if (DEBUG)\
+                                gPC.printf("sd card at %u\r\n", execute_psc);\
                             /*EXECUTION OF SD-CARD DATA SENDING (OBSRS)*/\
                             Base_tm *tm_ptr_head = NULL;\
                             get_call_sign(tm_ptr_head);\
@@ -1264,9 +1347,9 @@
                             /*execute_obsrs(current_TC, put_tm_here)*/\
                             /*read_TC(current_TC);*/\
                             execute_OBSRS_TC(current_TC);\
-                            gPC.puts("enter_adf\r\n");\
+                            gPC.puts("en_adf");\
                             transmit_adf;\
-                            gPC.puts("exit_adf\r\n");\
+                            gPC.puts("ex_adf");\
                             uint8_t tempExec = TC_STATE_SUCCESSFULLY_EXECUTED;\
                             PUTexec_status(current_TC, tempExec);\
                             /*PENDING: ABORT ON NACK CHECK, gMASTER_STATE VERIFICATION WITH SD CARD, session timeout, last executed ack l234*/\
@@ -1320,7 +1403,7 @@
                                     ++overflowCountExecute;\
                                 }\
                                 else{\
-                                    /*PENDING: RESET CDMS*/\
+                                    RESET_CDMS;\
                                     break;\
                                 }\
                             }\
@@ -1348,7 +1431,7 @@
                             }\
                             /*SEND call sign, ACK_L1, OBSRS TO GS*/\
                             /*snd_tm.head_pointer(tm_ptr_head);*/\
-                            /*adf_SDcard();*/\
+                            /*transmit_adf;*/\
                             /*DELETE THE TM AFTER USE*/\
                             tm_ptr = tm_ptr_head;\
                             overflowCountExecute = 0;\
@@ -1360,7 +1443,7 @@
                                     ++overflowCountExecute;\
                                 }\
                                 else{\
-                                    /*PENDING: RESET CDMS*/\
+                                    RESET_CDMS;\
                                     break;\
                                 }\
                             }\
@@ -1372,7 +1455,7 @@
                 ++overflowCount;\
             }\
             else{\
-                /*PENDING: RESET CDMS*/\
+                RESET_CDMS;\
                 break;\
             }\
         }\
@@ -1380,9 +1463,10 @@
             break;\
         }\
         else if( gMASTER_STATE == TCL_STATE_ABORTED ){\
-            /*gPC.puts("ABORTING DUE TO ABORT ON NACK\r\n");*/\
+            if (DEBUG)\
+                gPC.puts("ABORTING DUE TO ABORT ON NACK\r\n");\
             /*EXITED DUE TO ABORT ON NACK:*/\
-            /*PENDING : POWER OFF COM TX*/\
+            /*COM_TX_CNTRL = 0;*/\
             RX1M.attach(&rx_read, Serial::RxIrq);\
             gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);\
             break;\
@@ -1390,23 +1474,25 @@
         else if( gFLAGS & COM_PA_HOT_FLAG ){\
             /*PA HOT: WAIT FOR TIMEOUT*/\
             gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT);\
-            /*PENDING : POWER OFF COMM TX*/\
+            /*COM_TX_CNTRL = 0;*/\
             RX1M.attach(&rx_read, Serial::RxIrq);\
             gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);\
             break;\
         }\
-        /*gPC.printf("successflly executed %u tc\r\n", execute_psc);*/\
+        if (DEBUG)\
+            gPC.printf("successflly executed %u tc\r\n", execute_psc);\
     }\
     if( (gMASTER_STATE == TCL_STATE_COMPLETED) || (gFLAGS & COM_SESSION_TIMEOUT_FLAG) ){\
-        /*gPC.printf("completed or session timed out: %x\r\n", gMASTER_STATE);*/\
+        if (DEBUG)\
+            gPC.printf("completed or session timed out: %x\r\n", gMASTER_STATE);\
         /*COMPLETED EXECUTION OF TC*/\
         gMASTER_STATE = TCL_STATE_COMPLETED;\
-        COM_POWER_OFF_TX;\
+        /*COM_POWER_OFF_TX;*/\
         reset_all;\
         /*PENDING : ENABLE THREADS*/\
+        gPAY_SPI.bulkRead_start();\
         gSESSION_TIMEOUT.detach();\
         gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);\
         gFLAGS = gFLAGS & (~COM_SESSION_FLAG);\
-        gPC.puts("end\r\n");\
     }\
 }
\ No newline at end of file