Latest FM Code with EEPROM
Dependencies: FreescaleIAP SimpleDMA eeprom mbed-rtos mbed
Fork of CDMS_QM_03MAR2017_Flash_with_obsrs by
Diff: COM_MNG_TMTC.h
- Revision:
- 0:f016e9e8d48b
- Child:
- 1:a0055b3280c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/COM_MNG_TMTC.h Tue Dec 01 10:56:10 2015 +0000 @@ -0,0 +1,384 @@ +// 8 Jul +// did flowchart of states + +// handle sd card with cdms team + +// Jun 6 +// WHAT IS TC exec code in L1 ack ? + +#define delete_TC(tc_ptr) {\ + if(tc_ptr == gHEAD_NODE_TCL){\ + gHEAD_NODE_TCL = tc_ptr->next_TC;\ + }\ + delete tc_ptr;\ +} + +// typeof tm_ptr: Base_tm +// typeof tc_ptr: Base_tc +// typeof temp_xxxx: uint8_t +#define fill_l1_ack(tm_ptr) {\ + uint8_t temp8;\ + tm_ptr->next_TM = NULL;\ + temp8 = 0xA;\ + PUTtmid(tm_ptr->fields, temp8);\ + temp8 = 0x00;\ + PUTshort_or_long_tm(tm_ptr->fields, temp8);\ + tm_ptr->TM_string[0] = TMID_ACK_L1 << 4;\ + tm_ptr->TM_string[1] = gTOTAL_INCORRECT_SIZE_TC & 0xFF;\ + tm_ptr->TM_string[2] = gTOTAL_CRC_FAIL_TC & 0xFF;\ + tm_ptr->TM_string[3] = (gMASTER_STATE << 4) & 0xF0;\ +} + +#define put_crc_l1_ack(tm_ptr, num_crc) {\ + tm_ptr->TM_string[2] = num_crc & 0xFF;\ + crc_checksum = crc16_gen(tm_ptr->TM_string, TM_SHORT_SIZE-2);\ + tm_ptr->TM_string[TM_SHORT_SIZE-2] = (crc_checksum >> 8) & 0xFF;\ + tm_ptr->TM_string[TM_SHORT_SIZE-1] = crc_checksum & 0xFF;\ +} + +#define detect_ack(tm_ptr, temp_ack) {\ + uint8_t temp8;\ + if( tm_ptr != NULL ){\ + temp8 = tm_ptr->TM_string[3];\ + if((temp8 == 0xE0) || (temp8 == 0xA0) || (temp8 == 0xC0))\ + temp_ack = 0x01;\ + else\ + temp_ack = 0x00;\ + }\ + else\ + temp_ack = 0x00;\ +} + +#define isit_obosc(tc_ptr, temp_obosc) {\ + temp_obosc = 0x00;\ + if( GETapid(tc_ptr) == 2 ){\ + if( ((tc_ptr->TC_string[2]) >> 4) == 0xB ){\ + switch( (tc_ptr->TC_string[2]) & 0xf ){\ + case 1:\ + case 2:\ + case 5:\ + case 6:\ + case 15:\ + temp_obosc = 0x01;\ + }\ + }\ + }\ +} + +#define isit_sdcard(tc_ptr, temp_sdcard) {\ + temp_sdcard = 0x00;\ + if( GETapid(tc_ptr) == 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:\ + temp_sdcard = 0x01;\ + }\ + }\ + }\ +} + +/* +@brief: check for missing tc, also check crc, i.e. + if true execution can be started else have to wait + decide the next state +@param: none +@return: bool indicating whether there are missing tc +*/ +// PENDING: LAST FRAME BIT +/* +for loop: check for missing tc +if: check for incorrect sized tc +if: check for last frame bit +*/ +#define continueToExecute(returnHere) {\ + uint8_t tempReturn = 0x00;\ + for(uint8_t p = PSC_START_VALUE ; p < (gTOTAL_VALID_TC + PSC_START_VALUE) ; ++p){\ + bool flag = false;\ + Base_tc *node_ptr = gHEAD_NODE_TCL;\ + while(node_ptr != NULL){\ + if( (GETpacket_seq_count(node_ptr) == p) && (GETcrc_pass(node_ptr) == 1) ){\ + flag = true;\ + break;\ + }\ + else{\ + node_ptr = node_ptr->next_TC;\ + }\ + }\ + if(flag == false){\ + tempReturn = 0x02;\ + break;\ + }\ + }\ + Base_tc *tcp = gHEAD_NODE_TCL;\ + while(tcp != NULL){\ + if(GETpacket_seq_count(tcp) == (gTOTAL_VALID_TC + PSC_START_VALUE - 1)){\ + if( ( (tcp->TC_string[1]) & 0x20 ) == 0x00 ){\ + tempReturn = tempReturn + 0x01;\ + }\ + break;\ + }\ + tcp = tcp->next_TC;\ + }\ + returnHere = tempReturn;\ +} + +/* +@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: none +*/ +#define send_l1_ack {\ + Base_tc *current_TC = gHEAD_NODE_TCL;\ + Base_tm *l1_ack = new Short_tm;\ + Base_tm *l1_ack_head = l1_ack;\ + fill_l1_ack(l1_ack);\ + int TC_count = 0;\ + uint16_t crc_checksum = 0;\ + while(current_TC != NULL){\ + /*IF CRC PASS*/\ + if( (GETcrc_pass(current_TC) == 1) ){\ + if(TC_count > 4){\ + /*extend the TM linked list*/\ + TC_count = 0;\ + l1_ack->next_TM = new Short_tm;\ + l1_ack = l1_ack->next_TM;\ + fill_l1_ack(l1_ack);\ + /*PENDING: FILL TC_EXEC_CODE, APPEND CRC TO THE TM*/\ + put_crc_l1_ack( l1_ack, gTOTAL_CRC_FAIL_TC );\ + }\ + /*PSC starts from 7th byte*/\ + l1_ack->TM_string[6+TC_count] = current_TC->TC_string[0];\ + /*TC exec status*/\ + switch(TC_count){\ + case 0:\ + l1_ack->TM_string[3] |= (GETexec_status(current_TC)) & 0x0F;\ + break;\ + case 1:\ + l1_ack->TM_string[4] = (GETexec_status(current_TC) << 4) & 0xF0;\ + break;\ + case 2:\ + l1_ack->TM_string[4] |= (GETexec_status(current_TC)) & 0x0F;\ + break;\ + case 3:\ + l1_ack->TM_string[5] = (GETexec_status(current_TC) << 4) & 0xF0;\ + break;\ + case 4:\ + l1_ack->TM_string[5] |= (GETexec_status(current_TC)) & 0x0F;\ + }\ + ++TC_count;\ + }\ + current_TC = current_TC->next_TC;\ + }\ + /*FILL UP THE REMAINING FIELDS WITH 0x01: 0x00 => problem with GS*/\ + if(TC_count < 5){\ + while(TC_count < 5){\ + l1_ack->TM_string[6+TC_count] = current_TC->TC_string[0];\ + switch(TC_count){\ + case 0:\ + l1_ack->TM_string[3] |= (GETexec_status(current_TC)) & 0x0F;\ + break;\ + case 1:\ + l1_ack->TM_string[4] = (GETexec_status(current_TC) << 4) & 0xF0;\ + break;\ + case 2:\ + l1_ack->TM_string[4] |= (GETexec_status(current_TC)) & 0x0F;\ + break;\ + case 3:\ + l1_ack->TM_string[5] = (GETexec_status(current_TC) << 4) & 0xF0;\ + break;\ + case 4:\ + l1_ack->TM_string[5] |= (GETexec_status(current_TC)) & 0x0F;\ + }\ + ++TC_count;\ + }\ + put_crc_l1_ack(l1_ack, gTOTAL_CRC_FAIL_TC);\ + }\ + /*snd_tm.head_pointer(l1_ack_head);*/\ + /*adf_not_SDcard();*/\ + /*delete the TM*/\ + l1_ack = l1_ack_head;\ + while(l1_ack != NULL){\ + Base_tm *temp = l1_ack->next_TM;\ + delete l1_ack;\ + l1_ack = temp;\ + }\ +} + +// CDMS TEAM CODE START +#define CDMS_RLY_TMTC(tc_ptr, tm_ptr){\ + tm_ptr = NULL;\ +}\ +// CDMS TEAM CODE END + +// EXECUTE OBOSC +#define execute_obosc_core(tc_ptr, tm_ptr) {\ + uint8_t service_subtype = (tc_ptr->TC_string[2]) & 0x0F;\ + /*including both lower and upper limits*/\ + uint8_t targetL = tc_ptr->TC_string[3];\ + uint8_t targetU = targetL + tc_ptr->TC_string[4] - 1;\ + if( (targetL == 0x00) && (tc_ptr->TC_string[4] == 0) ){\ + /*PENDING: ALL REPORTS BELOW*/\ + switch(service_subtype){\ + case OBOSC_SUB_REP_TCL_D:\ + break;\ + case OBOSC_SUB_REP_LE:\ + break;\ + case OBOSC_SUB_RESET:\ + break;\ + case OBOSC_SUB_REP_TCL:\ + break;\ + }\ + }\ + else{\ + uint16_t temp16 = 2;\ + switch( service_subtype ){\ + case OBOSC_SUB_DISABLE:\ + temp16 = 2;\ + break;\ + case OBOSC_SUB_RETRY:\ + temp16 = 3;\ + break;\ + }\ + Base_tc *tcp = gHEAD_NODE_TCL;\ + while( tcp != NULL ){\ + uint16_t tcPSC = GETpacket_seq_count(tcp);\ + if( (tcPSC >= targetL) && (tcPSC <= targetU) ){\ + PUTexec_status(tcp, temp16);\ + }\ + tcp = tcp->next_TC;\ + }\ + }\ + /*PENDING: generate L234 ACK*/\ + tm_ptr = NULL;\ +} + +#define EXECUTE_OBOSC_ONLY {\ + for(uint8_t execute_psc = gOBOSC_PSC ; execute_psc < (gTOTAL_VALID_TC+PSC_START_VALUE) ; ++execute_psc){\ + Base_tc* current_TC = gOBOSC_HEAD;\ + while( current_TC != NULL ){\ + if( (GETcrc_pass(current_TC) == 1) && (GETpacket_seq_count(current_TC) == execute_psc) ){\ + uint8_t current_exec_status = GETexec_status(current_TC);\ + if( (current_exec_status == TC_STATE_SUCCESSFULLY_EXECUTED) || (current_exec_status == TC_STATE_DISABLED) )\ + break;\ + else if( (current_exec_status == TC_STATE_EXECUTION_FAILED) && (GETabort_on_nack(current_TC) == 1) ){\ + gMASTER_STATE = TCL_STATE_ABORTED;\ + break;\ + }\ + else if( (current_exec_status == TC_STATE_UNEXECUTED) || (current_exec_status == TC_STATE_MARKED_RETRY) ){\ + Base_tm* tm_ptr = NULL;\ + uint8_t temp82 = 0x00;\ + isit_obosc(current_TC, temp82);\ + if(temp82 == 0x01){\ + /*EXECUTION OF OBOSC TC*/\ + execute_obosc_core(current_TC, tm_ptr);\ + }\ + /*snd_tm.head_pointer(tm_ptr);*/\ + /*adf_not_SDcard();*/\ + uint8_t temp83 = 0x00;\ + detect_ack(tm_ptr, temp83);\ + if( temp83 == 0x01){\ + uint16_t temp16 = TC_STATE_SUCCESSFULLY_EXECUTED;\ + PUTexec_status(current_TC, temp16);\ + }\ + else{\ + uint16_t temp16 = TC_STATE_EXECUTION_FAILED;\ + PUTexec_status(current_TC, temp16);\ + }\ + /*update last executed L1_ack*/\ + if( tm_ptr != NULL ){\ + for(int i = 0 ; i < TM_SHORT_SIZE ; ++i){\ + gLAST_L1_ACK[i] = gLAST_L1_ACK_BUFFER[i];\ + gLAST_L1_ACK_BUFFER[i] = tm_ptr->TM_string[i];\ + }\ + }\ + /*DELETE THE TM AFTER USE*/\ + while(tm_ptr != NULL){\ + Base_tm *temp = tm_ptr->next_TM;\ + delete tm_ptr;\ + tm_ptr = temp;\ + }\ + }\ + }\ + current_TC = current_TC->next_TC;\ + }\ + }\ +} + +#define EXECUTE_TC {\ + for(uint8_t execute_psc = PSC_START_VALUE ; execute_psc < (PSC_START_VALUE+gTOTAL_VALID_TC) ; ++execute_psc ){\ + gLEDG = !gLEDG;\ + gLEDR = !gLEDR;\ + Base_tc* current_TC = gHEAD_NODE_TCL;\ + while(current_TC != NULL){\ + if( (GETcrc_pass(current_TC) == 1) && (GETpacket_seq_count(current_TC) == execute_psc) ){\ + uint8_t current_exec_status = GETexec_status(current_TC);\ + if( (current_exec_status == TC_STATE_SUCCESSFULLY_EXECUTED) || (current_exec_status == TC_STATE_DISABLED) )\ + break;\ + else if( (current_exec_status == TC_STATE_EXECUTION_FAILED) && (GETabort_on_nack(current_TC) == 1) ){\ + gMASTER_STATE = TCL_STATE_ABORTED;\ + break;\ + }\ + else if( (current_exec_status == TC_STATE_UNEXECUTED) || (current_exec_status == TC_STATE_MARKED_RETRY) ){\ + /*EXECUTION OF TC START*/\ + uint8_t temp81 = 0x00;\ + isit_sdcard(current_TC, temp81);\ + if( temp81 == 0x00 ){\ + /*EXECUTION OF NON SD-CARD (BOTH OBOSC and CDMS functions)*/\ + Base_tm *tm_ptr;\ + uint8_t temp82 = 0x00;\ + isit_obosc(current_TC, temp82);\ + if(temp82 == 0x01){\ + /*EXECUTION OF OBOSC TC*/\ + execute_obosc_core(current_TC, tm_ptr);\ + }\ + else{\ + /*call CDMS_RLY_TMTC*/\ + CDMS_RLY_TMTC(current_TC, tm_ptr);\ + }\ + /*snd_tm.head_pointer(tm_ptr);*/\ + /*adf_not_SDcard();*/\ + uint8_t temp83 = 0x00;\ + detect_ack(tm_ptr, temp83);\ + if( temp83 == 0x01){\ + uint16_t temp16 = TC_STATE_SUCCESSFULLY_EXECUTED;\ + PUTexec_status(current_TC, temp16);\ + }\ + else{\ + uint16_t temp16 = TC_STATE_EXECUTION_FAILED;\ + PUTexec_status(current_TC, temp16);\ + }\ + /*update last executed L1_ack*/\ + if( tm_ptr != NULL ){\ + for(int i = 0 ; i < TM_SHORT_SIZE ; ++i){\ + gLAST_L1_ACK[i] = gLAST_L1_ACK_BUFFER[i];\ + gLAST_L1_ACK_BUFFER[i] = tm_ptr->TM_string[i];\ + }\ + }\ + /*DELETE THE TM AFTER USE*/\ + while(tm_ptr != NULL){\ + Base_tm *temp = tm_ptr->next_TM;\ + delete tm_ptr;\ + tm_ptr = temp;\ + }\ + }\ + else{\ + /*EXECUTION OF SD-CARD DATA SENDING (OBSRS)*/\ + /*read_TC(tc_ptr);*/\ + }\ + /*ABORT ON NACK*/\ + if( (GETexec_status(current_TC) == TC_STATE_EXECUTION_FAILED) && (GETabort_on_nack(current_TC) == 1) ){\ + gMASTER_STATE = TCL_STATE_ABORTED;\ + }\ + }\ + }\ + current_TC = current_TC->next_TC;\ + }\ + if( gMASTER_STATE == TCL_STATE_ABORTED )\ + break;\ + }\ +} \ No newline at end of file