Repository for CDMS code

Dependencies:   SimpleDMA mbed-rtos mbed eeprom

Fork of COM_MNG_TMTC_SIMPLE by Shreesha S

Files at this revision

API Documentation at this revision

Comitter:
chaithanyarss
Date:
Sun Jul 03 11:35:55 2016 +0000
Parent:
215:570251b23c7b
Child:
218:c63cdba0550f
Commit message:
merging Completed.

Changed in this revision

COM_MNG_TMTC.h Show annotated file Show diff for this revision Revisions of this file
COM_POWER_OFF_TX.h Show annotated file Show diff for this revision Revisions of this file
COM_POWER_ON_TX.h Show annotated file Show diff for this revision Revisions of this file
DefinitionsAndGlobals.h Show annotated file Show diff for this revision Revisions of this file
P_COM_INIT.h Show annotated file Show diff for this revision Revisions of this file
Structures.h Show annotated file Show diff for this revision Revisions of this file
ThreadsAndFunctions.h Show annotated file Show diff for this revision Revisions of this file
common_functions.h Show annotated file Show diff for this revision Revisions of this file
--- a/COM_MNG_TMTC.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/COM_MNG_TMTC.h	Sun Jul 03 11:35:55 2016 +0000
@@ -45,7 +45,7 @@
 
 
 
-#define detect_ack(tm_ptr, temp_ack, tc_psc) {\
+#define detect_ack(tm_ptr, temp_ack) {\
     if( tm_ptr != NULL ){\
         int length = TM_SHORT_SIZE;\
         if( GETshort_or_long_tm(tm_ptr) == SHORT_TM_CODE ){\
@@ -62,20 +62,20 @@
             if( (temp8 == 0xC0) || (temp8 == 0xA0) )\
                 temp_ack = 0x01;\
             else{\
-                temp_ack = 0x00;\
+                temp_ack = 0x02;\
                 /*CHECK FOR NACK CODE: CRC FAIL NACK*/\
                 temp8 = tm_ptr->TM_string[TM_ACK_CODE_INDEX];\
                 temp8 = temp8 & 0x0F;\
                 if( temp8 == CRC_FAIL_NACK_CODE ){\
-                    tm_ptr->TM_string[2] = tc_psc;\
+                    temp_ack = 0x04;\
                 }\
             }\
         }\
         else\
-            temp_ack = 0x00;\
+            temp_ack = 0x03;\
     }\
     else{\
-        temp_ack = 0x00;\
+        temp_ack = 0x02;\
     }\
 }
 
@@ -1047,7 +1047,7 @@
     }\
     else if( (service_subtype != OBOSC_SUB_DISABLE) && (service_subtype != OBOSC_SUB_RETRY) ){\
         /*CHANGE THE ACK CODE TO INVALID TC*/\
-        ackl234new->TM_string[2] = 0xA2;\
+        ackl234new->TM_string[2] = 0xAF;\
     }\
     if (DEBUG)\
         gPC.puts("completed obosc\r\n");\
@@ -1057,6 +1057,7 @@
 
 
 #define EXECUTE_OBOSC_ONLY {\
+    gMASTER_STATE = TCL_STATE_EXECUTING;\
     int reset_flag = 0;\
     if (DEBUG)\
         gPC.puts("iNSIDE EXECUTE_OBOSC_ONLY\r\n");\
--- a/COM_POWER_OFF_TX.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/COM_POWER_OFF_TX.h	Sun Jul 03 11:35:55 2016 +0000
@@ -1,15 +1,136 @@
+#define RESET_CDMS {\
+    Base_tc *RESET_tc = new Short_tc;\
+    RESET_tc->next_TC = NULL;\
+    PUTshort_or_long(RESET_tc,SHORT_TC_CODE);\
+    PUTcrc_pass(RESET_tc,0x1);\
+    PUTexec_status(RESET_tc,0);\
+    RESET_tc->TC_string[0] = 0x01;\
+    RESET_tc->TC_string[1] = 0x81;\
+    RESET_tc->TC_string[2] = 0x81;\
+    RESET_tc->TC_string[3] = 0x38;\
+    RESET_tc->TC_string[4] = 0;\
+    RESET_tc->TC_string[5] = 0;\
+    RESET_tc->TC_string[6] = 0;\
+    RESET_tc->TC_string[7] = 0;\
+    RESET_tc->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(RESET_tc->TC_string, 9);\
+    RESET_tc->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    RESET_tc->TC_string[10] = (crc16 & 0x00FF);\
+    Base_tm *tm_ptr = NULL;\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(RESET_tc);\
+    delete RESET_tc;\
+    /*DELETE THE TM AFTER USE*/\
+    Base_tm *del_tm = tm_ptr;\
+    while( del_tm != NULL ){\
+        Base_tm *temp = del_tm->next_TM;\
+        delete del_tm;\
+        del_tm = temp;\
+    }\
+}
+
+#define power_on_bae {\
+    Base_tc *power_on_BAE = new Short_tc;\
+    power_on_BAE->next_TC = NULL;\
+    PUTshort_or_long(power_on_BAE,SHORT_TC_CODE);\
+    PUTcrc_pass(power_on_BAE,0x1);\
+    PUTexec_status(power_on_BAE,0);\
+    power_on_BAE->TC_string[0] = 0x01;\
+    power_on_BAE->TC_string[1] = BAE_APID_SOURCE;\
+    power_on_BAE->TC_string[2] = BAE_SERVICE;\
+    power_on_BAE->TC_string[3] = BAE_POWER_ON_PID;\
+    power_on_BAE->TC_string[4] = 0;\
+    power_on_BAE->TC_string[5] = 0;\
+    power_on_BAE->TC_string[6] = 0;\
+    power_on_BAE->TC_string[7] = 0;\
+    power_on_BAE->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(power_on_BAE->TC_string, 9);\
+    power_on_BAE->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    power_on_BAE->TC_string[10] = (crc16 & 0x00FF);\
+    Base_tm *tm_ptr = NULL;\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(power_on_BAE);\
+    delete power_on_BAE;\
+    /*DELETE THE TM AFTER USE*/\
+    Base_tm *del_tm = tm_ptr;\
+    int overCount = 0;\
+    while( del_tm != NULL ){\
+        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
+            Base_tm *temp = del_tm->next_TM;\
+            delete del_tm;\
+            del_tm = temp;\
+            ++overCount;\
+        }\
+        else{\
+            RESET_CDMS;\
+            break;\
+        }\
+    }\
+}
+
+#define resume_bcn {\
+    Base_tc *beacon_tc = new Long_tc;\
+    beacon_tc->next_TC = NULL;\
+    PUTshort_or_long(beacon_tc,LONG_TC_CODE);\
+    PUTcrc_pass(beacon_tc,0x1);\
+    PUTexec_status(beacon_tc,0);\
+    beacon_tc->TC_string[0] = 0x01;\
+    beacon_tc->TC_string[1] = BCN_APID_SOURCE;\
+    beacon_tc->TC_string[2] = BCN_SERVICE;\
+    beacon_tc->TC_string[3] = 0xE2;\
+    beacon_tc->TC_string[4] = 0x00;\
+    beacon_tc->TC_string[5] = 0;\
+    beacon_tc->TC_string[6] = 0;\
+    beacon_tc->TC_string[7] = 0;\
+    beacon_tc->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(beacon_tc->TC_string, 9);\
+    beacon_tc->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    beacon_tc->TC_string[10] = (crc16 & 0x00FF);\
+    for(int i = 11; i < 135; i++){\
+        beacon_tc->TC_string[i] = 0;\
+    }\
+    Base_tm *tm_ptr = NULL;\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(beacon_tc);\
+    delete beacon_tc;\
+    /*DELETE THE TM AFTER USE*/\
+    Base_tm *del_tm = tm_ptr;\
+    int overCount = 0;\
+    while( del_tm != NULL ){\
+        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
+            Base_tm *temp = del_tm->next_TM;\
+            delete del_tm;\
+            del_tm = temp;\
+            ++overCount;\
+        }\
+        else{\
+            RESET_CDMS;\
+            break;\
+        }\
+    }\
+}
+
 #define COM_POWER_OFF_TX {\
     /*gPC.puts("Inside COM_POWER_OFF_TX\r\n");*/\
