Compression code changed and RLY_TMTC pointers managed

Dependencies:   FreescaleIAP SimpleDMA mbed-rtos mbed

Fork of CDMS_CODE by shubham c

Files at this revision

API Documentation at this revision

Comitter:
ee12b079
Date:
Sat Jul 02 15:28:21 2016 +0000
Parent:
209:63e9c8f8b5d2
Child:
213:867de6d350fa
Child:
214:6848a51af734
Child:
224:3ac1f91e0ebc
Commit message:
Merged , giving error : reset_cdms to be checked

Changed in this revision

CDMS_HK.h Show annotated file Show diff for this revision Revisions of this file
CDMS_PL.h Show annotated file Show diff for this revision Revisions of this file
COM_MNG_TMTC.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/CDMS_HK.h	Sat Jul 02 14:54:52 2016 +0000
+++ b/CDMS_HK.h	Sat Jul 02 15:28:21 2016 +0000
@@ -1,17 +1,31 @@
-//#include "cdms_rtc.h"
-#include "pinconfig.h"
+
+//CDMS HK
+    #define COMRX_ALIVE 0xFF
+    #define COMRX_DEAD 0x00
+    #define DEVICE_ENABLED 0x00
+    #define DEVICE_POWERED 0x01
+    #define DEVICE_OC_FAULT 0x02
+    #define DEVICE_DISABLED 0x03
 
 void FCTN_CDMS_HK_MAIN();
 void FCTN_CDMS_HK();
-//extern uint8_t CDMS_HK_STATUS;
-//extern uint8_t Power_level;
-//extern uint8_t Att_level;
-//extern char CDMS_HK[8];
+void VERIFY_COMRX();
+void VERIFY_RTC();
+void CDMS_HK_SD();
+void HANDLE_HW_FAULTS();
+void HANDLE_HW_FAULT_SD();
+void HANDLE_HW_FAULT_BAE();
+void HANDLE_HW_FAULT_PL();
+void FUNC_CDMS_GPIO_STATUS();
+void minMaxHkData();
+void COLLECT_CDMS_RAM();
 
 Serial hk_cdms(USBTX, USBRX);
 
-AnalogIn TempInput(PIN27); // Input from Current Multiplexer
+AnalogIn TempInput(PIN27);          // Input from Current Multiplexer
 AnalogIn CDMS_temp_sensor(PIN53);
+AnalogIn COMRX_RSSI_volatge(PIN70);
+
 
 DigitalOut SelectLinec3 (PIN79); // MSB of Select Lines
 DigitalOut SelectLinec2 (PIN78);
