Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -rc7d750b36ffa45ed57c73899aa7861e2d8d63be9 -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision c7d750b36ffa45ed57c73899aa7861e2d8d63be9) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -323,7 +323,7 @@ * roPumpPWMDutyCyclePctSet, roPumpControlMode * @details Outputs: roPumpOpenLoopTargetDutyCycle, roPumpPWMDutyCyclePct, * roPumpPWMDutyCyclePctSet, roPumpControlMode - * @param: duty which is the duty cycle + * @param duty which is the duty cycle * @return none *************************************************************************/ BOOL setROPumpTargetDutyCycle( F32 duty ) @@ -944,7 +944,7 @@ * RO pump data publish interval. * @details Inputs: roPumpDataPublishInterval * @details Outputs: roPumpDataPublishInterval - * @param: value : override RO pump data publish interval with (in ms) + * @param value : override RO pump data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetROPumpDataPublishIntervalOverride( U32 value ) Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -rd2ec7bf847131ad0f044fc122aef360d726a2dc5 -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision d2ec7bf847131ad0f044fc122aef360d726a2dc5) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -22,7 +22,7 @@ /** * @defgroup ROPump ROPump - * @brief RO Pump monitor and controller module. Controls and monitors the RO pump. + * @brief RO Pump monitor and controller module. Controls and monitors the RO pump and the flow meter. * The flow meter is manufactured by SwissFlow, PN: 82015311. * The diaphragm (RO) pump is manufactured by Aquatec, PN: 5889-2MM1-V724DY. * Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -rb67373adbc581690febb1e1c2bb521f108d9b92e -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision b67373adbc581690febb1e1c2bb521f108d9b92e) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -7,8 +7,8 @@ * * @file ModeDrain.c * -* @author (last) Michael Garthwaite -* @date (last) 09-Aug-2023 +* @author (last) Dara Navaei +* @date (last) 19-Sep-2023 * * @author (original) Leonardo Baloa * @date (original) 20-Dec-2019 @@ -137,6 +137,8 @@ setCurrentSubState( NO_SUB_STATE ); + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_INACTIVE_RESERVOIR_TEMP_REMOVE, (U32)inactiveReservoir, 0 ) // TODO remove + if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveStateDelayed( VRD1, VALVE_STATE_OPEN, DELAY_RES_DRAIN_VALVE_MS ); @@ -295,6 +297,8 @@ acidBottleVolML = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidFullBottleVolumeML; bicarbBottleVolML = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbStartVolumeML; + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_INACTIVE_RESERVOIR_TEMP_REMOVE, (U32)inactiveReservoir, 0 ) // TODO remove + if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveState( VRD1, VALVE_STATE_CLOSED ); @@ -309,18 +313,20 @@ #endif { // Detect empty bottles using integrated volumes - if ( ( acidBottleVolML - getChemicalUsedVolumeML( ACID ) ) <= CONCENTRATE_BOTTLE_ACID_LOW_VOLUME_ML ) // SRSDG 836 + if ( ( ( acidBottleVolML - getChemicalUsedVolumeML( ACID ) ) <= CONCENTRATE_BOTTLE_ACID_LOW_VOLUME_ML ) && // SRSDG 836 + ( getTestConfigStatus( TEST_CONFIG_MIX_WITH_WATER ) != TRUE ) ) { resetChemicalUsedVolumeML( ACID ); - setThisFisrtFillFlag( TRUE ); // indicates bottles need prime + setThisFirstFillFlag( TRUE ); // indicates bottles need prime activateAlarmNoData( ALARM_ID_DG_ACID_BOTTLE_LOW_VOLUME ); activateAlarmNoData ( ALARM_ID_DG_CREATING_DIALYSATE_PLEASE_WAIT ); } - if ( ( bicarbBottleVolML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATE_BOTTLE_BICARB_LOW_VOLUME_ML ) // SRSDG 837 + if ( ( ( bicarbBottleVolML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATE_BOTTLE_BICARB_LOW_VOLUME_ML ) && // SRSDG 837 + ( getTestConfigStatus( TEST_CONFIG_MIX_WITH_WATER ) != TRUE ) ) { resetChemicalUsedVolumeML( BICARB ); - setThisFisrtFillFlag( TRUE ); + setThisFirstFillFlag( TRUE ); activateAlarmNoData( ALARM_ID_DG_BICARB_BOTTLE_LOW_VOLUME ); activateAlarmNoData ( ALARM_ID_DG_CREATING_DIALYSATE_PLEASE_WAIT ); } @@ -358,6 +364,8 @@ if ( ++drainEmptyTareTimerCtr > DRAIN_EMPTY_TARE_WAIT ) { + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_INACTIVE_RESERVOIR_TEMP_REMOVE, (U32)inactiveReservoir, 0 ) // TODO remove + drainEmptyTareTimerCtr = 0; tareLoadCellsAtEmpty( inactiveReservoir ); Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r686955d65645ec1f99350150e49f9030d840b4cc -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 686955d65645ec1f99350150e49f9030d840b4cc) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -1173,7 +1173,9 @@ * percentFactor. * @details Inputs: None * @details Outputs: None - * @param: testValue, baseValue, percentFactor + * @param testValue value to check range for + * @param baseValue value associated with 100% + * @param percentFactor percentage range (100% +/- this value) * @return TRUE if testValue is within range. Otherwise, return FALSE *************************************************************************/ static BOOL isValueWithinPercentRange( F32 testValue, F32 baseValue, F32 percentFactor ) @@ -1264,7 +1266,7 @@ * acid volume. * @details Inputs: used acid volume * @details Outputs: used acid volume - * @param: value : override used acid volume in mL + * @param value override used acid volume in mL * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetUsedAcidVolumeMLOverride( F32 value ) @@ -1312,7 +1314,7 @@ * bicarb volume. * @details Inputs: used bicarb volume * @details Outputs: used bicarb volume - * @param: value : override used bicarb volume in mL + * @param value override used bicarb volume in mL * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetUsedBicarbVolumeMLOverride( F32 value ) @@ -1360,7 +1362,7 @@ * fill mode data publish interval. * @details Inputs: FillModeDataPublishInterval * @details Outputs: FillModeDataPublishInterval - * @param: value override fill mode data publish interval with (in ms) + * @param value override fill mode data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetFillModeDataPublishIntervalOverride( U32 value ) @@ -1406,7 +1408,7 @@ * integrated volume. * @details Inputs: value * @details Outputs: integratedVolumeML - * @param: value integrated volume in mL + * @param value integrated volume in mL * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetIntegratedVolumeOverride( F32 value ) Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -r686955d65645ec1f99350150e49f9030d840b4cc -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 686955d65645ec1f99350150e49f9030d840b4cc) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -39,7 +39,7 @@ #include "Valves.h" /** - * @addtogroup DGRecirculateMode + * @addtogroup DGGenIdleMode * @{ */ @@ -510,7 +510,7 @@ * bad fill sub-states publish interval. * @details Inputs: badFillSubstatesPublishInterval * @details Outputs: badFillSubstatesPublishInterval - * @param: value override bad fill sub-states publish interval with (in ms) + * @param value override bad fill sub-states publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetGenIdleSubstatesPublishIntervalOverride( U32 value ) Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -rcf9f459e2b3fed14f46aeeb95bd70af6abec3122 -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision cf9f459e2b3fed14f46aeeb95bd70af6abec3122) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -481,7 +481,6 @@ * status event. * @details Inputs: currentMode, currentSubMode, currentSubState * @details Outputs: dat1, dat2. - * @param none * @return none *************************************************************************/ static void sendOperationStatusEvent() Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r8ee01698b926fa62e7bed563b1137144a3cb32c5 -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 8ee01698b926fa62e7bed563b1137144a3cb32c5) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -1224,7 +1224,7 @@ * @details Outputs: acidConcentrateCalRecord, bicarbConcentrateCalRecord * @param acid which is the acid dialysate mixing ratio * @param bicarb which is the bicarb dialysate mixing ratio - * @return TRUE if tare successful, FALSE if not + * @return TRUE if set successful, FALSE if not *************************************************************************/ BOOL testSetDialysateMixingRatios( F32 acid, F32 bicarb ) { @@ -1246,7 +1246,7 @@ * reservoir data publish interval. * @details Inputs: reservoirDataPublishInterval * @details Outputs: reservoirDataPublishInterval - * @param: value override reservoir data publish interval with (in ms) + * @param value override reservoir data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetReservoirDataPublishIntervalOverride( U32 value ) Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rb67373adbc581690febb1e1c2bb521f108d9b92e -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision b67373adbc581690febb1e1c2bb521f108d9b92e) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -7,8 +7,8 @@ * * @file SystemCommMessages.c * -* @author (last) Sean Nash -* @date (last) 24-Aug-2023 +* @author (last) Michael Garthwaite +* @date (last) 11-Sep-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -423,7 +423,6 @@ return result; } - // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -1132,6 +1131,27 @@ /*********************************************************************//** * @brief + * The handleParkConecentratePumpsCmd function handles a DG concentrate pumps park + * command message from the HD. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleParkConecentratePumpsCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == 0 ) + { + result = handleConcentratePumpParkRequest(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/*********************************************************************//** + * @brief * The handleStartStopTrimmerHeaterCmd function handles a trimmer heater start/stop * command message from the HD. * @details Inputs: none @@ -3615,37 +3635,6 @@ } /*********************************************************************//** - * @brief - * The handleFansRPMOverride function handles a request to override a fans RPM value. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleFansRPMOverride( MESSAGE_T *message ) -{ - TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; - BOOL result = FALSE; - - // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) - { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); - if ( FALSE == payload.reset ) - { - result = testSetFanRPMOverride( payload.index, payload.state.f32 ); - } - else - { - result = testResetFanRPMOverride( payload.index ); - } - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** * @brief * The handleStopDGRTCClock function handles a request to stop the RTC clock. * @details Inputs: none @@ -3784,10 +3773,41 @@ /*********************************************************************//** * @brief - * The handleTestFansRPMAlarmStartTimeOffsetRequest function handles a - * request to set the fans RPM alarm start time offset. + * The handleFansRPMOverride function handles a request to override a fans RPM value. * @details Inputs: none * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleFansRPMOverride( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetFanRPMOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetFanRPMOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestFansRPMAlarmStartTimeOverrideRequest function handles a + * request to override the fan RPM alarm start time. + * @details Inputs: none + * @details Outputs: message handled * @param message : a pointer to the message to handle * @return none *************************************************************************/ @@ -3810,7 +3830,6 @@ } /*********************************************************************//** - * @brief * The handleTestUsedAcidVolumeMLOverrideRequest function handles a * request to override the acid volume. * @details Inputs: none @@ -5044,4 +5063,99 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleTestDG77CStateTimerOverride function handles a request + * to override the heat disinfection timer at 77 C + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDG77CStateTimerOverride( MESSAGE_T * message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetDG77CStateTimerOverride( payload.state.u32 ); + } + else + { + result = testResetDG77CStateTimerOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestDG82CStateTimerOverride function handles a request + * to override the heat disinfection timer at 82 C + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDG82CStateTimerOverride( MESSAGE_T * message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetDG82CStateTimerOverride( payload.state.u32 ); + } + else + { + result = testResetDG82CStateTimerOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestChemDisinfectAcidOverride function handles a request + * to override the CD2 moving average in Chem disinfection. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestChemDisinfectAcidOverride( MESSAGE_T * message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetChemDisinfectionCD2AvgOverride( payload.state.f32 ); + } + else + { + result = testResetChemDisinfectionCD2AvgOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rb67373adbc581690febb1e1c2bb521f108d9b92e -rf847ac4a7a0a080c4b62886243f5b863c4e7730d --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision b67373adbc581690febb1e1c2bb521f108d9b92e) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision f847ac4a7a0a080c4b62886243f5b863c4e7730d) @@ -8,7 +8,7 @@ * @file SystemCommMessages.h * * @author (last) Michael Garthwaite -* @date (last) 21-Aug-2023 +* @date (last) 11-Sep-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -131,6 +131,9 @@ // MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD BOOL handleDGStartStopTrimmerHeater( MESSAGE_T *message ); +//MSG_ID_DG_PARK_CONCENTRATE_PUMPS +void handleParkConecentratePumpsCmd( MESSAGE_T *message ); + // MSG_ID_HD_START_STOP_TRIMMER_HEATER_CMD void handleHDStartStopTrimmerHeaterCmd( MESSAGE_T *message ); @@ -167,6 +170,12 @@ // MSG_ID_DG_RESPONSE_SERVICE_MODE_REQUEST BOOL sendServiceModeResponse( BOOL accepted, U32 rejCode ); +// MSG_ID_HD_OP_MODE +BOOL handleSetHDOperationMode( MESSAGE_T *message ); + +// MSG_ID_HD_REQUEST_DG_USAGE_INFO +void handleHDRequestDGUsageInfo( MESSAGE_T * message ); + // MSG_ID_DG_SET_SERVICE_TIME void handleSetDGServiceTime( MESSAGE_T *message ); @@ -390,6 +399,12 @@ // MSG_ID_DG_DRAIN_PUMP_MEASURED_RPM_OVERRIDE void handleSetDrainPumpMeasuredRPMOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_ALARM_INFO_SEND_INTERVAL_OVERRIDE +void handleTestAlarmInfoSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD +void handleTestSuperClearAlarmsRequest( MESSAGE_T *message ); + // MSG_ID_DG_SET_FANS_RPM_ALARM_START_TIME_OFFSET void handleTestFansRPMAlarmStartTimeOffsetRequest( MESSAGE_T *message ); @@ -410,21 +425,27 @@ void handleSetDGSoftwareConfigRecord( MESSAGE_T *message ); #endif +// MSG_ID_HD_REQUEST_DG_ALARMS +void handleResendAllAlarmsCommand( MESSAGE_T *message ); + // MSG_ID_DG_HD_COMMUNICATION_STATUS void handleTestHDCommunicationStatusOverrideRequest( MESSAGE_T *message ); // MSG_ID_DG_SET_PRIMARY_AND_TRIMMER_HEATERS_TARGET_TEMP void handleSetPrimaryAndTrimmerHeatersTargetTemperature( MESSAGE_T *message ); +// MSG_ID_DG_USED_ACID_VOLUME_ML_OVERRIDE +void handleTestUsedAcidVolumeMLOverrideRequest(MESSAGE_T *message); + +// MSG_ID_DG_USED_BICARB_VOLUME_ML_OVERRIDE +void handleTestUsedBicarbVolumeMLOverrideRequest(MESSAGE_T *message); + // MSG_ID_DG_GET_USAGE_INFO_RECORD void handleGetDGUsageInfoRecord( MESSAGE_T *message ); // MSG_ID_DG_SET_USAGE_INFO_RECORD void handleSetDGUsageInfoRecord( MESSAGE_T *message ); -// MSG_ID_HD_REQUEST_DG_ALARMS -void handleResendAllAlarmsCommand( MESSAGE_T *message ); - // MSG_ID_DG_SET_OP_MODE_REQUEST void handleTestSetOpModeRequest( MESSAGE_T *message ); @@ -521,8 +542,17 @@ void handleTestDGPendingACKOverrideRequest( MESSAGE_T* message ); // MSG_ID_DG_RESERVOIR_BROADCAST_INTERVAL_OVERRIDE -void handleTestDGReservoirOverrideRequest( MESSAGE_T* message); +void handleTestDGReservoirOverrideRequest( MESSAGE_T* message ); +// MSG_ID_DG_STATE_TIMER_77C_OVERRIDE +void handleTestDG77CStateTimerOverride( MESSAGE_T* message ); + +// MSG_ID_DG_STATE_TIMER_82C_OVERRIDE +void handleTestDG82CStateTimerOverride( MESSAGE_T* message ); + +// MSG_ID_DG_CHEM_DISINFECT_ACID_OVERRIDE +void handleTestChemDisinfectAcidOverride( MESSAGE_T* message ); + /**@}*/ #endif