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);\
}
*/
