Index: firmware/.launches/DG.launch =================================================================== diff -u -r25770b4b27e75e730d89ac046f7db405b1bfe39f -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/.launches/DG.launch (.../DG.launch) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f) +++ firmware/.launches/DG.launch (.../DG.launch) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -1,13 +1,29 @@ +<<<<<<< HEAD +======= + + + + + + + + + + +>>>>>>> staging + + + Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -rb1dc3df084a8517ca1575bdbf741fecd96d56a12 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision b1dc3df084a8517ca1575bdbf741fecd96d56a12) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -152,10 +152,10 @@ calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); - data.cp1CurrentSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - data.cp1MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); - data.cp2CurrentSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - data.cp2MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + data.cp1CurrentSetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; + data.cp1MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); + data.cp2CurrentSetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; + data.cp2MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); F32 const cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; F32 const cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -rb1dc3df084a8517ca1575bdbf741fecd96d56a12 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision b1dc3df084a8517ca1575bdbf741fecd96d56a12) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -41,9 +41,9 @@ /// Concentrate pump data struct. typedef struct { - F32 cp1CurrentSpeed; ///< Concentrate pump CP1 current set speed + F32 cp1CurrentSetSpeed; ///< Concentrate pump CP1 current set speed F32 cp1MeasuredSpeed; ///< Concentrate pump CP1 measured speed - F32 cp2CurrentSpeed; ///< Concentrate pump CP2 current set speed + F32 cp2CurrentSetSpeed; ///< Concentrate pump CP2 current set speed F32 cp2MeasuredSpeed; ///< Concentrate pump CP2 measured speed } CONCENTRATE_PUMP_DATA_T; Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -rab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision ab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -77,47 +77,47 @@ /// Enumeration of drain pump states. typedef enum DrainPump_States { - DRAIN_PUMP_OFF_STATE = 0, ///< Drain pump off state - DRAIN_PUMP_CONTROL_TO_TARGET_STATE, ///< Drain pump control to target state - DRAIN_PUMP_OPEN_LOOP_STATE, ///< Drain pump open loop state - NUM_OF_DRAIN_PUMP_STATES ///< Number of drain pump states + DRAIN_PUMP_OFF_STATE = 0, ///< Drain pump off state + DRAIN_PUMP_CONTROL_TO_TARGET_STATE, ///< Drain pump control to target state + DRAIN_PUMP_OPEN_LOOP_STATE, ///< Drain pump open loop state + NUM_OF_DRAIN_PUMP_STATES ///< Number of drain pump states } DRAIN_PUMP_STATE_T; /// Enumeration of drain pump self-test states. typedef enum DrainPump_Self_Test_States { - DRAIN_PUMP_SELF_TEST_STATE_START = 0, ///< Drain pump self-test start state - DRAIN_PUMP_TEST_STATE_IN_PROGRESS, ///< Drain pump self-test in progress state - DRAIN_PUMP_TEST_STATE_COMPLETE, ///< Drain pump self-test completed state - NUM_OF_DRAIN_PUMP_SELF_TEST_STATES ///< Number of drain pump self-test states + DRAIN_PUMP_SELF_TEST_STATE_START = 0, ///< Drain pump self-test start state + DRAIN_PUMP_TEST_STATE_IN_PROGRESS, ///< Drain pump self-test in progress state + DRAIN_PUMP_TEST_STATE_COMPLETE, ///< Drain pump self-test completed state + NUM_OF_DRAIN_PUMP_SELF_TEST_STATES ///< Number of drain pump self-test states } DRAIN_PUMP_SELF_TEST_STATE_T; // ********** private data ********** -static DRAIN_PUMP_STATE_T drainPumpState = DRAIN_PUMP_OFF_STATE; ///< Current state of drain pump controller state machine. -static U32 drainPumpDataPublicationTimerCounter = 0; ///< Used to schedule drain pump data publication to CAN bus. -static U32 drainPumpDAC = 0; ///< Initial drain pump DAC value. -static U32 drainPumpDACSet = 0; ///< Currently set drain pump DAC value. -static PUMP_CONTROL_MODE_T drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; ///< Requested drain pump control mode. -static PUMP_CONTROL_MODE_T drainPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set drain pump control mode. +static DRAIN_PUMP_STATE_T drainPumpState = DRAIN_PUMP_OFF_STATE; ///< Current state of drain pump controller state machine. +static U32 drainPumpDataPublicationTimerCounter = 0; ///< Used to schedule drain pump data publication to CAN bus. +static U32 drainPumpDAC = 0; ///< Initial drain pump DAC value. +static U32 drainPumpDACSet = 0; ///< Currently set drain pump DAC value. +static PUMP_CONTROL_MODE_T drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; ///< Requested drain pump control mode. +static PUMP_CONTROL_MODE_T drainPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set drain pump control mode. static OVERRIDE_U32_T drainPumpDataPublishInterval = { DRAIN_PUMP_DATA_PUB_INTERVAL, DRAIN_PUMP_DATA_PUB_INTERVAL, - 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. -static U32 targetDrainPumpRPM = 0; ///< Target drain pump RPM. -static F32 targetDrainPumpOutletPressure = 0.0; ///< Target outlet pressure for the drain pump. + 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. +static U32 targetDrainPumpRPM = 0; ///< Target drain pump RPM. +static F32 targetDrainPumpOutletPressure = 0.0; ///< Target outlet pressure for the drain pump. -static U32 drainControlTimerCounter = 0; ///< Determines when to perform control on drain pump. -static BOOL hasClosedLoopBeenRequested = FALSE; ///< Closed loop pump control flag. -static U32 currentDrainPumpRPM = 0; ///< Current drain pump RPM from feedback. +static U32 drainControlTimerCounter = 0; ///< Determines when to perform control on drain pump. +static BOOL hasClosedLoopBeenRequested = FALSE; ///< Closed loop pump control flag. +static U32 currentDrainPumpRPM = 0; ///< Current drain pump RPM from feedback. /* TODO These variables are used for POST. POST will be implemented later -static DRAIN_PUMP_SELF_TEST_STATE_T drainPumpSelfTestState = DRAIN_PUMP_SELF_TEST_STATE_START; ///< Current drain pump self test state. -static U32 drainPumpSelfTestTimerCount = 0; ///< Timer counter for drain pump self test. +static DRAIN_PUMP_SELF_TEST_STATE_T drainPumpSelfTestState = DRAIN_PUMP_SELF_TEST_STATE_START; ///< Current drain pump self test state. +static U32 drainPumpSelfTestTimerCount = 0; ///< Timer counter for drain pump self test. */ /// ADC to RPM conversion coefficient or RPM to ADC conversion. -static const F32 CONVERSION_COEFF = SEC_PER_MIN / ( TOGGLE_PERIOD_RESOLUTION_SECONDS * ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION ); +static const F32 CONVERSION_COEFF = SEC_PER_MIN / ( 2 * TOGGLE_PERIOD_RESOLUTION_SECONDS * ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION ); // ********** private function prototypes ********** @@ -139,7 +139,7 @@ { stopDrainPump(); - hasClosedLoopBeenRequested = FALSE; + hasClosedLoopBeenRequested = FALSE; // Initialize the drain pump PI controller initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_MIN_DAC, @@ -263,11 +263,15 @@ currentDrainPumpRPM = CONVERSION_COEFF / getFPGADrainPumpSpeed(); } - // TODO this is disabled until RPM is calculated propely. + /* TODO: The RPM is not converted properly. There will be a story to work on this issue. + * This part of code is commented out until the RPM is calculated from ADC correctly. + * There will be a story to address the RPM conversion. + */ +#ifndef IGNORE_DRAIN_PUMP_MONITOR // The RPM is only checked in open loop state that the pump is run at a fixed RPM. // The persistent alarm waits for a couple of seconds before raising an alarm, this is supposed to cover // when the pump is turned on and it takes a while to ramp up to target RPM. - /*if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) { U32 targetRPM = getTargetDrainPumpRPM(); F32 threshold = OPEN_LOOP_RPM_OUT_OF_RANGE * targetRPM; @@ -289,8 +293,10 @@ if ( isAlarmActive( ALARM_ID_DRAIN_PUMP_OFF_FAULT ) ) { activateSafetyShutdown(); + BOOL test = FALSE; } - }*/ + } +#endif // Publish drain pump data on interval publishDrainPumpData(); @@ -359,13 +365,13 @@ /*********************************************************************//** * @brief - * The getTargetDrainPumpDeltaP function gets the current target drain pump - * delta pressure. + * The getTargetDrainPumpOutletPressure function gets the current target + * drain pump delta pressure. * @details Inputs: targetDrainPumpOutletPressure * @details Outputs: none * @return the current target drain pump outlet pressure. *************************************************************************/ -F32 getTargetDrainPumpOutletP( void ) +F32 getTargetDrainPumpOutletPressure( void ) { return targetDrainPumpOutletPressure; } @@ -430,8 +436,8 @@ // control at set interval if ( ++drainControlTimerCounter >= DRP_CONTROL_INTERVAL ) { - F32 outletDrainPressure = getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); - F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, getTargetDrainPumpOutletP(), outletDrainPressure ); + F32 outletDrainPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); + F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, getTargetDrainPumpOutletPressure(), outletDrainPressure ); // The PI controller sends the DAC out and it is rounded to the nearest offset and is fed to the FPGA drainPumpDACSet = (U32)( dac + FLOAT_TO_INT_ROUNDUP_OFFSET ); @@ -452,7 +458,16 @@ *************************************************************************/ static DRAIN_PUMP_STATE_T handleDrainPumpOpenLoopState( void ) { - return DRAIN_PUMP_OPEN_LOOP_STATE; + DRAIN_PUMP_STATE_T state = DRAIN_PUMP_OPEN_LOOP_STATE; + + // Check if the RPM is 0, and if it is turn off the pump + if ( 0 == getTargetDrainPumpRPM() ) + { + state = DRAIN_PUMP_OFF_STATE; + signalDrainPumpHardStop(); + } + + return state; } /*********************************************************************//** @@ -585,8 +600,7 @@ if ( TRUE == isTestingActivated() ) { - // Check for the RPM to be in range - if ( value >= MIN_DRAIN_PUMP_RPM && value <= MAX_DRAIN_PUMP_RPM ) + if ( ( 0 == value ) || ( value >= MIN_DRAIN_PUMP_RPM ) && ( value <= MAX_DRAIN_PUMP_RPM ) ) { result = setDrainPumpTargetRPM( value ); } Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rbbd5ac2589c8093f681f2284367975ddd220b553 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -17,54 +17,57 @@ #include +// TI PWM driver #include "etpwm.h" #include "AlarmMgmt.h" #include "DGDefs.h" #include "Heaters.h" -#include "ROPump.h" +#include "OperationModes.h" #include "PIControllers.h" +#include "ROPump.h" +#include "SafetyShutdown.h" #include "SystemCommMessages.h" -#include "TaskGeneral.h" +#include "TaskPriority.h" #include "TemperatureSensors.h" #include "Timers.h" -#ifdef ENABLE_DIP_SWITCHES -#include "mibspi.h" -#include "FPGA.h" -#endif - /** * @addtogroup Heaters * @{ */ // ********** private definitions ********** -#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (89%). -#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (50%). -#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.50 ///< Trimmer heater max duty cycle (50%). -#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters minimum duty cycle (0.00%). +#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (89%). +#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (50%). +#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.50 ///< Trimmer heater max duty cycle (50%). +#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters minimum duty cycle (0.00%). -#define PRIMARY_HEATERS_P_COEFFICIENT 0.02 ///< Primary heaters proportional coefficient. -#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 ///< Primary heaters integral coefficient. +#define PRIMARY_HEATERS_P_COEFFICIENT 0.02 ///< Primary heaters proportional coefficient. +#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 ///< Primary heaters integral coefficient. -#define TRIMMER_HEATER_P_COEFFICIENT 0.02 ///< Trimmer heater proportional coefficient. -#define TRIMMER_HEATER_I_COEFFICIENT 0.001 ///< Trimmer heater integral coefficient. +#define TRIMMER_HEATER_P_COEFFICIENT 0.02 ///< Trimmer heater proportional coefficient. +#define TRIMMER_HEATER_I_COEFFICIENT 0.001 ///< Trimmer heater integral coefficient. -#define CONTROLLER_CHECK_INTERVAL_COUNT 10U ///< Time interval count to check the PI controller. -#define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count. +#define CONTROLLER_CHECK_INTERVAL_COUNT 10U ///< Time interval count to check the PI controller. +#define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count. -#define HEATERS_DATA_PUBLISH_INTERVAL (500 / TASK_GENERAL_INTERVAL ) ///< Heaters data publish interval. +#define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Heaters data publish interval. -#define SMALL_PRIMARY_AND_TRIMMER_HEATERS_POST_TARGET_TEMPERATURE 40U ///< Small primary and trimmer heaters target temperature during POST. -#define MAIN_PRIMARY_HEATER_POST_TARGET_TEMPERATURE 35U ///< Main primary heater target temperature during POST. -#define HEATERS_POST_HEAT_UP_TIME_SECONDS 50U ///< The time that the heaters are heated up to reach to the target temperature during POST. -#define HEATERS_POST_TEMPERATURE_TOLERANCE 1U ///< Tolerance of the sensors to the target temperature during POST. +#define SMALL_PRIMARY_AND_TRIMMER_HEATERS_POST_TARGET_TEMPERATURE 40U ///< Small primary and trimmer heaters target temperature during POST. +#define MAIN_PRIMARY_HEATER_POST_TARGET_TEMPERATURE 35U ///< Main primary heater target temperature during POST. +#define HEATERS_POST_HEAT_UP_TIME_SECONDS 50U ///< The time that the heaters are heated up to reach to the target temperature during POST. +#define HEATERS_POST_TEMPERATURE_TOLERANCE 1U ///< Tolerance of the sensors to the target temperature during POST. -#define MINIMUM_TARGET_TEMPERATURE 10U ///< Minimum allowed target temperature for the heaters. -#define MAXIMUM_TARGET_TEMPERATURE 90U ///< Maximum allowed target temperature for the heaters. +#define MINIMUM_TARGET_TEMPERATURE 10U ///< Minimum allowed target temperature for the heaters. +#define MAXIMUM_TARGET_TEMPERATURE 90U ///< Maximum allowed target temperature for the heaters. +#define HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ( ( 3 * MS_PER_SECOND ) / TASK_PRIORITY_INTERVAL ) ///< Heaters are on but there is no sufficient flow timeout in counts. +#define HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C 120.0 ///< Heaters max allowed internal temperature in degrees C. TODO figure out the max temperature value +#define HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heaters max allowed internal temperature timeout in milliseconds. +#define HEATERS_ON_NO_FLOW_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heaters on with no flow time out in milliseconds. + /// Heaters self-test enums typedef enum heaters_self_test_states { @@ -101,28 +104,36 @@ // ********** private data ********** -static SELF_TEST_STATUS_T heatersSelfTestResult; ///< Heaters self-test results. -static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; ///< Heaters self-test state. -static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; ///< Primary heaters exec state. -static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; ///< Trimmer heater exec state. +static SELF_TEST_STATUS_T heatersSelfTestResult; ///< Heaters self-test results. +static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; ///< Heaters self-test state. +static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; ///< Primary heaters exec state. +static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; ///< Trimmer heater exec state. -static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature. -static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature. +static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature. +static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature. -static F32 mainPrimaryHeaterDutyCycle; ///< Main primary heater duty cycle. -static F32 smallPrimaryHeaterDutyCycle; ///< Small primary heater duty cycle. -static F32 trimmerHeaterDutyCycle; ///< Trimmer heater duty cycle. -static U32 primaryHeaterTimerCounter; ///< Primary heater timer counter. -static U32 trimmerHeaterTimerCounter; ///< Trimmer heater timer counter. -static U32 dataPublicationTimerCounter; ///< Data publication timer counter. -static BOOL isPrimaryHeaterOn; ///< Flag to show if the primary heater is on. -static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on. +static F32 mainPrimaryHeaterDutyCycle; ///< Main primary heater duty cycle. +static F32 smallPrimaryHeaterDutyCycle; ///< Small primary heater duty cycle. +static F32 trimmerHeaterDutyCycle; ///< Trimmer heater duty cycle. +static U32 primaryHeaterTimerCounter; ///< Primary heater timer counter. +static U32 trimmerHeaterTimerCounter; ///< Trimmer heater timer counter. +static U32 dataPublicationTimerCounter; ///< Data publication timer counter. +static BOOL isPrimaryHeaterOn; ///< Flag to show if the primary heater is on. +static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, - HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. -static U32 selfTestElapsedTime; ///< Self-test elapsed time variable. -static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. -static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. + HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. +static U32 selfTestElapsedTime; ///< Self-test elapsed time variable. +static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. +static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. +static U32 heatersOnWithNoFlowTimer; ///< Heaters are on but there is no sufficient flow. +static TEMPERATURE_SENSORS_T primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_PRIMARY_HEATER; ///< Primary heaters feedback temperature sensors. +static TEMPERATURE_SENSORS_T trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; ///< Trimmer heater feedback temperature sensors. +static U32 primaryHeatersInternalTempOutTimer = 0; ///< Primary heaters internal temperature out of range timer. +static U32 trimmerHeaterInternalTempOutTimer = 0; ///< Trimmer heater internal temperature out of range timer. +static BOOL isPrimaryHeatersTempOutOfRange = FALSE; ///< Boolean flag to indicate if the primary heaters internal temperature out of range. +static BOOL isTrimmerHeaterTempOutOfRange = FALSE; ///< Boolean flag to indicate if the trimmer heater internal temperature out of range. +static BOOL isFlowBelowMin = FALSE; ///< Boolean flag to indicate if the flow is below the minimum. // ********** private function prototypes ********** @@ -141,13 +152,8 @@ static void setTrimmerHeaterPWM( F32 pwm ); static void resetHeaterState( NAME_OF_HEATER_T heater ); static void publishHeatersData( void ); -static U32 getPublishHeatersDataInterval( void ); +static U32 getPublishHeatersDataInterval( void ); -// TODO: Remove the below code. FOR TESTING ONLY -#define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) -#define TOGGLEPRIMAYHEATER() ( ( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0 ) -//TODO: Remove the above code. FOR TESTING ONLY - /*********************************************************************//** * @brief * The initHeaters function initializes the variables and the PI controllers @@ -158,17 +164,24 @@ *************************************************************************/ void initHeaters( void ) { - heatersSelfTestState = HEATERS_SELF_TEST_START; - primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; - trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; - primaryHeaterTargetTemperature = 0.0; - trimmerHeaterTargetTemperature = 0.0; - primaryHeaterTimerCounter = 0; - trimmerHeaterTimerCounter = 5; - dataPublicationTimerCounter = 0; - isPrimaryHeaterOn = FALSE; - isTrimmerHeaterOn = FALSE; - selfTestElapsedTime = 0; + heatersSelfTestState = HEATERS_SELF_TEST_START; + primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; + trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; + primaryHeaterTargetTemperature = 0.0; + trimmerHeaterTargetTemperature = 0.0; + primaryHeaterTimerCounter = 0; + trimmerHeaterTimerCounter = 5; + dataPublicationTimerCounter = 0; + isPrimaryHeaterOn = FALSE; + isTrimmerHeaterOn = FALSE; + selfTestElapsedTime = 0; + primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_PRIMARY_HEATER; + trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; + primaryHeatersInternalTempOutTimer = 0; + trimmerHeaterInternalTempOutTimer = 0; + isPrimaryHeatersTempOutOfRange = FALSE; + isTrimmerHeaterTempOutOfRange = FALSE; + isFlowBelowMin = FALSE; // Initialize the PI controller for the primary heaters initializePIController( PI_CONTROLLER_ID_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE, PRIMARY_HEATERS_P_COEFFICIENT, PRIMARY_HEATERS_I_COEFFICIENT, @@ -221,9 +234,9 @@ if ( ( primaryHeaterTargetTemperature >= MINIMUM_TARGET_TEMPERATURE ) && ( primaryHeaterTargetTemperature <= MAXIMUM_TARGET_TEMPERATURE ) ) { -#ifndef DISABLE_HEATERS_AND_TEMPS +//#ifndef DISABLE_HEATERS_AND_TEMPS hasStartPrimaryHeaterRequested = TRUE; -#endif +//#endif status = TRUE; } @@ -262,10 +275,8 @@ *************************************************************************/ void stopPrimaryHeater( void ) { - mainPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; - smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; - setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); - setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + setMainPrimaryHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); + setSmallPrimaryHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); isPrimaryHeaterOn = FALSE; } @@ -278,8 +289,7 @@ *************************************************************************/ void stopTrimmerHeater( void ) { - trimmerHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; - setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + setTrimmerHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); isTrimmerHeaterOn = FALSE; } @@ -326,23 +336,93 @@ /*********************************************************************//** * @brief - * The execHeatersMonitor function turns off the heaters when RO pump is not on. + * The execHeatersMonitor function turns off the heaters when RO pump is + * not on. * @details Inputs: none * @details Outputs: Turns off the heaters when RO pump is not on * @return none *************************************************************************/ void execHeatersMonitor( void ) { - // If the RO pump is not on, turn off the heaters - if ( ! isReverseOsmosisPumpOn() ) +#ifndef IGNORE_HEATERS_MONITOR + F32 primaryHeatersInternalTemp = getTemperatureValue( TEMPSENSORS_PRIMARY_HEATER_INTERNAL ); + F32 trimmerHeaterInternalTemp = getTemperatureValue( TEMPSENSORS_TRIMMER_HEATER_INTERNAL ); + + // Check if the primary heaters' internal temperature is above the limit + if ( primaryHeatersInternalTemp > HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C ) { -#ifndef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD - stopPrimaryHeater(); // TODO - this is so immediate - if other module requests RO pump on and start heater, this monitor may stop the heater request before RO pump has a chance to start - stopTrimmerHeater(); -#endif -#endif + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_PRIMARY_HEATERS_INTERNAL_TEMP_OUT_OF_RANGE, primaryHeatersInternalTemp ); + + // If it is above the range for the first time, stop the primary heaters + // and set the variables + if ( FALSE == isPrimaryHeatersTempOutOfRange ) + { + stopPrimaryHeater(); + isPrimaryHeatersTempOutOfRange = TRUE; + primaryHeatersInternalTempOutTimer = getMSTimerCount(); + } + // If the primary heaters internal temperature was out for more than the define period, activate the safety shutdown + else if ( TRUE == didTimeout( primaryHeatersInternalTempOutTimer, HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ) ) + { + activateSafetyShutdown(); + } } + + // Check if the trimmer heater internal temperature is above the limit + if ( trimmerHeaterInternalTemp > HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_TRIMMER_HEATER_INTERNAL_TEMP_OUT_OF_RANGE, trimmerHeaterInternalTemp ); + + // If it is above the range for the first time, stop the trimmer heater + // and set the variables + if ( FALSE == isTrimmerHeaterTempOutOfRange ) + { + stopTrimmerHeater(); + isTrimmerHeaterTempOutOfRange = TRUE; + trimmerHeaterInternalTempOutTimer = getMSTimerCount(); + } + // If the trimmer heater internal temperature was out for more than the define period, activate the safety shutdown + else if ( TRUE == didTimeout( trimmerHeaterInternalTempOutTimer, HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ) ) + { + activateSafetyShutdown(); + } + } + + /* + * If any of the heaters are on, check if the flow is below than the minimum value + * If the flow is below minimum for the first time, set the variables + * If the flow is below minimum for more than the defined time, stop the heaters and raise the alarm + * If the flow is in range, reset the variables + */ + if ( ( TRUE == isPrimaryHeaterOn ) || ( TRUE == isTrimmerHeaterOn ) ) + { + F32 measuredFlow = getMeasuredROFlowRate(); + + if ( measuredFlow < MIN_RO_FLOWRATE_LPM ) + { + if ( FALSE == isFlowBelowMin ) + { + isFlowBelowMin = TRUE; + heatersOnWithNoFlowTimer = getMSTimerCount(); + } + else if ( TRUE == didTimeout( heatersOnWithNoFlowTimer, HEATERS_ON_NO_FLOW_TIMEOUT_MS ) ) + { + stopPrimaryHeater(); + stopTrimmerHeater(); + + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DG_HEATERS_ON_WITH_NO_FLOW_TIMEOUT, measuredFlow ); + } + } + else + { + isFlowBelowMin = FALSE; + heatersOnWithNoFlowTimer = getMSTimerCount(); + } + } +#endif + + // Check for data publication + publishHeatersData(); } /*********************************************************************//** @@ -547,37 +627,24 @@ { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_OFF; - // TODO for testing only. remove -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD - if ( TOGGLEPRIMAYHEATER() ) - { - setPrimaryHeaterTargetTemperature( 37 ); - startPrimaryHeater(); - F32 pumpPWM = 1; - etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - F32 fanPWM = 0.25; - etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - hasStartPrimaryHeaterRequested = TRUE; - } -#endif -#endif -#endif - // TODO remove this code for testing - if ( hasStartPrimaryHeaterRequested ) { resetHeaterState( PRIMARY_HEATER ); setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); isPrimaryHeaterOn = TRUE; hasStartPrimaryHeaterRequested = FALSE; + + // Check if the operation mode is heat disinfect. If the mode is + // heat disinfect, the feedback sensor will be Thd + if ( DG_MODE_HEAT == getCurrentOperationMode() ) + { + // Set the feedback temperature sensor + primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; //TODO change this to Thd sensors once it is installed + } + state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; } - publishHeatersData(); - return state; } @@ -597,50 +664,46 @@ if ( ++primaryHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { - F32 outletTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); - mainPrimaryHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); - - if ( mainPrimaryHeaterDutyCycle >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + // Check if the flow is not below minimum required first + // If the flow is below minimum, send 0.00 to the PWM until the flow comes back to range + // If the flow is within range, run the PI controller to control the heaters normally + if ( FALSE == isFlowBelowMin ) { - // The duty cycle from the PI controller was greater than max duty cycle of the main primary - // heater. So subtract the remaining from the max main primary heater duty cycle and set - // the rest to the small primary heater - smallPrimaryHeaterDutyCycle = mainPrimaryHeaterDutyCycle - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; - mainPrimaryHeaterDutyCycle = MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; - setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); - setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + F32 outletTemp = getTemperatureValue( primaryHeatersFeedbackTempSensor ); + mainPrimaryHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); + + if ( mainPrimaryHeaterDutyCycle >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + { + // The duty cycle from the PI controller was greater than max duty cycle of the main primary + // heater. So subtract the remaining from the max main primary heater duty cycle and set + // the rest to the small primary heater + smallPrimaryHeaterDutyCycle = mainPrimaryHeaterDutyCycle - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + mainPrimaryHeaterDutyCycle = MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); + setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + } + else + { + setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); + smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; + setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + } } + // Flow is below the minimum required flow to run the primary heaters else { - setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); - smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; - setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + setMainPrimaryHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); + setSmallPrimaryHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); } + primaryHeaterTimerCounter = 0; } - publishHeatersData(); - - // TODO remove this code -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD - if ( !TOGGLEPRIMAYHEATER() ) + if ( isPrimaryHeaterOn != TRUE ) { - stopPrimaryHeater(); - F32 pumpPWM = 0; - etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - F32 fanPWM = 0; - etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - } -#endif -#endif -#endif - // TODO Remove this code - - if ( ! isPrimaryHeaterOn ) - { + // Switch to off state. Set the duty cycles to 0 + mainPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; + smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; state = PRIMARY_HEATERS_EXEC_STATE_OFF; } @@ -659,40 +722,24 @@ { TRIMMER_HEATER_EXEC_STATES_T state = TRIMMER_HEATER_EXEC_STATE_OFF; - // TODO for testing only. remove -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD -// if ( TOGGLEPRIMAYHEATER() ) -// { - //setTrimmerHeaterTargetTemperature( 38 ); - //startTrimmerHeater(); - //F32 pumpPWM = 1; - //etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStartROPump(); - //temporaryStartFan(); - //F32 fanPWM = 0.25; - //etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStartROPump(); - //temporaryStartFan(); -// } -#endif -#endif -#endif - // TODO remove this code for testing - if ( hasStartTrimmerHeaterRequested ) { resetHeaterState( TRIMMER_HEATER ); isTrimmerHeaterOn = TRUE; hasStartTrimmerHeaterRequested = FALSE; setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + + // Check if the operation mode is heat disinfect. If the mode is + // heat disinfect, the feedback sensor will be Thd + if ( DG_MODE_HEAT == getCurrentOperationMode() ) + { + // Set the feedback temperature sensor + trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; //TODO change this to Thd sensors once it is installed + } + state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; } - publishHeatersData(); - return state; } @@ -701,7 +748,8 @@ * The handleTrimmerHeaterControlToTarget function handles the trimmer * heater at control state when the heater is active. * @details Inputs: trimmerHeaterTimerCounter, trimmerHeaterDutyCycle - * @details Outputs: trimmerHeaterTimerCounter, trimmerHeaterDutyCycle, isTrimmerHeaterOn + * @details Outputs: trimmerHeaterTimerCounter, trimmerHeaterDutyCycle, + * isTrimmerHeaterOn * @return state (TRIMMER_HEATER_EXEC_STATES_T) *************************************************************************/ static TRIMMER_HEATER_EXEC_STATES_T handleTrimmerHeaterControlToTarget( void ) @@ -710,38 +758,27 @@ if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { - F32 outletTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); - trimmerHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); - setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + // Check if the flow is not below minimum required first + // If the flow is below minimum, send 0.00 to the PWM until the flow comes back to range + // If the flow is within range, run the PI controller to control the heaters normally + if ( FALSE == isFlowBelowMin ) + { + F32 outletTemp = getTemperatureValue( trimmerHeaterFeedbackTempSensor ); + trimmerHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); + setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + } + else + { + setTrimmerHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); + } + trimmerHeaterTimerCounter = 0; } - publishHeatersData(); - - // TODO remove this code -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD -// if ( !TOGGLEPRIMAYHEATER() ) -// { - //stopTrimmerHeater(); - //F32 pumpPWM = 0; - //etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStartROPump(); - //temporaryStartFan(); - //F32 fanPWM = 0; - //etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStopROPump(); - //temporaryStopFan(); -// } -#endif -#endif -#endif - // TODO Remove this code - if ( ! isTrimmerHeaterOn ) { + // Set the duty cycle to 0 and switch to off state + trimmerHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; state = TRIMMER_HEATER_EXEC_STATE_OFF; } @@ -830,23 +867,28 @@ /*********************************************************************//** * @brief - * The publishTemperatureData function publishes the temperature sensors - * data into the USB debug port at the defined time interval. + * The publishTemperatureData function publishes the heaters data into + * at the defined time interval. * @details Inputs: dataPublicationTimerCounter - * @details Outputs: Broadcast temperature sensors' data + * @details Outputs: dataPublicationTimerCounter * @return none *************************************************************************/ static void publishHeatersData( void ) { if ( ++dataPublicationTimerCounter >= getPublishHeatersDataInterval() ) { - broadcastHeatersData( (U32)(mainPrimaryHeaterDutyCycle*100), (U32)(smallPrimaryHeaterDutyCycle*100), (U32)(trimmerHeaterDutyCycle*100) ); + HEATERS_DATA_T data; + data.mainPrimayHeaterDC = mainPrimaryHeaterDutyCycle * 100.0; + data.smallPrimaryHeaterDC = smallPrimaryHeaterDutyCycle * 100.0; + data.trimmerHeaterDC = trimmerHeaterDutyCycle * 100.0; + + broadcastHeatersData( &data ); + dataPublicationTimerCounter = 0; } } - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -866,7 +908,7 @@ if ( isTestingActivated() ) { - U32 interval = value / TASK_GENERAL_INTERVAL; + U32 interval = value / TASK_PRIORITY_INTERVAL; result = TRUE; heatersDataPublishInterval.ovData = interval; Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -rab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision ab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -286,7 +286,7 @@ * weight for a given load cell ID. * @details Inputs: load cell filtered weight * @details Outputs: none - * @param loadCellID ID of load cell to get small filtered weight for + * @param loadCellID ID of load cell to get large filtered weight * @return the small filtered load cell weight for the given load cell ID. *************************************************************************/ F32 getLoadCellSmallFilteredWeight( LOAD_CELL_ID_T loadCellID ) @@ -311,7 +311,7 @@ * weight for a given load cell ID. * @details Inputs: load cell filtered weight * @details Outputs: none - * @param loadCellID ID of load cell to get large filtered weight for + * @param loadCellID ID of load cell to get large filtered weight * @return the large filtered load cell weight for the given load cell ID. *************************************************************************/ F32 getLoadCellLargeFilteredWeight( LOAD_CELL_ID_T loadCellID ) Index: firmware/App/Controllers/LoadCell.h =================================================================== diff -u -r72dd42b6a116e62d1b3ad5d60088c29e067d10d4 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision 72dd42b6a116e62d1b3ad5d60088c29e067d10d4) +++ firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -31,6 +31,17 @@ // ********** public definitions ********** +#pragma pack(push,1) +/// Loadcell measurements struct. +typedef struct +{ + F32 loadCellA1inGram; ///< Loadcell A1 measurement in gram + F32 loadCellA2inGram; ///< Loadcell A2 measurement in gram + F32 loadCellB1inGram; ///< Loadcell B1 measurement in gram + F32 loadCellB2inGram; ///< Loadcell B2 measurement in gram +} LOAD_CELL_DATA_T; +#pragma pack(pop) + // ********** public function prototypes ********** void initLoadCell( void ); // Initialize the LoadCell module. Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -ra1b8dbb69c4bd2f0cc22e62bede7015c9307d378 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision a1b8dbb69c4bd2f0cc22e62bede7015c9307d378) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -316,19 +316,6 @@ broadcastPressureSensorsData( roIn, roOut, drainIn, drainOut ); pressuresDataPublicationTimerCounter = 0; -#ifdef DEBUG_ENABLED -#ifdef PRESSURES_DEBUG -{ - // TODO - temporary debug code - remove later - F32 lc1 = getLoadCellFilteredWeight(LOAD_CELL_RESERVOIR_1_PRIMARY); - F32 lc2 = getLoadCellFilteredWeight(LOAD_CELL_B1); - char debugPresStr[ 256 ]; - - sprintf( debugPresStr, "RO: %5d, %5d, Drain: %5d, %5d, Loads: %6d, %6d\n", (S32)roIn, (S32)roOut, (S32)drainIn, (S32)drainOut, (S32)lc1, (S32)lc2 ); - sendDebugData( (U08*)debugPresStr, strlen(debugPresStr) ); -} -#endif -#endif } } Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -re6dc73b45ec3d0df4c9a03673625862b71acd608 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision e6dc73b45ec3d0df4c9a03673625862b71acd608) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -32,11 +32,11 @@ // ********** private definitions ********** -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 16U ///< Primary heater external temperature sensors gain. +#define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 8U ///< Primary heater external temperature sensors gain. #define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 19600U ///< Primary heater external temperature sensors reference resistance. #define PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U ///< Primary heater external temperature sensors zero degree resistance. -#define COND_SENSORS_TEMP_SENSOR_GAIN 16U ///< Temperature sensor for conductivity gain. +#define COND_SENSORS_TEMP_SENSOR_GAIN 8U ///< Temperature sensor for conductivity gain. #define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U ///< Temperature sensor for conductivity reference resistance. #define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U ///< Temperature sensor for conductivity zero degree resistance. @@ -76,56 +76,55 @@ #define TEMPERATURE_SENSORS_INTERNAL_ERROR_PERSISTENT_PERIOD ( 3 * MS_PER_SECOND ) ///< Temperature sensors internal error persistent period. #define FPGA_RAW_ADC_READ_INTERVAL_COUNT 8 ///< Time interval in counts to read the raw ADC reads from FPGA. - /// Temperature sensor self-test states. typedef enum tempSensors_Self_Test_States { - TEMPSENSORS_SELF_TEST_START = 0, ///< Temperature sensors self-test start - TEMPSENSORS_SELF_TEST_ADC_CHECK, ///< Temperature sensors self ADC check - TEMPSENSORS_SELF_TEST_COMPLETE, ///< Temperature sensors self-test complete - NUM_OF_TEMPSENSORS_SELF_TEST_STATES ///< Total number of self-test states + TEMPSENSORS_SELF_TEST_START = 0, ///< Temperature sensors self-test start + TEMPSENSORS_SELF_TEST_ADC_CHECK, ///< Temperature sensors self ADC check + TEMPSENSORS_SELF_TEST_COMPLETE, ///< Temperature sensors self-test complete + NUM_OF_TEMPSENSORS_SELF_TEST_STATES ///< Total number of self-test states } TEMPSENSORS_SELF_TEST_STATES_T; /// Temperature sensor exec states. typedef enum tempSensors_Exec_States { - TEMPSENSORS_EXEC_STATE_START = 0, ///< Temperature sensors exec start - TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES, ///< Temperature sensors exec get ADC values - NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states + TEMPSENSORS_EXEC_STATE_START = 0, ///< Temperature sensors exec start + TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES, ///< Temperature sensors exec get ADC values + NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states } TEMPSENSORS_EXEC_STATES_T; /// Temperature sensor struct. typedef struct { - F32 gain; ///< ADC gain - F32 refResistance; ///< ADC reference resistance - F32 conversionCoeff; ///< ADC conversion coefficient - F32 zeroDegreeResistance; ///< ADC zero degree resistance - S32 rawADCReads[ MAX_NUM_OF_RAW_ADC_SAMPLES ]; ///< Raw ADC reads array - S32 adcNextIndex; ///< Next ADC read index - S32 adcRunningSum; ///< ADC running sum - U32 readCount; ///< Read counts from FPGA - OVERRIDE_F32_T temperatureValues; ///< Temperature values with override + F32 gain; ///< ADC gain + F32 refResistance; ///< ADC reference resistance + F32 conversionCoeff; ///< ADC conversion coefficient + F32 zeroDegreeResistance; ///< ADC zero degree resistance + S32 rawADCReads[ MAX_NUM_OF_RAW_ADC_SAMPLES ]; ///< Raw ADC reads array + S32 adcNextIndex; ///< Next ADC read index + S32 adcRunningSum; ///< ADC running sum + U32 readCount; ///< Read counts from FPGA + OVERRIDE_F32_T temperatureValues; ///< Temperature values with override } TEMP_SENSOR_T; // ********** private data ********** -static SELF_TEST_STATUS_T tempSensorsSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< Self-test result of the TemperatureSensors module. -static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState; ///< TemperatureSensor self-test state. -static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state. -static TEMP_SENSOR_T tempSensors [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors' data structure. -static U32 fpgaRawADCReadInterval = 0; ///< FPGA raw ADC read interval count. -static U32 elapsedTime = 0; ///< Elapsed time variable. -static U32 internalHeatersConversionTimer = 0; ///< Conversion timer variable to calculate the heaters internal temperature. +static SELF_TEST_STATUS_T tempSensorsSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< Self-test result of the TemperatureSensors module. +static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState; ///< TemperatureSensor self-test state. +static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state. +static TEMP_SENSOR_T tempSensors [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors' data structure. +static U32 fpgaRawADCReadInterval = 0; ///< FPGA raw ADC read interval count. +static U32 elapsedTime = 0; ///< Elapsed time variable. +static U32 internalHeatersConversionTimer = 0; ///< Conversion timer variable to calculate the heaters internal temperature. -static F32 tempValuesForPublication [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors data publication array. -static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter. +static F32 tempValuesForPublication [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors data publication array. +static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter. static OVERRIDE_U32_T tempSensorsPublishInterval = { TEMP_SENSORS_DATA_PUBLISH_INTERVAL, - TEMP_SENSORS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Temperature sensors publish time interval override. + TEMP_SENSORS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Temperature sensors publish time interval override. -static const F32 POSITIVE_TC_EXP_A0 = 0.118597600000E0; ///< K TC positive temperature exponent coefficient A0. -static const F32 POSITIVE_TC_EXP_A1 = -0.118343200000E-3; ///< K TC positive temperature exponent coefficient A1. -static const F32 POSITIVE_TC_EXP_A2 = 0.126968600000E3; ///< K TC positive temperature exponent coefficient A2. +static const F32 POSITIVE_TC_EXP_A0 = 0.118597600000E0; ///< K TC positive temperature exponent coefficient A0. +static const F32 POSITIVE_TC_EXP_A1 = -0.118343200000E-3; ///< K TC positive temperature exponent coefficient A1. +static const F32 POSITIVE_TC_EXP_A2 = 0.126968600000E3; ///< K TC positive temperature exponent coefficient A2. static const F32 POSITIVE_TC_COEFFS [ SIZE_OF_THERMOCOUPLE_COEFFICIENTS ] = { @@ -134,18 +133,18 @@ 0.318409457190E-9, -0.560728448890E-12, 0.560750590590E-15,-0.320207200030E-18, 0.971511471520E-22,-0.121047212750E-25 -}; ///< Thermocouple correction coefficients for positive cold junction temperature. +}; ///< Thermocouple correction coefficients for positive cold junction temperature. static const F32 POSITIVE_TC_INVERSER_COEFFS [ SIZE_OF_THERMOCOUPLE_COEFFICIENTS ] = { 0.0, 2.508355E1, 7.860106E-2, -2.503131E-1, 8.315270E-2, -1.228034E-2, 9.804036E-4, -4.413030E-5, 1.057734E-6, -1.052755E-8 -}; ///< Thermocouple inverse coefficient for positive cold junction temperature. +}; ///< Thermocouple inverse coefficient for positive cold junction temperature. -static const U32 TEMP_SENSORS_ADC_MAX_COUNT = ( 1 << TEMP_SENSORS_ADC_BITS ) - 1; ///< ADC 24 bit max count which is (2^24 - 1). -static const U32 TEMP_EQUATION_RESISTOR_CALC = 1 << ( TEMP_SENSORS_ADC_BITS - 1 ); ///< Temperature sensors resistor calculation (2^(24 - 1)). -static const F32 TEMP_EQUATION_COEFF_A = 3.9083E-3; ///< ADC to temperature conversion coefficient A. -static const F32 TEMP_EQUATION_COEFF_B = -5.775E-7; ///< ADC to temperature conversion coefficient B. +static const U32 TEMP_SENSORS_ADC_MAX_COUNT = ( 1 << TEMP_SENSORS_ADC_BITS ) - 1; ///< ADC 24 bit max count which is (2^24 - 1). +static const U32 TEMP_EQUATION_RESISTOR_CALC = 1 << ( TEMP_SENSORS_ADC_BITS - 1 ); ///< Temperature sensors resistor calculation (2^(24 - 1)). +static const F32 TEMP_EQUATION_COEFF_A = 3.9083E-3; ///< ADC to temperature conversion coefficient A. +static const F32 TEMP_EQUATION_COEFF_B = -5.775E-7; ///< ADC to temperature conversion coefficient B. // ********** private function prototypes ********** @@ -159,7 +158,7 @@ static void getHeaterInternalTemp( U32 TCIndex, U32 CJIndex ); static void processTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); -static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); +static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U16 adc, U32 fpgaError, U32 fpgaCount ); static BOOL isADCReadValid( U32 sensorIndex, U32 fpgaError, U32 fpgaCount ); static void processADCRead( U32 sensorIndex, S32 adc ); static void publishTemperatureSensorsData( void ); @@ -398,7 +397,7 @@ // R(RTD) = R(ref) * ( adc – 2^(N - 1) ) / ( G * 2^(N - 1) ); F32 resistance = ( refResistance * ( avgADC - TEMP_EQUATION_RESISTOR_CALC ) ) / ( gain * TEMP_EQUATION_RESISTOR_CALC ); // T = (-A + √( A^2 - 4B * ( 1 - R_T / R_0 ) ) ) / 2B - F32 secondSqrtPart = 4 * TEMP_EQUATION_COEFF_B * (1 - ( resistance / zeroDegResistance ) ); + F32 secondSqrtPart = 4 * TEMP_EQUATION_COEFF_B * ( 1 - ( resistance / zeroDegResistance ) ); temperature = ( -TEMP_EQUATION_COEFF_A + sqrt( pow( TEMP_EQUATION_COEFF_A, 2 ) - secondSqrtPart ) ) / ( 2 * TEMP_EQUATION_COEFF_B ); } else @@ -467,7 +466,7 @@ } // Check which heater's internal temperature is being calculated - if ( TCIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ) + if ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE == TCIndex ) { tempSensors[ TEMPSENSORS_PRIMARY_HEATER_INTERNAL ].temperatureValues.data = temperature; } @@ -495,7 +494,7 @@ { S32 convertedADC = (S32)( adc & MASK_OFF_U32_MSB ); - if ( isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) + if ( TRUE == isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) { processADCRead( sensorIndex, convertedADC ); } @@ -516,32 +515,12 @@ * @param fpgaCount reported read count by FPGA * @return none *************************************************************************/ -static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ) +static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U16 adc, U32 fpgaError, U32 fpgaCount ) { - U16 adcConv = 0; - S16 convertedADC = 0; - - if ( ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ) || ( sensorIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ) ) + if ( TRUE == isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) { - // Cast the adc from U32 to U16 and shift it to left by 2 - adcConv = ( (U16)adc ) << SHIFT_BITS_BY_2; - // Cast from U16 to S16 and shift the bits to right by 2 - // so if the sign bit is 1, the sign bit is extended - convertedADC = ( (S32)adcConv ) >> SHIFT_BITS_BY_2; + processADCRead( sensorIndex, (S32)adc ); } - else if ( ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ) || ( sensorIndex == TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ) ) - { - // Cast the adc from U32 to U16 and shift it by 4 - adcConv = ( (U16)adc ) << SHIFT_BITS_BY_4; - // Cast from U16 to S16 and shift the bits to right by 4 - // so if the sign bit is 1, the sign bit is extended - convertedADC = ( (S32)adcConv ) >> SHIFT_BITS_BY_4; - } - - if ( isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) - { - processADCRead( sensorIndex, (S32)convertedADC ); - } } /*********************************************************************//** @@ -578,8 +557,10 @@ } } - checkPersistentAlarm( ALARM_ID_TEMPERATURE_SENSORS_FAULT, !isFPGACountChanging || !isFPGAErrorZero, sensorIndex, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); + BOOL isThereAnError = !isFPGACountChanging || !isFPGAErrorZero; + checkPersistentAlarm( ALARM_ID_TEMPERATURE_SENSORS_FAULT, isThereAnError, sensorIndex, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); + return isADCValid; } Index: firmware/App/DGCommon.h =================================================================== diff -u -reaa0736c2dd4076caa6a90172d8f15cc11b18903 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/DGCommon.h (.../DGCommon.h) (revision eaa0736c2dd4076caa6a90172d8f15cc11b18903) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -46,11 +46,14 @@ // #define HEATERS_DEBUG 1 // #define PRESSURES_DEBUG 1 #define DISABLE_DIALYSATE_CHECK 1 + #define IGNORE_DRAIN_PUMP_MONITOR 1 + #define IGNORE_HEATERS_MONITOR 1 +// #define IGNORE_RO_PUMP_MONITOR 1 + #define IGNORE_HEAT_DISINFECT_RSRVR_TIMEOUT 1 #define DISABLE_RO_RATIO_CHECK 1 #define DISABLE_COND_SENSOR_CHECK 1 #define DISABLE_MIXING 1 #define DISABLE_WATER_QUALITY_CHECK 1 - #include #include #endif @@ -68,6 +71,20 @@ // **** Common Definitions **** +#pragma pack(push,1) +/// DG version struct. +typedef struct +{ + U08 major; ///< DG version major revision + U08 minor; ///< DG version major revision + U08 micro; ///< DG version micro revision + U16 build; ///< DG build version + U08 fpgaId; ///< DG FPGA ID + U08 fpgaMajor; ///< DG FPGA major revision + U08 fpgaMinor; ///< DG FPGA minor revision + U08 fpgaLab; ///< DG FPGA lab revision +} DG_VERSIONS_T; +#pragma pack(pop) // **** Common Macros **** Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -ra1b8dbb69c4bd2f0cc22e62bede7015c9307d378 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision a1b8dbb69c4bd2f0cc22e62bede7015c9307d378) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -34,7 +34,7 @@ // ********** private definitions ********** #define TARGET_DRAIN_PUMP_RPM 1800 ///< Target drain pump speed (in RPM). -#define DRAIN_WEIGH_UNCHANGE_TIMEOUT ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. +#define DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. #define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. #define TARGET_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. @@ -125,7 +125,7 @@ DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); // if we have reached our target drain to volume (by weight) or cannot drain anymore, we are done draining - go back to re-circ mode - if ( hasTargetDrainVolumeBeenReached( inactiveReservoir, DRAIN_WEIGH_UNCHANGE_TIMEOUT ) ) + if ( hasTargetDrainVolumeBeenReached( inactiveReservoir, DRAIN_WEIGHT_UNCHANGE_TIMEOUT ) ) { setDrainPumpTargetRPM( 0 ); requestNewOperationMode( DG_MODE_CIRC ); Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -30,6 +30,7 @@ #include "TaskGeneral.h" #include "TemperatureSensors.h" #include "Timers.h" +#include "UVReactors.h" #include "Valves.h" /** @@ -91,9 +92,12 @@ signalDrainPumpHardStop(); startPrimaryHeater(); - requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1 ); - requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2 ); + requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2_BICARB ); + // UV on + turnOnUVReactor( INLET_UV_REACTOR ); + turnOnUVReactor( OUTLET_UV_REACTOR ); #ifndef _VECTORCAST_ { // TODO - test code to start the fan since we're turning the heater on @@ -139,7 +143,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, recircState ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_RECIRC_MODE_INVALID_EXEC_STATE, recircState ) recircState = DG_RECIRCULATE_MODE_STATE_START; break; } Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r9dbab48958c9f85f212538b04eaa4582dbcc7c46 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 9dbab48958c9f85f212538b04eaa4582dbcc7c46) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -115,9 +115,6 @@ // UV off turnOffUVReactor( INLET_UV_REACTOR ); turnOffUVReactor( OUTLET_UV_REACTOR ); - - resetReservoirLoadCellsOffset( DG_RESERVOIR_1 ); - resetReservoirLoadCellsOffset( DG_RESERVOIR_2 ); } /*********************************************************************//** @@ -362,6 +359,29 @@ /*********************************************************************//** * @brief + * The startDGHeatDisinfect function starts heat disinfect mode. + * @details Inputs: standbyState + * @details Outputs: none + * @return: TRUE if the switch was successful + *************************************************************************/ +BOOL startDGHeatDisinfect( void ) +{ + BOOL status = FALSE; + + // If DG is in standby mode and the standby mode is in Idle state or if DG is in solo mode, request DG heat disinfect + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) || + ( DG_MODE_SOLO == getCurrentOperationMode() ) ) + { + requestNewOperationMode( DG_MODE_HEAT ); + + status = TRUE; + } + + return status; +} + +/*********************************************************************//** + * @brief * The getCurrentStandbyState function returns the current state of standby mode. * @details Inputs: standbyState * @details Outputs: none Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -r5fc16235c1752c993b3f1285f3a2b9738372af7a -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 5fc16235c1752c993b3f1285f3a2b9738372af7a) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -39,7 +39,7 @@ DG_STANDBY_MODE_STATE_T getCurrentStandbyState( void ); // get the current state of the standby mode. -BOOL requestWaterSample( void ); // HD requests water sample +void waterSampleCommandHandler( SAMPLE_WATER_CMD_T sampleWaterCmd ); BOOL requestDGStart( void ); // HD requests DG start (go to re-circulate mode) BOOL startDGHeatDisinfect( void ); // HD start heat disinfect mode Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -rc20d71064bad67c2db392c6383bb410e8a7dfa2a -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision c20d71064bad67c2db392c6383bb410e8a7dfa2a) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -39,7 +39,7 @@ // ********** private definitions ********** -#define BROADCAST_DG_OP_MODE_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the operation mode is published on the CAN bus. +#define BROADCAST_DG_OP_MODE_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the operation mode is published on the CAN bus. // ********** private data ********** @@ -126,7 +126,7 @@ // is requested new mode valid and legal at this time? if ( newMode >= DG_MODE_NLEG ) { - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_ILLEGAL_MODE_TRANSITION_REQUESTED, (U32)newMode ) newMode = currentMode; } @@ -186,7 +186,7 @@ break; default: - // TODO - trigger s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, (U32)currentMode ) currentMode = DG_MODE_FAUL; currentSubMode = 0; break; @@ -214,7 +214,7 @@ } else { // invalid mode requested - // TODO - trigger s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_REQUESTED, (U32)newMode ) } } @@ -316,7 +316,7 @@ transitionToChemicalDisinfectMode(); break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, (U32)newMode ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, (U32)newMode ) break; } } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rf1427d97d99c4b5916f3b11a06798ec10acefea3 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision f1427d97d99c4b5916f3b11a06798ec10acefea3) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -49,17 +49,17 @@ *************************************************************************/ void initAlarmMgmt( void ) { - ALARM_ID_T a; + ALARM_ID_T alrm; // initialize alarm states and start time stamps - for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) + for ( alrm = ALARM_ID_NO_ALARM; alrm < NUM_OF_ALARM_IDS; alrm++ ) { - alarmIsActive[ a ].data = FALSE; - alarmIsActive[ a ].ovData = FALSE; - alarmIsActive[ a ].ovInitData = TRUE; - alarmIsActive[ a ].override = OVERRIDE_RESET; + alarmIsActive[ alrm ].data = FALSE; + alarmIsActive[ alrm ].ovData = FALSE; + alarmIsActive[ alrm ].ovInitData = TRUE; + alarmIsActive[ alrm ].override = OVERRIDE_RESET; - alarmConditionIsActive[ a ] = FALSE; + alarmConditionIsActive[ alrm ] = FALSE; } } Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision ab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -164,6 +164,8 @@ SW_FAULT_ID_INVALID_TEMPERATURE_SENSOR_SELECTED, SW_FAULT_ID_DRAIN_PUMP_INVALID_RPM_SELECTED, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, + SW_FAULT_ID_HEAT_DISINFECT_INVALID_EXEC_STATE, // 75 + SW_FAULT_ID_INVALID_DG_RESERVOIR_SELECTED, SW_FAULT_ID_STANDBY_MODE_INVALID_EXEC_STATE, // 75 SW_FAULT_ID_RECIRC_MODE_INVALID_EXEC_STATE, SW_FAULT_ID_DRAIN_MODE_INVALID_EXEC_STATE, Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r28db3416e8183d1dfdbb047e269624a18d847a29 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 28db3416e8183d1dfdbb047e269624a18d847a29) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -8,8 +8,8 @@ * * @file FPGA.c * -* @author (last) Quang Nguyen -* @date (last) 18-Sep-2020 +* @author (last) Peman Montazemi +* @date (last) 09-Mar-2021 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -76,14 +76,16 @@ #define DRAIN_PUMP_DAC_SHIFT_BITS 4 ///< Drain pump DAC shift bits. +#define FPGA_FLUIDLEAK_STATE_MASK 0x0004 ///< Bit mask for fluid leak detector. + // FPGA header struct. #pragma pack(push,1) typedef struct { U08 fpgaId; ///< Reg 0. FPGA ID code. Checked against expected value at power up to verify basic FPGA communication and operation - U08 fpgaRev; ///< Reg 1. FPGA revision being reported - U08 fpgaRevLab; ///< Reg 2. FPGA lab rev number - U08 fpgaRevMajor; ///< Reg 3. FPGA minor rev number + U08 fpgaRevMinor; ///< Reg 1. FPGA revision (minor) being reported + U08 fpgaRevMajor; ///< Reg 2. FPGA revision (major) being reported + U08 fpgaRevLab; ///< Reg 3. FPGA revision (lab) being reported } FPGA_HEADER_T; // read only on FPGA /// FPGA sensors' readings struct. @@ -166,7 +168,7 @@ U16 fpgaCP1HallSense; ///< Reg 388. Concentrate pump CP1 hall sensor pulse width. U16 fpgaCP2HallSense; ///< Reg 390. Concentrate pump CP2 hall sensor pulse width. - U08 fpgaGPIOReg; ///< Reg 392. FGPA GPIO register + U08 fpgaGPIO; ///< Reg 392. FGPA GPIO register U08 fpgaDummyByte2Addr; ///< Reg 393. Dummy byte address to maintain an even addressing scheme U16 fpgaADCTemp; ///< Reg 394. Internal FPGA die temperature ADC @@ -1037,8 +1039,8 @@ void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ) { *Id = fpgaHeader.fpgaId; - *Maj = fpgaHeader.fpgaRev; - *Min = fpgaHeader.fpgaRevMajor; + *Maj = fpgaHeader.fpgaRevMajor; + *Min = fpgaHeader.fpgaRevMinor; *Lab = fpgaHeader.fpgaRevLab; } @@ -1784,5 +1786,19 @@ return fpgaSensorReadings.fpgaADC2ErrorCnt; } -/**@}*/ +/*********************************************************************//** + * @brief + * The noFluidLeakDetected function returns TRUE if no fluid leak has been + * detected (dry) and FALSE if a fluid leak has been detected (wet). + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return noFluidLeakDetected + *************************************************************************/ +BOOL noFPGAFluidLeakDetected( void ) +{ + U16 noFluidLeakDetected = fpgaSensorReadings.fpgaGPIO & FPGA_FLUIDLEAK_STATE_MASK; + return ( 0 == noFluidLeakDetected ? FALSE : TRUE ); +} + +/**@}*/ Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -ra1b8dbb69c4bd2f0cc22e62bede7015c9307d378 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a1b8dbb69c4bd2f0cc22e62bede7015c9307d378) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -38,7 +38,7 @@ #define DEFAULT_FILL_VOLUME_ML 1700 ///< Default fill volume for treatment in mL. #define DISINFECT_FILL_VOLUME_ML 2400 ///< Fill volume for disinfection in mL. #define MAX_FILL_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///< Maximum fill volume in mL. -#define DEFAULT_DRAIN_VOLUME_ML 100 ///< Default drain volume in mL. +#define DEFAULT_DRAIN_VOLUME_ML 0 ///< Default drain volume in mL. #define MAX_DRAIN_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///< Maximum drain volume in mL. #define MAX_RESERVOIR_WEIGHT 10000 ///< Maximum reservoir weight in grams. @@ -79,7 +79,6 @@ void initReservoirs( void ) { activeReservoir.data = (U32)DG_RESERVOIR_1; - fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; } @@ -344,10 +343,36 @@ } sendCommandResponseMsg( &cmdResponse ); -} +} /*********************************************************************//** * @brief + * The tareReservoir function sets the tare load cell variable to TRUE. + * @details Inputs: none + * @details Outputs: none + * @return none + *************************************************************************/ +void tareReservoir( void ) +{ + tareLoadCellRequest = TRUE; +} + +/*********************************************************************//** + * @brief + * The resetReservoirsLowestWeight function resets the lowest load cell + * weight of the reservoirs. + * @details Inputs: reservoirLowestWeight + * @details Outputs: reservoirLowestWeight + * @return none + *************************************************************************/ +void resetReservoirsLowestWeight( void ) +{ + reservoirLowestWeight[ DG_RESERVOIR_1 ] = MAX_RESERVOIR_WEIGHT; + reservoirLowestWeight[ DG_RESERVOIR_2 ] = MAX_RESERVOIR_WEIGHT; +} + +/*********************************************************************//** + * @brief * The getInactiveReservoir function gets the inactive reservoir. * @details Inputs: activeReservoir * @details Outputs: none @@ -410,7 +435,21 @@ BOOL hasTargetDrainVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId, U32 timeout ) { BOOL result = FALSE; - F32 const loadcellWeight = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); + + F32 loadcellWeight = 0.0; + + // TODO remove this code once the load cell is repaired + if ( DG_RESERVOIR_1 == reservoirId ) + { + loadcellWeight = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ); + } + else + { + loadcellWeight = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); + } + // TODO remove the above code the load cell is repaired + + //F32 const loadcellWeight = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); U32 const targetDrainVolume = getReservoirDrainVolumeTargetMl(); if ( loadcellWeight < reservoirLowestWeight[ reservoirId ] ) @@ -440,21 +479,6 @@ /*********************************************************************//** * @brief - * The resetReservoirLoadCellsOffset function sets the reservoir's load cells - * offset to zero. - * @details Inputs: associateLoadCell[], redundantLoadCell[] - * @details Outputs: reset reservoir's associate load cells auto calibration offset - * @param reservoirId reservoir id - * @return none - *************************************************************************/ -void resetReservoirLoadCellsOffset( DG_RESERVOIR_ID_T reservoirId ) -{ - resetLoadCellOffset( associatedLoadCell[ reservoirId ] ); - resetLoadCellOffset( redundantLoadCell[ reservoirId ] ); -} - -/*********************************************************************//** - * @brief * The getActiveReservoir function gets the active reservoir. * @details Inputs: activeReservoir * @details Outputs: none Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -ref85c4f5bd363adfd405faf3b91910363d8030f1 -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision ef85c4f5bd363adfd405faf3b91910363d8030f1) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -55,6 +55,14 @@ U32 rejectCode; ///< Reason code for rejecting the command } DG_CMD_RESPONSE_T; +/// Reservoir data struct. +typedef struct +{ + U32 activeReservoir; ///< Active reservoir ID + U32 fillToVolumeMl; ///< Volume target to fill to + U32 drainToVolumeMl; ///< Volume target to drain to +} RESERVOIR_DATA_T; + #pragma pack(pop) // ********** public function prototypes ********** @@ -67,15 +75,17 @@ void startFillCmd( U32 fillToVolMl ); // handle fill command from HD void stopFillCmd( void ); // handle stop fill command from HD void startDrainCmd( DRAIN_CMD_T drainCmd ); // handle drain command from HD -void stopDrainCmd( void ); // handle stop drain command from HD +void stopDrainCmd( void ); // handle stop drain command from HD + +void tareReservoir( void ); + +void resetReservoirsLowestWeight( void ); DG_RESERVOIR_ID_T getInactiveReservoir( void ); F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId ); BOOL hasTargetFillVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId ); BOOL hasTargetDrainVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId , U32 timeout ); - -void resetReservoirLoadCellsOffset( DG_RESERVOIR_ID_T reservoirId ); BOOL testSetDGActiveReservoirOverride( DG_RESERVOIR_ID_T value ); BOOL testResetDGActiveReservoirOverride( void ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -37,11 +37,11 @@ // ********** private definitions ********** #define NUM_OF_CAN_OUT_BUFFERS 5 ///< Number of CAN buffers for transmit -#define NUM_OF_CAN_IN_BUFFERS 6 ///< Number of CAN buffers for receiving +#define NUM_OF_CAN_IN_BUFFERS 7 ///< Number of CAN buffers for receiving #ifndef DEBUG_ENABLED - #define NUM_OF_MSG_IN_BUFFERS 6 ///< Number of Msg buffers for receiving + #define NUM_OF_MSG_IN_BUFFERS 7 ///< Number of Msg buffers for receiving #else - #define NUM_OF_MSG_IN_BUFFERS 7 + #define NUM_OF_MSG_IN_BUFFERS 8 #define SCI1_RECEIVE_DMA_REQUEST 30 #define SCI1_TRANSMIT_DMA_REQUEST 31 #endif @@ -81,9 +81,9 @@ { COMM_BUFFER_OUT_CAN_DG_ALARM, COMM_BUFFER_OUT_CAN_DG_2_HD, + COMM_BUFFER_OUT_CAN_DG_2_UI, COMM_BUFFER_OUT_CAN_DG_BROADCAST, - COMM_BUFFER_OUT_CAN_PC, - COMM_BUFFER_OUT_CAN_DG_2_UI + COMM_BUFFER_OUT_CAN_PC }; /// Array of in-coming CAN buffers. @@ -93,6 +93,7 @@ COMM_BUFFER_IN_CAN_UI_ALARM, COMM_BUFFER_IN_CAN_HD_2_DG, COMM_BUFFER_IN_CAN_HD_BROADCAST, + COMM_BUFFER_IN_CAN_UI_2_DG, COMM_BUFFER_IN_CAN_UI_BROADCAST, COMM_BUFFER_IN_CAN_PC, #ifdef DEBUG_ENABLED @@ -999,6 +1000,10 @@ handlePowerOffWarning( message ); break; + case MSG_ID_ALARM_CLEARED: + handleAlarmClear( message ); + break; + case MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS: handleSetDialysateTemperatureCmd( message ); break; @@ -1209,6 +1214,46 @@ handleTestUVReactorsHealthOverride( message ); break; + case MSG_ID_DG_SET_CALIBRATION_RECORD: + handleSetDGCalibrationRecord( message ); + break; + + case MSG_ID_DG_GET_CALIBRATION_RECORD: + handleGetDGCalibrationRecord( message ); + break; + + case MSG_ID_DG_SET_SYSTEM_RECORD: + handleSetDGSystemRecord( message ); + break; + + case MSG_ID_DG_GET_SYSTEM_RECORD: + handleGetDGSystemRecord( message ); + break; + + case MSG_ID_DG_GET_SERVICE_RECORD: + handleGetDGServiceRecord( message ); + break; + + case MSG_ID_DG_SET_SERVICE_RECORD: + handleSetDGServiceRecord( message ); + break; + + case MSG_ID_DG_GET_SCHEDULED_RUNS_RECORD: + handleGetDGScheduledRunsRecord( message ); + break; + + case MSG_ID_DG_SET_SCHEDULED_RUNS_RECORD: + handleSetDGScheduledRunsRecord( message ); + break; + + case MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE: + handleSetFluidLeakBroadcastIntervalOverrideRequest( message ); + break; + + case MSG_ID_DG_FLUID_LEAK_STATE_DETECTOR_OVERRIDE: + handleSetFluidLeakStateDetectorOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ab447ebbc380f4c7abc2ae283042a5d0c9e1b9cb) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -26,7 +26,6 @@ #include "FPGA.h" #include "Heaters.h" #include "LoadCell.h" -#include "MessagePayloads.h" #include "ModeStandby.h" #include "ModeRecirculate.h" #include "MsgQueues.h" @@ -42,7 +41,6 @@ #include "TemperatureSensors.h" #include "Thermistors.h" #include "Utilities.h" -#include "Utilities.h" #include "Valves.h" #include "WatchdogMgmt.h" #include "UVReactors.h" @@ -448,31 +446,24 @@ /*********************************************************************//** * @brief * The broadcastHeatersData function sends out DG heaters data - * @details Inputs: heaters data - * @details Outputs: heatears data msg constructed and queued - * @param mainPrimaryDC main primary heater duty cycle - * @param smallPrimaryDC small primary heater duty cycle - * @param trimmerDC trimmer heater duty cycle + * @details Inputs: none + * @details Outputs: heaters data msg constructed and queued + * @param heatersData which is the heaters data structure pointer * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastHeatersData ( U32 mainPrimaryDC, U32 smallPrimaryDC, U32 trimmerDC ) +BOOL broadcastHeatersData ( HEATERS_DATA_T *heatersData ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - HEATERS_DATA_T payload; - + // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DG_HEATERS_DATA; msg.hdr.payloadLen = sizeof( HEATERS_DATA_T ); - payload.mainPrimayHeaterDC = mainPrimaryDC; - payload.smallPrimaryHeaterDC = smallPrimaryDC; - payload.trimmerHeaterDC = trimmerDC; + memcpy( payloadPtr, heatersData, sizeof( HEATERS_DATA_T ) ); - memcpy( payloadPtr, &payload, sizeof( HEATERS_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_DG_BROADCAST, ACK_NOT_REQUIRED ); @@ -903,6 +894,34 @@ /*********************************************************************//** * @brief + * The broadcastHeatDisinfectData function sends out the heat disinfect + * mode data. + * @details Inputs: none + * @details Outputs: heat disinfect data msg constructed and queued + * @param heatDisinfectData which is heat disinfect msg constructed and queued + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastHeatDisinfectData( MODE_HEAT_DISINFECT_DATA_T *heatDisinfectData ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_HEAT_DISINFECT_DATA; + msg.hdr.payloadLen = sizeof( MODE_HEAT_DISINFECT_DATA_T ); + + memcpy( payloadPtr, heatDisinfectData, sizeof( MODE_HEAT_DISINFECT_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_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The broadcastFilterFlushData function sends out the filter flush progress data. * @details Inputs: none * @details Outputs: filter flush data msg constructed and queued @@ -2703,7 +2722,7 @@ /*********************************************************************//** * @brief * The handleROPumpTargetPressureOverride function handles a request -* to override the target RO pump pressure. +* to override the RO pump target pressure. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle @@ -2728,6 +2747,40 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/************************************************************************* + * @brief + * The handleStartStopDGHeatDisinfect function handles a request start or + * stop DG heat disifect cycle. + * @details Inputs: none + * @details Outputs: message handled + * @param message: a pointer to the message to handle + * @return result + *************************************************************************/ +BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ) +{ + BOOL status = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + BOOL startingDGHeatDisinfect; + + memcpy( &startingDGHeatDisinfect, message->payload, sizeof(U32) ); + + if ( TRUE == startingDGHeatDisinfect ) + { + status = startDGHeatDisinfect(); + } + else + { + status = stopDGHeatDisinfect(); + } + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, status ); + + return status; +} + /*********************************************************************//** * @brief * The handleSetDGCalibrationRecord function handles a request to set the DG Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) @@ -21,9 +21,11 @@ #include "DGCommon.h" #include "DrainPump.h" #include "Fans.h" +#include "FluidLeak.h" #include "Heaters.h" #include "ModeHeatDisinfect.h" #include "MsgQueues.h" +#include "NVDataMgmt.h" #include "Reservoirs.h" #include "ROPump.h" #include "Thermistors.h" @@ -101,12 +103,21 @@ // MSG_ID_DG_UV_REACTORS_DATA BOOL broadcastUVReactorsData( UV_REACTORS_DATA_T *uvReactorsData ); +// MSG_ID_DG_FILTER_FLUSH_PROGRESS +BOOL broadcastFilterFlushData( U32 timeout, U32 countdown ); + +// MSG_ID_DG_FLUID_LEAK_STATE +BOOL broadcastFluidLeakState( FLUID_LEAK_STATES_T state); + // MSG_ID_DG_COMMAND_RESPONSE void sendCommandResponseMsg( DG_CMD_RESPONSE_T *cmdResponsePtr ); // MSG_ID_POWER_OFF_WARNING void handlePowerOffWarning( MESSAGE_T *message ); +// MSG_ID_ALARM_CLEARED +void handleAlarmClear( MESSAGE_T *message ); + // MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS void handleSetDialysateTemperatureCmd( MESSAGE_T *message ); @@ -143,6 +154,18 @@ // MSG_ID_DG_HEAT_DISINFECT_DATA BOOL broadcastHeatDisinfectData( MODE_HEAT_DISINFECT_DATA_T *heatDisinfectData ); +// MSG_ID_DG_SEND_CALIBRATION_DATA +BOOL sendDGCalibrationRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* calRcrdAddress ); + +// MSG_ID_DG_SEND_SYSTEM_RECORD +BOOL sendDGSystemRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* sysRcrdAddress ); + +// MSG_ID_DG_SEND_SERVICE_RECORD +BOOL sendDGServiceRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* srvcRcrdAddress ); + +// MSG_ID_DG_SEND_SCHEDULED_RUNS_RECORD +BOOL sendDGScheduledRunsRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* scheduledRcrdAddress ); + // *********** public test support message functions ********** #ifdef DEBUG_ENABLED @@ -226,15 +249,18 @@ // MSG_ID_DG_ACCEL_SEND_INTERVAL_OVERRIDE: void handleTestDGAccelBroadcastIntervalOverrideRequest( MESSAGE_T *message ); -// MSG_ID_DG_ACCEL_SET_CALIBRATION: -void handleSetAccelCalibration( MESSAGE_T *message ); - // MSG_ID_DG_START_STOP_INLET_UV_REACTOR void handleStartStopUVReactors( MESSAGE_T *message ); -//MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE +// MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE void handleTestUVReactorsDataPublishIntervalOverride( MESSAGE_T *message ); +// MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE +void handleSetFluidLeakBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_FLUID_LEAK_STATE_DETECTOR_OVERRIDE +void handleSetFluidLeakStateDetectorOverrideRequest( MESSAGE_T *message); + // MSG_ID_DG_SOFTWARE_RESET_REQUEST void handleDGSoftwareResetRequest( MESSAGE_T *message); @@ -277,6 +303,30 @@ // MSG_ID_DG_START_STOP_HEAT_DISINFECT BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ); +// MSG_ID_DG_SET_CALIBRATION_DATA +void handleSetDGCalibrationRecord( MESSAGE_T *message ); + +// MSG_ID_DG_GET_CALIBRATION_RECORD +void handleGetDGCalibrationRecord( MESSAGE_T *message ); + +// MSG_ID_DG_SET_SYSTEM_DATA +void handleSetDGSystemRecord( MESSAGE_T *message ); + +// MSG_ID_DG_GET_SYSTEM_DATA +void handleGetDGSystemRecord( MESSAGE_T *message ); + +// MSG_ID_DG_GET_SERVICE_RECORD +void handleGetDGServiceRecord( MESSAGE_T *message ); + +// MSG_ID_DG_SET_SERVICE_RECORD +void handleSetDGServiceRecord( MESSAGE_T *message ); + +// MSG_ID_DG_GET_SCHEDULED_RUNS_RECORD +void handleGetDGScheduledRunsRecord( MESSAGE_T *message ); + +// MSG_ID_DG_SET_SCHEDULED_RUNS_RECORD +void handleSetDGScheduledRunsRecord( MESSAGE_T *message ); + /**@}*/ #endif