Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r4ac6a67ab2876d1f436704fe67a958e17d0b432a -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 4ac6a67ab2876d1f436704fe67a958e17d0b432a) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -721,7 +721,7 @@ updateUFVolumes(); // If we have reached target UF volume, UF is complete - if ( measUFVolume >= maxUFVolumeML ) + if ( refUFVolume >= maxUFVolumeML ) { result = UF_COMPLETED_STATE; } Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r4ac6a67ab2876d1f436704fe67a958e17d0b432a -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 4ac6a67ab2876d1f436704fe67a958e17d0b432a) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -82,7 +82,6 @@ static U32 treatmentStateBroadcastTimerCtr; ///< Treatment state data broadcast timer counter used to schedule when to transmit data. static U32 treatmentParamsRangesBroadcastTimerCtr; ///< Treatment parameter ranges broadcast timer counter used to schedule when to transmit updated ranges. -static BOOL alarmStopSignalled; ///< Flag indicates an alarm w/ stop property was triggered. static BOOL resumeTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment resume. static BOOL initiateRinsebackAlarmResponseRequest; ///< Flag indicates user has requested rinseback. static BOOL endTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment end. @@ -137,6 +136,7 @@ presUFRate = 0.0; resetSignalFlags(); + resetAlarmSignalFlags(); pendingParamChangesTimer = 0; pendingUFVolumeChange = 0.0; @@ -169,7 +169,6 @@ *************************************************************************/ static void resetAlarmSignalFlags( void ) { - alarmStopSignalled = FALSE; resumeTreatmentAlarmResponseRequest = FALSE; initiateRinsebackAlarmResponseRequest = FALSE; endTreatmentAlarmResponseRequest = FALSE; @@ -280,7 +279,7 @@ switch( action ) { case ALARM_ACTION_STOP: - alarmStopSignalled = TRUE; + // Stop signal actively polled by mode/sub-mode/state break; case ALARM_ACTION_RESUME: @@ -479,8 +478,8 @@ setRinsebackIsCompleted( FALSE ); - // Handle alarm signals - if ( TRUE == alarmStopSignalled ) + // Handle alarm stoppage + if ( TRUE == doesAlarmStatusIndicateStop() ) { transitionToTreatmentStop(); result = TREATMENT_STOP_STATE; @@ -518,37 +517,33 @@ U32 newTime = getMSTimerCount(); U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); - // Handle alarm signals - if ( TRUE == alarmStopSignalled ) + // Update treatment time (unless delivering a saline bolus) + if ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) { + treatmentTimeMS += msSinceLast; + } + lastTreatmentTimeStamp = newTime; + + // End treatment if treatment duration has been reached + if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) + { stopDialysis(); - transitionToTreatmentStop(); - result = TREATMENT_STOP_STATE; + transitionToTreatmentEnd(); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_END_OF_DIALYSIS_TREATMENT_WARNING, presTreatmentTimeSecs ); + result = TREATMENT_END_STATE; } - // Execute dialysis sub-mode + // Otherwise, execute state machine for treatment dialysis sub-mode else { - // Update treatment time (unless delivering a saline bolus) - if ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) + execTreatmentReservoirMgmt(); + execDialysis(); + // Handle alarm stoppage + if ( TRUE == doesAlarmStatusIndicateStop() ) { - treatmentTimeMS += msSinceLast; - } - lastTreatmentTimeStamp = newTime; - - // End treatment if treatment duration has been reached - if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) - { stopDialysis(); - transitionToTreatmentEnd(); - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_END_OF_DIALYSIS_TREATMENT_WARNING, presTreatmentTimeSecs ); - result = TREATMENT_END_STATE; + transitionToTreatmentStop(); + result = TREATMENT_STOP_STATE; } - // Otherwise, execute state machine for treatment dialysis sub-mode - else - { - execTreatmentReservoirMgmt(); - execDialysis(); - } } return result; @@ -614,8 +609,8 @@ { TREATMENT_STATE_T result = TREATMENT_RINSEBACK_STATE; - // Handle alarm signals - if ( TRUE == alarmStopSignalled ) + // Handle alarm stoppage + if ( TRUE == doesAlarmStatusIndicateStop() ) { signalStopRinseback(); } @@ -655,8 +650,8 @@ { TREATMENT_STATE_T result = TREATMENT_RECIRC_STATE; - // Handle alarm signals - if ( TRUE == alarmStopSignalled ) + // Handle alarm stoppage + if ( TRUE == doesAlarmStatusIndicateStop() ) { signalStopTreatmentRecirc(); } @@ -691,8 +686,8 @@ { TREATMENT_STATE_T result = TREATMENT_END_STATE; - // Handle alarm user response signals - forward to treatment end sub-mode - if ( TRUE == alarmStopSignalled ) + // Handle alarm stoppage + if ( TRUE == doesAlarmStatusIndicateStop() ) { signalStopTreatmentEnd(); } @@ -1211,3 +1206,36 @@ treatmentParamsRangesBroadcastTimerCtr = 0; } } + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetTreatmentTimeRemainingOverride function overrides the + * treatment time remaining. + * @details Inputs: presTreatmentTimeSecs, currentTreatmentState + * @details Outputs: treatmentTimeMS + * @param value override treatment time remaining overridden to this (in sec) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetTreatmentTimeRemainingOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( ( TRUE == isTestingActivated() ) && ( value < presTreatmentTimeSecs ) ) + { + if ( ( MODE_TREA == getCurrentOperationMode() ) && ( currentTreatmentState < TREATMENT_END_STATE ) ) + { + result = TRUE; + treatmentTimeMS = ( presTreatmentTimeSecs - value ) * MS_PER_SECOND; + } + } + + return result; +} + +/**@}*/ Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -rc46815918e7cf33e8736f180094843758f1e21b2 -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision c46815918e7cf33e8736f180094843758f1e21b2) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -106,6 +106,8 @@ BOOL verifyBloodAndDialysateRateSettingsChange( U32 bloodRate, U32 dialRate ); BOOL verifyPressureLimitsChange( PRESSURE_LIMIT_CHANGE_REQUEST_T *data ); +BOOL testSetTreatmentTimeRemainingOverride( U32 value ); + /**@}*/ #endif Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -561,6 +561,19 @@ /*********************************************************************//** * @brief + * The doesAlarmStatusIndicateStop function determines whether any currently + * active alarm has stop property. + * @details Inputs: alarmStatus + * @details Outputs: none + * @return TRUE if any active alarm has stop property, FALSE if not + *************************************************************************/ +BOOL doesAlarmStatusIndicateStop( void ) +{ + return alarmStatus.stop; +} + +/*********************************************************************//** + * @brief * The getCurrentAlarmStatePriority function determines the current alarm * state priority (NONE, LOW, MEDIUM, or HIGH). * @details Inputs: alarmStatus Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -263,6 +263,7 @@ BOOL isAlarmActive( ALARM_ID_T alarm ); BOOL isAnyAlarmActive( void ); BOOL isDialysateRecircBlocked( void ); +BOOL doesAlarmStatusIndicateStop( void ); ALARM_PRIORITY_T getCurrentAlarmStatePriority( void ); BOOL isAlarmRecoverable( ALARM_ID_T alarm ); void setAlarmAudioVolume( U32 volumeLevel ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r8000e5d68a7a0ed6d1b43d8e6778a246ff0d8e72 -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8000e5d68a7a0ed6d1b43d8e6778a246ff0d8e72) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -1263,6 +1263,10 @@ case MSG_ID_BLOOD_FLOW_SEND_INTERVAL_OVERRIDE: handleTestBloodFlowBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_TREATMENT_TIME_REMAINING_OVERRIDE: + handleTestTreatmentTimeRemainingOverrideRequest( message ); break; case MSG_ID_BLOOD_PUMP_MEAS_SPEED_OVERRIDE: @@ -1377,18 +1381,6 @@ handleTestHDAccelBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_HD_ACCEL_SET_CALIBRATION: - handleSetAccelCalibration( message ); - break; - - case MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION: - handleSetBloodFlowCalibration( message ); - break; - - case MSG_ID_HD_DIALYSATE_FLOW_SET_CALIBRATION: - handleSetDialysateFlowCalibration( message ); - break; - case MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE: handleTestDialOutFlowSetPointOverrideRequest( message ); break; @@ -1455,14 +1447,6 @@ handleTestSuperClearAlarmsRequest( message ); break; - case MSG_ID_HD_REQUEST_CALIBRATION_DATA: - handleTestHDCalibrationDataRequest( message ); - break; - - case MSG_ID_HD_ERASE_CALIBRATION_DATA: - handleTestEraseHDCalibrationDataRequest( message ); - break; - default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r3e1c314fa6d5254fa0dca9d41a41416666549f4e -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3e1c314fa6d5254fa0dca9d41a41416666549f4e) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -363,8 +363,8 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_2_UI, ACK_REQUIRED ); return result; -} - +} + /*********************************************************************//** * @brief * The sendChangeBloodDialysateRateChangeResponse function constructs a change @@ -1976,7 +1976,7 @@ sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); } } - + /*********************************************************************//** * @brief * The handleChangeBloodDialysateRateChangeRequest function handles a blood @@ -2254,7 +2254,7 @@ // Create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_HD_RECIRC_CMD_RESPONSE; + msg.hdr.msgID = MSG_ID_HD_TX_END_CMD_RESPONSE; msg.hdr.payloadLen = sizeof( BOOL ) + sizeof( U32 ); memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); @@ -3645,6 +3645,31 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleTestTreatmentTimeRemainingOverrideRequest function handles a treatment + * time remaining override request message. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestTreatmentTimeRemainingOverrideRequest( MESSAGE_T *message ) +{ + U32 payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(U32) ); + result = testSetTreatmentTimeRemainingOverride( payload ); + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /*********************************************************************//** * @brief * The handleTestHDSafetyShutdownOverrideRequest function handles a @@ -3773,84 +3798,6 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } -/*********************************************************************//** - * @brief - * The handleSetAccelCalibration function handles a request to set - * accelerometer calibration factors. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleSetAccelCalibration( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // Verify payload length - if ( message->hdr.payloadLen == sizeof(ACCEL_CAL_PAYLOAD_T) ) - { - ACCEL_CAL_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(ACCEL_CAL_PAYLOAD_T) ); - result = setAccelCalibration( payload.xOffset, payload.yOffset, payload.zOffset ); - } - - // Respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** - * @brief - * The handleSetBloodFlowCalibration function handles a request to set - * blood flow calibration factors. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleSetBloodFlowCalibration( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // Verify payload length - if ( message->hdr.payloadLen == sizeof(LINEAR_F32_CAL_PAYLOAD_T) ) - { - LINEAR_F32_CAL_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(LINEAR_F32_CAL_PAYLOAD_T) ); - result = setBloodFlowCalibration( payload.gain, payload.offset ); - } - - // Respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** - * @brief - * The handleSetDialysateFlowCalibration function handles a request to set - * dialysate flow calibration factors. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleSetDialysateFlowCalibration( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // Verify payload length - if ( message->hdr.payloadLen == sizeof(LINEAR_F32_CAL_PAYLOAD_T) ) - { - LINEAR_F32_CAL_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(LINEAR_F32_CAL_PAYLOAD_T) ); - result = setDialInFlowCalibration( payload.gain, payload.offset ); - } - - // Respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - /************************************************************************* * @brief * The handleTestSetTreatmentParameter function handles a request to set @@ -4220,71 +4167,4 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } -/*********************************************************************//** - * @brief - * The handleTestHDCalibrationDataRequest function handles a request for - * HD calibration data. - * @details - * Inputs : none - * Outputs : message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleTestHDCalibrationDataRequest( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - if ( 0 == message->hdr.payloadLen ) - { - CALIBRATION_DATA_T cal; - MESSAGE_T msg; - U08 *payloadPtr = msg.payload; - - // Get calibration data - result = getCalibrationData( &cal ); - if ( TRUE == result ) - { - // Create a message record - blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_HD_CALIBRATION_DATA; - msg.hdr.payloadLen = sizeof( CALIBRATION_DATA_T ); - - memcpy( payloadPtr, &cal, sizeof( CALIBRATION_DATA_T ) ); - - // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer - result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); - } - } - - // Respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** - * @brief - * The handleTestEraseHDCalibrationDataRequest function handles a request for - * HD calibration data erasure. - * @details - * Inputs : none - * Outputs : message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleTestEraseHDCalibrationDataRequest( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - if ( message->hdr.payloadLen == sizeof(U32) ) - { - U32 key; - - memcpy( &key, message->payload, sizeof(U32) ); - - result = testResetCalibrationData( key ); - } - - // Respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rf66a94fdd645d2146e828fd760960849d1ac05c6 -r161a56481d1a194704b63a5fd55d4c5583fa94df --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision f66a94fdd645d2146e828fd760960849d1ac05c6) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 161a56481d1a194704b63a5fd55d4c5583fa94df) @@ -137,9 +137,12 @@ // MSG_ID_USER_TREATMENT_TIME_CHANGE_RESPONSE BOOL sendChangeTreatmentDurationResponse( BOOL accepted, U32 reason, U32 time_min, F32 volume_mL ); +// MSG_ID_TREATMENT_TIME_REMAINING_OVERRIDE: +void handleTestTreatmentTimeRemainingOverrideRequest( MESSAGE_T *message ); + // MSG_ID_TREATMENT_PARAM_CHANGE_RANGES BOOL sendTreatmentParamsRangesToUI( U32 minTime, U32 maxTime, F32 minUFVol, F32 maxUFVol, U32 minDialRate, U32 maxDialRate ); - + // MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ); @@ -405,15 +408,6 @@ // MSG_ID_HD_ACCEL_SEND_INTERVAL_OVERRIDE: void handleTestHDAccelBroadcastIntervalOverrideRequest( MESSAGE_T *message ); -// MSG_ID_HD_ACCEL_SET_CALIBRATION: -void handleSetAccelCalibration( MESSAGE_T *message ); - -// MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION: -void handleSetBloodFlowCalibration( MESSAGE_T *message ); - -// MSG_ID_HD_DIALYSATE_FLOW_SET_CALIBRATION: -void handleSetDialysateFlowCalibration( MESSAGE_T *message ); - // MSG_ID_HD_SET_PARAMETER_TREATMENT_PARAMETER void handleTestSetTreatmentParameter( MESSAGE_T *message ); @@ -458,12 +452,6 @@ // MSG_ID_SUPER_CLEAR_ALARMS_CMD void handleTestSuperClearAlarmsRequest( MESSAGE_T *message ); -// MSG_ID_HD_REQUEST_CALIBRATION_DATA -void handleTestHDCalibrationDataRequest( MESSAGE_T *message ); - -// MSG_ID_HD_ERASE_CALIBRATION_DATA -void handleTestEraseHDCalibrationDataRequest( MESSAGE_T *message ); - /**@}*/ #endif