Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of COM_MNG_TMTC_SIMPLE by
Diff: ThreadsAndFunctions.h
- Revision:
- 0:f016e9e8d48b
- Child:
- 1:a0055b3280c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ThreadsAndFunctions.h Tue Dec 01 10:56:10 2015 +0000 @@ -0,0 +1,108 @@ +// UART ISR +void rx_read(){ + *gRX_CURRENT_PTR = RX1M.getc(); + gFLAGS = gFLAGS | (0xFF & UART_INT_FLAG); + gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); +} + +// RX_TIMEOUT ISR +void after_receive(){ + gRX_TIMEOUT.detach(); + gFLAGS = gFLAGS | (0xFF & NEW_TC_RECEIVED); + gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); +} + +// SESSION_TIMOUT ISR +void after_session(){ + gSESSION_TIMEOUT.detach(); + gFLAGS = gFLAGS | (0xFF & END_SESSION); +} + +#define reset_all {\ + Base_tc *tcp = gHEAD_NODE_TCL;\ + while(tcp != NULL){\ + Base_tc *temp = tcp->next_TC;\ + delete tcp;\ + tcp = temp;\ + }\ + rx_tc_frames = 0;\ + rx_tc_frames = 0;\ + gTOTAL_INCORRECT_SIZE_TC = 0;\ + gTOTAL_CRC_FAIL_TC = 0;\ + COM_RX_DATA_NODE *dataptr = gRX_HEAD_DATA_NODE;\ + while( dataptr != NULL ){\ + COM_RX_DATA_NODE *temp = dataptr->next_node;\ + delete dataptr;\ + dataptr = temp;\ + }\ + gRX_HEAD_DATA_NODE = new COM_RX_DATA_NODE;\ + gRX_HEAD_DATA_NODE->next_node = NULL;\ + gRX_CURRENT_DATA_NODE = gRX_HEAD_DATA_NODE;\ + gRX_CURRENT_PTR = gRX_HEAD_DATA_NODE->values;\ + gRX_COUNT = 0;\ +} + +void COM_MNG_TMTC_FUN(void const *args){ + while(true){ + Thread::signal_wait( COM_MNG_TMTC_SIGNAL_UART_INT ); + if( gFLAGS & UART_INT_FLAG ){ + gFLAGS = gFLAGS & (~UART_INT_FLAG); + if( gRX_COUNT < (RX_BUFFER_LENGTH-1) ){ + ++gRX_CURRENT_PTR; + ++gRX_COUNT; + } + else{ + gLEDG = !gLEDG; + gRX_COUNT = 0; + gRX_CURRENT_DATA_NODE->next_node = new COM_RX_DATA_NODE; + gRX_CURRENT_DATA_NODE = gRX_CURRENT_DATA_NODE->next_node; + gRX_CURRENT_DATA_NODE->next_node = NULL; + gRX_CURRENT_PTR = gRX_CURRENT_DATA_NODE->values; + } + gRX_TIMEOUT.attach(&after_receive, RX_TIMEOUT_LIMIT); + } + else if( gFLAGS & NEW_TC_RECEIVED ){ + gFLAGS = gFLAGS & (~NEW_TC_RECEIVED); + + // DISABLE THE RX1M INTERRUPT + RX1M.attach(NULL); + + // PENDING: BEACON + while(gRX_COUNT < (RX_BUFFER_LENGTH-1)){ + *gRX_CURRENT_PTR = 0x00; + ++gRX_CURRENT_PTR; + ++gRX_COUNT; + } + gRX_COUNT = 0; + + if( (gMASTER_STATE == TCL_STATE_IDLE) || (gMASTER_STATE == TCL_STATE_ABORTED) || (gMASTER_STATE == TCL_STATE_COMPLETED)){ + raw_data_to_tc(); + if( (gTOTAL_VALID_TC > 0) && (gFLAGS & START_SESSION) ){ + gFLAGS = gFLAGS & (~START_SESSION); + gSESSION_TIMEOUT.attach(&after_session, SESSION_TIME_LIMIT); + } + uint8_t tempContinue = 0xFF; + continueToExecute(tempContinue); + if( tempContinue == 0x00 ){ + if(gMASTER_STATE == TCL_STATE_ABORTED){ + gMASTER_STATE = TCL_STATE_EXECUTING; + send_l1_ack; + EXECUTE_OBOSC_ONLY; + } + EXECUTE_TC; + } + else{ + send_l1_ack; + } + gPC.puts("Completed Execution\r\n"); + } + else{ + // invalid state found - reset + reset_all; + } + + // PENDING: BEACON + RX1M.attach(&rx_read, Serial::RxIrq); + } + } +} \ No newline at end of file