Index: firmware/App/Monitors/Level.c =================================================================== diff -u -rb71609e1bb160ab92c2e56b22d5acd1287a8b89b -r89c8709e3b27648926fbb20f25c9a67cbeb99adc --- firmware/App/Monitors/Level.c (.../Level.c) (revision b71609e1bb160ab92c2e56b22d5acd1287a8b89b) +++ firmware/App/Monitors/Level.c (.../Level.c) (revision 89c8709e3b27648926fbb20f25c9a67cbeb99adc) @@ -1,20 +1,21 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Level.c * -* @author (last) Vinayakam Mani -* @date (last) 11-Oct-2024 +* @author (last) Varshini Nagabooshanam +* @date (last) 26-Jan-2026 * * @author (original) Vinayakam Mani -* @date (original) 11-Oct-2024 +* @date (original) 14-Oct-2024 * ***************************************************************************/ + #include "FpgaDD.h" #include "Level.h" #include "MessageSupport.h" @@ -28,12 +29,16 @@ */ // ********** private definitions ********** -#define FPGA_LEVEL_LOW 5 ///< Floater low level status -#define FPGA_LEVEL_MEDIUM 4 ///< Floater medium level status -#define FPGA_LEVEL_HIGH 6 ///< Floater high level status +#define FPGA_B1_HW_LEVEL_LOW 5 ///< Floater low level status for Beta 1.0 +#define FPGA_B1_HW_LEVEL_MEDIUM 4 ///< Floater medium level status for Beta 1.0 +#define FPGA_B1_HW_LEVEL_HIGH 6 ///< Floater high level status for Beta 1.0 +#define FPGA_LEVEL_EMPTY 3 ///< Floater empty level status +#define FPGA_LEVEL_LOW 2 ///< Floater low level status +#define FPGA_LEVEL_MEDIUM 0 ///< Floater medium level status +#define FPGA_LEVEL_HIGH 4 ///< Floater high level status #define LEVEL_COUNT_LOW 0xFFFF ///< Level sensor count when fluid level is low or non submerged #define LEVEL_COUNT_HIGH_START 0x0000 ///< Start range of level sensor count when fluid level is high or submerged -#define LEVEL_COUNT_HIGH_END 0x2FFF ///< End range of level sensor count when fluid level is high or submerged +#define LEVEL_COUNT_HIGH_END 0x1FFF ///< End range of level sensor count when fluid level is high or submerged #define LOW_LEVEL_COUNT_TOLERANCE ( ( LEVEL_COUNT_LOW / 100 ) * 1 ) ///< Level sensor count 1% tolerance for low level #define HIGH_LEVEL_COUNT_TOLERANCE ( ( LEVEL_COUNT_HIGH / 100 ) * 1 ) ///< Level sensor count 1% tolerance for high level #define LEVEL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the level data is published on the CAN bus. @@ -125,6 +130,10 @@ currentLevelStatus = ( processLevelCount( getFPGAD63LevelSensor() ) == 0 ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); break; + case D98_LEVL: + currentLevelStatus = ( processLevelCount( getFPGAD98LevelSensor() ) == 0 ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); + break; + case D46_LEVL: currentLevelStatus = ( processLevelCount( getFPGAD46LevelSensor() ) == 0 ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); break; @@ -161,6 +170,10 @@ SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D63_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); break; + case D98_LEVL: + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D98_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); + break; + case D46_LEVL: SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D46_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); break; @@ -244,6 +257,7 @@ /*********************************************************************//** * @brief * The getFloaterLevelstatus function gets the floater level reported by FPGA + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. * @details \b Inputs: FPGA level sensor data * @details \b Outputs: level * @return level status @@ -255,58 +269,151 @@ if ( D6_LEVL == levelId ) { - levelStatus = getFPGAD6LevelStatus(); - - if ( FPGA_LEVEL_LOW == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_LOW ; - } - else if ( FPGA_LEVEL_MEDIUM == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_MEDIUM ; - } - else if ( FPGA_LEVEL_HIGH == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_HIGH ; - } - else - { - // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL ; - } + levelStatus = getFPGAD6LevelStatus(); + if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) != TRUE ) + { + // Beta 1.9 behavior + if ( FPGA_LEVEL_EMPTY == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_EMPTY; + } + else if ( FPGA_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } + else + { + // Beta 1.0 behavior + if ( FPGA_B1_HW_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_B1_HW_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_B1_HW_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } } + else if ( P25_LEVL == levelId ) { - levelStatus = getFPGAP25FloaterState(); + levelStatus = getFPGAP25FloaterState(); - if ( FPGA_LEVEL_LOW == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_LOW ; - } - else if ( FPGA_LEVEL_MEDIUM == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_MEDIUM ; - } - else if ( FPGA_LEVEL_HIGH == levelStatus ) - { - currentLevelStatus = LEVEL_STATE_HIGH ; - } - else - { - // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL ; - } + if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_1_0_HW ) != TRUE ) + { + // Beta 1.9 behavior + if ( FPGA_LEVEL_EMPTY == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_EMPTY; + } + else if ( FPGA_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } + else + { + // Beta 1.0 behavior + if ( FPGA_B1_HW_LEVEL_LOW == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_LOW; + } + else if ( FPGA_B1_HW_LEVEL_MEDIUM == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_MEDIUM; + } + else if ( FPGA_B1_HW_LEVEL_HIGH == levelStatus ) + { + currentLevelStatus = LEVEL_STATE_HIGH; + } + else + { + // TODO - Handle invalid level alarm + currentLevelStatus = LEVEL_STATE_ILLEGAL; + } + } } + else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DD_INVALID_LEVEL_ID, (U32)levelId ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DD_INVALID_LEVEL_ID, (U32)levelId ); } return currentLevelStatus; } /*********************************************************************//** * @brief + * The getBicarbChamberLevelStatus function returns the status of Bicarb chamber + * F level from the upper level and lower level sensors. + * @details \b Inputs: FPGA level sensor data + * @details \b Outputs: level + * @return level status + *************************************************************************/ +LEVEL_STATE_T getBicarbChamberLevelStatus( void ) +{ + LEVEL_STATE_T status = LEVEL_STATE_ILLEGAL; + LEVEL_STATE_T upperlevel = getLevelStatus( D63_LEVL ); + LEVEL_STATE_T lowerlevel = getLevelStatus( D98_LEVL ); + + if ( ( lowerlevel == LEVEL_STATE_LOW ) && ( upperlevel == LEVEL_STATE_LOW ) ) + { + status = LEVEL_STATE_LOW; + } + else if ( ( lowerlevel == LEVEL_STATE_HIGH ) && ( upperlevel == LEVEL_STATE_LOW ) ) + { + status = LEVEL_STATE_MEDIUM; + } + else if ( ( lowerlevel == LEVEL_STATE_HIGH ) && ( upperlevel == LEVEL_STATE_HIGH ) ) + { + status = LEVEL_STATE_HIGH; + } + else + { + // upperlevel == TRUE while lowerlevel == FALSE - illegal + status = LEVEL_STATE_ILLEGAL; + } + return status; +} + +/*********************************************************************//** + * @brief * The publishLevelsData function broadcasts the level data at the * publication interval. * @details \b Inputs: levelsDataPublicationCounter @@ -321,9 +428,11 @@ { DD_LEVEL_DATA_T data; - data.d6Level = (U32)getLevelStatus( D6_LEVL ); - data.d63Level = (U32)getLevelStatus( D63_LEVL ); - data.d46Level = (U32)getLevelStatus( D46_LEVL ); + data.d6Level = (U32)getLevelStatus( D6_LEVL ); + data.d63Level = (U32)getLevelStatus( D63_LEVL ); + data.d98Level = (U32)getLevelStatus( D98_LEVL ); + data.bicarbLevel = (U32)getBicarbChamberLevelStatus(); + data.d46Level = (U32)getLevelStatus( D46_LEVL ); levelsDataPublicationCounter = 0;