-    /*PENDING: POWER OFF TRANSMITTER*/\
+    COM_TX_CNTRL = 0;\
     RX1M.attach(&rx_read, Serial::RxIrq);\
     gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);\
-    /*PENDING: SWITCH RF RELAY TO BEACON*/\
-    /*PENDING: RF_SW_STATUS = RF_BCN*/\
-    /*PENDING: POWER ON BAE*/\
-    /*PENDING: SET BAE SW_EN_STATUS*/\
-    /*PENDING: RESUME BEACON*/\
+    RF_SW_CNTRL_BCN = 1;\
+    Thread::wait(25);\
+    RF_SW_CNTRL_BCN = 0;\
+    gFLAGS = gFLAGS | RF_SW_STATUS_FLAG;\
+    if( gFLAGS & COM_AUTO_POWER_OFF_BAE_FLAG ){\
+        power_on_bae;\
+        gFLAGS = gFLAGS | BAE_SW_EN_FLAG;\
+        gFLAGS & (~COM_AUTO_POWER_OFF_BAE_FLAG);\
+        resume_bcn;\
+    }\
+    else{\
+        if( gFLAGS & BAE_SW_EN_FLAG ){\
+            resume_bcn;\
+        }\
+    }\
     gFLAGS = gFLAGS & (~COM_PA_HOT_FLAG);\
+    gFLAGS = gFLAGS & (~COM_PA_OC_FLAG);\
     gCOM_PA_COOLING_TIMEOUT.detach();\
     gFLAGS = gFLAGS & (~COM_TX_FLAG);\
-    /*gPC.puts("ompleted com_power_off tx\r\n");*/\
+    gFLAGS = gFLAGS & (~COM_SESSION_TIMEOUT_FLAG);\
+    /*gPC.puts("completed com_power_off tx\r\n");*/\
 }
