Simple version of COM_MNG_TMTC_CODE for IITMSAT.

Dependencies:   mbed-rtos mbed FreescaleIAP SimpleDMA

COM_POWER_ON_TX.h

Committer:
aniruddhv
Date:
2016-03-24
Revision:
137:489a93a04d6b
Parent:
95:42d6747900cb
Child:
144:4c20fcc105ce

File content as of revision 137:489a93a04d6b:

#define SET_BCN_STANDBY ( tm_ptr ){\
    Base_tc *beacon_tc = new Short_tc;\
    beacon_tc->next_TC = NULL;\
    PUTshort_or_long(beacon_tc,0);\
    PUTcrc_pass(beacon_tc,0x1);\
    PUTexec_status(beacon_tc,0);\
    beacon_tc->TC_string[0] = 0x01;\
    beacon_tc->TC_string[1] = 0x41;\
    beacon_tc->TC_string[2] = 0x65;\
    beacon_tc->TC_string[3] = 0x11;\
    beacon_tc->TC_string[4] = 0x00;\
    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);\
    tm_ptr =  FCTN_CDMS_RLY_TMTC(beacon_tc);\
}

#define reset_bae {\
    Base_tc *reset_BAE = new Short_tc;\
    reset_BAE->next_TC = NULL;\
    PUTshort_or_long(reset_BAE,0);\
    PUTcrc_pass(reset_BAE,0x1);\
    PUTexec_status(reset_BAE,0);\
    reset_BAE->TC_string[0] = 0x01;\
    reset_BAE->TC_string[1] = 0x81;\
    reset_BAE->TC_string[2] = 0x81;\
    reset_BAE->TC_string[3] = 0x33;\
    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 = new Short_tm;\
    tm_ptr =  FCTN_CDMS_RLY_TMTC(reset_BAE);\
    /*DELETE THE TM AFTER USE*/\
    obosc_tm_current = tm_ptr;\
    int overCount = 0;\
    while( obosc_tm_current != NULL ){\
        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
            Base_tm *temp = obosc_tm_current->next_TM;\
            delete obosc_tm_current;\
            obosc_tm_current = temp;\
            ++overCount;\
        }\
        else{\
            /*PENDING: RESET CDMS: MEMORY LEAK FOUND*/\
            break;\
        }\
    }\
}

#define power_off_bae {\
    Base_tc *power_off_BAE = new Short_tc;\
    power_off_BAE->next_TC = NULL;\
    PUTshort_or_long(power_off_BAE,0);\
    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] = 0x81;\
    power_off_BAE->TC_string[2] = 0x81;\
    power_off_BAE->TC_string[3] = 0x23;\
    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 = new Short_tm;\
    tm_ptr =  FCTN_CDMS_RLY_TMTC(power_off_BAE);\
    /*DELETE THE TM AFTER USE*/\
    obosc_tm_current = tm_ptr;\
    int overCount = 0;\
    while( obosc_tm_current != NULL ){\
        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
            Base_tm *temp = obosc_tm_current->next_TM;\
            delete obosc_tm_current;\
            obosc_tm_current = temp;\
            ++overCount;\
        }\
        else{\
            /*PENDING: RESET CDMS: MEMORY LEAK FOUND*/\
            break;\
        }\
    }\
}

#define 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 = new Short_tm;\
                SET_BCN_STANDBY ( tm_ptr );\
                uint8_t standbyAck = (tm_ptr & 0xEF);\
                if( standbyAck == 0xE0 ){\
                    /*ACK RECCEIVED*/\
                    uint8_t bcn_main_status = 0xFF;\
                    /*PENDING: BEACON TX MAIN STATUS from tm_ptr*/\
                    if( bcn_main_status ){\
                        retryFlag = false;\
                        /*PENDING: SWITCH RELAY TO COM_TX*/\
                        gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);\
                    }\
                    else{\
                        gCOM_MNG_TMTC_THREAD->wait(5000);\
                    }\
                }\
                else{\
                    reset_bae;\
                    Base_tm *tm_ptr2 = new Short_tm;\
                    SET_BCN_STANDBY ( tm_ptr2 );\
                    uint8_t standbyAck2 = (tm_ptr2 & 0xEF);\
                    if( standbyAck2 == 0xEF ){\
                        uint8_t bcn_main_status = 0xFF;\
                        /*PENDING: BEACON TX MAIN STATUS from tm_ptr2*/\
                        if( bcn_main_status = 0xFF ){\
                            retryFlag = false;\
                            /*PENDING: SWITCH RF RELAY TO COM TX*/\
                            gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);\
                        }\
                        else{\
                            gCOM_MNG_TMTC_THREAD->wait(5000);\
                        }\                            
                    }\
                    else{\
                        retryFlag = false;\
                        power_off_bae;\
                        gFLAGS = gFLAGS | COM_AUTO_POWER_OFF_BAE_FLAG;\
                        gFLAGS = gFLAGS & (~BAE_SW_EN_FLAG);\
                        /*PENDING: SWITCH RF RELAY TO COM TX*/\
                        gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);\
                    }\
                    /*DELETE THE TM AFTER USE*/\
                    obosc_tm_current = tm_ptr2;\
                    int overCount = 0;\
                    while( obosc_tm_current != NULL ){\
                        if( (overCount < TM_OVERFLOW_CONSTANT) ){\
                            Base_tm *temp = obosc_tm_current->next_TM;\
                            delete obosc_tm_current;\
                            obosc_tm_current = temp;\
                            ++overCount;\
                        }\
                        else{\
                            /*PENDING: RESET CDMS: MEMORY LEAK FOUND*/\
                            break;\
                        }\
                    }\
                }\
                /*DELETE THE TM AFTER USE*/\
                obosc_tm_current = tm_ptr;\
                int overCount = 0;\
                while( obosc_tm_current != NULL ){\
                    if( (overCount < TM_OVERFLOW_CONSTANT) ){\
                        Base_tm *temp = obosc_tm_current->next_TM;\
                        delete obosc_tm_current;\
                        obosc_tm_current = temp;\
                        ++overCount;\
                    }\
                    else{\
                        /*PENDING: RESET CDMS: MEMORY LEAK FOUND*/\
                        break;\
                    }\
                }\
            }\
        }\
        else{\
            power_off_bae;\
            gFLAGS = gFLAGS & (~BAE_SW_EN_FLAG);\
            /*PENDING: SWITCH RF RELAY TO COM TX*/\
            gFLAGS = gFLAGS & (~RF_SW_STATUS_FLAG);\
        }\
    }\
    /*PENDING: POWER ON COM_TX*/\
    /*power_on_com_tx_pin = 1;*/\
    uint8_t adfConfigPass = 0xFF;\
    for( int i = 0 ; i < COM_TX_CONFIG_LIMIT ; ++i ){\
        /*PENDING: CONFIGURE ADF*/\
        if( adfConfigPass == 0xFF ){\
            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);\
        /*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;\
            }\
        }\
        if(/*NOT Transmitted succesfully*/){\
            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*/\
            }\
        }\
    }\
    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");*/\
}