working version
Dependencies: mbed mbed-rtos SimpleDMA FreescaleIAP eeprom
Fork of CDMS_CODE_FM_28JAN2017 by
ThreadsAndFunctions.h
- Committer:
- samp1234
- Date:
- 2022-04-03
- Revision:
- 357:f3d48d62e00e
- Parent:
- 356:197c93dc2012
File content as of revision 357:f3d48d62e00e:
//Science Thread //SPI ISR #include "COM_MNG_TMTC.h" #include "adf.h" #include "dmaSPIslave.h" dmaSPISlave *gPAY_SPI; void payload_isr_fun(){ gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL); } void payload_isr_fun_dma(void const *args ){ gSCIENCE_THREAD->signal_set(SCIENCE_SIGNAL); } void SCIENCE_FUN(void const *args){ // gPAY_SPI->frequency(1000000); //1000000 gPAY_SPI->format(8,0); gPC.printf("\n\rTest..........................."); gPAY_SPI->bulkRead_init(gPAYLOAD_BUFFER, PAYLOAD_BUFFER_LENGTH, &payload_isr_fun); //commented 2day gPAY_SPI->bulkRead_start(); //commented 2day //AY_SPI->bulkRead_pause(); //AY_SPI->bulkRead_resume(&payload_isr_fun); while(true){ gPC.printf("waiting for Sci sig\n\r"); gSCIENCE_THREAD->signal_wait(SCIENCE_SIGNAL); gPC.printf("got signal\n\r"); if(EN_RCV_SC == 0x00) continue; gPC.printf("checking mutex in Sci\n\r"); gMutex.lock(); gPC.printf("locked mutex,entered in Sci thread\n\r"); WRITE_TO_EEPROM(1,DEVICE_POWERED); DMA_LED1 = 1; PL_RCV_SC_DATA_STATUS = 1; //gPC.puts("sig_set\r\n"); //for(int i =0; i<PAYLOAD_BUFFER_LENGTH; i++) //if (gPAYLOAD_BUFFER[i] != 0x01) gPC.printf("%d = 0x%02X\n\r",i,gPAYLOAD_BUFFER[i]); //gPAY_SPI->bulkRead_start(); //srp(gPAYLOAD_BUFFER);//skip one apcket when cdms resets //gPC.puts("exit_srp\r\n"); //wait(2);/*timeout to be decided*/ if(dma) //something wrong here { // TIME_LATEST_I2C_SPEED = FCTN_CDMS_RD_RTC() >> 7; PL_RCV_SC_DATA_COUNTER++; gPC.printf("dma activatedi\n\r"); gPAY_SPI->bulkRead_start();//something wrong here //commented 2day // DMA_LED1 = !DMA_LED1; // added by samp //gPAY_SPI->bulkRead_pause(); //gPAY_SPI->bulkRead_resume(&payload_isr_fun); } // DMA_LED1 = !DMA_LED1; // added by samp //__disable_irq(); srp(gPAYLOAD_BUFFER);//skip one apcket when cdms resets uint8_t sd_stat1 = 0; if(BAE_HK_SD_DATA_READY==1) { for(int i=0; i<288; i++) BAE_HEALTH_FINAL[i] = interleave_BAE_HK[i]; sd_stat1 = SD_WRITE(BAE_HEALTH_FINAL,FSC_CURRENT[5]+1,5); if(sd_stat1) { gPC.puts("BAE_HK sd write fail"); //break; } } BAE_HK_SD_DATA_READY = 0; if(CDMS_HK_SD_DATA_READY==1) { for(int i=0; i<288; i++) CDMS_HEALTH_FINAL[i] = interleave_CDMS_HK[i]; //gPC.printf("\n\r reached here"); sd_stat1 = SD_WRITE(CDMS_HEALTH_FINAL,FSC_CURRENT[4]+1,4); if(sd_stat1) { gPC.puts("sd write failure $*&^@!~!"); } } CDMS_HK_SD_DATA_READY= 0; /*else gPC.printf("\n\rDMA error");*/ gPC.printf("\r\nreleasing mutex for Sci\n\r"); DMA_LED1 =0; //__enable_irq(); gMutex.unlock(); } } //HK Thread(Contains HK_main() and PL_main()) //RTOS timer calllback func void hk_isr(void const *args){ //gPC.printf("\r\n HK isr \n\r"); gHK_THREAD->signal_set(HK_SIGNAL); // gPC.printf("\r\n HK 1 \n\r"); } //COM THREAD // UART ISR void rx_read(){ gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = RX1M.getc(); //Checking RSSI if(!COM_RSSI_SET) RSSI_VOLTAGE = COMRX_RSSI_VOLTAGE.read() * 3.3;//to be checked RSSI_MAX = RSSI_VOLTAGE; COM_RSSI_SET = 1; gFLAGS = gFLAGS | UART_INT_FLAG; gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); } // COM_RX_DISABLE ISR void after_com_disable(){ gCOM_RX_DISABLE.detach(); RX1M.attach(&rx_read, Serial::RxIrq); } // RX_TIMEOUT ISR void after_receive(){ gRX_TIMEOUT.detach(); gFLAGS = gFLAGS | 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 | COM_SESSION_TIMEOUT_FLAG; //if( gMASTER_STATE != TCL_STATE_EXECUTING ){ gCOM_MNG_TMTC_THREAD->signal_set(COM_MNG_TMTC_SIGNAL_UART_INT); //} } #define reset_all {\ Base_tc *tcp = gHEAD_NODE_TCL;\ /*gPC.puts("inside reset\r\n");*/\ gFLAGS = 0x0000;\ while(tcp != NULL){\ Base_tc *temp = tcp->next_TC;\ delete tcp;\ tcp = temp;\ }\ gHEAD_NODE_TCL = NULL;\ gLAST_NODE_TCL = NULL;\ gMASTER_STATE = TCL_STATE_COMPLETED;\ gTOTAL_INCORRECT_SIZE_TC = 0;\ gTOTAL_CRC_FAIL_TC = 0;\ gTOTAL_REPEATED_TC = 0;\ gTOTAL_VALID_TC = 0;\ for(int i = 0 ; i < TM_LONG_SIZE ; ++i){\ /*gLAST_TM[i] = 0x00;*/\ }\ /*gLAST_TM_SHORT_OR_LONG = SHORT_TM_CODE;*/\ 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_COUNT = 0;\ gTOTAL_RAW_BYTES = 0;\ /*PENDING : ALL GLOBAL VAARIABLES AND FLAGS*/\ /*gPC.puts("finished reset all\r\n");*/\ } #define PUT_RAW_BYTE {\ if( gRX_COUNT < (RX_BUFFER_LENGTH-1) ){\ ++gRX_COUNT;\ }\ else{\ 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;\ }\ ++gTOTAL_RAW_BYTES;\ gRX_TIMEOUT.attach(&after_receive, RX_TIMEOUT_LIMIT);\ } void COM_MNG_TMTC_FUN(void const *args){ if( !(gFLAGS & COM_SESSION_FLAG) ){ //gLEDR = 1; //gLEDG = 1; } while(true){ Thread::signal_wait( COM_MNG_TMTC_SIGNAL_UART_INT ); // RSSI_MAX = 0; if( gFLAGS & UART_INT_FLAG ){ gFLAGS = gFLAGS & (~UART_INT_FLAG); //gPC.puts("in uart"); if( !(gFLAGS & COM_SESSION_FLAG) ){ // DISABLE THREADS // gPC.puts("1\r\n"); HK_counter->stop(); resume_pl_dma = 0; PL_GPIO_2_STATUS = 1;//STOP SCIENCE TRANSFER & CONTROL pin NOT STATUS gPAY_SPI->bulkRead_pause(); PL_GPIO_3_STATUS=1;//problem with this gFLAGS = gFLAGS | COM_SESSION_FLAG; gSESSION_TIMEOUT.attach(&after_session, 14*COM_SESSION_TIMEOUT); gFLAGS = gFLAGS | COM_RX_FLAG; gTOTAL_RAW_BYTES = 0; PUT_RAW_BYTE; // PENDING : MEASURE RSSI if( gFLAGS & COM_SESSION_FLAG ){ //gLEDR = 0; //gLEDG = 0; } } else if( gFLAGS & COM_RX_FLAG ){ //gLEDR = 0; //gLEDG = 1; //gPC.puts("2\r\n"); PUT_RAW_BYTE; } else{ //gLEDR = 1; //gLEDG = 0; // gPC.puts("3\r\n"); gFLAGS = gFLAGS | COM_RX_FLAG; PUT_RAW_BYTE; } if(gTOTAL_RAW_BYTES > BYTE_OVERFLOW_CONSTANT){ //gPC.puts("4\r\n"); RX1M.attach(NULL); gCOM_RX_DISABLE.attach(&after_com_disable, COM_RX_DISABLE_TIMEOUT); after_receive(); } } else if( gFLAGS & NEW_TC_RECEIVED ){ gFLAGS = gFLAGS & (~NEW_TC_RECEIVED); // DISABLE THE RX1M INTERRUPT RX1M.attach(NULL); gPC.printf("RSSI = %f",RSSI_MAX); /*Thread::wait(2000);*/ gFLAGS = gFLAGS & (~COM_RX_FLAG);//CHanged but not tested gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; //gPC.printf("\n flags = %u \n", gFLAGS); gPC.puts("\n\n\n\r\rNEW TC RECEIVED\r\n"); //gPC.printf("\n %u \n", gFLAGS); // VERIFY CRC, REPEATED PSC AND UPDATE TOTAL_VALID_TC, INCORRECT SIZE TC, CRC FAIL TC while(gRX_COUNT < (RX_BUFFER_LENGTH)){ gRX_CURRENT_DATA_NODE->values[gRX_COUNT] = 0x00; ++gRX_COUNT; } gRX_COUNT = 0; raw_data_to_tc(); //gFLAGS = gFLAGS & (~COM_RX_FLAG); //Mutex gMutex.lock(); if( gTOTAL_VALID_TC > 1 ){ gPC.printf("valid TC rx: %u\r\n", gTOTAL_VALID_TC); TC_count += gTOTAL_VALID_TC; //gTOTAL_VALID_TC = 1; if( gTOTAL_VALID_TC < COM_MAX_TC_LIMIT ){ // CHECK WEATHER TC LIST HAS MISSING TC OR WEATHER LAST FRAME BIT IS HIGH IN THE LAST PSC-TC //gPC.puts("checking for tc list complete\r\n"); uint8_t tempContinue = 0xFF; continueToExecute(tempContinue); if(tempContinue == 0x00){ gPC.puts("tc list is complete\r\n"); // CHECK WEATHER GS VERIFICATION CODE MATCHES uint8_t tempGSver = 0x00; GScodeVerification(tempGSver); /*PENDING: INCLUDE GS VERIFICATION CODE*/ if( tempGSver == 0xFF ){ //gPC.puts("GS code match !!\r\n"); gFLAGS = gFLAGS | COM_SESSION_VALIDITY; //sys_reset_cdms_timer->start(cdms_reset_timeout); COM_POWER_ON_TX(); // gPC.puts("P_com_hk !!\r\n"); P_COM_HK; // gPC.puts("P_com_hk !!\r\n"); if( (gFLAGS & COM_PA_HOT_FLAG) || ( gFLAGS & COM_PA_OC_FLAG ) ){ gPC.puts("Pahot or paoc !!\r\n"); COM_DATA_fromuC_ENAIN = 0; COM_DATA_fromISO_ENAOUT=0; COM_TX_CNTRL = 0; gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); RX1M.attach(&rx_read, Serial::RxIrq); } else{ gCOM_PA_COOLING_TIMEOUT.detach(); gPC.puts("EXECUTING TELECOMMANDS\r\n"); EXECUTE_OBOSC_ONLY; EXECUTE_TC; gPC.puts("COMPLETED EXECUTION\r\n"); gPC.printf("master_state : %d\n",gMASTER_STATE); } } else{ gPC.puts("GS code mismatch !!\r\n"); RX1M.attach(&rx_read, Serial::RxIrq); reset_all; gFLAGS = gFLAGS & (~COM_SESSION_VALIDITY); // ENABLE THREADS HK_counter->start(10000); resume_pl_dma = 1; //gPAY_SPI->bulkRead_resume(&payload_isr_fun); gSESSION_TIMEOUT.detach(); gFLAGS = gFLAGS & (~COM_SESSION_FLAG); // WARNING: clear COM_MNG_TMTC ? gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); } } else{ gPC.puts("tc list is not complete\r\n"); if(tempContinue & 0x01){ gPC.puts("last packet bit not found\r\n"); } if( tempContinue & 0x02 ){ gPC.puts("missing psc found\r\n"); } //gPC.printf("crc fail tc = %u\r\n", gTOTAL_CRC_FAIL_TC); //gPC.printf("incorrect size tc = %u\r\n", gTOTAL_INCORRECT_SIZE_TC); //gPC.printf("repeated psc = %u\r\n", gTOTAL_REPEATED_TC); Base_tc *test_tc = gHEAD_NODE_TCL; while( test_tc != NULL ){ int length = 0; if( GETshort_or_long_tc(test_tc) == SHORT_TC_CODE ){ length = TC_SHORT_SIZE; } else{ length = TC_LONG_SIZE; } for(int i = 0 ; i < length ; ++i ){ //gPC.printf("%x ", test_tc->TC_string[i]); } //gPC.puts("\r\n"); test_tc = test_tc->next_TC; } //gPC.puts("\r\n"); COM_POWER_ON_TX(); // PENDING : POWER OFF TX COM_DATA_fromuC_ENAIN = 0; COM_DATA_fromISO_ENAOUT=0; COM_TX_CNTRL = 0; COM_POWER_OFF_TX; //reset_all; RX1M.attach(&rx_read, Serial::RxIrq); gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); //resume_pl_dma = 1; //HK_counter->start(10000); } } else{ COM_POWER_ON_TX(); // POWER OFF TX transmitter only // WARNING: reset_all ? clear com_session ? COM_DATA_fromuC_ENAIN = 0; COM_DATA_fromISO_ENAOUT=0; COM_TX_CNTRL = 0; reset_all; gFLAGS = gFLAGS & (~COM_SESSION_FLAG); RX1M.attach(&rx_read, Serial::RxIrq); gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); } } else{ gPC.puts("No valid TC received\r\n"); RX1M.attach(&rx_read, Serial::RxIrq); gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); reset_all; // ENABLE THREADS HK_counter->start(10000); resume_pl_dma = 1; gSESSION_TIMEOUT.detach(); gFLAGS = gFLAGS & (~COM_SESSION_FLAG); } } else if( gFLAGS & COM_PA_HOT_FLAG ){ gPC.puts("checking for PA hot in main\r\n"); P_COM_HK; if((gFLAGS & COM_PA_HOT_FLAG) || (gFLAGS & COM_PA_OC_FLAG)){ COM_DATA_fromuC_ENAIN = 0; COM_DATA_fromISO_ENAOUT=0; COM_TX_CNTRL = 0; gCOM_PA_COOLING_TIMEOUT.attach(&after_cooling_pa, COM_PA_COOLING_TIME_LIMIT); } else{ gCOM_PA_COOLING_TIMEOUT.detach(); if( !(gFLAGS & COM_RX_FLAG) ){ gPC.puts("PA IS COOLED DOWN\r\n"); gFLAGS = gFLAGS | COM_MNG_TMTC_RUNNING_FLAG; RX1M.attach(NULL); COM_POWER_ON_TX(); EXECUTE_OBOSC_ONLY; EXECUTE_TC; } } } else if( gFLAGS & COM_SESSION_TIMEOUT_FLAG ){ gPC.puts("session timeout: resetting in main\r\n"); COM_POWER_OFF_TX; /*ENABLE THREADS*/ HK_counter->start(10000); resume_pl_dma = 1; gSESSION_TIMEOUT.detach(); gFLAGS = gFLAGS & (~COM_MNG_TMTC_RUNNING_FLAG); gFLAGS = gFLAGS & (~COM_SESSION_FLAG); reset_all; } else{ gPC.puts("INVALID SIGNAL RECEIVED IN MAIN\r\n"); // SOME INVALID SIGNAL RECEIVED COM_POWER_OFF_TX; reset_all; // ENABLE THREADS HK_counter->start(10000); resume_pl_dma = 1; gSESSION_TIMEOUT.detach(); gFLAGS = gFLAGS & (~COM_SESSION_FLAG); } if(resume_pl_dma) { PL_GPIO_2_STATUS=0; // resume_pl_dma = 0; } gPAY_SPI->bulkRead_resume(&payload_isr_fun); gMutex.unlock(); } } /* void st_up_isr(void const *args){ gST_UP->signal_set(ST_UP_SIGNAL);\ } */