\ No newline at end of file
--- a/COM_POWER_ON_TX.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/COM_POWER_ON_TX.h	Sun Jul 03 11:35:55 2016 +0000
@@ -1,107 +1,444 @@
-#define COM_POWER_ON_TX {\
-    /*gPC.puts("Inside COM_POWER_ON_TX\r\n");*/\
-    if( !(gFLAGS & COM_TX_FLAG) ){\
-        gFLAGS = gFLAGS | COM_TX_FLAG;\
-        /*WARNING: INFINITE WHILE LOOP POSSIBLE: if standby ack received and bcn tx main status = 0*/\
-        bool retryFlag = true;\
-        while( retryFlag == true ){\
-            uint8_t standbyAck = 0xFF;\
-            /*PENDING: SET BEACON TO STANDBY*/\
-            if( standbyAck == 0xFF ){\
-                /*ACK RECCEIVED*/\
-                /*PENDING: BEACON TX MAIN STATUS*/\
-                if( true ){\
-                    retryFlag = false;\
-                    /*PENDING: SWITCH RELAY TO COM_TX*/\
-                    /*PENDING: RF_SW_STATUS = RF_COM_TX*/\
-                }\
-                else{\
-                    gCOM_MNG_TMTC_THREAD->wait(5000);\
-                }\
-            }\
-            else{\
-                /*PENDING: RESET BAE*/\
-                uint8_t standbyAck2 = 0x00;\
-                /*PENDING: SET BEACON TO STANDBY*/\
-                if( standbyAck2 == 0xFF ){\
-                    /*PENDING: BEACON TX MAIN STAUTS*/\
-                    if( true ){\
-                        retryFlag = false;\
-                        /*PENDING: SWITCH RF RELAY TO COM TX*/\
-                        /*PENDING: RF_SW_STATUS = RF_COM_TX*/\
-                    }\
-                }\
-                else{\
-                    retryFlag = false;\
-                    /*PENDING: POWER OFF BEACON*/\
-                    /*PENDING: CLEAR BAE SW_EN*/\
-                    /*PENDING: SWITCH RF RELAY TO COM TX*/\
-                    /*PENDING: RF_SW_STATUS = RF_COM_TX*/\
-                }\
-            }\
+#define STANDBY_PRCS(tm_ptr){\
+    Base_tc *stdby_tc = new Long_tc;\
+    stdby_tc->next_TC = NULL;\
+    PUTshort_or_long(stdby_tc,LONG_TC_CODE);\
+    PUTcrc_pass(stdby_tc,0x1);\
+    PUTexec_status(stdby_tc,0);\
+    stdby_tc->TC_string[0] = 0x01;\
+    stdby_tc->TC_string[1] = 0x41;\
+    stdby_tc->TC_string[2] = 0x81;\
+    stdby_tc->TC_string[3] = 0x40;\
+    stdby_tc->TC_string[4] = 0x01;\
+    stdby_tc->TC_string[5] = 0x01;\
+    stdby_tc->TC_string[6] = 0x01;\
+    stdby_tc->TC_string[7] = 0;\
+    stdby_tc->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(stdby_tc->TC_string, 9);\
+    stdby_tc->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    stdby_tc->TC_string[10] = (crc16 & 0x00FF);\
+    for(int i = 11; i < 135; i++){\
+        stdby_tc->TC_string[i] = 0;\
+    }\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(stdby_tc);\
+    delete stdby_tc;\
+}
+
+#define SET_BCN_STANDBY(tm_ptr){\
+    Base_tc *beacon_tc = new Long_tc;\
+    beacon_tc->next_TC = NULL;\
+    PUTshort_or_long(beacon_tc,LONG_TC_CODE);\
+    PUTcrc_pass(beacon_tc,0x1);\
+    PUTexec_status(beacon_tc,0);\
+    beacon_tc->TC_string[0] = 0x01;\
+    beacon_tc->TC_string[1] = BCN_APID_SOURCE;\
+    beacon_tc->TC_string[2] = BCN_SERVICE;\
+    beacon_tc->TC_string[3] = 0xE2;\
+    beacon_tc->TC_string[4] = 0x01;\
+    beacon_tc->TC_string[5] = 0;\
+    beacon_tc->TC_string[6] = 0;\
+    beacon_tc->TC_string[7] = 0;\
+    beacon_tc->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(beacon_tc->TC_string, 9);\
+    beacon_tc->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    beacon_tc->TC_string[10] = (crc16 & 0x00FF);\
+    for(int i = 11; i < 135; i++){\
+        beacon_tc->TC_string[i] = 0;\
+    }\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(beacon_tc);\
+    delete beacon_tc;\
+}
+
+#define reset_bae {\
+    Base_tc *reset_BAE = new Short_tc;\
+    reset_BAE->next_TC = NULL;\
+    PUTshort_or_long(reset_BAE,SHORT_TC_CODE);\
+    PUTcrc_pass(reset_BAE,0x1);\
+    PUTexec_status(reset_BAE,0);\
+    reset_BAE->TC_string[0] = 0x01;\
+    reset_BAE->TC_string[1] = BAE_APID_SOURCE;\
+    reset_BAE->TC_string[2] = BAE_SERVICE;\
+    reset_BAE->TC_string[3] = BAE_RESET_PID;\
+    reset_BAE->TC_string[4] = 0;\
+    reset_BAE->TC_string[5] = 0;\
+    reset_BAE->TC_string[6] = 0;\
+    reset_BAE->TC_string[7] = 0;\
+    reset_BAE->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(reset_BAE->TC_string, 9);\
+    reset_BAE->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    reset_BAE->TC_string[10] = (crc16 & 0x00FF);\
+    Base_tm *tm_ptr = NULL;\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(reset_BAE);\
+    delete reset_BAE;\
+    /*DELETE THE TM AFTER USE*/\
+    Base_tm *del_tm = tm_ptr;\
+    int overCount = 0;\
+    while( del_tm != NULL ){\
+        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
+            Base_tm *temp = del_tm->next_TM;\
+            delete del_tm;\
+            del_tm = temp;\
+            ++overCount;\
+        }\
+        else{\
+            RESET_CDMS;\
+            break;\
         }\
     }\
-    /*PENDING: POWER ON COM_TX*/\
-    uint8_t adfConfigPass = 0xFF;\
-    for( int i = 0 ; i < COM_TX_CONFIG_LIMIT ; ++i ){\
-        /*PENDING: CONFIGURE ADF*/\
-        if( adfConfigPass == 0xFF ){\
+}
+
+#define power_off_bae {\
+    Base_tc *power_off_BAE = new Short_tc;\
+    power_off_BAE->next_TC = NULL;\
+    PUTshort_or_long(power_off_BAE,SHORT_TC_CODE);\
+    PUTcrc_pass(power_off_BAE,0x1);\
+    PUTexec_status(power_off_BAE,0);\
+    power_off_BAE->TC_string[0] = 0x01;\
+    power_off_BAE->TC_string[1] = BAE_APID_SOURCE;\
+    power_off_BAE->TC_string[2] = BAE_SERVICE;\
+    power_off_BAE->TC_string[3] = BAE_POWER_OFF_PID;\
+    power_off_BAE->TC_string[4] = 0;\
+    power_off_BAE->TC_string[5] = 0;\
+    power_off_BAE->TC_string[6] = 0;\
+    power_off_BAE->TC_string[7] = 0;\
+    power_off_BAE->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(power_off_BAE->TC_string, 9);\
+    power_off_BAE->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    power_off_BAE->TC_string[10] = (crc16 & 0x00FF);\
+    Base_tm *tm_ptr = NULL;\
+    tm_ptr = FCTN_CDMS_RLY_TMTC(power_off_BAE);\
+    delete power_off_BAE;\
+    /*DELETE THE TM AFTER USE*/\
+    Base_tm *del_tm = tm_ptr;\
+    int overCount = 0;\
+    while( del_tm != NULL ){\
+        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
+            Base_tm *temp = del_tm->next_TM;\
+            delete del_tm;\
+            del_tm = temp;\
+            ++overCount;\
+        }\
+        else{\
+            RESET_CDMS;\
+            break;\
+        }\
+    }\
+}
+
+#define P_CDMS_HK_MAIN {\
+    Base_tc *hk_main_ptr = new Short_tc;\
+    hk_main_ptr->next_TC = NULL;\
+    PUTshort_or_long(hk_main_ptr,SHORT_TC_CODE);\
+    PUTcrc_pass(hk_main_ptr,0x1);\
+    PUTexec_status(hk_main_ptr,0);\
+    hk_main_ptr->TC_string[0] = 0x01;\
+    hk_main_ptr->TC_string[1] = 0x81;\
+    hk_main_ptr->TC_string[2] = 0x81;\
+    hk_main_ptr->TC_string[3] = 0x04;\
+    hk_main_ptr->TC_string[4] = 0;\
+    hk_main_ptr->TC_string[5] = 0;\
+    hk_main_ptr->TC_string[6] = 0;\
+    hk_main_ptr->TC_string[7] = 0;\
+    hk_main_ptr->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(hk_main_ptr->TC_string, 9);\
+    hk_main_ptr->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    hk_main_ptr->TC_string[10] = (crc16 & 0x00FF);\
+    Base_tm *tm_ptr = NULL;\
+    tm_ptr = FCTN_CDMS_RLY_TMTC(hk_main_ptr);\
+    delete hk_main_ptr;\
+    /*DELETE THE TM AFTER USE*/\
+    Base_tm *del_tm = tm_ptr;\
+    int overCount = 0;\
+    while( del_tm != NULL ){\
+        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
+            Base_tm *temp = del_tm->next_TM;\
+            delete del_tm;\
+            del_tm = temp;\
+            ++overCount;\
+        }\
+        else{\
+            RESET_CDMS;\
             break;\
         }\
     }\
