working version
Dependencies: mbed mbed-rtos SimpleDMA FreescaleIAP eeprom
Fork of CDMS_CODE_FM_28JAN2017 by
Diff: CDMS_PL.h
- Revision:
- 357:f3d48d62e00e
- Parent:
- 356:197c93dc2012
--- a/CDMS_PL.h Sat Feb 10 09:06:26 2018 +0000 +++ b/CDMS_PL.h Sun Apr 03 15:35:53 2022 +0000 @@ -1,7 +1,6 @@ int pl_next_index=-1; uint8_t pl_main_flag=0x04; uint8_t PL_PREV_STATE=0x00; -uint8_t POWER_LEVEL = 3; //Would be present in HK data extracted uint32_t pl_block[192]={0}; uint32_t pl_time; uint32_t TIME_LATEST_PL=0; @@ -200,8 +199,13 @@ pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_SUCCESS_I2C; PL_STATUS = 0x04; - pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= EXECUTED; + if(pl_next_index >= 1) + { + pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status + pl_block[pl_next_index-1] |= EXECUTED; + } + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM } else { @@ -210,8 +214,13 @@ pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_ERR_I2C; PL_STATUS = 0x05; - pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= RETRY; + if(pl_next_index >= 1) + { + pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status + pl_block[pl_next_index-1] |= RETRY; + } + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM } } else @@ -220,8 +229,13 @@ pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_ERR_I2C; PL_STATUS = 0x05; - pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= RETRY; + if(pl_next_index >= 1) + { + pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status + pl_block[pl_next_index-1] |= RETRY; + } + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM } } else if(GETshort_or_long_tm(tm_ptr)==0) //LONG TM @@ -245,8 +259,13 @@ pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_SUCCESS_I2C; PL_STATUS = 0x04; - pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= EXECUTED; + if(pl_next_index >= 1) + { + pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status + pl_block[pl_next_index-1] |= EXECUTED; + } + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM } else { @@ -254,8 +273,13 @@ pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_ERR_I2C; PL_STATUS = 0x05; - pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= RETRY; + if(pl_next_index >= 1) + { + pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status + pl_block[pl_next_index-1] |= RETRY; + } + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM } } else @@ -263,9 +287,14 @@ gPC.printf("\n\rLong_TM CRC failed"); pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_ERR_I2C; - PL_STATUS = 0x05; - pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= RETRY; + PL_STATUS = 0x05; + if(pl_next_index >= 1) + { + pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status + pl_block[pl_next_index-1] |= RETRY; + } + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM } } } @@ -303,6 +332,83 @@ schedule1[0] = {0,0,0,0,0,0,0,0}; } }*/ +void SYS_RESET(){ + + gPC.printf("\n\r Going into system reset\n"); + //DISABLE THE THREADS + EN_PL = 0; + EN_CDMS_HK = 0; + EN_RCV_SC = 0; + + //SWITCH OFF BAE + BAE_SW_EN_DS = 0; + BAE_STATUS = DEVICE_DISABLED; + WRITE_TO_EEPROM(1,DEVICE_DISABLED); + gPC.printf("sw off bae\n"); + + //PAYLOAD IN STANDBY MODE + Base_tm *tm_ptr_standby; + SET_PL_BEE_STANDBY(tm_ptr_standby); + if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) + { + pl_main_flag = pl_main_flag & (~PL_DISABLED); + pl_main_flag |= PL_STANDBY; + PL_STATUS = 0x01; + PL_STATE = 0x01; + } + pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); + + //SWITCH OFF SD CARD + SD_SW_EN_DS = 0; + SD_STATUS = DEVICE_DISABLED; + WRITE_TO_EEPROM(2,DEVICE_DISABLED); + gPC.printf("sw off sd\n"); + + //TURN ON + WRITE_TO_EEPROM(2,DEVICE_POWERED); + WRITE_TO_EEPROM(1,DEVICE_POWERED); + + //UPDATE SYS_RESET TIME + TIME_LATEST_CDMS_EPS_RST_BACKUP = TIME_LATEST_CDMS_EPS_RST; + WRITE_TO_EEPROM(21,(uint32_t)TIME_LATEST_CDMS_EPS_RST_BACKUP); + WRITE_TO_EEPROM(20,TIME_LATEST_CDMS_EPS_RST_BACKUP>>32); + + TIME_LATEST_CDMS_EPS_RST = FCTN_CDMS_RD_RTC(); + //Latest EPS_RST time stored in EEPROM + WRITE_TO_EEPROM(19,(uint32_t)TIME_LATEST_CDMS_EPS_RST); + WRITE_TO_EEPROM(18,TIME_LATEST_CDMS_EPS_RST>>32); + + +} + +void BACK_NORMAL() +{ + //ENABLE THE THREADS + EN_PL = 1; + EN_CDMS_HK = 1; + EN_RCV_SC = 1; + + //SWITCH ON BAE + BAE_SW_EN_DS = 1; + BAE_STATUS = DEVICE_POWERED; + WRITE_TO_EEPROM(1,DEVICE_POWERED); + gPC.printf("sw on bae\n"); + + //SWITCH ON SD CARD + SD_SW_EN_DS = 1; + SD_STATUS = DEVICE_POWERED; + WRITE_TO_EEPROM(2,DEVICE_POWERED); + gPC.printf("sw on sd\n"); + + //UPDATE SYS_RESET TIME + TIME_LATEST_CDMS_EPS_RST = TIME_LATEST_CDMS_EPS_RST_BACKUP ; + //Latest EPS_RST time stored in EEPROM + WRITE_TO_EEPROM(19,(uint32_t)TIME_LATEST_CDMS_EPS_RST); + WRITE_TO_EEPROM(18,TIME_LATEST_CDMS_EPS_RST>>32); + +} + + void FCTN_CDMS_PL_MAIN(void const *args) { if(EN_PL == 0x00) @@ -337,6 +443,7 @@ uint64_t temp_time; temp_time=FCTN_CDMS_RD_RTC(); pl_time = (uint32_t)((temp_time>>7) & 0x000000000FFFFFFF); + gPC.printf("\n\r %u", pl_time); //call test3() here //test3(1); @@ -349,6 +456,7 @@ gPC.printf("\n\rHours :%d",((pl_time & 0x0001F000)>>12)); gPC.printf("\tMin :%d",((pl_time & 0x00000FC0)>>6)); gPC.printf("\t\tSec :%d",(pl_time & 0x0000003F));*/ + pl_next_index = -1; if(pl_time!=0) //RTC read successful { // run the loop until end of schedule is reached or month and day are both zeros or future block is found @@ -371,7 +479,19 @@ { pl_main_flag = pl_main_flag & (~STATE_SCIENCE); pl_main_flag |= STATE_HIBERNATE; - PL_STATE = 0x02; + gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State"); + Base_tm *tm_ptr_hibernate; + SET_PL_BEE_HIBERNATE(tm_ptr_hibernate); + if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) + { + pl_main_flag = pl_main_flag & (~PL_DISABLED); + pl_main_flag |= PL_HIBERNATE; + PL_STATUS = 0x02; + PL_STATE = 0x02; + WRITE_TO_EEPROM(16,(uint32_t)PL_STATE); + } + pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS + PL_MAIN_status = 0; } else { @@ -405,25 +525,21 @@ { pl_main_flag = pl_main_flag & (~STATE_SCIENCE); pl_main_flag |= STATE_OFF; - PL_STATE = 0x00; } if((pl_block[pl_next_index-1] & 0x0000000C)==4) { pl_main_flag = pl_main_flag & (~STATE_SCIENCE); pl_main_flag |= STATE_STANDBY; - PL_STATE = 0x01; } if((pl_block[pl_next_index-1] & 0x0000000C)==8) { pl_main_flag = pl_main_flag & (~STATE_SCIENCE); pl_main_flag |= STATE_HIBERNATE; - PL_STATE = 0x02; } if((pl_block[pl_next_index-1] & 0x0000000C)==12) { - pl_main_flag = pl_main_flag & (~STATE_SCIENCE); - pl_main_flag |= STATE_SCIENCE; - PL_STATE = 0x03; + pl_main_flag = pl_main_flag & (~STATE_SCIENCE); + pl_main_flag |= STATE_SCIENCE; } } else if((pl_block[pl_next_index-1] & UNEXECUTED)==1) @@ -455,14 +571,18 @@ gPC.printf("\n\rPowering OFF PL_BEE"); SET_PL_BEE_OFF; PL_BEE_SW_STATUS = 0x03; - FCTN_CDMS_WR_FLASH(4,DEVICE_DISABLED); - PL_STATUS=0; + WRITE_TO_EEPROM(4,DEVICE_DISABLED); + PL_STATUS = 0; } pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_OFF; PL_STATUS = 0x00; + PL_STATE = 0x00; + WRITE_TO_EEPROM(16,(uint32_t)PL_STATE); pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status - pl_block[pl_next_index-1] |= EXECUTED; + pl_block[pl_next_index-1] |= EXECUTED; + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS PL_MAIN_status = 0; print_processed_block(pl_next_index-1); @@ -477,7 +597,8 @@ gPC.printf("\n\rPowering on PL_BEE"); SET_PL_BEE_ON; PL_BEE_SW_STATUS = 0x01; - FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); + WRITE_TO_EEPROM(4,DEVICE_POWERED); + // PL_STATE = 0x01 //uncomment - Joel after finding out default startup state of PYLD } gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); Base_tm *tm_ptr_standby; @@ -487,6 +608,8 @@ pl_main_flag = pl_main_flag & (~PL_DISABLED); pl_main_flag |= PL_STANDBY; PL_STATUS = 0x01; + PL_STATE = 0x01; + WRITE_TO_EEPROM(16,(uint32_t)PL_STATE); } pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS PL_MAIN_status = 0; @@ -497,146 +620,60 @@ } case STATE_HIBERNATE: { - gPC.printf("\n\rEntered PL_HIBERNATE case"); - if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0) - { - if(PL_BEE_SW_STATUS == 0x03) - { - gPC.printf("Powering on PL_BEE\r\n"); - SET_PL_BEE_ON; - PL_BEE_SW_STATUS = 0x01; - FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); - } - gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State"); - Base_tm *tm_ptr_hibernate; - SET_PL_BEE_HIBERNATE(tm_ptr_hibernate); - if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) - { - pl_main_flag = pl_main_flag & (~PL_DISABLED); - pl_main_flag |= PL_HIBERNATE; - PL_STATUS = 0x02; - } - } - else + gPC.printf("\n\rEntered PL_HIBERNATE case"); + if(PL_BEE_SW_STATUS == 0x03) { - pl_main_flag |= PL_LOW_POWER; - PL_LOW_power = 1; - if(PL_BEE_SW_STATUS == 0x03) - { - gPC.printf("\n\rPowering on PL_BEE"); - SET_PL_BEE_ON; - PL_BEE_SW_STATUS = 1; - FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); - } - gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); - Base_tm *tm_ptr_standby; - SET_PL_BEE_STANDBY(tm_ptr_standby); - if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) - { - pl_main_flag = pl_main_flag & (~PL_DISABLED); - pl_main_flag |= PL_STANDBY; - PL_STATUS = 0x01; - } - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS - PL_MAIN_status = 0; - print_processed_block(pl_next_index-1); - print_exit(temp); - return; - //////DELETE THE TM AND TC LATER - } + gPC.printf("Powering on PL_BEE\r\n"); + SET_PL_BEE_ON; + PL_BEE_SW_STATUS = 0x01; + WRITE_TO_EEPROM(4,DEVICE_POWERED); + // PL_STATE = 0x01 //uncomment - Joel after finding out default startup state of PYLD + } + gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State"); + Base_tm *tm_ptr_hibernate; + SET_PL_BEE_HIBERNATE(tm_ptr_hibernate); + if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) + { + pl_main_flag = pl_main_flag & (~PL_DISABLED); + pl_main_flag |= PL_HIBERNATE; + PL_STATUS = 0x02; + PL_STATE = 0x02; + WRITE_TO_EEPROM(16,(uint32_t)PL_STATE); + } pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS PL_MAIN_status = 0; print_processed_block(pl_next_index-1); print_exit(temp); return; - //////DELETE THE TM LATER } case STATE_SCIENCE: { gPC.printf("\n\rEntered PL_SCIENCE case"); - if(POWER_LEVEL==3 || POWER_LEVEL==0) //POWER_LEVEL = 0 = NA + if(PL_BEE_SW_STATUS == 0x03) { - gPC.printf("\n\rPOWER_LEVEL = 3 or NA"); - if(PL_BEE_SW_STATUS == 0x03) - { - gPC.printf("\n\rPowering on PL_BEE"); - SET_PL_BEE_ON; - PL_BEE_SW_STATUS = 1; - FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); - } - gPC.printf("\n\rCommanding PL_BEE to go to Science State"); - Base_tm *tm_ptr_science; - SET_PL_BEE_SCIENCE(tm_ptr_science); - if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) - { - pl_main_flag = pl_main_flag & (~PL_DISABLED); - pl_main_flag |= PL_SCIENCE; - PL_STATUS = 0x03; - } - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS - PL_MAIN_status = 0; - print_processed_block(pl_next_index-1); - print_exit(temp); - return; + gPC.printf("\n\rPowering on PL_BEE"); + SET_PL_BEE_ON; + PL_BEE_SW_STATUS = 1; + //FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); + WRITE_TO_EEPROM(4,DEVICE_POWERED); + // PL_STATE = 0x01 //uncomment - Joel after finding out default startup state of PYLD } - else - { - gPC.printf("\n\rPower level = 2,3 or NA"); - pl_main_flag |= PL_LOW_POWER; - PL_LOW_power = 1; - if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0) - { - if(PL_BEE_SW_STATUS == 0x03) - { - gPC.printf("\n\rPowering on PL_BEE"); - SET_PL_BEE_ON; - PL_BEE_SW_STATUS = 1; - FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); - } - gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State"); - Base_tm *tm_ptr_hibernate; - SET_PL_BEE_HIBERNATE(tm_ptr_hibernate); - if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) - { - pl_main_flag = pl_main_flag & (~PL_DISABLED); - pl_main_flag |= PL_HIBERNATE; - PL_STATUS = 0x02; - } - } - else - { - pl_main_flag |= PL_LOW_POWER; - PL_LOW_power = 1; - if(PL_BEE_SW_STATUS == 0x03) - { - gPC.printf("\n\rPowering on PL_BEE"); - SET_PL_BEE_ON; - PL_BEE_SW_STATUS = 1; - FCTN_CDMS_WR_FLASH(4,DEVICE_POWERED); - } - gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); - Base_tm *tm_ptr_standby; - SET_PL_BEE_STANDBY(tm_ptr_standby); - if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) - { - pl_main_flag = pl_main_flag & (~PL_DISABLED); - pl_main_flag |= PL_STANDBY; - PL_STATUS = 0x01; - } - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS - PL_MAIN_status = 0; - print_processed_block(pl_next_index-1); - print_exit(temp); - return; - //////DELETE THE TM AND TC LATER - } - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS - PL_MAIN_status = 0; - print_processed_block(pl_next_index-1); - print_exit(temp); - return; - //////DELETE THE TM LATER + gPC.printf("\n\rCommanding PL_BEE to go to Science State"); + Base_tm *tm_ptr_science; + SET_PL_BEE_SCIENCE(tm_ptr_science); + if((pl_main_flag & PL_DISABLED)==PL_SUCCESS_I2C) + { + pl_main_flag = pl_main_flag & (~PL_DISABLED); + pl_main_flag |= PL_SCIENCE; + PL_STATUS = 0x03; + PL_STATE = 0x03; + WRITE_TO_EEPROM(16,(uint32_t)PL_STATE); } + pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS + PL_MAIN_status = 0; + print_processed_block(pl_next_index-1); + print_exit(temp); + return; } default: { @@ -646,6 +683,8 @@ PL_STATUS = 0x06; pl_block[pl_next_index-1] &= (~UNEXECUTED); //changing exec_status pl_block[pl_next_index-1] |= EXECUTED; + if(pl_next_index >=2) + UPDATE_PMS_ENTRY((pl_next_index-2), pl_block[pl_next_index-2]); //1to2 , updating the previous status to EEPROM pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing PL_MAIN_STATUS PL_MAIN_status = 0; print_processed_block(pl_next_index-1); @@ -653,5 +692,35 @@ return; } } - } + } + RESET_WATCHDOG(); + //CHECK FOR SYS POWER RESET + sys_pwr_rst.input(); + int sys_val = sys_pwr_rst.read(); + gPC.printf("\rsys_reset_val = %d\n",sys_val); + if(sys_val == 1) + { + //ACKNOWLEDGE SYS RST + sys_pwr_rst.output(); + sys_pwr_rst = 0; + gPC.printf("\rsys_reset_val = %d\n",sys_pwr_rst.read()); + + SYS_RESET(); + while(1){ + wait_ms(10000); + //RESET_WATCHDOG(); //uncomment in the FM SBC with watchdog enabled + uint64_t cur_rtc = FCTN_CDMS_RD_RTC(); + uint32_t T_check1 = ((((cur_rtc - TIME_LATEST_CDMS_EPS_RST) >> 7)& 0x00000FC0)>>6); + //gPC.printf("\r%d\n",T_check1 ); + //gPC.printf("\r%d\n",TIME_LATEST_CDMS_EPS_RST); + //gPC.printf("\r%d\n",cur_rtc); + if(T_check1 >= 5*T_OFF_RST) + { + break; + } + } + BACK_NORMAL(); + } + gPC.printf("\rTIME_LATEST_CDMS_EPS_RST = %d\n",TIME_LATEST_CDMS_EPS_RST); + } \ No newline at end of file