Latest FM Code with EEPROM

Dependencies:   FreescaleIAP SimpleDMA eeprom mbed-rtos mbed

Fork of CDMS_QM_03MAR2017_Flash_with_obsrs by Team Fox

Revision:
356:4484bf39526f
Parent:
355:a5e72222ff26
--- a/CDMS_HK.h	Tue Mar 28 08:50:07 2017 +0000
+++ b/CDMS_HK.h	Sat Feb 24 10:28:56 2018 +0000
@@ -10,6 +10,8 @@
 void FUNC_CDMS_GPIO_STATUS();
 void minMaxHkData();
 void COLLECT_CDMS_RAM();
+void IS_BAE_IN_DISTRESS();
+uint8_t SAVE_BAE(uint8_t);
 
 extern uint8_t beacon_array[134];
 //extern RSSI_MAX;
@@ -48,7 +50,6 @@
 void FCTN_CDMS_HK_MAIN(void const *args)
 {
     uint8_t sd_stat = 0;
-    uint8_t hk_count=0;
     while(1) {
         gPC.printf("waiting for HK sig\n\r");
         gHK_THREAD->signal_wait(HK_SIGNAL);
@@ -71,11 +72,15 @@
           
         //gPC.printf("\n\r%d\n",CDMS_WR_SD_FAULT_COUNTER);
         if(EN_CDMS_HK == 0x00)
+        {
+            gMutex.unlock();  //unlocked mutex
             continue;
+        }
         CDMS_HK_MAIN_STATUS = 0x01;
         CDMS_HK_MAIN_COUNTER++;
+        CDMS_I2C_ERR_BAE_CURRENT = CDMS_I2C_ERR_BAE_COUNTER;
+        
 
-       
         FCTN_CDMS_HK();         //collects temperatures
        
         if(!COM_RSSI_SET)
@@ -109,9 +114,9 @@
             CDMS_HEALTH_DATA[86+i] = CDMS_quant[i];
 
         // Here: Have to FIT flash data.
-        CDMS_HEALTH_DATA[106] = (EPS_V_A_EN_STATUS<<7) | ((BAE_STATUS<<5)&0x60) | ((SD_STATUS<<3)&0x18) | ((PL_STATUS<<1)&0x06) | (PL_EPS_LATCH_SW_EN & 0x01);
-     //  CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((CDMS_RTC_DISABLE<<5)&0x20);
-         CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((EN_RTC<<5)&0x20); // changed by samp
+        CDMS_HEALTH_DATA[106] = (EPS_V_A_EN_STATUS<<7) | ((BAE_STATUS<<5)&0x60) | ((SD_STATUS<<3)&0x18) | ((PL_BEE_SW_STATUS<<1)&0x06) | (PL_EPS_LATCH_SW_EN & 0x01);
+       CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((CDMS_RTC_DISABLE<<5)&0x20);
+     //    CDMS_HEALTH_DATA[107] = (RTC_INIT_STATUS<<6) | ((EN_RTC<<5)&0x20); // changed by samp
          gPC.printf("\n\r 0x%08X",EN_RTC);
         CDMS_HEALTH_DATA[108] = CDMS_RESET_COUNTER >>8;
         CDMS_HEALTH_DATA[109] = CDMS_RESET_COUNTER;
@@ -185,25 +190,27 @@
 
         /*---------------------------------- BAE HK --------------------------------------------*/
         
-    //    gPC.printf("endHK_SD2");
+        //gPC.printf("\n\rDO IT NOW\r");
         BAE_HK_I2C = FCTN_I2C_READ(BAE_HK,134);
         //  gPC.printf("\nEntering BAE HK\t");
         if(BAE_HK_I2C == 0) {
-     //  gPC.printf("BAE_HK_");
+        gPC.printf("BAE_HK_");
             crc = crc16_gen((unsigned char *)BAE_HK,132);
             if(crc == ((uint16_t)BAE_HK[132] << 8) | (uint16_t)BAE_HK[133]) {
                 gPC.printf("BAE HK data recieved through I2C\t");
                 TIME_LATEST_I2C_BAE = FCTN_CDMS_RD_RTC() >> 7;
-                /*for(int i = 0; i<15; i++)
-                    gPC.printf("\r 0x%02X\n",BAE_HK[i]);*/
-                for(int i = 0; i<4; i++)
-                    BAE_HK[i] = time >> (3-i)*8;
+//                for(int i = 0; i<15; i++)                        //Changed to test - J
+//                    gPC.printf("%d\t",BAE_HK[i]);
+//                for(int i = 0; i<4; i++)
+//                    BAE_HK[i] = time >> (3-i)*8;
+                for(int i = 128; i<132; i++)
+                    BAE_HK[i] = time >> (131-i)*8;
                 BAE_HK_FRAME[0] = 0x28;
                 BAE_HK_FRAME[1] = (FSC_CURRENT[5]+1) >> 16;
                 BAE_HK_FRAME[2] = (FSC_CURRENT[5]+1) >> 8;
                 BAE_HK_FRAME[3] = FSC_CURRENT[5]+1;
                 for(int i = 0; i<128; i++)                       /*Adding actual CDMS Health data to TM frame*/
-                    BAE_HK_FRAME[4+i] = BAE_HK[i];
+                    BAE_HK_FRAME[4+i] = BAE_HK[4+i];
                 crc = crc16_gen(BAE_HK_FRAME,132);               /*Adding CRC to TM frame*/
                 BAE_HK_FRAME[132] = crc >> 8;
                 BAE_HK_FRAME[133] = crc;
@@ -285,6 +292,9 @@
         } else
             gPC.printf("long Bcn not sent\r\n");
         //gPC.printf("\rCompleted Beacon\n");
+        if (GIVE_UP_ON_BAE == 0)
+        IS_BAE_IN_DISTRESS();
+            
         gPC.printf("\rreleasing mutex for HK_MAIN \n\r");
       SCI_LED1 =0;
        gMutex.unlock();
@@ -333,6 +343,7 @@
 
         min_max_data.CDMS_temp_min = saveMin(min_max_data.CDMS_temp_min,quant_data.CDMS_temp_quant);
         min_max_data.CDMS_temp_max = saveMax(min_max_data.CDMS_temp_max,quant_data.CDMS_temp_quant);
+        GPIO_FAULTS = 0;
     }
     firstCount=false;
 }
@@ -446,6 +457,10 @@
     GPIO_STATUS=(COM_TX_CNTRL)?(GPIO_STATUS)|((uint16_t)(0x1<<1)):(GPIO_STATUS)&(~((uint16_t)(0x1<<1)));
     //  gPC.printf("%04x\n",GPIO_STATUS);
     gPC.printf("\n\rBAE_OC STATE = %04x",GPIO_STATUS);
+    if (((GPIO_STATUS) | (GPIO_FAULTS)) != 0xFFFF)
+    {
+        GPIO_FAULTS = (GPIO_FAULTS | (~(GPIO_STATUS)));
+    }
 }
 
 void VERIFY_COMRX()