-    if( adfConfigPass == 0xFF ){\
-        /*adf successfully configured*/\
-        /*CALL SIGN*/\
-        Base_tm *power_on_tm = NULL;\
-        Base_tm *power_on_tm_head = NULL;\
-        get_call_sign( power_on_tm_head );\
-        power_on_tm = power_on_tm_head;\
-        /*ACK L1*/\
-        get_ack_l1(power_on_tm->next_TM);\
-        int overFlowCountADF = 0;\
-        while( power_on_tm->next_TM != NULL ){\
-            if( overFlowCountADF < TM_OVERFLOW_CONSTANT ){\
-                power_on_tm = power_on_tm->next_TM;\
-                ++overFlowCountADF;\
-            }\
-            else{\
-                /*PENDING: RESET CDMS*/\
-                break;\
-            }\
-        }\
-        get_tc_list(power_on_tm->next_TM, 0x00);\
-        /*PENDING: TRANSMIT ABOVE TM*/\
-        /*Call Sign, ACK_L1, TC_LIST*/\
-        /*snd_tm.head_pointer(power_on_tm_head);*/\
-        /*transmit_adf;*/\
-        /*deleting the telemetry*/\
-        power_on_tm = power_on_tm_head;\
-        overFlowCountADF = 0;\
-        while( power_on_tm != NULL ){\
-            if( overFlowCountADF < TM_OVERFLOW_CONSTANT ){\
-                Base_tm *temp = power_on_tm->next_TM;\
-                delete power_on_tm;\
-                power_on_tm = temp;\
-                ++overFlowCountADF;\
-            }\
-            else{\
-                /*PENDING: RESET CDMS*/\
-                break;\
-            }\
-        }\
+}
+
+#define P_BCN_TX_MAIN(tm_ptr) {\
+    Base_tc *bcn_tx_main_ptr = new Long_tc;\
+    bcn_tx_main_ptr->next_TC = NULL;\
+    PUTshort_or_long(bcn_tx_main_ptr,LONG_TC_CODE);\
+    PUTcrc_pass(bcn_tx_main_ptr,0x1);\
+    PUTexec_status(bcn_tx_main_ptr,0);\
+    bcn_tx_main_ptr->TC_string[0] = 0x01;\
+    bcn_tx_main_ptr->TC_string[1] = 0x41;\
+    bcn_tx_main_ptr->TC_string[2] = 0x81;\
+    bcn_tx_main_ptr->TC_string[3] = 0x07;\
+    bcn_tx_main_ptr->TC_string[4] = 0;\
+    bcn_tx_main_ptr->TC_string[5] = 0;\
+    bcn_tx_main_ptr->TC_string[6] = 0;\
+    bcn_tx_main_ptr->TC_string[7] = 0;\
+    bcn_tx_main_ptr->TC_string[8] = 0;\
+    uint16_t crc16 = crc16_gen(bcn_tx_main_ptr->TC_string, 9);\
+    bcn_tx_main_ptr->TC_string[9]  = (crc16 & 0xFF00)>>8;\
+    bcn_tx_main_ptr->TC_string[10] = (crc16 & 0x00FF);\
+    for(int i = 11; i < 135; i++){\
+        bcn_tx_main_ptr->TC_string[i] = 0;\
     }\
