Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r94895e32fe18e78b98fe3bb7786838cf00afdbfa -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 94895e32fe18e78b98fe3bb7786838cf00afdbfa) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -35,9 +35,6 @@ #define BLOOD_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) // interval (ms/task time) at which the blood flow data is published on the CAN bus -#define MAX_BLOOD_FLOW_RATE 500 // mL/min -#define MIN_BLOOD_FLOW_RATE 100 // mL/min - #define MAX_BLOOD_PUMP_PWM_STEP_CHANGE 0.01 // max duty cycle change when ramping #define MAX_BLOOD_PUMP_PWM_DUTY_CYCLE 0.88 // controller will error if PWM duty cycle > 90%, so set max to 88% #define MIN_BLOOD_PUMP_PWM_DUTY_CYCLE 0.12 // controller will error if PWM duty cycle < 10%, so set min to 12% Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -21,6 +21,8 @@ // ********** public definitions ********** +#define MAX_BLOOD_FLOW_RATE 500 // mL/min +#define MIN_BLOOD_FLOW_RATE 100 // mL/min // ********** public function prototypes ********** Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r94895e32fe18e78b98fe3bb7786838cf00afdbfa -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 94895e32fe18e78b98fe3bb7786838cf00afdbfa) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -36,9 +36,6 @@ #define DIAL_IN_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) // interval (ms/task time) at which the dialIn flow data is published on the CAN bus -#define MAX_DIAL_IN_FLOW_RATE 500 // mL/min -#define MIN_DIAL_IN_FLOW_RATE 100 // mL/min - #define MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE 0.01 // duty cycle TODO - fixed or parameterized or set in motor controller? #define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.88 // controller will error if PWM duty cycle > 90%, so set max to 88% #define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.12 // controller will error if PWM duty cycle < 10%, so set min to 12% Index: firmware/App/Controllers/DialInFlow.h =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -21,6 +21,8 @@ // ********** public definitions ********** +#define MAX_DIAL_IN_FLOW_RATE 600 // mL/min +#define MIN_DIAL_IN_FLOW_RATE 100 // mL/min // ********** public function prototypes ********** Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r94895e32fe18e78b98fe3bb7786838cf00afdbfa -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 94895e32fe18e78b98fe3bb7786838cf00afdbfa) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -138,6 +138,7 @@ setDialysateFlowRate = dPFlow; maxUFVolumeML = maxUFVol; setUFRate = uFRate; + // TODO - if performing dialysis now, set new pump rates immediately } /*********************************************************************//** Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rd3ae2d91603ae6d2d25b9abdb220cc144cf90692 -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d3ae2d91603ae6d2d25b9abdb220cc144cf90692) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -43,8 +43,13 @@ #define MAX_UF_RATE_ML_MIN ( (F32)2500 / (F32)MIN_PER_HOUR ) ///< Maximum ultrafiltration rate (in mL/min). #define MAX_DIALYSATE_VOLUME_ML ( 180 * ML_PER_LITER ) ///< Maximum dialysate volume (in mL). +#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 CALC_ELAPSED_TREAT_TIME_IN_SECS() ( treatmentTimeMS / MS_PER_SECOND ) ///< Macro to calculate the elapsed treatment time in seconds. +#define CALC_TREAT_TIME_REMAINING_IN_SECS() ( (S32)presTreatmentTimeSecs - (S32)( treatmentTimeMS / MS_PER_SECOND ) ) ///< Macro to calculate the remaining treatment time in seconds. + // ********** private data ********** static TREATMENT_STATE_T currentTreatmentState; ///< Current state (sub-mode) of treatment mode. @@ -356,6 +361,7 @@ BOOL verifyTreatmentDurationSettingChange( U32 treatmentTime ) { BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejectReason = REQUEST_REJECT_REASON_NONE; S32 timeDiff = 0; F32 rateDiff = 0.0; OP_MODE currMode = getCurrentOperationMode(); @@ -376,8 +382,30 @@ pendingTreatmentTimeChange = treatmentTime; // min timeDiff = treatmentTime - ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); } + else + { + if ( treatmentTime > MAX_TREATMENT_TIME_MINUTES ) + { + rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; + } + else + { + rejectReason = REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE; + } + } } - sendChangeUFSettingsResponse( result, pendingUFVolumeChange, pendingTreatmentTimeChange, pendingUFRateChange, timeDiff, rateDiff ); + else + { + if ( MODE_TREA == currMode ) + { + rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; + } + else + { + rejectReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE; + } + } + sendChangeUFSettingsResponse( result, rejectReason, pendingUFVolumeChange, pendingTreatmentTimeChange, pendingUFRateChange, timeDiff, rateDiff ); return result; } @@ -396,12 +424,16 @@ BOOL verifyUFSettingsChange( F32 uFVolume, UF_ADJ_T adjustment ) { BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejectReason = REQUEST_REJECT_REASON_NONE; S32 timeDiff = 0; F32 rateDiff = 0.0; OP_MODE currMode = getCurrentOperationMode(); - // check if we are in an appropriate treatment state for settings adjustment - if ( ( MODE_TREA == currMode ) && ( currentTreatmentState > TREATMENT_START_STATE ) && ( currentTreatmentState < TREATMENT_DIALYSIS_END_STATE ) ) + // check if we are in an appropriate treatment state for settings adjustment // TODO - we cannot be within TBD min from end of treatment in order to allow UF volume change + if ( ( MODE_TREA == currMode ) && + ( currentTreatmentState > TREATMENT_START_STATE ) && + ( currentTreatmentState < TREATMENT_DIALYSIS_END_STATE ) && + ( CALC_TREAT_TIME_REMAINING_IN_SECS() < PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ) ) { // TODO - verify not too close to end of treatment for settings change DIALYSIS_STATE_T currDialysisState = getDialysisState(); @@ -438,6 +470,18 @@ pendingTreatmentTimeChange = trtTime; timeDiff = trtTime - ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); } + else + { + if ( trtTime > MAX_TREATMENT_TIME_MINUTES ) + { + rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; + } + else + { + rejectReason = REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE; + } + + } } else { // UF Rate is adjusted then @@ -451,10 +495,30 @@ pendingTreatmentTimeChange = trtTime; rateDiff = ( uFRate - presUFRate ); } + else + { + rejectReason = REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE; + } } } + else + { + if ( MODE_TREA == currMode ) + { + rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; + } + else if ( ( currentTreatmentState <= TREATMENT_START_STATE ) || + ( currentTreatmentState >= TREATMENT_DIALYSIS_END_STATE ) ) + { + rejectReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE; + } + else + { + rejectReason = REQUEST_REJECT_REASON_TREATMENT_TOO_CLOSE_TO_FINISHED; + } + } // respond to UF settings change request - sendChangeUFSettingsResponse( result, pendingUFVolumeChange, pendingTreatmentTimeChange, pendingUFRateChange, timeDiff, rateDiff ); + sendChangeUFSettingsResponse( result, rejectReason, pendingUFVolumeChange, pendingTreatmentTimeChange, pendingUFRateChange, timeDiff, rateDiff ); return result; } @@ -506,3 +570,57 @@ return result; } + +/*********************************************************************//** + * @brief + * The verifyBloodAndDialysateRateSettingsChange function verifies the \n + * user blood & dialysate flow rate settings change. + * @details + * Inputs : none + * Outputs : none + * @param bloodRate : Proposed new blood flow rate (in mL/min). + * @param dialRate : Proposed new dialysate flow rate (in mL/min). + * @return TRUE if new blood & dialysate rate settings are valid, FALSE if not. + *************************************************************************/ +BOOL verifyBloodAndDialysateRateSettingsChange( U32 bloodRate, U32 dialRate ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejectReason = REQUEST_REJECT_REASON_NONE; + OP_MODE currMode = getCurrentOperationMode(); + + // check if we are in treatment mode for settings change + if ( MODE_TREA == currMode ) + { + U32 dialVolume = dialRate * ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); // in mL + + // validate new rates + if ( ( bloodRate >= MIN_BLOOD_FLOW_RATE ) && ( bloodRate <= MAX_BLOOD_FLOW_RATE ) && + ( dialRate >= MIN_DIAL_IN_FLOW_RATE ) && ( dialRate <= MAX_DIAL_IN_FLOW_RATE ) && + ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) + { + result = TRUE; + // set to new rates + presBloodFlowRate = bloodRate; + presDialysateFlowRate = dialRate; + setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); + } + else + { + if ( ( bloodRate < MIN_BLOOD_FLOW_RATE ) || ( bloodRate > MAX_BLOOD_FLOW_RATE ) ) + { + rejectReason = REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE; + } + else if ( ( dialRate < MIN_DIAL_IN_FLOW_RATE ) || ( dialRate > MAX_DIAL_IN_FLOW_RATE ) ) + { + rejectReason = REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE; + } + else + { + rejectReason = REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE; + } + } + } + sendChangeBloodDialysateRateChangeResponse( result, (U32)rejectReason, bloodRate, dialRate ); + + return result; +} Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -re0e66d4c302c2aa43951ca316689ed4debbff1fb -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision e0e66d4c302c2aa43951ca316689ed4debbff1fb) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -58,6 +58,7 @@ BOOL verifyTreatmentDurationSettingChange( U32 treatmentTime ); BOOL verifyUFSettingsChange( F32 uFVolume, UF_ADJ_T adjustment ); BOOL verifyUFSettingsConfirmation( BOOL confirmed, F32 uFVolume, U32 treatmentTime, F32 uFRate ); +BOOL verifyBloodAndDialysateRateSettingsChange( U32 bloodRate, U32 dialRate ); /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r94895e32fe18e78b98fe3bb7786838cf00afdbfa -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 94895e32fe18e78b98fe3bb7786838cf00afdbfa) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -103,15 +103,12 @@ static U32 lastCANPacketSentTimeStamp = 0; #ifdef DEBUG_ENABLED - static U08 pcXmitPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + static U08 pcXmitPacket[ 1024 ]; static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; // DMA control records static g_dmaCTRL pcDMAXmitControlRecord; // DMA transmit control record (UART-debug) static g_dmaCTRL pcDMARecvControlRecord; // DMA receive control record (UART-debug) - - //static U08 dbgRcvFromDialin[2048]; - //static U32 dbgRcvFromDialinIdx = 0; #endif static PENDING_ACK_RECORD_T pendingAckList[ PENDING_ACK_LIST_SIZE ]; // list of outgoing messages that are awaiting an ACK @@ -364,13 +361,6 @@ // if packet retrieved, add to buffer if ( result != 0 ) { -//#ifdef DEBUG_ENABLED -// if ( srcCANBox == COMM_BUFFER_IN_CAN_PC ) -// { -// memcpy( &dbgRcvFromDialin[dbgRcvFromDialinIdx], data, CAN_MESSAGE_PAYLOAD_SIZE); -// dbgRcvFromDialinIdx += CAN_MESSAGE_PAYLOAD_SIZE; -// } -//#endif // add CAN packet to appropriate comm buffer based on the message box it came in on (s/b same #) addToCommBuffer( srcCANBox, data, CAN_MESSAGE_PAYLOAD_SIZE ); } @@ -379,7 +369,7 @@ else { // shouldn't get here - not an active message box - // s/w fault? + // TODO - s/w fault? } } @@ -649,20 +639,19 @@ { U32 result = 0; U32 dataPend = numberOfBytesInCommBuffer( COMM_BUFFER_OUT_UART_PC ); - U32 dataSize; - if ( dataPend >= PC_MESSAGE_PACKET_SIZE ) + if ( dataPend > 0 ) { - dataSize = getFromCommBuffer( COMM_BUFFER_OUT_UART_PC, pcXmitPacket, PC_MESSAGE_PACKET_SIZE ); + result = getFromCommBuffer( COMM_BUFFER_OUT_UART_PC, pcXmitPacket, dataPend ); - // if there's another UART packet to send, send it - if ( dataSize == PC_MESSAGE_PACKET_SIZE ) + // if there's data to transmit, transmit it + if ( result > 0 ) { signalSCI1XmitsInitiated(); + pcDMAXmitControlRecord.FRCNT = result; // set DMA transfer size dmaSetCtrlPacket( DMA_CH3, pcDMAXmitControlRecord ); dmaSetChEnable( DMA_CH3, DMA_HW ); setSCI1DMATransmitInterrupt(); - result = PC_MESSAGE_PACKET_SIZE; } } @@ -1124,6 +1113,10 @@ handleChangeTreatmentDurationRequest( message ); break; + case MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST: + handleChangeBloodDialysateRateChangeRequest( message ); + break; + case MSG_ID_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rd3ae2d91603ae6d2d25b9abdb220cc144cf90692 -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision d3ae2d91603ae6d2d25b9abdb220cc144cf90692) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -435,14 +435,15 @@ * Inputs : none * Outputs : UF change settings response msg constructed and queued. * @param accepted : alarm status record + * @param reason : reason rejected (if not accepted) * @param volume_mL : alarm status record * @param time_min : alarm status record * @param ufRate_mL_min : alarm status record * @param timeDiff : alarm status record * @param rateDiff : alarm status record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL sendChangeUFSettingsResponse( BOOL accepted, F32 volume_mL, U32 time_min, F32 ufRate_mL_min, S32 timeDiff, F32 rateDiff ) +BOOL sendChangeUFSettingsResponse( BOOL accepted, U32 reason, F32 volume_mL, U32 time_min, F32 ufRate_mL_min, S32 timeDiff, F32 rateDiff ) { BOOL result; F32 volume_L = volume_mL / (F32)ML_PER_LITER; @@ -452,10 +453,12 @@ // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE; - msg.hdr.payloadLen = sizeof( BOOL ) + sizeof( F32 ) + sizeof( U32 ) + sizeof( F32 ) + sizeof( U32 ) + sizeof (F32 ); + msg.hdr.payloadLen = sizeof( BOOL ) + sizeof( U32 ) + sizeof( F32 ) + sizeof( U32 ) + sizeof( F32 ) + sizeof( U32 ) + sizeof (F32 ); memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); payloadPtr += sizeof( BOOL ); + memcpy( payloadPtr, &reason, sizeof( U32) ); + payloadPtr += sizeof( U32 ); memcpy( payloadPtr, &volume_L, sizeof( F32 ) ); payloadPtr += sizeof( F32 ); memcpy( payloadPtr, &time_min, sizeof( U32 ) ); @@ -523,6 +526,105 @@ } /************************************************************************* + * @brief + * The handleChangeBloodDialysateRateChangeRequest function handles a blood \n + * and dialysate rate settings change message from the UI. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + U32 expPayloadSize = sizeof(U32) + sizeof(U32); + + if ( expPayloadSize == message->hdr.payloadLen ) + { + U32 bloodRate; + U32 dialRate; + + memcpy( &bloodRate, &message->payload[0], sizeof(U32) ); + memcpy( &dialRate, &message->payload[sizeof(U32)], sizeof(U32) ); + + result = verifyBloodAndDialysateRateSettingsChange( bloodRate, dialRate ); + } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); +} + +/************************************************************************* + * @brief + * The sendChangeBloodDialysateRateChangeResponse function constructs a change \n + * blood and dialysate rate settings response to the UI and queues the msg for \n + * transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : Blood & dialysate rate change response msg constructed and queued. + * @param accepted : alarm status record + * @param reason : reason code for rejection or unused if accepted + * @param bloodRate : new blood flow rate + * @param dialRate : new dialysate flow rate + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendChangeBloodDialysateRateChangeResponse( BOOL accepted, U32 reason, U32 bloodRate, U32 dialRate ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_RESPONSE; + msg.hdr.payloadLen = sizeof( BOOL ) + sizeof( U32 ) + sizeof( U32 ) + sizeof( U32 ); + + memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); + payloadPtr += sizeof( BOOL ); + memcpy( payloadPtr, &reason, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &bloodRate, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &dialRate, sizeof( U32 ) ); + + // 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_2_UI, ACK_REQUIRED ); + + return result; +} + +/************************************************************************* + * @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 + * Inputs : none + * Outputs : Dialysate temperature set points msg constructed and queued. + * @param primary : temperature set point for primary heater. + * @param trimmer : temperature set point for trimmer heater. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendDialysateTempTargetsToDG( F32 primary, F32 trimmer ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS; + msg.hdr.payloadLen = sizeof( F32 ) + sizeof( F32 ); + + memcpy( payloadPtr, &primary, sizeof( F32 ) ); + payloadPtr += sizeof( F32 ); + memcpy( payloadPtr, &trimmer, sizeof( F32 ) ); + + // 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_2_DG, ACK_REQUIRED ); + + return result; +} + +/************************************************************************* * @brief broadcastAlarmStatus * The broadcastAlarmStatus function constructs an alarm status msg to \n * be broadcast and queues the msg for transmit on the appropriate CAN channel. Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rd3ae2d91603ae6d2d25b9abdb220cc144cf90692 -r054fa08b67ed2a31f7848b179fbcd1b4da501b0f --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision d3ae2d91603ae6d2d25b9abdb220cc144cf90692) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 054fa08b67ed2a31f7848b179fbcd1b4da501b0f) @@ -45,13 +45,21 @@ // MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST void handleChangeUFSettingsRequest( MESSAGE_T *message ); // MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE -BOOL sendChangeUFSettingsResponse( BOOL accepted, F32 volume_mL, U32 time_min, F32 ufRate_mL_min, S32 timeDiff, F32 rateDiff ); +BOOL sendChangeUFSettingsResponse( BOOL accepted, U32 reason, F32 volume_mL, U32 time_min, F32 ufRate_mL_min, S32 timeDiff, F32 rateDiff ); // MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE void handleChangeUFSettingsConfirmation( MESSAGE_T *message ); //MSG_ID_USER_TREATMENT_TIME_CHANGE_REQUEST void handleChangeTreatmentDurationRequest( MESSAGE_T *message ); +// MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST +void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message ); +// MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_RESPONSE +BOOL sendChangeBloodDialysateRateChangeResponse( BOOL accepted, U32 reason, U32 bloodRate, U32 dialRate ); + +// MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS +BOOL sendDialysateTempTargetsToDG( F32 primary, F32 trimmer ); + // MSG_ID_ALARM_STATUS BOOL broadcastAlarmStatus( COMP_ALARM_STATUS_T almStatus ); // MSG_ID_ALARM_TRIGGERED