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.
Dependencies: FreescaleIAP SimpleDMA mbed-rtos mbed
Fork of CDMS_CODE by
ThreadsAndFunctions.h
00001 //Science Thread 00002 //SPI ISR 00003 void payload_isr_fun(){ 00004 gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL); 00005 } 00006 00007 void payload_isr_fun_dma(void const *args ){ 00008 gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL); 00009 } 00010 00011 void SCIENCE_FUN(void const *args){ 00012 gPAY_SPI = new dmaSPISlave(PAY_SPI_MOSI, PAY_SPI_MISO, PAY_SPI_CLK, PAY_SPI_CS); 00013 // gPAY_SPI->frequency(1000000); //1000000 00014 gPAY_SPI->format(8,0); 00015 gPC.printf("\n\rTest..........................."); 00016 gPAY_SPI->bulkRead_init(gPAYLOAD_BUFFER, PAYLOAD_BUFFER_LENGTH, &payload_isr_fun); 00017 gPAY_SPI->bulkRead_start(); 00018 00019 //AY_SPI->bulkRead_pause(); 00020 //AY_SPI->bulkRead_resume(&payload_isr_fun); 00021 while(true){ 00022 //gPC.puts("entering sci\r\n"); 00023 gSCIENCE_THREAD->signal_wait(SCIENCE_SIGNAL); 00024 gMutex.lock(); 00025 PL_RCV_SC_DATA_STATUS = 1; 00026 //gPC.puts("sig_set\r\n"); 00027 //for(int i =0; i<PAYLOAD_BUFFER_LENGTH; i++) 00028 //if (gPAYLOAD_BUFFER[i] != 0x01) gPC.printf("%d = 0x%02X\n\r",i,gPAYLOAD_BUFFER[i]); 00029 //gPAY_SPI->bulkRead_start(); 00030 // srp(gPAYLOAD_BUFFER);//skip one apcket when cdms resets 00031 //gPC.puts("exit_srp\r\n"); 00032 //wait(2);/*timeout to be decided*/ 00033 if(dma) 00034 { 00035 00036 PL_RCV_SC_DATA_COUNTER++; 00037 gPAY_SPI->bulkRead_start(); 00038 DMA_LED1 = !DMA_LED1; // added by samp 00039 //gPAY_SPI->bulkRead_pause(); 00040 //gPAY_SPI->bulkRead_resume(&payload_isr_fun); 00041 } 00042 // DMA_LED1 = !DMA_LED1; // added by samp 00043 00044 srp(gPAYLOAD_BUFFER);//skip one apcket when cdms resets 00045 00046 /*else 00047 gPC.printf("\n\rDMA error");*/ 00048 gMutex.unlock(); 00049 } 00050 } 00051 00052 //HK Thread(Contains HK_main() and PL_main()) 00053 //RTOS timer calllback func 00054 void hk_isr(void const *args){ 00055 gHK_THREAD->signal_set(HK_SIGNAL); 00056 } 00057 00058 00059 //COM THREAD 00060 // UART ISR 00061 void rx_read(){ 00062 gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = RX1M.getc(); 00063 gFLAGS = gFLAGS | UART_INT_FLAG; 00064 gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); 00065 } 00066 00067 // COM_RX_DISABLE ISR 00068 void after_com_disable(){ 00069 gCOM_RX_DISABLE.detach(); 00070 RX1M.attach(&rx_read, Serial::RxIrq); 00071 } 00072 00073 // RX_TIMEOUT ISR 00074 void after_receive(){ 00075 gRX_TIMEOUT.detach(); 00076 gFLAGS = gFLAGS | NEW_TC_RECEIVED; 00077 gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); 00078 } 00079 00080 // SESSION_TIMOUT ISR 00081 void after_session(){ 00082 gSESSION_TIMEOUT.detach(); 00083 gFLAGS = gFLAGS | COM_SESSION_TIMEOUT_FLAG; 00084 if( gMASTER_STATE != TCL_STATE_EXECUTING ){ 00085 gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); 00086 } 00087 } 00088 00089 #define reset_all {\ 00090 Base_tc *tcp = gHEAD_NODE_TCL;\ 00091 /*gPC.puts("inside reset\r\n");*/\ 00092 gFLAGS = 0x0000;\ 00093 while(tcp != NULL){\ 00094 Base_tc *temp = tcp->next_TC;\ 00095 delete tcp;\ 00096 tcp = temp;\ 00097 }\ 00098 gHEAD_NODE_TCL = NULL;\ 00099 gLAST_NODE_TCL = NULL;\ 00100 gMASTER_STATE = TCL_STATE_COMPLETED;\ 00101 gTOTAL_INCORRECT_SIZE_TC = 0;\ 00102 gTOTAL_CRC_FAIL_TC = 0;\ 00103 gTOTAL_REPEATED_TC = 0;\ 00104 gTOTAL_VALID_TC = 0;\ 00105 for(int i = 0 ; i < TM_LONG_SIZE ; ++i){\ 00106 /*gLAST_TM[i] = 0x00;*/\ 00107 }\ 00108 /*gLAST_TM_SHORT_OR_LONG = SHORT_TM_CODE;*/\ 00109 COM_RX_DATA_NODE *dataptr = gRX_HEAD_DATA_NODE;\ 00110 while( dataptr != NULL ){\ 00111 COM_RX_DATA_NODE *temp = dataptr->next_node;\ 00112 delete dataptr;\ 00113 dataptr = temp;\ 00114 }\ 00115 gRX_HEAD_DATA_NODE = new COM_RX_DATA_NODE;\ 00116 gRX_HEAD_DATA_NODE->next_node = NULL;\ 00117 gRX_CURRENT_DATA_NODE = gRX_HEAD_DATA_NODE;\ 00118 gRX_COUNT = 0;\ 00119 gTOTAL_RAW_BYTES = 0;\ 00120 /*PENDING : ALL GLOBAL VAARIABLES AND FLAGS*/\ 00121 /*gPC.puts("finished reset all\r\n");*/\ 00122 } 00123 00124 #define PUT_RAW_BYTE {\ 00125 if( gRX_COUNT < (RX_BUFFER_LENGTH-1) ){\ 00126 ++gRX_COUNT;\ 00127 }\ 00128 else{\ 00129 gRX_COUNT = 0;\ 00130 gRX_CURRENT_DATA_NODE->next_node = new COM_RX_DATA_NODE;\ 00131 gRX_CURRENT_DATA_NODE = gRX_CURRENT_DATA_NODE->next_node;\ 00132 gRX_CURRENT_DATA_NODE->next_node = NULL;\ 00133 }\ 00134 ++gTOTAL_RAW_BYTES;\ 00135 gRX_TIMEOUT.attach(&after_receive, RX_TIMEOUT_LIMIT);\ 00136 } 00137 00138 void COM_MNG_TMTC_FUN(void const *args){ 00139 if( !(gFLAGS & COM_SESSION_FLAG) ){ 00140 //gLEDR = 1; 00141 //gLEDG = 1; 00142 } 00143 while(true){ 00144 Thread::signal_wait( COM_MNG_TMTC_SIGNAL_UART_INT ); 00145 if( gFLAGS & UART_INT_FLAG ){ 00146 gFLAGS = gFLAGS & (~UART_INT_FLAG); 00147 if( !(gFLAGS & COM_SESSION_FLAG) ){ 00148 // DISABLE THREADS 00149 HK_counter->stop(); 00150 gPAY_SPI->bulkRead_pause(); 00151 gFLAGS = gFLAGS | COM_SESSION_FLAG; 00152 gSESSION_TIMEOUT.attach(&after_session, SESSION_TIME_LIMIT); 00153 gFLAGS = gFLAGS | COM_RX_FLAG; 00154 gTOTAL_RAW_BYTES = 0; 00155 PUT_RAW_BYTE; 00156 // PENDING : MEASURE RSSI 00157 if( gFLAGS & COM_SESSION_FLAG ){ 00158 //gLEDR = 0; 00159 //gLEDG = 0; 00160 } 00161 } 00162 else if( gFLAGS & COM_RX_FLAG ){ 00163 //gLEDR = 0; 00164 //gLEDG = 1; 00165 PUT_RAW_BYTE; 00166 } 00167 else{ 00168 //gLEDR = 1; 00169 //gLEDG = 0; 00170 gFLAGS = gFLAGS | COM_RX_FLAG; 00171 PUT_RAW_BYTE; 00172 } 00173 if(gTOTAL_RAW_BYTES > BYTE_OVERFLOW_CONSTANT){ 00174 RX1M.attach(NULL); 00175 gCOM_RX_DISABLE.attach(&after_com_disable, COM_RX_DISABLE_TIMEOUT); 00176 after_receive(); 00177 } 00178 } 00179 else if( gFLAGS & NEW_TC_RECEIVED ){ 00180 gPC.puts("NEW TC RECEIVED\r\n"); 00181 /*Thread::wait(2000);*/ 00182 gFLAGS = gFLAGS & (~NEW_TC_RECEIVED); 00183 gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; 00184 00185 // DISABLE THE RX1M INTERRUPT 00186 RX1M.attach(NULL); 00187 00188 // VERIFY CRC, REPEATED PSC AND UPDATE TOTAL_VALID_TC, INCORRECT SIZE TC, CRC FAIL TC 00189 while(gRX_COUNT < (RX_BUFFER_LENGTH)){ 00190 gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = 0x00; 00191 ++gRX_COUNT; 00192 } 00193 gRX_COUNT = 0; 00194 raw_data_to_tc(); 00195 gFLAGS = gFLAGS & (~COM_RX_FLAG); 00196 00197 //Mutex 00198 gMutex.lock(); 00199 00200 if( gTOTAL_VALID_TC > 0 ){ 00201 gPC.printf("valid TC rx: %u\r\n", gTOTAL_VALID_TC); 00202 if( gTOTAL_VALID_TC < COM_MAX_TC_LIMIT ){ 00203 // CHECK WEATHER TC LIST HAS MISSING TC OR WEATHER LAST FRAME BIT IS HIGH IN THE LAST PSC-TC 00204 //gPC.puts("checking for tc list complete\r\n"); 00205 uint8_t tempContinue = 0xFF; 00206 continueToExecute(tempContinue); 00207 if(tempContinue == 0x00){ 00208 gPC.puts("tc list is complete\r\n"); 00209 // CHECK WEATHER GS VERIFICATION CODE MATCHES 00210 uint8_t tempGSver = 0x00; 00211 GScodeVerification(tempGSver); 00212 /*PENDING: INCLUDE GS VERIFICATION CODE*/ 00213 if( tempGSver == 0xFF ){ 00214 //gPC.puts("GS code match !!\r\n"); 00215 gFLAGS = gFLAGS | COM_SESSION_VALIDITY; 00216 //sys_reset_cdms_timer->start(cdms_reset_timeout); 00217 COM_POWER_ON_TX(); 00218 //gPC.puts("P_com_hk !!\r\n"); 00219 P_COM_HK; 00220 //gPC.puts("P_com_hk !!\r\n"); 00221 if( (gFLAGS & COM_PA_HOT_FLAG) || ( gFLAGS & COM_PA_OC_FLAG ) ){ 00222 gPC.puts("Pahot or paoc !!\r\n"); 00223 COM_TX_CNTRL = 0; 00224 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00225 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00226 RX1M.attach(&rx_read, Serial::RxIrq); 00227 } 00228 else{ 00229 gCOM_PA_COOLING_TIMEOUT.detach(); 00230 gPC.puts("EXECUTING TELECOMMANDS\r\n"); 00231 EXECUTE_OBOSC_ONLY; 00232 EXECUTE_TC; 00233 gPC.puts("COMPLETED EXECUTION\r\n"); 00234 } 00235 } 00236 else{ 00237 gPC.puts("GS code mismatch !!\r\n"); 00238 RX1M.attach(&rx_read, Serial::RxIrq); 00239 reset_all; 00240 gFLAGS = gFLAGS & (~COM_SESSION_VALIDITY); 00241 // ENABLE THREADS 00242 HK_counter->start(10000); 00243 gPAY_SPI->bulkRead_resume(&payload_isr_fun); 00244 gSESSION_TIMEOUT.detach(); 00245 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00246 // WARNING: clear COM_MNG_TMTC ? 00247 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00248 } 00249 } 00250 else{ 00251 gPC.puts("tc list is not complete\r\n"); 00252 if(tempContinue & 0x01){ 00253 gPC.puts("last packet bit not found\r\n"); 00254 } 00255 if( tempContinue & 0x02 ){ 00256 gPC.puts("missing psc found\r\n"); 00257 } 00258 //gPC.printf("crc fail tc = %u\r\n", gTOTAL_CRC_FAIL_TC); 00259 //gPC.printf("incorrect size tc = %u\r\n", gTOTAL_INCORRECT_SIZE_TC); 00260 //gPC.printf("repeated psc = %u\r\n", gTOTAL_REPEATED_TC); 00261 Base_tc *test_tc = gHEAD_NODE_TCL; 00262 while( test_tc != NULL ){ 00263 int length = 0; 00264 if( GETshort_or_long_tc(test_tc) == SHORT_TC_CODE ){ 00265 length = TC_SHORT_SIZE; 00266 } 00267 else{ 00268 length = TC_LONG_SIZE; 00269 } 00270 for(int i = 0 ; i < length ; ++i ){ 00271 //gPC.printf("%x ", test_tc->TC_string[i]); 00272 } 00273 //gPC.puts("\r\n"); 00274 test_tc = test_tc->next_TC; 00275 } 00276 //gPC.puts("\r\n"); 00277 COM_POWER_ON_TX(); 00278 // PENDING : POWER OFF TX 00279 COM_TX_CNTRL = 0; 00280 RX1M.attach(&rx_read, Serial::RxIrq); 00281 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00282 } 00283 } 00284 else{ 00285 COM_POWER_ON_TX(); 00286 // POWER OFF TX transmitter only 00287 // WARNING: reset_all ? clear com_session ? 00288 COM_TX_CNTRL = 0; 00289 reset_all; 00290 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00291 RX1M.attach(&rx_read, Serial::RxIrq); 00292 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00293 } 00294 } 00295 else{ 00296 gPC.puts("No valid TC received\r\n"); 00297 RX1M.attach(&rx_read, Serial::RxIrq); 00298 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00299 reset_all; 00300 // ENABLE THREADS 00301 HK_counter->start(10000); 00302 gPAY_SPI->bulkRead_resume(&payload_isr_fun); 00303 gSESSION_TIMEOUT.detach(); 00304 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00305 } 00306 } 00307 else if( gFLAGS & COM_PA_HOT_FLAG ){ 00308 gPC.puts("checking for PA hot in main\r\n"); 00309 P_COM_HK; 00310 if((gFLAGS & COM_PA_HOT_FLAG) || (gFLAGS & COM_PA_OC_FLAG)){ 00311 COM_TX_CNTRL = 0; 00312 gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); 00313 } 00314 else{ 00315 gCOM_PA_COOLING_TIMEOUT.detach(); 00316 if( !(gFLAGS & COM_RX_FLAG) ){ 00317 gPC.puts("PA IS COOLED DOWN\r\n"); 00318 gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; 00319 RX1M.attach(NULL); 00320 COM_POWER_ON_TX(); 00321 EXECUTE_OBOSC_ONLY; 00322 EXECUTE_TC; 00323 } 00324 } 00325 } 00326 else if( gFLAGS & COM_SESSION_TIMEOUT_FLAG ){ 00327 gPC.puts("session timeout: resetting in main\r\n"); 00328 COM_POWER_OFF_TX; 00329 /*ENABLE THREADS*/ 00330 HK_counter->start(10000); 00331 gPAY_SPI->bulkRead_resume(&payload_isr_fun); 00332 gSESSION_TIMEOUT.detach(); 00333 gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); 00334 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00335 reset_all; 00336 } 00337 else{ 00338 gPC.puts("INVALID SIGNAL RECEIVED IN MAIN\r\n"); 00339 // SOME INVALID SIGNAL RECEIVED 00340 COM_POWER_OFF_TX; 00341 reset_all; 00342 // ENABLE THREADS 00343 HK_counter->start(10000); 00344 gPAY_SPI->bulkRead_resume(&payload_isr_fun); 00345 gSESSION_TIMEOUT.detach(); 00346 gFLAGS = gFLAGS & (~COM_SESSION_FLAG); 00347 } 00348 gPAY_SPI->bulkRead_resume(&payload_isr_fun); 00349 gMutex.unlock(); 00350 } 00351 }
Generated on Fri Jul 15 2022 00:06:54 by
1.7.2