-    else{\
-        /*PENDING: COM_POWER OFF TX*/\
-        /*PENDING: CDMS HK MAIN*/\
-        uint8_t ackReceived = 0x00;\
-        /*PENDING: BCN TX MAIN*/\
-        if( ackReceived == 0xFF ){\
-            gCOM_MNG_TMTC_THREAD->wait(5000);\
-            /*PENDING: RESET CDMS*/\
-        }\
-        else{\
-            /*PENDING: RESET CDMS*/\
-        }\
-    }\
-    /*gPC.puts("COMPLETED COM_POWER_ON_TX\r\n");*/\
+    tm_ptr =  FCTN_CDMS_RLY_TMTC(bcn_tx_main_ptr);\
+    delete bcn_tx_main_ptr;\
+}
+
+void COM_POWER_ON_TX() {
+    if (DEBUG)
+        gPC.puts("Inside COM_POWER_ON_TX\r\n");
+    if( !(gFLAGS & COM_TX_FLAG) ){
+        gFLAGS = gFLAGS | COM_TX_FLAG;
+        if( gFLAGS & BAE_SW_EN_FLAG ){
+            /*WARNING: INFINITE WHILE LOOP POSSIBLE: if standby ack received and bcn tx main status = 0*/
+            bool retryFlag = true;
+            while( retryFlag == true ){
+                Base_tm *tm_ptr = NULL;
+                SET_BCN_STANDBY(tm_ptr);
+                uint8_t bcn_main_status = (tm_ptr->TM_string[2] & 0xEF);
+                if(( bcn_main_status == 0xC0 )||( bcn_main_status ==0xA0 )){
+                    /*ACK RECCEIVED*/
+                    if( bcn_main_status == 0xA0 ){
+                        retryFlag = false;
+                        RF_SW_CNTRL_TX = 1;
+                        Thread::wait(25);
+                        RF_SW_CNTRL_TX = 0;
+                        gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);/*RF_SW_STATUS_FLAG set to RF_COM_TX*/
+                    }
+                    else{
+                        Thread::wait(5000);
+                    }
+                }
+                else{
+                    reset_bae;
+                    Base_tm *tm_ptr2 = NULL;
+                    SET_BCN_STANDBY(tm_ptr2);
+                    uint8_t standbyAck2 = 0;
+                    uint8_t bcn_main_status2 = (tm_ptr2->TM_string[2] & 0xEF);
+                    if( ( bcn_main_status2 == 0xC0 )||( bcn_main_status2 == 0xA0 ) ){
+                        if( bcn_main_status2 == 0xA0 ){
+                            retryFlag = false;
+                            RF_SW_CNTRL_TX = 1;
+                            Thread::wait(25);
+                            RF_SW_CNTRL_TX = 0;
+                            gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);
+                        }
+                        else{
+                            Thread::wait(5000);
+                        }                           
+                    }
+                    else{
+                        retryFlag = false;
+                        power_off_bae;
+                        gFLAGS = gFLAGS | COM_AUTO_POWER_OFF_BAE_FLAG;
+                        gFLAGS = gFLAGS & (~BAE_SW_EN_FLAG);
+                        RF_SW_CNTRL_TX = 1;
+                        Thread::wait(25);
+                        RF_SW_CNTRL_TX = 0;
+                        gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);/*RF_SW_STATUS_FLAG set to RF_COM_TX*/
+                    }
+                    /*DELETE THE TM AFTER USE*/
+                    Base_tm *del_tm = tm_ptr2;
+                    int overCount = 0;
+                    while( del_tm != NULL ){
+                        if( (overCount < TM_OVERFLOW_CONSTANT) ){
+                            Base_tm *temp = del_tm->next_TM;
+                            delete del_tm;
+                            del_tm = temp;
+                            ++overCount;
+                        }
+                        else{
+                            RESET_CDMS;
+                            break;
+                        }
+                    }
+                }
+                /*DELETE THE TM AFTER USE*/
+                Base_tm *del_tm = tm_ptr;
+                int overCount = 0;
+                while( del_tm != NULL ){
+                    if( (overCount < TM_OVERFLOW_CONSTANT) ){
+                        Base_tm *temp = del_tm->next_TM;
+                        delete del_tm;
+                        del_tm = temp;
+                        ++overCount;
+                    }
+                    else{
+                        RESET_CDMS;
+                        break;
+                    }
+                }
+            }
+        }
+        else{
+            RF_SW_CNTRL_TX = 1;
+            Thread::wait(25);
+            RF_SW_CNTRL_TX = 0;
+            gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);/*RF_SW_STATUS_FLAG set to RF_COM_TX*/
+        }
+    }
+    COM_TX_CNTRL = 1;
+    uint8_t adfConfigPass = 0xFF;
+    for( int i = 0 ; i < COM_TX_CONFIG_LIMIT ; ++i ){
+        /*PENDING: CONFIGURE ADF and set adfConfigPass*/
+        if( adfConfigPass == 0xFF ){
+            break;
+        }
+    }
+    if( adfConfigPass == 0xFF ){
+        /*adf successfully configured*/
+        gFLAGS = gFLAGS | COM_TX_STATUS_FLAG;
+        /*CALL SIGN*/
+        Base_tm *power_on_tm = NULL;
+        Base_tm *power_on_tm_head = NULL;
+        get_call_sign( power_on_tm_head );
+        power_on_tm = power_on_tm_head;
+        /*ACK L1*/
+        get_ack_l1(power_on_tm->next_TM);
+        int overFlowCountADF = 0;
+        while( power_on_tm->next_TM != NULL ){
+            if( overFlowCountADF < TM_OVERFLOW_CONSTANT ){
+                power_on_tm = power_on_tm->next_TM;
+                ++overFlowCountADF;
+            }
+            else{
+                RESET_CDMS;
+                break;
+            }
+        }
+        get_tc_list(power_on_tm->next_TM, 0x00);
+        /*Call Sign, ACK_L1, TC_LIST*/
+        /*snd_tm.head_pointer(power_on_tm_head);*/
+        /*transmit_adf;*/
+        uint8_t transmissionPass = 0xFF;
+        /*PENDING: get acknowledgement of transmission*/
+        /*deleting the telemetry*/
+        power_on_tm = power_on_tm_head;
+        overFlowCountADF = 0;
+        while( power_on_tm != NULL ){
+            if( overFlowCountADF < TM_OVERFLOW_CONSTANT ){
+                Base_tm *temp = power_on_tm->next_TM;
+                delete power_on_tm;
+                power_on_tm = temp;
+                ++overFlowCountADF;
+            }
+            else{
+                RESET_CDMS;
+                break;
+            }
+        }
+        if( transmissionPass == 0 ){
+            /*NOT Transmitted succesfully*/
+            COM_POWER_OFF_TX;
+            P_CDMS_HK_MAIN;
+            Base_tm *ptr_tm = NULL;
+            STANDBY_PRCS(ptr_tm);
+            uint8_t standbyACK = 0x00;
+            uint8_t bcn_main_status = (ptr_tm->TM_string[2] & 0xEF);
+            if(( bcn_main_status == 0xC0 )||( bcn_main_status ==0xA0 )){
+                standbyACK = 1;
+            }
+            if(standbyACK == 1){
+                uint8_t ackReceived = 0x00;
+                Base_tm *tm_ptr = NULL;
+                P_BCN_TX_MAIN(tm_ptr);
+                uint8_t ackcode = tm_ptr->TM_string[2] & 0xEF;
+                if( (ackcode == 0xA0) || (ackcode == 0xC0))
+                    ackReceived = 0xFF;
+                /*DELETE THE TM AFTER USE*/
+                Base_tm *del_tm = tm_ptr;
+                int overCount = 0;
+                while( del_tm != NULL ){
+                    if( (overCount < TM_OVERFLOW_CONSTANT) ){
+                        Base_tm *temp = del_tm->next_TM;
+                        delete del_tm;
+                        del_tm = temp;
+                        ++overCount;
+                    }
+                    else{
+                        RESET_CDMS;
+                        break;
+                    }
+                }
+                if( ackReceived == 0xFF ){
+                    Thread::wait(5000);
+                }
+            }
+            /*DELETE THE TM AFTER USE*/
+            Base_tm *del_tm = ptr_tm;
+            int overCount = 0;
+            while( del_tm != NULL ){
+                if( (overCount < TM_OVERFLOW_CONSTANT) ){
+                    Base_tm *temp = del_tm->next_TM;
+                    delete del_tm;
+                    del_tm = temp;
+                    ++overCount;
+                }
+                else{
+                    RESET_CDMS;
+                    break;
+                }
+            }
+            RESET_CDMS;            
+        }
+    }
+    else{
+        /*ADF not configured*/
+        gFLAGS = gFLAGS & (~COM_TX_STATUS_FLAG);
+        COM_POWER_OFF_TX;
+        P_CDMS_HK_MAIN;
+        Base_tm *ptr_tm = NULL;
+        STANDBY_PRCS(ptr_tm);
+        uint8_t standbyACK = 0x00;
+        uint8_t bcn_main_status = (ptr_tm->TM_string[2] & 0xEF);
+        if(( bcn_main_status == 0xC0 )||( bcn_main_status ==0xA0 )){
+            standbyACK = 1;
+        }
+        if(standbyACK == 1){
+            uint8_t ackReceived = 0x00;
+            Base_tm *tm_ptr = NULL;
+            P_BCN_TX_MAIN(tm_ptr);
+            uint8_t ackcode = tm_ptr->TM_string[2] & 0xEF;
+            if( (ackcode == 0xA0) || (ackcode == 0xC0))
+                ackReceived = 0xFF;
+            /*DELETE THE TM AFTER USE*/
+            Base_tm *del_tm = tm_ptr;
+            int overCount = 0;
+            while( del_tm != NULL ){
+                if( (overCount < TM_OVERFLOW_CONSTANT) ){
+                    Base_tm *temp = del_tm->next_TM;
+                    delete del_tm;
+                    del_tm = temp;
+                    ++overCount;
+                }
+                else{
+                    RESET_CDMS;
+                    break;
+                }
+            }
+            if( ackReceived == 0xFF ){
+                Thread::wait(5000);
+            }
+        }
+        /*DELETE THE TM AFTER USE*/
+        Base_tm *del_tm = ptr_tm;
+        int overCount = 0;
+        while( del_tm != NULL ){
+            if( (overCount < TM_OVERFLOW_CONSTANT) ){
+                Base_tm *temp = del_tm->next_TM;
+                delete del_tm;
+                del_tm = temp;
+                ++overCount;
+            }
+            else{
+                RESET_CDMS;
+                break;
+            }
+        }
+        RESET_CDMS;
+    }
+    /*gPC.puts("COMPLETED COM_POWER_ON_TX\r\n");*/
 }
