Hi Shubham I am just using this to test PYLD code
Dependencies: FreescaleIAP SimpleDMA 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 if (DEBUG)\ 00027 gPC.puts("inside reset\r\n");\ 00028 gFLAGS = 0x0000;\ 00029 while(tcp != NULL){\ 00030 Base_tc *temp = tcp->next_TC;\ 00031 delete tcp;\ 00032 tcp = temp;\ 00033 }\ 00034 gHEAD_NODE_TCL = NULL;\ 00035 gLAST_NODE_TCL = NULL;\ 00036 gMASTER_STATE = TCL_STATE_INCOMPLETE;\ 00037 gTOTAL_INCORRECT_SIZE_TC = 0;\ 00038 gTOTAL_CRC_FAIL_TC = 0;\ 00039 gTOTAL_REPEATED_TC = 0;\ 00040 gTOTAL_VALID_TC = 0;\ 00041 for(int i = 0 ; i < TM_LONG_SIZE ; ++i){\ 00042 gLAST_TM[i] = 0x00;\ 00043 }\ 00044 gLAST_TM_SHORT_OR_LONG = SHORT_TM_CODE;\ 00045 COM_RX_DATA_NODE *dataptr = gRX_HEAD_DATA_NODE;\ 00046 while( dataptr != NULL ){\ 00047 COM_RX_DATA_NODE *temp = dataptr->next_node;\ 00048 delete dataptr;\ 00049 dataptr = temp;\ 00050 }\ 00051 gRX_HEAD_DATA_NODE = new COM_RX_DATA_NODE;\ 00052 gRX_HEAD_DATA_NODE->next_node = NULL;\ 00053 gRX_CURRENT_DATA_NODE = gRX_HEAD_DATA_NODE;\ 00054 gRX_COUNT = 0;\ 00055 /*PENDING : ALL GLOBAL VAARIABLES AND FLAGS*/\ 00056 if (DEBUG)\ 00057 gPC.puts("finished reset all\r\n");\ 00058 } 00059 00060 #define PUT_RAW_BYTE {\ 00061 if( gRX_COUNT < (RX_BUFFER_LENGTH-1) ){\ 00062 ++gRX_COUNT;\ 00063 }\ 00064 else{\ 00065 gRX_COUNT = 0;\ 00066 gRX_CURRENT_DATA_NODE->next_node = new COM_RX_DATA_NODE;\ 00067 gRX_CURRENT_DATA_NODE = gRX_CURRENT_DATA_NODE->next_node;\ 00068 gRX_CURRENT_DATA_NODE->next_node = NULL;\ 00069 }\ 00070 gRX_TIMEOUT.attach(&after_receive, RX_TIMEOUT_LIMIT);\ 00071 } 00072 00073 void COM_MNG_TMTC_FUN(void const *args){ 00074 if( !(gFLAGS & COM_SESSION_FLAG) ){ 00075 //gLEDR = 1; 00076 //gLEDG = 1; 00077 } 00078 while(true){ 00079 Thread::signal_wait( COM_MNG_TMTC_SIGNAL_UART_INT ); 00080 if( gFLAGS & UART_INT_FLAG ){ 00081 gFLAGS = gFLAGS & (~UART_INT_FLAG); 00082 if( !(gFLAGS & COM_SESSION_FLAG) ){ 00083 // PENDING : DISABLE THREADS 00084 gPAY_SPI.bulkRead_end(); 00085 gFLAGS = gFLAGS | COM_SESSION_FLAG; 00086 gSESSION_TIMEOUT.attach(&after_session, SESSION_TIME_LIMIT); 00087 gFLAGS = gFLAGS | COM_RX_FLAG; 00088 PUT_RAW_BYTE; 00089 // PENDING : MEASURE RSSI 00090 if( gFLAGS & COM_SESSION_FLAG ){ 00091 //gLEDR = 0; 00092 //gLEDG = 0; 00093 } 00094 } 00095 else if( gFLAGS & COM_RX_FLAG ){ 00096 //gLEDR = 0; 00097 //gLEDG = 1; 00098 PUT_RAW_BYTE; 00099 } 00100 else{ 00101 //gLEDR = 1; 00102 //gLEDG = 0; 00103 gFLAGS = gFLAGS | COM_RX_FLAG; 00104 PUT_RAW_BYTE; 00105 } 00106 } 00107 else if( gFLAGS & NEW_TC_RECEIVED ){ 00108 if (DEBUG) 00109 gPC.puts("NEW TC RECEIVED\r\n"); 00110 // DEBUF_PRINT("NEW TC RECEIVED\r\n"); 00111 Thread::wait(2000); /*To be removed in flight model*/ 00112 gFLAGS = gFLAGS & (~NEW_TC_RECEIVED); 00113 gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; 00114 00115 // DISABLE THE RX1M INTERRUPT 00116 RX1M.attach(NULL); 00117 00118 // VERIFY CRC, REPEATED PSC AND UPDATE TOTAL_VALID_TC, INCORRECT SIZE TC, CRC FAIL TC 00119 while(gRX_COUNT < (RX_BUFFER_LENGTH)){ 00120 gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = 0x00; 00121 ++gRX_COUNT; 00122 } 00123 gRX_COUNT = 0; 00124 raw_data_to_tc(); 00125 gFLAGS = gFLAGS & (~COM_RX_FLAG); 00126 00127 if( gTOTAL_VALID_TC > 0 ){ 00128 if (DEBUG) 00129 gPC.printf("valid TC rx: %u\r\n", gTOTAL_VALID_TC); 00130 if( gTOTAL_VALID_TC < COM_MAX_TC_LIMIT ){ 00131 // CHECK WEATHER TC LIST HAS MISSING TC OR WEATHER LAST FRAME BIT IS HIGH IN THE LAST PSC-TC 00132 if (DEBUG) 00133 gPC.puts("checking for tc list complete\r\n"); 00134 uint8_t tempContinue = 0xFF; 00135 continueToExecute(tempContinue); 00136 if(tempContinue == 0x00){ 00137 if (DEBUG) 00138 gPC.puts("tc list is complete\r\n"); 00139 // CHECK WEATHER GS VERIFICATION CODE MATCHES 00140 uint8_t tempGSver = 0x00; 00141 GScodeVerification(tempGSver); 00142 /*PENDING: INCLUDE GS VERIFICATION CODE*/ 00143 if( tempGSver == 0xFF ){ 00144 if (DEBUG) 00145 gPC.puts("GS code match !!\r\n"); 00146 gFLAGS = gFLAGS | COM_SESSION_VALIDITY; 00147 COM_POWER_ON_TX; 00148 // PENDING: PA HOT HANDLED IN EXECUTE_XXX FUNCTIONS 00149 uint8_t tempPAHot = 0x00; 00150 isPAhot(tempPAHot); 00151 if( tempPAHot == 0xFF ){ 00152 gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG); 00153 gCOM_PA_COOLING_TIMEOUT.detach(); 00154 if (DEBUG) 00155 gPC.puts("EXECUTING TELECOMMANDS\r\n"); 00156 // DEBUF_PRINT("EXECUTING TELECOMMANDS\r\n"); 00157 EXECUTE_OBOSC_ONLY; 00158 EXECUTE_TC; 00159 if (DEBUG) 00160 gPC.puts("COMPLETED EXECUTION\r\n"); 00161 } 00162 else{ 00163 gFLAGS = gFLAGS | COM_PA_HOT_FLAG; 00164 // PENDING: power off transmitter only 00165 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00166 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00167 RX1M.attach(&rx_read, Serial::RxIrq); 00168 } 00169 } 00170 else{ 00171 if(DEBUG) 00172 gPC.puts("GS code mismatch !!\r\n"); 00173 RX1M.attach(&rx_read, Serial::RxIrq); 00174 reset_all; 00175 gFLAGS = gFLAGS & (~COM_SESSION_VALIDITY); 00176 // PENDING : ENABLE THREADS 00177 gPAY_SPI.bulkRead_start(); 00178 gSESSION_TIMEOUT.detach(); 00179 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00180 // WARNING: clear COM_MNG_TMTC ? 00181 } 00182 } 00183 else{ 00184 if (DEBUG) 00185 gPC.puts("tc list is not complete\r\n"); 00186 if(tempContinue & 0x01){ 00187 if (DEBUG) 00188 gPC.puts("last packet bit not found\r\n"); 00189 } 00190 if( tempContinue & 0x02 ){ 00191 if (DEBUG) 00192 gPC.puts("missing psc found\r\n"); 00193 } 00194 if (DEBUG){ 00195 gPC.printf("crc fail tc = %u\r\n", gTOTAL_CRC_FAIL_TC); 00196 gPC.printf("incorrect size tc = %u\r\n", gTOTAL_INCORRECT_SIZE_TC); 00197 gPC.printf("repeated psc = %u\r\n", gTOTAL_REPEATED_TC); 00198 gPC.puts("\r\n"); 00199 } 00200 Base_tc *test_tc = gHEAD_NODE_TCL; 00201 while( test_tc != NULL ){ 00202 int length = 0; 00203 if( GETshort_or_long_tc(test_tc) == SHORT_TC_CODE ){ 00204 length = TC_SHORT_SIZE; 00205 } 00206 else{ 00207 length = TC_LONG_SIZE; 00208 } 00209 for(int i = 0 ; i < length ; ++i ){ 00210 int x = 128; 00211 for( int j = 7 ; j >= 0 ; --j ){ 00212 gPC.printf("%d", (test_tc->TC_string[i] & x)>>j); 00213 x = x/2; 00214 } 00215 } 00216 gPC.puts("\r\n"); 00217 test_tc = test_tc->next_TC; 00218 } 00219 //gPC.puts("\r\n"); 00220 COM_POWER_ON_TX; 00221 // PENDING : POWER OFF TX 00222 RX1M.attach(&rx_read, Serial::RxIrq); 00223 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00224 } 00225 } 00226 else{ 00227 COM_POWER_ON_TX; 00228 // POWER OFF TX transmitter only 00229 // WARNING: reset_all ? clear com_session ? 00230 RX1M.attach(&rx_read, Serial::RxIrq); 00231 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00232 } 00233 } 00234 else{ 00235 if (DEBUG) 00236 gPC.puts("No valid TC received\r\n"); 00237 RX1M.attach(&rx_read, Serial::RxIrq); 00238 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00239 reset_all; 00240 // PENDING : ENABLE THREADS 00241 gPAY_SPI.bulkRead_start(); 00242 gSESSION_TIMEOUT.detach(); 00243 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00244 } 00245 } 00246 else if( gFLAGS & COM_PA_HOT_FLAG ){ 00247 if (DEBUG) 00248 gPC.puts("checking for PA hot in main\r\n"); 00249 if( gFLAGS & COM_RX_FLAG ){ 00250 uint8_t tempPA = 0xFF; 00251 isPAhot(tempPA); 00252 if( tempPA == 0x00 ){ 00253 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00254 } 00255 else{ 00256 gFLAGS = gFLAGS & ~(COM_PA_HOT_FLAG); 00257 gCOM_PA_COOLING_TIMEOUT.detach(); 00258 } 00259 } 00260 else{ 00261 uint8_t tempPA = 0xFF; 00262 isPAhot(tempPA); 00263 if( tempPA == 0x00 ){ 00264 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00265 } 00266 else{ 00267 /*gPC.puts("PA IS COOLED DOWN\r\n");*/ 00268 gFLAGS = gFLAGS & (~COM_PA_HOT_FLAG); 00269 gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; 00270 RX1M.attach(NULL); 00271 gCOM_PA_COOLING_TIMEOUT.detach(); 00272 COM_POWER_ON_TX; 00273 EXECUTE_OBOSC_ONLY; 00274 EXECUTE_TC; 00275 } 00276 } 00277 } 00278 else if( gFLAGS & COM_SESSION_TIMEOUT_FLAG ){ 00279 if (DEBUG) 00280 gPC.puts("session timeout: resetting in main\r\n"); 00281 COM_POWER_OFF_TX; 00282 /*PENDING : ENABLE THREADS*/ 00283 gPAY_SPI.bulkRead_start(); 00284 gSESSION_TIMEOUT.detach(); 00285 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00286 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00287 reset_all; 00288 } 00289 else{ 00290 if (DEBUG) 00291 gPC.puts("INVALID SIGNAL RECEIVED IN MAIN\r\n"); 00292 // SOME INVALID SIGNAL RECEIVED 00293 COM_POWER_OFF_TX; 00294 reset_all; 00295 // PENDING : ENABLE THREADS 00296 gPAY_SPI.bulkRead_start(); 00297 gSESSION_TIMEOUT.detach(); 00298 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00299 } 00300 } 00301 } 00302 00303 void payload_isr_fun(){ 00304 gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL); 00305 } 00306 00307 void SCIENCE_FUN(void const *args){ 00308 00309 // initialisation of payload spi 00310 gPAY_SPI.frequency(1000000); 00311 gPAY_SPI.format(8,0); 00312 gPAY_SPI.bulkRead_init(gPAYLOAD_BUFFER, PAYLOAD_BUFFER_LENGTH, &payload_isr_fun); 00313 gPAY_SPI.bulkRead_start(); 00314 00315 while(true){ 00316 gPC.puts("entering science thread\r\n"); 00317 gSCIENCE_THREAD->signal_wait(SCIENCE_SIGNAL); 00318 gPC.puts("sig_set\r\n"); 00319 srp(gPAYLOAD_BUFFER); 00320 gPC.puts("exit_srp\r\n"); 00321 gPAY_SPI.bulkRead_start(); 00322 } 00323 }
Generated on Wed Jul 13 2022 02:12:45 by 1.7.2