@@ -20,74 +34,121 @@
 
 void FCTN_CDMS_HK_MAIN(void const *args)
 {
-//    CDMS_HK_STATUS=(CDMS_HK_STATUS)|(HK_MAIN_STATUS);
-    FCTN_CDMS_HK;
-    hk_cdms.printf(" \r\nCDMS HK entered Verify COM RX RSSI >0.4 \r\n");
-   
-    int HK_I2C;
-    char BAE_HK[74];
-    FCTN_I2C_READ(BAE_HK,74);
-    printf("BAE_HK=%s",BAE_HK);
-    /*if(HK_I2C==0)
-    {
-        if(Power_level!=0)
-        {
-            printf("Update Power_level to 0 in Flash");
-        }
-        Att_level=0;
-        CDMS_HK_STATUS=(CDMS_HK_STATUS)|(HK_BAE_ERR_I2C);
-        CDMS_HK_STATUS=(CDMS_HK_STATUS)&(~(HK_MAIN_STATUS));
-    }**/
-        uint8_t CDMS_quant[17];
-        // printf("BAE HK is %s",BAE_HK);
-        for(int i=0;i<16;i++)
-        {
-           CDMS_quant[i]= (uint8_t)quant_data.temp_quant[i];
-        }
-        CDMS_quant[16]= (uint8_t)quant_data.CDMS_temp_quant;
-        uint64_t time=0x00;//replace with rtc function
-        char tree[61];
-        hk_cdms.printf("i am done\r\n");
-        uint8_t data[512];
-        for(int i=0;i<512;i++)
-        {
-            data[i]=0x00;
-        }
-        tree[0]=(char)(time>>(56))&(0xFF);
-        tree[1]=(char)(time>>(48))&(0xFF);
-        tree[2]=(char)(time>>(40))&(0xFF);
-        tree[3]=(char)(time>>(32))&(0xFF);
-        tree[4]=(char)(time>>(24))&(0xFF);
-        tree[5]=(char)(time>>(16))&(0xFF);
-        tree[6]=(char)(time>>(8))&(0xFF);
-        tree[7]=(char)(time)&(0xFF);
-        for(int i=0;i<73;i++)
-        {
-            tree[i+8]=BAE_HK[i];
-        }
-        printf("Hope u r alive \r\n");
-        for(int i=0;i<81;i++)
-        {
-            data[i]=(uint8_t)tree[i];
-        }
-        for(int i=81;i<98;i++)
-        {
-            data[i]=CDMS_quant[i];
-        }
-        for(int i=0;i<512;i++)
-        {
-            printf("%d",data[i]);
-        }
-        //uint8_t fsc=FCTN_SD_MNGR(0x3);
-        //printf("FSC where SD is written is %d\r\n",fsc);
-        //int a=SD_WRITE(data,0x00000012,0x3);
-        //printf("Result of writing is %d \r\n",a);
-        //BCN long frame ???
-        //CDMS_HK_STATUS=(CDMS_HK_STATUS)&(~(HK_MAIN_STATUS));
-        hk_cdms.printf("CDMS executed succesfully\r\n");
-}
+
+  unsigned char CDMS_HK_FRAME[134] = {0};
+  char BAE_HK[128] = {0};
+  uint8_t convoluted_CDMS_HK[270];
+  uint8_t interleave_CDMS_HK[288];
+  uint8_t CDMS_HEALTH_FINAL[512] = {0};
+  uint8_t convoluted_BAE_HK[270];
+  uint8_t interleave_BAE_HK[288];
+  uint8_t BAE_HEALTH_FINAL[512] = {0};
+  unsigned char BAE_HK_FRAME[134] = {0};
+
+  CDMS_HK_MAIN_STATUS = 0x01;
+  CDMS_HK_MAIN_COUNTER++;
+
+  FCTN_CDMS_HK();
+  RSSI_volatge = COMRX_RSSI_volatge.read() * 3.3;
+  VERIFY_COMRX();
+  VERIFY_RTC();
+  HANDLE_HW_FAULTS();
+  FUNC_CDMS_GPIO_STATUS(); //yet to be done
+
+  uint8_t CDMS_quant[19];
+  for(int i=0;i<16;i++)
+  {
+     CDMS_quant[i]= (uint8_t)quant_data.temp_quant[i];
+  }
+  CDMS_quant[16]= (uint8_t)RSSI_volatge;
+  CDMS_quant[17]= (uint8_t)quant_data.CDMS_temp_quant;
+  minMaxHkData();
+  
+  uint64_t time = FCTN_CDMS_RD_RTC();             //Reading Time from RTC 
+  time = time>>7;
+  uint32_t HK_time = (uint32_t)time;
+  for(int i = 0;i<4;i++)
+    CDMS_HEALTH_DATA[i] = HK_time >> i;
+
+  // Here: Have to FIT flash data.
+  for(int i = 0;i<19;i++)                         //Collecting Data from Temp sensors
+    CDMS_HEALTH_DATA[i+24] = CDMS_quant[i];
+  
+  COLLECT_CDMS_RAM();                             //Reading RAM parameters
+  
+  CDMS_HEALTH_DATA[126] = GPIO_STATUS;            //Reading GPIO Pins
+  CDMS_HEALTH_DATA[127] = GPIO_STATUS >> 8;
+ 
+  FCTN_SD_MNGR();                                 //Adding FSC & TMID to TM frame
+  CDMS_HK_FRAME[0] = 0x20;
+  CDMS_HK_FRAME[1] = FSC_CURRENT[4]+1;
+  CDMS_HK_FRAME[2] = (FSC_CURRENT[4]+1) >> 8;
+  CDMS_HK_FRAME[3] = (FSC_CURRENT[4]+1) >> 16;
+  
+  for(int i = 0;i<128;i++)                         /*Adding actual CDMS Health data to TM frame*/
+    CDMS_HK_FRAME[4+i] = CDMS_HEALTH_DATA[i];
+  
+  uint16_t crc = crc16_gen(CDMS_HK_FRAME,132);      /*Adding CRC to TM frame*/
+  CDMS_HK_FRAME[133] = crc;
+  CDMS_HK_FRAME[132] = crc >> 8;
+
+  Convolution CDMS_HEALTH;
+  Convolution BAE_HEALTH;
+  CDMS_HEALTH.convolutionEncode(CDMS_HK_FRAME , convoluted_CDMS_HK);
+  CDMS_HEALTH.convolutionEncode(CDMS_HK_FRAME + 67, convoluted_CDMS_HK + 135);
+  interleave(convoluted_CDMS_HK ,  interleave_CDMS_HK);
+  interleave(convoluted_CDMS_HK +135, interleave_CDMS_HK + 144);
+  for(int i=0;i<288;i++)
+    CDMS_HEALTH_FINAL[i] = interleave_CDMS_HK[i];
+
+  SD_WRITE(CDMS_HEALTH_FINAL,FSC_CURRENT[4]+1,4);
+  hk_cdms.printf("CDMS hk succesfully completed\r\n");
 
 
+/*---------------------------------- BAE HK --------------------------------------------*/
+  
+  
+  BAE_HK_I2C = FCTN_I2C_READ(BAE_HK,134);
+  if(BAE_HK_I2C == 0){
+    TIME_LATEST_I2C_BAE = FCTN_CDMS_RD_RTC() >> 7;
+    hk_cdms.printf("Bae hk data received");
+  }
+  else
+  {
+    for(int i = 0;i<128;i++)
+      BAE_HK[i] = 0;
+  }
+  for(int i = 0;i<4;i++)
+    BAE_HK[i] = HK_time >> i;
+  BAE_HK_FRAME[0] = 0x28;
+  BAE_HK_FRAME[1] = FSC_CURRENT[5]+1;
+  BAE_HK_FRAME[2] = (FSC_CURRENT[5]+1) >> 8;
+  BAE_HK_FRAME[3] = (FSC_CURRENT[5]+1) >> 16;
+  for(int i = 0;i<128;i++)                         /*Adding actual CDMS Health data to TM frame*/
+    BAE_HK_FRAME[4+i] = BAE_HK[i];
+  crc = crc16_gen(BAE_HK_FRAME,132);               /*Adding CRC to TM frame*/
+  BAE_HK_FRAME[133] = crc;
+  BAE_HK_FRAME[132] = crc >> 8;
+  BAE_HEALTH.convolutionEncode(BAE_HK_FRAME , convoluted_BAE_HK);
+  BAE_HEALTH.convolutionEncode(BAE_HK_FRAME + 67, convoluted_BAE_HK + 135);
+  interleave(convoluted_BAE_HK ,  interleave_BAE_HK);
+  interleave(convoluted_BAE_HK +135, interleave_BAE_HK + 144);
+  for(int i=0;i<288;i++)
+  BAE_HEALTH_FINAL[i] = interleave_BAE_HK[i];
+  SD_WRITE(BAE_HEALTH_FINAL,FSC_CURRENT[5]+1,5);
+  hk_cdms.printf("BAE hk succesfully completed\r\n");
+  
+  /*----------------------------------Beacon message--------------------------------------*/
+  unsigned char SC_HK_LBM_0[135];
+  SC_HK_LBM_0[0] = 0;       // Sending long beacon msg as telecommand with Packet sequence count 0x00
+  // Add HK bits
+  
+  // Add SC bits
+  crc = crc16_gen(SC_HK_LBM_0,133);
+  SC_HK_LBM_0[132] = crc;
+  SC_HK_LBM_0[133] = crc >> 8;
+  FCTN_I2C_WRITE((char *)SC_HK_LBM_0,135);
+}
 
 int quantiz(float start,float step,float x)
 {
@@ -97,24 +158,18 @@
     return y;
 }
 