\ No newline at end of file
--- a/DefinitionsAndGlobals.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/DefinitionsAndGlobals.h	Sun Jul 03 11:35:55 2016 +0000
@@ -159,6 +159,7 @@
 COM_RX_DATA_NODE *gRX_CURRENT_DATA_NODE = NULL;
 // uint8_t *gRX_CURRENT_PTR = NULL;
 uint32_t gRX_COUNT = 0;
+uint16_t gTOTAL_RAW_BYTES = 0;
 uint16_t gTOTAL_INCORRECT_SIZE_TC = 0x00;
 uint16_t gTOTAL_CRC_FAIL_TC = 0x00;
 uint16_t gTOTAL_REPEATED_TC = 0x00;
@@ -191,6 +192,8 @@
 Thread* gCOM_MNG_TMTC_THREAD = NULL;
 Timeout gRX_TIMEOUT;
 Timeout gSESSION_TIMEOUT;
+Timeout gCOM_RX_DISABLE;
+
 
 // COM_MNG_TMTC
 
--- a/P_COM_INIT.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/P_COM_INIT.h	Sun Jul 03 11:35:55 2016 +0000
@@ -4,7 +4,7 @@
     Thread::wait(25);\
     RF_SW_CNTRL_BCN = 0;\
     gFLAGS = gFLAGS | RF_SW_STATUS_FLAG;\
-    //COM_RX_CNTRL = 0;\
+    COM_RX_CNTRL = 0;\
     Thread::wait(200);\
     COM_RX_CNTRL = 1;\
     gFLAGS = gFLAGS & (~COM_INIT_STATUS_FLAG);\
--- a/Structures.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/Structures.h	Sun Jul 03 11:35:55 2016 +0000
@@ -27,8 +27,9 @@
 0: unexecuted
 1: successfully executed
 2: Execution Failed
-3: Disabled
-4: Marked For retry
+3: CRC error
+4: Disabled
+5: Marked For retry
 */
 #define TC_STATE_UNEXECUTED 0x00
 #define TC_STATE_SUCCESSFULLY_EXECUTED 0x01
--- a/ThreadsAndFunctions.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/ThreadsAndFunctions.h	Sun Jul 03 11:35:55 2016 +0000
@@ -36,6 +36,12 @@
     gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT);
 }
 
+// COM_RX_DISABLE ISR
+void after_com_disable(){
+    gCOM_RX_DISABLE.detach();
+    RX1M.attach(&rx_read, Serial::RxIrq);
+}
+
 // RX_TIMEOUT ISR
 void after_receive(){
     gRX_TIMEOUT.detach();
@@ -63,15 +69,15 @@
     }\
     gHEAD_NODE_TCL = NULL;\
     gLAST_NODE_TCL = NULL;\
-    gMASTER_STATE = TCL_STATE_INCOMPLETE;\
+    gMASTER_STATE = TCL_STATE_COMPLETED;\
     gTOTAL_INCORRECT_SIZE_TC = 0;\
     gTOTAL_CRC_FAIL_TC = 0;\
     gTOTAL_REPEATED_TC = 0;\
     gTOTAL_VALID_TC = 0;\
     for(int i = 0 ; i < TM_LONG_SIZE ; ++i){\
-        gLAST_TM[i] = 0x00;\
+        /*gLAST_TM[i] = 0x00;*/\
     }\
