Index: firmware/.cproject =================================================================== diff -u -r814ca4e0484661cbc2be03f50cfc11155abdc803 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/.cproject (.../.cproject) (revision 814ca4e0484661cbc2be03f50cfc11155abdc803) +++ firmware/.cproject (.../.cproject) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -15,31 +15,26 @@ - - Index: firmware/.launches/HD.launch =================================================================== diff -u -rb831c4f803bd92f6a16f854e3d02222fe76a379e -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/.launches/HD.launch (.../HD.launch) (revision b831c4f803bd92f6a16f854e3d02222fe76a379e) +++ firmware/.launches/HD.launch (.../HD.launch) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -2,9 +2,11 @@ + + @@ -13,7 +15,9 @@ + + @@ -36,15 +40,19 @@ + + + + @@ -54,13 +62,14 @@ + - + Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -39,7 +39,7 @@ #define MAX_BLOOD_FLOW_RATE 500 // mL/min #define MIN_BLOOD_FLOW_RATE 100 // mL/min -#define MAX_BLOOD_PUMP_PWM_STEP_CHANGE 0.005 // max duty cycle change when ramping +#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/DialInFlow.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -40,7 +40,7 @@ #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.005 // duty cycle TODO - fixed or parameterized or set in motor controller? +#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/DialOutFlow.c =================================================================== diff -u -rbe6802eb077d77af6a2334508c428cc50a02ed39 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision be6802eb077d77af6a2334508c428cc50a02ed39) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -40,7 +40,7 @@ #define MAX_DIAL_OUT_FLOW_RATE 650 // mL/min #define MIN_DIAL_OUT_FLOW_RATE 100 // mL/min -#define MAX_DIAL_OUT_PUMP_PWM_STEP_CHANGE 0.005 // max duty cycle change when ramping +#define MAX_DIAL_OUT_PUMP_PWM_STEP_CHANGE 0.01 // max duty cycle change when ramping #define MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.88 // controller will error if PWM duty cycle > 90%, so set max to 88% #define MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.12 // controller will error if PWM duty cycle < 10%, so set min to 12% @@ -395,6 +395,10 @@ isDialOutPumpOn = TRUE; result = DIAL_OUT_PUMP_RAMPING_UP_STATE; } + else + { + dialOutPumpPWMDutyCyclePct = 0.0; + } return result; } @@ -545,6 +549,7 @@ *************************************************************************/ static void stopDialOutPump( void ) { + dialOutPumpPWMDutyCyclePctSet = 0.0; setDialOutPumpControlSignalPWM( 0 ); SET_DOP_STOP(); isDialOutPumpOn = FALSE; @@ -608,7 +613,7 @@ static void publishDialOutFlowData( void ) { // publish dialysate outlet pump and UF volume data on interval - if ( ++dialOutFlowDataPublicationTimerCounter > DIAL_OUT_DATA_PUB_INTERVAL ) + if ( ++dialOutFlowDataPublicationTimerCounter > getPublishDialOutDataInterval() ) { dialOutBroadCastVariables.refUFVolMl = getTotalTargetDialOutUFVolumeInMl(); dialOutBroadCastVariables.measUFVolMl = getTotalMeasuredUFVolumeInMl(); @@ -637,7 +642,7 @@ * @param none * @return the current dialysate out flow data publication interval (in ms). *************************************************************************/ -DATA_GET( U32, getPublishDialOutFlowDataInterval, DialOutDataPublishInterval ) +static DATA_GET( U32, getPublishDialOutDataInterval, DialOutDataPublishInterval ) /************************************************************************* * @brief Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r60a95cb6e1325abd179b4a01d83b8aabe20ccda5 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 60a95cb6e1325abd179b4a01d83b8aabe20ccda5) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -373,6 +373,13 @@ 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/Modes/Dialysis.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -14,24 +14,66 @@ * **************************************************************************/ +#include "BloodFlow.h" +#include "Buttons.h" #include "Dialysis.h" +#include "DialInFlow.h" +#include "DialOutFlow.h" #include "OperationModes.h" +#include "Timers.h" #include "ModeTreatment.h" -// ********** private data ********** +// ********** private definitions ********** +typedef enum Dialysis_States +{ + DIALYSIS_START_STATE = 0, + DIALYSIS_UF_STATE, + DIALYSIS_SOLUTION_INFUSION_STATE, + NUM_OF_DIALYSIS_STATES +} DIALYSIS_STATE_T; + typedef enum UF_States { - UF_PAUSED_STATE = 0, + UF_START_STATE = 0, + UF_PAUSED_STATE, UF_RUNNING_STATE, UF_COMPLETED_OR_OFF_STATE, NUM_OF_UF_STATES } UF_STATE_T; +// ********** private data ********** + +static DIALYSIS_STATE_T currentDialysisState; +static UF_STATE_T currentUFState; + +static F32 refUFVolume; +static F32 measUFVolume; +static F32 resStartVolume; +static F32 measUFVolumeFromPriorReservoirs; + +static U32 uFTimeMS; +static U32 lastUFTimeStamp; + +static U32 setBloodFlowRate; +static U32 setDialysateFlowRate; +static F32 maxUFVolumeML; +static F32 setUFRate; + // ********** private function prototypes ********** +static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ); +static DIALYSIS_STATE_T handleDialysisSolutionInfusionState( void ); + +static UF_STATE_T handleUFStartState( void ); +static UF_STATE_T handleUFPausedState( void ); +static UF_STATE_T handleUFRunningState( void ); +static UF_STATE_T handleUFCompletedOrOffState( void ); + +static void updateUFVolumes( void ); + /************************************************************************* - * @brief initDialysis + * @brief * The initDialysis function initializes the Dialysis module. * @details * Inputs : none @@ -41,10 +83,25 @@ *************************************************************************/ void initDialysis( void ) { + currentDialysisState = DIALYSIS_START_STATE; + currentUFState = UF_START_STATE; + + refUFVolume = 0.0; + measUFVolume = 0.0; + resStartVolume = 0.0; + measUFVolumeFromPriorReservoirs = 0.0; + + uFTimeMS = 0; + lastUFTimeStamp = 0; + + setBloodFlowRate = 0; + setDialysateFlowRate = 0; + maxUFVolumeML = 0.0; + setUFRate = 0.0; } /************************************************************************* - * @brief transitionToDialysis + * @brief * The transitionToDialysis function prepares for transition to dialysis sub-mode. * @details * Inputs : none @@ -54,18 +111,278 @@ *************************************************************************/ void transitionToDialysis( void ) { + // while in treatment mode, we may transition in and out of dialysis sub-mode. + // we'll want to retain our state to facilitate resumption of dialysis. } /************************************************************************* - * @brief execDialysis - * The execDialysis function executes the Dialysis sub-mode state machine. + * @brief + * The setDialysisParams function sets the dialysis treatment parameters. * @details * Inputs : none - * Outputs : + * Outputs : dialysis treatment parameters are set. + * @param bPFlow : target blood pump flow rate (in mL/min). + * @param dPFlow : target dialysate inlet pump flow rate (in mL/min). + * @param maxUFVol : maximum ultrafiltration volume (in mL). + * @param uFRate : target ultrafiltration rate (in mL/min). + * @return none + *************************************************************************/ +void setDialysisParams( U32 bPFlow, U32 dPFlow, F32 maxUFVol, F32 uFRate ) +{ + setBloodFlowRate = bPFlow; + setDialysateFlowRate = dPFlow; + maxUFVolumeML = maxUFVol; + setUFRate = uFRate; +} + +/************************************************************************* + * @brief + * The startDialysis function starts/resumes dialysis. + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ +void startDialysis( void ) +{ + lastUFTimeStamp = getMSTimerCount(); + setDialOutUFVolumes( refUFVolume, measUFVolume ); + setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); +} + +/************************************************************************* + * @brief + * The stopDialysis function stops dialysis. This may be due to an alarm \n + * or user pressed the stop button. Dialysis may be resumed later. + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ +void stopDialysis( void ) +{ + setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); +} + +/************************************************************************* + * @brief + * The execDialysis function executes the Dialysis sub-mode state machine. + * @details + * Inputs : currentDialysisState + * Outputs : currentDialysisState * @param none * @return none *************************************************************************/ void execDialysis( void ) { + switch ( currentDialysisState ) + { + case DIALYSIS_START_STATE: + resStartVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); // always start dialysis w/ reservoir 1 + currentDialysisState = DIALYSIS_UF_STATE; + break; + + case DIALYSIS_UF_STATE: + currentDialysisState = handleDialysisUltrafiltrationState(); + break; + + case DIALYSIS_SOLUTION_INFUSION_STATE: + currentDialysisState = handleDialysisSolutionInfusionState(); + break; + + default: + // TODO - s/w fault + break; + } } +/************************************************************************* + * @brief + * The handleDialysisUltrafiltrationState function handles the ultrafiltration \n + * state of the Dialysis state machine. + * @details + * Inputs : none + * Outputs : none + * @return next Dialysis state. + *************************************************************************/ +static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ) +{ + DIALYSIS_STATE_T result = DIALYSIS_UF_STATE; + + switch ( currentUFState ) + { + case UF_START_STATE: + currentUFState = handleUFStartState(); + break; + + case UF_PAUSED_STATE: + currentUFState = handleUFPausedState(); + break; + + case UF_RUNNING_STATE: + currentUFState = handleUFRunningState(); + break; + + case UF_COMPLETED_OR_OFF_STATE: + currentUFState = handleUFCompletedOrOffState(); + break; + + default: + // TODO - s/w fault + break; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleDialysisSolutionInfusionState function handles the solution \n + * infustion state of the Dialysis state machine. + * @details + * Inputs : none + * Outputs : none + * @return next Dialysis state. + *************************************************************************/ +static DIALYSIS_STATE_T handleDialysisSolutionInfusionState( void ) +{ + DIALYSIS_STATE_T result = DIALYSIS_SOLUTION_INFUSION_STATE; + + return result; +} + +/************************************************************************* + * @brief + * The handleUFStartState function handles the Start state of the \n + * ultrafiltration state machine. + * @details + * Inputs : none + * Outputs : none + * @return next ultrafiltration state. + *************************************************************************/ +static UF_STATE_T handleUFStartState( void ) +{ + UF_STATE_T result; + + if ( maxUFVolumeML < NEARLY_ZERO ) + { + result = UF_COMPLETED_OR_OFF_STATE; + } + else + { + lastUFTimeStamp = getMSTimerCount(); + uFTimeMS = 0; + result = UF_RUNNING_STATE; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleUFPausedState function handles the Paused state of the \n + * ultrafiltration state machine. + * @details + * Inputs : none + * Outputs : none + * @return next ultrafiltration state. + *************************************************************************/ +static UF_STATE_T handleUFPausedState( void ) +{ + UF_STATE_T result = UF_PAUSED_STATE; + + // calculate UF volumes and provide to dialysate outlet pump controller + updateUFVolumes(); + + // TODO - test code - remove later + if ( TRUE == isStopButtonPressed() ) + { + lastUFTimeStamp = getMSTimerCount(); // restart UF time accumulation + result = UF_RUNNING_STATE; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleUFRunningState function handles the Running state of the \n + * ultrafiltration state machine. + * @details + * Inputs : none + * Outputs : none + * @return next ultrafiltration state. + *************************************************************************/ +static UF_STATE_T handleUFRunningState( void ) +{ + UF_STATE_T result = UF_RUNNING_STATE; + U32 newTime = getMSTimerCount(); + U32 msSinceLast = calcTimeBetween( lastUFTimeStamp, newTime ); + + // update UF time + uFTimeMS += msSinceLast; + lastUFTimeStamp = newTime; + + // calculate UF volumes and provide to dialysate outlet pump controller + updateUFVolumes(); + + // TODO - test code - remove later + if ( TRUE == isStopButtonPressed() ) + { + result = UF_PAUSED_STATE; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleUFCompletedOrOffState function handles the UF Completed or Off \n + * state of the ultrafiltration state machine. + * @details + * Inputs : none + * Outputs : none + * @return next ultrafiltration state + *************************************************************************/ +static UF_STATE_T handleUFCompletedOrOffState( void ) +{ + UF_STATE_T result = UF_COMPLETED_OR_OFF_STATE; + + // calculate UF volumes and provide to dialysate outlet pump controller + updateUFVolumes(); + + // TODO - test code - remove later + if ( TRUE == isStopButtonPressed() ) + { + // do nothing + } + + return result; +} + +/************************************************************************* + * @brief + * The updateUFVolumes function updates the ultrafiltration volumes based on \n + * set UF rate, latest UF elapsed time, and the latest load cell weight for the \n + * currently used reservoir. Updated UF volumes are then sent to the dialysate \n + * outlet pump controller. + * @details + * Inputs : setUFRate, uFTimeMS, load cell weight + * Outputs : refUFVolume, measUFVolume + * @return none + *************************************************************************/ +static void updateUFVolumes( void ) +{ + F32 latestResVolume = getLoadCellWeightInGrams( LOAD_CELL_RESERVOIR_1_PRIMARY ); // TODO - just res 1 for now - add reservoir switching, mgmt later. + + // calculate UF volumes and provide to dialysate outlet pump controller + refUFVolume = ( ( (F32)uFTimeMS / MS_PER_SECOND ) / SEC_PER_MIN ) * setUFRate; + measUFVolume = measUFVolumeFromPriorReservoirs + ( latestResVolume - resStartVolume ); + setDialOutUFVolumes( refUFVolume, measUFVolume ); +} + + Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r07a5add2dff254f7be3699e4efac2b99d3554847 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 07a5add2dff254f7be3699e4efac2b99d3554847) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -23,4 +23,9 @@ void transitionToDialysis( void ); // prepares for transition to dialysis sub-mode void execDialysis( void ); // execute the dialysis sub-mode state machine (call from ModeTreatment) +void setDialysisParams( U32 bPFlow, U32 dPFlow, F32 maxUFVol, F32 uFRate ); + +void startDialysis( void ); +void stopDialysis( void ); + #endif Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -rfe01fd0124c0c43737474781730608d55d0f0bda -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision fe01fd0124c0c43737474781730608d55d0f0bda) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -119,8 +119,8 @@ break; case POST_STATE_RTC: - testStatus = execRTCSelfTest(); - postState = handlePOSTStatus( testStatus ); + //testStatus = execRTCSelfTest(); + postState = POST_STATE_STUCK_BUTTON; //handlePOSTStatus( testStatus ); break; case POST_STATE_STUCK_BUTTON: Index: firmware/App/Modes/ModeOpParams.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModeOpParams.c (.../ModeOpParams.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModeOpParams.c (.../ModeOpParams.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -56,10 +56,13 @@ *************************************************************************/ void transitionToOpParamsMode( void ) { - // temporary test code - alarm lamp fault + // temporary test code. TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 325, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +#else +#endif #ifdef RM46_EVAL_BOARD_TARGET start = getMSTimerCount(); #endif @@ -78,7 +81,9 @@ { BOOL stop = isStopButtonPressed(); +#ifndef UF_TEST_ENABLED if ( TRUE == stop ) +#endif { requestNewOperationMode( MODE_PRET ); } Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -56,10 +56,13 @@ *************************************************************************/ void transitionToPostTreatmentMode( void ) { - // temporary test code - alarm lamp high alarm + // temporary test code. TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 100, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 100, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 100, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); +#else +#endif #ifdef RM46_EVAL_BOARD_TARGET start = getMSTimerCount(); #endif @@ -78,7 +81,9 @@ { BOOL stop = isStopButtonPressed(); +#ifndef UF_TEST_ENABLED if ( TRUE == stop ) +#endif { requestNewOperationMode( MODE_STAN ); } Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -56,10 +56,13 @@ *************************************************************************/ void transitionToPreTreatmentMode( void ) { - // temporary test code - alarm lamp low alarm + // temporary test code. TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +#else +#endif #ifdef RM46_EVAL_BOARD_TARGET start = getMSTimerCount(); #endif @@ -78,7 +81,9 @@ { BOOL stop = isStopButtonPressed(); +#ifndef UF_TEST_ENABLED if ( TRUE == stop ) +#endif { requestNewOperationMode( MODE_TREA ); } Index: firmware/App/Modes/ModePrescription.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModePrescription.c (.../ModePrescription.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModePrescription.c (.../ModePrescription.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -56,10 +56,13 @@ *************************************************************************/ void transitionToPrescriptionMode( void ) { - // temporary test code - alarm lamp Off + // temporary test code. TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 400, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 425, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +#else +#endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board start = getMSTimerCount(); @@ -79,7 +82,9 @@ { BOOL stop = isStopButtonPressed(); +#ifndef UF_TEST_ENABLED if ( TRUE == stop ) +#endif { requestNewOperationMode( MODE_OPAR ); } Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -55,10 +55,12 @@ *************************************************************************/ void transitionToStandbyMode( void ) { - // temporary test code - alarm lamp OK + // temporary test code - TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +#endif #ifdef RM46_EVAL_BOARD_TARGET start = getMSTimerCount(); #endif Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -17,22 +17,61 @@ #include "Common.h" #include "AlarmLamp.h" #include "BloodFlow.h" +#include "Buttons.h" #include "DialInFlow.h" #include "DialOutFlow.h" +#include "Dialysis.h" #include "Buttons.h" #include "OperationModes.h" +#include "SystemCommMessages.h" +#include "Timers.h" +#include "TreatmentStop.h" #include "ModeTreatment.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; #endif +// ********** private definitions ********** + +typedef enum Treatment_States +{ + TREATMENT_START_STATE = 0, + TREATMENT_DIALYSIS_STATE, + TREATMENT_STOP_STATE, + TREATMENT_RINSEBACK_STATE, + TREATMENT_RB_RC_PAUSE_STATE, + TREATMENT_RECIRC_STATE, + TREATMENT_BYPASS_RECIRC_STATE, + TREATMENT_END_STATE, + NUM_OF_TREATMENT_STATES +} TREATMENT_STATE_T; + // ********** private data ********** +static TREATMENT_STATE_T currentTreatmentState; + +static U32 presTreatmentTimeSecs; +static U32 presBloodFlowRate; +static U32 presDialysateFlowRate; +static F32 presMaxUFVolumeML; +static F32 presUFRate; + +static U32 treatmentTimeMS; +static U32 lastTreatmentTimeStamp; + +#ifdef UF_TEST_ENABLED +static BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; +#endif + // ********** private function prototypes ********** +static TREATMENT_STATE_T handleTreatmentStartState( void ); +static TREATMENT_STATE_T handleTreatmentDialysisState( void ); +static TREATMENT_STATE_T handleTreatmentStopState( void ); + /************************************************************************* - * @brief initTreatmentMode + * @brief * The initTreatmentMode function initializes the Treatment Mode module. * @details * Inputs : none @@ -42,10 +81,11 @@ *************************************************************************/ void initTreatmentMode( void ) { + currentTreatmentState = TREATMENT_START_STATE; } /************************************************************************* - * @brief transitionToTreatmentMode + * @brief * The transitionToTreatmentMode function prepares for transition to treatment mode. * @details * Inputs : none @@ -55,18 +95,25 @@ *************************************************************************/ void transitionToTreatmentMode( void ) { - // temporary test code - alarm lamp medium alarm + // initialize mode each time we transition to it + initTreatmentMode(); + // initialize treatment sub-modes each time we transition to treatment mode + initDialysis(); + initTreatmentStop(); + // temporary test code. TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); +#endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board start = getMSTimerCount(); #endif } /************************************************************************* - * @brief execTreatmentMode + * @brief * The execTreatmentMode function executes the Treatment Mode state machine. * @details * Inputs : none @@ -76,12 +123,67 @@ *************************************************************************/ void execTreatmentMode( void ) { + U32 elapsedTreatmentTimeInSecs; + +#ifndef UF_TEST_ENABLED BOOL stop = isStopButtonPressed(); if ( TRUE == stop ) { requestNewOperationMode( MODE_POST ); } +#else + // treatment mode state machine + switch ( currentTreatmentState ) + { + case TREATMENT_START_STATE: + currentTreatmentState = handleTreatmentStartState(); + break; + + case TREATMENT_DIALYSIS_STATE: + currentTreatmentState = handleTreatmentDialysisState(); + break; + + case TREATMENT_STOP_STATE: + currentTreatmentState = handleTreatmentStopState(); + break; + + case TREATMENT_RINSEBACK_STATE: + // TODO - implement + break; + + case TREATMENT_RB_RC_PAUSE_STATE: + // TODO - implement + break; + + case TREATMENT_RECIRC_STATE: + // TODO - implement + break; + + case TREATMENT_BYPASS_RECIRC_STATE: + // TODO - implement + break; + + case TREATMENT_END_STATE: + // TODO - implement + requestNewOperationMode( MODE_POST ); // TODO - test code - remove later + break; + + default: + // TODO - s/w fault + break; + } + + // update treatment time stats and broadcast - end treatment if time + elapsedTreatmentTimeInSecs = treatmentTimeMS / MS_PER_SECOND; + if ( elapsedTreatmentTimeInSecs >= presTreatmentTimeSecs ) + { + stopDialysis(); + elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; + currentTreatmentState = TREATMENT_END_STATE; + } + broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, presTreatmentTimeSecs - elapsedTreatmentTimeInSecs ); +#endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 10 sec if ( TRUE == didTimeout( start, 10000U ) ) @@ -91,3 +193,108 @@ #endif } +/************************************************************************* + * @brief + * The handleTreatmentStartState function handles the Start state of \n + * the Treatment Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentStartState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_DIALYSIS_STATE; + + // initialize treatment time + treatmentTimeMS = 0; + lastTreatmentTimeStamp = getMSTimerCount(); + + // get prescription settings TODO - hard-coded for now + presTreatmentTimeSecs = 3600; + presBloodFlowRate = 300; + presDialysateFlowRate = 400; + presMaxUFVolumeML = 300.0; + presUFRate = 20.0; + + // kick dialysis sub-mode off + setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); + startDialysis(); + + return result; +} + +/************************************************************************* + * @brief + * The handleTreatmentDialysisState function handles the Dialysis state of \n + * the Treatment Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentDialysisState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_DIALYSIS_STATE; + U32 newTime = getMSTimerCount(); + U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); + + // update UF time + treatmentTimeMS += msSinceLast; + lastTreatmentTimeStamp = newTime; + + execDialysis(); + + if ( getOffButtonState() == BUTTON_STATE_PRESSED ) + { + if ( lastOffButtonState == BUTTON_STATE_RELEASED ) + { + lastOffButtonState = BUTTON_STATE_PRESSED; + stopDialysis(); + result = TREATMENT_STOP_STATE; + } + } + else + { + lastOffButtonState = BUTTON_STATE_RELEASED; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleTreatmentStopState function executes the Stop state of the \n + * Treatment Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentStopState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_STOP_STATE; + + execTreatmentStop(); + + if ( getOffButtonState() == BUTTON_STATE_PRESSED ) + { + if ( lastOffButtonState == BUTTON_STATE_RELEASED ) + { + lastOffButtonState = BUTTON_STATE_PRESSED; + lastTreatmentTimeStamp = getMSTimerCount(); + startDialysis(); + result = TREATMENT_DIALYSIS_STATE; + } + } + else + { + lastOffButtonState = BUTTON_STATE_RELEASED; + } + + return result; +} + Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -r07a5add2dff254f7be3699e4efac2b99d3554847 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 07a5add2dff254f7be3699e4efac2b99d3554847) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -14,9 +14,10 @@ * **************************************************************************/ -#include "TreatmentStop.h" -#include "OperationModes.h" +#include "Buttons.h" #include "ModeTreatment.h" +#include "OperationModes.h" +#include "TreatmentStop.h" // ********** private data ********** @@ -61,5 +62,10 @@ *************************************************************************/ void execTreatmentStop( void ) { + // TODO - test code - remove later + if ( TRUE == isStopButtonPressed() ) + { + requestNewOperationMode( MODE_POST ); + } } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -82,7 +82,7 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_RTC_CONFIG_ERROR { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_DG_COMM_TIMEOUT { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_UI_COMM_TIMEOUT - { ALARM_PRIORITY_HIGH, 0, ALARM_ID_BLOOD_SITTING_WARNING, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_COMM_TOO_MANY_BAD_CRCS + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_COMM_TOO_MANY_BAD_CRCS { ALARM_PRIORITY_LOW, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_TREATMENT_STOPPED_BY_USER { ALARM_PRIORITY_MEDIUM, ALM_ESC_1_MIN, ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_SITTING_WARNING { ALARM_PRIORITY_MEDIUM, ALM_ESC_5_MIN, ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK, FALSE, TRUE , FALSE, TRUE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME @@ -570,10 +570,11 @@ // does active alarm escalate? if ( ALARM_ID_NO_ALARM != alarmTable[ a ].alarmEscalatesTo ) { - U32 secsRemaining = (S32)alarmTable[ a ].alarmEscalatesAfter - ( (S32)calcTimeSince( getAlarmStartTime( a ) ) / MS_PER_SECOND ); + S32 msRemaining = (S32)alarmTable[ a ].alarmEscalatesAfter - (S32)calcTimeSince( getAlarmStartTime( a ) ); + S32 secsRemaining = ( msRemaining / MS_PER_SECOND ) + 1; // time to escalate? - if ( secsRemaining <= 0 ) + if ( msRemaining <= 0 ) { activateAlarmNoData( alarmTable[ a ].alarmEscalatesTo ); clearAlarm( a ); @@ -597,7 +598,7 @@ } // alarm table loop // update alarm escalation properties - if ( ALARM_ID_NO_ALARM == nextAlarmToEscalate ) + if ( TRUE == alarmStatus.systemFault || ALARM_ID_NO_ALARM == nextAlarmToEscalate ) { alarmStatus.alarmsToEscalate = FALSE; alarmStatus.alarmsEscalatesIn = 0; Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -97,6 +97,7 @@ // add requires brief thread protection because there may be multiple sources for transmits trying to add data to a buffer. _disable_IRQ(); +// _disable_FIQ(); bufferGetLock[ buffer ] = TRUE; activeBuffer = activeDoubleBuffer[ buffer ]; @@ -115,6 +116,7 @@ commBufferByteCount[ buffer ][ activeBuffer ] += len; // release thread protection bufferGetLock[ buffer ] = FALSE; +// _enable_FIQ(); _enable_IRQ(); // data successfully added to buffer result = TRUE; @@ -123,6 +125,7 @@ { // release thread protection bufferGetLock[ buffer ] = FALSE; +// _enable_FIQ(); _enable_IRQ(); SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, len ) } @@ -160,6 +163,8 @@ // 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 ) ) ) { @@ -183,6 +188,8 @@ result += remNumOfBytes; } } +// _enable_FIQ(); +// _enable_IRQ(); } else // invalid buffer given { Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -111,6 +111,11 @@ 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 DEBUG_ENABLED +static U08 dbgRcvFromDialin[2048]; +static U32 dbgRcvFromDialinIdx = 0; +#endif + // ********** private function prototypes ********** static void initUARTAndDMA( void ); @@ -122,13 +127,13 @@ static U32 transmitNextUARTPacket( void ); static void processIncomingData( void ); -static U32 parseMessageFromBuffer( U08 *data, U32 len ); +static S32 parseMessageFromBuffer( U08 *data, U32 len ); static void consumeBufferPaddingBeforeSync( COMM_BUFFER_T buffer ); static void processReceivedMessages( void ); static void processReceivedMessage( MESSAGE_T *message ); static void checkForCommTimeouts( void ); -static void checkTooManyBadMsgCRCs( U16 msgID ); +static void checkTooManyBadMsgCRCs( void ); #ifndef ACK_NOT_IMPLEMENTED static BOOL matchACKtoPendingACKList( S16 seqNo ); @@ -333,9 +338,21 @@ // get CAN packet received on given CAN message box if ( FALSE != canIsRxMessageArrived( canREG1, srcCANBox ) ) { - canGetData( canREG1, srcCANBox, data ); - // 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 ); + U32 result = canGetData( canREG1, srcCANBox, data ); + + // 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 ); + } } } else @@ -636,8 +653,9 @@ *************************************************************************/ static void processIncomingData( void ) { - U08 data[ sizeof( MESSAGE_WRAPPER_T ) + 1 ]; + U08 data[ 512 ]; // message work space U32 i; + BOOL badCRCDetected = FALSE; // queue any received messages for ( i = 0; i < NUM_OF_MSG_IN_BUFFERS; i++ ) @@ -658,17 +676,17 @@ if ( numOfBytesInBuffer >= MESSAGE_OVERHEAD_SIZE ) { // peek at minimum of all bytes available or max message size (+1 for sync byte) U32 bytesPeeked = peekFromCommBuffer( MSG_IN_BUFFERS[ i ], data, MIN( numOfBytesInBuffer, sizeof( MESSAGE_WRAPPER_T ) + 1 ) ); - U32 msgSize = parseMessageFromBuffer( data, bytesPeeked ); + S32 msgSize = parseMessageFromBuffer( data, bytesPeeked ); - if ( msgSize > 0 ) + if ( msgSize > 0 ) // valid, complete message found? { MESSAGE_WRAPPER_T rcvMsg; U08 *dataPtr = data+1; // skip over sync byte // consume message (+sync byte) msgSize = getFromCommBuffer( MSG_IN_BUFFERS[ i ], data, msgSize + 1 ); // convert received message data to a message and add to message queue - messagesInBuffer = TRUE; + messagesInBuffer = TRUE; // keep processing this buffer // blank the new message record blankMessageInWrapper( &rcvMsg ); // copy message header portion of message data to the new message @@ -681,10 +699,31 @@ rcvMsg.crc = *dataPtr; // add new message to queue for later processing addToMsgQueue( MSG_Q_IN, &rcvMsg ); + } + else if ( -1 == msgSize ) // candidate message with bad CRC found? + { + badCRCDetected = TRUE; + getFromCommBuffer( MSG_IN_BUFFERS[ i ], data, 1 ); // consume sync byte so we can re-sync +//#ifdef DEBUG_ENABLED +//{ +// // TODO - temporary debug code - remove later +// char debugStr[ 20 ]; +// +// sprintf( debugStr, "%02X", (S32)data[0] ); +// sendDebugData( (U08*)debugStr, strlen(debugStr) ); +//} +//#endif + messagesInBuffer = TRUE; // keep processing this buffer } // looks like there is a complete message in the comm buffer } // enough data left in comm buffer to possibly be a complete message } // while loop to get all complete messages for each comm buffer } // for loop to check all comm buffers for messages + + // if any bad CRCs detected, see if too many + if ( TRUE == badCRCDetected ) + { + checkTooManyBadMsgCRCs(); + } } /************************************************************************* @@ -708,11 +747,27 @@ peekFromCommBuffer( buffer, &data, 1 ); if ( MESSAGE_SYNC_BYTE == data ) { +//#ifdef DEBUG_ENABLED +//{ +// // TODO - temporary debug code - remove later +// char debugStr[ 3 ] = "\n"; +// sendDebugData( (U08*)debugStr, strlen(debugStr) ); +//} +//#endif break; // we found a sync - we're done } else // not a sync byte, so consume it { getFromCommBuffer( buffer, &data, 1 ); +//#ifdef DEBUG_ENABLED +//{ +// // TODO - temporary debug code - remove later +// char debugStr[ 20 ]; +// +// sprintf( debugStr, "%02X ", (U32)data ); +// sendDebugData( (U08*)debugStr, strlen(debugStr) ); +//} +//#endif numOfBytesInBuffer = numberOfBytesInCommBuffer( buffer ); } } @@ -727,14 +782,15 @@ * Outputs : none * @param data : pointer to byte array to search for a message * @param len : # of bytes in the data to search - * @return size of message if found, zero if no complete message found. + * @return size of message if found, zero if no complete message found, \n + * -1 if message found but CRC fails. *************************************************************************/ -static U32 parseMessageFromBuffer( U08 *data, U32 len ) +static S32 parseMessageFromBuffer( U08 *data, U32 len ) { U32 i; U32 payloadSize; U32 msgSize; - U32 result = 0; + S32 result = 0; for ( i = 0; i < len; i++ ) { @@ -751,11 +807,17 @@ msgSize = MESSAGE_OVERHEAD_SIZE + payloadSize; // we now know the size of the message - we can now know if full message is contained in buffer if ( msgSize <= remSize ) - { - result = msgSize; // we found a complete message of this size + { // check CRC to make sure it's a valid message + if ( data[i+msgSize] == crc8( &data[pos], msgSize - 1 ) ) + { + result = msgSize; // we found a complete, valid message of this size + } + else // CRC failed + { + result = -1; // we found a complete, invalid message + } } } - break; } } @@ -783,8 +845,7 @@ // see if any messages received isThereMsgRcvd = getFromMsgQueue( MSG_Q_IN, &message ); if ( TRUE == isThereMsgRcvd ) - { - // TODO - check CRC before processing a message + { // CRC should be good because we checked it during parsing before adding to queue - but check it again for good measure if ( message.crc == crc8( (U08*)(&message), sizeof(MESSAGE_HEADER_T) + message.msg.hdr.payloadLen ) ) { #ifndef ACK_NOT_IMPLEMENTED @@ -811,7 +872,7 @@ } else // CRC failed { - checkTooManyBadMsgCRCs( message.msg.hdr.msgID ); + checkTooManyBadMsgCRCs(); } } } @@ -847,10 +908,9 @@ * @details * Inputs : badCRCTimeStamps[], badCRCListIdx, badCRCListCount * Outputs : possibly a "too many bad CRCs" alarm - * @param msgID : the message ID from the recevied msg that failed CRC check. * @return none *************************************************************************/ -static void checkTooManyBadMsgCRCs( U16 msgID ) +static void checkTooManyBadMsgCRCs( void ) { U32 listTimeInMS; @@ -862,9 +922,9 @@ badCRCListCount = INC_CAP( badCRCListCount, MAX_COMM_CRC_FAILURES ); // check if too many bad CRCs in window of time listTimeInMS = calcTimeSince( badCRCTimeStamps[ badCRCListIdx ] ); - if ( listTimeInMS <= MAX_COMM_CRC_FAILURE_WINDOW_MS ) + if ( ( badCRCListCount >= MAX_COMM_CRC_FAILURES ) && ( listTimeInMS <= MAX_COMM_CRC_FAILURE_WINDOW_MS ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_COMM_TOO_MANY_BAD_CRCS, (U32)msgID ); + activateAlarmNoData( ALARM_ID_COMM_TOO_MANY_BAD_CRCS ); } } @@ -995,6 +1055,7 @@ static void processReceivedMessage( MESSAGE_T *message ) { U16 msgID = message->hdr.msgID; + static U32 bpCurrentOverrideCount = 0; // handle any messages from other sub-systems switch ( msgID ) @@ -1074,6 +1135,7 @@ case MSG_ID_BLOOD_PUMP_MC_MEAS_CURR_OVERRIDE: handleTestBloodPumpMCMeasuredCurrentOverrideRequest( message ); + bpCurrentOverrideCount++; break; case MSG_ID_BLOOD_FLOW_SEND_INTERVAL_OVERRIDE: @@ -1148,6 +1210,38 @@ handleSetRTCTimestamp( message ); break; + case MSG_ID_DIAL_OUT_FLOW_SEND_INTERVAL_OVERRIDE: + handleTestDialOutFlowBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_UF_REF_VOLUME_OVERRIDE: + handleTestDialOutUFReferenceVolumeOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE: + handleTestDialOutUFMeasuredVolumeOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE: + handleTestDialOutPumpMCMeasuredSpeedOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_PUMP_MC_MEAS_CURR_OVERRIDE: + handleTestDialOutPumpMCMeasuredCurrentOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE: + handleTestDialOutPumpMeasuredSpeedOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_PUMP_MEAS_ROTOR_SPEED_OVERRIDE: + handleTestDialOutPumpMeasuredRotorSpeedOverrideRequest( message ); + break; + + case MSG_ID_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE: + handleTestDialOutLoadCellWeightOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -74,6 +74,13 @@ typedef struct { + U32 treatmentTimePrescribedinSec; + U32 treatmentTimeElapsedinSec; + U32 treatmentTimeRemaininginSec; +} TREATMENT_TIME_DATA_T; + +typedef struct +{ F32 res1PrimaryLoadCell; F32 res1BackupLoadCell; F32 res2PrimaryLoadCell; @@ -524,7 +531,7 @@ msg.hdr.msgID = MSG_ID_DIALYSATE_OUT_FLOW_DATA; msg.hdr.payloadLen = sizeof( DIAL_OUT_FLOW_DATA_T ); - memcpy( payloadPtr, &dialOutFlowData, sizeof( DIAL_OUT_FLOW_DATA_T ) ); + memcpy( payloadPtr, dialOutFlowData, sizeof( DIAL_OUT_FLOW_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 ); @@ -601,7 +608,43 @@ return result; } +/************************************************************************* + * @brief + * The broadcastTreatmentTime function constructs a treatment time msg to \n + * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details + * Inputs : none + * Outputs : treatment time data msg constructed and queued + * @param secsTotTreatment : Total treatment time prescribed (in seconds). + * @param secsElapsed : Treatment time elapsed (in seconds). + * @param secsRemaining : Treatment time remaining (in seconds). + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastTreatmentTime( U32 secsTotTreatment, U32 secsElapsed, U32 secsRemaining ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + TREATMENT_TIME_DATA_T payload; + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_TREATMENT_TIME; + msg.hdr.payloadLen = sizeof( TREATMENT_TIME_DATA_T ); + + payload.treatmentTimePrescribedinSec = secsTotTreatment; + payload.treatmentTimeElapsedinSec = secsElapsed; + payload.treatmentTimeRemaininginSec = secsRemaining; + + memcpy( payloadPtr, &payload, sizeof( TREATMENT_TIME_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; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -733,7 +776,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( BUTTON_STATE_T, handleTestOffButtonStateOverrideRequest, testSetOffButtonStateOverride, testResetOffButtonStateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( BUTTON_STATE_T, handleTestOffButtonStateOverrideRequest, testSetOffButtonStateOverride, testResetOffButtonStateOverride ) /************************************************************************* * @brief handleTestStopButtonStateOverrideRequest @@ -745,7 +788,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( BUTTON_STATE_T, handleTestStopButtonStateOverrideRequest, testSetStopButtonStateOverride, testResetStopButtonStateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( BUTTON_STATE_T, handleTestStopButtonStateOverrideRequest, testSetStopButtonStateOverride, testResetStopButtonStateOverride ) /************************************************************************* * @brief handleTestAlarmLampPatternOverrideRequest @@ -757,7 +800,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( LAMP_PATTERN_T, handleTestAlarmLampPatternOverrideRequest, testSetCurrentLampPatternOverride, testResetCurrentLampPatternOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( LAMP_PATTERN_T, handleTestAlarmLampPatternOverrideRequest, testSetCurrentLampPatternOverride, testResetCurrentLampPatternOverride ) /************************************************************************* * @brief handleTestWatchdogCheckInStateOverrideRequest @@ -769,7 +812,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_ARRAY_OVERRIDE_HANDLER_FUNC( BOOL, handleTestWatchdogCheckInStateOverrideRequest, testSetWatchdogTaskCheckInOverride, testResetWatchdogTaskCheckInOverride ) +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32( BOOL, handleTestWatchdogCheckInStateOverrideRequest, testSetWatchdogTaskCheckInOverride, testResetWatchdogTaskCheckInOverride ) /************************************************************************* * @brief handleTestAlarmStateOverrideRequest @@ -781,7 +824,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_ARRAY_OVERRIDE_HANDLER_FUNC( BOOL, handleTestAlarmStateOverrideRequest, testSetAlarmStateOverride, testResetAlarmStateOverride ) +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32( BOOL, handleTestAlarmStateOverrideRequest, testSetAlarmStateOverride, testResetAlarmStateOverride ) /************************************************************************* * @brief handleTestAlarmTimeOverrideRequest @@ -793,7 +836,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_ARRAY_OVERRIDE_HANDLER_FUNC( U32, handleTestAlarmTimeOverrideRequest, testSetAlarmStartOverride, testResetAlarmStartOverride ) +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestAlarmTimeOverrideRequest, testSetAlarmStartOverride, testResetAlarmStartOverride ) /************************************************************************* * @brief handleTestAlarmStatusBroadcastIntervalOverrideRequest @@ -805,7 +848,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( U32, handleTestAlarmStatusBroadcastIntervalOverrideRequest, testSetAlarmStatusPublishIntervalOverride, testResetAlarmStatusPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestAlarmStatusBroadcastIntervalOverrideRequest, testSetAlarmStatusPublishIntervalOverride, testResetAlarmStatusPublishIntervalOverride ) /************************************************************************* * @brief handleTestBloodFlowSetPointOverrideRequest @@ -817,7 +860,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( U32, handleTestBloodFlowSetPointOverrideRequest, testSetTargetBloodFlowRateOverride, testResetTargetBloodFlowRateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestBloodFlowSetPointOverrideRequest, testSetTargetBloodFlowRateOverride, testResetTargetBloodFlowRateOverride ) /************************************************************************* * @brief handleTestBloodFlowMeasuredOverrideRequest @@ -829,7 +872,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestBloodFlowMeasuredOverrideRequest, testSetMeasuredBloodFlowRateOverride, testResetMeasuredBloodFlowRateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestBloodFlowMeasuredOverrideRequest, testSetMeasuredBloodFlowRateOverride, testResetMeasuredBloodFlowRateOverride ) /************************************************************************* * @brief handleTestBloodPumpRotorMeasuredSpeedOverrideRequest @@ -841,7 +884,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestBloodPumpRotorMeasuredSpeedOverrideRequest, testSetMeasuredBloodPumpRotorSpeedOverride, testResetMeasuredBloodPumpRotorSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestBloodPumpRotorMeasuredSpeedOverrideRequest, testSetMeasuredBloodPumpRotorSpeedOverride, testResetMeasuredBloodPumpRotorSpeedOverride ) /************************************************************************* * @brief handleTestBloodPumpMeasuredSpeedOverrideRequest @@ -853,7 +896,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestBloodPumpMeasuredSpeedOverrideRequest, testSetMeasuredBloodPumpSpeedOverride, testResetMeasuredBloodPumpSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestBloodPumpMeasuredSpeedOverrideRequest, testSetMeasuredBloodPumpSpeedOverride, testResetMeasuredBloodPumpSpeedOverride ) /************************************************************************* * @brief handleTestBloodPumpMCMeasuredSpeedOverrideRequest @@ -865,7 +908,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestBloodPumpMCMeasuredSpeedOverrideRequest, testSetMeasuredBloodPumpMCSpeedOverride, testResetMeasuredBloodPumpMCSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestBloodPumpMCMeasuredSpeedOverrideRequest, testSetMeasuredBloodPumpMCSpeedOverride, testResetMeasuredBloodPumpMCSpeedOverride ) /************************************************************************* * @brief handleTestBloodPumpMCMeasuredCurrentOverrideRequest @@ -877,7 +920,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestBloodPumpMCMeasuredCurrentOverrideRequest, testSetMeasuredBloodPumpMCCurrentOverride, testResetMeasuredBloodPumpMCCurrentOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestBloodPumpMCMeasuredCurrentOverrideRequest, testSetMeasuredBloodPumpMCCurrentOverride, testResetMeasuredBloodPumpMCCurrentOverride ) /************************************************************************* * @brief handleTestBloodFlowBroadcastIntervalOverrideRequest @@ -889,7 +932,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( U32, handleTestBloodFlowBroadcastIntervalOverrideRequest, testSetBloodFlowDataPublishIntervalOverride, testResetBloodFlowDataPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestBloodFlowBroadcastIntervalOverrideRequest, testSetBloodFlowDataPublishIntervalOverride, testResetBloodFlowDataPublishIntervalOverride ) /************************************************************************* * @brief handleTestDialInFlowSetPointOverrideRequest @@ -901,7 +944,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( U32, handleTestDialInFlowSetPointOverrideRequest, testSetTargetDialInFlowRateOverride, testResetTargetDialInFlowRateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDialInFlowSetPointOverrideRequest, testSetTargetDialInFlowRateOverride, testResetTargetDialInFlowRateOverride ) /************************************************************************* * @brief handleTestDialInFlowMeasuredOverrideRequest @@ -913,7 +956,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialInFlowMeasuredOverrideRequest, testSetMeasuredDialInFlowRateOverride, testResetMeasuredDialInFlowRateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialInFlowMeasuredOverrideRequest, testSetMeasuredDialInFlowRateOverride, testResetMeasuredDialInFlowRateOverride ) /************************************************************************* * @brief handleTestDialInPumpRotorMeasuredSpeedOverrideRequest @@ -925,7 +968,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialInPumpRotorMeasuredSpeedOverrideRequest, testSetMeasuredDialInPumpRotorSpeedOverride, testResetMeasuredDialInPumpRotorSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialInPumpRotorMeasuredSpeedOverrideRequest, testSetMeasuredDialInPumpRotorSpeedOverride, testResetMeasuredDialInPumpRotorSpeedOverride ) /************************************************************************* * @brief handleTestDialInPumpMeasuredSpeedOverrideRequest @@ -937,7 +980,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialInPumpMeasuredSpeedOverrideRequest, testSetMeasuredDialInPumpSpeedOverride, testResetMeasuredDialInPumpSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialInPumpMeasuredSpeedOverrideRequest, testSetMeasuredDialInPumpSpeedOverride, testResetMeasuredDialInPumpSpeedOverride ) /************************************************************************* * @brief handleTestDialInPumpMCMeasuredSpeedOverrideRequest @@ -949,7 +992,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialInPumpMCMeasuredSpeedOverrideRequest, testSetMeasuredDialInPumpMCSpeedOverride, testResetMeasuredDialInPumpMCSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialInPumpMCMeasuredSpeedOverrideRequest, testSetMeasuredDialInPumpMCSpeedOverride, testResetMeasuredDialInPumpMCSpeedOverride ) /************************************************************************* * @brief handleTestDialInPumpMCMeasuredCurrentOverrideRequest @@ -961,7 +1004,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialInPumpMCMeasuredCurrentOverrideRequest, testSetMeasuredDialInPumpMCCurrentOverride, testResetMeasuredDialInPumpMCCurrentOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialInPumpMCMeasuredCurrentOverrideRequest, testSetMeasuredDialInPumpMCCurrentOverride, testResetMeasuredDialInPumpMCCurrentOverride ) /************************************************************************* * @brief handleTestDialInFlowBroadcastIntervalOverrideRequest @@ -973,7 +1016,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( U32, handleTestDialInFlowBroadcastIntervalOverrideRequest, testSetDialInFlowDataPublishIntervalOverride, testResetDialInFlowDataPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDialInFlowBroadcastIntervalOverrideRequest, testSetDialInFlowDataPublishIntervalOverride, testResetDialInFlowDataPublishIntervalOverride ) /************************************************************************* * @brief handleTestArterialPressureOverrideRequest @@ -985,7 +1028,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestArterialPressureOverrideRequest, testSetArterialPressureOverride, testResetArterialPressureOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestArterialPressureOverrideRequest, testSetArterialPressureOverride, testResetArterialPressureOverride ) /************************************************************************* * @brief handleTestVenousPressureOverrideRequest @@ -997,7 +1040,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestVenousPressureOverrideRequest, testSetVenousPressureOverride, testResetVenousPressureOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestVenousPressureOverrideRequest, testSetVenousPressureOverride, testResetVenousPressureOverride ) /************************************************************************* * @brief handleTestBloodPumpOcclusionOverrideRequest @@ -1009,7 +1052,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestBloodPumpOcclusionOverrideRequest, testSetBloodPumpOcclusionOverride, testResetBloodPumpOcclusionOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestBloodPumpOcclusionOverrideRequest, testSetBloodPumpOcclusionOverride, testResetBloodPumpOcclusionOverride ) /************************************************************************* * @brief handleTestDialysateInletPumpOcclusionOverrideRequest @@ -1021,7 +1064,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialysateInletPumpOcclusionOverrideRequest, testSetDialInPumpOcclusionOverride, testResetDialInPumpOcclusionOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialysateInletPumpOcclusionOverrideRequest, testSetDialInPumpOcclusionOverride, testResetDialInPumpOcclusionOverride ) /************************************************************************* * @brief handleTestDialysateOutletPumpOcclusionOverrideRequest @@ -1033,7 +1076,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( F32, handleTestDialysateOutletPumpOcclusionOverrideRequest, testSetDialOutPumpOcclusionOverride, testResetDialOutPumpOcclusionOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialysateOutletPumpOcclusionOverrideRequest, testSetDialOutPumpOcclusionOverride, testResetDialOutPumpOcclusionOverride ) /************************************************************************* * @brief handleTestPresOcclBroadcastIntervalOverrideRequest @@ -1045,7 +1088,7 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC( U32, handleTestPresOcclBroadcastIntervalOverrideRequest, testSetPresOcclDataPublishIntervalOverride, testResetPresOcclDataPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestPresOcclBroadcastIntervalOverrideRequest, testSetPresOcclDataPublishIntervalOverride, testResetPresOcclDataPublishIntervalOverride ) /************************************************************************* * @brief handleSetRTCTimestamp @@ -1077,3 +1120,104 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/************************************************************************* + * @brief + * The handleTestDialOutFlowBroadcastIntervalOverrideRequest function handles \n + * a request to override the broadcast interval for dialysate outlet pump data. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDialOutFlowBroadcastIntervalOverrideRequest, testSetDialOutPumpAndLoadCellDataPublishIntervalOverride, testResetDialOutPumpAndLoadCellDataPublishIntervalOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutUFReferenceVolumeOverrideRequest function handles a \n + * request to override the ultrafiltration reference volume for the dialysate \n + * outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutUFReferenceVolumeOverrideRequest, testSetDialOutUFRefVolumeOverride, testResetDialOutUFRefVolumeOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutUFMeasuredVolumeOverrideRequest function handles a \n + * request to override the ultrafiltration measured volume for the dialysate \n + * outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutUFMeasuredVolumeOverrideRequest, testSetDialOutUFTotVolumeOverride, testResetDialOutUFTotVolumeOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutPumpMCMeasuredSpeedOverrideRequest function handles a \n + * request to override the measured motor controller speed for the dialysate \n + * outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutPumpMCMeasuredSpeedOverrideRequest, testSetMeasuredDialOutPumpMCSpeedOverride, testResetMeasuredDialOutPumpMCSpeedOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutPumpMCMeasuredCurrentOverrideRequest function handles a \n + * request to override the measured motor controller current for the dialysate \n + * outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutPumpMCMeasuredCurrentOverrideRequest, testSetMeasuredDialOutPumpMCCurrentOverride, testResetMeasuredDialOutPumpMCCurrentOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutPumpMeasuredSpeedOverrideRequest function handles a \n + * request to override the measured speed for the dialysate outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutPumpMeasuredSpeedOverrideRequest, testSetMeasuredDialOutPumpSpeedOverride, testResetMeasuredDialOutPumpSpeedOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutPumpMeasuredRotorSpeedOverrideRequest function handles a \n + * request to override the measured rotor speed for the dialysate outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutPumpMeasuredRotorSpeedOverrideRequest, testSetMeasuredDialOutPumpRotorSpeedOverride, testResetMeasuredDialOutPumpRotorSpeedOverride ) + +/************************************************************************* + * @brief + * The handleTestDialOutLoadCellWeightOverrideRequest function handles a \n + * request to override the measured load cell weight for the dialysate outlet pump. + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_ARRAY_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestDialOutLoadCellWeightOverrideRequest, testSetDialOutLoadCellWeightOverride, testResetDialOutLoadCellWeightOverride ) + + Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -38,6 +38,7 @@ MSG_ID_RTC_EPOCH, // 10 MSG_ID_DIALYSATE_OUT_FLOW_DATA, // 11 MSG_ID_LOAD_CELL_READINGS, // 12 + MSG_ID_TREATMENT_TIME, // 13 // service/test CAN messages @@ -72,6 +73,14 @@ MSG_ID_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE, // 0x801B MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE, // 0x801C MSG_ID_SET_RTC_DATE_TIME, // 0x801D + MSG_ID_DIAL_OUT_FLOW_SEND_INTERVAL_OVERRIDE, // 0x801E + MSG_ID_DIAL_OUT_UF_REF_VOLUME_OVERRIDE, // 0x801F + MSG_ID_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE, // 0x8020 + MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE, // 0x8021 + MSG_ID_DIAL_OUT_PUMP_MC_MEAS_CURR_OVERRIDE, // 0x8022 + MSG_ID_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE, // 0x8023 + MSG_ID_DIAL_OUT_PUMP_MEAS_ROTOR_SPEED_OVERRIDE, // 0x8024 + MSG_ID_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE, // 0x8025 END_OF_MSG_IDS } MSG_ID_T; @@ -116,6 +125,9 @@ // MSG_ID_RTC_EPOCH BOOL broadcastRTCEpoch( U32 epoch ); +// MSG_ID_TREATMENT_TIME +BOOL broadcastTreatmentTime( U32 secsTotTreatment, U32 secsElapsed, U32 secsRemaining ); + // *********** public test support message functions ********** // DEBUG OUTPUT @@ -212,5 +224,29 @@ // MSG_ID_SET_RTC_TIMESTAMP void handleSetRTCTimestamp( MESSAGE_T *message ); +// MSG_ID_DIAL_OUT_FLOW_SEND_INTERVAL_OVERRIDE +void handleTestDialOutFlowBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_UF_REF_VOLUME_OVERRIDE +void handleTestDialOutUFReferenceVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE +void handleTestDialOutUFMeasuredVolumeOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE +void handleTestDialOutPumpMCMeasuredSpeedOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_PUMP_MC_MEAS_CURR_OVERRIDE +void handleTestDialOutPumpMCMeasuredCurrentOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE +void handleTestDialOutPumpMeasuredSpeedOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_PUMP_MEAS_ROTOR_SPEED_OVERRIDE +void handleTestDialOutPumpMeasuredRotorSpeedOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE +void handleTestDialOutLoadCellWeightOverrideRequest( MESSAGE_T *message ); + #endif Index: firmware/App/Services/Timers.c =================================================================== diff -u -r52863cba9685f31136ab3f4b4764a17ccf34fc05 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/Timers.c (.../Timers.c) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) +++ firmware/App/Services/Timers.c (.../Timers.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -23,7 +23,7 @@ static U32 msTimerCount = 0; /************************************************************************* - * @brief initTimers + * @brief * The initTimers function initializes the Timers module. * @details * Inputs : none @@ -37,7 +37,7 @@ } /************************************************************************* - * @brief incMSTimerCount + * @brief * The incMSTimerCount function increments the ms timer count. * @details * Inputs : none @@ -51,7 +51,7 @@ } /************************************************************************* - * @brief getMSTimerCount + * @brief * The getMSTimerCount function returns the current ms timer count. * @details * Inputs : msTimerCount @@ -65,7 +65,7 @@ } /************************************************************************* - * @brief didTimeout + * @brief * The didTimeout function determines whether a timeout has occurred between \n * a given start count and a given timeout period (in ms). * @details @@ -103,13 +103,13 @@ } /************************************************************************* - * @brief calcTimeSince + * @brief * The calcTimeSince function calculates the time (in ms) from a given start \n * time until now. * @details * Inputs : msTimerCount * Outputs : none - * @param startMSCount : the ms count at the start of the timeout period + * @param startMSCount : the ms count at the start of the period * @return ms since given start time *************************************************************************/ U32 calcTimeSince( U32 startMSCount ) @@ -130,4 +130,31 @@ return result; } +/************************************************************************* + * @brief + * The calcTimeBetween function calculates the time (in ms) from a given start \n + * time until a given end time. + * @details + * Inputs : none + * Outputs : none + * @param startMSCount : the ms count at the start of the period + * @param endMSCount : the ms count at the end of the period + * @return ms between two given times + *************************************************************************/ +U32 calcTimeBetween( U32 startMSCount, U32 endMSCount ) +{ + U32 result; + // no wrap + if ( endMSCount >= startMSCount ) + { + result = endMSCount - startMSCount; + } + else + { + result = ( 0xFFFFFFFF - startMSCount ) + endMSCount + 1; + } + + return result; +} + Index: firmware/App/Services/Timers.h =================================================================== diff -u -r52863cba9685f31136ab3f4b4764a17ccf34fc05 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Services/Timers.h (.../Timers.h) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) +++ firmware/App/Services/Timers.h (.../Timers.h) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -26,5 +26,6 @@ U32 getMSTimerCount( void ); BOOL didTimeout( U32 startMSCount, U32 timeoutPeriod ); U32 calcTimeSince( U32 startMSCount ); +U32 calcTimeBetween( U32 startMSCount, U32 endMSCount ); #endif Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -61,7 +61,7 @@ #endif { // monitor pressure/occlusion sensors - //execPresOccl(); + execPresOccl(); // run operation mode state machine execOperationModes(); Index: firmware/source/sys_main.c =================================================================== diff -u -rbe6802eb077d77af6a2334508c428cc50a02ed39 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/source/sys_main.c (.../sys_main.c) (revision be6802eb077d77af6a2334508c428cc50a02ed39) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -68,7 +68,6 @@ #include "CPLD.h" #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Dialysis.h" #include "FPGA.h" #include "InternalADC.h" #include "MsgQueues.h" @@ -79,7 +78,6 @@ #include "SystemComm.h" #include "TaskBG.h" #include "Timers.h" -#include "TreatmentStop.h" #include "WatchdogMgmt.h" static void initProcessor( void ); @@ -175,8 +173,6 @@ initBloodFlow(); initDialInFlow(); initDialOutFlow(); - initDialysis(); - initTreatmentStop(); initOperationModes(); initRTC(); } Index: firmware/targetConfigs/RM46L852.ccxml =================================================================== diff -u -reff7b1575f008f81b29ef906f6346fac6012d3ab -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/targetConfigs/RM46L852.ccxml (.../RM46L852.ccxml) (revision eff7b1575f008f81b29ef906f6346fac6012d3ab) +++ firmware/targetConfigs/RM46L852.ccxml (.../RM46L852.ccxml) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -1,13 +1,13 @@ - - - + + + - +