-
-
-void saveMin(char x,char y){
-    if(y<x){
-        x=y;
-    }
-
+char saveMin(char x,char y)
+{
+    return (y<x)?y:x;
 }
-void saveMax(char x,char y){
-    if (y>x)
-    {
-       x=y;
-    }
+
+char saveMax(char x,char y)
+{
+    return (y>x)?y:x;
 }
-void minMaxHkData(){
-   
-  
-   
+
+void minMaxHkData()
+{  
     if(firstCount==true){
         for (int i = 0; i < 16; ++i){   
         min_max_data.temp_min[i] = quant_data.temp_quant[i];
@@ -123,20 +178,16 @@
 
         min_max_data.CDMS_temp_min=quant_data.CDMS_temp_quant;
         min_max_data.CDMS_temp_max=quant_data.CDMS_temp_quant;
-   
-      
     }
     else {
         for (int i = 0; i < 16; ++i)
         {
-            saveMin(min_max_data.temp_min[i],quant_data.temp_quant[i]);
-            saveMax(min_max_data.temp_max[i],quant_data.temp_quant[i]);
+          min_max_data.temp_min[i] = saveMin(min_max_data.temp_min[i],quant_data.temp_quant[i]);
+          min_max_data.temp_max[i] = saveMax(min_max_data.temp_max[i],quant_data.temp_quant[i]);
         }
                
-        saveMin(min_max_data.CDMS_temp_min,quant_data.CDMS_temp_quant);
-        saveMax(min_max_data.CDMS_temp_max,quant_data.CDMS_temp_quant);
-           
-       
+        min_max_data.CDMS_temp_min = saveMin(min_max_data.CDMS_temp_min,quant_data.CDMS_temp_quant);
+        min_max_data.CDMS_temp_max = saveMax(min_max_data.CDMS_temp_max,quant_data.CDMS_temp_quant);
     }  
     firstCount=false;
 }
@@ -164,7 +215,7 @@
              SelectLinec3=!(SelectLinec3);
     }
 
-actual_data.CDMS_temp_actual=(-90.7*3.3*CDMS_temp_sensor.read())+190.1543;
+    actual_data.CDMS_temp_actual=(-90.7*3.3*CDMS_temp_sensor.read())+190.1543;
    
     for(Iteration=0;Iteration<16;Iteration++){
 
@@ -200,4 +251,215 @@
     quant_data.CDMS_temp_quant=quantiz(tstart,tstep,actual_data.CDMS_temp_actual);
 
     minMaxHkData();
+}
+
+void FUNC_CDMS_GPIO_STATUS()       //Polls the status of Input GPIO PINS
+{
+  //V_A_PGOOD //TRZ EN
+  GPIO_STATUS=(V_A_PGOOD)?(GPIO_STATUS)||((uint16_t)(0x1<<15)):(GPIO_STATUS)&(~((uint16_t)(0x1<<15)));
+  //V_B_PGOOD_1 //3V3BPGOOD //$
+  GPIO_STATUS=(V_B_PGOOD_1)?(GPIO_STATUS)||((uint16_t)(0x1<<14)):(GPIO_STATUS)&(~((uint16_t)(0x1<<14)));
+  //V_B_PGOOD_2 //3V3BEN //$
+  GPIO_STATUS=(V_B_PGOOD_2)?(GPIO_STATUS)||((uint16_t)(0x1<<13)):(GPIO_STATUS)&(~((uint16_t)(0x1<<13)));
+  //V_C_PGOOD //3V3CPGOOD //$
+  GPIO_STATUS=(V_C_PGOOD)?(GPIO_STATUS)||((uint16_t)(0x1<<12)):(GPIO_STATUS)&(~((uint16_t)(0x1<<12)));
+  //COMRX_OC_FAULT //$
+  GPIO_STATUS=(COMRX_OC_FAULT)?(GPIO_STATUS)||((uint16_t)(0x1<<11)):(GPIO_STATUS)&(~((uint16_t)(0x1<<11)));
+  // COMTX_OC_FAULT //$
+  GPIO_STATUS=(COMTX_OC_FAULT)?(GPIO_STATUS)||((uint16_t)(0x1<<10)):(GPIO_STATUS)&(~((uint16_t)(0x1<<10)));
+  //BAE_OC_FAULT //$
+  GPIO_STATUS=(BAE_OC_FAULT)?(GPIO_STATUS)||((uint16_t)(0x1<<9)):(GPIO_STATUS)&(~((uint16_t)(0x1<<9)));
+  //PL_GPIO_1_STATUS //$
+  GPIO_STATUS=(PL_GPIO_1_STATUS)?(GPIO_STATUS)||((uint16_t)(0x1<<8)):(GPIO_STATUS)&(~((uint16_t)(0x1<<8)));
+  //PL_GPIO_2_STATUS //$
+  GPIO_STATUS=(PL_GPIO_2_STATUS)?(GPIO_STATUS)||((uint16_t)(0x1<<7)):(GPIO_STATUS)&(~((uint16_t)(0x1<<7)));
+  //PL_GPIO_3_STATUS //$
+  GPIO_STATUS=(PL_GPIO_3_STATUS)?(GPIO_STATUS)||((uint16_t)(0x1<<6)):(GPIO_STATUS)&(~((uint16_t)(0x1<<6)));
+  //PL_BEE_SW_OC_FAULT //to be verified
+  GPIO_STATUS=(PL_BEE_SW_OC_FAULT)?(GPIO_STATUS)||((uint16_t)(0x1<<5)):(GPIO_STATUS)&(~((uint16_t)(0x1<<5)));
+  //PL_EPS_LATCH_SW_OC_FAULT // to be verified
+  GPIO_STATUS=(PL_EPS_LATCH_SW_OC_FAULT)?(GPIO_STATUS)||((uint16_t)(0x1<<4)):(GPIO_STATUS)&(~((uint16_t)(0x1<<4)));
+
+}
+
+void VERIFY_COMRX()
+{
+  //COMRX_OC_FAULT //$
+  if(PIN68==0 && RSSI_volatge > 0.4)
+  {
+    COMRX_STATUS = COMRX_ALIVE;
+  }
+  else
+  {
+    RESET_COMRX();
+    COMRX_RESET_COUNTER++;
+    if(PIN68==0 && RSSI_volatge > 0.4)
+      COMRX_STATUS = COMRX_ALIVE;
+    else
+      COMRX_STATUS = COMRX_DEAD;
+  }
+}
+
+void VERIFY_RTC(){
+
+  if(RTC_STATUS == 0x00)
+  {
+    SPI_mutex.lock();
+    gCS_RTC=1; 
+    gCS_RTC=0;
+    spi.write(0x0F);
+    if(spi.write(0x00) & 0x04 == 0x04)
+    {
+      RTC_STATUS = 0x00;
+      RESET_RTC();
+      RTC_FAULTCOUNT++;
+    }
+    gCS_RTC=1; 
+    SPI_mutex.unlock();
+  }
+}
+
+void HANDLE_HW_FAULTS()
+{
+  HANDLE_HW_FAULT_SD();
+  HANDLE_HW_FAULT_BAE();
+  HANDLE_HW_FAULT_PL();
+}
+
+void HANDLE_HW_FAULT_SD()
+{
+  if(SD_STATUS != DEVICE_DISABLED)
+  {
+    if(SD_STATUS == DEVICE_OC_FAULT)
+      SD_SW_EN_DS = 0; //powering on SD
+
+    if(SD_OC_FAULT == 0) 
+    {
+      SD_SW_EN_DS = 1; //switching off SD card
+     
+      SD_FAULTCOUNT++;
+      SD_STATUS = (SD_FAULTCOUNT == 3) ? DEVICE_DISABLED :DEVICE_OC_FAULT;
+    }
+    else
+    {
+      SD_STATUS = DEVICE_POWERED;
+      SD_FAULTCOUNT = 0;
+    }
+  }
+}
+
+void HANDLE_HW_FAULT_BAE()
+{
+  if(BAE_STATUS != DEVICE_DISABLED)
+  {
+    if(BAE_STATUS == DEVICE_OC_FAULT)
+        BAE_SW_EN_DS = 0; //Power ON BAE
+
+    if(BAE_OC_FAULT == 0)  // If OC Fault
+    {
+      BAE_SW_EN_DS = 1; //Switch OFF BAE
+      BAE_FAULTCOUNT++;
+      BAE_STATUS = (BAE_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
+    }
+    else
+    {
+      BAE_STATUS = DEVICE_POWERED;
+      BAE_FAULTCOUNT = 0;
+    }
+  }
+}
+
+void HANDLE_HW_FAULT_PL()
+{
+  if(PL_STATUS != DEVICE_DISABLED)
+  {
+    if(PL_STATUS == DEVICE_OC_FAULT)
+      PL_SW_EN_DS = 0; //Power ON PL
+
+    if(PL_BEE_SW_OC_FAULT == 0)  // if OC Fault
+    {
+      PL_SW_EN_DS = 1;  // switching OFF PL
+      PL_FAULTCOUNT++;
+      PL_STATUS = (PL_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
+    }
+    else
+    {
+      if(PL_STATUS == DEVICE_OC_FAULT)
+        PL_SW_EN_DS = 0; //Switching OFF PL
+      PL_STATUS = DEVICE_ENABLED;
+      PL_FAULTCOUNT = 0;
+    }
+  }
+}
+  
+void COLLECT_CDMS_RAM()
+{ 
+  /*--------------------Current FSC's---------------------*/
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+43] = FSC_LAST[5] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+47] = FSC_CURRENT[5] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+51] = FSC_LAST[4] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+55] = FSC_CURRENT[4] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+59] = FSC_LAST[3] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+63] = FSC_CURRENT[3] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+67] = FSC_LAST[2] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+71] = FSC_CURRENT[2] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+75] = FSC_LAST[1] >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+79] = FSC_CURRENT[1] >> (i*8);
+  /*---------------------Latest Time----------------------*/
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+83] = TIME_LATEST_SPI_SPEED >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+87] = TIME_LATEST_SD_RD >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+91] = TIME_LATEST_SD_WR >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+95] = TIME_LATEST_I2C_SPEED >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+99] = TIME_LATEST_I2C_BAE >> (i*8);
+  for(int i=0;i<4;i++)
+    CDMS_HEALTH_DATA[i+103] = TIME_LATEST_RTC >> (i*8);
+  for(int i=0;i<2;i++)
+    CDMS_HEALTH_DATA[i+107] = COMRX_RESET_COUNTER >> (i*8);
+  for(int i=0;i<2;i++)
+    CDMS_HEALTH_DATA[i+107] = PL_RCV_SC_DATA_COUNTER >> (i*8);
+  for(int i=0;i<2;i++)
+    CDMS_HEALTH_DATA[i+111] = PL_MAIN_COUNTER >> (i*8);
+  for(int i=0;i<2;i++)
+    CDMS_HEALTH_DATA[i+113] = CDMS_HK_MAIN_COUNTER >> (i*8);
+  for(int i=0;i<2;i++)
+    CDMS_HEALTH_DATA[i+115] = CDMS_I2C_ERR_BAE_COUNTER >> (i*8);
+  for(int i=0;i<2;i++)
+    CDMS_HEALTH_DATA[i+117] = CDMS_I2C_ERR_SPEED_COUNTER >> (i*8);
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] | CDMS_STANDBY_PL << 7;
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] | ((CDMS_INIT_STATUS << 6) & 0x40);
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] | ((CDMS_HK_MAIN_STATUS << 5) & 0x20);
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] | ((CDMS_HK_STATUS << 3) & 0x18);
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] | ((COMRX_STATUS << 2) & 0x04);
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] | ((CDMS_RTC_BL << 1) & 0x02);
+  CDMS_HEALTH_DATA[120] = CDMS_HEALTH_DATA[120] & 0xFE;
+  
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | PL_RCV_SC_DATA_STATUS << 7;
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | ((COM_SESSION << 6) & 0x40);
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | ((COM_RX << 5) & 0x20);
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | ((RF_SW_STATUS << 4) & 0x10);
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | ((COM_TX << 3) & 0x08);
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | ((COM_TX_STATUS << 2) & 0x04);
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | ((COM_MNG_TMTC << 1) & 0x02);
+  CDMS_HEALTH_DATA[121] = CDMS_HEALTH_DATA[121] | (CDMS_STANDBY_HK & 0x01);
+
+  CDMS_HEALTH_DATA[122] = CDMS_HEALTH_DATA[122] | PL_INIT_STATUS << 7;
+  CDMS_HEALTH_DATA[122] = CDMS_HEALTH_DATA[122] | ((PL_MAIN_STATUS << 6) & 0x40);
+  CDMS_HEALTH_DATA[122] = CDMS_HEALTH_DATA[122] | ((PL_LOW_POWER << 5) & 0x20);
+  CDMS_HEALTH_DATA[122] = CDMS_HEALTH_DATA[122] | ((PL_STATE << 3) & 0x18);
+  CDMS_HEALTH_DATA[122] = CDMS_HEALTH_DATA[122] | (PL_STATUS & 0x07);
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CDMS_PL.h	Sat Jul 02 15:28:21 2016 +0000
@@ -0,0 +1,579 @@
+int pl_next_index=-1;   
+uint8_t pl_main_flag=0;
+uint8_t PL_PREV_STATE=0x00;
+uint8_t POWER_LEVEL = 3;                                //Would be present in HK data extracted 
+uint32_t pl_block[192]={0};
+uint32_t pl_time;
+uint32_t TIME_LATEST_PL=0;
+uint8_t i;
+uint8_t PL_BEE_SW_STATUS=0;
+
+//Serial pc(USBTX,USBRX);
+
+#define PL_MAIN_STATUS              0x01
+#define PL_LOW_POWER                0x02
+#define STATE_OFF                   0x00
+#define STATE_STANDBY               0x04
+#define STATE_HIBERNATE             0x08
+#define STATE_SCIENCE               0x0C            //also used as mask for PL_STATE
+#define PL_OFF                      0x00
+#define PL_STANDBY                  0x10
+#define PL_HIBERNATE                0x20
+#define PL_SCIENCE                  0x30
+#define PL_SUCCESS_I2C              0x40
+#define PL_ERR_I2C                  0x50
+#define PL_INVALID_STATE            0x60
+#define PL_DISABLED                 0x70            //also used as mask for PL_STATUS
+#define EXECUTED                    0x00000001
+#define RETRY                       0x00000002
+#define UNEXECUTED                  0x00000003      //also used as mask for EXEC_STATUS
+
+
+DigitalOut PYLD_DFF(PIN73);
+DigitalOut PYLD_DFF_CLK(PIN65);
+DigitalOut PYLD_EPS_DFF_PWR(PIN64);
+DigitalOut PYLD_EPS_DFF_PWR_CLK(PIN40);
+Base_tm* FCTN_CDMS_RLY_TMTC(Base_tc *tc_ptr);
+
+// waiting 1us for setup time,hold time and propagation delay
+#define SET_PL_BEE_OFF {\
+    PYLD_DFF_CLK = 0;\
+    PYLD_DFF = 0;\
+    wait_us(1);\
+    PYLD_DFF_CLK = 1;\
+    wait_us(1);\
+    PYLD_DFF_CLK = 0;\
+    wait_us(1);\
+}
+#define SET_PL_BEE_ON {\
+    PYLD_DFF_CLK = 0;\
+    PYLD_DFF = 1;\
+    wait_us(1);\
+    PYLD_DFF_CLK = 1;\
+    wait_us(1);\
+    PYLD_DFF_CLK = 0;\
+    wait_us(1);\
+}
+
+//TC_string[0] should not be 0x00
+
+#define SET_PL_BEE_STANDBY(tm_ptr_standby) {\
+    Base_tc *pl_tc_standby = new Short_tc;\
+    pl_tc_standby->next_TC = NULL;\
+    PUTshort_or_long(pl_tc_standby,0);\
+    PUTcrc_pass(pl_tc_standby,0x1);\
+    PUTexec_status(pl_tc_standby,0);\
+    pl_tc_standby->TC_string[0] = 0x01;\
+    pl_tc_standby->TC_string[1] = 0xE1;\
+    pl_tc_standby->TC_string[2] = 0x81;\
+    pl_tc_standby->TC_string[3] = 0x02;\
+    pl_tc_standby->TC_string[4] = 0;\
+    pl_tc_standby->TC_string[5] = 0;\
+    pl_tc_standby->TC_string[6] = 0;\
+    pl_tc_standby->TC_string[7] = 0;\
+    pl_tc_standby->TC_string[8] = 0;\    
+    uint16_t crc16 = crc16_gen(pl_tc_standby->TC_string, 9);\
+    pl_tc_standby->TC_string[9]  = (uint8_t)(crc16 & 0xFF00)>>8;\
+    pl_tc_standby->TC_string[10] = (uint8_t)(crc16 & 0x00FF);\
+    tm_ptr_standby =  FCTN_CDMS_RLY_TMTC(pl_tc_standby);\
+    VERIFY_TM(tm_ptr_standby);\
+}
+
+//TC_string[0] should not be 0x00
+
+#define SET_PL_BEE_HIBERNATE(tm_ptr_hibernate) {\
+    Base_tc *pl_tc_hibernate = new Short_tc;\
+    pl_tc_hibernate->next_TC = NULL;\
+    PUTshort_or_long(pl_tc_hibernate,0);\
+    PUTcrc_pass(pl_tc_hibernate,0x1);\
+    PUTexec_status(pl_tc_hibernate,0);\
+    pl_tc_hibernate->TC_string[0] = 0x01;\
+    pl_tc_hibernate->TC_string[1] = 0xE1;\
+    pl_tc_hibernate->TC_string[2] = 0x81;\
+    pl_tc_hibernate->TC_string[3] = 0x03;\
+    pl_tc_hibernate->TC_string[4] = 0;\
+    pl_tc_hibernate->TC_string[5] = 0;\
+    pl_tc_hibernate->TC_string[6] = 0;\
+    pl_tc_hibernate->TC_string[7] = 0;\
+    pl_tc_hibernate->TC_string[8] = 0;\    
+    uint16_t crc16 = crc16_gen(pl_tc_hibernate->TC_string, 9);\
+    pl_tc_hibernate->TC_string[9]  = (uint8_t)(crc16 & 0xFF00)>>8;\
+    pl_tc_hibernate->TC_string[10] = (uint8_t)(crc16 & 0x00FF);\
+    tm_ptr_hibernate =  FCTN_CDMS_RLY_TMTC(pl_tc_hibernate);\
+    VERIFY_TM(tm_ptr_hibernate);\
+}
+
+//TC_string[0] should not be 0x00
+/*
+PUTshort_or_long(pl_tc_science,0);\
+    PUTcrc_pass(pl_tc_science,0x1);\
+    PUTexec_status(pl_tc_science,0);\*/
+    
+#define SET_PL_BEE_SCIENCE(tm_ptr_science) {\
+    Base_tc *pl_tc_science = new Short_tc;\
+    pl_tc_science->next_TC = NULL;\    
+    pl_tc_science->TC_string[0] = 0x01;\
+    pl_tc_science->TC_string[1] = 0xE1;\
+    pl_tc_science->TC_string[2] = 0x81;\
+    pl_tc_science->TC_string[3] = 0x04;\
+    pl_tc_science->TC_string[4] = 0;\
+    pl_tc_science->TC_string[5] = 0;\
+    pl_tc_science->TC_string[6] = 0;\
+    pl_tc_science->TC_string[7] = 0;\
+    pl_tc_science->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(pl_tc_science->TC_string, 9);\
+    pl_tc_science->TC_string[9]  = (uint8_t)(crc16 & 0xFF00)>>8;\
+    pl_tc_science->TC_string[10] = (uint8_t)(crc16 & 0x00FF);\
+    tm_ptr_science =  FCTN_CDMS_RLY_TMTC(pl_tc_science);\
+    VERIFY_TM(tm_ptr_science);\
+}
+void print_processed_block(uint8_t index)
+{
+    gPC.printf("\n\n\rBlock after processing:");
+    gPC.printf("\n\rTime of block:");
+    gPC.printf("\n\rYear :%d",((((pl_block[index]&0xFFFFFFF0)>>4) & 0x0C000000)>>26)+2016);
+    gPC.printf("\tMonth  :%d",((((pl_block[index]&0xFFFFFFF0)>>4) & 0x03C00000)>>22));
+    gPC.printf("\tDay    :%d",((((pl_block[index]&0xFFFFFFF0)>>4) & 0x003E0000)>>17));
+    gPC.printf("\n\rHours  :%d",((((pl_block[index]&0xFFFFFFF0)>>4) & 0x0001F000)>>12));
+    gPC.printf("\tMin    :%d",((((pl_block[index]&0xFFFFFFF0)>>4) & 0x00000FC0)>>6));
+    gPC.printf("\tSec    :%d",(((pl_block[index]&0xFFFFFFF0)>>4) & 0x0000003F));
+    gPC.printf("\n\rSID    :%d",(pl_block[index] & 0x0000000C)>>2);
+    gPC.printf("\tExecution Status :%d",pl_block[index] & UNEXECUTED);
+}
+void print_exit(uint8_t* temp)
+{    
+    uint8_t temp2[3];
+    temp2[0] = (pl_main_flag&STATE_SCIENCE)>>2;
+    temp2[1] = (pl_main_flag&PL_DISABLED)>>4;
+    temp2[2] = (PL_PREV_STATE & STATE_SCIENCE)>>2;
+    gPC.printf("\n\rAt exit");
+    char state[][17] = {"STATE_OFF","STATE_STANDBY","STATE_HIBERNATE","STATE_SCIENCE"};
+    char status[][17] = {"PL_OFF","PL_STANDBY","PL_HIBERNATE","PL_SCIENCE","PL_SUCCESS_I2C","PL_ERR_I2C","PL_INVALID_STATE","PL_DISABLED"};
+    gPC.printf("\n\rPL_state:%s -> %s",state[(uint8_t)temp[0]],state[(uint8_t)temp2[0]]);
+    gPC.printf("\n\rPL_status:%s -> %s",status[(uint8_t)temp[1]],status[(uint8_t)temp2[1]]);
+    gPC.printf("\n\rPL_PREV_state:%s -> %s",state[(uint8_t)temp[2]],state[(uint8_t)temp2[2]]);
+}
+void VERIFY_TM(Base_tm *tm_ptr)
+{
+    uint8_t temp = tm_ptr->TM_string[2];            //Obatining ACK_CODE
+    if(GETshort_or_long_tm(tm_ptr)==1)              //short TM
+    {
+        gPC.printf("\n\rSHORT TM received");
+        uint16_t crc16 = crc16_gen(tm_ptr->TM_string, 11);        
+        if(tm_ptr->TM_string[12]==((uint8_t)(crc16 & 0x00FF)) && tm_ptr->TM_string[11]==((uint8_t)((crc16 & 0xFF00)>>8)))        
+        {            
+            if(temp!=0x00 && temp!=0x01 && temp!=0x02 && temp!=0x03 && temp!=0x84 && temp!=0x85)
+            {
+                gPC.printf("\n\rTime_Latest_PL Updated");
+                TIME_LATEST_PL = pl_time;                  //update latest time when I2C communication was successful
+            }
+            if(temp==0xA0 || temp==0xC0)
+            {
+                gPC.printf("\n\rACK_CODE Success");
+                if(temp==0xA0)
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                else
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_SUCCESS_I2C;
+                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                pl_block[pl_next_index-1] |= EXECUTED;
+            }
+            else
+            {
+                gPC.printf("\n\rACK_CODE failure (0x%02X)",temp);
+                //gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_ERR_I2C;
+                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                pl_block[pl_next_index-1] |= RETRY;   
+            }
+        }
+        else
+        {
+            gPC.printf("\n\rShort_TM CRC failed");
+            pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+            pl_main_flag |= PL_ERR_I2C;
+            pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+            pl_block[pl_next_index-1] |= RETRY;
+        }
+    }
+    else if(GETshort_or_long_tm(tm_ptr)==0)                  //LONG TM
+    {
+        gPC.printf("\n\rLONG TM received");
+        uint16_t crc16 = crc16_gen(tm_ptr->TM_string,132);        
+        if(tm_ptr->TM_string[133]==((uint8_t)(crc16 & 0x00FF)) && tm_ptr->TM_string[132]==((uint8_t)((crc16 & 0xFF00)>>8)))        
+        {
+            if(temp!=0x00 && temp!=0x01 && temp!=0x02 && temp!=0x03 && temp!=0x84 && temp!=0x85)
+            {
+                gPC.printf("\n\rTime_Latest_PL Updated");
+                TIME_LATEST_PL = pl_time;                  //update latest time when I2C communication was successful
+            }
+            if(temp==0xA0 || temp==0xC0)
+            {
+                gPC.printf("\n\rACK_CODE Success");
+                if(temp==0xA0)
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                else
+                    gPC.printf("\n\rACK_CODE = 0x%02X",temp);
+                pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_SUCCESS_I2C;
+                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                pl_block[pl_next_index-1] |= EXECUTED;
+            }
+            else
+            {
+                gPC.printf("\n\rACK_CODE failure (0x%02X)",temp);
+                pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_ERR_I2C;
+                pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+                pl_block[pl_next_index-1] |= RETRY;   
+            }   
+        }
+        else
+        {
+            gPC.printf("\n\rLong_TM CRC failed");
+            pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+            pl_main_flag |= PL_ERR_I2C;        
+            pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+            pl_block[pl_next_index-1] |= RETRY;   
+        }
+    }    
+}
+void test1(uint8_t t)
+{
+    //Output should be PL_STATUS = PL_DISABLED
+    if(t!=0)
+    {
+        gPC.printf("\n\rTesting OC protection");
+        PL_BEE_SW_STATUS = 2;   //OC protection
+    }
+}
+void test2(uint8_t t)
+{
+    //output should be same as test1()
+    if(t!=0)    
+    {
+        gPC.printf("\n\rTesting Deviced Disabled case");
+        PL_BEE_SW_STATUS = 3;   //Device DISABLED 
+    }
+}
+void test3(uint8_t t)
+{
+    if(t!=0)
+    {
+        gPC.printf("\n\rTesting RTC failed case");
+        pl_time = 0;            //RTC failed
+    }
+}
+/*void test4(uint8_t t)
+{
+    if(t!=0)
+    {
+        gPC.printf("\n\rTesting No future blocks available");
+        schedule1[0] = {0,0,0,0,0,0,0,0};
+    }
+}*/
+void FCTN_CDMS_PL_MAIN(void const *args)
+{
+    uint8_t temp[3];
+    pl_main_flag|=PL_MAIN_STATUS;                       //Setting PL_MAIN_STATUS
+    PL_MAIN_COUNTER++;                                  
+    pl_main_flag&=~(PL_LOW_POWER);                      //Clearing PL_LOW_POWER
+    temp[0] = (pl_main_flag&STATE_SCIENCE)>>2;
+    temp[1] = (pl_main_flag&PL_DISABLED)>>4;
+    temp[2] = (PL_PREV_STATE & STATE_SCIENCE)>>2;
+    //test2(1);
+
+    if(PL_BEE_SW_STATUS==2 || PL_BEE_SW_STATUS==3)
+    {
+        gPC.printf("\n\rDevice Disabled or OC Fault");
+        pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+        pl_main_flag |= PL_DISABLED;                        //setting PL_STATUS as PL_DISABLED
+        pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);    //Clearing pl_main status
+        print_exit(temp);
+        return;
+    }
+    PL_PREV_STATE = (pl_main_flag & STATE_SCIENCE);         //saving current pl_state
+    uint64_t temp_time;
+    temp_time=FCTN_CDMS_RD_RTC();
+    pl_time = (uint32_t)((temp_time>>7) & 0x000000000FFFFFFF);
+
+    //call test3() here
+    //test3(1);
+
+    //gPC.printf("\n\rprev_state    :%d",(PL_PREV_STATE)>>4);
+    gPC.printf("\n\n\rtTime_RTC:");
+    gPC.printf("\n\rYear :%d\t",((pl_time & 0x0C000000)>>26)+2016);
+    gPC.printf("Month :%d\t",((pl_time & 0x03C00000)>>22));
+    gPC.printf("Day :%d",((pl_time & 0x003E0000)>>17));
+    gPC.printf("\n\rHours :%d",((pl_time & 0x0001F000)>>12));
+    gPC.printf("\tMin :%d",((pl_time & 0x00000FC0)>>6));
+    gPC.printf("\t\tSec :%d",(pl_time & 0x0000003F));
+    if(pl_time!=0)                             //RTC read successful 
+    {
+        // run the loop until end of schedule is reached or month and day are both zeros or future block is found
+        gPC.printf("\n\rRTC read success");
+        for(i=0;(i<192)&&(((uint16_t)((pl_block[i] & 0x3FE00000)>>21))!=0);i++)     
+        {   
+            if(((pl_block[i]>>4) & 0x0FFFFFFF)>pl_time)     //Checking for future blocks       
+            {
+                pl_next_index=i;
+                gPC.printf("\n\rFuture block found at index = %d",pl_next_index);
+                break;
+            }
+        }
+    }
+    if((pl_next_index==-1) || pl_time==0)           //RTC read failed or Future block not found
+    {       
+        if(PL_PREV_STATE==STATE_SCIENCE)
+        {
+            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+            pl_main_flag |= STATE_HIBERNATE;
+        } 
+        else
+        {                        
+            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+            pl_main_flag |= PL_PREV_STATE;
+        }        
+        if(pl_time==0)
+        {
+            gPC.printf("\n\rRTC read failed");
+        }
+        if(pl_next_index==-1)
+        {
+            gPC.printf("\n\rFuture block not found");
+            gPC.printf("\n\rpl_next_index = %d",pl_next_index);
+        }
+        gPC.printf("\n\rNew pl_state  = %d",(pl_main_flag&(~STATE_SCIENCE))>>2);
+    }           
+    
+    //Processing the PL schedule
+    if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)||((pl_block[pl_next_index-1] & UNEXECUTED)==2))
+    {        
+        if(((pl_block[pl_next_index-1] & UNEXECUTED)==3))
+            gPC.printf("\n\rElapsed blocked not executed");
+        else
+            gPC.printf("\n\rElapsed block marked for retry");
+
+        gPC.printf("\n\r Retrieving pl_state from schedule");
+        if((pl_block[pl_next_index-1] & 0x0000000C)==0)                
+        {            
+            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+            pl_main_flag |= STATE_OFF;
+        }
+        if((pl_block[pl_next_index-1] & 0x0000000C)==4)
+        {
+            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+            pl_main_flag |= STATE_STANDBY;
+        }
+        if((pl_block[pl_next_index-1] & 0x0000000C)==8)
+        {
+            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+            pl_main_flag |= STATE_HIBERNATE;
+        }
+        if((pl_block[pl_next_index-1] & 0x0000000C)==12)
+        {
+            pl_main_flag  = pl_main_flag & (~STATE_SCIENCE);
+            pl_main_flag |= STATE_SCIENCE;
+        }
+    }
+    else if((pl_block[pl_next_index-1] & UNEXECUTED)==1)
+    {
+        gPC.printf("\n\rElapsed block is executed");
+        pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                  //Clearing pl_main status
+        print_exit(temp);
+        return;   
+    }      
+    else if((pl_block[pl_next_index-1] & UNEXECUTED)==0)  
+    {
+        gPC.printf("\n\rEmpty Schedule Block");        
+        pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                  //Clearing pl_main status
+        print_exit(temp);
+        return;
+    }
+    switch(pl_main_flag & STATE_SCIENCE)                                  //Checking PL_STATE
+    {
+        case STATE_OFF: 
+        {
+            gPC.printf("\n\rEntered PL_OFF case");
+            if(PL_BEE_SW_STATUS!=0) 
+            {
+                gPC.printf("\n\rCommanding PL_BEE to go to Standby State");
+                Base_tm *tm_ptr_standby;
+                SET_PL_BEE_STANDBY(tm_ptr_standby);                             //No ack needed now
+                gPC.printf("\n\rPowering OFF PL_BEE");
+                SET_PL_BEE_OFF;
+                PL_BEE_SW_STATUS=0;    
+            }           
+            pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+            pl_main_flag |= PL_OFF;    
+            pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+            pl_block[pl_next_index-1] |= EXECUTED;                              
+            pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS);                    //Clearing PL_MAIN_STATUS
+            print_processed_block(pl_next_index-1);
+            print_exit(temp);
+            return;
+        }
+        case STATE_STANDBY: 
+        {            
+            gPC.printf("\n\rEntered PL_STANDBY case");
+            if(PL_BEE_SW_STATUS==0) 
+            {
+                gPC.printf("\n\rPowering on PL_BEE");
+                SET_PL_BEE_ON;
+                PL_BEE_SW_STATUS=1;
+            }
+            gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
+            Base_tm *tm_ptr_standby;
+            SET_PL_BEE_STANDBY(tm_ptr_standby);
+            if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+            {
+                pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                pl_main_flag |= PL_STANDBY; 
+            }        
+            pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS 
+            print_processed_block(pl_next_index-1);
+            print_exit(temp);
+            return;                                                   
+                                                                            //////DELETE THE TM AND TC LATER
+        }
+        case STATE_HIBERNATE: 
+        {
+            gPC.printf("\n\rEntered PL_HIBERNATE case");
+            if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0)
+            {                
+                if(PL_BEE_SW_STATUS==0) 
+                {
+                    gPC.printf("Powering on PL_BEE\r\n");                    
+                    SET_PL_BEE_ON;
+                    PL_BEE_SW_STATUS=1;
+                }
+                gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
+                Base_tm *tm_ptr_hibernate;
+                SET_PL_BEE_HIBERNATE(tm_ptr_hibernate);
+                if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+                {
+                    pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                    pl_main_flag |= PL_HIBERNATE; 
+                }
+            }
+            else 
+            {
+                pl_main_flag |= PL_LOW_POWER;
+                if(PL_BEE_SW_STATUS==0) 
+                {
+                    gPC.printf("\n\rPowering on PL_BEE");
+                    SET_PL_BEE_ON;
+                    PL_BEE_SW_STATUS=1;
+                }
+                gPC.printf("\n\rCommanding PL_BEE to go to Standby State");
+                Base_tm *tm_ptr_standby;
+                SET_PL_BEE_STANDBY(tm_ptr_standby);
+                if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+                {
+                    pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                    pl_main_flag |= PL_STANDBY; 
+                }        
+                pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS 
+                print_processed_block(pl_next_index-1);
+                print_exit(temp);
+                return;
+                                                                                //////DELETE THE TM AND TC LATER
+            }            
+            pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
+            print_processed_block(pl_next_index-1);
+            print_exit(temp);
+            return;
+                                                                            //////DELETE THE TM LATER
+        }
+        case STATE_SCIENCE:
+        {
+            gPC.printf("\n\rEntered PL_SCIENCE case");
+            if(POWER_LEVEL==3 || POWER_LEVEL==0)                            //POWER_LEVEL = 0 = NA
+            {
+                gPC.printf("\n\rPOWER_LEVEL = 3 or NA");
+                if(PL_BEE_SW_STATUS==0)
+                {
+                    gPC.printf("\n\rPowering on PL_BEE");
+                    SET_PL_BEE_ON;
+                    PL_BEE_SW_STATUS=1;
+                }
+                gPC.printf("\n\rCommanding PL_BEE to go to Science State");  
+                Base_tm *tm_ptr_science;
+                SET_PL_BEE_SCIENCE(tm_ptr_science);
+                if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+                {
+                    pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                    pl_main_flag |= PL_SCIENCE; 
+                }
+                pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
+                print_processed_block(pl_next_index-1);
+                print_exit(temp);
+                return;
+            }
+            else
+            {   
+                gPC.printf("\n\rPower level = 2,3 or NA");
+                pl_main_flag |= PL_LOW_POWER;
+                if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0)
+                {                
+                    if(PL_BEE_SW_STATUS==0) 
+                    {
+                        gPC.printf("\n\rPowering on PL_BEE");
+                        SET_PL_BEE_ON;
+                        PL_BEE_SW_STATUS=1;
+                    }
+                    gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State");  
+                    Base_tm *tm_ptr_hibernate;
+                    SET_PL_BEE_HIBERNATE(tm_ptr_hibernate);
+                    if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+                    {
+                        pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                        pl_main_flag |= PL_HIBERNATE; 
+                    }
+                }
+                else 
+                {
+                    pl_main_flag |= PL_LOW_POWER;
+                    if(PL_BEE_SW_STATUS==0) 
+                    {
+                        gPC.printf("\n\rPowering on PL_BEE");
+                        SET_PL_BEE_ON;
+                        PL_BEE_SW_STATUS=1;
+                    }
+                    gPC.printf("\n\rCommanding PL_BEE to go to Standby State");  
+                    Base_tm *tm_ptr_standby;
+                    SET_PL_BEE_STANDBY(tm_ptr_standby);
+                    if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C)
+                    {
+                        pl_main_flag = pl_main_flag & (~PL_DISABLED);
+                        pl_main_flag |= PL_STANDBY; 
+                    }        
+                    pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS 
+                    print_processed_block(pl_next_index-1);
+                    print_exit(temp);
+                    return;                                               
+                                                                                    //////DELETE THE TM AND TC LATER
+                }            
+                pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
+                print_processed_block(pl_next_index-1);
+                print_exit(temp);
+                return;
+                                                                                //////DELETE THE TM LATER
+            }
+        }
+        default:
+        {
+            gPC.printf("\n\rInvalid PL_STATE in block at index = %d",pl_next_index-1);
+            pl_main_flag  = pl_main_flag & (~PL_DISABLED);
+            pl_main_flag |= PL_INVALID_STATE;
+            pl_block[pl_next_index-1] &= (~UNEXECUTED);                         //changing exec_status                    
+            pl_block[pl_next_index-1] |= EXECUTED;
+            pl_main_flag  = pl_main_flag & (~PL_MAIN_STATUS);               //Clearing PL_MAIN_STATUS
+            print_processed_block(pl_next_index-1);
+            print_exit(temp);
+            return;
+        }
+    }    
+}
\ No newline at end of file
--- 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
--- a/main.cpp	Sat Jul 02 14:54:52 2016 +0000
+++ b/main.cpp	Sat Jul 02 15:28:21 2016 +0000
@@ -18,19 +18,23 @@
 #include "i2c.h"
 #include "COM_SND_TM_functions.h"
 #include "COM_SND_TM.h"
+#include "cdms_rtc.h"
 #include "cdms_sd.h"
 #include "common_functions.h"
-//#include "CDMS_HK.h"
+#include "RESET_functions.h"
+#include "CDMS_HK.h"
 #include "OBSRS.h"
 #include "adf.h"
 #include "COM_RCV_TC.h"
 //#include "Flash.h"
-#include "cdms_rtc.h"
+#include "FMS_all.h"
+#include "CDMS_PL.h"
 #include "COM_MNG_TMTC.h"
 #include "COM_POWER_ON_TX.h"
 #include "COM_POWER_OFF_TX.h"
 #include "Compression.h"
 #include "ThreadsAndFunctions.h"
+#include "TEST_PL.h"
 
 #define PL_TC(tm_ptr){\
     Base_tc *beacon_tc = new Short_tc;\
@@ -85,7 +89,7 @@
 {
     
     CDMS_I2C_GPIO = 0; 
-    PYLD_I2C_GPIO = 0; 
+    PL_I2C_GPIO = 0; 
     
     //gLEDR = 1;