@@ -507,13 +522,13 @@
             SD_FAULTCOUNT++;
             SD_STATUS = (SD_FAULTCOUNT == 3) ? DEVICE_DISABLED :DEVICE_OC_FAULT;
             if(SD_FAULTCOUNT == 3) {
-                FCTN_CDMS_WR_FLASH(2,DEVICE_DISABLED);
+                WRITE_TO_EEPROM(2,DEVICE_DISABLED);
                 gPC.printf("Declaring SD card permanantly Disabled");
             }
         } else {
             SD_STATUS = DEVICE_POWERED;
             if(SD_STATUS != DEVICE_POWERED)
-                FCTN_CDMS_WR_FLASH(2,DEVICE_POWERED);
+                WRITE_TO_EEPROM(2,DEVICE_POWERED);
             SD_FAULTCOUNT = 0;
         }
     }
@@ -534,13 +549,13 @@
             BAE_FAULTCOUNT++;
             BAE_STATUS = (BAE_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
             if(BAE_FAULTCOUNT == 3) {
-                FCTN_CDMS_WR_FLASH(1,DEVICE_DISABLED);
+                WRITE_TO_EEPROM(1,DEVICE_DISABLED);
                 gPC.printf("Declaring BAE permanantly Disabled");
             }
         } else {
             BAE_STATUS = DEVICE_POWERED;
             if(SD_STATUS != DEVICE_POWERED);
-            FCTN_CDMS_WR_FLASH(1,DEVICE_POWERED);
+            WRITE_TO_EEPROM(1,DEVICE_POWERED);
             BAE_FAULTCOUNT = 0;
         }
     }
