Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r61fc45d7a43557312d6abd00a6b01e6823b44f04 -r2b6abbe347b2da260a4d46aca233bbfb6a59bf04 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 61fc45d7a43557312d6abd00a6b01e6823b44f04) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 2b6abbe347b2da260a4d46aca233bbfb6a59bf04) @@ -115,7 +115,6 @@ static U32 flushBubblesStartTime; ///< Starting time for flush bubbles. static U32 concentratePumpPrimeCount; ///< Interval count for concentrate pump prime. -static F32 integratedVolumeML; ///< Total RO flow rate over period of time. static BOOL didFMPCheckStart; ///< Flag indicates whether FMP flow vs. LC volume check has begun. static F32 acidConductivityTotal; ///< Total of acid conductivity during fill. static F32 bicarbConductivityTotal; ///< Total of bicarb conductivity during fill. @@ -137,6 +136,7 @@ static OVERRIDE_F32_T usedBicarbVolumeML = { 0.0, 0.0, 0.0, 0.0 }; ///< The integrated bicarb concentration volume has been used in mL. static OVERRIDE_U32_T fillModeDataPublishInterval = { FILL_MODE_DATA_PUB_INTERVAL, FILL_MODE_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish fill mode data to CAN bus. +static OVERRIDE_F32_T integratedVolumeML = { 0.0, 0.0, 0.0, 0.0 }; ///< Total RO flow rate over period of time. // ********** private function prototypes ********** @@ -172,7 +172,7 @@ dialysateFillStartTime = 0; dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; reservoirBaseWeight = 0.0F; - integratedVolumeML = 0.0F; + integratedVolumeML.data = 0.0F; didFMPCheckStart = FALSE; concentrateTestStartTime = 0; acidConductivityTotal = 0.0F; @@ -326,6 +326,20 @@ /*********************************************************************//** * @brief + * The getIntegratedVolumeML function returns the integrated volume in mL + * @details Inputs: none + * @details Outputs: integrated volume + * @return integrated volume + *************************************************************************/ +F32 getIntegratedVolumeML( void ) +{ + + F32 integratedVolume = getF32OverrideValue(&integratedVolumeML); + return integratedVolume; +} + +/*********************************************************************//** + * @brief * The resetFillStatusParameters function resets the fill status parameters. * @details Inputs: none * @details Outputs: fillStatus @@ -386,6 +400,8 @@ return volume; } + + /*********************************************************************//** * @brief * The resetChemicalUsedVolumeML function resets the used volume of a chemical @@ -757,7 +773,7 @@ reservoirBaseWeight = getReservoirWeight( getInactiveReservoir() ); } - integratedVolumeML += getMeasuredROFlowRateWithConcPumpsLPM() * ML_PER_LITER * FLOW_INTEGRATOR; + integratedVolumeML.data += getMeasuredROFlowRateWithConcPumpsLPM() * ML_PER_LITER * FLOW_INTEGRATOR; } usedAcidVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * FLOW_INTEGRATOR; @@ -781,8 +797,8 @@ // If we've reached our target fill to volume (by weight), we're done filling - go back to generation idle mode // SRSDG 398 if ( TRUE == hasTargetFillVolumeBeenReached( inactiveReservoir ) ) { - F32 filledVolumeML = getReservoirWeight( inactiveReservoir ) - reservoirBaseWeight; - F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / integratedVolumeML ) ); + F32 filledVolumeML = getReservoirWeight( inactiveRsrvr ) - reservoirBaseWeight; + F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / getIntegratedVolumeML() ) ); F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; F32 avgBicarbConductivity = bicarbConductivityTotal / conductivitySampleCount; F32 acidNormalConductivity = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConductivityUSPerCM; @@ -794,7 +810,7 @@ { if ( integratedVolumeToLoadCellReadingPercent > FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE ) // SRSDG 240 { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_FLOW_METER_CHECK_FAILURE, filledVolumeML, integratedVolumeML ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_FLOW_METER_CHECK_FAILURE, filledVolumeML, getIntegratedVolumeML() ); } } @@ -1015,7 +1031,7 @@ fillModeData.pctDiffInConductivity = pctDiffInConductivity; fillModeData.usedAcidVolumeML = getChemicalUsedVolumeML( ACID ); fillModeData.usedBicarbVolumeML = getChemicalUsedVolumeML( BICARB ); - fillModeData.integratedVolumeML = integratedVolumeML; + fillModeData.integratedVolumeML = getIntegratedVolumeML(); broadcastData( MSG_ID_DG_FILL_MODE_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&fillModeData, sizeof( DG_FILL_MODE_DATA_T ) ); @@ -1171,4 +1187,49 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetFillModeDataPublishIntervalOverride function overrides the + * fill mode data publish interval. + * @details Inputs: FillModeDataPublishInterval + * @details Outputs: FillModeDataPublishInterval + * @param: value override fill mode data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetIntegratedVolumeOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + integratedVolumeML.ovData = value; + integratedVolumeML.override = OVERRIDE_KEY; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetFillModeDataPublishIntervalOverride function resets the + * override of the fill mode data publish interval. + * @details Inputs: FillModeDataPublishInterval + * @details Outputs: FillModeDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetIntegratedVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + integratedVolumeML.override = OVERRIDE_RESET; + integratedVolumeML.ovData = integratedVolumeML.ovInitData; + result = TRUE; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeFill.h =================================================================== diff -u -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 -r2b6abbe347b2da260a4d46aca233bbfb6a59bf04 --- firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) +++ firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision 2b6abbe347b2da260a4d46aca233bbfb6a59bf04) @@ -80,6 +80,12 @@ BOOL testSetUsedBicarbVolumeMLOverride( F32 value ); BOOL testResetUsedBicarbVolumeMLOverride( void ); +BOOL testSetFillModeDataPublishIntervalOverride( U32 value ); +BOOL testResetFillModeDataPublishIntervalOverride( void ); + +BOOL testSetIntegratedVolumeOverride( U32 value ); +BOOL testResetIntegratedVolumeOverride( void ); + /**@}*/ #endif Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r61fc45d7a43557312d6abd00a6b01e6823b44f04 -r2b6abbe347b2da260a4d46aca233bbfb6a59bf04 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 61fc45d7a43557312d6abd00a6b01e6823b44f04) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 2b6abbe347b2da260a4d46aca233bbfb6a59bf04) @@ -1204,6 +1204,18 @@ handleTestTareReservoirRequest( message ); break; + case MSG_ID_DG_RO_FEEDBACK_VOLTAGE_OVERRIDE: + handleTestDGROPumpFeedbackVoltageOverrideRequest( message ); + break; + + case MSG_ID_DG_DIALYSATE_FILL_INTEGRATED_VOLUME_OVERRIDE: + handleTestDGFillIntegratedVolumeOverrideRequest( message ); + break; + + case MSG_ID_FILL_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestDGFillModeBroadcastOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r61fc45d7a43557312d6abd00a6b01e6823b44f04 -r2b6abbe347b2da260a4d46aca233bbfb6a59bf04 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 61fc45d7a43557312d6abd00a6b01e6823b44f04) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 2b6abbe347b2da260a4d46aca233bbfb6a59bf04) @@ -3759,4 +3759,218 @@ return result; } +/*********************************************************************//** + * @brief + * The handleResendAllAlarmsCommand function handles a request to re-send + * all active DG alarms. + * The sendUIServiceModeResponse function sends out the DG response to a + * UI request to go to service mode. + * @details Inputs: none + * @details Outputs: Service mode request response msg constructed and queued + * @param accepted TRUE if request was accepted, FALSE if not + * @param rejCode Reject reason code explaining why request was rejected + * @return none + *************************************************************************/ +void handleResendAllAlarmsCommand( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // verify payload length + if ( 0 == message->hdr.payloadLen ) + { + handleResendActiveAlarmsRequest(); + result = TRUE; + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleCpldStatusRequest function handles a CPLD Status request message. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleCpldStatusRequest( MESSAGE_T *message ) +{ + MESSAGE_T msg; + CPLD_STATUS_T payload; + U08 *payloadPtr = msg.payload; + + // populate payload + getCPLDStatus( &payload ); + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_CPLD_STATUS; + msg.hdr.payloadLen = sizeof( CPLD_STATUS_T ); + + // fill message payload + memcpy( payloadPtr, &payload, sizeof( CPLD_STATUS_T ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); +} + +/*********************************************************************//** + * @brief + * The handleTestDrainPumpMeasuredCurrentOverride function handles a request + * to override the drain pump measured current + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDrainPumpMeasuredCurrentOverride( 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 = testSetDrainPumpMeasuredCurrentOverride( payload.state.f32 ); + } + else + { + result = testResetDrainPumpMeasuredCurrentOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestGenIdlePublishIntervalOverride function handles a request + * to override the gen idle state publish interval + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestGenIdlePublishIntervalOverride( 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 = testSetGenIdleSubstatesPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetGenIdleSubstatesPublishIntervalOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestDGROPumpFeedbackVoltageOverrideRequest function handles a request + * to override the gen idle state publish interval + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDGROPumpFeedbackVoltageOverrideRequest( 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 = testSetROPumpMeasuredFeedbackVoltageOverride( payload.state.f32 ); + } + else + { + result = testResetROPumpMeasuredFeedbackVoltageOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestDGFillModeBroadcastOverrideRequest function handles a request + * to override the gen idle state publish interval + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDGFillModeBroadcastOverrideRequest( 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 = testSetFillModeDataPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetFillModeDataPublishIntervalOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} +/*********************************************************************//** + * @brief + * The handleTestDGFillIntegratedVolumeOverrideRequest function handles a request + * to override the gen idle state publish interval + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDGFillIntegratedVolumeOverrideRequest( 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 = testSetIntegratedVolumeOverride( payload.state.u32 ); + } + else + { + result = testResetIntegratedVolumeOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r61fc45d7a43557312d6abd00a6b01e6823b44f04 -r2b6abbe347b2da260a4d46aca233bbfb6a59bf04 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 61fc45d7a43557312d6abd00a6b01e6823b44f04) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 2b6abbe347b2da260a4d46aca233bbfb6a59bf04) @@ -403,6 +403,34 @@ // MSG_ID_HD_OP_MODE BOOL handleSetHDOperationMode( MESSAGE_T *message ); +// MSG_ID_HD_REQUEST_DG_ALARMS +void handleResendAllAlarmsCommand( MESSAGE_T *message ); + +// MSG_ID_DG_DRAIN_PUMP_CURRENT_OVERRIDE +void handleTestDrainPumpMeasuredCurrentOverride( MESSAGE_T *message ); + +// MSG_ID_DG_GEN_IDLE_PUBLISH_INTERVAL_OVERRIDE +void handleTestGenIdlePublishIntervalOverride( MESSAGE_T * message ); + +// MSG_ID_DG_DRAIN_PUMP_CURRENT_OVERRIDE +void handleTestDGDrainPumpCurrentOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_DRAIN_PUMP_DIRECTION_OVERRIDE +void handleTestDGDrainPumpDirectionOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_VALVES_SENSED_STATE_OVERRIDE +void handleTestDGValvesSensedStateOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_FILL_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE +void handleTestDGFillModeBroadcastOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_RO_FEEDBACK_VOLTAGE_OVERRIDE +void handleTestDGROPumpFeedbackVoltageOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_DIALYSATE_FILL_INTEGRATED_VOLUME_OVERRIDE +void handleTestDGFillIntegratedVolumeOverrideRequest( MESSAGE_T *message ); + + /**@}*/ #endif