Index: firmware/App/Controllers/FlowSensors.c =================================================================== diff -u -r4e11c80367b5ae522aa34fb137079e516c98831b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Controllers/FlowSensors.c (.../FlowSensors.c) (revision 4e11c80367b5ae522aa34fb137079e516c98831b) +++ firmware/App/Controllers/FlowSensors.c (.../FlowSensors.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -17,30 +17,30 @@ // ********** private definitions ********** -#define FLOW_SENSORS_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the Dialysate flow data is published on the CAN bus. -#define FLOW_SENSORS_EDGES_BUFFER_LENGTH 100 -#define FLOW_SENSORS_PULSES_PER_LITER 110000 // TODO calibration record +#define FLOW_SENSORS_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the Dialysate flow data is published on the CAN bus. +#define FLOW_SENSORS_EDGES_BUFFER_LENGTH 100 ///< Flow sensors edges buffer length. +#define FLOW_SENSORS_PULSES_PER_LITER 110000 ///< Flow sensors pulses per liter +#define FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ( 12 * MS_PER_SECOND ) ///< Flow out of range time out in counts. +#define DATA_PUBLISH_COUNTER_START_COUNT 20 ///< Data publish counter start count. -#define FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ( 12 * MS_PER_SECOND ) // Why is this so long? ///< Flow out of range time out in counts. -#define DATA_PUBLISH_COUNTER_START_COUNT 20 ///< Data publish counter start count. +static const F32 FLOW_SENSORS_LITERS_PER_PULSES = ( 1.0 / (F32)FLOW_SENSORS_PULSES_PER_LITER ); ///< Flow sensors liters/pulses coefficient. -static const F32 FLOW_SENSORS_LITERS_PER_PULSES = ( 1.0 / (F32)FLOW_SENSORS_PULSES_PER_LITER ); - // ********** private data ********** +/// Flow sensors data structure typedef struct { - U08 edgeCountsIndex; - U16 edgeCountsBuffer[ FLOW_SENSORS_EDGES_BUFFER_LENGTH ]; - OVERRIDE_F32_T measuredFlowLPM; - OVERRIDE_F32_T measuredROFlowWithCPsLPM; + U08 edgeCountsIndex; ///< Edge counts index. + U16 edgeCountsBuffer[ FLOW_SENSORS_EDGES_BUFFER_LENGTH ]; ///< Edge counts buffer array. + OVERRIDE_F32_T measuredFlowLPM; ///< Measured flow in L/min. + OVERRIDE_F32_T measuredROFlowWithCPsLPM; ///< Measured RO flow with concentrate pumps in L/min. } FLOW_SENSOR_STATUS_T; -static U32 dataPublicationCounter; ///< Used to schedule Dialysate flow data publication to CAN bus. +static U32 dataPublicationCounter; ///< Used to schedule Dialysate flow data publication to CAN bus. static OVERRIDE_U32_T flowSensorsDataPublishInterval = { FLOW_SENSORS_DATA_PUB_INTERVAL, FLOW_SENSORS_DATA_PUB_INTERVAL, - 0, 0 }; ///< Interval (in ms) at which to publish Dialysate flow data to CAN bus. -static FLOW_SENSOR_STATUS_T flowSensorStatus[ NUM_OF_FLOW_SENSORS ]; + 0, 0 }; ///< Interval (in ms) at which to publish Dialysate flow data to CAN bus. +static FLOW_SENSOR_STATUS_T flowSensorStatus[ NUM_OF_FLOW_SENSORS ]; ///< Flow sensors status. static DG_FLOW_SENSORS_CAL_RECORD_T flowSensorsCalRecord; ///< Flow sensors calibration record. // ********** private function prototypes ********** @@ -142,10 +142,9 @@ #endif } - flowSensorStatus[ i ].edgeCountsIndex = INC_WRAP( countsIndex, 0, FLOW_SENSORS_EDGES_BUFFER_LENGTH ); + flowSensorStatus[ i ].edgeCountsIndex = INC_WRAP( countsIndex, 0, ( FLOW_SENSORS_EDGES_BUFFER_LENGTH - 1 ) ); } - // TODO dialysate flow alarm. Is it needed? //currentFlow = getMeasuredDialysateFlowRate(); //isFlowOutOfUpperRange = ( currentFlow > MAX_DIALYSATE_FLOWRATE_LPM ? TRUE : FALSE ); Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r72ba5f3c63325b00306b544b2513c03500919d06 -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 72ba5f3c63325b00306b544b2513c03500919d06) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -654,17 +654,24 @@ *************************************************************************/ static void setHeaterDutyCycle( DG_HEATERS_T heater, F32 pwm ) { - if ( DG_PRIMARY_HEATER == heater ) + if ( heater < NUM_OF_DG_HEATERS ) { - setMainPrimaryHeaterPWM( pwm ); - setSmallPrimaryHeaterPWM( pwm ); + if ( DG_PRIMARY_HEATER == heater ) + { + setMainPrimaryHeaterPWM( pwm ); + setSmallPrimaryHeaterPWM( pwm ); + } + else if ( DG_TRIMMER_HEATER == heater ) + { + setTrimmerHeaterPWM( pwm ); + } + + heatersStatus[ heater ].dutyCycle = pwm; } - else if ( DG_TRIMMER_HEATER == heater ) + else { - setTrimmerHeaterPWM( pwm ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_INVALID_HEATER_ID_SELECTED, heater ); } - - heatersStatus[ heater ].dutyCycle = pwm; } /*********************************************************************//** Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r3e02c078209aa85ad65e3e64686f53fd16e70b98 -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 3e02c078209aa85ad65e3e64686f53fd16e70b98) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -345,8 +345,8 @@ F32 roFeedbackVoltage = getIntADCVoltageConverted( INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE ); // Read the pressure at the sensor. The pump cannot be more that the maximum allowed pressure // to make sure the hardware (especially the ROF) is not damaged. If it is the case, we need to stop immediately - F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); - BOOL isPressureMax = ( actualPressure >= MAX_ALLOWED_MEASURED_PRESSURE_PSI ? TRUE : FALSE ); + F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); + BOOL isPressureMax = ( actualPressure >= MAX_ALLOWED_MEASURED_PRESSURE_PSI ? TRUE : FALSE ); BOOL isDutyCylceOutOfRange = FALSE; // Update sum for flow average calculation @@ -387,7 +387,7 @@ flowFilterCounter = 0; } - if ( ( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) > NEARLY_ZERO ) && ( (U32)VALVE_STATE_CLOSED == getValveState( (U32)VBF ) ) ) + if ( ( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) > NEARLY_ZERO ) && ( VALVE_STATE_CLOSED == getValveState( VBF ) ) ) { // If the RO pump's flow is greater than zero, and the VBf valve is not open (like heat disinfect) it means RO water is being generated // Add that water to the variable Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -44,7 +44,8 @@ static U32 valveStateMismatchCounter = 0; ///< Initialize valve state mismatch counter. static U32 pendingValveStateChanges[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state changes. static U32 pendingValveStateChangeCountDowns[ NUM_OF_VALVES ]; ///< Delayed (pending) valve state change count down timers (in task intervals). - + +static VALVE_STATE_NAMES_T valveCurrentStateName[ NUM_OF_VALVES ]; ///< Currently valve state name. static OVERRIDE_U32_T valveStates[ NUM_OF_VALVES ]; ///< Currently commanded valves states. static OVERRIDE_U32_T valvesStatesPublishInterval = { VALVES_STATE_PUB_INTERVAL, VALVES_STATE_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms/task interval) at which to publish valves state to CAN bus. @@ -204,14 +205,14 @@ break; case VALVE_STATE_R1_C_TO_NC: - if ( ( valveID == VRD ) || ( valveID == VRF ) ) + if ( ( valveID == VRF ) ) { result = TRUE; } break; case VALVE_STATE_R2_C_TO_NO: - if ( ( valveID == VRD ) || ( valveID == VRF ) ) + if ( ( valveID == VRF ) ) { result = TRUE; } @@ -370,7 +371,7 @@ if ( valveID < NUM_OF_VALVES ) { - if ( checkValveStateName( valveID, valveStateName ) ) + if ( TRUE == checkValveStateName( valveID, valveStateName ) ) { // If a delayed state change is already pending for this valve, execute it now before setting a new delayed state change if ( pendingValveStateChangeCountDowns[ valveID ] > 0 ) @@ -397,22 +398,56 @@ * @details Inputs: valveStates[] * @details Outputs: none * @param valveID ID of valve to get state for - * @return the current valve state for given valve + * @return the current valve state for given valve in enum *************************************************************************/ -U32 getValveState( U32 valveID ) -{ - U32 valveState = DEENERGIZED; +VALVE_STATE_NAMES_T getValveState( VALVES_T valveID ) +{ + VALVE_STATE_NAMES_T name; if ( valveID < NUM_OF_VALVES ) { - valveState = getU32OverrideValue( &valveStates[ valveID ] ); + U32 valveState = getU32OverrideValue( &valveStates[ valveID ] ); + + // Convert the bit status of the valve to the valve name + switch ( valveID ) + { + case VPI: + case VBF: + case VRD1: + case VRD2: + case VSP: + name = ( DEENERGIZED == valveState ? VALVE_STATE_CLOSED : VALVE_STATE_OPEN ); + break; + + case VPD: + name = ( DEENERGIZED == valveState ? VALVE_STATE_DRAIN_C_TO_NO : VALVE_STATE_OPEN_C_TO_NC ); + break; + + case VPO: + name = ( DEENERGIZED == valveState ? VALVE_STATE_NOFILL_C_TO_NO : VALVE_STATE_FILL_C_TO_NC ); + break; + + case VDR: + case VRC: + name = ( DEENERGIZED == valveState ? VALVE_STATE_DRAIN_C_TO_NO : VALVE_STATE_RECIRC_C_TO_NC ); + break; + + case VRI: + case VRO: + name = ( DEENERGIZED == valveState ? VALVE_STATE_R1_C_TO_NO : VALVE_STATE_R2_C_TO_NC ); + break; + + case VRF: + name = ( DEENERGIZED == valveState ? VALVE_STATE_R2_C_TO_NO : VALVE_STATE_R1_C_TO_NC ); + break; + } } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ID, valveID ) } - return valveState; + return name; } /*********************************************************************//** @@ -508,9 +543,9 @@ { if ( TRUE == isTestingActivated() ) { - result = TRUE; - valveStates[ valveID ].ovData = value; - valveStates[ valveID ].override = OVERRIDE_KEY; + valveStates[ valveID ].ovData = value; + valveStates[ valveID ].override = OVERRIDE_KEY; + result = TRUE; } } Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -33,43 +33,42 @@ /// Enumeration of available valve state names per valve type (from SA and DG SRS documents). typedef enum ValveStateNames { - VALVE_STATE_OPEN = 0, ///< Open valve state, used only for VPi, VBf, VRD1, VRD2, and VSP - VALVE_STATE_CLOSED, ///< Closed valve state, used only for VPi, VBf, VRD1, VRD2, and VSP - VALVE_STATE_OPEN_C_TO_NC, ///< Open Common to Normally Closed valve state, used only for VPd - VALVE_STATE_NOFILL_C_TO_NO, ///< No Fill Common to Normally Open valve state, used only for VPo - VALVE_STATE_FILL_C_TO_NC, ///< Fill Common to Normally Closed valve state, used only for VPo - VALVE_STATE_DRAIN_C_TO_NO, ///< Drain Common to Normally Open valve state, used only for VDr and VRc. It is also used for VPd in V3 - VALVE_STATE_RECIRC_C_TO_NC, ///< Recirculate Common to Normally Closed valve state, used only for VDr and VRc - VALVE_STATE_R1_C_TO_NO, ///< Reservoir 1 Common to Normally Open valve state, used only for VRo and VRi - VALVE_STATE_R1_C_TO_NC, ///< Reservoir 1 Common to Normally Closed valve state, used only for VRd and VRf - VALVE_STATE_R2_C_TO_NO, ///< Reservoir 2 Common to Normally Open valve state, used only for VRd and VRf - VALVE_STATE_R2_C_TO_NC, ///< Reservoir 2 Common to Normally Closed valve state, used only for VRo and VRi - NUM_OF_VALVE_STATES ///< number of valve states + VALVE_STATE_OPEN = 0, ///< Open valve state, used only for VPi, VBf, VRD1, VRD2, and VSP + VALVE_STATE_CLOSED, ///< Closed valve state, used only for VPi, VBf, VRD1, VRD2, and VSP + VALVE_STATE_OPEN_C_TO_NC, ///< Open Common to Normally Closed valve state, used only for VPd + VALVE_STATE_NOFILL_C_TO_NO, ///< No Fill Common to Normally Open valve state, used only for VPo + VALVE_STATE_FILL_C_TO_NC, ///< Fill Common to Normally Closed valve state, used only for VPo + VALVE_STATE_DRAIN_C_TO_NO, ///< Drain Common to Normally Open valve state, used only for VDr and VRc. It is also used for VPd in V3 + VALVE_STATE_RECIRC_C_TO_NC, ///< Recirculate Common to Normally Closed valve state, used only for VDr and VRc + VALVE_STATE_R1_C_TO_NO, ///< Reservoir 1 Common to Normally Open valve state, used only for VRo and VRi + VALVE_STATE_R1_C_TO_NC, ///< Reservoir 1 Common to Normally Closed valve state, used only for VRf + VALVE_STATE_R2_C_TO_NO, ///< Reservoir 2 Common to Normally Open valve state, used only for VRf + VALVE_STATE_R2_C_TO_NC, ///< Reservoir 2 Common to Normally Closed valve state, used only for VRo and VRi + NUM_OF_VALVE_STATES ///< number of valve states } VALVE_STATE_NAMES_T; /// Enumeration of valves. typedef enum Valves { - VRF = 0, ///< Valve Reservoir Fill - VRI, ///< Valve Reservoir Inlet - VRD, ///< Valve Reservoir Drain - VRO, ///< Valve Reservoir Outlet - VPO, ///< Valve Pressure Outlet - VBF, ///< Valve Bypass Filter - VRC, ///< Valve Recirculate - VDR, ///< Valve Drain - VPI, ///< Valve Pressure Inlet - VSP, ///< Valve Sampling Port - VRD1, ///< Valve Reservoir 1 Drain - VRD2, ///< Valve Reservoir 2 Drain - VPD, ///< Valve Production Drain - NUM_OF_VALVES ///< Number of valves + VRF = 0, ///< Valve Reservoir Fill + VRI, ///< Valve Reservoir Inlet + VRO, ///< Valve Reservoir Outlet + VPO, ///< Valve Pressure Outlet + VBF, ///< Valve Bypass Filter + VRC, ///< Valve Recirculate + VDR, ///< Valve Drain + VPI, ///< Valve Pressure Inlet + VSP, ///< Valve Sampling Port + VRD1, ///< Valve Reservoir 1 Drain + VRD2, ///< Valve Reservoir 2 Drain + VPD, ///< Valve Production Drain + NUM_OF_VALVES ///< Number of valves } VALVES_T; /// Valves publish structure typedef struct { - U16 valvesStatus; ///< DG valves status. + U16 valvesStatus; ///< DG valves status. } DG_VALVES_DATA_T; // ********** public function prototypes ********** @@ -79,7 +78,7 @@ BOOL setValveState( VALVES_T valve, VALVE_STATE_NAMES_T valveState ); BOOL setValveStateDelayed( VALVES_T valve, VALVE_STATE_NAMES_T valveState, U32 delayMs ); -U32 getValveState( U32 valveID ); +VALVE_STATE_NAMES_T getValveState( VALVES_T valveID ); BOOL testSetValvesStatesPublishIntervalOverride( U32 value ); BOOL testResetValvesStatesPublishIntervalOverride( void ); Index: firmware/App/DGCommon.h =================================================================== diff -u -r4e11c80367b5ae522aa34fb137079e516c98831b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 4e11c80367b5ae522aa34fb137079e516c98831b) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -34,8 +34,6 @@ // #define BOARD_WITH_NO_HARDWARE 1 // Build switch // #define TASK_TIMING_OUTPUT_ENABLED 1 // Build switch // re-purposes drain pump enable pin for task timing #define DISABLE_ACK_ALARM 1 // Build switch - #define THD_USING_TRO_CONNECTOR 1 // Build switch -#define DISABLE_RTC_POST_FAULT 1 #define DISABLE_FPGA_ALARMS_UNTIL_THE_NEW_PERSISTENT Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -r9c8b132dfff7ad0ef4973698e14d673b9d72a92b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 9c8b132dfff7ad0ef4973698e14d673b9d72a92b) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -47,7 +47,7 @@ // General defines #define MAX_ALLOWED_STATE_TRIALS 1 ///< Max allowed trials on a state. This is general among all the states. -#define CHEM_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode chem Disinfect data publish interval in counts. +#define CHEM_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode chem disinfect data publish interval in counts. // Start state defines #define MIN_INLET_PRESSURE_PSI 30.0F ///< Minimum water inlet pressure in psi. @@ -125,6 +125,13 @@ NUM_OF_CHEM_DISINFECT_STATUS ///< Number of chemical disinfect status. } CHEM_DISINFECT_STATUS_T; +/// Non-volatile write structure +typedef struct +{ + BOOL hasDisStatusBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect status been written to NV or not. + BOOL hasDisCompleteDateBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect complete date been written to NV or not. +} DISINFECT_NV_OPS_T; + // ********** private data ********** static DG_CHEM_DISINFECT_STATE_T chemDisinfectState = DG_CHEM_DISINFECT_STATE_START; ///< Currently active chemical disinfect state. @@ -151,6 +158,7 @@ static U32 numberOfPostDisinfectRinses; ///< Number of times to rinse the fluid path after chemical disinfect. static U32 primeAcidSteadyStateCounter = 0; ///< Prime acid steady state counter. static BOOL haveDrainParamsBeenInit[ NUM_OF_DG_RESERVOIRS ]; ///< Boolean flag to indicate whether the drain parameters have been reset or not. +static DISINFECT_NV_OPS_T disinfectNVOps; ///< Disinfect non-volatile memory operations. // ********** private function prototypes ********** @@ -186,6 +194,7 @@ static CHEM_DISINFECT_STATUS_T getChemicalDisinfectStatus( void ); static void publishChemicalDisinfectData( void ); static void monitorModeChemicalDisinfect( void ); +static void writeDisinfectDataToNV( void ); /*********************************************************************//** * @brief @@ -197,30 +206,33 @@ * R1ChemDisinfectVol, R2ChemDisinfectVol, overallChemDisinfectTimer, * cancellationMode, rsrvrFillStableTimeCounter, prevChemDisinfectState * isPartialDisinfectInProgress, numberOfPostDisinfectRinses, - * primeAcidSteadyStateCounter, chemDisinfectUIState, haveDrainParamsBeenInit + * primeAcidSteadyStateCounter, chemDisinfectUIState, haveDrainParamsBeenInit, + * disinfectNVOps * @return none *************************************************************************/ void initChemicalDisinfectMode( void ) { - chemDisinfectState = DG_CHEM_DISINFECT_STATE_START; - prevChemDisinfectState = DG_CHEM_DISINFECT_STATE_START; - stateTimer = 0; - isThisLastDrain = FALSE; - stateTrialCounter = 0; - areTempSensorsInRange = FALSE; - rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; - rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; - R1ChemDisinfectVol = 0.0; - R2ChemDisinfectVol = 0.0; - overallChemDisinfectTimer = 0; - cancellationMode = CANCELLATION_MODE_NONE; - rsrvrFillStableTimeCounter = 0; - isPartialDisinfectInProgress = FALSE; - numberOfPostDisinfectRinses = 0; - primeAcidSteadyStateCounter = 0; - chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; - haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; - haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + chemDisinfectState = DG_CHEM_DISINFECT_STATE_START; + prevChemDisinfectState = DG_CHEM_DISINFECT_STATE_START; + stateTimer = 0; + isThisLastDrain = FALSE; + stateTrialCounter = 0; + areTempSensorsInRange = FALSE; + rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; + rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; + R1ChemDisinfectVol = 0.0; + R2ChemDisinfectVol = 0.0; + overallChemDisinfectTimer = 0; + cancellationMode = CANCELLATION_MODE_NONE; + rsrvrFillStableTimeCounter = 0; + isPartialDisinfectInProgress = FALSE; + numberOfPostDisinfectRinses = 0; + primeAcidSteadyStateCounter = 0; + chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; + haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; + haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = FALSE; + disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; } /*********************************************************************//** @@ -1299,10 +1311,6 @@ stopHeater( DG_PRIMARY_HEATER ); stateTimer = getMSTimerCount(); state = DG_CHEM_DISINFECT_STATE_COOL_DOWN_HEATERS; - - // Set the disinfect flags - setDisinfectStatus( TRUE ); - setLastDisinfectDate( USAGE_INFO_CHEMICAL_DISINFECT, getRTCTimestamp() ); break; } @@ -1322,6 +1330,9 @@ { DG_CHEM_DISINFECT_STATE_T state = DG_CHEM_DISINFECT_STATE_COOL_DOWN_HEATERS; + // Done with chemical disinfect, write the data to NV memory + writeDisinfectDataToNV(); + if ( TRUE == didTimeout( stateTimer, POST_CHEM_DISINFECT_WAIT_TIME_MS ) ) { // Stop the drain pump and the RO pump to exit the closed loop @@ -2163,4 +2174,25 @@ } } +/*********************************************************************//** + * @brief + * The writeDisinfectDataToNV function writes the disinfection data to the + * non-volatile memory. + * @details Inputs: disinfectNVOps + * @details Outputs: disinfectNVOps + * @return: none + *************************************************************************/ +static void writeDisinfectDataToNV( void ) +{ + if ( FALSE == disinfectNVOps.hasDisCompleteDateBeenWrittenToNV ) + { + disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = setDisinfectStatus( TRUE ); + } + + if ( FALSE == disinfectNVOps.hasDisStatusBeenWrittenToNV ) + { + disinfectNVOps.hasDisStatusBeenWrittenToNV = setLastDisinfectDate( USAGE_INFO_CHEMICAL_DISINFECT, getRTCTimestamp() ); + } +} + /**@}*/ Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r8fc97ad09c8cbdf76dc19929c4751df3feacb40d -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 8fc97ad09c8cbdf76dc19929c4751df3feacb40d) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -176,8 +176,8 @@ *************************************************************************/ static DG_FAULT_STATE_T handleFaultStartState( void ) { - DG_FAULT_STATE_T state = DG_FAULT_STATE_START; - NVDATAMGMT_RECORDS_READ_STATUS status = getNVRecordsReadStatus(); + DG_FAULT_STATE_T state = DG_FAULT_STATE_START; + NVDATAMGMT_RECORDS_READ_STATUS_T status = getNVRecordsReadStatus(); switch ( status ) { Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r4e11c80367b5ae522aa34fb137079e516c98831b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 4e11c80367b5ae522aa34fb137079e516c98831b) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -905,7 +905,6 @@ *************************************************************************/ static void checkDialysateTemperatureSensors( void ) { -#ifndef THD_USING_TRO_CONNECTOR // Do not use until TRo is back in line F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); BOOL isDriftOut = ( fabs( TDi - TRo ) >= DIALYSATE_TEMPERATURE_SENSORS_MAX_DRIFT_C ? TRUE : FALSE ); @@ -914,7 +913,6 @@ { activateAlarmNoData( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE ); } -#endif } /*********************************************************************//** Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r9c8b132dfff7ad0ef4973698e14d673b9d72a92b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9c8b132dfff7ad0ef4973698e14d673b9d72a92b) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -45,8 +45,6 @@ * @{ */ -// TODO add the cooling, test the higher target flow to reduce the gradient - // ********** private definitions ********** // General defines @@ -140,6 +138,13 @@ NUM_OF_HEAT_DISINFECT_STATUS ///< Number of heat disinfect status. } HEAT_DISINFECT_STATUS_T; +/// Non-volatile write structure +typedef struct +{ + BOOL hasDisStatusBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect status been written to NV or not. + BOOL hasDisCompleteDateBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect complete date been written to NV or not. +} DISINFECT_NV_OPS_T; + // ********** private data ********** static DG_HEAT_DISINFECT_STATE_T heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; ///< Current active heat disinfect state. @@ -171,6 +176,7 @@ static U32 targetDisinfectTime = 0; ///< Target disinfect time. static BOOL haveDrainParamsBeenInit[ NUM_OF_DG_RESERVOIRS ]; ///< Boolean flag to indicate whether the drain parameters have been reset or not. static U32 tempGradOutOfRangeTimer; ///< Temperature gradient out of range start timer. +static DISINFECT_NV_OPS_T disinfectNVOps; ///< Disinfect non-volatile memory operations. // ********** private function prototypes ********** @@ -204,6 +210,7 @@ static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ); static void publishHeatDisinfectData( void ); static void monitorModeHeatDisinfect( void ); +static void writeDisinfectDataToNV( void ); /*********************************************************************//** * @brief @@ -217,35 +224,37 @@ * isPartialDisinfectInProgress, isDrainPumpOnInMixDrain, * hasROFCirculationBeenStarted, ROFCirculationTimer, targetDisinfectTime * ROFCirculationCoolingCounter, concentratePumpsPrimeTimer, - * haveDrainParamsBeenInit, tempGradOutOfRangeTimer + * haveDrainParamsBeenInit, tempGradOutOfRangeTimer, disinfectNVOps * @return none *************************************************************************/ void initHeatDisinfectMode( void ) { - heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; - prevHeatDisinfectState = DG_HEAT_DISINFECT_STATE_START; - heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_NOT_RUNNING; - stateTimer = 0; - isThisLastDrain = FALSE; - stateTrialCounter = 0; - areTempSensorsInRange = FALSE; - rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; - rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; - R1HeatDisinfectVol = 0.0; - R2HeatDisinfectVol = 0.0; - overallHeatDisinfectTimer = 0; - cancellationMode = CANCELLATION_MODE_NONE; - rsrvrFillStableTimeCounter = 0; - isPartialDisinfectInProgress = FALSE; - isDrainPumpInMixDrainOn = FALSE; - ROFCirculationTimer = 0; - ROFCoolingTimer = 0; - hasROFCirculationBeenStarted = FALSE; - concentratePumpsPrimeTimer = 0; - targetDisinfectTime = 0; - haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; - haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; - tempGradOutOfRangeTimer = 0; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; + prevHeatDisinfectState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_NOT_RUNNING; + stateTimer = 0; + isThisLastDrain = FALSE; + stateTrialCounter = 0; + areTempSensorsInRange = FALSE; + rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; + rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; + R1HeatDisinfectVol = 0.0; + R2HeatDisinfectVol = 0.0; + overallHeatDisinfectTimer = 0; + cancellationMode = CANCELLATION_MODE_NONE; + rsrvrFillStableTimeCounter = 0; + isPartialDisinfectInProgress = FALSE; + isDrainPumpInMixDrainOn = FALSE; + ROFCirculationTimer = 0; + ROFCoolingTimer = 0; + hasROFCirculationBeenStarted = FALSE; + concentratePumpsPrimeTimer = 0; + targetDisinfectTime = 0; + haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; + haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + tempGradOutOfRangeTimer = 0; + disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = FALSE; + disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; } /*********************************************************************//** @@ -1228,10 +1237,6 @@ stopHeater( DG_TRIMMER_HEATER ); stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS; - - // Set the disinfect flags - setDisinfectStatus( TRUE ); - setLastDisinfectDate( USAGE_INFO_HEAT_DISINFECT, getRTCTimestamp() ); break; case HEAT_DISINFECT_HEAT_UP_IN_PROGRESS: @@ -1259,6 +1264,8 @@ // Set the heat disinfect UI state heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_COOL_DOWN_DEVICE; + writeDisinfectDataToNV(); + if ( TRUE == didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) { // Stop the drain pump and the RO pump to exit the closed loop @@ -2110,4 +2117,25 @@ } } +/*********************************************************************//** + * @brief + * The writeDisinfectDataToNV function writes the disinfection data to the + * non-volatile memory. + * @details Inputs: disinfectNVOps + * @details Outputs: disinfectNVOps + * @return: none + *************************************************************************/ +static void writeDisinfectDataToNV( void ) +{ + if ( FALSE == disinfectNVOps.hasDisCompleteDateBeenWrittenToNV ) + { + disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = setDisinfectStatus( TRUE ); + } + + if ( FALSE == disinfectNVOps.hasDisStatusBeenWrittenToNV ) + { + disinfectNVOps.hasDisStatusBeenWrittenToNV = setLastDisinfectDate( USAGE_INFO_HEAT_DISINFECT, getRTCTimestamp() ); + } +} + /**@}*/ Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r72ba5f3c63325b00306b544b2513c03500919d06 -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 72ba5f3c63325b00306b544b2513c03500919d06) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -44,8 +44,6 @@ #define MAX_WATER_SAMPLE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Maximum duration of water sample state (in ms). #define FLUSH_EXPIRATION_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Duration in which a filter flush is valid (in ms). #define FILTER_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Filter flush data broadcast interval. -// Milliseconds was too big, greater than U32 -#define DG_SRVC_TIME_INTERVAL_S ( 6 * 30 * SECONDS_IN_A_DAY ) ///< DG service interval in seconds. ( 6 months with 30 days each). // ********** private data ********** @@ -73,9 +71,6 @@ static DG_STANDBY_MODE_STATE_T handleStandbyFlushFilterIdleState( void ); static DG_STANDBY_MODE_STATE_T handleStandbySampleWaterState( void ); -static BOOL isDisinfectValid( void ); -static BOOL isServiceTimeValid( void ); - /*********************************************************************//** * @brief * The initStandbyMode function initializes the standby mode module. @@ -322,60 +317,6 @@ /*********************************************************************//** * @brief - * The isDisinfectValid function checks whether the last disinfect has been - * voided or not - * @details Inputs: none - * @details Outputs: none - * @return TRUE if the disinfect is still valid otherwise, FALSE - ***********************************************************************/ -static BOOL isDisinfectValid( void ) -{ - BOOL status = TRUE; - DG_USAGE_INFO_RECORD_T dgUsageInfo; - - // No need to check the CRC of the record because the record'sCRC has been checked in NV POST. - getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&dgUsageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - - if ( FALSE == dgUsageInfo.isDisinfected ) - { - status = FALSE; - - activateAlarmNoData( ALARM_ID_DG_DISINFECT_HAS_BEEN_EXPIRED ); - } - - return status; -} - -/*********************************************************************//** - * @brief - * The isServiceTimeValid function checks whether the last service time is - * still within the interval or not. - * @details Inputs: none - * @details Outputs: none - * @return TRUE if the service time is still valid otherwise, FALSE - ***********************************************************************/ -static BOOL isServiceTimeValid( void ) -{ - BOOL status = TRUE; - DG_SERVICE_RECORD_T dgServiceRecord; - - // No need to check the CRC of the record because the record'sCRC has been checked in NV POST. - getNVRecord2Driver( GET_SRV_RECORD, (U08*)&dgServiceRecord, sizeof( DG_SERVICE_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - - if ( ( ( getRTCTimestamp() - dgServiceRecord.lastServiceEpochDate ) / MS_PER_SECOND > DG_SRVC_TIME_INTERVAL_S ) || - ( 0 == dgServiceRecord.lastServiceEpochDate ) ) - { - // Compare the current time in epoch to the last service data in epoch and convert them to seconds - status = FALSE; - - activateAlarmNoData( ALARM_ID_DG_SERIVCE_TIME_INTERVAL_HAS_ELAPSED ); - } - - return status; -} - -/*********************************************************************//** - * @brief * The requestWaterSample function handles an HD request to sample water. * @details Inputs: standbyState * @details Outputs: pendingSampleWaterRequest @@ -445,22 +386,7 @@ BOOL requestDGStart( void ) { BOOL result = FALSE; - BOOL disinfectStatus = TRUE; - BOOL serviceStatus = TRUE; -/*#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SERVICE_AND_DISINFECT_CHECK ) ) - { - disinfectStatus = TRUE; - serviceStatus = TRUE; - } - else -#endif - { - disinfectStatus = isDisinfectValid(); - serviceStatus = isServiceTimeValid(); - }*/ - if ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) { result = TRUE; Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r4e11c80367b5ae522aa34fb137079e516c98831b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 4e11c80367b5ae522aa34fb137079e516c98831b) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -135,6 +135,7 @@ SW_FAULT_ID_INVALID_FLOW_SENSOR_SELECTED, SW_FAULT_ID_INVALID_SERVICE_STATE_SELECTED, // 105 SW_FAULT_ID_INVALID_NV_RECORD_SELECTED, + SW_FAULT_ID_WRITE_USAGE_INFO_TO_NV_FAILURE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r4e11c80367b5ae522aa34fb137079e516c98831b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 4e11c80367b5ae522aa34fb137079e516c98831b) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -80,6 +80,13 @@ F32 previousDrainFlowML; ///< Previous reservoir drain flow in milliliters. } RESERVOIRS_PREVIOUS_STATUS; +/// Non-volatile write structure +typedef struct +{ + BOOL hasDisStatusBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect status been written to NV or not. + BOOL hasROGenVolBeenWrittenToNV; ///< Boolean flag to indicate whether the generated RO volume has been written to NV or not. +} NV_OPS_T; + static HEATERS_TEMPERATURE_CALC_DATA_T heatersTempCalc; ///< Heaters temperature calculations data structure. static U32 dataPublishCounter; ///< used to schedule reservoir data publication to CAN bus. @@ -104,28 +111,27 @@ static BOOL isThisTheFirstCycle; ///< Boolean flag to indicate whether this is the first cycle. static RESERVOIRS_PREVIOUS_STATUS reservoirPreviousStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoirs previous status. static HD_MODE_SUB_MODE_T hdModes; ///< HD operations mode. -static BOOL hasROVolBeenWrittenToNV; ///< Boolean flag to indicate whether the RO volume has been written to NV RAM or not. -static BOOL hasDisinfectStatusBeenSet; ///< Boolean flag to indicate whether disinfect has been voided after starting treatment. +static NV_OPS_T nvOps; ///< Non-volatile memory operations. /*********************************************************************//** * @brief * The initReservoirs function initializes the Reservoirs module. * @details Inputs: none * @details Outputs: activeReservoir.data, fillVolumeTargetMl.data, * drainVolumeTargetMl.data, targetFillFlowRateLPM, isThisTheFirstCycle, - * previousReservoiWeight, dataPublishCounter + * previousReservoiWeight, dataPublishCounter, nvOps * @return none *************************************************************************/ void initReservoirs( void ) { - activeReservoir.data = (U32)DG_RESERVOIR_1; - fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; - drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; - targetFillFlowRateLPM = 0.0; - isThisTheFirstCycle = TRUE; - dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - hasROVolBeenWrittenToNV = FALSE; - hasDisinfectStatusBeenSet = FALSE; + activeReservoir.data = (U32)DG_RESERVOIR_1; + fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; + drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; + targetFillFlowRateLPM = 0.0; + isThisTheFirstCycle = TRUE; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + nvOps.hasDisStatusBeenWrittenToNV = FALSE; + nvOps.hasROGenVolBeenWrittenToNV = FALSE; memset( &reservoirPreviousStatus, 0.0, sizeof( RESERVOIRS_PREVIOUS_STATUS ) * NUM_OF_DG_RESERVOIRS ); } @@ -151,10 +157,9 @@ NUM_OF_CAL_DATA_RSRVRS, ALARM_ID_DG_HEATING_INVALID_CAL_RECORD ); } - if ( ( ( DG_MODE_FAUL == getCurrentOperationMode() ) || ( DG_MODE_STAN == getCurrentOperationMode() ) ) && ( FALSE == hasROVolBeenWrittenToNV ) ) + if ( ( ( DG_MODE_FAUL == getCurrentOperationMode() ) || ( DG_MODE_STAN == getCurrentOperationMode() ) ) && ( FALSE == nvOps.hasROGenVolBeenWrittenToNV ) ) { // If the mode is fault or it is standby and the RO volume has not been written already, write it - BOOL status; DG_OP_MODE_T prevMode = getPreviousOperationMode(); switch( prevMode ) @@ -168,26 +173,15 @@ // Mode is changing, write the RO generated volume to the RTC RAM and set the service flag to FALSE // since this is not a from a service change. If the previous modes were any of the above modes, it means // it has been generating water. - status = setROWaterGeneratedL( getROGeneratedVolumeL() ); + nvOps.hasROGenVolBeenWrittenToNV = setROWaterGeneratedL( getROGeneratedVolumeL() ); break; } - - if ( TRUE == status ) - { - // The generated water has been successfully written - hasROVolBeenWrittenToNV = TRUE; - } } - if ( ( FALSE == hasDisinfectStatusBeenSet ) && ( MODE_TREA == hdModes.hdMode ) ) + if ( ( FALSE == nvOps.hasDisStatusBeenWrittenToNV ) && ( MODE_TREA == hdModes.hdMode ) ) { // If the disinfect status has not been set and we are in treatment mode, void the disinfect (chemical or heat disinfects) - BOOL status = setDisinfectStatus( FALSE ); - - if ( TRUE == status ) - { - hasDisinfectStatusBeenSet = TRUE; - } + nvOps.hasDisStatusBeenWrittenToNV = setDisinfectStatus( FALSE ); } // publish active reservoir, fill/drain volume targets at 1 Hz. Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r72ba5f3c63325b00306b544b2513c03500919d06 -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 72ba5f3c63325b00306b544b2513c03500919d06) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -876,7 +876,7 @@ handleDGPOSTResultRequest( message ); break; - case MSG_ID_UI_REQUEST_SERVICE_INFO: + case MSG_ID_HD_REQUEST_DG_SERVICE_RECORD: handleDGServiceScheduleRequest( message ); break; @@ -889,6 +889,7 @@ break; case MSG_ID_HD_REQUEST_DG_USAGE_INFO: + handleHDRequestDGUsageInfo( message ); break; // NOTE: This case must be last @@ -943,16 +944,16 @@ handleTestROMeasuredFlowOverrideRequest( message ); break; - case MSG_ID_DIALYSATE_MEASURED_FLOW_OVERRIDE: - handleTestDialysateMeasuredFlowOverrideRequest( message ); + case MSG_ID_MEASURED_FLOW_SENSORS_OVERRIDE: + handleTestMeasuredFlowOverrideRequest( message ); break; case MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE: handleTestROPumpDataBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_DIALYSATE_FLOW_SEND_INTERVAL_OVERRIDE: - handleTestDialysateFlowDataBroadcastIntervalOverrideRequest( message ); + case MSG_ID_FLOW_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestFlowSensorsDataBroadcastIntervalOverrideRequest( message ); break; case MSG_ID_DRAIN_PUMP_SET_RPM: Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r4e11c80367b5ae522aa34fb137079e516c98831b -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 4e11c80367b5ae522aa34fb137079e516c98831b) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -24,6 +24,7 @@ #include "ConcentratePumps.h" #include "ConductivitySensors.h" #include "Fans.h" +#include "FlowSensors.h" #include "FPGA.h" #include "Heaters.h" #include "ModeFill.h" @@ -553,21 +554,19 @@ getNVRecord2Driver( GET_SRV_RECORD, (U08*)&service, sizeof( DG_SERVICE_RECORD_T ), 0, ALARM_ID_NO_ALARM ); U08 *payloadPtr = msg.payload; - if ( message->hdr.payloadLen == sizeof( U32 ) + sizeof( U32 ) ) - { - // Create a message record - blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_DG_SERVICE_SCHEDULE_DATA; - msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); - // Fill message payload - memcpy( payloadPtr, &service.lastServiceEpochDate, sizeof( U32 ) ); - payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &service.serviceIntervalSeconds, sizeof( U32 ) ); - } + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_SERVICE_SCHEDULE_DATA; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); + // Fill message payload + memcpy( payloadPtr, &service.lastServiceEpochDate, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &service.serviceIntervalSeconds, sizeof( U32 ) ); + // 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_DG_2_UI, ACK_REQUIRED ); + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_2_HD, ACK_REQUIRED ); } /*********************************************************************//** @@ -1421,7 +1420,43 @@ return status; } +/*********************************************************************//** + * @brief + * The handleHDRequestDGUsageInfo function handles a request for DG + * usage information. + * @details Inputs: none + * @details Outputs: message handled, response constructed and queued for + * transmit. + * @return none + *************************************************************************/ +void handleHDRequestDGUsageInfo( MESSAGE_T * message ) +{ + MESSAGE_T msg; + DG_USAGE_INFO_RECORD_T usageInfo; + // Get the service record. There are no arrays of service to check and also, raise no alarm since the service record + // has been already checked in POST + getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); + + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_USAGE_DATA; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ) + sizeof( BOOL ); + + // Fill message payload + memcpy( payloadPtr, &usageInfo.lastHeatDisDateEpoch, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &usageInfo.lastChemicalDisDateEpoch, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &usageInfo.isDisinfected, sizeof( BOOL ) ); + + // 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_DG_2_HD, ACK_REQUIRED ); +} + + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -1820,29 +1855,29 @@ /*********************************************************************//** * @brief - * The handleTestDialysateMeasuredFlowOverrideRequest function handles a request to - * override the Dialysate flow rate. + * The handleTestMeasuredFlowOverrideRequest function handles a request to + * override the measured flow sensor rate. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleTestDialysateMeasuredFlowOverrideRequest( MESSAGE_T *message ) +void handleTestMeasuredFlowOverrideRequest( MESSAGE_T *message ) { - TEST_OVERRIDE_PAYLOAD_T payload; + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; BOOL result = FALSE; // verify payload length - if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { - result = testSetMeasuredDialysateFlowRateOverride( payload.state.f32 ); + result = testSetMeasuredFlowRateOverride( payload.index, payload.state.f32 ); } else { - result = testResetMeasuredDialysateFlowRateOverride(); + result = testResetMeasuredFlowRateOverride( payload.index ); } } @@ -1884,14 +1919,14 @@ /*********************************************************************//** * @brief - * The handleTestDialysateFlowDataBroadcastIntervalOverrideRequest function handles - * a request to override the broadcast interval for dialysate flow data. + * The handleTestFlowSensorsDataBroadcastIntervalOverrideRequest function handles + * a request to override the broadcast interval for the flow sensors data. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleTestDialysateFlowDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ) +void handleTestFlowSensorsDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ) { TEST_OVERRIDE_PAYLOAD_T payload; BOOL result = FALSE; @@ -1902,11 +1937,11 @@ memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { - result = testSetDialysateFlowDataPublishIntervalOverride( payload.state.u32 ); + result = testSetFlowDataPublishIntervalOverride( payload.state.u32 ); } else { - result = testResetDialysateFlowDataPublishIntervalOverride(); + result = testResetFlowDataPublishIntervalOverride(); } } Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r72ba5f3c63325b00306b544b2513c03500919d06 -rcb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 72ba5f3c63325b00306b544b2513c03500919d06) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision cb4d35cc50df2d3cc9e828cd92e53cf456ca9b9d) @@ -95,7 +95,7 @@ // MSG_ID_REQUEST_FW_VERSIONS void handleDGSerialNumberRequest( void ); -// MSG_ID_UI_REQUEST_SERVICE_INFO +// MSG_ID_HD_REQUEST_DG_SERVICE_RECORD void handleDGServiceScheduleRequest( MESSAGE_T *message ); // MSG_ID_HD_REQUEST_DG_CONCENTRATE_RATIOS @@ -107,9 +107,6 @@ // MSG_ID_DG_CHANGE_VALVE_SETTING_CMD void handleChangeValveSettingCmd( MESSAGE_T *message ); -// MSG_ID_HD_REQUEST_DG_USAGE_INFO -//void handleDGSend - // MSG_ID_DG_FILL_CMD void handleFillCmd( MESSAGE_T *message ); @@ -161,6 +158,9 @@ // MSG_ID_HD_OP_MODE BOOL handleSetHDOperationMode( MESSAGE_T *message ); +// MSG_ID_HD_REQUEST_DG_USAGE_INFO +void handleHDRequestDGUsageInfo( MESSAGE_T * message ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN @@ -198,13 +198,13 @@ void handleTestROMeasuredFlowOverrideRequest( MESSAGE_T *message ); // MSG_ID_DIALYSATE_MEASURED_FLOW_OVERRIDE: -void handleTestDialysateMeasuredFlowOverrideRequest( MESSAGE_T *message ); +void handleTestMeasuredFlowOverrideRequest( MESSAGE_T *message ); // MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE: void handleTestROPumpDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); // MSG_ID_DIALYSATE_FLOW_SEND_INTERVAL_OVERRIDE: -void handleTestDialysateFlowDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); +void handleTestFlowSensorsDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); // MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE void handleTestDrainPumpRPMOverrideRequest( MESSAGE_T *message );