@@ -548,8 +563,8 @@
 
 void HANDLE_HW_FAULT_PL()
 {
-    if(PL_STATUS != DEVICE_DISABLED) {
-        if(PL_STATUS == DEVICE_OC_FAULT) {
+    if(PL_BEE_SW_STATUS != DEVICE_DISABLED) {
+        if(PL_BEE_SW_STATUS == DEVICE_OC_FAULT) {
             gPC.printf("Switching on PL_BEE");
             PYLD_DFF_CLK = 0;
             PYLD_DFF = 1;           // Switching ON PL
@@ -569,25 +584,15 @@
             PYLD_DFF_CLK = 0;
             wait_us(1);
             PL_FAULTCOUNT++;
-            PL_STATUS = (PL_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
+            PL_BEE_SW_STATUS = (PL_FAULTCOUNT == 3)?DEVICE_DISABLED:DEVICE_OC_FAULT;
             if(PL_FAULTCOUNT == 3) {
-               FCTN_CDMS_WR_FLASH(3,DEVICE_DISABLED);
+               WRITE_TO_EEPROM(4,DEVICE_DISABLED);
                 gPC.printf("Declaring PL_BEE permanantly Disabled");
             }
         } else {
-            if(PL_STATUS == DEVICE_OC_FAULT) {
-                gPC.printf("Switching off PL_BEE");
-                PYLD_DFF_CLK = 0;
-                PYLD_DFF = 0;             //Switching OFF PL
-                wait_us(1);
-                PYLD_DFF_CLK = 1;
-                wait_us(1);
-                PYLD_DFF_CLK = 0;
-                wait_us(1);
-            }
-            PL_STATUS = DEVICE_ENABLED;
-            if(PL_STATUS != DEVICE_ENABLED)
-                FCTN_CDMS_WR_FLASH(3,DEVICE_ENABLED);
+            PL_BEE_SW_STATUS = DEVICE_POWERED;
+            if(SD_STATUS != DEVICE_POWERED)
+            WRITE_TO_EEPROM(4,DEVICE_POWERED);
             PL_FAULTCOUNT = 0;
         }
     }
@@ -662,4 +667,38 @@
         CDMS_RAM[79+i] = FSC_OLD[5] >> (3-i)*8;
     CDMS_RAM[83] = 0x00;
     gPC.printf("\n\r%u %u %u %u %u",FSC_CURRENT[1],FSC_CURRENT[2],FSC_CURRENT[3],FSC_CURRENT[4],FSC_CURRENT[5]);
+}
+
+void IS_BAE_IN_DISTRESS()
+{
+    if((BAE_STATUS == 1)&&(CDMS_I2C_ERR_BAE_COUNTER == (CDMS_I2C_ERR_BAE_CURRENT + 2)))
+        {
+            if (CDMS_HK_MAIN_COUNTER == (CDMS_I2C_ERR_HK_LATEST + 1))
+            {
+                CDMS_I2C_ERR_HK_LATEST = CDMS_HK_MAIN_COUNTER;
+                KILL_BAE_COUNTER++;
+            }
+            else
+            {
+                CDMS_I2C_ERR_HK_LATEST = CDMS_HK_MAIN_COUNTER;
+                KILL_BAE_COUNTER = 1;
+            } 
+            if (KILL_BAE_COUNTER >= 3)
+            {
+                GIVE_UP_ON_BAE = SAVE_BAE(KILL_BAE_COUNTER);
+            }
+        }
+}
+
+uint8_t SAVE_BAE(uint8_t counter)
+{
+    BAE_SW_EN_DS = 0;
+    wait(5);
+    BAE_SW_EN_DS = 1;
+    
+    BAE_STATUS = DEVICE_POWERED;
+    WRITE_TO_EEPROM(1,DEVICE_POWERED);
+    if (counter == 6)
+    return 1;
+    return 0;
 }
\ No newline at end of file