sd 32 update
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of COM_MNG_TMTC_SIMPLE by
ThreadsAndFunctions.h
00001 // UART ISR 00002 void rx_read(){ 00003 gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = RX1M.getc(); 00004 gFLAGS = gFLAGS | UART_INT_FLAG; 00005 gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); 00006 } 00007 00008 // RX_TIMEOUT ISR 00009 void after_receive(){ 00010 gRX_TIMEOUT.detach(); 00011 gFLAGS = gFLAGS | NEW_TC_RECEIVED; 00012 gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); 00013 } 00014 00015 // SESSION_TIMOUT ISR 00016 void after_session(){ 00017 gSESSION_TIMEOUT.detach(); 00018 gFLAGS = gFLAGS | COM_SESSION_TIMEOUT_FLAG; 00019 if( gMASTER_STATE != TCL_STATE_EXECUTING ){ 00020 gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); 00021 } 00022 } 00023 00024 #define reset_all {\ 00025 Base_tc *tcp = gHEAD_NODE_TCL;\ 00026 /*gPC.puts("inside reset\r\n");*/\ 00027 gFLAGS = 0x0000;\ 00028 while(tcp != NULL){\ 00029 Base_tc *temp = tcp->next_TC;\ 00030 delete tcp;\ 00031 tcp = temp;\ 00032 }\ 00033 gHEAD_NODE_TCL = NULL;\ 00034 gLAST_NODE_TCL = NULL;\ 00035 gMASTER_STATE = TCL_STATE_INCOMPLETE;\ 00036 gTOTAL_INCORRECT_SIZE_TC = 0;\ 00037 gTOTAL_CRC_FAIL_TC = 0;\ 00038 gTOTAL_REPEATED_TC = 0;\ 00039 gTOTAL_VALID_TC = 0;\ 00040 for(int i = 0 ; i < TM_LONG_SIZE ; ++i){\ 00041 gLAST_TM[i] = 0x00;\ 00042 }\ 00043 gLAST_TM_SHORT_OR_LONG = SHORT_TM_CODE;\ 00044 COM_RX_DATA_NODE *dataptr = gRX_HEAD_DATA_NODE;\ 00045 while( dataptr != NULL ){\ 00046 COM_RX_DATA_NODE *temp = dataptr->next_node;\ 00047 delete dataptr;\ 00048 dataptr = temp;\ 00049 }\ 00050 gRX_HEAD_DATA_NODE = new COM_RX_DATA_NODE;\ 00051 gRX_HEAD_DATA_NODE->next_node = NULL;\ 00052 gRX_CURRENT_DATA_NODE = gRX_HEAD_DATA_NODE;\ 00053 gRX_COUNT = 0;\ 00054 /*PENDING : ALL GLOBAL VAARIABLES AND FLAGS*/\ 00055 /*gPC.puts("finished reset all\r\n");*/\ 00056 } 00057 00058 #define PUT_RAW_BYTE {\ 00059 if( gRX_COUNT < (RX_BUFFER_LENGTH-1) ){\ 00060 ++gRX_COUNT;\ 00061 }\ 00062 else{\ 00063 gRX_COUNT = 0;\ 00064 gRX_CURRENT_DATA_NODE->next_node = new COM_RX_DATA_NODE;\ 00065 gRX_CURRENT_DATA_NODE = gRX_CURRENT_DATA_NODE->next_node;\ 00066 gRX_CURRENT_DATA_NODE->next_node = NULL;\ 00067 }\ 00068 gRX_TIMEOUT.attach(&after_receive, RX_TIMEOUT_LIMIT);\ 00069 } 00070 00071 void COM_MNG_TMTC_FUN(void const *args){ 00072 if( !(gFLAGS & COM_SESSION_FLAG) ){ 00073 gLEDR = 1; 00074 gLEDG = 1; 00075 } 00076 while(true){ 00077 Thread::signal_wait( COM_MNG_TMTC_SIGNAL_UART_INT ); 00078 if( gFLAGS & UART_INT_FLAG ){ 00079 gFLAGS = gFLAGS & (~UART_INT_FLAG); 00080 if( !(gFLAGS & COM_SESSION_FLAG) ){ 00081 // PENDING : DISABLE THREADS 00082 gFLAGS = gFLAGS | COM_SESSION_FLAG; 00083 gSESSION_TIMEOUT.attach(&after_session, SESSION_TIME_LIMIT); 00084 gFLAGS = gFLAGS | COM_RX_FLAG; 00085 PUT_RAW_BYTE; 00086 // PENDING : MEASURE RSSI 00087 if( gFLAGS & COM_SESSION_FLAG ){ 00088 gLEDR = 0; 00089 gLEDG = 0; 00090 } 00091 } 00092 else if( gFLAGS & COM_RX_FLAG ){ 00093 gLEDR = 0; 00094 gLEDG = 1; 00095 PUT_RAW_BYTE; 00096 } 00097 else{ 00098 gLEDR = 1; 00099 gLEDG = 0; 00100 gFLAGS = gFLAGS | COM_RX_FLAG; 00101 PUT_RAW_BYTE; 00102 } 00103 } 00104 else if( gFLAGS & NEW_TC_RECEIVED ){ 00105 /*gPC.puts("NEW TC RECEIVED\r\n");*/ 00106 gFLAGS = gFLAGS & (~NEW_TC_RECEIVED); 00107 gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; 00108 00109 // DISABLE THE RX1M INTERRUPT 00110 RX1M.attach(NULL); 00111 00112 // VERIFY CRC, REPEATED PSC AND UPDATE TOTAL_VALID_TC, INCORRECT SIZE TC, CRC FAIL TC 00113 while(gRX_COUNT < (RX_BUFFER_LENGTH)){ 00114 gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = 0x00; 00115 ++gRX_COUNT; 00116 } 00117 gRX_COUNT = 0; 00118 raw_data_to_tc(); 00119 gFLAGS = gFLAGS & (~COM_RX_FLAG); 00120 00121 if( gTOTAL_VALID_TC > 0 ){ 00122 /*gPC.printf("valid TC rx: %u\r\n", gTOTAL_VALID_TC);*/ 00123 if( gTOTAL_VALID_TC < COM_MAX_TC_LIMIT ){ 00124 // CHECK WEATHER TC LIST HAS MISSING TC OR WEATHER LAST FRAME BIT IS HIGH IN THE LAST PSC-TC 00125 /*gPC.puts("checking for tc list complete\r\n");*/ 00126 uint8_t tempContinue = 0xFF; 00127 continueToExecute(tempContinue); 00128 if(tempContinue == 0x00){ 00129 /*gPC.puts("tc list is complete\r\n");*/ 00130 // CHECK WEATHER GS VERIFICATION CODE MATCHES 00131 uint8_t tempGSver = 0x00; 00132 GScodeVerification(tempGSver); 00133 /*PENDING: INCLUDE GS VERIFICATION CODE*/ 00134 if( tempGSver == 0xFF ){ 00135 /*gPC.puts("GS code match !!\r\n");*/ 00136 gFLAGS = gFLAGS | COM_SESSION_VALIDITY; 00137 COM_POWER_ON_TX; 00138 // PENDING: PA HOT HANDLED IN EXECUTE_XXX FUNCTIONS 00139 uint8_t tempPAHot = 0x00; 00140 isPAhot(tempPAHot); 00141 if( tempPAHot == 0xFF ){ 00142 gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG); 00143 gCOM_PA_COOLING_TIMEOUT.detach(); 00144 /*gPC.puts("EXECUTING TELECOMMANDS\r\n");*/ 00145 EXECUTE_OBOSC_ONLY; 00146 EXECUTE_TC; 00147 /*gPC.puts("COMPLETED EXECUTION\r\n");*/ 00148 } 00149 else{ 00150 gFLAGS = gFLAGS | COM_PA_HOT_FLAG; 00151 // PENDING: power off transmitter only 00152 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00153 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00154 RX1M.attach(&rx_read, Serial::RxIrq); 00155 } 00156 } 00157 else{ 00158 /*gPC.puts("GS code mismatch !!\r\n");*/ 00159 RX1M.attach(&rx_read, Serial::RxIrq); 00160 reset_all; 00161 gFLAGS = gFLAGS & (~COM_SESSION_VALIDITY); 00162 // PENDING : ENABLE THREADS 00163 gSESSION_TIMEOUT.detach(); 00164 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00165 // WARNING: clear COM_MNG_TMTC ? 00166 } 00167 } 00168 else{ 00169 gPC.puts("tc list is not complete\r\n"); 00170 if(tempContinue & 0x01){ 00171 gPC.puts("last packet bit not found\r\n"); 00172 } 00173 if( tempContinue & 0x02 ){ 00174 gPC.puts("missing psc found\r\n"); 00175 } 00176 gPC.printf("crc fail tc = %u\r\n", gTOTAL_CRC_FAIL_TC); 00177 gPC.printf("incorrect size tc = %u\r\n", gTOTAL_INCORRECT_SIZE_TC); 00178 gPC.printf("repeated psc = %u\r\n", gTOTAL_REPEATED_TC); 00179 Base_tc *test_tc = gHEAD_NODE_TCL; 00180 while( test_tc != NULL ){ 00181 int length = 0; 00182 if( GETshort_or_long_tc(test_tc) == SHORT_TC_CODE ){ 00183 length = TC_SHORT_SIZE; 00184 } 00185 else{ 00186 length = TC_LONG_SIZE; 00187 } 00188 for(int i = 0 ; i < length ; ++i ){ 00189 gPC.printf("%x ", test_tc->TC_string[i]); 00190 } 00191 gPC.puts("\r\n"); 00192 test_tc = test_tc->next_TC; 00193 } 00194 gPC.puts("\r\n"); 00195 COM_POWER_ON_TX; 00196 // PENDING : POWER OFF TX 00197 RX1M.attach(&rx_read, Serial::RxIrq); 00198 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00199 } 00200 } 00201 else{ 00202 COM_POWER_ON_TX; 00203 // POWER OFF TX transmitter only 00204 // WARNING: reset_all ? clear com_session ? 00205 RX1M.attach(&rx_read, Serial::RxIrq); 00206 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00207 } 00208 } 00209 else{ 00210 /*gPC.puts("No valid TC received\r\n");*/ 00211 RX1M.attach(&rx_read, Serial::RxIrq); 00212 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00213 reset_all; 00214 // PENDING : ENABLE THREADS 00215 gSESSION_TIMEOUT.detach(); 00216 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00217 } 00218 } 00219 else if( gFLAGS & COM_PA_HOT_FLAG ){ 00220 /*gPC.puts("checking for PA hot in main\r\n");*/ 00221 if( gFLAGS & COM_RX_FLAG ){ 00222 uint8_t tempPA = 0xFF; 00223 isPAhot(tempPA); 00224 if( tempPA == 0x00 ){ 00225 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00226 } 00227 else{ 00228 gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG); 00229 gCOM_PA_COOLING_TIMEOUT.detach(); 00230 } 00231 } 00232 else{ 00233 uint8_t tempPA = 0xFF; 00234 isPAhot(tempPA); 00235 if( tempPA == 0x00 ){ 00236 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00237 } 00238 else{ 00239 /*gPC.puts("PA IS COOLED DOWN\r\n");*/ 00240 gFLAGS = gFLAGS & (~COM_PA_HOT_FLAG); 00241 gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; 00242 RX1M.attach(NULL); 00243 gCOM_PA_COOLING_TIMEOUT.detach(); 00244 COM_POWER_ON_TX; 00245 EXECUTE_OBOSC_ONLY; 00246 EXECUTE_TC; 00247 } 00248 } 00249 } 00250 else if( gFLAGS & COM_SESSION_TIMEOUT_FLAG ){ 00251 /*gPC.puts("session timeout: resetting in main\r\n");*/ 00252 COM_POWER_OFF_TX; 00253 /*PENDING : ENABLE THREADS*/ 00254 gSESSION_TIMEOUT.detach(); 00255 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00256 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00257 reset_all; 00258 } 00259 else{ 00260 /*gPC.puts("INVALID SIGNAL RECEIVED IN MAIN\r\n");*/ 00261 // SOME INVALID SIGNAL RECEIVED 00262 COM_POWER_OFF_TX; 00263 reset_all; 00264 // PENDING : ENABLE THREADS 00265 gSESSION_TIMEOUT.detach(); 00266 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00267 } 00268 } 00269 } 00270 00271 //void SCIENCE_FUN(void const *args){ 00272 //// SPIpayload.format(8,0); 00273 //// SPIpayload.frequency(1000000); 00274 // for ( int i = 0 ; i < PAYLOAD_BUFFER_LENGTH ; i++ ){ 00275 // gPAYLOAD_BUFFER[i] = 1; 00276 // } 00277 // 00278 // // initialise the buffer for dma 00279 // // SPIpayload.bulkRead_init(VAR_SPACE::payload_dma_buffer, PAYLOAD_DMA_SIZE, &payload_interrupt_fun); 00280 // // start dma read 00281 // // SPIpayload.bulkRead_start(); 00282 // 00283 // // attach DMA interrupt 00284 // while(true){ 00285 // gSCIENCE_THREAD->signal_wait(0x01); 00286 // 00287 ////*********************************************************THE TEST 00288 // 00289 // //read rtc time later 00290 // uint64_t RTC_time = 0; 00291 // Science_Data_Compression::complete_compression( gPAYLOAD_BUFFER , RTC_time); 00292 //// SPI_mutex.lock(); 00293 //// disk_write(SDcard_lastWritten , 5); 00294 //// SPI_mutex.unlock(); 00295 // 00296 ////**********************************************THE TEST 00297 // 00298 //// counter_for_payload++; 00299 //// if(counter_for_payload == 10){ 00300 //// payload_ticker.detach(); 00301 //// ledg = 0; 00302 //// PC.puts("its over\r\n"); 00303 //// } 00304 // 00305 //// SPIpayload.bulkRead_start(); 00306 // 00307 // } 00308 //}
Generated on Tue Jul 12 2022 10:59:22 by 1.7.2