To fix the hang problem
Dependencies: FreescaleIAP SimpleDMA mbed-rtos mbed
Fork of CDMS_CODE by
Diff: COM_POWER_ON_TX.h
- Revision:
- 216:93505a6f8db7
- Parent:
- 215:570251b23c7b
- Child:
- 218:c63cdba0550f
--- 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