Index: firmware/.cproject =================================================================== diff -u -r7478d513d7493d08484a880f5cd6c296c9616e70 -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/.cproject (.../.cproject) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) +++ firmware/.cproject (.../.cproject) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -15,7 +15,7 @@ - + Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r7138d8ca7496d3ee0f788ea1d9a34bb47e45da6e -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 7138d8ca7496d3ee0f788ea1d9a34bb47e45da6e) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -1188,11 +1188,11 @@ /*********************************************************************//** * @brief * The testSetMeasuredDialOutPumpMCCurrentOverride function overrides the measured \n - * dialIn pump motor current. + * dialOut pump motor current. * @details * Inputs : dialOutPumpMCCurrentmA * Outputs : dialOutPumpMCCurrentmA - * @param value : override measured dialIn pump current (in mA) + * @param value : override measured dialOut pump current (in mA) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetMeasuredDialOutPumpMCCurrentOverride( F32 value ) @@ -1212,7 +1212,7 @@ /*********************************************************************//** * @brief * The testResetMeasuredDialOutPumpMCCurrentOverride function resets the override of the \n - * measured dialIn pump motor current. + * measured dialOut pump motor current. * @details * Inputs : dialOutPumpMCCurrentmA * Outputs : dialOutPumpMCCurrentmA Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r7478d513d7493d08484a880f5cd6c296c9616e70 -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -47,7 +47,8 @@ #define USER_CONFIRM_CHANGE_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Require user to confirm UF volume change within this time. #define PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ( 10 * SEC_PER_MIN ) ///< Prevent UF volume change if treatment within this much time from end of treatment (in seconds). -#define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the treatment time & state data is published on the CAN bus +#define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the treatment time & state data is published on the CAN bus. +#define TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which updated, valid treatment setting ranges are published on the CAN bus. #define CALC_ELAPSED_TREAT_TIME_IN_SECS() ( treatmentTimeMS / MS_PER_SECOND ) ///< Macro to calculate the elapsed treatment time in seconds. #define CALC_ELAPSED_TREAT_TIME_IN_MIN() ( ( treatmentTimeMS / MS_PER_SECOND ) / SEC_PER_MIN ) ///< Macro to calculate the elapsed treatment time in minutes. @@ -66,6 +67,7 @@ static U32 treatmentTimeMS; ///< Elapsed treatment time (in ms). static U32 lastTreatmentTimeStamp; ///< Last time elapsed treatment time was recorded (a timestamp in ms). static U32 treatmentTimeBroadcastTimerCtr; ///< Treatment 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 BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; // TODO - test code - remove later @@ -76,6 +78,8 @@ // ********** private function prototypes ********** +static void broadcastTreatmentTimeAndState( void ); +static void broadcastTreatmentSettingsRanges( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentDialysisState( void ); static TREATMENT_STATE_T handleTreatmentStopState( void ); @@ -96,6 +100,7 @@ treatmentTimeMS = 0; lastTreatmentTimeStamp = 0; treatmentTimeBroadcastTimerCtr = 0; + treatmentParamsRangesBroadcastTimerCtr = 0; presTreatmentTimeSecs = 0; presBloodFlowRate = 0; @@ -161,8 +166,6 @@ *************************************************************************/ void execTreatmentMode( void ) { - U32 elapsedTreatmentTimeInSecs; - #ifndef UF_TEST_ENABLED BOOL stop = isStopButtonPressed(); @@ -225,26 +228,8 @@ break; } - // update treatment time stats and broadcast - end treatment if time - elapsedTreatmentTimeInSecs = treatmentTimeMS / MS_PER_SECOND; - if ( elapsedTreatmentTimeInSecs >= presTreatmentTimeSecs ) - { - stopDialysis(); - elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; - currentTreatmentState = TREATMENT_DIALYSIS_END_STATE; - } - // broadcast treatment time and state data at interval - if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) - { - U32 timeRemaining = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; - DIALYSIS_STATE_T dialysisState = getDialysisState(); - UF_STATE_T uFState = getUltrafiltrationState(); - BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SOLUTION_INFUSION_STATE ? TRUE : FALSE ); - - broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, timeRemaining ); - broadcastTreatmentState( currentTreatmentState, uFState, salineBolusInProgress ); - treatmentTimeBroadcastTimerCtr = 0; - } + broadcastTreatmentTimeAndState(); + broadcastTreatmentSettingsRanges(); #endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 10 sec @@ -468,9 +453,9 @@ { DIALYSIS_STATE_T currDialysisState = getDialysisState(); UF_STATE_T currUFState = getUltrafiltrationState(); - F32 uFRate = uFVolume / ((F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN); // what would UF rate be if user selected to adjust it? - U32 trtTime = (S32)( uFVolume / presUFRate ) + 1; // what would the treatment duration be if user selected to adjust it? - U32 dialVolume = presDialysateFlowRate * trtTime; // what would dialysate volume be if user selected to adjust time? + F32 uFRate = uFVolume / ((F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN); // what UF rate would be if user selected to adjust it + U32 trtTime = (S32)( uFVolume / presUFRate ) + 1; // what the treatment duration would be if user selected to adjust it + U32 dialVolume = presDialysateFlowRate * trtTime; // what dialysate volume would be if user selected to adjust time // UF should already be paused but let's make sure. if ( ( TREATMENT_DIALYSIS_STATE == currentTreatmentState ) && @@ -648,3 +633,70 @@ return result; } + +/*********************************************************************//** + * @brief + * The broadcastTreatmentTimeAndState function broadcasts treatment time and \n + * state data during treatment. + * @details + * Inputs : treatment time and state data + * Outputs : treatment time and state messages sent on interval + * @return none + *************************************************************************/ +static void broadcastTreatmentTimeAndState( void ) +{ + U32 elapsedTreatmentTimeInSecs; + + // update treatment time stats and broadcast - end treatment if time + elapsedTreatmentTimeInSecs = treatmentTimeMS / MS_PER_SECOND; + if ( elapsedTreatmentTimeInSecs >= presTreatmentTimeSecs ) + { + stopDialysis(); + elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; + currentTreatmentState = TREATMENT_DIALYSIS_END_STATE; + } + // broadcast treatment time and state data at interval + if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) + { + U32 timeRemaining = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; + DIALYSIS_STATE_T dialysisState = getDialysisState(); + UF_STATE_T uFState = getUltrafiltrationState(); + BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SOLUTION_INFUSION_STATE ? TRUE : FALSE ); + + broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, timeRemaining ); + broadcastTreatmentState( currentTreatmentState, uFState, salineBolusInProgress ); + treatmentTimeBroadcastTimerCtr = 0; + } +} + +/*********************************************************************//** + * @brief + * The broadcastTreatmentSettingsRanges function computes and broadcasts \n + * updated treatment parameter ranges that the user may change during treatment. + * @details + * Inputs : current operating mode, treatment states and parameters + * Outputs : valid ranges message sent on interval + * @return none + *************************************************************************/ +static void broadcastTreatmentSettingsRanges( void ) +{ + if ( ++treatmentParamsRangesBroadcastTimerCtr >= TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ) + { + U32 minTime = CALC_ELAPSED_TREAT_TIME_IN_MIN() + 2; // add two minutes to cover rounding and ensure it's valid for next minute + U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationVolumeCollected() ) / MAX_UF_RATE_ML_MIN; + U32 maxTime1 = minTime + maxTimeRem; + U32 maxTime2 = MAX_DIALYSATE_VOLUME_ML / presDialysateFlowRate; + U32 maxTime = MIN( maxTime1, maxTime2 ); + U32 minUFVol = (U32)(getUltrafiltrationVolumeCollected() + 1); + U32 maxUFVol = presUFRate * ( presTreatmentTimeSecs / SEC_PER_MIN ); + U32 minDialRate = MIN_DIAL_IN_FLOW_RATE; + U32 maxDialRate = MAX_DIALYSATE_VOLUME_ML / ( presTreatmentTimeSecs / SEC_PER_MIN ); + + maxTime = MIN( maxTime, MAX_TREATMENT_TIME_MINUTES ); + maxUFVol = MIN( maxUFVol, MAX_UF_VOLUME_ML ); + maxDialRate = MIN( maxDialRate, MAX_DIAL_IN_FLOW_RATE ); + // send ranges to UI + sendTreatmentParamsRangesToUI( minTime, maxTime, minUFVol, maxUFVol, minDialRate, maxDialRate ); + treatmentParamsRangesBroadcastTimerCtr = 0; + } +} Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r8ecacdf946ecec11c2f65000876d767279cdd33a -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8ecacdf946ecec11c2f65000876d767279cdd33a) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -1117,6 +1117,10 @@ handleChangeBloodDialysateRateChangeRequest( message ); break; + case MSG_ID_REQUEST_FW_VERSIONS: + handleFWVersionRequest( message ); + break; + case MSG_ID_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r744b177ec4114c62303e976aed1677b820f7a281 -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 744b177ec4114c62303e976aed1677b820f7a281) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -405,17 +405,18 @@ *************************************************************************/ void handleChangeUFSettingsRequest( MESSAGE_T *message ) { - BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) { U32 uFVolume; memcpy( &uFVolume, message->payload, sizeof(U32) ); - result = verifyUFSettingsChange( uFVolume ); + verifyUFSettingsChange( uFVolume ); } - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); + else + { + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); + } } /************************************************************************* @@ -479,17 +480,18 @@ *************************************************************************/ void handleChangeUFSettingsConfirmation( MESSAGE_T *message ) { - BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(UF_SETTINGS_CHANGE_CONFIRMATION_PAYLOAD_T) ) { UF_SETTINGS_CHANGE_CONFIRMATION_PAYLOAD_T payload; memcpy( &payload, message->payload, sizeof(UF_SETTINGS_CHANGE_CONFIRMATION_PAYLOAD_T) ); - result = verifyUFSettingsConfirmation( payload.volume_mL, payload.adjustType ); + verifyUFSettingsConfirmation( payload.volume_mL, payload.adjustType ); } - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); + else + { + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); + } } /************************************************************************* @@ -504,17 +506,18 @@ *************************************************************************/ void handleChangeTreatmentDurationRequest( MESSAGE_T *message ) { - BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) { U32 timeInMin; memcpy( &timeInMin, message->payload, sizeof(U32) ); - result = verifyTreatmentDurationSettingChange( timeInMin ); + verifyTreatmentDurationSettingChange( timeInMin ); } - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); + else + { + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); + } } /************************************************************************* @@ -569,7 +572,6 @@ *************************************************************************/ void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ) { - BOOL result = FALSE; U32 expPayloadSize = sizeof(U32) + sizeof(U32); if ( expPayloadSize == message->hdr.payloadLen ) @@ -580,9 +582,12 @@ memcpy( &bloodRate, &message->payload[0], sizeof(U32) ); memcpy( &dialRate, &message->payload[sizeof(U32)], sizeof(U32) ); - result = verifyBloodAndDialysateRateSettingsChange( bloodRate, dialRate ); + verifyBloodAndDialysateRateSettingsChange( bloodRate, dialRate ); } - sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); + else + { + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, FALSE ); + } } /************************************************************************* @@ -670,6 +675,38 @@ /************************************************************************* * @brief + * The handleFWVersionRequest function handles a request for HD f/w version. + * @details + * Inputs : none + * Outputs : message handled, response constructed and queued for transmit. + * @param message : a pointer to the message to handle. + * @return none + *************************************************************************/ +void handleFWVersionRequest( message ) +{ + MESSAGE_T msg; + U08 major = (U08)HD_VERSION_MAJOR; + U08 minor = (U08)HD_VERSION_MINOR; + U16 build = (U16)HD_VERSION_BUILD; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_VERSION; + msg.hdr.payloadLen = sizeof( U08 ) + sizeof( U08 ) + sizeof( U16 ); + + memcpy( payloadPtr, &major, sizeof( U08 ) ); + payloadPtr += sizeof( U08 ); + memcpy( payloadPtr, &minor, sizeof( U08 ) ); + payloadPtr += sizeof( U08 ); + memcpy( payloadPtr, &build, sizeof( U16 ) ); + + // 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_REQUIRED ); +} + +/************************************************************************* + * @brief * The sendDialysateTempTargetsToDG function constructs a dialysate temperature \n * set points message for DG and queues the msg for transmit on the appropriate CAN channel. * @details Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r744b177ec4114c62303e976aed1677b820f7a281 -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 744b177ec4114c62303e976aed1677b820f7a281) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -66,6 +66,9 @@ // MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS BOOL sendDialysateTempTargetsToDG( F32 primary, F32 trimmer ); +// MSG_ID_REQUEST_FW_VERSIONS +void handleFWVersionRequest( message ); + // MSG_ID_ALARM_STATUS BOOL broadcastAlarmStatus( COMP_ALARM_STATUS_T almStatus ); // MSG_ID_ALARM_TRIGGERED