TELECOMMAND MANAGER V1

Dependencies:   mbed SLCD mbed-rtos

Revision:
8:cb93c1d3209a
Parent:
7:e71ecfe3a340
Child:
9:934fdce72b3d
Child:
11:109f16cc35d7
Child:
13:7b27a8e9cbb4
--- a/MNG_TC.h	Mon Jul 06 05:00:29 2015 +0000
+++ b/MNG_TC.h	Mon Jul 13 10:21:45 2015 +0000
@@ -1,8 +1,15 @@
-// 3 July
-// Dheeraj detect_nack()
-// Sukhdeep SND_TM
+// 8 Jul
+// did flowchart of states
 
-//Jun 8
+// 7 Jul 
+// done :decode should run once not every time tc received handle this
+// handle sd card with cdms team
+
+// done :replace tc_list header with VAR_SPACE HEAD
+// done :delete data in rcv_tc
+// done :handle last tc in mbg and rcv_tc
+// done :delete all tc after pass
+
 
 //Jun 7 
 //PROBLEM IN DELETING TC_string pointer not solved
@@ -40,237 +47,329 @@
 // TMID list
 #define TMID_ACK_L1 10
 
-class MNG_TC
+namespace MNG_TC
 {
-private:
-    int total_valid_TC;
-    bool all_crc_pass;
-    bool no_missing_TC;
-    bool stop_after_current_TC;
-    bool execute_high_priority_TC;
-    TC_list *Head_TC;
-
+    unsigned char psc = PSC_START_VALUE;
+    unsigned int total_valid_TC = 0;
+    bool all_crc_pass = true;
+    bool no_missing_TC = true;
+    unsigned int exec_count = 0;
 
 //SECONDARY FUNCTIONS : [SHOULD NOT BE CALLED INDEPENDENTLY]
 //USED BY MEMBER FUNCTIONS FOUND BELOW
 
-//PROBLEM IN DELETING TC_string POINTER
-    void delete_TC(TC_list *tc_ptr, TC_list* previous_tc){
-        // stitch the previous and next node
-        TC_list *temp_n = tc_ptr->next_TC;
-        
-        if( (previous_tc != NULL) && (temp_n != NULL) ){
-            previous_tc->next_TC = temp_n;
-        }
-        else if( (previous_tc == NULL) && (temp_n != NULL) ){
-            // delete head node HENCE UPDATE HEADER
-            Head_TC = temp_n;
-        }
-        else if( (previous_tc != NULL) && (temp_n == NULL) ){
-            // delete last node
-            previous_tc->next_TC = NULL;
+    namespace L1_ACK{
+    
+        void generate_L1_ack_TM(TM_list *tm_ptr){
+            tm_ptr->next_TM = NULL;
+            tm_ptr->TM_string = new unsigned char[TM_SHORT_SIZE];
+            // TMID
+            tm_ptr->tmid = 0xA;
+            tm_ptr->TM_string[0] = 0xaf;
         }
-        else{
-            // delete the only single node present
-            // in which case head is the only node
-            Head_TC = NULL;
-        }
+        
+        void execode_crc(bool all_pass, TM_list *tm_ptr){
+            
+            tm_ptr->TM_string[1] = ( all_crc_pass == true ) ? 0x01 : 0x00 ;
+            
+            uint16_t crc_checksum = CRC::crc16_gen(tm_ptr->TM_string, TM_SHORT_SIZE-2);
 
-//             delete the node
-        delete tc_ptr;
-    }        
-    
-    void generate_L1_ack_TM(TM_list *tm_ptr){
-        tm_ptr->next_TM = NULL;
-        tm_ptr->TM_string = new unsigned char[TM_SHORT_SIZE];
-        // TMID
-        tm_ptr->tmid = 0xA;
-        tm_ptr->TM_string[0] = 0xaf;
+            tm_ptr->TM_string[TM_SHORT_SIZE-2] = (crc_checksum >> 8) & 0xff;
+            tm_ptr->TM_string[TM_SHORT_SIZE-1] = crc_checksum & 0xff;
+        }
     }
     
-    void execode_crc(bool all_pass, TM_list *tm_ptr){
-        
-        tm_ptr->TM_string[1] = ( all_crc_pass == true ) ? 0x01 : 0x00 ;
-        
-        uint16_t crc_checksum = CRC::crc16_gen(tm_ptr->TM_string, TM_SHORT_SIZE-2);
+    namespace EXECUTION{
 
-        tm_ptr->TM_string[TM_SHORT_SIZE-2] = (crc_checksum >> 8) & 0xff;
-        tm_ptr->TM_string[TM_SHORT_SIZE-1] = crc_checksum & 0xff;
-    }
-    
-    TM_list* respond_CDMS(TC_list *ptr_tc){
-        
+        TM_list* Manage_CDMS(TC_list *ptr_tc){
+            
 //            DUMMY PROGRAM TO CREATE A SAMPLE TM
 
 //            allocate memory for new tm list
-        TM_list *test_TM = new TM_list;
-        
-        test_TM->next_TM = NULL;
-        
+            TM_list *test_TM = new TM_list;
+            
+            test_TM->next_TM = NULL;
+            
 //            allocate memory for the tm string
-        unsigned char *str = new unsigned char[TM_TYPE1_SIZE];
-        
-        
+            unsigned char *str = new unsigned char[TM_TYPE1_SIZE];
+            
+            
 //            frame type-1 is 0. [ (0 << 7) = 0 ]
-        str[0] = 0;
-        
+            str[0] = 0;
+            
 //            the tmid determines type-1, or 2
 //            tmid : 0x1 belongs to type1 (dummy program)
-        test_TM->tmid = 0x1;
+            test_TM->tmid = 0x1;
 
-        // 4 bit TMID
-        str[0] += (0x1) << 3;
-        
-        // 20 bit seq. count
-        str[0] += 0x7;
-        str[1] = 0xff;
-        str[2] = 0xff;
+            // 4 bit TMID
+            str[0] += (0x1) << 3;
+            
+            // 20 bit seq. count
+            str[0] += 0x7;
+            str[1] = 0xff;
+            str[2] = 0xff;
 
-        // random data
-        for(int i = 3 ; i < (TM_TYPE1_SIZE-2) ; ++i ){
-            str[i] = 'a';
-        }
-        
+            // random data
+            for(int i = 3 ; i < (TM_TYPE1_SIZE-2) ; ++i ){
+                str[i] = 'a';
+            }
+            
 //            APPEND CRC : ALL THE PROCESSES HAVE TO GENERATE AND APPEND CRC
-        uint16_t crc_checksum = CRC::crc16_gen(str, TM_TYPE1_SIZE-2);
-        str[TM_TYPE1_SIZE-2] = (crc_checksum >> 8) & 0xff;
-        str[TM_TYPE1_SIZE-1] = crc_checksum & 0xff;
-
-        test_TM->TM_string = str;
+            uint16_t crc_checksum = CRC::crc16_gen(str, TM_TYPE1_SIZE-2);
+            str[TM_TYPE1_SIZE-2] = (crc_checksum >> 8) & 0xff;
+            str[TM_TYPE1_SIZE-1] = crc_checksum & 0xff;
 
-        return test_TM;
-    }
-    
-    TM_list* RELAY(TC_list *tc_ptr){
-    
-//            FIRST send long or short tc
-        unsigned char tc_len = ( tc_ptr->short_or_long ? TC_SHORT_SIZE : TC_LONG_SIZE );
-        
-        if( tc_ptr->apid == 0x01 ){
-            // send TC to BAE microcontroler
-            
-        }
-        else{
-            // send TC to SPEED microcontroller
-            
+            test_TM->TM_string = str;
+
+            return test_TM;
         }
         
-        PC.putc( tc_len );
-//            THE TARGET SHOULD READ 'n' MORE BYTES AS FOUND IN THE FIRST BYTE
-        
-//            SEND THE TC TO THE TARGET DEVICE [ALONG WITH CRC]
-        for(unsigned int i = 0 ; i < tc_len ; ++i){
-            PC.putc( tc_ptr->TC_string[i] );
-        }
-        
-//            WAIT FOR THE TM
-        TM_list* tm_head = new TM_list;
-        TM_list* tm_ptr = tm_head;
+//        TM_list* RELAY(TC_list *tc_ptr){
+//        
+////            FIRST send long or short tc
+//            unsigned char tc_len = ( tc_ptr->short_or_long ? TC_SHORT_SIZE : TC_LONG_SIZE );
+//            PC.putc( tc_len );
+////            THE TARGET SHOULD READ 'n' MORE BYTES AS FOUND IN THE FIRST BYTE
+//            
+////            SEND THE TC TO THE TARGET DEVICE [ALONG WITH CRC]
+//            for(unsigned int i = 0 ; i < tc_len ; ++i){
+//                PC.putc( tc_ptr->TC_string[i] );
+//            }
+//            
+////            WAIT FOR THE TM
+//            TM_list* tm_head = new TM_list;
+//            TM_list* tm_ptr = tm_head;
+//            
+////            FIRST RECEIVE NUMBER OF TM'S TO BE RECEVIVED
+//             unsigned char tm_num = PC.getc();
+//             for(unsigned int i = 0 ; i < tm_num ; ++i){
+//                
+////                THEN FOR EACH TM FIRST SEND TYPE-1 OR TYPE-2 i.e. NUMBER OF BYTES TO READ 
+//                unsigned char tm_len = PC.getc();
+//                tm_ptr->TM_string = new unsigned char[tm_len];
+//                for(unsigned int j = 0 ; j < tm_len ; ++j){
+//                    tm_ptr->TM_string[j] = PC.getc();
+//                }
+//                
+////                DECODE TMID FROM THE PACKET
+//                if(tm_len == 134){
+//                    unsigned char temp = tm_ptr->TM_string[0];
+//                    tm_ptr->tmid = (temp >> 3) & 0xf;
+//                }
+//                else{
+//                    unsigned char temp = tm_ptr->TM_string[4];
+//                    tm_ptr->tmid = (temp >> 4) & 0xf;
+//                }
+//                
+////                ALLOCATE MEMORY FOR NEXT TM PACKET
+//                if( i == tm_num-1 ){
+//                    tm_ptr->next_TM = NULL;
+//                }
+//                else{
+//                    tm_ptr->next_TM = new TM_list;
+//                    tm_ptr = tm_ptr->next_TM;
+//                }
+//             }
+//             
+////            FILL IN THE tm_ptr AND RETURN
+//            return tm_head;
+//        }
         
-//            FIRST RECEIVE NUMBER OF TM'S TO BE RECEVIVED
-         unsigned char tm_num = PC.getc();
-         for(unsigned int i = 0 ; i < tm_num ; ++i){
-            
-//                THEN FOR EACH TM FIRST SEND TYPE-1 OR TYPE-2 i.e. NUMBER OF BYTES TO READ 
-            unsigned char tm_len = PC.getc();
-            tm_ptr->TM_string = new unsigned char[tm_len];
-            for(unsigned int j = 0 ; j < tm_len ; ++j){
-                tm_ptr->TM_string[j] = PC.getc();
-            }
-            
-//                DECODE TMID FROM THE PACKET
-            if(tm_len == 134){
-                unsigned char temp = tm_ptr->TM_string[0];
-                tm_ptr->tmid = (temp >> 3) & 0xf;
+        bool detect_ack(TM_list *tm_ptr){
+//            printf("inside detect ack : ");
+            if( tm_ptr != NULL ){
+                unsigned char tm_ack = tm_ptr->TM_string[3];
+                tm_ack &= 0xFF;//Ack or Nack can be decided just by checking [5:6] bits
+                if( (tm_ack == 0xE0) || (tm_ack == 0xA0) || (tm_ack == 0xC0) ){
+//                    printf("ack found\r\n");
+                    return true;
+                }
+                else{
+//                    printf("nack found\r\n");
+                    return false;
+                }
             }
             else{
-                unsigned char temp = tm_ptr->TM_string[4];
-                tm_ptr->tmid = (temp >> 4) & 0xf;
-            }
-            
-//                ALLOCATE MEMORY FOR NEXT TM PACKET
-            if( i == tm_num-1 ){
-                tm_ptr->next_TM = NULL;
-            }
-            else{
-                tm_ptr->next_TM = new TM_list;
-                tm_ptr = tm_ptr->next_TM;
-            }
-         }
-         
-//            FILL IN THE tm_ptr AND RETURN
-        return tm_head;
-    }
-    
-    
-    /*
-    @brief:     detect ack_l234 : first tm for any tc will be the ack_l234
-    @param:     tm_ptr : pointer to the telemetry head
-    @return:    true : ack
-                false : nack
-    */
-    bool detect_ackl234(TM_list *tm_ptr){
-        char temp = tm_ptr->TM_string[0];
-        
-        // 
-        if( (temp  & 0xF0) == 0xB0 ){
-            temp = tm_ptr->TM_string[3];
-            
-            // the nack and ack code
-            if(temp != 0x00){
-                return true;
-            }
-            else{
+//                printf("nack null\r\n");
                 return false;
             }
         }
-        else{
-            return false;
+        
+        bool obosc_tc(TC_list *tc_ptr){
+            bool OBOSC = false;
+            // check apid
+            if(tc_ptr->apid == 2){
+                // check service type
+                if( (tc_ptr->TC_string[2]) >> 4 == 0xB ){    
+                    // check service subtype
+                    switch( (tc_ptr->TC_string[2]) & 0xf ){
+                        case 1:
+                        case 2:
+                        case 5:
+                        case 6:
+                        case 15:
+                            OBOSC = true;
+//                            printf("found obosc\r\n");
+                    }
+                }
+            }
+            
+            return OBOSC;
+        }
+        
+        TM_list* execute_obosc(TC_list *tc_ptr){
+//            printf("inside execute obosc\r\n");
+            unsigned char service_subtype = (tc_ptr->TC_string[2]) & 0x0F;
+            unsigned char num = 0;
+            unsigned char psc = 0x00;
+            switch( service_subtype ){
+                case 0x01:
+                    // disable tc
+                    num = tc_ptr->TC_string[4];
+                    psc = tc_ptr->TC_string[3];
+                    
+                    for(int i = 0 ; i < num ; ++i){
+                        TC_list *tcp = VAR_SPACE::Head_node;
+                        while( tcp != NULL ){
+                            if(tcp->packet_seq_count == psc){
+                                tcp->enabled = false;
+                                ++psc;
+                                break;
+                            }
+                        }
+                    }
+                    break;
+                case 0x02:
+                    // enable tc
+                    num = tc_ptr->TC_string[4];
+                    psc = tc_ptr->TC_string[3];
+                    
+                    for(int i = 0 ; i < num ; ++i){
+                        TC_list *tcp = VAR_SPACE::Head_node;
+                        while( tcp != NULL ){
+                            if(tcp->packet_seq_count == psc){
+                                tcp->enabled = true;
+                                ++psc;
+                                break;
+                            }
+                        }
+                    }
+                    break;
+                case 0x05:
+                    // retry executin of tc
+                    psc = tc_ptr->TC_string[3];
+                    
+                    break;
+            }
+            // generate ackL234
+            return NULL;
+        }
+        
+        bool sdCardOp(TC_list* tc_ptr){
+            bool readSD = false;
+
+            if(tc_ptr->apid == 2){
+                if( ( (tc_ptr->TC_string[2]) >> 4) == 0xF ){    
+                    switch( (tc_ptr->TC_string[2]) & 0xf ){
+                        case 0:
+                        case 1:
+                        case 2:
+                        case 3:
+                        case 4:
+                            readSD = true;
+//                            printf("found sdcard op\r\n");             
+                    }
+                }
+            }
+            return readSD;
+        }
+        
+        TM_list* CDMS_RLY_TMTC(TC_list* tc_ptr){
+            return NULL;
+        }
+        
+        bool inline execute_core(TC_list *tc_ptr){
+            printf("executing core psc = %u\r\n", psc);
+            
+            if( !EXECUTION::sdCardOp(tc_ptr) ){
+//                printf("not sd card op\r\n");
+                TM_List *tm_ptr;
+                
+                // call relay here
+                tm_ptr = EXECUTION::CDMS_RLY_TMTC(tc_ptr);
+                                        
+               // SEND DATA TO GS
+//                SND_TM(tm_ptr);
+                // for rolling buffer : 
+                // send EoS only if TM to next tc has not arrived yet
+                // else put the next TM itself.
+                
+                if( EXECUTION::detect_ack(tm_ptr) ){
+                    tc_ptr->exec_status = 1;
+                }
+                else{
+                    tc_ptr->exec_status = 2;
+                    tc_ptr->enabled = false;
+                    if( tc_ptr->abort_on_nack ){
+                        return false;
+                    }
+                }
+                
+                // DELETE THE TM AFTER USE
+                while(tm_ptr != NULL){
+                    TM_list *temp = tm_ptr->next_TM;
+                    delete tm_ptr;
+                    tm_ptr = temp;
+                }
+            }
+            else{
+                // write sd card code
+            }
+            return true;
         }
     }
-    
-    bool sdCardOp(TC_list *tc_ptr){
-        return false;
-    }
-        
-public:
-    
-// Constructor
+
+//    MEMBER FUNCTIONS
+
 /*
 @brief:     INITIALISE THE HEAD NODE AND RESET THE VARIABLES
 @param:     TC_list *head : head node pointer
 @return:    none
 */
-    MNG_TC( TC_list *HEAD ){
+    void init(){
 //        printf("inside init\r\n");
         total_valid_TC = 0;
         all_crc_pass = true;
         no_missing_TC = true;
-        stop_after_current_TC = false;
-        execute_high_priority_TC = false;
-        Head_TC = HEAD;
+        psc = PSC_START_VALUE;
+        exec_count = 0;
     }
 
+
 /*
 @brief:     DELETE THE CRC FAILED TC FROM THE LIST TO FREE-UP MEMORY AND UPDATE 
             THE TOTAL VALID TC AND GENERATE L1_ACK_TM
 @param:     none
-@return:    1 if all tc are crc pass
-            0 if atleast one crc fail
+@return:    none
 */
-    int start_with(){
-//        printf("inside start with\r\n");
-        TC_list *current_TC = Head_TC;
+    void start_with(){
+        printf("inside start with\r\n");
+        TC_list *current_TC = VAR_SPACE::Head_node;
         
         total_valid_TC = 0;
         all_crc_pass = true;
 
-        TM_list *l1_ack = new TM_list;
-        TM_list *l1_ack_head = l1_ack;
-        generate_L1_ack_TM(l1_ack);
+        TM_List *l1_ack = new TM_List;
+        TM_List *l1_ack_head = l1_ack;
+        L1_ACK::generate_L1_ack_TM(l1_ack);
         
         int TC_count = 0;
-        
+//        printf("outside while in start with\r\n");
+//        TC_list *zing = VAR_SPACE::Head_node;
+//        while(zing != NULL){
+////            printf("packet seq count = %u\r\n", zing->packet_seq_count);
+//            zing = zing->next_TC;
+//        }
         while(current_TC != NULL){
             
             unsigned char temp = 0;
@@ -282,6 +381,7 @@
 //          IF CRC PASS
             if( current_TC->crc_pass ){
                 ++total_valid_TC;
+                printf("correct start with: psc = %u, short = %u\r\n", current_TC->packet_seq_count, (current_TC->short_or_long) ? 1 : 0 );
 
 //                 set the crc pass field in TC_STATUS ???
                 temp = l1_ack->TM_string[2];
@@ -293,6 +393,7 @@
             }
 //             if crc fail
             else{
+                printf("crc fail start with: psc = %u\r\n", current_TC->packet_seq_count);
                 // unset the crc pass field in TC_STATUS
                 temp = l1_ack->TM_string[2];
                 temp &= ~( 1 << (7-TC_count) );
@@ -301,117 +402,66 @@
                 current_TC = current_TC->next_TC;
                 all_crc_pass = false;
             }
-            
             ++TC_count;
 
 //             extend the TM linked list if TC_count > 7
             if(TC_count > 7){
                 TC_count = 0;
 
-                l1_ack->next_TM = new TM_list;
+                l1_ack->next_TM = new TM_List;
                 l1_ack = l1_ack->next_TM;
-                generate_L1_ack_TM(l1_ack);
+                L1_ACK::generate_L1_ack_TM(l1_ack);
                 
 //                FILL TC_EXEC_CODE
 //                APPEND CRC TO THE TM
-                execode_crc( all_crc_pass, l1_ack );
+                L1_ACK::execode_crc( all_crc_pass, l1_ack );
             }
         }
         
-//        FILL UP THE REMAINING FIELDS WITH 0xFF since 0x00 causes problems with GS software
+//        FILL UP THE REMAINING FIELDS WITH ZEROS
         while(TC_count < 8){
             l1_ack->TM_string[2] &= ~( 1 << (7-TC_count) );
-            l1_ack->TM_string[3+TC_count] = 0xFF;
+//            l1_ack->TM_string[3+TC_count] = 0;
+            l1_ack->TM_string[3+TC_count] = 0x01;
             ++TC_count;
         }
         
 //        FILL TC_EXEC_CODE
 //        APPEND CRC TO THE TM
-        execode_crc(all_crc_pass, l1_ack);
+        L1_ACK::execode_crc(all_crc_pass, l1_ack);        
 
-        SND_TM(l1_ack_head);
+//        SND_TM(l1_ack);
         
         // delete the TM
         l1_ack = l1_ack_head;
         while(l1_ack != NULL){
-            TM_list *temp = l1_ack->next_TM;
+            TM_List *temp = l1_ack->next_TM;
             delete l1_ack;
             l1_ack = temp;
         }
-
-        if(all_crc_pass == false){
-             return 0;
-        }
-
-        return 1;
-    }
-    
-/*
-@brief:     Run either start_with() or update_valid_tc()
-@param:     none
-@return:    int 1 for all crc pass
-            int 0 if atleast one crc fail
-*/
-    void update_valid_TC(){
-        TC_list *current_TC = Head_TC;
-        
-        total_valid_TC = 0;
-        all_crc_pass = true;
-        
-        while(current_TC != NULL){
-            if( current_TC->crc_pass ){
-                ++total_valid_TC;
-            }
-            else{
-                all_crc_pass = false;
-            }
-            current_TC = current_TC->next_TC;
-        }
+        printf("finished start_with()\r\n");
     }
 
 /*
-@brief:     decode the TCs and fill in the values in the tc-node. 
+@brief:     check for missing tc, also check crc, i.e. 
+            if true execution can be started else have to wait
 @param:     none
-@return:    none
+@return:    bool indicating whether there are missing tc
 */
-    void decode_TC(){
-        TC_list *node_ptr = Head_TC;
-
-        while( node_ptr != NULL ){
-
-            unsigned char temp;
-
-            // PSC
-            node_ptr->packet_seq_count = node_ptr->TC_string[0];
-            // APID
-            temp = node_ptr->TC_string[1];
-            node_ptr->apid = (temp >> 6) & 3;
-            // Abort On Nack
-            node_ptr->abort_on_nack = (temp >> 3) & 1;
-            // default values of enable and execution
-            node_ptr->enabled = true;
-            node_ptr->valid_execution = false;
-
-            node_ptr = node_ptr->next_TC;
-        }
-    }
-
-/*
-@brief:     check for missing tc, run start_with() or update_valid_tc() before
-@param:     none
-@return:    int 1 no missing tc
-            int 0 missing tc
-*/
-
-    int check_for_missing_TC(){
+    bool check_for_missing_TC(void){
+        printf("checking for missing tc\r\n");
         no_missing_TC = true;
         
-        for(unsigned char psc = PSC_START_VALUE ; psc < (total_valid_TC + PSC_START_VALUE) ; ++psc){
+//        printf("total valid = %u\r\n", total_valid_TC);
+        
+        for(unsigned char p = PSC_START_VALUE ; p < (total_valid_TC + PSC_START_VALUE) ; ++p){
             bool flag = false;
-            TC_list *node_ptr = Head_TC;
+            TC_list *node_ptr = VAR_SPACE::Head_node;
+//            printf("checking for psc = %u\r\n", p);
             
             while(node_ptr != NULL){
-                if(node_ptr->packet_seq_count == psc){
+//                printf("packet seq count = %u\t", node_ptr->packet_seq_count);
+                if( (node_ptr->packet_seq_count == p) && (node_ptr->crc_pass) ){
                     flag = true;
                     break;
                 }
@@ -419,21 +469,24 @@
                     node_ptr = node_ptr->next_TC;
                 }
             }
-            
+//            printf("\r\n");
             if(flag == false){
                 no_missing_TC = false;
                 break;
             }
         }
         
+        printf("returning from check for missing tc : %u\r\n", no_missing_TC ? 1 : 0);
         if(no_missing_TC){
-            return 1;
+            return true;
         }
         else{
-            return 0;
+            return false;
         }
     }
 
+
+
 /*
 RUN start_with() before running execute_TC()
 V1.0
@@ -443,103 +496,100 @@
 @param:     none
 @return:    none
 */
+    TC_list *Second_head = NULL;
     void execute_TC(){
-        unsigned char psc = PSC_START_VALUE;
-        
     //    EXECUTE ACCORDING TO THE PSC VALUE
+        printf("inside execute tc : total valid tc = %u, psc = %u\r\n", total_valid_TC, psc);
         while( psc < (total_valid_TC+PSC_START_VALUE) ){
+//            printf("Iterating : psc = %u\r\n", psc);
+            // check for new tc received
+            bool exec_flag_local = false;
+            if( VAR_SPACE::new_tc_received ){
+                printf("inaside new tc rx in obosc\r\n");
+                VAR_SPACE::new_tc_received = false;
+                
+                VAR_SPACE::data_node = VAR_SPACE::head_data;
+                Second_head = VAR_SPACE::last_node;
+                COM_RCV_TC::rx_rcv_tc();
+                Second_head = Second_head->next_TC;
+                exec_flag_local = true;
+            }
+            else if( VAR_SPACE::execute_obosc ){
+                printf("execute obosc flag found\r\n");
+                exec_flag_local = true;
+            }
+            if( exec_flag_local ){
+                exec_flag_local = false;
+                
+                start_with();
+                
+                if( !check_for_missing_TC() ){
+                    VAR_SPACE::rx_state = 3;
+                    printf("exiting from obosc\r\n");
+                    return;
+                }
+                else{
+                    printf("executing obosc\r\n");
+                    // no missing tc : execute urgent
+                    TC_list *tcp = Second_head;
+                    while( tcp != NULL ){
+                        if( EXECUTION::obosc_tc(tcp) ){
+                            TM_list *tm_ptr = EXECUTION::execute_obosc(tcp);
+//                            SND_TM(tm_ptr);
+                            if( EXECUTION::detect_ack(tm_ptr) ){
+                                tcp->exec_status = 1;
+                            }
+                            else{
+                                tcp->exec_status = 2;
+                                if( tcp->abort_on_nack ){
+                                    tcp->enabled = false;
+                                    VAR_SPACE::rx_state = 0;
+                                    printf("exiting from obosc due to abort on nack\r\n");
+                                    VAR_SPACE::rx_state = 0;
+                                    return;
+                                }
+                            }
+                        }
+                        tcp = tcp->next_TC;
+                    }
+                }
+                VAR_SPACE::execute_obosc = false;
+                VAR_SPACE::rx_state = 2;
+            }
             
-            TC_list *tc_ptr = Head_TC;
-            
+            TC_list *tc_ptr = VAR_SPACE::Head_node;
     //        FIND THE TC CORRESPONDING TO THE PSC VALUE
             while(tc_ptr != NULL){
-                if( (tc_ptr->packet_seq_count == psc) && (tc_ptr->crc_pass) ){
+//                printf("in while : psc = %u\r\n", psc);
+                if( (tc_ptr->packet_seq_count == psc) && (tc_ptr->crc_pass)){
     //                THE TC WITH THE REQUIRED PSC HAS BEEN FOUND, NOW EXECUTE
                     
-                    if( !sdCardOp(tc_ptr) ){
-                        TM_list *tm_ptr;
-                        if( tc_ptr->apid == APID_CDMS ){
-        //                    IF THE TC BELONGS TO THE CDMS uc CALL THE LOCAL FUNCTION Manage_CDMS()
-                            tm_ptr = respond_CDMS(tc_ptr);
-                        }
-                        else{
-        //                IF THE TC BELONGS TO OTHER MODULE, RELAY() IS CALLED WHICH ACTS AS A MESSENGER
-                            tm_ptr = RELAY(tc_ptr);
-                        }
+                    if( (tc_ptr->exec_status == 0) || ((tc_ptr->exec_status == 2) && (tc_ptr->enabled)) ){
+                        // execute tc
                         
-                        // detect nack
-                        if( detect_ackl234(tm_ptr) ){
-                            tc_ptr->valid_execution = true;
-                        }
-                        else if( tc_ptr->abort_on_nack ){
-                            tc_ptr->valid_execution = false;
-                            // abort on nack is true and nack received : end thread
-                            Thread::wait(osWaitForever);
+                        ++exec_count;
+                        if( EXECUTION::execute_core(tc_ptr) ){
+                            // THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER
+                            break;
                         }
                         else{
-                            tc_ptr->valid_execution = false;
+                            printf("returning due to abort on nack\r\n");
+//                            do something for the unexecuted telecommands
+                            VAR_SPACE::rx_state = 0;
+                            return;
                         }
-                        
-        //                SEND DATA TO GS
-                        SND_TM(tm_ptr);
-                        
-        //                DELETE THE TM AFTER USE
-                        while(tm_ptr != NULL){
-                            TM_list *temp = tm_ptr->next_TM;
-                            delete tm_ptr;
-                            tm_ptr = temp;
-                        }
-                        
-                    }
-                    else{
-                        /*DO SD CARD OPERATION*/
                     }
                     
-    //                THE TC WITH APPROPRIATE PSC IS EXECUTED, START OVER
-                    break;
+                    else{
+                        // either (execution failed and disabled) or (successful executed) hence break
+                        break;
+                    }
                 }
-                
                 tc_ptr = tc_ptr->next_TC;
             }
-        }
-        
-        // executed every tc : delete all
-        TC_list *tc_ptr = Head_TC;
-        while(tc_ptr != NULL){
-            TC_list *temp = tc_ptr->next_TC;
-            delete tc_ptr;
-            tc_ptr = temp;
-        }
-    }
-    
-    void execute_urgent(){
-        
-        TC_list *tc_ptr = Head_TC;
-        while( tc_ptr != NULL ){
-            
+            ++psc;
         }
-        
-        // executed every tc : delete all
-        tc_ptr = Head_TC;
-        while(tc_ptr != NULL){
-            TC_list *temp = tc_ptr->next_TC;
-            delete tc_ptr;
-            tc_ptr = temp;
-        }
+        VAR_SPACE::rx_state = 0;
+        printf("exiting after successfully executing tc, total executed = %u\r\n", exec_count);
     }
-};
-
-void MNG_MAIN(void const *args){
-    
-    RCV_TC RcvClass( VAR_SPACE::Head_node1 );
-    MNG_TC manager( VAR_SPACE::Head_node1 );
-    
-    if( manager.start_with() ){
-        manager.decode_TC();
-        if( manager.check_for_missing_TC() ){
-            manager.execute_TC();
-        }
-    }
-    
-    Thread::wait(osWaitForever);
-}
\ No newline at end of file
+}