Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -304,14 +304,18 @@ * @param res1Backup : New weight from backup load cell of reservoir 1. * @param res2Primary : New weight from primary load cell of reservoir 2. * @param res2Backup : New weight from backup load cell of reservoir 2. - * @return none + * @return TRUE if successful, FALSE if not *************************************************************************/ -void setNewLoadCellReadings( F32 res1Primary, F32 res1Backup, F32 res2Primary, F32 res2Backup ) +BOOL setNewLoadCellReadings( F32 res1Primary, F32 res1Backup, F32 res2Primary, F32 res2Backup ) { + BOOL result = TRUE; + loadCellWeightInGrams[ LOAD_CELL_RESERVOIR_1_PRIMARY ].data = res1Primary; loadCellWeightInGrams[ LOAD_CELL_RESERVOIR_1_BACKUP ].data = res1Backup; loadCellWeightInGrams[ LOAD_CELL_RESERVOIR_2_PRIMARY ].data = res2Primary; loadCellWeightInGrams[ LOAD_CELL_RESERVOIR_2_BACKUP ].data = res2Backup; + + return result; } /*********************************************************************//** Index: firmware/App/Controllers/DialOutFlow.h =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -66,7 +66,7 @@ void signalDialOutPumpHardStop( void ); -void setNewLoadCellReadings( F32 res1Primary, F32 res1Backup, F32 res2Primary, F32 res2Backup ); +BOOL setNewLoadCellReadings( F32 res1Primary, F32 res1Backup, F32 res2Primary, F32 res2Backup ); // SELF_TEST_STATUS_T execDialOutFlowTest( void ); // TODO - implement later Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r2e6c750c202b7361d79488ce383e34f380e75413 -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -361,13 +361,6 @@ broadcastPresOcclData( artPres, venPres, bpOccl, diOccl, doOccl ); presOcclDataPublicationTimerCounter = 0; -// #ifdef DEBUG_ENABLED -// // TODO - temporary debug code - remove later -// char debugPresStr[ 256 ]; -// -// sprintf( debugPresStr, "Art. Pres.:%5d, Ven. Pres.:%5d, BP Occl.:%5d, DPi Occl.:%5d, DPo Occl.:%5d\n", (S32)artPres, (S32)venPres, (S32)bpOccl, (S32)diOccl, (S32)doOccl ); -// sendDebugData( (U08*)debugPresStr, strlen(debugPresStr) ); -// #endif } } Index: firmware/App/HDCommon.h =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -29,7 +29,6 @@ #define DISABLE_CRC_ERROR 1 #define DISABLE_MOTOR_CURRENT_ERRORS 1 #define SHOW_RAW_FLOW_VALUES 1 -// #define CAN_TEST 1 #ifdef DEBUG_ENABLED #include Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -35,25 +35,6 @@ #define MAX_UF_ACCURACY_ERROR_ML_PER_HR 100 ///< Maximum ultrafiltration accuracy error in mL/hr. #define UF_ACCURACY_CHECK_INTERVAL ((1 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL) ///< Ultrafiltration rate accuracy check interval count -/// Enumeration of dialysis sub-mode states. -typedef enum Dialysis_States -{ - DIALYSIS_START_STATE = 0, ///< Start state of the dialysis sub-mode state machine. - DIALYSIS_UF_STATE, ///< Ultrafiltration state of the dialysis sub-mode state machine. - DIALYSIS_SOLUTION_INFUSION_STATE, ///< Solution infusion state of the dialysis sub-mode state machine. - NUM_OF_DIALYSIS_STATES ///< Number of dialysis sub-mode states. -} DIALYSIS_STATE_T; - -/// Enumeration of ultrafiltration states. -typedef enum UF_States -{ - UF_START_STATE = 0, ///< Start state of the ultrafiltration state machine. - UF_PAUSED_STATE, ///< Paused state of the ultrafiltration state machine. - UF_RUNNING_STATE, ///< Running state of the ultrafiltration state machine. - UF_COMPLETED_OR_OFF_STATE, ///< Completed/off state of the ultrafiltration state machine. - NUM_OF_UF_STATES ///< Number of ultrafiltration states. -} UF_STATE_T; - // ********** private data ********** static DIALYSIS_STATE_T currentDialysisState; ///< Current state of the dialysis sub-mode state machine. @@ -198,6 +179,32 @@ /*********************************************************************//** * @brief + * The getDialysisState function gets the current dialysis state (sub-mode). + * @details + * Inputs : currentDialysisState + * Outputs : none + * @return currentDialysisState + *************************************************************************/ +DIALYSIS_STATE_T getDialysisState( void ) +{ + return currentDialysisState; +} + +/*********************************************************************//** + * @brief + * The getUltrafiltrationState function gets the current ultrafiltration state. + * @details + * Inputs : currentUFState + * Outputs : none + * @return currentUFState + *************************************************************************/ +UF_STATE_T getUltrafiltrationState( void ) +{ + return currentUFState; +} + +/*********************************************************************//** + * @brief * The pauseUF function pauses ultrafiltration. * @details * Inputs : currentDialysisState, currentUFState @@ -207,8 +214,9 @@ BOOL pauseUF( void ) { BOOL result = FALSE; + OP_MODE currMode = getCurrentOperationMode(); - if ( ( DIALYSIS_UF_STATE == currentDialysisState ) && ( UF_RUNNING_STATE == currentUFState ) ) + if ( ( MODE_TREA == currMode ) && ( DIALYSIS_UF_STATE == currentDialysisState ) && ( UF_RUNNING_STATE == currentUFState ) ) { // set outlet pump to dialysate rate result = setDialOutPumpTargetRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); @@ -264,6 +272,10 @@ *************************************************************************/ void execDialysis( void ) { + // check ultrafiltration accuracy during dialysis (even when ultrafiltration is paused). + checkUFAccuracy(); + + // dialysis state machine switch ( currentDialysisState ) { case DIALYSIS_START_STATE: Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -29,26 +29,57 @@ // ********** public definitions ********** +/// Enumeration of dialysis sub-mode states. +typedef enum Dialysis_States +{ + DIALYSIS_START_STATE = 0, ///< Start state of the dialysis sub-mode state machine. + DIALYSIS_UF_STATE, ///< Ultrafiltration state of the dialysis sub-mode state machine. + DIALYSIS_SOLUTION_INFUSION_STATE, ///< Solution infusion state of the dialysis sub-mode state machine. + NUM_OF_DIALYSIS_STATES ///< Number of dialysis sub-mode states. +} DIALYSIS_STATE_T; + +/// Enumeration of ultrafiltration states. +typedef enum UF_States +{ + UF_START_STATE = 0, ///< Start state of the ultrafiltration state machine. + UF_PAUSED_STATE, ///< Paused state of the ultrafiltration state machine. + UF_RUNNING_STATE, ///< Running state of the ultrafiltration state machine. + UF_COMPLETED_OR_OFF_STATE, ///< Completed/off state of the ultrafiltration state machine. + NUM_OF_UF_STATES ///< Number of ultrafiltration states. +} UF_STATE_T; + /// Enumeration of system message IDs. typedef enum UF_Commands { - UF_CMD_PAUSE = 0, ///< Pause UF command. - UF_CMD_RESUME, ///< Resume UF command. - NUM_OF_UF_CMDS ///< # of UF commands. + UF_CMD_PAUSE = 0, ///< Pause UF command. + UF_CMD_RESUME, ///< Resume UF command. + NUM_OF_UF_CMDS ///< # of UF commands. } UF_CMD_T; +/// Enumeration of system message IDs. +typedef enum UF_Adjustments +{ + UF_ADJ_TREATMENT_TIME = 0, ///< Adjust treatment time to achieve new ultrafiltration volume. + UF_ADJ_UF_RATE, ///< Adjust UF rate to achieve new ultrafiltration volume. + NUM_OF_UF_ADJS ///< # of UF adjustments. +} UF_ADJ_T; + // ********** private function prototypes ********** void initDialysis( void ); void transitionToDialysis( void ); void execDialysis( void ); void setDialysisParams( U32 bPFlow, U32 dPFlow, F32 maxUFVol, F32 uFRate ); +void startDialysis( void ); +void stopDialysis( void ); + +DIALYSIS_STATE_T getDialysisState( void ); +UF_STATE_T getUltrafiltrationState( void ); + BOOL pauseUF( void ); BOOL resumeUF( void ); -void startDialysis( void ); -void stopDialysis( void ); /**@}*/ Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -14,7 +14,6 @@ * **************************************************************************/ - #include "AlarmLamp.h" #include "OperationModes.h" #include "ModeFault.h" Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -118,8 +118,8 @@ break; case POST_STATE_RTC: - //testStatus = execRTCSelfTest(); - postState = POST_STATE_STUCK_BUTTON; //handlePOSTStatus( testStatus ); + testStatus = execRTCSelfTest(); + postState = POST_STATE_STUCK_BUTTON; break; case POST_STATE_STUCK_BUTTON: Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -203,10 +203,16 @@ elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; currentTreatmentState = TREATMENT_END_STATE; } - // broadcast treatment time at interval + // broadcast treatment time and state data at interval if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) { - broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, presTreatmentTimeSecs - elapsedTreatmentTimeInSecs ); + 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; } #endif @@ -328,3 +334,48 @@ return result; } +/************************************************************************* + * @brief + * The verifyUFSettingsChange function verifies new ultrafiltration settings \n + * from the user. + * @details + * Inputs : none + * Outputs : none + * @param uFVolume : . + * @param adjustment : . + * @return TRUE if new UF settings valid, FALSE if not. + *************************************************************************/ +BOOL verifyUFSettingsChange( F32 uFVolume, UF_ADJ_T adjustment ) +{ + BOOL result = FALSE; + OP_MODE currMode = getCurrentOperationMode(); + + // check if we are in treatment mode + if ( MODE_TREA == currMode ) + { + // check + } + //sendChangeUFSettingsResponse( BOOL accepted, U32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ); + + return result; +} + +/************************************************************************* + * @brief + * The verifyUFSettingsConfirmation function verifies the user confirmed \n + * ultrafiltration settings change(s) and, if valid, implements the new settings. + * @details + * Inputs : none + * Outputs : none + * @param confirmed : . + * @param uFVolume : . + * @param treatmentTime : . + * @param uFRate : . + * @return next treatment mode state + *************************************************************************/ +BOOL verifyUFSettingsConfirmation( BOOL confirmed, F32 uFVolume, U32 treatmentTime, F32 uFRate ) +{ + BOOL result = FALSE; + + return result; +} Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -18,11 +18,17 @@ #define __MODE_TREATMENT_H__ #include "HDCommon.h" +#include "Dialysis.h" +// ********** public definitions ********** + // ********** private function prototypes ********** void initTreatmentMode( void ); // initialize this module void transitionToTreatmentMode( void ); // prepares for transition to treatment mode void execTreatmentMode( void ); // execute the treatment mode state machine (call from OperationModes) +BOOL verifyUFSettingsChange( F32 uFVolume, UF_ADJ_T adjustment ); +BOOL verifyUFSettingsConfirmation( BOOL confirmed, F32 uFVolume, U32 treatmentTime, F32 uFRate ); + #endif Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -r926afe9b1d9cc6931cbca48080e4a66385a20239 -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 926afe9b1d9cc6931cbca48080e4a66385a20239) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -73,4 +73,3 @@ } /**@}*/ - Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -160,8 +160,6 @@ // verify given buffer if ( buffer < NUM_OF_COMM_BUFFERS ) { -// _disable_IRQ(); -// _disable_FIQ(); // verify requested # of bytes to get are in the buffer if ( ( len <= ( COMM_BUFFER_LENGTH * DOUBLE_BUFFERS ) ) && ( len <= numberOfBytesInCommBuffer( buffer ) ) ) { @@ -185,8 +183,6 @@ result += remNumOfBytes; } } -// _enable_FIQ(); -// _enable_IRQ(); } else // invalid buffer given { @@ -351,5 +347,3 @@ switchDoubleBuffer( buffer ); // switch will zero count off inactive buffer } } - - Index: firmware/App/Services/FPGA.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -939,18 +939,6 @@ *************************************************************************/ U16 getFPGADialInPumpOcclusion( void ) { -#ifdef DEBUG_ENABLED -// { -// // TODO - temporary debug code - remove later -// char debugOccStr[ 60 ]; -// S32 dat = fpgaSensorReadings.dialysateInOcclusionData; -// S32 rct = fpgaSensorReadings.dialysateInOcclusionReadCount; -// S32 ect = fpgaSensorReadings.dialysateInOcclusionErrorCount; -// -// sprintf( debugOccStr, "Data %5d Reads %5d Errors %5d\n", dat, rct, ect ); -// sendDebugData( (U08*)debugOccStr, strlen(debugOccStr) ); -// } -#endif return fpgaSensorReadings.dialysateInOcclusionData; } Index: firmware/App/Services/MsgQueues.c =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/MsgQueues.c (.../MsgQueues.c) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/App/Services/MsgQueues.c (.../MsgQueues.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -245,6 +245,3 @@ // set msg ID out of bounds in case blank message goes somewhere message->msg.hdr.msgID = 0xFFFF; } - - - Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -126,18 +126,6 @@ static U32 badCRCListIdx = 0; // where next bad message CRC time stamp will go in list static U32 badCRCListCount = 0; // # of bad CRCs in the list -#ifdef CAN_TEST -U08 dbgRcvdCANFrames[2048][8]; -U32 dbgRcvdCANFrameTS[2048]; -U32 dbgRcvdCANFrameCh[2048]; -U32 dbgRcvdCANFrameIdx = 0; -U08 dbgXmitCANFrames[2048][8]; -U32 dbgXmitCANFrameTS[2048]; -U32 dbgXmitCANFrameCh[2048]; -U32 dbgXmitCANFrameIdx = 0; -U32 dbgCANOutIdx = 0; -#endif - // ********** private function prototypes ********** #ifdef DEBUG_ENABLED @@ -336,24 +324,7 @@ { transmitNextUARTPacket(); } -#ifdef CAN_TEST - if ( dbgRcvdCANFrameIdx >= 2000 ) - { -// U32 i = dbgCANOutIdx; -// char debugStr[ 150 ]; -// -// dbgCANOutIdx++; -// if ( dbgCANOutIdx < 2000 ) -// { -// sprintf( debugStr, "%8d %4d %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X %8d %4d %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", -// dbgRcvdCANFrameTS[i], dbgRcvdCANFrameCh[i], dbgRcvdCANFrames[i][0], dbgRcvdCANFrames[i][1], dbgRcvdCANFrames[i][2], dbgRcvdCANFrames[i][3], dbgRcvdCANFrames[i][4], dbgRcvdCANFrames[i][5], dbgRcvdCANFrames[i][6], dbgRcvdCANFrames[i][7], -// dbgXmitCANFrameTS[i], dbgXmitCANFrameCh[i], dbgXmitCANFrames[i][0], dbgXmitCANFrames[i][1], dbgXmitCANFrames[i][2], dbgXmitCANFrames[i][3], dbgXmitCANFrames[i][4], dbgXmitCANFrames[i][5], dbgXmitCANFrames[i][6], dbgXmitCANFrames[i][7]); -// sendDebugData( (U08*)debugStr, strlen(debugStr) ); -// printf(debugStr); -// } - } #endif -#endif } /************************************************************************* @@ -393,19 +364,6 @@ // if packet retrieved, add to buffer if ( result != 0 ) { -#ifdef CAN_TEST - if ( dbgRcvdCANFrameIdx >= 2000 ) - { - result = 99; // Break point here - } - else - { - dbgRcvdCANFrameTS[dbgRcvdCANFrameIdx] = getMSTimerCount(); - dbgRcvdCANFrameCh[dbgRcvdCANFrameIdx] = srcCANBox; - memcpy( &dbgRcvdCANFrames[dbgRcvdCANFrameIdx][0], data, 8); - dbgRcvdCANFrameIdx++; - } -#endif //#ifdef DEBUG_ENABLED // if ( srcCANBox == COMM_BUFFER_IN_CAN_PC ) // { @@ -656,19 +614,6 @@ memcpy( lastCANPacketSent, data, CAN_MESSAGE_PAYLOAD_SIZE ); lastCANPacketSentChannel = mBox; lastCANPacketSentTimeStamp = getMSTimerCount(); -#ifdef CAN_TEST -// if ( dbgXmitCANFrameIdx > 2000 ) -// { -// dataSize = 99; // Break point here -// } -// else -// { -// dbgXmitCANFrameTS[dbgXmitCANFrameIdx] = getMSTimerCount(); -// dbgXmitCANFrameCh[dbgXmitCANFrameIdx] = mBox; -// memcpy( &dbgXmitCANFrames[dbgXmitCANFrameIdx][0], data, 8); -// dbgXmitCANFrameIdx++; -// } -#endif if ( 0 != canTransmit( canREG1, mBox, data ) ) { result = CAN_MESSAGE_PAYLOAD_SIZE; @@ -998,10 +943,6 @@ static void checkTooManyBadMsgCRCs( void ) { U32 listTimeInMS; -#ifdef CAN_TEST - static U32 crcErrorCtr = 0; - crcErrorCtr++; -#endif // replace oldest bad CRC in list with this new one badCRCTimeStamps[ badCRCListIdx ] = getMSTimerCount(); @@ -1014,10 +955,8 @@ if ( ( badCRCListCount >= MAX_COMM_CRC_FAILURES ) && ( listTimeInMS <= MAX_COMM_CRC_FAILURE_WINDOW_MS ) ) { #ifndef DISABLE_CRC_ERROR -#ifndef CAN_TEST activateAlarmNoData( ALARM_ID_COMM_TOO_MANY_BAD_CRCS ); #endif -#endif } } @@ -1173,6 +1112,14 @@ handleUFPauseResumeRequest( message ); break; + case MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST: + handleChangeUFSettingsRequest( message ); + break; + + case MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE: + handleChangeUFSettingsConfirmation( message ); + break; + case MSG_ID_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -24,6 +24,7 @@ #include "DialInFlow.h" #include "Dialysis.h" #include "MsgQueues.h" +#include "ModeTreatment.h" #include "PresOccl.h" #include "WatchdogMgmt.h" #include "SystemCommMessages.h" @@ -81,12 +82,33 @@ typedef struct { + U32 treatmentSubMode; + U32 uFState; + U32 salineBolusState; +} TREATMENT_STATE_DATA_T; + +typedef struct +{ F32 res1PrimaryLoadCell; F32 res1BackupLoadCell; F32 res2PrimaryLoadCell; F32 res2BackupLoadCell; } LOAD_CELL_READINGS_PAYLOAD_T; +typedef struct +{ + F32 volume_mL; + UF_ADJ_T adjustType; +} UF_SETTINGS_CHANGE_REQ_PAYLOAD_T; + +typedef struct +{ + BOOL confirmed; + F32 volume_mL; + U32 treatTime_min; + F32 uFRate_mL_min; +} UF_SETTINGS_CHANGE_CONFIRMATION_PAYLOAD_T; + #pragma pack(pop) // ********** private data ********** @@ -286,8 +308,11 @@ { OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T payload; - memcpy( &payload, message->payload, sizeof(OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T) ); - userConfirmOffButton( payload.confirmed ); + if ( message->hdr.payloadLen == sizeof(OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T) ) + { + memcpy( &payload, message->payload, sizeof(OFF_BUTTON_MESSAGE_FROM_UI_PAYLOAD_T) ); + userConfirmOffButton( payload.confirmed ); + } } /************************************************************************* @@ -302,19 +327,22 @@ *************************************************************************/ void handleLoadCellReadingsFromDG( MESSAGE_T *message ) { + BOOL result = FALSE; + if ( message->hdr.payloadLen == sizeof(LOAD_CELL_READINGS_PAYLOAD_T) ) { LOAD_CELL_READINGS_PAYLOAD_T payload; memcpy( &payload, message->payload, sizeof(LOAD_CELL_READINGS_PAYLOAD_T) ); - setNewLoadCellReadings( payload.res1PrimaryLoadCell, payload.res1BackupLoadCell, payload.res2PrimaryLoadCell, payload.res2BackupLoadCell ); + result = setNewLoadCellReadings( payload.res1PrimaryLoadCell, payload.res1BackupLoadCell, payload.res2PrimaryLoadCell, payload.res2BackupLoadCell ); } + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } /************************************************************************* * @brief - * The handleLoadCellReadingsFromDG function handles a load cell readings \n - * message from the DG. + * The handleUFPauseResumeRequest function handles a ultrafiltration pause \n + * or resume request message from the UI. * @details * Inputs : none * Outputs : message handled @@ -323,23 +351,122 @@ *************************************************************************/ void handleUFPauseResumeRequest( MESSAGE_T *message ) { + BOOL result = FALSE; + if ( message->hdr.payloadLen == sizeof(U32) ) { - U32 cmd; + U32 cmd; memcpy( &cmd, message->payload, sizeof(U32) ); if ( UF_CMD_PAUSE == cmd ) { - pauseUF(); + result = pauseUF(); } else if ( UF_CMD_RESUME == cmd ) { - resumeUF(); + result = resumeUF(); } } + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } /************************************************************************* + * @brief + * The handleChangeUFSettingsRequest function handles a ultrafiltration \n + * change settings request message from the UI. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleChangeUFSettingsRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(UF_SETTINGS_CHANGE_REQ_PAYLOAD_T) ) + { + UF_SETTINGS_CHANGE_REQ_PAYLOAD_T payload; + + memcpy( &payload, message->payload, sizeof(UF_SETTINGS_CHANGE_REQ_PAYLOAD_T) ); + + result = verifyUFSettingsChange( payload.volume_mL, payload.adjustType ); + } + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/************************************************************************* + * @brief + * The sendChangeUFSettingsResponse function constructs a UF change settings \n + * response to the UI and queues the msg for transmit on the appropriate CAN \n + * channel. + * @details + * Inputs : none + * Outputs : UF change settings response msg constructed and queued. + * @param accepted : alarm status record + * @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, U32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ) +{ + BOOL result; + F32 volume_L = (F32)volume_mL / (F32)ML_PER_LITER; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // 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 ); + + memcpy( payloadPtr, &accepted, sizeof( BOOL ) ); + payloadPtr += sizeof( BOOL ); + memcpy( payloadPtr, &volume_L, sizeof( F32 ) ); + payloadPtr += sizeof( F32 ); + memcpy( payloadPtr, &time_min, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &ufRate_mL_min, sizeof( F32 ) ); + payloadPtr += sizeof( F32 ); + memcpy( payloadPtr, &timeDiff, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &rateDiff, 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_UI, ACK_REQUIRED ); + + return result; +} + +/************************************************************************* + * @brief + * The handleChangeUFSettingsConfirmation function handles a ultrafiltration \n + * change setting confirmation message from the UI. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +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.confirmed, payload.volume_mL, payload.treatTime_min, payload.uFRate_mL_min ); + } + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, 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. @@ -671,57 +798,66 @@ /************************************************************************* * @brief - * The broadcastPowerOffWarning function constructs a power off warning msg to \n + * The broadcastTreatmentState function constructs a treatment state msg to \n * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details * Inputs : none - * Outputs : power off warning msg constructed and queued + * Outputs : treatment state msg constructed and queued + * @param subMode : Current state (sub-mode) of treatment. + * @param uFState : Current state of ultrafiltration. + * @param salineBolusState : TRUE if saline bolus in progress, FALSE if not. * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastPowerOffWarning( void ) +BOOL broadcastTreatmentState( U32 subMode, U32 uFState, BOOL salineBolusState ) { BOOL result; MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + TREATMENT_STATE_DATA_T payload; // create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_POWER_OFF_WARNING; - msg.hdr.payloadLen = 0; + msg.hdr.msgID = MSG_ID_TREATMENT_STATE; + msg.hdr.payloadLen = sizeof( TREATMENT_STATE_DATA_T ); + payload.treatmentSubMode = subMode; + payload.uFState = uFState; + payload.salineBolusState = salineBolusState; + + memcpy( payloadPtr, &payload, sizeof( TREATMENT_STATE_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 ); return result; } - -#ifdef CAN_TEST -void broadcastCANTest1LargeFrequentMessage() +/************************************************************************* + * @brief + * The broadcastPowerOffWarning function constructs a power off warning msg to \n + * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : power off warning msg constructed and queued + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastPowerOffWarning( void ) { - static U16 seqNo = 0; + BOOL result; MESSAGE_T msg; - U32 i; // create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_HD_CAN_TEST_1_LARGE_FREQ; - msg.hdr.payloadLen = 96; + msg.hdr.msgID = MSG_ID_POWER_OFF_WARNING; + msg.hdr.payloadLen = 0; - for ( i = 0; i < 12; i++ ) - { - memcpy(&msg.payload[i*8], &seqNo, 2); - seqNo++; - } - memcpy(&msg.payload[94], &seqNo, 2); - seqNo++; - // 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_BROADCAST, ACK_NOT_REQUIRED ); + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); + + return result; } -#endif - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -1298,5 +1434,3 @@ * @return none *************************************************************************/ DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutLoadCellWeightOverrideRequest, testSetDialOutLoadCellWeightOverride, testResetDialOutLoadCellWeightOverride ) - - Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -42,6 +42,12 @@ // MSG_ID_USER_UF_PAUSE_RESUME_REQUEST void handleUFPauseResumeRequest( MESSAGE_T *message ); +// MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST +void handleChangeUFSettingsRequest( MESSAGE_T *message ); +// MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE +BOOL sendChangeUFSettingsResponse( BOOL accepted, U32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ); +// MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE +void handleChangeUFSettingsConfirmation( MESSAGE_T *message ); // MSG_ID_ALARM_STATUS BOOL broadcastAlarmStatus( COMP_ALARM_STATUS_T almStatus ); @@ -68,14 +74,12 @@ // MSG_ID_TREATMENT_TIME BOOL broadcastTreatmentTime( U32 secsTotTreatment, U32 secsElapsed, U32 secsRemaining ); +// MSG_ID_TREATMENT_STATE +BOOL broadcastTreatmentState( U32 subMode, U32 uFState, BOOL salineBolusState ); + // MSG_ID_POWER_OFF_WARNING BOOL broadcastPowerOffWarning( void ); -#ifdef CAN_TEST -// MSG_ID_HD_CAN_TEST_1_LARGE_FREQ -void broadcastCANTest1LargeFrequentMessage(); -#endif - // *********** public test support message functions ********** #ifdef DEBUG_ENABLED Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) @@ -305,25 +305,3 @@ * @return TRUE if override successful, FALSE if not *************************************************************************/ DATA_ARRAY_OVERRIDE_FUNC( BOOL, testSetWatchdogTaskCheckInOverride, testResetWatchdogTaskCheckInOverride, watchdogTaskCheckedIn, task, NUM_OF_TASKS-1 ) - - - - - - - - - - - - - - - - - - - - - -