-    gLAST_TM_SHORT_OR_LONG = SHORT_TM_CODE;\
+    /*gLAST_TM_SHORT_OR_LONG = SHORT_TM_CODE;*/\
     COM_RX_DATA_NODE *dataptr = gRX_HEAD_DATA_NODE;\
     while( dataptr != NULL ){\
         COM_RX_DATA_NODE *temp = dataptr->next_node;\
@@ -82,6 +88,7 @@
     gRX_HEAD_DATA_NODE->next_node = NULL;\
     gRX_CURRENT_DATA_NODE = gRX_HEAD_DATA_NODE;\
     gRX_COUNT = 0;\
+    gTOTAL_RAW_BYTES = 0;\
     /*PENDING : ALL GLOBAL VAARIABLES AND FLAGS*/\
     /*gPC.puts("finished reset all\r\n");*/\
 }
@@ -96,6 +103,7 @@
         gRX_CURRENT_DATA_NODE = gRX_CURRENT_DATA_NODE->next_node;\
         gRX_CURRENT_DATA_NODE->next_node = NULL;\
     }\
+    ++gTOTAL_RAW_BYTES;\
     gRX_TIMEOUT.attach(&after_receive, RX_TIMEOUT_LIMIT);\
 }
 
@@ -110,10 +118,12 @@
             gFLAGS = gFLAGS & (~UART_INT_FLAG);
             if( !(gFLAGS & COM_SESSION_FLAG) ){
                 // PENDING : DISABLE THREADS
+                // gCDMS_HK_TIMER.stop();
                 PL_wo_dma->stop();
                 gFLAGS = gFLAGS | COM_SESSION_FLAG;
                 gSESSION_TIMEOUT.attach(&after_session, SESSION_TIME_LIMIT);
                 gFLAGS = gFLAGS | COM_RX_FLAG;
+                gTOTAL_RAW_BYTES = 0;
                 PUT_RAW_BYTE;
                 // PENDING : MEASURE RSSI
                 if( gFLAGS & COM_SESSION_FLAG ){
@@ -132,10 +142,15 @@
                 gFLAGS = gFLAGS | COM_RX_FLAG;
                 PUT_RAW_BYTE;
             }
+            if(gTOTAL_RAW_BYTES > BYTE_OVERFLOW_CONSTANT){
+                RX1M.attach(NULL);
+                gCOM_RX_DISABLE.attach(&after_com_disable, COM_RX_DISABLE_TIMEOUT);
+                after_receive();
+            }
         }
         else if( gFLAGS & NEW_TC_RECEIVED ){
             gPC.puts("NEW TC RECEIVED\r\n");
-            Thread::wait(1000);
+            Thread::wait(1000);/*For testing with transmitter. To be removed later*/
             gFLAGS = gFLAGS & (~NEW_TC_RECEIVED);
             gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG;
 
@@ -163,30 +178,24 @@
                         // CHECK WEATHER GS VERIFICATION CODE MATCHES
                         uint8_t tempGSver = 0x00;
                         GScodeVerification(tempGSver);
-                        /*PENDING: INCLUDE GS VERIFICATION CODE*/
                         if( tempGSver == 0xFF ){
                             /*gPC.puts("GS code match !!\r\n");*/
                             gFLAGS = gFLAGS | COM_SESSION_VALIDITY;
                             COM_POWER_ON_TX;
-                            // PENDING: PA HOT HANDLED IN EXECUTE_XXX FUNCTIONS
-                            uint8_t tempPAHot = 0x00;
-                            isPAhot(tempPAHot);
-                            if( tempPAHot == 0xFF ){
-                                gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG);
+                            P_COM_HK;
+                            if( (gFLAGS & COM_PA_HOT_FLAG) || ( gFLAGS & COM_PA_OC_FLAG ) ){
+                                COM_TX_CNTRL = 0;
+                                gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT);
+                                gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
+                                RX1M.attach(&rx_read, Serial::RxIrq);
+                            }
+                            else{
                                 gCOM_PA_COOLING_TIMEOUT.detach();
                                 gPC.puts("EXECUTING TELECOMMANDS\r\n");
-//                                DEBUF_PRINT("EXECUTING TELECOMMANDS\r\n");
                                 EXECUTE_OBOSC_ONLY;
                                 EXECUTE_TC;
                                 gPC.puts("COMPLETED EXECUTION\r\n");
                             }
-                            else{
-                                gFLAGS = gFLAGS | COM_PA_HOT_FLAG;
-                                // PENDING: power off transmitter only
-                                gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT);
-                                gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
-                                RX1M.attach(&rx_read, Serial::RxIrq);
-                            }
                         }
                         else{
                             /*gPC.puts("GS code mismatch !!\r\n");*/
@@ -194,10 +203,11 @@
                             reset_all;
                             gFLAGS = gFLAGS & (~COM_SESSION_VALIDITY);
                             // PENDING : ENABLE THREADS
+                            // gCDMS_HK_TIMER.start(5000);
                             PL_wo_dma->start(6000);
                             gSESSION_TIMEOUT.detach();
                             gFLAGS = gFLAGS & (~COM_SESSION_FLAG);
-                            // WARNING: clear COM_MNG_TMTC ?
+                            gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
                         }
                     }
                     else{
@@ -228,15 +238,16 @@
                         }
                         //gPC.puts("\r\n");
                         COM_POWER_ON_TX;
-                        // PENDING : POWER OFF TX
+                        COM_TX_CNTRL = 0;
                         RX1M.attach(&rx_read, Serial::RxIrq);
                         gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
                     }
                 }
                 else{
                     COM_POWER_ON_TX;
-                    // POWER OFF TX transmitter only
-                    // WARNING: reset_all ? clear com_session ?
+                    COM_TX_CNTRL = 0;
+                    reset_all;
+                    gFLAGS = gFLAGS & (~COM_SESSION_FLAG);
                     RX1M.attach(&rx_read, Serial::RxIrq);
                     gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
                 }
@@ -247,6 +258,7 @@
                 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
                 reset_all;
                 // PENDING : ENABLE THREADS
