Index: firmware/App/Monitors/Level.c =================================================================== diff -u -rfd897db8177752330ad08d877e0a13620513dbdc -r2d295ca85f19e95da42476a57ca6b4496baf980a --- firmware/App/Monitors/Level.c (.../Level.c) (revision fd897db8177752330ad08d877e0a13620513dbdc) +++ firmware/App/Monitors/Level.c (.../Level.c) (revision 2d295ca85f19e95da42476a57ca6b4496baf980a) @@ -8,7 +8,7 @@ * @file Level.c * * @author (last) Sameer Kalliadan Poyil -* @date (last) 26-Mar-2026 +* @date (last) 30-Apr-2026 * * @author (original) Vinayakam Mani * @date (original) 14-Oct-2024 @@ -28,7 +28,7 @@ */ // ********** private definitions ********** -#define LEVEL_SENSOR_VALUE_LOW 0U ///< Level sensor digital low value (0 = low, non-zero = high). +#define LEVEL_SENSOR_LIQUID 0U ///< Level sensor digital low value (0 = liquid is detected, 1 = no liquid). #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 @@ -70,10 +70,10 @@ static void publishLevelsData( void ); static BOOL processLevelCount( U16 count ); -static LEVEL_STATE_T readFloaterLevelStatus( LEVEL_T levelId ); -static LEVEL_STATE_T getLevelState( U32 levelStatus ); -static LEVEL_STATE_T getLevelStateBeta19( U32 levelStatus ); -static LEVEL_STATE_T getLevelStateBeta10( U32 levelStatus ); +static LVL_STATE_T readFloaterLevelStatus( LEVEL_T levelId ); +static LVL_STATE_T getLevelState( U32 levelStatus ); +static LVL_STATE_T getLevelStateBeta19( U32 levelStatus ); +static LVL_STATE_T getLevelStateBeta10( U32 levelStatus ); /*********************************************************************//** * @brief @@ -84,7 +84,7 @@ *************************************************************************/ void initLevels( void ) { - U32 i; + LEVEL_T level; levelsDataPublicationCounter = DATA_PUBLISH_COUNTER_START_COUNT; fplevelsDataPublishInterval.data = LEVEL_DATA_PUB_INTERVAL; @@ -97,15 +97,15 @@ levelsDataPublishInterval.override = OVERRIDE_RESET; // Initialize all the Level - for ( i = 0; i < NUM_OF_LEVELS; i++ ) + for ( level = FIRST_LEVEL; level < NUM_OF_LEVELS; level++ ) { - status[ i ].data = (U32)LEVEL_STATE_HIGH; - status[ i ].ovData = (U32)LEVEL_STATE_HIGH; - status[ i ].ovInitData = (U32)LEVEL_STATE_HIGH; - status[ i ].override = OVERRIDE_RESET; - levelsStatus[ i ].debounceStartTime = 0; - levelsStatus[ i ].debounceTime = LEVEL_DEBOUNCE_TIME_MS; - levelsStatus[ i ].priorRawLevel = (U32)LEVEL_STATE_HIGH; + status[ level ].data = (U32)LEVEL_STATE_HIGH; + status[ level ].ovData = (U32)LEVEL_STATE_HIGH; + status[ level ].ovInitData = (U32)LEVEL_STATE_HIGH; + status[ level ].override = OVERRIDE_RESET; + levelsStatus[ level ].debounceStartTime = 0; + levelsStatus[ level ].debounceTime = LEVEL_DEBOUNCE_TIME_MS; + levelsStatus[ level ].priorRawLevel = (U32)LEVEL_STATE_HIGH; } } @@ -120,13 +120,13 @@ *************************************************************************/ void execLevels( void ) { - U32 i; + LEVEL_T level; U32 currentLevelStatus = 0; - for ( i = 0; i < NUM_OF_LEVELS; i++ ) + for ( level = FIRST_LEVEL; level < NUM_OF_LEVELS; level++ ) { // Get the current level status - switch ( i ) + switch ( level ) { // Process the status of the Level case D6_LEVL: @@ -136,33 +136,33 @@ case D63_LEVL: if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { - currentLevelStatus = ( LEVEL_SENSOR_VALUE_LOW == getFPGAD63LevelSensor() ) ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW; + currentLevelStatus = ( LEVEL_SENSOR_LIQUID == getFPGAD63LevelSensor() ) ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW; } else { - currentLevelStatus = ( processLevelCount( getFPGAD63LevelSensor() ) == LEVEL_SENSOR_VALUE_LOW ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); + currentLevelStatus = ( processLevelCount( getFPGAD63LevelSensor() ) == LEVEL_SENSOR_LIQUID ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW ); } break; case D98_LEVL: if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { - currentLevelStatus = ( LEVEL_SENSOR_VALUE_LOW == getFPGAD98LevelSensor() ) ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW; + currentLevelStatus = ( LEVEL_SENSOR_LIQUID == getFPGAD98LevelSensor() ) ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW; } else { - currentLevelStatus = ( processLevelCount( getFPGAD98LevelSensor() ) == LEVEL_SENSOR_VALUE_LOW ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); + currentLevelStatus = ( processLevelCount( getFPGAD98LevelSensor() ) == LEVEL_SENSOR_LIQUID ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW ); } break; case D46_LEVL: if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { - currentLevelStatus = ( LEVEL_SENSOR_VALUE_LOW == getFPGAD46LevelSensor() ) ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH; + currentLevelStatus = ( LEVEL_SENSOR_LIQUID == getFPGAD46LevelSensor() ) ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW; } else { - currentLevelStatus = ( processLevelCount( getFPGAD46LevelSensor() ) == LEVEL_SENSOR_VALUE_LOW ? LEVEL_STATE_LOW : LEVEL_STATE_HIGH ); + currentLevelStatus = ( processLevelCount( getFPGAD46LevelSensor() ) == LEVEL_SENSOR_LIQUID ? LEVEL_STATE_HIGH : LEVEL_STATE_LOW ); } break; @@ -172,57 +172,57 @@ #ifndef _VECTORCAST_ default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_LEVEL_SELECTED, i ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_LEVEL_SELECTED, level ); break; #endif } // Check if the current level status is not the same as the recorded data - if ( currentLevelStatus != status[ i ].data ) + if ( currentLevelStatus != status[ level ].data ) { - // If the debounce time is 0, start the timer - if ( ( 0 == levelsStatus[ i ].debounceStartTime ) || ( currentLevelStatus != levelsStatus[i].priorRawLevel ) ) + // If the de-bounce time is 0, start the timer + if ( ( 0 == levelsStatus[ level ].debounceStartTime ) || ( currentLevelStatus != levelsStatus[ level ].priorRawLevel ) ) { - levelsStatus[ i ].debounceStartTime = getMSTimerCount(); + levelsStatus[ level ].debounceStartTime = getMSTimerCount(); } // If the debounce time has been elapsed, update the level sensor status to the new status - else if ( TRUE == didTimeout( levelsStatus[ i ].debounceStartTime, levelsStatus[ i ].debounceTime ) ) + else if ( TRUE == didTimeout( levelsStatus[ level ].debounceStartTime, levelsStatus[ level ].debounceTime ) ) { - switch ( i ) + switch ( level ) { case D6_LEVL: - SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D6_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D6_LEVL_CHANGE, (U32)status[ level ].data, (U32)currentLevelStatus ); break; case D63_LEVL: - SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D63_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D63_LEVL_CHANGE, (U32)status[ level ].data, (U32)currentLevelStatus ); break; case D98_LEVL: - SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D98_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D98_LEVL_CHANGE, (U32)status[ level ].data, (U32)currentLevelStatus ); break; case D46_LEVL: - SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D46_LEVL_CHANGE, (U32)status[ i ].data, (U32)currentLevelStatus ); + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_D46_LEVL_CHANGE, (U32)status[ level ].data, (U32)currentLevelStatus ); break; #ifndef _VECTORCAST_ default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_LEVEL_SELECTED, i ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_LEVEL_SELECTED, level); break; #endif } - levelsStatus[ i ].debounceStartTime = 0; - status[ i ].data = currentLevelStatus; + levelsStatus[ level ].debounceStartTime = 0; + status[ level ].data = currentLevelStatus; } } else { - levelsStatus[ i ].debounceStartTime = 0; + levelsStatus[ level ].debounceStartTime = 0; } - levelsStatus[i].priorRawLevel = currentLevelStatus; + levelsStatus[ level ].priorRawLevel = currentLevelStatus; } publishLevelsData(); @@ -231,18 +231,19 @@ /*********************************************************************//** * @brief * The getLevelStatus function returns the status of the called level sensor. - * @details \b Inputs: levelStatus - * @details \b Outputs: levelStatus + * @details \b Inputs: status + * @details \b Outputs: status * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid level sensor * passed. * @param levelId which is the sensor that its status is requested - * @return level status + * @return LEVEL_STATE_T status *************************************************************************/ LEVEL_STATE_T getLevelStatus( LEVEL_T levelId ) { U32 stat = 0; - if ( levelId < NUM_OF_LEVELS ) + // level id should include the last level + if ( levelId <= LAST_LEVEL ) { // Assume there is no override stat = status[ levelId ].data; @@ -262,6 +263,38 @@ /*********************************************************************//** * @brief + * The getFloaterStatus function returns the status of the called floater sensor. + * @details \b Inputs: status + * @details \b Outputs: status + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid level sensor + * passed. + * @param levelId which is the sensor that its status is requested + * @return LVL_STATE_T status + *************************************************************************/ +LVL_STATE_T getFloaterStatus( LEVEL_T levelId ) +{ + U32 stat = 0; + + if ( levelId >= FIRST_FLOAT && levelId <= LAST_FLOAT ) + { + // Assume there is no override + stat = status[ levelId ].data; + + if ( OVERRIDE_KEY == status[ levelId ].override ) + { + stat = status[ levelId ].ovData; + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DD_INVALID_LEVEL_ID, (U32)levelId ) + } + + return (LVL_STATE_T)stat; +} + +/*********************************************************************//** + * @brief * The processLevelCount function checks the range of count reported by FPGA * and determine level based on the count. * @details \b Inputs: none @@ -291,30 +324,30 @@ * @param levelStatus Raw FPGA level status value * @return mapped level state *************************************************************************/ -static LEVEL_STATE_T getLevelStateBeta19( U32 levelStatus ) +static LVL_STATE_T getLevelStateBeta19( U32 levelStatus ) { - LEVEL_STATE_T currentLevelStatus = LEVEL_STATE_ILLEGAL; + LVL_STATE_T currentLevelStatus = LVL_STATE_ILLEGAL; if ( FPGA_LEVEL_EMPTY == levelStatus ) { - currentLevelStatus = LEVEL_STATE_EMPTY; + currentLevelStatus = LVL_STATE_EMPTY; } else if ( FPGA_LEVEL_LOW == levelStatus ) { - currentLevelStatus = LEVEL_STATE_LOW; + currentLevelStatus = LVL_STATE_LOW; } else if ( FPGA_LEVEL_MEDIUM == levelStatus ) { - currentLevelStatus = LEVEL_STATE_MEDIUM; + currentLevelStatus = LVL_STATE_MEDIUM; } else if ( FPGA_LEVEL_HIGH == levelStatus ) { - currentLevelStatus = LEVEL_STATE_HIGH; + currentLevelStatus = LVL_STATE_HIGH; } else { // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL; + currentLevelStatus = LVL_STATE_ILLEGAL; } return currentLevelStatus; @@ -329,30 +362,30 @@ * @param levelStatus Raw FPGA level status value * @return mapped level state *************************************************************************/ -static LEVEL_STATE_T getLevelState( U32 levelStatus ) +static LVL_STATE_T getLevelState( U32 levelStatus ) { - LEVEL_STATE_T currentLevelStatus = LEVEL_STATE_ILLEGAL; + LVL_STATE_T currentLevelStatus = LVL_STATE_ILLEGAL; if ( FPGA_B2_LEVEL_EMPTY == levelStatus ) { - currentLevelStatus = LEVEL_STATE_EMPTY; + currentLevelStatus = LVL_STATE_EMPTY; } else if ( FPGA_B2_LEVEL_LOW == levelStatus ) { - currentLevelStatus = LEVEL_STATE_LOW; + currentLevelStatus = LVL_STATE_LOW; } else if ( FPGA_B2_LEVEL_MEDIUM == levelStatus ) { - currentLevelStatus = LEVEL_STATE_MEDIUM; + currentLevelStatus = LVL_STATE_MEDIUM; } else if ( FPGA_B2_LEVEL_HIGH == levelStatus ) { - currentLevelStatus = LEVEL_STATE_HIGH; + currentLevelStatus = LVL_STATE_HIGH; } else { // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL; + currentLevelStatus = LVL_STATE_ILLEGAL; } return currentLevelStatus; @@ -367,26 +400,26 @@ * @param levelStatus Raw FPGA level status value * @return mapped level state *************************************************************************/ -static LEVEL_STATE_T getLevelStateBeta10( U32 levelStatus ) +static LVL_STATE_T getLevelStateBeta10( U32 levelStatus ) { - LEVEL_STATE_T currentLevelStatus = LEVEL_STATE_ILLEGAL; + LVL_STATE_T currentLevelStatus = LVL_STATE_ILLEGAL; if ( FPGA_B1_HW_LEVEL_LOW == levelStatus ) { - currentLevelStatus = LEVEL_STATE_LOW; + currentLevelStatus = LVL_STATE_LOW; } else if ( FPGA_B1_HW_LEVEL_MEDIUM == levelStatus ) { - currentLevelStatus = LEVEL_STATE_MEDIUM; + currentLevelStatus = LVL_STATE_MEDIUM; } else if ( FPGA_B1_HW_LEVEL_HIGH == levelStatus ) { - currentLevelStatus = LEVEL_STATE_HIGH; + currentLevelStatus = LVL_STATE_HIGH; } else { // TODO - Handle invalid level alarm - currentLevelStatus = LEVEL_STATE_ILLEGAL; + currentLevelStatus = LVL_STATE_ILLEGAL; } return currentLevelStatus; @@ -400,9 +433,9 @@ * @details \b Outputs: level * @return level status *************************************************************************/ -static LEVEL_STATE_T readFloaterLevelStatus( LEVEL_T levelId ) +static LVL_STATE_T readFloaterLevelStatus( LEVEL_T levelId ) { - LEVEL_STATE_T currentLevelStatus = LEVEL_STATE_HIGH; + LVL_STATE_T currentLevelStatus = LVL_STATE_HIGH; U32 levelStatus = 0; if ( D6_LEVL == levelId ) @@ -465,31 +498,31 @@ * @details \b Outputs: level * @return level status *************************************************************************/ -LEVEL_STATE_T getBicarbChamberLevelStatus( void ) +LVL_STATE_T getBicarbChamberLevelStatus( void ) { - LEVEL_STATE_T status = LEVEL_STATE_ILLEGAL; + LVL_STATE_T status = LVL_STATE_ILLEGAL; - LEVEL_STATE_T upperlevel = getLevelStatus( D98_LEVL ); - LEVEL_STATE_T lowerlevel = getLevelStatus( D63_LEVL ); + LEVEL_STATE_T upperlevel = getLevelStatus( D98_LEVL ); + LEVEL_STATE_T lowerlevel = getLevelStatus( D63_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; + if ( ( lowerlevel == LEVEL_STATE_LOW ) && ( upperlevel == LEVEL_STATE_LOW ) ) + { + status = LVL_STATE_LOW; + } + else if ( ( lowerlevel == LEVEL_STATE_HIGH ) && ( upperlevel == LEVEL_STATE_LOW ) ) + { + status = LVL_STATE_MEDIUM; + } + else if ( ( lowerlevel == LEVEL_STATE_HIGH ) && ( upperlevel == LEVEL_STATE_HIGH ) ) + { + status = LVL_STATE_HIGH; + } + else + { + // upperlevel == TRUE while lowerlevel == FALSE - illegal + status = LVL_STATE_ILLEGAL; + } + return status; } /*********************************************************************//** @@ -508,11 +541,11 @@ { DD_LEVEL_DATA_T data; - data.d6Level = (U32)getLevelStatus( D6_LEVL ); + data.d6Level = (U32)getFloaterStatus( D6_LEVL ); + data.d46Level = (U32)getLevelStatus( D46_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; @@ -524,7 +557,7 @@ { FP_LEVEL_DATA_T data; - data.p25Level = (U32)getLevelStatus( P25_LEVL ); + data.p25Level = (U32)getFloaterStatus( P25_LEVL ); fplevelsDataPublicationCounter = 0; broadcastData( MSG_ID_FP_LEVEL_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( FP_LEVEL_DATA_T ) ); } @@ -558,20 +591,44 @@ * The testLevelStatusOverride function sets the override status * for a specific level sensor. * @details \b Inputs: none - * @details \b Outputs: levelStatus + * @details \b Outputs: status * @param message Override message from Dialin which includes an ID of * the level sensor to override and the state to override the level sensor to. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testLevelStatusOverride( MESSAGE_T *message ) { - BOOL result = u32ArrayOverride( message, &status[0], NUM_OF_LEVELS - 1, 0, NUM_OF_LEVELS_STATES -1 ); + BOOL result = u32ArrayOverride( message, &status[0], LAST_LEVEL, 0, NUM_OF_LEVEL_STATES -1 ); return result; } /*********************************************************************//** * @brief + * The testFloaterLevelStatusOverride function sets the override status + * for a specific floater level sensor. + * @details \b Inputs: none + * @details \b Outputs: status + * @param message Override message from Dialin which includes an ID of + * the level sensor to override and the state to override the level sensor to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testDDFloaterLevelStateOverride( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); + + if ( ( D6_LEVL == payload.index ) ) + { + result = u32ArrayOverride( message, &status[0], D6_LEVL, 0, NUM_OF_LVL_STATES -1 ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The testFPLevelsDataPublishIntervalOverride function overrides the Level * data publish interval. * @details \b Inputs: levelsDataPublishInterval @@ -597,15 +654,15 @@ * override the floater level sensor to. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testFPLevelStateOverride( MESSAGE_T *message ) +BOOL testFPFloaterLevelStateOverride( MESSAGE_T *message ) { - BOOL result = FALSE; TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; OVERRIDE_TYPE_T ovType = getOverrideArrayPayloadFromMessage( message, &payload ); - if ( ( payload.index >= FIRST_FP_LEVL ) && ( payload.index <= LAST_FP_LEVL ) ) + if ( ( P25_LEVL == payload.index ) ) { - BOOL result = u32Override( message, &status[0], 0, NUM_OF_LEVELS_STATES -1 ); + result = u32ArrayOverride( message, &status[ 0 ], P25_LEVL, 0, NUM_OF_LVL_STATES -1 ); } return result;