Latest FM Code with EEPROM
Dependencies: FreescaleIAP SimpleDMA eeprom mbed-rtos mbed
Fork of CDMS_QM_03MAR2017_Flash_with_obsrs by
Diff: CDMS_PL.h
- Revision:
- 356:4484bf39526f
- Parent:
- 342:77b0d59897f7
diff -r a5e72222ff26 -r 4484bf39526f CDMS_PL.h --- a/CDMS_PL.h Tue Mar 28 08:50:07 2017 +0000 +++ b/CDMS_PL.h Sat Feb 24 10:28:56 2018 +0000 @@ -1,5 +1,5 @@ int pl_next_index=-1; -uint8_t pl_main_flag=0; +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}; @@ -139,6 +139,9 @@ pl_tc_science->TC_string[9] = (uint8_t)(crc16 & 0xFF00)>>8;\ pl_tc_science->TC_string[10] = (uint8_t)(crc16 & 0x00FF);\ tm_ptr_science = FCTN_CDMS_RLY_TMTC(pl_tc_science);\ + if(EN_PL == 0)\ + VERIFY_TM_NON_PMS(tm_ptr_science);\ + else\ VERIFY_TM(tm_ptr_science);\ delete pl_tc_science;\ Base_tm *temp;\ @@ -172,9 +175,9 @@ //gPC.printf("\n\rAt exit"); char state[][17] = {"STATE_OFF","STATE_STANDBY","STATE_HIBERNATE","STATE_SCIENCE"}; char status[][17] = {"PL_OFF","PL_STANDBY","PL_HIBERNATE","PL_SCIENCE","PL_SUCCESS_I2C","PL_ERR_I2C","PL_INVALID_STATE","PL_DISABLED"}; - //gPC.printf("\n\rPL_state:%s -> %s",state[(uint8_t)temp[0]],state[(uint8_t)temp2[0]]); - //gPC.printf("\n\rPL_status:%s -> %s",status[(uint8_t)temp[1]],status[(uint8_t)temp2[1]]); - //gPC.printf("\n\rPL_PREV_state:%s -> %s",state[(uint8_t)temp[2]],state[(uint8_t)temp2[2]]); + gPC.printf("\n\rPL_state:%s -> %s",state[(uint8_t)temp[0]],state[(uint8_t)temp2[0]]); + gPC.printf("\n\rPL_status:%s -> %s",status[(uint8_t)temp[1]],status[(uint8_t)temp2[1]]); + gPC.printf("\n\rPL_PREV_state:%s -> %s",state[(uint8_t)temp[2]],state[(uint8_t)temp2[2]]); } void VERIFY_TM(Base_tm *tm_ptr) { @@ -269,6 +272,62 @@ } } } +void VERIFY_TM_NON_PMS(Base_tm *tm_ptr) +{ + uint8_t temp = tm_ptr->TM_string[2]; //Obatining ACK_CODE + if(GETshort_or_long_tm(tm_ptr)==1) //short TM + { + gPC.printf("\n\rSHORT TM received non PMS"); + uint16_t crc16 = crc16_gen(tm_ptr->TM_string, 11); + if(tm_ptr->TM_string[12]==((uint8_t)(crc16 & 0x00FF)) && tm_ptr->TM_string[11]==((uint8_t)((crc16 & 0xFF00)>>8))) + { + if(temp==0xA0 || temp==0xC0) + { + gPC.printf("\n\rACK_CODE Success"); + if(temp==0xA0) + gPC.printf("\n\rACK_CODE = 0x%02X",temp); + else + gPC.printf("\n\rACK_CODE = 0x%02X",temp); + } + else + { + gPC.printf("\n\rACK_CODE failure (0x%02X)",temp); + PL_RCV_SC_STATUS = 2; + } + } + else + { + gPC.printf("\n\rShort_TM CRC failed"); + PL_RCV_SC_STATUS = 3; + } + } + else if(GETshort_or_long_tm(tm_ptr)==0) //LONG TM + { + gPC.printf("\n\rLONG TM received"); + uint16_t crc16 = crc16_gen(tm_ptr->TM_string,132); + if(tm_ptr->TM_string[133]==((uint8_t)(crc16 & 0x00FF)) && tm_ptr->TM_string[132]==((uint8_t)((crc16 & 0xFF00)>>8))) + { + if(temp==0xA0 || temp==0xC0) + { + gPC.printf("\n\rACK_CODE Success"); + if(temp==0xA0) + gPC.printf("\n\rACK_CODE = 0x%02X",temp); + else + gPC.printf("\n\rACK_CODE = 0x%02X",temp); + } + else + { + gPC.printf("\n\rACK_CODE failure (0x%02X)",temp); + PL_RCV_SC_STATUS = 2; + } + } + else + { + gPC.printf("\n\rLong_TM CRC failed"); + PL_RCV_SC_STATUS = 3; + } + } +} void test1(uint8_t t) { //Output should be PL_STATUS = PL_DISABLED @@ -318,16 +377,20 @@ temp[2] = (PL_PREV_STATE & STATE_SCIENCE)>>2; //test2(1); - if(PL_STATUS==2 || PL_STATUS==3) + if(PL_BEE_SW_STATUS==2 || PL_BEE_SW_STATUS==3) { gPC.printf("\n\rDevice Disabled or OC Fault"); - pl_main_flag = pl_main_flag & (~PL_DISABLED); - pl_main_flag |= PL_DISABLED; //setting PL_STATUS as PL_DISABLED - PL_STATUS = 0x07; - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing pl_main status - PL_MAIN_status = 0; - print_exit(temp); - return; + if(PL_STATUS != 0x00) + { + pl_main_flag = pl_main_flag & (~PL_DISABLED); + pl_main_flag |= PL_DISABLED; //setting PL_STATUS as PL_DISABLED + PL_STATUS = 0x07; + pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing pl_main status + PL_MAIN_status = 0; + print_exit(temp); + return; + } + gPC.printf("\n\r PL IN OFF BY PMS - continuing..."); } PL_PREV_STATE = (pl_main_flag & STATE_SCIENCE); //saving current pl_state uint64_t temp_time; @@ -358,6 +421,8 @@ break; } } + if(((pl_block[pl_next_index+1] & 0x3FE00000) >> 21)!=0) + {pl_next_index += 1;} } if((pl_next_index==-1) || pl_time==0) //RTC read failed or Future block not found { @@ -385,67 +450,71 @@ } //Processing the PL schedule - if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)||((pl_block[pl_next_index-1] & UNEXECUTED)==2)) - { - if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)) - gPC.printf("\n\rElapsed blocked not executed"); - else - gPC.printf("\n\rElapsed block marked for retry"); + if(pl_next_index != -1 && pl_next_index != 0) + { + if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)||((pl_block[pl_next_index-1] & UNEXECUTED)==2)) + { + if(((pl_block[pl_next_index-1] & UNEXECUTED)==3)) + gPC.printf("\n\rElapsed blocked not executed"); + else + gPC.printf("\n\rElapsed block marked for retry"); - gPC.printf("\n\r Retrieving pl_state from schedule"); - if((pl_block[pl_next_index-1] & 0x0000000C)==0) - { - 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) - { + gPC.printf("\n\r Retrieving pl_state from schedule"); + if((pl_block[pl_next_index-1] & 0x0000000C)==0) + { + 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; + } } - } - else if((pl_block[pl_next_index-1] & UNEXECUTED)==1) - { - gPC.printf("\n\rElapsed block is executed"); - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing pl_main status - PL_MAIN_status = 0; - print_exit(temp); - return; - } - else if((pl_block[pl_next_index-1] & UNEXECUTED)==0) - { - //gPC.printf("\n\rEmpty Schedule Block"); - pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing pl_main status - PL_MAIN_status = 0; - print_exit(temp); - return; - } + else if((pl_block[pl_next_index-1] & UNEXECUTED)==1) + { + gPC.printf("\n\rElapsed block is executed"); + pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing pl_main status + PL_MAIN_status = 0; + print_exit(temp); + return; + } + else if((pl_block[pl_next_index-1] & UNEXECUTED)==0) + { + gPC.printf("\n\rEmpty Schedule Block"); + pl_main_flag = pl_main_flag & (~PL_MAIN_STATUS); //Clearing pl_main status + PL_MAIN_status = 0; + print_exit(temp); + return; + } switch(pl_main_flag & STATE_SCIENCE) //Checking PL_STATE { case STATE_OFF: { gPC.printf("\n\rEntered PL_OFF case"); - if(PL_STATUS!=0) + if(PL_BEE_SW_STATUS != 0x03) { gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); Base_tm *tm_ptr_standby; SET_PL_BEE_STANDBY(tm_ptr_standby); //No ack needed now gPC.printf("\n\rPowering OFF PL_BEE"); SET_PL_BEE_OFF; + PL_BEE_SW_STATUS = 0x03; + WRITE_TO_EEPROM(4,DEVICE_DISABLED); PL_STATUS=0; } pl_main_flag = pl_main_flag & (~PL_DISABLED); @@ -462,11 +531,12 @@ case STATE_STANDBY: { gPC.printf("\n\rEntered PL_STANDBY case"); - if(PL_STATUS==0) + if(PL_BEE_SW_STATUS == 0x03) { gPC.printf("\n\rPowering on PL_BEE"); SET_PL_BEE_ON; - PL_STATUS=1; + PL_BEE_SW_STATUS = 0x01; + WRITE_TO_EEPROM(4,DEVICE_POWERED); } gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); Base_tm *tm_ptr_standby; @@ -489,11 +559,12 @@ gPC.printf("\n\rEntered PL_HIBERNATE case"); if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0) { - if(PL_STATUS==0) + if(PL_BEE_SW_STATUS == 0x03) { gPC.printf("Powering on PL_BEE\r\n"); SET_PL_BEE_ON; - PL_STATUS=1; + PL_BEE_SW_STATUS = 0x01; + WRITE_TO_EEPROM(4,DEVICE_POWERED); } gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State"); Base_tm *tm_ptr_hibernate; @@ -509,11 +580,12 @@ { pl_main_flag |= PL_LOW_POWER; PL_LOW_power = 1; - if(PL_STATUS==0) + if(PL_BEE_SW_STATUS == 0x03) { gPC.printf("\n\rPowering on PL_BEE"); SET_PL_BEE_ON; - PL_STATUS=1; + PL_BEE_SW_STATUS = 1; + WRITE_TO_EEPROM(4,DEVICE_POWERED); } gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); Base_tm *tm_ptr_standby; @@ -544,11 +616,12 @@ if(POWER_LEVEL==3 || POWER_LEVEL==0) //POWER_LEVEL = 0 = NA { gPC.printf("\n\rPOWER_LEVEL = 3 or NA"); - if(PL_STATUS==0) + if(PL_BEE_SW_STATUS == 0x03) { gPC.printf("\n\rPowering on PL_BEE"); SET_PL_BEE_ON; - PL_STATUS=1; + PL_BEE_SW_STATUS = 1; + WRITE_TO_EEPROM(4,DEVICE_POWERED); } gPC.printf("\n\rCommanding PL_BEE to go to Science State"); Base_tm *tm_ptr_science; @@ -572,11 +645,12 @@ PL_LOW_power = 1; if(POWER_LEVEL==2 || POWER_LEVEL==3 || POWER_LEVEL==0) { - if(PL_STATUS==0) + if(PL_BEE_SW_STATUS == 0x03) { gPC.printf("\n\rPowering on PL_BEE"); SET_PL_BEE_ON; - PL_STATUS=1; + PL_BEE_SW_STATUS = 1; + WRITE_TO_EEPROM(4,DEVICE_POWERED); } gPC.printf("\n\rCommanding PL_BEE to go to Hibernate State"); Base_tm *tm_ptr_hibernate; @@ -592,11 +666,12 @@ { pl_main_flag |= PL_LOW_POWER; PL_LOW_power = 1; - if(PL_STATUS==0) + if(PL_BEE_SW_STATUS == 0x03) { gPC.printf("\n\rPowering on PL_BEE"); SET_PL_BEE_ON; - PL_STATUS=1; + PL_BEE_SW_STATUS = 1; + WRITE_TO_EEPROM(4,DEVICE_POWERED); } gPC.printf("\n\rCommanding PL_BEE to go to Standby State"); Base_tm *tm_ptr_standby; @@ -636,5 +711,6 @@ print_exit(temp); return; } + } } } \ No newline at end of file