TELECOMMAND MANAGER V1
Dependencies: mbed SLCD mbed-rtos
Diff: MNG_TC.h
- 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 +}