+                // gCDMS_HK_TIMER.start(5000);
                 PL_wo_dma->start(6000);
                 gSESSION_TIMEOUT.detach();
                 gFLAGS = gFLAGS & (~COM_SESSION_FLAG);
@@ -254,29 +266,17 @@
         }
         else if( gFLAGS & COM_PA_HOT_FLAG ){
             /*gPC.puts("checking for PA hot in main\r\n");*/
-            if( gFLAGS & COM_RX_FLAG ){
-                uint8_t tempPA = 0xFF;
-                isPAhot(tempPA);
-                if( tempPA == 0x00 ){
-                    gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT);
-                }
-                else{
-                    gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG);
-                    gCOM_PA_COOLING_TIMEOUT.detach();
-                }
+            P_COM_HK;
+            if((gFLAGS & COM_PA_HOT_FLAG) || (gFLAGS & COM_PA_OC_FLAG)){
+                COM_TX_CNTRL = 0;
+                gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT);
             }
             else{
-                uint8_t tempPA = 0xFF;
-                isPAhot(tempPA);
-                if( tempPA == 0x00 ){
-                    gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT);
-                }
-                else{
+                gCOM_PA_COOLING_TIMEOUT.detach();
+                if( !(gFLAGS & COM_RX_FLAG) ){
                     /*gPC.puts("PA IS COOLED DOWN\r\n");*/
-                    gFLAGS = gFLAGS & (~COM_PA_HOT_FLAG);
                     gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG;
                     RX1M.attach(NULL);
-                    gCOM_PA_COOLING_TIMEOUT.detach();
                     COM_POWER_ON_TX;
                     EXECUTE_OBOSC_ONLY;
                     EXECUTE_TC;
@@ -287,7 +287,7 @@
             /*gPC.puts("session timeout: resetting in main\r\n");*/
             COM_POWER_OFF_TX;
             /*PENDING : ENABLE THREADS*/
-            
+            // gCDMS_HK_TIMER.start(5000);
             gSESSION_TIMEOUT.detach();
             gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG);
             gFLAGS = gFLAGS & (~COM_SESSION_FLAG);
@@ -299,6 +299,7 @@
             COM_POWER_OFF_TX;
             reset_all;
             // PENDING : ENABLE THREADS
+            // gCDMS_HK_TIMER.start(5000);
             PL_wo_dma->start(6000);
             gSESSION_TIMEOUT.detach();
             gFLAGS = gFLAGS & (~COM_SESSION_FLAG);
--- a/common_functions.h	Sun Jul 03 09:47:05 2016 +0000
+++ b/common_functions.h	Sun Jul 03 11:35:55 2016 +0000
@@ -77,7 +77,7 @@
                     }\
                 }\
                 else{\
-                    /*PENDING: reset cdms*/\
+                    RESET_CDMS;\
                     break;\
                 }\
             }\
@@ -99,18 +99,24 @@
             /*Attach this new node at the end*/\
         }\
         else{\
-            /*PENDING: reset CDMS*/\
+            RESET_CDMS;\
             break;\
         }\
     }\
 }
 
 #define put_crc_l1_ack(tm_ptr) {\
-    tm_ptr->TM_string[2] = gTOTAL_CRC_FAIL_TC & 0xFF;\
     /*TC LIST STATUS*/\
-    tm_ptr->TM_string[3] |= (gMASTER_STATE << 5) & 0xE0;\
+    tm_ptr->TM_string[3] |= (gMASTER_STATE << 6) & 0xC0;\
     /*PA HOT*/\
     if( gFLAGS & COM_PA_HOT_FLAG ){\
+        tm_ptr->TM_string[3] |= (1 << 5);\
+    }\
+    else{\
+        tm_ptr->TM_string[3] &= ~(1 << 5);\
+    }\
+    /*PA OC*/\
+    if( gFLAGS & COM_PA_OC_FLAG ){\
         tm_ptr->TM_string[3] |= (1 << 4);\
     }\
     else{\
@@ -124,16 +130,39 @@
 #define fill_l1_ack(tm_ptr) {\
     tm_ptr->next_TM = NULL;\
     tm_ptr->TM_string[0] = TMID_ACK_L1 << 4;\
-    /*PENDING: PA TEMPERATURE*/\
     tm_ptr->TM_string[1] = gTOTAL_INCORRECT_SIZE_TC & 0xFF;\
     tm_ptr->TM_string[2] = gTOTAL_CRC_FAIL_TC & 0xFF;\
 }
 
+#define P_COM_HK{\
+    uint8_t returnHere;\
+    isPAhot(returnHere);\
+    if (returnHere == 0xFF)\
+        gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG);\
+    else\
+        gFLAGS = gFLAGS | COM_PA_HOT_FLAG;\
+    if (gFLAGS & COM_PA_OC_FLAG){\
+        COM_TX_CNTRL = 1;\
+        wait_ms(5);\
+    }\
+    isPAoc(returnHere);\
+    if (returnHere == 0xFF)\
+        gFLAGS = gFLAGS & ~(COM_PA_OC_FLAG);\
+    else\
+        gFLAGS = gFLAGS | COM_PA_OC_FLAG;\
+    /*P_CDMS_HANDLE_HW_FAULTS*/\
+}
+
 #define isPAhot(returnHere){\
     /*PENDING : COMPLETE THIS FUNCTION*/\
     returnHere = 0xFF;\
 }
 
+#define isPAoc(returnHere){\
+    /*PENDING : COMPLETE THIS FUNCTION*/\
+    returnHere = 0xFF;\
+}
+
 #define get_call_sign(tm_ptr) {\
     Base_tm* call_sign_tm = new Short_tm;\
     call_sign_tm->next_TM = NULL;\
@@ -156,7 +185,6 @@
             /*IF CRC PASS*/\
             if( (GETcrc_pass(current_TC) == 1) ){\
                 if(TC_count > 4){\
-                    /*PENDING: FILL TC_EXEC_CODE, APPEND CRC TO THE TM*/\
                     put_crc_l1_ack( l1_ack );\
                     /*extend the TM linked list*/\
                     TC_count = 0;\
@@ -189,7 +217,7 @@
             ++overflowCountL1;\
         }\
         else{\
-            /*PENDING: RESET CDMS*/\
+            RESET_CDMS;\
             break;\
         }\
     }\