Index: firmware/App/Controllers/FlowSensors.c =================================================================== diff -u -r696e732c9742535a58b9c65f243df7cd797d1423 -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 --- firmware/App/Controllers/FlowSensors.c (.../FlowSensors.c) (revision 696e732c9742535a58b9c65f243df7cd797d1423) +++ firmware/App/Controllers/FlowSensors.c (.../FlowSensors.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) @@ -1,21 +1,22 @@ /************************************************************************** * -* Copyright (c) 2022-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2022-2024 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 FlowSensors.c * -* @author (last) Dara Navaei -* @date (last) 01-Aug-2022 +* @author (last) Sean Nash +* @date (last) 22-Sep-2023 * * @author (original) Dara Navaei * @date (original) 21-Jul-2022 * ***************************************************************************/ #include +#include // For memcpy #include "ConcentratePumps.h" #include "FlowSensors.h" @@ -48,6 +49,7 @@ { U08 edgeCountsIndex; ///< Edge counts index. U16 edgeCountsBuffer[ FLOW_SENSORS_EDGES_BUFFER_LENGTH ]; ///< Edge counts buffer array. + OVERRIDE_F32_T measuredFlowBeforeCalLPM; ///< Measured flow before calibration in L/min. OVERRIDE_F32_T measuredFlowLPM; ///< Measured flow in L/min. OVERRIDE_F32_T measuredROFlowWithCPsLPM; ///< Measured RO flow with concentrate pumps in L/min. } FLOW_SENSOR_STATUS_T; @@ -115,12 +117,12 @@ void execFlowSensorsMonitor( void ) { U08 i; - U08 countsIndex = 0; - U16 oldestEdgeCount = 0; - U16 oldest2CurrentEdgeDiff = 0; - F32 flowBeforeCalibrationLPM = 0.0F; - F32 currentFlowLPM = 0.0F; - BOOL isFlowOutOfRange = FALSE; + U08 countsIndex = 0; + U16 oldestEdgeCount = 0; + U16 oldest2CurrentEdgeDiff = 0; + F32 currentFlowLPM = 0.0F; + BOOL isFlowOutOfRange = FALSE; + F32 measFlow = 0.0F; // Check if a new calibration is available if ( TRUE == isNewCalibrationRecordAvailable() ) @@ -139,20 +141,20 @@ case RO_FLOW_SENSOR: flowSensorStatus[ i ].edgeCountsBuffer[ countsIndex ] = getFPGAROFlowSensorEdgeCount(); oldest2CurrentEdgeDiff = u16DiffWithWrap( oldestEdgeCount, flowSensorStatus[ i ].edgeCountsBuffer[ countsIndex ] ); - flowBeforeCalibrationLPM = oldest2CurrentEdgeDiff * FLOW_SENSORS_LITERS_PER_PULSES * SEC_PER_MIN; - flowSensorStatus[ i ].measuredROFlowWithCPsLPM.data = getCalibrationAppliedFlowLPM( i, flowBeforeCalibrationLPM ); - flowSensorStatus[ i ].measuredFlowLPM.data = flowSensorStatus[ i ].measuredROFlowWithCPsLPM.data - - ( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) / ML_PER_LITER ) - - ( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) / ML_PER_LITER ); - flowSensorStatus[ i ].measuredFlowLPM.data = MAX( flowSensorStatus[ i ].measuredFlowLPM.data, 0.0 ); + flowSensorStatus[ i ].measuredFlowBeforeCalLPM.data = oldest2CurrentEdgeDiff * FLOW_SENSORS_LITERS_PER_PULSES * SEC_PER_MIN; + flowSensorStatus[ i ].measuredROFlowWithCPsLPM.data = getCalibrationAppliedFlowLPM( i, flowSensorStatus[ i ].measuredFlowBeforeCalLPM.data ); + measFlow = flowSensorStatus[ i ].measuredROFlowWithCPsLPM.data - + ( getMeasuredPumpSpeedMLPM( CONCENTRATEPUMPS_CP1_ACID ) / ML_PER_LITER ) - + ( getMeasuredPumpSpeedMLPM( CONCENTRATEPUMPS_CP2_BICARB ) / ML_PER_LITER ); + flowSensorStatus[ i ].measuredFlowLPM.data = MAX( measFlow, 0.0F ); break; case DIALYSATE_FLOW_SENSOR: flowSensorStatus[ i ].edgeCountsBuffer[ countsIndex ] = getFPGADialysateFlowSensorEdgeCount(); oldest2CurrentEdgeDiff = u16DiffWithWrap( oldestEdgeCount, flowSensorStatus[ i ].edgeCountsBuffer[ countsIndex ] ); - flowBeforeCalibrationLPM = oldest2CurrentEdgeDiff * FLOW_SENSORS_LITERS_PER_PULSES * SEC_PER_MIN; - flowSensorStatus[ i ].measuredFlowLPM.data = getCalibrationAppliedFlowLPM( i, flowBeforeCalibrationLPM ); - flowSensorStatus[ i ].measuredFlowLPM.data = MAX( flowSensorStatus[ i ].measuredFlowLPM.data, 0.0 ); + flowSensorStatus[ i ].measuredFlowBeforeCalLPM.data = oldest2CurrentEdgeDiff * FLOW_SENSORS_LITERS_PER_PULSES * SEC_PER_MIN; + measFlow = getCalibrationAppliedFlowLPM( i, flowSensorStatus[ i ].measuredFlowBeforeCalLPM.data ); + flowSensorStatus[ i ].measuredFlowLPM.data = MAX( measFlow, 0.0F ); break; #ifndef _VECTORCAST_ @@ -210,6 +212,21 @@ /*********************************************************************//** * @brief + * The getMeasuredRawFlowRateLPM function gets the measured flow + * rate of a flow sensor before applying the calibration to it in L/min. + * @details Inputs: flowSensorStatus + * @details Outputs: flowSensorStatus + * @return the current flow rate before applying calibration (in L/min). + *************************************************************************/ +F32 getMeasuredRawFlowRateLPM( FLOW_SENSORS_T sensorId ) +{ + F32 flow = getF32OverrideValue( &flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM ); + + return flow; +} + +/*********************************************************************//** + * @brief * The publishFlowSensorsData function publishes flow sensors data at * the set interval. * @details Inputs: flowSensorsDataPublicationCounter, @@ -224,10 +241,12 @@ { FLOW_SENSORS_DATA_T data; - data.ROFlowRateLPM = getMeasuredFlowRateLPM( RO_FLOW_SENSOR ); - data.dialysateFlowRateLPM = getMeasuredFlowRateLPM( DIALYSATE_FLOW_SENSOR ); - data.ROFlowRateWithCPsLPM = getMeasuredROFlowRateWithConcPumpsLPM(); - dataPublicationCounter = 0; + data.ROFlowRateLPM = getMeasuredFlowRateLPM( RO_FLOW_SENSOR ); + data.dialysateFlowRateLPM = getMeasuredFlowRateLPM( DIALYSATE_FLOW_SENSOR ); + data.ROFlowRateWithCPsLPM = getMeasuredROFlowRateWithConcPumpsLPM(); + data.RORawFlowRateLPM = getMeasuredRawFlowRateLPM( RO_FLOW_SENSOR ); + data.dialysateRawFlowRateLPM = getMeasuredRawFlowRateLPM( DIALYSATE_FLOW_SENSOR ); + dataPublicationCounter = 0; broadcastData( MSG_ID_DG_FLOW_SENSORS_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( FLOW_SENSORS_DATA_T ) ); } @@ -265,7 +284,7 @@ * flow sensors data publish interval. * @details Inputs: none * @details Outputs: flowSensorsDataPublishInterval - * @param: value override flow data publish interval with (in ms) + * @param value override flow data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetFlowDataPublishIntervalOverride( U32 value ) @@ -311,22 +330,33 @@ * flow rate. * @details Inputs: none * @details Outputs: flowSensorStatus - * @param: sensorId the Id of the sensor which its value is overridden. - * @param: value override measured flow rate in LPM + * @param sensorId the Id of the sensor which its value is overridden. + * @param value override measured flow rate in LPM + * @param raw override pre-calibrated, raw value, or post-calibrated values. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetMeasuredFlowRateOverride( U32 sensorId, F32 flowLPM ) +BOOL testSetMeasuredFlowRateOverride( U32 sensorId, F32 flowLPM, BOOL raw ) { BOOL result = FALSE; if ( sensorId < NUM_OF_FLOW_SENSORS ) { if ( TRUE == isTestingActivated() ) { - flowSensorStatus[ sensorId ].measuredFlowLPM.ovInitData = flowSensorStatus[ sensorId ].measuredFlowLPM.data; - flowSensorStatus[ sensorId ].measuredFlowLPM.ovData = flowLPM; - flowSensorStatus[ sensorId ].measuredFlowLPM.override = OVERRIDE_KEY; - result = TRUE; + if ( TRUE == raw ) + { + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.ovInitData = flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.data; + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.ovData = flowLPM; + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.override = OVERRIDE_KEY; + result = TRUE; + } + else + { + flowSensorStatus[ sensorId ].measuredFlowLPM.ovInitData = flowSensorStatus[ sensorId ].measuredFlowLPM.data; + flowSensorStatus[ sensorId ].measuredFlowLPM.ovData = flowLPM; + flowSensorStatus[ sensorId ].measuredFlowLPM.override = OVERRIDE_KEY; + result = TRUE; + } } } @@ -339,7 +369,7 @@ * of the measured flow rate. * @details Inputs: none * @details Outputs: flowSensorStatus - * @param: sensorId the Id of the sensor which its value is reset. + * @param sensorId the Id of the sensor which its value is reset. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testResetMeasuredFlowRateOverride( U32 sensorId ) @@ -354,6 +384,12 @@ flowSensorStatus[ sensorId ].measuredFlowLPM.override = OVERRIDE_RESET; flowSensorStatus[ sensorId ].measuredFlowLPM.ovInitData = 0.0F; flowSensorStatus[ sensorId ].measuredFlowLPM.ovData = 0.0F; + + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.data = flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.ovInitData; + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.override = OVERRIDE_RESET; + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.ovInitData = 0.0F; + flowSensorStatus[ sensorId ].measuredFlowBeforeCalLPM.ovData = 0.0F; + result = TRUE; } }