Dummy program to demonstrate problems: working code

Dependencies:   SLCD mbed-rtos mbed

Fork of MNG_TC by Shreesha S

Revision:
0:b5b370873460
Child:
1:df31097c8442
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MNG_TC.h	Wed Apr 15 10:43:22 2015 +0000
@@ -0,0 +1,386 @@
+// Apil 15
+//added back printf statements
+//added back delete TC_string for debugging
+
+// add number of tm packets while calling snd 
+// function overloading z
+
+#include "SND_TM.h"
+
+// starting value of packet sequence count at each pass 
+#define PSC_START_VALUE 1
+
+// APID list
+#define APID_CALLSIGN 0
+#define APID_BAE 1
+#define APID_CDMS 2
+#define APID_SPEED 3
+
+// HIGH PRIORITY TC - priority list
+// not correct values here
+#define HPTC1 5
+#define HPTC2 6
+// Add more entries above
+
+// size of short TM without CRC - in bytes
+#define TM_SHORT_SIZE 11
+#define TM_LONG_SIZE 131
+
+// TMID list
+#define TMID_ACK_L1 10
+
+typedef struct TC_list{
+    // received from the RCV_TC
+    unsigned char *TC_string;
+    bool short_or_long; //'true' for short
+    bool crc_pass;
+
+    // updated info - updated in MNG_TC
+    unsigned char packet_seq_count;
+    unsigned char apid;
+    bool abort_on_nack;
+    bool enabled;
+    bool valid_execution;
+
+    struct TC_list *next_TC;
+}TC_list;
+
+//typedef struct TM_list{
+//
+//    unsigned char *TM_string;
+//    // bool short_or_long; // true for short
+//    // pass while calling the function
+//    unsigned char tmid;
+//
+//    struct TM_list *next_TM;
+//}TM_List;
+
+class MNG_TC
+{
+private:
+
+    // private variables and flags
+    int total_valid_TC;
+    TC_list *TC_list_header;
+    bool all_crc_pass;
+    bool no_missing_TC;
+    bool stop_after_current_TC;
+    bool execute_high_priority_TC;
+
+    // private functions
+    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
+            TC_list_header = temp_n;
+        }
+        else if( (previous_tc != NULL) && (temp_n == NULL) ){
+            // delete last node
+            previous_tc->next_TC = NULL;
+        }
+        else{
+            // delete the only single node present
+            // in which case head is the only node
+            TC_list_header = NULL;
+        }
+
+        // delete the string
+        delete tc_ptr->TC_string;
+        // 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->TM_string[0] = (10 << 4) & 0xf0;
+        // fill EXEC CODE below
+    }
+    
+    TM_list* manage_process(TC_list *ptr_tc){
+        TM_list *test_TM = new TM_list;
+        test_TM->next_TM = NULL;
+        unsigned char *str = new unsigned char[TM_LONG_SIZE];
+        //ping the TC
+        test_TM->tmid = 0xa;
+
+        // 4 bit TMID
+        str[0] = (0xa) << 4;
+        
+        // 20 bit seq. count
+        str[0] += 0xf;
+        str[1] = 0xff;
+        str[2] = 0xff;
+
+        // return data and append zeroes
+        for(int i = 3 ; i < 9 ; ++i ){
+            str[i] = ptr_tc->TC_string[i];
+        }
+        for(int i = 9 ; i < TM_LONG_SIZE ; ++i){
+            str[i] = 0;
+        }
+
+        test_TM->TM_string = str;
+
+        return test_TM;
+    }
+    
+    bool detect_nack(TM_list *ptr_tm){
+        bool bluff = false;
+        return bluff;
+    }
+
+public:
+    // Constructor
+    MNG_TC(TC_list *head){
+        total_valid_TC = 0;
+        TC_list_header = head;
+        all_crc_pass = true;
+        no_missing_TC = true;
+        stop_after_current_TC = false;
+        execute_high_priority_TC = false;
+    };
+
+    // delete the crc failed TC from the list to free-up memory
+    // and update the total valid TC
+    // and GENERATE L1_ACK_TM
+    void TC_list_cleanup(){
+        printf("Inside cleanup\r\n");
+        TC_list *current_TC = TC_list_header;
+        TC_list *previous_TC = NULL;
+        
+        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);
+        
+        int TC_count = 0;
+
+        while(current_TC != NULL){
+            
+            // don't care : crc pass or fail
+            l1_ack->TM_string[3+TC_count] = current_TC->packet_seq_count;
+
+            if( current_TC->crc_pass ){
+                ++total_valid_TC;
+
+                // set the crc pass field
+                l1_ack->TM_string[2] |= ( 1 << (7-TC_count) );
+
+                // advance to the next node
+                previous_TC = current_TC;
+                current_TC = current_TC->next_TC;
+            }
+            // crc fail
+            else{
+                // unset the crc pass field
+                l1_ack->TM_string[2] &= ~( 1 << (7-TC_count) );
+
+                // delete and advance to the next node
+                TC_list *next = current_TC->next_TC;
+                delete_TC(current_TC, previous_TC);
+                current_TC = next;
+                all_crc_pass = false;
+            }
+            ++TC_count;
+
+            // extend the linked list if TC_count > 7
+            if(TC_count > 7){
+                TC_count = 0;
+
+                l1_ack->next_TM = new TM_List;
+                l1_ack = l1_ack->next_TM;
+                generate_L1_ack_TM(l1_ack);
+            }
+        }
+
+        // SND_L1_ACK to GS
+
+        // delete the TM
+        l1_ack = l1_ack_head;
+        while(l1_ack != NULL){
+            TM_List *temp = l1_ack->next_TM;
+            delete l1_ack->TM_string;
+            delete l1_ack;
+            l1_ack = temp;
+        }
+
+        if(all_crc_pass == false){
+            // exit
+        }
+        printf("Completed cleanup\r\n");
+        printf("valid TC = %d\r\n", total_valid_TC);
+    }
+
+    // At this stage ALL NODES ARE CRC PASS
+    // decode the TCs and fill in the values in the tc-node
+    void decode_TC(){
+        printf("Inside decode tc\r\n");
+        TC_list *node_ptr = TC_list_header;
+
+        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];
+            printf("chr for apid is %d\r\n", temp);
+            node_ptr->apid = (temp >> 6) & 3;
+            printf("apid = %d\r\n", node_ptr->apid);
+            // 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;
+        }
+        printf("completed decode\r\n");
+    }
+
+    // check for missing tc
+    // run TC_list_cleanup() before running this function
+    void check_for_missing_tc(){
+        printf("inside check for missing\r\n");
+        no_missing_TC = true;
+        for(unsigned char psc = PSC_START_VALUE ; psc < (total_valid_TC+PSC_START_VALUE) ; ++psc ) {
+            bool flag = false;
+            TC_list *node_ptr = TC_list_header;
+            while(node_ptr != NULL){
+                if( node_ptr->packet_seq_count == psc ){
+                    flag = true;
+                    break;
+                }
+                else{
+                    node_ptr = node_ptr->next_TC;
+                }
+            }
+            if( flag == false ){
+                no_missing_TC = false;
+                // packet with PSC = psc is missing !!
+                // exit
+                printf("exit\r\n");
+            }
+        }
+        printf("Completed check for missing\r\n");
+    }
+
+
+    // At this stage ALL NODE ARE CRC PASS and NO MISSING PACKETS
+    // function : send TC to the target wait and receive from target
+    void execute_TC(){
+        printf("inside execute tc\r\n");
+        unsigned char psc = PSC_START_VALUE;
+        while( psc < (total_valid_TC+PSC_START_VALUE) ){
+            printf("psc = %d\r\n", psc);
+            if(stop_after_current_TC){
+                // exit
+                printf("exit stop after current TC\r\n");
+            }
+            else if(execute_high_priority_TC){
+                printf("Inside hptc\r\n");
+                TC_list *tc_ptr = TC_list_header;
+                while(tc_ptr != NULL){
+                    // high priority TC belong APID_CDMS
+                    if( tc_ptr->apid == APID_CDMS ){
+                        // setup the priority order in nested if else
+                        unsigned char temp = tc_ptr->TC_string[2];
+                        unsigned char service = ( temp >> 4 ) & 0xf;
+                        TM_List *tm_ptr;
+                        if(service == HPTC1){
+                            tm_ptr = manage_process(tc_ptr); 
+                        }
+                        else if(service == HPTC2){
+                            tm_ptr = manage_process(tc_ptr);
+                        }
+                        // add more entries above
+
+                        // add number of tm packets also while calling snd 
+                        // tc_ptr : SND_TM to GS
+                        // delete tm
+
+                        if( detect_nack(tm_ptr) ){
+                            if(tc_ptr->abort_on_nack){
+                                // exit
+                                printf("exit");
+                            }
+                        }
+                        else{
+                            tc_ptr->valid_execution = true;
+                            // delete the tc string to free up memory
+                            delete tc_ptr->TC_string;
+                        }
+                    }
+                }
+                execute_high_priority_TC = false;
+            }
+            else{
+                printf("executing normal TC\r\n");
+                TC_list *current_TC = TC_list_header;
+                // find the tc corresponding to the psc
+                while(current_TC != NULL){
+                    printf("while : finding tc with psc : %d\r\n", psc);
+                    if( current_TC->packet_seq_count == psc ){
+                        printf("inside IF\r\n");
+                        TM_List *tm_ptr;
+                        printf("apid = %d\r\n", current_TC->apid);
+                        if(current_TC->apid == APID_CDMS){
+                            printf("CDMS APID found!\r\n");
+                            tm_ptr = manage_process(current_TC);
+                        }
+                        else{
+                            // call RLY_TMTC
+                            // wait and receive for TM
+                            tm_ptr = tm_ptr;
+                        }
+
+                        // add number of tm packets also
+                        printf("sending data\r\n");
+                        SND_TM(tm_ptr, false, 1);
+                        printf("\r\nfinished sending data\r\n");
+
+                        if( detect_nack(tm_ptr) ){
+                            if(current_TC->abort_on_nack){
+                                // exit
+                                printf("exit");
+                            }
+                        }
+                        else{
+                            current_TC->valid_execution = true;
+                            // delete the tc string to free up memory
+                            printf("deleting TC string\r\n");
+//                            delete current_TC->TC_string;
+                            printf("finished deleting TC string\r\n");
+                        }
+
+                        // delete the TM received after sending to GS
+                        printf("deleting TM received\r\n");
+                        delete tm_ptr->TM_string;
+                        delete tm_ptr;
+
+                        // found the tc with psc hence break
+                        break;
+                    }
+
+                    current_TC = current_TC->next_TC;
+                }
+                ++psc;
+            }
+        }
+        printf("completed execute tc\r\n");
+    }
+
+//    ~MNG_TC();
+ 
+    /* data */
+};
\ No newline at end of file