Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -re5167d0700038c1faf8b689b844a905f20c0d3c6 -ra37189e75de205982befcc91176f33c0523b03a8 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision a37189e75de205982befcc91176f33c0523b03a8) @@ -8,7 +8,7 @@ * @file ModePreTreat.c * * @author (last) Dara Navaei -* @date (last) 17-May-2023 +* @date (last) 02-Jun-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -49,7 +49,7 @@ #define PRE_TREATMENT_NORMAL_FILL_TARGET_TEMP_C ( 37.0F + 2.0F ) ///< Pre treatment normal fill target temperature in C. #define PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume minimum to prep volume during development. -#define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume (in mL) to flush filter and lines. +#define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 300 ///< Fill reservoir to this volume (in mL) to flush filter and lines. #define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 1300 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. #define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 600 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. #define PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML 1500 ///< Fill reservoir to this volume minimum to prep volume during development. @@ -522,17 +522,14 @@ break; case ALARM_ACTION_END_TREATMENT: - if ( HD_PRE_TREATMENT_PRIME_STATE > currentPreTreatmentState ) + if ( currentPreTreatmentState > HD_PRE_TREATMENT_WATER_SAMPLE_STATE ) { - if ( HD_PRE_TREATMENT_WATER_SAMPLE_STATE == currentPreTreatmentState ) - { - cmdDGSampleWater( SAMPLE_WATER_CMD_END ); - } - requestNewOperationMode( MODE_STAN ); + requestNewOperationMode( MODE_POST ); } else { - requestNewOperationMode( MODE_POST ); + requestNewOperationMode( MODE_STAN ); + cmdStopDG(); } break; @@ -1016,7 +1013,7 @@ cmdStopDGTrimmerHeater(); } } - else if ( TRUE == alarmActionResumeReceived ) + if ( TRUE == alarmActionResumeReceived ) { alarmActionResumeReceived = FALSE; setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r5c3d2c3b1f54008cfdf8fb66ed73f1a8015d9b51 -ra37189e75de205982befcc91176f33c0523b03a8 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 5c3d2c3b1f54008cfdf8fb66ed73f1a8015d9b51) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a37189e75de205982befcc91176f33c0523b03a8) @@ -7,8 +7,8 @@ * * @file ModeStandby.c * -* @author (last) Dara Navaei -* @date (last) 16-May-2023 +* @author (last) Sean Nash +* @date (last) 31-May-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -149,6 +149,7 @@ resetPreLoadStatus(); setVenousBubbleDetectionEnabled( FALSE ); setCurrentSubState( NO_SUB_STATE ); + clearNoRetriggerFlag(); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); @@ -200,13 +201,16 @@ handleDisinfectCancel( stop ); - // if no active alarms anymore, restore to default valve states for standby mode - if ( ( FALSE == doesAlarmStatusIndicateStop() ) && ( VALVE_POSITION_C_CLOSE == getValvePosition( VDI ) ) ) + if ( TRUE == getVenousBubbleDetectionEnabled() ) { - setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( VDO, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( VBA, VALVE_POSITION_A_INSERT_EJECT ); - setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); + // if no active alarms anymore, restore to default valve states for standby mode + if ( ( FALSE == doesAlarmStatusIndicateStop() ) && ( VALVE_POSITION_C_CLOSE == getValvePosition( VDI ) ) ) + { + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VDO, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBA, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); + } } // State machine to get DG to prep a reservoir so we can start a treatment @@ -369,18 +373,26 @@ switch ( action ) { case ALARM_ACTION_STOP: - // Pumps should be off - signalBloodPumpHardStop(); - signalDialInPumpHardStop(); - signalDialOutPumpHardStop(); - stopSyringePump(); + if ( isAlarmActive( ALARM_ID_HD_VENOUS_BUBBLE_DETECTED ) != TRUE ) + { + // no stop action in standby mode + } + // if Dialin enabled bubble detection, stop on venous bubble detection alarm + else + { + // Pumps should be off + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + stopSyringePump(); - // Set valves to safe positions - setValveAirTrap( STATE_CLOSED ); - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + // Set valves to safe positions + setValveAirTrap( STATE_CLOSED ); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + } break; default: Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -re5167d0700038c1faf8b689b844a905f20c0d3c6 -ra37189e75de205982befcc91176f33c0523b03a8 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a37189e75de205982befcc91176f33c0523b03a8) @@ -7,8 +7,8 @@ * * @file ModeTreatment.c * -* @author (last) Michael Garthwaite -* @date (last) 12-May-2023 +* @author (last) Dara Navaei +* @date (last) 03-Jun-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -1271,6 +1271,11 @@ result = TRUE; sendTreatmentLogEventData( BLOOD_FLOW_RATE_CHANGE_EVENT, getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), bloodRate ); sendTreatmentLogEventData( DIALYSATE_FLOW_RATE_CHANGE_EVENT, getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), dialRate ); + if ( ( bloodRate != (U32)getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ) ) || + ( dialRate != (U32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ) ) ) + { + signalUserRateChange(); + } // Set to new rates setTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW, bloodRate ); setTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW, dialRate ); @@ -1319,97 +1324,64 @@ BOOL verifyPressureLimitsChange( PRESSURE_LIMIT_CHANGE_REQUEST_T *data ) { BOOL result = TRUE; - CRITICAL_DATAS_T proposedNewArtLowLimit, proposedNewArtHighLimit; - CRITICAL_DATAS_T proposedNewVenLowLimit, proposedNewVenHighLimit; - PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord = { FALSE, 0, 0, 0, 0, 0 }; + CRITICAL_DATAS_T proposedNewArtLimitWindow; + CRITICAL_DATAS_T proposedNewVenLimitWindow; + CRITICAL_DATAS_T proposedNewVenLimitAsymmetric; + PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord = { FALSE, 0, 0, 0 }; - proposedNewArtLowLimit.sInt = data->artLowLimit; - proposedNewArtHighLimit.sInt = data->artHighLimit; - proposedNewVenLowLimit.sInt = data->venLowLimit; - proposedNewVenHighLimit.sInt = data->venHighLimit; + proposedNewArtLimitWindow.sInt = data->artPresLimitWindowmmHg; + proposedNewVenLimitWindow.sInt = data->venPresLimitWindowmmHg; + proposedNewVenLimitAsymmetric.sInt = data->venPresLimitAsymmetricmmHg; // Check ranges for changed limits - if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT, proposedNewArtLowLimit ) ) + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW, proposedNewArtLimitWindow ) ) { respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; result = FALSE; } - if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT, proposedNewArtHighLimit ) ) + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW, proposedNewVenLimitWindow ) ) { respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; result = FALSE; } - if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT, proposedNewVenLowLimit ) ) + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC, proposedNewVenLimitAsymmetric ) ) { respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; result = FALSE; } - if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT, proposedNewVenHighLimit ) ) - { - respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; - result = FALSE; - } - // If ranges ok, check separation between low/high limits - if ( TRUE == result ) - { - S32 arterialPresLimitDelta = data->artHighLimit - data->artLowLimit; - S32 venousPresLimitDelta = data->venHighLimit - data->venLowLimit; - - // Check arterial alarm limits dependency - if ( arterialPresLimitDelta < MIN_PRESSURE_ALARM_LIMIT_DELTA_MMHG ) - { - respRecord.rejReasonCode = REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH; - result = FALSE; - } - - // Check venous alarm limits dependency - if ( venousPresLimitDelta < MIN_PRESSURE_ALARM_LIMIT_DELTA_MMHG ) - { - respRecord.rejReasonCode = REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH; - result = FALSE; - } - } - // Set overall result - are changes accepted? respRecord.accepted = result; // If changes accepted, set new pressure limits if ( TRUE == result ) { - S32 const artLowLimit = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ); - S32 const artHighLimit = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ); - S32 const venLowLimit = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ); - S32 const venHighLimit = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ); + S32 artLimitWindow = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); + S32 venLimitWindow = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); + S32 venLimitAsymmetric = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); - setTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT, data->artLowLimit ); - setTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT, data->artHighLimit ); - setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT, data->venLowLimit ); - setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT, data->venHighLimit ); + setTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW, data->artPresLimitWindowmmHg ); + setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW, data->venPresLimitWindowmmHg ); + setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC, data->venPresLimitAsymmetricmmHg ); - if ( abs( artLowLimit - data->artLowLimit ) > 0 ) + if ( abs( artLimitWindow - data->artPresLimitWindowmmHg ) > 0 ) { - sendTreatmentLogEventData( ARTERIAL_PRESSURE_LOWER_LIMIT_CHANGE_EVENT, (F32)artLowLimit, (F32)data->artLowLimit ); + sendTreatmentLogEventData( ARTERIAL_PRESSURE_LIMIT_WINDOW_CHANGE_EVENT, (F32)artLimitWindow, (F32)data->artPresLimitWindowmmHg ); } - if ( abs( artHighLimit - data->artHighLimit ) > 0 ) + if ( abs( venLimitWindow - data->venPresLimitWindowmmHg ) > 0 ) { - sendTreatmentLogEventData( ARTERIAL_PRESSURE_UPPER_LIMIT_CHANGE_EVENT, (F32)artHighLimit, (F32)data->artHighLimit ); + sendTreatmentLogEventData( VENOUS_PRESSURE_LIMIT_WINDOW_CHANGE_EVENT, (F32)venLimitWindow, (F32)data->venPresLimitWindowmmHg ); } - if ( abs( venLowLimit - data->venLowLimit ) > 0 ) + if ( abs( venLimitAsymmetric - data->venPresLimitAsymmetricmmHg ) > 0 ) { - sendTreatmentLogEventData( VENOUS_PRESSURE_LOWER_LIMIT_CHANGE_EVENT, (F32)venLowLimit, (F32)data->venLowLimit ); + sendTreatmentLogEventData( VENOUS_PRESSURE_LIMIT_ASYM_CHANGE_EVENT, (F32)venLimitAsymmetric, (F32)data->venPresLimitAsymmetricmmHg ); } - if ( abs( venHighLimit - data->venHighLimit ) > 0 ) - { - sendTreatmentLogEventData( VENOUS_PRESSURE_UPPER_LIMIT_CHANGE_EVENT, (F32)venHighLimit, (F32)data->venHighLimit ); - } } // Read back limits for transmit to UI. - respRecord.artLowLimit = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ); - respRecord.artHighLimit = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ); - respRecord.venLowLimit = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ); - respRecord.venHighLimit = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ); + respRecord.artPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitWindowmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ); + respRecord.venPresLimitAsymmetricmmHg = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); // Send response sendPressureLimitsChangeResponse( &respRecord ); @@ -1589,13 +1561,10 @@ { U32 treatmentTime = MIN_TREATMENT_TIME_MINUTES; -#ifndef _RELEASE_ - // Check if the 1 minute treatment software configuration has not been enabled - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_1_MIN_TREATMENT ) ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_ENABLE_ONE_MINUTE_TREATMENT ) ) { treatmentTime = 1; } -#endif return treatmentTime; } Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -re5167d0700038c1faf8b689b844a905f20c0d3c6 -ra37189e75de205982befcc91176f33c0523b03a8 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision e5167d0700038c1faf8b689b844a905f20c0d3c6) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision a37189e75de205982befcc91176f33c0523b03a8) @@ -8,7 +8,7 @@ * @file OperationModes.c * * @author (last) Michael Garthwaite -* @date (last) 16-May-2023 +* @date (last) 01-Jun-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -61,7 +61,8 @@ static HD_OP_MODE_T currentMode; ///< Current operation mode. static U32 currentSubMode; ///< The currently active state of the active mode. static U32 broadcastModeIntervalCtr; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. -static U32 currentSubState; +static U32 currentSubState; ///< current sub state. +static U32 current4thLevelState; ///< current 4th level state. /// Interval (in task intervals) at which to publish operation mode data to CAN bus. static OVERRIDE_U32_T opModePublishInterval = { BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, 0 }; /// Local structure init for saving confirmation requests @@ -75,7 +76,7 @@ static const HD_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_MODES - 1 ][ NUM_OF_MODES - 1 ] = { // From to-> FAULT SERVICE INIT STANBY TRT.PARAMS PRE-TREAT TREATMENT POST_TREA /* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, -/* SERV */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* SERV */{ MODE_NLEG, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, /* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, /* STAN */{ MODE_FAUL, MODE_SERV, MODE_INIT, MODE_STAN, MODE_TPAR, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, /* TPAR */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_TPAR, MODE_PRET, MODE_NLEG, MODE_NLEG, }, @@ -112,7 +113,8 @@ lastMode = MODE_INIT; currentMode = MODE_INIT; currentSubMode = 0; - currentSubState = 0xFF; + currentSubState = NO_SUB_STATE; + current4thLevelState = NO_SUB_STATE; broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; transitionToNewOperationMode( MODE_INIT ); @@ -141,6 +143,7 @@ U32 priorSubMode = currentSubMode; U32 priorSubState = currentSubState; U32 priorOpMode = (U32)currentMode; + U32 prior4thLevelState = current4thLevelState; // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests @@ -219,7 +222,8 @@ } // End switch // Send operation status event when appropriate - if ( priorOpMode != currentMode || priorSubMode != currentSubMode || priorSubState != currentSubState ) + if ( priorOpMode != currentMode || priorSubMode != currentSubMode || + priorSubState != currentSubState || prior4thLevelState != current4thLevelState ) { sendOperationStatusEvent(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_MODE_CHANGE, priorSubMode, currentSubMode ) @@ -444,9 +448,9 @@ * @details Outputs: confirmRequests[] status updated if timeout. * @return none *************************************************************************/ -void updateConfirmationRequestTimeouts( void ) +static void updateConfirmationRequestTimeouts( void ) { - U08 i; + U32 i; for ( i = 0; i < MAX_PENDING_CONFIRM_REQUESTS; i++ ) { @@ -465,22 +469,22 @@ * The getConfirmationRequestStatus function returns the status of a confirmation request * @details Inputs: confirmRequests[] * @details Outputs: confirmRequests[] consumed/cleared if completed. - * @param request_id ID of confirmation being requested + * @param requestID ID of confirmation being requested * @return Status of given confirmation *************************************************************************/ -CONFIRMATION_REQUEST_STATUS_T getConfirmationRequestStatus( GENERIC_CONFIRM_ID_T request_id ) +CONFIRMATION_REQUEST_STATUS_T getConfirmationRequestStatus( GENERIC_CONFIRM_ID_T requestID ) { - U08 i; + BOOL pending = FALSE; + U32 pendingIndex = 0; CONFIRMATION_REQUEST_STATUS_T status = CONFIRMATION_REQUEST_STATUS_PENDING; - BOOL pending = FALSE; - U08 pending_index = 0; + U32 i; for ( i = 0; i < MAX_PENDING_CONFIRM_REQUESTS; i++ ) { - if ( confirmRequests[ i ].requestID == request_id ) + if ( confirmRequests[ i ].requestID == requestID ) { status = confirmRequests[ i ].status; - if ( CONFIRMATION_REQUEST_STATUS_PENDING != status ) + if ( status != CONFIRMATION_REQUEST_STATUS_PENDING ) { // Send UI clear if ( CONFIRMATION_REQUEST_STATUS_TIMEOUT == status ) @@ -504,23 +508,23 @@ if ( TRUE == pending ) { // Is this newer than other pending request? - if ( confirmRequests[ i ].timeStamp > confirmRequests[ pending_index ].timeStamp ) + if ( confirmRequests[ i ].timeStamp > confirmRequests[ pendingIndex ].timeStamp ) { - pending_index = i; - pending = TRUE; + pendingIndex = i; } } else { - pending_index = i; + pendingIndex = i; pending = TRUE; } } } + if ( ( CONFIRMATION_REQUEST_STATUS_PENDING != status ) && ( TRUE == pending ) ) { // Last confirmation cleared, pending request must be resent to UI - sendConfirmationRequest( confirmRequests[ pending_index ].requestID, confirmRequests[ pending_index ].requestType, 0 ); + sendConfirmationRequest( confirmRequests[ pendingIndex ].requestID, confirmRequests[ pendingIndex ].requestType, 0 ); } return status; @@ -531,17 +535,17 @@ * The setConfirmationRequestStatus function sets the status of a confirmation request * @details Inputs: confirmRequests[] * @details Outputs: confirmRequests[]. - * @param request_id ID of confirmation being requested + * @param requestID ID of confirmation being requested * @param status Status to set for given confirmation (open, close, reject) * @return none *************************************************************************/ -void setConfirmationRequestStatus( GENERIC_CONFIRM_ID_T request_id, CONFIRMATION_REQUEST_STATUS_T status ) +void setConfirmationRequestStatus( GENERIC_CONFIRM_ID_T requestID, CONFIRMATION_REQUEST_STATUS_T status ) { - U08 i; + U32 i; for ( i = 0; i < MAX_PENDING_CONFIRM_REQUESTS; i++ ) { - if ( confirmRequests[ i ].requestID == request_id ) + if ( confirmRequests[ i ].requestID == requestID ) { confirmRequests[ i ].status = status; break; @@ -554,32 +558,32 @@ * The addConfirmationRequest function sends a confirmation request to UI * @details Inputs: confirmRequests[] * @details Outputs: confirmRequests[] new added. - * @param request_id ID of confirmation being requested - * @param request_type Type of confirmation being requested (open, close, reject) - * @param reject_Reason Reason for reject if type is reject + * @param requestID ID of confirmation being requested + * @param requestType Type of confirmation being requested (open, close, reject) + * @param rejectReason Reason for reject if type is reject * @return request ID - will be non-zero if added *************************************************************************/ -GENERIC_CONFIRM_ID_T addConfirmationRequest( GENERIC_CONFIRM_ID_T request_id, GENERIC_CONFIRM_COMMAND_T request_type, U32 reject_reason ) +GENERIC_CONFIRM_ID_T addConfirmationRequest( GENERIC_CONFIRM_ID_T requestID, GENERIC_CONFIRM_COMMAND_T requestType, U32 rejectReason ) { - U08 i; - GENERIC_CONFIRM_ID_T new_id = GENERIC_CONFIRM_ID_NONE; + U32 i; + GENERIC_CONFIRM_ID_T newID = GENERIC_CONFIRM_ID_NONE; for ( i = 0; i < MAX_PENDING_CONFIRM_REQUESTS; i++ ) { if ( CONFIRMATION_REQUEST_STATUS_UNUSED == confirmRequests[ i ].status ) { // Save the confirmation request info - confirmRequests[ i ].requestID = request_id; - confirmRequests[ i ].requestType = request_type; + confirmRequests[ i ].requestID = requestID; + confirmRequests[ i ].requestType = requestType; confirmRequests[ i ].timeStamp = getMSTimerCount(); confirmRequests[ i ].status = CONFIRMATION_REQUEST_STATUS_PENDING; - new_id = request_id; - sendConfirmationRequest( request_id, request_type, reject_reason ); + newID = requestID; + sendConfirmationRequest( requestID, requestType, rejectReason ); break; } } - return new_id; + return newID; } /*********************************************************************//** @@ -597,9 +601,22 @@ /*********************************************************************//** * @brief + * The setCurrent4thLevelState function sets the current 4th level state. + * @details Inputs: state + * @details Outputs: current4thLevelState + * @param subState the enumerated sub state. + * @return none + *************************************************************************/ +void setCurrent4thLevelState( U32 state ) +{ + current4thLevelState = state; +} + +/*********************************************************************//** + * @brief * The sendOperationStatusEvent function constructs and sends an HD operation * status event. - * @details Inputs: currentMode, currentSubMode, currentSubState + * @details Inputs: currentMode, currentSubMode, currentSubState, current4thLevelState * @details Outputs: dat1, dat2. * @param none * @return none @@ -610,7 +627,8 @@ EVENT_DATA_T dat2; U32 opData = ( (U08)currentMode + ( (U08)currentSubMode << SHIFT_8_BITS_FOR_BYTE_SHIFT ) + - ( (U08)currentSubState << SHIFT_16_BITS_FOR_WORD_SHIFT ) ); + ( (U08)currentSubState << SHIFT_16_BITS_FOR_WORD_SHIFT ) + + ( (U08)current4thLevelState << SHIFT_24_BITS ) ); dat2.dataType = EVENT_DATA_TYPE_U32; dat2.data.uInt.data = 0; Index: firmware/App/Modes/Prime.c =================================================================== diff -u -ra6308f42594f03f4ef666cc858fd5432ad7ea63d -ra37189e75de205982befcc91176f33c0523b03a8 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision a6308f42594f03f4ef666cc858fd5432ad7ea63d) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision a37189e75de205982befcc91176f33c0523b03a8) @@ -7,8 +7,8 @@ * * @file Prime.c * -* @author (last) Michael Garthwaite -* @date (last) 16-May-2023 +* @author (last) Sean Nash +* @date (last) 03-Jun-2023 * * @author (original) Quang Nguyen * @date (original) 08-Dec-2020 @@ -62,7 +62,8 @@ #define PRIME_DIALYSATE_BYPASS_TIME_LIMIT ( 8 * MS_PER_SECOND ) ///< Time limit for priming dialysate bypass circuit. #define STEADY_VOLUME_COUNT_SEC ( 10000 / LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ///< Counter must be greater than 10 seconds before steady volume is true. #define STEADY_VOLUME_DIALYSATE_PRIME_TIME_LIMIT_MS ( 55 * MS_PER_SECOND ) ///< Time in msec for the reservoir volume to stabilize during dialysate prime state. -#define STEADY_VOLUME_BYPASS_PRIME_TIME_LIMIT_MS ( 25 * MS_PER_SECOND ) ///< Time in msec for the reservoir volume to stabilize during bypass dialysate prime state. +#define STEADY_VOLUME_BYPASS_PRIME_TIME_LIMIT_MS ( 62 * MS_PER_SECOND ) ///< Time in msec for the reservoir volume to stabilize during bypass dialysate prime state. +#define STEADY_VOLUME_BYPASS_PRIME_HISTERESIS_ML ( 0.3F ) ///< mL of histeresis for the steady state check that determines when bypass line is primed. #define VENOUS_PRESSURE_BUBBLE_CLEAR_MAX_MMHG ( 200.0F ) ///< Maximum venous pressure reading (in mmHg) for bubble clear. #define BUBBLE_CLEAR_WAIT_TIME_INITIAL_MS ( 10 * MS_PER_SECOND ) ///< Time in msec to wait for initial bubble clear pressure. @@ -933,7 +934,7 @@ { F32 const currentReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); - if ( currentReservoirVolume >= minimumReservoirVolume ) + if ( currentReservoirVolume >= ( minimumReservoirVolume - STEADY_VOLUME_BYPASS_PRIME_HISTERESIS_ML ) ) { if ( ++steadyVolumeCount >= STEADY_VOLUME_COUNT_SEC ) { @@ -943,9 +944,12 @@ } else { - minimumReservoirVolume = currentReservoirVolume; steadyVolumeCount = 0; } + if ( currentReservoirVolume < minimumReservoirVolume ) + { + minimumReservoirVolume = currentReservoirVolume; + } steadyVolumeSamplingStartTime = getMSTimerCount(); // re-armed the timer for the next 1 second iteration } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r5c3d2c3b1f54008cfdf8fb66ed73f1a8015d9b51 -ra37189e75de205982befcc91176f33c0523b03a8 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5c3d2c3b1f54008cfdf8fb66ed73f1a8015d9b51) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a37189e75de205982befcc91176f33c0523b03a8) @@ -7,8 +7,8 @@ * * @file SystemCommMessages.c * -* @author (last) Dara Navaei -* @date (last) 20-May-2023 +* @author (last) Sean Nash +* @date (last) 01-Jun-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -1867,6 +1867,7 @@ payload.alarmsFlags |= ( almStatus.alarmsToEscalate ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_ALARMS_TO_ESCALATE) : 0 ); payload.alarmsFlags |= ( almStatus.alarmsSilenced ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_ALARMS_SILENCED) : 0 ); payload.alarmsFlags |= ( almStatus.lampOn ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_LAMP_ON) : 0 ); + payload.alarmsFlags |= ( almStatus.noReTrigger ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_NO_RETRIGGER) : 0 ); payload.alarmsFlags |= ( almStatus.noBloodRecirc ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_BLOOD_RECIRC) : 0 ); payload.alarmsFlags |= ( almStatus.noDialRecirc ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_DIALYSATE_RECIRC) : 0 ); payload.alarmsFlags |= ( almStatus.noMinimize ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_NO_MINIMIZE) : 0 ); @@ -3366,16 +3367,16 @@ * The sendConfirmationRequest function sends a confirmation request to UI * @details Inputs: none * @details Outputs: none - * @param request_id ID of confirmation being requested - * @param request_type Type of confirmation being requested - * @param reject_reason Reason Reason for reject if type is reject + * @param requestID ID of confirmation being requested + * @param requestType Type of confirmation being requested + * @param rejectReason Reason Reason for reject if type is reject * @return none *************************************************************************/ -void sendConfirmationRequest( GENERIC_CONFIRM_ID_T request_id, GENERIC_CONFIRM_COMMAND_T request_type, U32 reject_reason ) +void sendConfirmationRequest( GENERIC_CONFIRM_ID_T requestID, GENERIC_CONFIRM_COMMAND_T requestType, U32 rejectReason ) { MESSAGE_T msg; U08 *payloadPtr = msg.payload; - U32 temp_request = request_id; + U32 temp_request = requestID; // Create a message record blankMessage( &msg ); @@ -3385,13 +3386,13 @@ memcpy( payloadPtr, &temp_request, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); - temp_request = request_type; + temp_request = requestType; memcpy( payloadPtr, &temp_request, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &reject_reason, sizeof( U32 ) ); + memcpy( payloadPtr, &rejectReason, sizeof( U32 ) ); // 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_HD_2_UI, ACK_NOT_REQUIRED ); + serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); } /*********************************************************************//**