Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -115,12 +115,13 @@ BOOL isConcPumpParkInProgress; ///< Concentrate pump park progress boolean flag (T/F). } CONCENTRATE_PUMP_T; -/// Payload record structure for concentrate pump start request +/// Payload record structure for concentrate pump start/stop request typedef struct { U32 pumpID; ///< Concentrate pump ID (0:Acid ,1:Bicarb) + U32 startStop; ///< Concentrate pump start:1,stop :0. F32 speed; ///< Speed range from 0.1 ml/min to 48.0 ml/min. -} CONC_PUMP_START_CMD_PAYLOAD_T; +} CONC_PUMP_START_STOP_CMD_PAYLOAD_T; // ********** private data ********** @@ -1147,35 +1148,45 @@ /*********************************************************************//** * @brief - * The testConcentratePumpStartOverride function starts a given concentrate pump - * at mentioned speed/flowrate ( ml/min). + * The testConcentratePumpStartStopOverride function starts a given concentrate pump + * at mentioned speed/flowrate ( ml/min) or stops the concentrate pump. * @details \b Inputs: tester logged in * @details \b Outputs: concentratePumps[] * @param message set message from Dialin which includes the concentrate pump to set * and the state to set the concentratet pump to. * @return TRUE if set request is successful, FALSE if not *************************************************************************/ -BOOL testConcentratePumpStartOverride( MESSAGE_T *message ) +BOOL testConcentratePumpStartStopOverride( MESSAGE_T *message ) { BOOL result = FALSE; // Verify tester has logged in with TD if ( TRUE == isTestingActivated() ) { // Verify payload length is valid - if ( sizeof( CONC_PUMP_START_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) + if ( sizeof( CONC_PUMP_START_STOP_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) { - CONC_PUMP_START_CMD_PAYLOAD_T payload; + CONC_PUMP_START_STOP_CMD_PAYLOAD_T payload; - memcpy( &payload, message->payload, sizeof(CONC_PUMP_START_CMD_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof(CONC_PUMP_START_STOP_CMD_PAYLOAD_T) ); - // Speed range is 0.1 ml/min to 40 ml/min. - if ( ( (CONCENTRATE_PUMPS_T)payload.pumpID < NUM_OF_CONCENTRATE_PUMPS ) && - ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) ) + if ( (CONCENTRATE_PUMPS_T)payload.pumpID < NUM_OF_CONCENTRATE_PUMPS ) { - setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed ); - requestConcentratePumpOn ( (CONCENTRATE_PUMPS_T)payload.pumpID ); - result = TRUE; + // Handle start command + if ( ( TRUE == payload.startStop ) && + ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) ) + { + setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed ); + requestConcentratePumpOn ( (CONCENTRATE_PUMPS_T)payload.pumpID ); + result = TRUE; + } + + //Handle stop command + if ( FALSE == payload.startStop ) + { + stopConcentratePump( (CONCENTRATE_PUMPS_T)payload.pumpID ); + result = TRUE; + } } } } Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -91,7 +91,7 @@ BOOL testConcentratePumpParkedOverride( MESSAGE_T *message ); BOOL testConcentratePumpParkCmdFaultedOverride( MESSAGE_T *message ); -BOOL testConcentratePumpStartOverride( MESSAGE_T *message ); // Concentrate pump start request +BOOL testConcentratePumpStartStopOverride( MESSAGE_T *message ); // Concentrate pump start/stop request BOOL testConcentratePumpParkRequestOverride( MESSAGE_T *message ); // Concentrate pump stop/park request /**@}*/ Index: firmware/App/Controllers/DialysatePumps.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -114,19 +114,14 @@ U08 control; ///< Dialysate pump control } DIALYSATE_PUMP_DATA_T; -/// Payload record structure for dialysate pump start request +/// Payload record structure for dialysate pump start/stop request typedef struct { U32 pumpID; ///< Pump ID Fresh(DGP) : 0, Spent ( SDP) : 1 + U32 startStop; ///< Stop : 0, Start : 1 U32 rpm; ///< Speed range from 300 to 4500 RPM range -} DIAL_PUMP_START_CMD_PAYLOAD_T; +} DIAL_PUMP_START_STOP_CMD_PAYLOAD_T; -/// Payload record structure for dialysate pump stop request -typedef struct -{ - U32 pumpID; ///< Pump ID Fresh(DGP) : 0, Spent ( SDP) : 1 -} DIAL_PUMP_STOP_CMD_PAYLOAD_T; - // ********** private data ********** static U32 dialysatePumpDataPublicationTimerCounter; ///< Used to schedule dialysate pump data publication to CAN bus. @@ -1044,67 +1039,44 @@ /*********************************************************************//** * @brief - * The testDialysatePumpStartOverride function starts a given dialysate pump + * The testDialysatePumpStartStopOverride function starts a given dialysate pump * at mentioned RPM. * @details \b Inputs: tester logged in * @details \b Outputs: dialysatePumps[] * @param message set message from Dialin which includes the dialysate pump to set * and the state to set the dialysate pump to. * @return TRUE if set request is successful, FALSE if not *************************************************************************/ -BOOL testDialysatePumpStartOverride( MESSAGE_T *message ) +BOOL testDialysatePumpStartStopOverride( MESSAGE_T *message ) { BOOL result = FALSE; // Verify tester has logged in with TD if ( TRUE == isTestingActivated() ) { // Verify payload length is valid - if ( sizeof( DIAL_PUMP_START_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) + if ( sizeof( DIAL_PUMP_START_STOP_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) { - DIAL_PUMP_START_CMD_PAYLOAD_T payload; + DIAL_PUMP_START_STOP_CMD_PAYLOAD_T payload; - memcpy( &payload, message->payload, sizeof(DIAL_PUMP_START_CMD_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof(DIAL_PUMP_START_STOP_CMD_PAYLOAD_T) ); - if ( ( (DIALYSATE_PUMPS_T)payload.pumpID < NUM_OF_DIALYSATE_PUMPS ) && - ( ( payload.rpm >= MIN_DIALYSATE_PUMP_RPM ) && ( payload.rpm <= MAX_DIALYSATE_PUMP_RPM ) ) ) - { - setDialysatePumpTargetRPM( (DIALYSATE_PUMPS_T) payload.pumpID, payload.rpm ); - result = TRUE; - } - } - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testDialysatePumpStopOverride function stops a given dialysate pump. - * @details \b Inputs: tester logged in - * @details \b Outputs: dialysatePumps[] - * @param message set message from Dialin which includes the dialysate pump to set - * and the state to set the dialysate pump to. - * @return TRUE if set request is successful, FALSE if not - *************************************************************************/ -BOOL testDialysatePumpStopOverride( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // Verify tester has logged in with TD - if ( TRUE == isTestingActivated() ) - { - // Verify payload length is valid - if ( sizeof( DIAL_PUMP_STOP_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) - { - DIAL_PUMP_STOP_CMD_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(DIAL_PUMP_STOP_CMD_PAYLOAD_T) ); - if ( (DIALYSATE_PUMPS_T)payload.pumpID < NUM_OF_DIALYSATE_PUMPS ) { - signalDialysatePumpHardStop( (DIALYSATE_PUMPS_T)payload.pumpID ); - result = TRUE; + // Handle start command + if ( ( TRUE == payload.startStop ) && + ( ( payload.rpm >= MIN_DIALYSATE_PUMP_RPM ) && ( payload.rpm <= MAX_DIALYSATE_PUMP_RPM ) ) ) + { + setDialysatePumpTargetRPM( (DIALYSATE_PUMPS_T)payload.pumpID, payload.rpm ); + result = TRUE; + } + + //Handle stop command + if ( FALSE == payload.startStop ) + { + signalDialysatePumpHardStop( (DIALYSATE_PUMPS_T)payload.pumpID ); + result = TRUE; + } } } } Index: firmware/App/Controllers/DialysatePumps.h =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -91,8 +91,7 @@ BOOL testDialysatePumpTargetPressureOverride( MESSAGE_T *message ); BOOL testDialysatePumpMeasuredCurrentOverride( MESSAGE_T *message ); BOOL testDialysatePumpMeasuredDirectionOverride( MESSAGE_T *message ); -BOOL testDialysatePumpStartOverride( MESSAGE_T *message ); -BOOL testDialysatePumpStopOverride( MESSAGE_T *message ); +BOOL testDialysatePumpStartStopOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -91,15 +91,10 @@ typedef struct { U32 heaterID; ///< Heater ID (0: Primary, 1: Trimmer) + U32 startStop; ///< Heater Start:1 and Stop: 0 F32 temperature; ///< Temperature range ( 10.0 to 90.0 deg ) } HEATER_START_CMD_PAYLOAD_T; -/// Payload record structure for heaters stop request -typedef struct -{ - U32 heaterID; ///< Heater ID (0: Primary, 1: Trimmer) -} HEATER_STOP_CMD_PAYLOAD_T; - static HEATER_STATUS_T heatersStatus[ NUM_OF_DD_HEATERS ]; ///< Heaters status. static U32 dataPublicationTimerCounter; ///< Data publication timer counter. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. @@ -677,15 +672,15 @@ /*********************************************************************//** * @brief - * The testHeaterStartOverride function starts a given heater + * The testHeaterStartStopOverride function starts/stops a given heater * at mentioned temperature. * @details \b Inputs: tester logged in * @details \b Outputs: heatersStatus[] * @param message set message from Dialin which includes the heater to set * and the state to set the heater to. * @return TRUE if set request is successful, FALSE if not *************************************************************************/ -BOOL testHeaterStartOverride( MESSAGE_T *message ) +BOOL testHeaterStartStopOverride( MESSAGE_T *message ) { BOOL result = FALSE; @@ -699,46 +694,23 @@ memcpy( &payload, message->payload, sizeof(HEATER_START_CMD_PAYLOAD_T) ); - if ( ( (DD_HEATERS_T)payload.heaterID < NUM_OF_DD_HEATERS ) && - ( ( payload.temperature >= HEATER_TARGET_TEMPERATURE_MIN ) && ( payload.temperature <= HEATER_TARGET_TEMPERATURE_MAX ) ) ) - { - setHeaterTargetTemperature( (DD_HEATERS_T)payload.heaterID, payload.temperature ); - startHeater( (DD_HEATERS_T)payload.heaterID ); - result = TRUE; - } - } - } - - return result; -} - -/*********************************************************************//** - * @brief - * The testHeaterStopOverride function stops a given heater. - * @details \b Inputs: tester logged in - * @details \b Outputs: heatersStatus[] - * @param message set message from Dialin which includes the heater to set - * and the state to set the heater to. - * @return TRUE if set request is successful, FALSE if not - *************************************************************************/ -BOOL testHeaterStopOverride( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // Verify tester has logged in with TD - if ( TRUE == isTestingActivated() ) - { - // Verify payload length is valid - if ( sizeof( HEATER_STOP_CMD_PAYLOAD_T ) == message->hdr.payloadLen ) - { - HEATER_STOP_CMD_PAYLOAD_T payload; - - memcpy( &payload, message->payload, sizeof(HEATER_STOP_CMD_PAYLOAD_T) ); - if ( (DD_HEATERS_T)payload.heaterID < NUM_OF_DD_HEATERS ) { - stopHeater( (DD_HEATERS_T)payload.heaterID ); - result = TRUE; + // Handle start command + if ( ( TRUE == payload.startStop ) && + ( ( payload.temperature >= HEATER_TARGET_TEMPERATURE_MIN ) && ( payload.temperature <= HEATER_TARGET_TEMPERATURE_MAX ) ) ) + { + setHeaterTargetTemperature( (DD_HEATERS_T)payload.heaterID, payload.temperature ); + startHeater( (DD_HEATERS_T)payload.heaterID ); + result = TRUE; + } + + //Handle stop command + if ( FALSE == payload.startStop ) + { + stopHeater( (DD_HEATERS_T)payload.heaterID ); + result = TRUE; + } } } } Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -69,8 +69,7 @@ BOOL testHeatersDataPublishIntervalOverride( MESSAGE_T *message ); BOOL testHeaterDutyCycleOverride( MESSAGE_T *message ); -BOOL testHeaterStartOverride( MESSAGE_T *message ); -BOOL testHeaterStopOverride( MESSAGE_T *message ); +BOOL testHeaterStartStopOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Drivers/ConductivitySensors.h =================================================================== diff -u -re2e51b0219db0132cebb6f65f3dbd803e1f01e30 -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision e2e51b0219db0132cebb6f65f3dbd803e1f01e30) +++ firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -40,10 +40,10 @@ /// Enumeration of conductivity sensors. typedef enum ConductivitySensors { - CONDUCTIVITYSENSORS_CD1_SENSOR = 0, ///< Inlet water conductivity sensor - CONDUCTIVITYSENSORS_CD2_SENSOR, ///< Outlet water conductivity sensor - CONDUCTIVITYSENSORS_CD3_SENSOR, ///< Post-acid concentrate conductivity sensor - CONDUCTIVITYSENSORS_CD4_SENSOR, ///< Post-bicarbonate concentrate conductivity sensor + CONDUCTIVITYSENSORS_CD1_SENSOR = 0, ///< Bicarb only conductivity sensor + CONDUCTIVITYSENSORS_CD2_SENSOR, ///< Acid and Bicarb mix conductivity sensor - 1 + CONDUCTIVITYSENSORS_CD3_SENSOR, ///< Acid and Bicarb mix conductivity sensor - 2 + CONDUCTIVITYSENSORS_CD4_SENSOR, ///< Spent dialysate conductivity sensor NUM_OF_CONDUCTIVITY_SENSORS ///< Number of conductivity sensors } CONDUCTIVITY_SENSORS_T; Index: firmware/App/Modes/BalancingChamber.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Modes/BalancingChamber.c (.../BalancingChamber.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Modes/BalancingChamber.c (.../BalancingChamber.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -32,36 +32,36 @@ */ // ********** private definitions ********** -#define BAL_CHAMBER_FILL_VOLUME_ML 30.0 ///< Balancing chamber fill/drain volume per batch operation. -#define FRESH_DIAL_PRESSURE_MIN_PSIG 23.0 ///< Minimum fresh dialysate pressure (PDf) limit for balancing chamber fill operations. -#define FRESH_DIAL_PRESSURE_MAX_PSIG 25.0 ///< Maximum fresh dialysate pressure (PDf) limit for balancing chamber fill operations. -#define SPENT_DIAL_PRESSURE_MIN_PSIG 29.0 ///< Minimum spent dialysate pressure (PDs) limit for balancing chamber fill operations. -#define SPENT_DIAL_PRESSURE_MAX_PSIG 30.0 ///< Maximum spent dialysate pressure (PDs) limit for balancing chamber fill operations. -#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. +#define BAL_CHAMBER_FILL_VOLUME_ML 30.0F ///< Balancing chamber fill/drain volume per batch operation. +#define FRESH_DIAL_PRESSURE_MIN_PSIG 23.0F ///< Minimum fresh dialysate pressure (PDf) limit for balancing chamber fill operations. +#define FRESH_DIAL_PRESSURE_MAX_PSIG 25.0F ///< Maximum fresh dialysate pressure (PDf) limit for balancing chamber fill operations. +#define SPENT_DIAL_PRESSURE_MIN_PSIG 29.0F ///< Minimum spent dialysate pressure (PDs) limit for balancing chamber fill operations. +#define SPENT_DIAL_PRESSURE_MAX_PSIG 30.0F ///< Maximum spent dialysate pressure (PDs) limit for balancing chamber fill operations. +#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. // ********** private data ********** -static BAL_CHAMBER_EXEC_STATE_T balChamberExecState = BAL_CHAMBER_STATE_START; ///< Current balancing chamber executive state. -static OVERRIDE_F32_T balChamberSwitchingFreq; ///< Balancing chamber switching rate based on the dialysate flow rate ( overrideable) -static U32 balChamberSwitchingPeriod = 0; ///< Periodic balancing chamber switching time in task interval count. -static U32 currentBalChamberSwitchingCounter = 0; ///< Counter (in task interval) to monitor the timing spent during balancing chamber fill/drain operation. -static BOOL isBalChamberFillInProgress = FALSE; ///< Flag indicating balancing chamber fill/drain is in progress. -static BOOL isPressureStalbilizedDuringFill = FALSE; ///< Flag indicating that the pressure is stablized due to fill complete. -static BOOL readyToDeliverDialysate = FALSE; ///< Flag indicating whether ready to deliver dialysate or not. +static BAL_CHAMBER_EXEC_STATE_T balChamberExecState; ///< Current balancing chamber executive state. +static OVERRIDE_F32_T balChamberSwitchingFreq; ///< Balancing chamber switching rate ( switches per min) based on the dialysate flow rate ( overrideable) +static U32 balChamberSwitchingPeriod; ///< Periodic balancing chamber switching time in task interval count. +static U32 currentBalChamberSwitchingCounter; ///< Counter (in task interval) to monitor the timing spent during balancing chamber fill/drain operation. +static BOOL isBalChamberFillInProgress; ///< Flag indicating balancing chamber fill/drain is in progress. +static BOOL isPressureStalbilizedDuringFill; ///< Flag indicating that the pressure is stablized due to fill complete. +static BOOL isDialysateGoodtoDeliver; ///< Flag indicating whether ready to deliver dialysate or not. static OVERRIDE_U32_T isDialDeliveryInProgress; ///< To indicate dialysate started delivering to dialyzer for treatment (overrideable) -static BAL_CHAMBER_SW_STATE_T balChamberSWState = BAL_CHAMBER_SW_STATE1; ///< Current balancing chamber switching state ( state 1 or state 2). +static BAL_CHAMBER_SW_STATE_T balChamberSWState; ///< Current balancing chamber switching state ( state 1 or state 2). static U32 balChamberDataPublicationTimerCounter; ///< Used to schedule balancing chamber data publication to CAN bus. static OVERRIDE_U32_T balChamberDataPublishInterval; ///< Balancing chamber data publish interval. // ********** private function prototypes ********** static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillStart( void ); static BAL_CHAMBER_EXEC_STATE_T handleBalChamberConcentrateControl(void); -static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillEnd(); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState1FillEnd(void); static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillStart( void ); -static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillEnd(); -static BAL_CHAMBER_EXEC_STATE_T handleBalChamberDialDeliveryBypassCheck( void ); +static BAL_CHAMBER_EXEC_STATE_T handleBalChamberState2FillEnd(void); static BAL_CHAMBER_EXEC_STATE_T handleBalChamberDialDeliveryPause( void ); +static void balChamberDialDeliveryBypassCheck( void ); static void publishBalChamberData( void ); static U32 getBalChamberDataPublishInterval( void ); @@ -92,7 +92,7 @@ isBalChamberFillInProgress = FALSE; currentBalChamberSwitchingCounter = 0; isPressureStalbilizedDuringFill = FALSE; - readyToDeliverDialysate = FALSE; + isDialysateGoodtoDeliver = FALSE; balChamberDataPublicationTimerCounter = 0; } @@ -132,17 +132,46 @@ /*********************************************************************//** * @brief - * The execBalancingChamber function executes the balancing chamber state machine. + * The execBalancingChamberMonitor function monitors the balancing chamber fill + * operations and alarm if temperature and conductivity is not in range. * @details \b Inputs: balChamberExecState * @details \b Outputs: balChamberExecState * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when wrong balancing chamber state invoked. * @return current state. *************************************************************************/ -U32 execBalancingChamber( void ) +void execBalancingChamberMonitor( void ) { - // Increment counter during fill time only + // Read temperature and conducitivity + //F32 hydChamberTemperature = getTemperatureValue( TEMPSENSORS_HYDRAULICS_PRIMARY_HEATER ); + //F32 biCarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); + //F32 acidBicarbMixConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD3_SENSOR ); + + // Monitor critical parameter while balancing chamber fill is in progress if ( TRUE == isBalChamberFillInProgress ) { + // Temperature range check + + // Coductivity range check + + // Also, TD confirms to deliver dialysate + isDialysateGoodtoDeliver = TRUE; + } +} + +/*********************************************************************//** + * @brief + * The execBalancingChamberControl function executes the balancing chamber state machine. + * @details \b Inputs: balChamberExecState + * @details \b Outputs: balChamberExecState + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when wrong balancing chamber state invoked. + * @return current state. + *************************************************************************/ +U32 execBalancingChamberControl( void ) +{ + // Increment counter during fill time only, Also check dialysate needs to be bypassed. + if ( TRUE == isBalChamberFillInProgress ) + { + balChamberDialDeliveryBypassCheck(); currentBalChamberSwitchingCounter += 1; } @@ -177,10 +206,6 @@ balChamberExecState = handleBalChamberState2FillEnd(); break; - case BAL_CAHMBER_DIAL_DELVIERY_BYPASS_CHECK: - balChamberExecState = handleBalChamberDialDeliveryBypassCheck(); - break; - case BAL_CHAMBER_DIAL_DELIVERY_PAUSE: balChamberExecState = handleBalChamberDialDeliveryPause(); break; @@ -321,14 +346,13 @@ // Check fresh and spent dialysate pressure in range if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && - ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) + ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) { //Valve control for state 1 fill valveControlForBCState1FillStart(); // Update fill status flag to true isBalChamberFillInProgress = TRUE; - currentBalChamberSwitchingCounter += 1; state = BAL_CHAMBER_STATE1_BICARB_ACID_DOSING_CNTRL; } @@ -383,15 +407,15 @@ // Check fresh and spent dialysate pressure back in range to indicate fill complete. if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && - ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) + ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) { // stabilized pressure indicating fill is complete isPressureStalbilizedDuringFill = TRUE; } - // Check switching cycle time or pressure check for valve closure + // Swithcing time met or pressure in range, close valves if ( ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) || - ( TRUE == isPressureStalbilizedDuringFill ) ) + ( TRUE == isPressureStalbilizedDuringFill ) ) { // close the state 1 opened valves valveControlForBCState1FillEnd(); @@ -400,8 +424,15 @@ // On completion of cycle time, transition to next state if ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) { - isBalChamberFillInProgress = FALSE; - state = BAL_CHAMBER_STATE2_FILL_START; + if ( TRUE != isPressureStalbilizedDuringFill ) + { + // TODO : Alarm handling for switching time expired, but still pressure not in range, + } + else + { + isBalChamberFillInProgress = FALSE; + state = BAL_CHAMBER_STATE2_FILL_START; + } } return state; @@ -428,14 +459,13 @@ // Check fresh and spent dialysate pressure in range if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && - ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) + ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) { // Valve control for state 2 fill valveControlForBCState2FillStart(); // Update fill status flag to true isBalChamberFillInProgress = TRUE; - currentBalChamberSwitchingCounter += 1; state = BAL_CHAMBER_STATE2_BICARB_ACID_DOSING_CNTRL; } @@ -463,33 +493,33 @@ // Check fresh and spent dialysate pressure back in range to indicate fill complete. if ( ( ( freshDialPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( freshDialPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) && - ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) + ( ( spentDialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentDialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) ) { // stabilized pressure indicating fill is complete isPressureStalbilizedDuringFill = TRUE; } // Check switching cycle time or pressure check for valve closure if ( ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) || - ( TRUE == isPressureStalbilizedDuringFill ) ) + ( TRUE == isPressureStalbilizedDuringFill ) ) { // close the valves valveControlForBCState2FillEnd(); } // On completion of cycle time, transition to next state - if ( ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) && - ( TRUE == getDialDeliveryProgressStatus() ) ) + if ( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) { - // do periodic dialysate delivery - state = BAL_CHAMBER_STATE1_FILL_START; - isBalChamberFillInProgress = FALSE; + if ( TRUE != isPressureStalbilizedDuringFill ) + { + // TODO : Alarm handling for switching time expired, but still pressure not in range, + } + else + { + isBalChamberFillInProgress = FALSE; + state = BAL_CHAMBER_STATE1_FILL_START; + } } - else if( currentBalChamberSwitchingCounter >= balChamberSwitchingPeriod ) - { - state = BAL_CAHMBER_DIAL_DELVIERY_BYPASS_CHECK; - isBalChamberFillInProgress = FALSE; - } return state; } @@ -498,30 +528,32 @@ * @brief * The handleBalChamberDialDeliveryBypassCheck function decides closing the * bypass valve and open up the dialyzer valves for treatment. - * @details \b Inputs: readyToDeliverDialysate - * @details \b Outputs: readyToDeliverDialysate,isDialDeliveryInProgress - * @return next balancing chamber state. + * @details \b Inputs: isDialysateGoodtoDeliver + * @details \b Outputs: isDialysateGoodtoDeliver,isDialDeliveryInProgress + * @return none. *************************************************************************/ -static BAL_CHAMBER_EXEC_STATE_T handleBalChamberDialDeliveryBypassCheck( void ) +static void balChamberDialDeliveryBypassCheck( void ) { - BAL_CHAMBER_EXEC_STATE_T state = BAL_CHAMBER_STATE1_FILL_START; - - // TODO: Make sure the pressure, temperature and conductivity in range - // Also TD confirms the delivery of dialysate. - readyToDeliverDialysate = TRUE; - - if ( TRUE == readyToDeliverDialysate ) + if ( TRUE == isDialysateGoodtoDeliver ) { - // Close By pass valve and Open VDI, VDo valves + // Close bypass valve and Open VDI, VDo valves setValveState( VDB2, VALVE_STATE_CLOSED ); setValveState( VDI, VALVE_STATE_OPEN ); setValveState( VDO, VALVE_STATE_OPEN ); - // update dialysate delivery is in progress. + // update dialysate delivery status. isDialDeliveryInProgress.data = TRUE; } + else + { + // Open bypass valve and raise alarm + setValveState( VDI, VALVE_STATE_CLOSED ); + setValveState( VDO, VALVE_STATE_CLOSED ); + setValveState( VDB2, VALVE_STATE_OPEN ); - return state; + // update dialysate delivery status. + isDialDeliveryInProgress.data = FALSE; + } } /*********************************************************************//** @@ -638,7 +670,7 @@ data.isBalChamberFillInProgress = isBalChamberFillInProgress; data.currentBalChamberSwitchingCounter = currentBalChamberSwitchingCounter; data.isPressureStalbilizedDuringFill = isPressureStalbilizedDuringFill; - data.readyToDeliverDialysate = readyToDeliverDialysate; + data.isDialysateGoodtoDeliver = isDialysateGoodtoDeliver; broadcastData( MSG_ID_DD_BAL_CHAMBER_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( BAL_CHAMBER_DATA_T ) ); Index: firmware/App/Modes/BalancingChamber.h =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Modes/BalancingChamber.h (.../BalancingChamber.h) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Modes/BalancingChamber.h (.../BalancingChamber.h) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -37,19 +37,19 @@ U32 balChamberExecState; ///< Balancing chamber execution state U32 balChamberSWState; ///< Balancing chamber switching state (state 1 or state 2) F32 balChamberSWFreq; ///< Balancing chamber switching frequency - U32 isDialDelInProgress; ///< Whether Dialysate Delivery in progress or not + BOOL isDialDelInProgress; ///< Whether Dialysate Delivery in progress or not U32 balChamberSwPeriod; ///< Balancing chamber switching period - U32 isBalChamberFillInProgress; ///< Whether balancing chamber fill in progress or not + BOOL isBalChamberFillInProgress; ///< Whether balancing chamber fill in progress or not U32 currentBalChamberSwitchingCounter; ///< Current balancing chamber switching counter - U32 isPressureStalbilizedDuringFill; ///< Whether pressure stabilized during fill or not - U32 readyToDeliverDialysate; ///< Ready to deliver dialysate or not + BOOL isPressureStalbilizedDuringFill; ///< Whether pressure stabilized during fill or not + BOOL isDialysateGoodtoDeliver; ///< Ready to deliver dialysate or not } BAL_CHAMBER_DATA_T; // ********** public function prototypes ********** void initBalanceChamber( void ); // Initialize balancing chamber unit void transitionToBalChamberFill( void ); // Prepares for transition to balancing chamber execution -U32 execBalancingChamber( void ); // Execute the balancing chamber state machine +U32 execBalancingChamberControl( void ); // Execute the balancing chamber state machine void updateBalChamberSwitchingPeriod( void ); // Update the balancing chamber switching period BAL_CHAMBER_EXEC_STATE_T getCurrentBalancingChamberExecState( void ); // Get the current state of the balancing chamber execution Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -39,7 +39,7 @@ #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. #define SPENT_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. -#define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0 ///< Minimum hydraulics fluid temperature in deg celcius +#define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0F ///< Minimum hydraulics fluid temperature in deg celcius #define HYD_CHAMBER_PRES_CHECK_TIME_OUT ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when hydraulics chamber pressure check initiated #define SPENT_DIAL_PRES_CHECK_TIME_OUT ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when spent dialysate pressure check initiated #define HYD_CHAMBER_TARGET_NEG_PRESS_MIN_PSI (-11.7877F) ///< Hydraulics chamber minimum negative pressure(D9/PHo) in psi. @@ -94,6 +94,9 @@ genDialysateDataPublishInterval.ovInitData = 0; genDialysateDataPublishInterval.override = OVERRIDE_RESET; genDialysateDataPublicationTimerCounter = 0; + + //Initialize balancing chamber module + initBalanceChamber(); } /*********************************************************************//** @@ -303,7 +306,7 @@ setValveState( VHO, VALVE_STATE_OPEN ); } - // Invlaid levels + // Invalid levels if ( ( STATE_LOW == floaterLevel1 ) && ( STATE_HIGH == floaterLevel2 ) ) { //TODO : check for invalid levels and trigger alarm @@ -439,7 +442,7 @@ U32 balChamberstate; //Execute balancing chamber - balChamberstate = execBalancingChamber(); + balChamberstate = execBalancingChamberControl(); if ( BAL_CHAMBER_DIAL_DELIVERY_PAUSE == balChamberstate ) { Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -25,7 +25,6 @@ #include "OperationModes.h" #include "TaskGeneral.h" - /** * @addtogroup DDOperationModes * @{ @@ -100,10 +99,10 @@ // call initializers for the individual modes initFaultMode(); -// initServiceMode(); + initServiceMode(); initInitAndPOSTMode(); -// initStandbyMode(); -// initGenIdleMode(); + initStandbyMode(); + initGenDialysateMode(); // initFlushMode(); // initHeatDisinfectMode(); // initHeatDisinfectActiveCoolMode(); @@ -525,11 +524,13 @@ if ( TRUE == isTestingActivated() ) { + U32 data; DD_OP_MODE_T newMode; - if( message->hdr.payloadLen == sizeof(DD_OP_MODE_T) ) + if( message->hdr.payloadLen == sizeof( U32 ) ) { - memcpy( &newMode, message->payload, sizeof(DD_OP_MODE_T) ); + memcpy( &data, message->payload, sizeof( U32 ) ); + newMode = (DD_OP_MODE_T)data; } DD_OP_MODE_T check = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -123,13 +123,11 @@ MSG_ID_DD_OP_MODE_STATUS_OVERRIDE_REQUEST, MSG_ID_DD_SET_OPERATION_MODE_OVERRIDE_REQUEST, MSG_ID_DD_START_GEN_DIALYSATE_MODE_OVERRIDE_REQUEST, - MSG_ID_DD_DIALYSATE_PUMPS_START_OVERRIDE_REQUEST, - MSG_ID_DD_DIALYSATE_PUMPS_STOP_OVERRIDE_REQUEST, //45 - MSG_ID_DD_GEND_MODE_DATA_PUBLISH_OVERRIDE_REQUEST, - MSG_ID_DD_CONCENTRATE_PUMPS_START_OVERRIDE_REQUEST, - MSG_ID_DD_HEATERS_START_OVERRIDE_REQUEST, - MSG_ID_DD_HEATERS_STOP_OVERRIDE_REQUEST, - MSG_ID_DD_VALVES_OPEN_CLOSE_STATE_OVERRIDE_REQUEST, //50 + MSG_ID_DD_DIALYSATE_PUMPS_START_STOP_OVERRIDE_REQUEST, + MSG_ID_DD_GEND_MODE_DATA_PUBLISH_OVERRIDE_REQUEST, //45 + MSG_ID_DD_CONCENTRATE_PUMPS_START_STOP_OVERRIDE_REQUEST, + MSG_ID_DD_HEATERS_START_STOP_OVERRIDE_REQUEST, + MSG_ID_DD_VALVES_OPEN_CLOSE_STATE_OVERRIDE_REQUEST, }; /// Message handling function table @@ -177,13 +175,11 @@ &testDDOpModePublishIntervalOverride, &testSetOperationMode, &testDDstartGenDialysateOverride, - &testDialysatePumpStartOverride, - &testDialysatePumpStopOverride, //45 - &testDDGenDialysateDataPublishIntervalOverride, - &testConcentratePumpStartOverride, - &testHeaterStartOverride, - &testHeaterStopOverride, - &testValveOpenCloseStateOverride, //50 + &testDialysatePumpStartStopOverride, + &testDDGenDialysateDataPublishIntervalOverride, //45 + &testConcentratePumpStartStopOverride, + &testHeaterStartStopOverride, + &testValveOpenCloseStateOverride, }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLERS) / sizeof(MsgFuncPtr)) Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -40,6 +40,11 @@ static TD_OP_MODE_T tdCurrentOpMode; ///< Current TD operation mode. static U32 tdSubMode; ///< Current state (sub-mode) of current TD operation mode. static F32 tdDialysisFlowrate; ///< TD dialysis flow rate +static F32 tdUFRate; ///< TD ultrafilteration rate +static F32 tdTargetDialysateTemp; ///< TD target dialysate temperature +static BOOL tdDialyzerBypass; ///< TD dialyzer bypass +static U32 tdAcidType; ///< TD Acid type +static U32 tdBiCarbType; ///< TD Bicarb type static BOOL tdOpModeDataFreshFlag = FALSE; ///< Flag to signal/process fresh TD op mode data @@ -57,9 +62,14 @@ void initTDInterface( void ) { // Initialize unit variables - tdCurrentOpMode = MODE_INIT; - tdSubMode = 0; - tdDialysisFlowrate = TD_MAX_DIALYSIS_FLOW_RATE; // Will update later based on the TD value + tdCurrentOpMode = MODE_INIT; + tdSubMode = 0; + tdDialysisFlowrate = TD_MAX_DIALYSIS_FLOW_RATE; // Will update later based on the TD value + tdUFRate = 0.0F; + tdTargetDialysateTemp = 0.0F; + tdDialyzerBypass = FALSE; + tdAcidType = 0; + tdBiCarbType = 0; } /**********************************************************************//** @@ -172,7 +182,45 @@ return tdDialysisFlowrate; } +/*********************************************************************//** + * @brief + * The getTDUFrate function gets the latest TD ultrafilteration flow + * rate. + * @details \b Inputs: tdUFRate + * @details \b Outputs: none + * @return Latest UF rate. + *************************************************************************/ +F32 getTDUFRate( void ) +{ + return tdUFRate; +} +/*********************************************************************//** + * @brief + * The getTDTargetDialysateTemperature function gets the latest TD + * target dialysate temperature rate. + * @details \b Inputs: tdTargetDialysateTemp + * @details \b Outputs: none + * @return Latest target dialysate temperature. + *************************************************************************/ +F32 getTDTargetDialysateTemperature( void ) +{ + return tdTargetDialysateTemp; +} + +/*********************************************************************//** + * @brief + * The getTDDialyzerBypass function gets the latest TD + * dailyzer bypass valve enable flag. + * @details \b Inputs: tdDialyzerBypass + * @details \b Outputs: none + * @return Latest dialyzer bypass valve enable. + *************************************************************************/ +BOOL getTDDialyzerBypass( void ) +{ + return tdDialyzerBypass; +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/TDInterface.h =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a --- firmware/App/Services/TDInterface.h (.../TDInterface.h) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Services/TDInterface.h (.../TDInterface.h) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) @@ -44,6 +44,9 @@ U32 getTDSubMode( void ); void setTDOpMode( U32 opMode, U32 subMode ); F32 getTDDialysateFlowrate( void ); +F32 getTDUFRate( void ); +F32 getTDTargetDialysateTemperature( void ); +BOOL getTDDialyzerBypass( void ); /**@}*/