Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -55,6 +55,7 @@ #define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 500 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. + #define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. #define CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for concentrate pump speed control error. Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -rad6b3443575d3f6bbac52237866e19a212d36bc1 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision ad6b3443575d3f6bbac52237866e19a212d36bc1) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -56,6 +56,7 @@ #define MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ( 60 * MS_PER_SECOND ) ///< Conductivity sensor error window. #define RO_REJECTION_RATIO_OUT_OF_RANGE_VALUE 1.0F ///< Out of range value for RO rejection ratio when CPi conductivity is zero. + #define MAX_RO_REJECTION_RATIO_ALLOW 0.10F ///< Maximum RO rejection ratio. #define MAX_CPO_CONDUCTIVITY_ALLOW 30.0F ///< Maximum CPo sensor conductivity value. @@ -278,11 +279,9 @@ /*********************************************************************//** * @brief * The checkInletWaterConductivity function checks inlet water conductivity value - * and triggers an alarm when conductivity value is not within the specified - * values. + * and triggers an alarm when conductivity value is out of allowed range. * @details Inputs: CPi sensor conductivity - * @details Outputs: Trigger warning alarm if conductivity is in the warning - * range. Trigger alarm if conductivity is below minimum conductivity. + * @details Outputs: Trigger alarms when conductivity is out of allowed range * @return none *************************************************************************/ void checkInletWaterConductivity( void ) Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rad6b3443575d3f6bbac52237866e19a212d36bc1 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ad6b3443575d3f6bbac52237866e19a212d36bc1) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -31,7 +31,6 @@ #include "OperationModes.h" #include "PersistentAlarm.h" #include "Reservoirs.h" -#include "ROPump.h" #include "SafetyShutdown.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -176,6 +175,7 @@ if( heater < NUM_OF_DG_HEATERS ) { +#ifndef DISABLE_HEATERS_AND_TEMPS // Assume the target temperature has not changed heatersStatus[ heater ].hasTargetTempChanged = FALSE; @@ -186,6 +186,7 @@ heatersStatus[ heater ].hasTargetTempChanged = TRUE; result = TRUE; } +#endif } else { @@ -219,6 +220,7 @@ { BOOL status = FALSE; + if( heater < NUM_OF_DG_HEATERS ) { if ( HEATER_EXEC_STATE_OFF == heatersStatus[ heater ].state ) Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r56f14d709de1a3de6a3a450e994d59b7e434e638 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 56f14d709de1a3de6a3a450e994d59b7e434e638) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -97,7 +97,7 @@ * @details Outputs: LoadCell module initialized. * @return none *************************************************************************/ - void initLoadCell( void ) +void initLoadCell( void ) { U32 i; U32 j; Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r44f739bf3e9dfe0bfb5910a6a32fc4c5b1533af3 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 44f739bf3e9dfe0bfb5910a6a32fc4c5b1533af3) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -22,7 +22,7 @@ /** * @defgroup ROPump ROPump - * @brief RO Pump monitor and controller module. Controls and monitors the RO pump. + * @brief RO Pump monitor and controller module. Controls and monitors the RO pump and the flow meter. * The flow meter is manufactured by SwissFlow, PN: 82015311. * The diaphragm (RO) pump is manufactured by Aquatec, PN: 5889-2MM1-V724DY. * Index: firmware/App/Controllers/Switches.c =================================================================== diff -u -re6c4c61c793a91f9ed9dfe969e01bdeee565347d -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/Switches.c (.../Switches.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) +++ firmware/App/Controllers/Switches.c (.../Switches.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -93,11 +93,11 @@ switch ( i ) { case CONCENTRATE_CAP: - currentSwitchStatus = ( getFPGAConcentrateCapStatus() != 0 ? STATE_OPEN : STATE_CLOSED ); + currentSwitchStatus = getFPGAConcentrateCapStatus(); break; case DIALYSATE_CAP: - currentSwitchStatus = ( getFPGADialysateCapStatus() != 0 ? STATE_OPEN : STATE_CLOSED ); + currentSwitchStatus = getFPGADialysateCapStatus(); break; #ifndef _VECTORCAST_ Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -rad6b3443575d3f6bbac52237866e19a212d36bc1 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision ad6b3443575d3f6bbac52237866e19a212d36bc1) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -466,14 +466,33 @@ // the electrical connection of THd sensor. if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) { - if ( ( TEMPSENSORS_HEAT_DISINFECT == sensorIndex ) || ( TEMPSENSORS_INTERNAL_THD_RTD == sensorIndex ) ) + if ( TEMPSENSORS_HEAT_DISINFECT == sensorIndex ) { - temperature = getF32OverrideValue( &tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].temperatureValues ); + if ( OVERRIDE_KEY == tempSensors[ TEMPSENSORS_HEAT_DISINFECT ].temperatureValues.override ) + { + temperature = getF32OverrideValue( &tempSensors[ TEMPSENSORS_HEAT_DISINFECT ].temperatureValues ); + } + else + { + temperature = getF32OverrideValue( &tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].temperatureValues ); + } } + if ( TEMPSENSORS_INTERNAL_THD_RTD == sensorIndex ) + { + temperature = 40.0F; + } + if ( TEMPSENSORS_OUTLET_REDUNDANT == sensorIndex ) { - temperature = getF32OverrideValue( &tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].temperatureValues ); + if ( OVERRIDE_KEY == tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].temperatureValues.override ) + { + temperature = getF32OverrideValue( &tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].temperatureValues ); + } + else + { + temperature = getF32OverrideValue( &tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].temperatureValues ); + } } } #endif Index: firmware/App/DGCommon.h =================================================================== diff -u -rad6b3443575d3f6bbac52237866e19a212d36bc1 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/DGCommon.h (.../DGCommon.h) (revision ad6b3443575d3f6bbac52237866e19a212d36bc1) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -25,7 +25,7 @@ #define DG_VERSION_MAJOR 0 #define DG_VERSION_MINOR 6 #define DG_VERSION_MICRO 0 -#define DG_VERSION_BUILD 33 +#define DG_VERSION_BUILD 240 // ********** build switches ********** Index: firmware/App/Drivers/CPLD.c =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -20,15 +20,18 @@ #include "het.h" #include "WatchdogMgmt.h" -#include "CPLD.h" +#include "CPLD.h" +#include "SystemComm.h" +#include "SystemCommMessages.h" +#include "TaskPriority.h" /** * @addtogroup CPLD * @{ */ // ********** private definitions ********** - + #define WD_PET_GIO_PORT_PIN 1U ///< Watchdog pet GPIO pin number. #define WD_EXP_GIO_PORT_PIN 0U ///< Watchdog expired GPIO pin number. @@ -56,6 +59,14 @@ #define SET_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_HIGH ) ///< Set watchdog GPIO macro. #define CLR_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_LOW ) ///< Clear watchdog GPIO macro. +// ********** private data ********** + +CPLD_STATUS_T cpldStatus = { 0, 0, 0, CPLD_CLEAN_LED_OFF }; + +// ********** private function prototypes ********** + +static void broadcastCPLDStatus( void ); + /*********************************************************************//** * @brief * The initCPLD function initializes the CPLD module. @@ -64,14 +75,19 @@ * @return none *************************************************************************/ void initCPLD( void ) -{ +{ // initialize watchdog pet output low (inactive) CLR_WD_PET(); // initialize alarm lamp color LED outputs low (off) CLR_CLEAN_LED(); CLR_FAULT_LED(); CLR_AUDIO_ALARM(); + + cpldStatus.wdog = getCPLDWatchdogExpired(); + cpldStatus.clean_led = CPLD_CLEAN_LED_OFF; + cpldStatus.fault_led = 0; + cpldStatus.audio = 0; } /*********************************************************************//** @@ -133,8 +149,11 @@ default: CLR_CLEAN_LED(); SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_LED_COLOR_SELECTED, color ) + color = CPLD_CLEAN_LED_OFF; break; } + cpldStatus.clean_led = color; + broadcastCPLDStatus(); } /*********************************************************************//** @@ -143,9 +162,10 @@ * @details Inputs: none * @details Outputs: alarm LED signal set to given level. * @param level LOW or HIGH + * @param fault BOOL * @return none *************************************************************************/ -void setCPLDFaultLED( PIN_SIGNAL_STATE_T level ) +void setCPLDFaultLED( PIN_SIGNAL_STATE_T level, BOOL fault ) { if ( level == PIN_SIGNAL_HIGH ) { @@ -155,6 +175,9 @@ { CLR_FAULT_LED(); } + + cpldStatus.fault_led = fault; // Use fault for LED State because it flashes + broadcastCPLDStatus(); } /*********************************************************************//** @@ -175,6 +198,39 @@ { CLR_AUDIO_ALARM(); } + cpldStatus.audio = level; + broadcastCPLDStatus(); } +/*********************************************************************//** + * @brief + * The getCPLDStatus function gets the CPLD Status. + * @details Inputs: none + * @details Outputs: none. + * @param status struct pointer + * @return updated status pointer + *************************************************************************/ +void getCPLDStatus( CPLD_STATUS_T *status ) +{ + // Watchdog status needs to be read. Others are updated on change. + cpldStatus.wdog = getCPLDWatchdogExpired(); + status->wdog = cpldStatus.wdog; + status->audio = cpldStatus.audio; + status->clean_led = cpldStatus.clean_led; + status->fault_led = cpldStatus.fault_led; +} + +/*********************************************************************//** + * @brief + * The broadcastCPLDStatus function broadcasts the CPLD Status. + * @details Inputs: cpldStatus + * @details Outputs: none + * @return none + *************************************************************************/ +static void broadcastCPLDStatus( void ) +{ + getCPLDStatus( &cpldStatus ); + broadcastData( MSG_ID_DG_CPLD_STATUS, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&cpldStatus, sizeof( CPLD_STATUS_T ) ); +} + /**@}*/ Index: firmware/App/Drivers/CPLD.h =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Drivers/CPLD.h (.../CPLD.h) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Drivers/CPLD.h (.../CPLD.h) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -41,6 +41,14 @@ CPLD_CLEAN_LED_BLUE, ///< Blue NUM_OF_CPLD_CLEAN_LED_COLORS ///< Number of CPLD Clean LED colors } CPLD_CLEAN_LED_COLORS_T; + +typedef struct +{ + U08 wdog; ///< Watchdog status (Expired True or False) + U08 audio; ///< Audio Alarm status (On / Off) + U08 fault_led; ///< Fault LED (On / Off) + U08 clean_led; ///< Clean / Disinfect LED (CPLD_CLEAN_LED_COLORS_T) +} CPLD_STATUS_T; // ********** public function prototypes ********** @@ -50,8 +58,9 @@ PIN_SIGNAL_STATE_T getCPLDWatchdogExpired( void ); void setCPLDCleanLEDColor( CPLD_CLEAN_LED_COLORS_T color ); -void setCPLDFaultLED( PIN_SIGNAL_STATE_T level ); +void setCPLDFaultLED( PIN_SIGNAL_STATE_T level, BOOL fault ); void setCPLDFaultAudio( PIN_SIGNAL_STATE_T level ); +void getCPLDStatus( CPLD_STATUS_T *status ); /**@}*/ Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -62,7 +62,7 @@ // Flush drain path state defines #define FLUSH_DRAIN_WAIT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Flush Drain path wait time in milliseconds. -#define MIN_INLET_TEMPERATURE_C 15.0F ///< Minimum water inlet temperature in C. TODO original temperature was 25 C +#define MIN_INLET_TEMPERATURE_C 25.0F ///< Minimum water inlet temperature in C. #define MAX_INLET_CONDUCTIVITY_US_PER_CM 2000.0F ///< Maximum water inlet conductivity in us/cm // Flush circulation path state defines @@ -80,7 +80,7 @@ #define RSRVRS_PARTIAL_FILL_VOL_ML 500.0F ///< Reservoirs 1 & 2 partial volume in mL. #define RSRVRS_FULL_STABLE_TIME_COUNT ( ( 4 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Reservoirs 1 & 2 full stable time in counts. #define RSRVRS_FILL_UP_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 full fill up timeout in ms. TODO original value was 5 mins -#define RSRVRS_500ML_FILL_UP_TIMEOUT_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 partial fill up timeout in ms. TODO original value was 2 mins +#define RSRVRS_500ML_FILL_UP_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 partial fill up timeout in ms. #define RSRVRS_DRAIN_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 drain timeout in ms. // Fill and heat water @@ -93,7 +93,7 @@ #define HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI 12.0F ///< Heat disinfect target drain outlet pressure in psi. #define HEAT_DISINFECT_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. #define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. -#define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5F * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disinfect. TODO change this to 5 seconds +#define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disinfect. #define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 100.0F ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. #define POST_HEAT_DISINFECT_WAIT_TIME_MS ( 3 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect final wait time before flushing the system in milliseconds. #define HEAT_DISINFECT_MAX_TEMP_GRADIENT_C 15.0F ///< Heat disinfect maximum allowed temperature gradient in between hottest and coldest sensors. @@ -637,7 +637,7 @@ BOOL hasConductivityPassed = FALSE; // If the inlet temperature and conductivity are in range, move onto the next state - if ( ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > MIN_INLET_TEMPERATURE_C ) && + if ( ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) >= MIN_INLET_TEMPERATURE_C ) && ( getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) <= MAX_INLET_CONDUCTIVITY_US_PER_CM ) ) { hasConductivityPassed = TRUE; @@ -1860,10 +1860,20 @@ { if ( ++rsrvrFillStableTimeCounter >= RSRVRS_FULL_STABLE_TIME_COUNT ) { - status = DG_RESERVOIR_REACHED_TARGET; + status = DG_RESERVOIR_REACHED_TARGET; rsrvrFillStableTimeCounter = 0; // Set the state timer in case it needs to be used for another timeout check - stateTimer = getMSTimerCount(); + if ( ( DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 == heatDisinfectState) && ( DG_RESERVOIR_2 == reservoir ) ) + { + if ( rsrvr1Status == DG_RESERVOIR_REACHED_TARGET ) + { + stateTimer = getMSTimerCount(); + } + } + else + { + stateTimer = getMSTimerCount(); + } } } else if ( TRUE == didTimeout( stateTimer, timeout ) ) @@ -1906,8 +1916,18 @@ if ( TRUE == isDrainComplete ) { - // Set the state timer in case it needs to be used for another timeout check - stateTimer = getMSTimerCount(); + if ( ( DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 == heatDisinfectState) && ( DG_RESERVOIR_1 == r) ) + { + if ( ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status) && ( 0 == getDrainPumpTargetRPM() ) ) + { + stateTimer = getMSTimerCount(); + } + } + else + { + stateTimer = getMSTimerCount(); + } + haveDrainParamsBeenInit[ r ] = FALSE; status = DG_RESERVOIR_REACHED_TARGET; } @@ -1948,11 +1968,11 @@ // Check if the temperature gradient in between the coldest and the hottest spot is more than the specified temperature and // the timer has not started yet, start it - if ( ( TPoTemp - ThdTemp > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) && ( 0 == tempGradOutOfRangeTimer ) ) + if ( ( fabs( TPoTemp - ThdTemp ) > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) && ( 0 == tempGradOutOfRangeTimer ) ) { tempGradOutOfRangeTimer = getMSTimerCount(); } - else if ( ( TPoTemp - ThdTemp > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) && + else if ( ( fabs( TPoTemp - ThdTemp ) > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) && ( TRUE == didTimeout( tempGradOutOfRangeTimer, HEAT_DISINFECT_TEMP_GRAD_OUT_RANGE_TIME_MS ) ) ) { alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_TEMP_GRAD_OUT_OF_RANAGE; Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -312,15 +312,15 @@ { DG_POST_STATE_T result = postState; - if ( ( SELF_TEST_STATUS_PASSED == testStatus ) || ( SELF_TEST_STATUS_FAILED == testStatus ) ) + if ( ( testStatus == SELF_TEST_STATUS_PASSED ) || ( testStatus == SELF_TEST_STATUS_FAILED ) ) { - BOOL passed = ( SELF_TEST_STATUS_PASSED == testStatus ? TRUE : FALSE ); + BOOL passed = ( testStatus == SELF_TEST_STATUS_PASSED ? TRUE : FALSE ); // Broadcast passed POST result sendPOSTTestResult( (DG_POST_STATE_T)((int)postState), passed ); // Move on to next POST test result = (DG_POST_STATE_T)((int)postState + 1); - if ( SELF_TEST_STATUS_FAILED == testStatus ) + if ( testStatus == SELF_TEST_STATUS_FAILED ) { tempPOSTPassed = FALSE; } Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -131,7 +131,6 @@ void execOperationModes( void ) { DG_OP_MODE_T newMode; - U32 priorSubMode = currentSubMode; priorSubMode = currentSubMode; @@ -150,7 +149,6 @@ if ( currentMode != newMode ) { // handle transition to new mode - priorSubMode = 0; lastMode = currentMode; transitionToNewOperationMode( newMode ); currentMode = newMode; @@ -418,8 +416,8 @@ * @brief * The testSetOperationMode function will transition to a given operation * mode if the transition is legal. - * @details Inputs: none - * @details Outputs: modeRequest[] + * @details Inputs: MODE_TRANSITION_TABLE[][] + * @details Outputs: modeRequest[], result * @param newMode ID of requested mode to transition to * @return TRUE if request successful, FALSE if not *************************************************************************/ Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rb3e53e10da033307b084161e6008fa5ed7710ccf -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision b3e53e10da033307b084161e6008fa5ed7710ccf) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -327,11 +327,11 @@ // Flash Fault LED if ( alarmLEDTimer <= ALARM_DG_FAULT_LED_ON_INTERVAL ) { - setCPLDFaultLED( PIN_SIGNAL_HIGH ); // Set Fault LED + setCPLDFaultLED( PIN_SIGNAL_HIGH, TRUE ); // Set Fault LED } else if ( alarmLEDTimer <= ALARM_DG_FAULT_LED_OFF_INTERVAL ) { - setCPLDFaultLED( PIN_SIGNAL_LOW ); // Clear Fault LED + setCPLDFaultLED( PIN_SIGNAL_LOW, TRUE ); // Clear Fault LED } else { @@ -341,14 +341,14 @@ // If HD COM has failed, sound alarm if ( FALSE == isHDCommunicating() ) { - setCPLDFaultAudio( PIN_SIGNAL_HIGH ); // Set Fault Audio + setCPLDFaultAudio( PIN_SIGNAL_HIGH ); // Set Fault Audio } } else { // No FAULTs - setCPLDFaultLED( PIN_SIGNAL_LOW ); // Clear Fault LED - setCPLDFaultAudio( PIN_SIGNAL_LOW ); // Clear Fault Audio + setCPLDFaultLED( PIN_SIGNAL_LOW, FALSE ); // Clear Fault LED + setCPLDFaultAudio( PIN_SIGNAL_LOW ); // Clear Fault Audio } } Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -re6c4c61c793a91f9ed9dfe969e01bdeee565347d -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -85,8 +85,8 @@ SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, // 55 SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, - SW_FAULT_ID_SEMAPHORE_IN_USE_TIMEOUT, SW_FAULT_ID_SERVICE_MODE_INVALID_EXEC_STATE, + SW_FAULT_ID_SEMAPHORE_IN_USE_TIMEOUT, SW_FAULT_ID_UV_REACTORS_INVALID_EXEC_STATE, SW_FAULT_ID_UV_REACTORS_INVALID_SELF_TEST_STATE, SW_FAULT_ID_THERMISTORS_INVALID_EXEC_STATE, // 60 @@ -133,7 +133,7 @@ SW_FAULT_ID_ILLEGAL_MEM_ACCESS, SW_FAULT_ID_INVALID_CHEMICAL_BOTTLE_SELECTED, SW_FAULT_ID_INVALID_FPGA_SENSOR_GROUP_SELECTED, - SW_FAULT_ID_INVALID_FLOW_SENSOR_SELECTED, // 106 + SW_FAULT_ID_INVALID_FLOW_SENSOR_SELECTED, // 105 SW_FAULT_ID_INVALID_SERVICE_STATE_SELECTED, SW_FAULT_ID_INVALID_NV_RECORD_SELECTED, SW_FAULT_ID_WRITE_USAGE_INFO_TO_NV_FAILURE, Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -re6c4c61c793a91f9ed9dfe969e01bdeee565347d -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -894,12 +894,16 @@ handleDGScheduledRunsRequest( message ); break; + case MSG_ID_HD_REQUEST_DG_SERVICE_MODE: + handleServiceModeRequest( message ); + break; + case MSG_ID_HD_REQUEST_DG_USAGE_INFO: handleHDRequestDGUsageInfo( message ); break; - case MSG_ID_HD_REQUEST_DG_SERVICE_MODE: - handleServiceModeRequest( message ); + case MSG_ID_REQUEST_CPLD_STATUS: + handleCpldStatusRequest( message ); break; // NOTE: This case must be last @@ -1137,11 +1141,11 @@ break; case MSG_ID_FILTER_FLUSH_TIME_PERIOD_OVERRIDE: - handleFilterFlushTimePeriodOverride( message ); + handleFilterFlushTimePeriodOverride(message); break; - case MSG_ID_DG_FANS_RPM_OVERRIDE: - handleFansRPMOverride( message ); + case MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION: + handleTestBlockMessagesRequest( message ); break; case MSG_ID_DG_STOP_RTC_CLOCK: @@ -1152,10 +1156,6 @@ handleSetDrainPumpMeasuredRPMOverrideRequest( message ); break; - case MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION: - handleTestBlockMessagesRequest( message ); - break; - case MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD: handleTestSuperClearAlarmsRequest( message ); break; @@ -1168,6 +1168,10 @@ handleTestFansRPMAlarmStartTimeOffsetRequest( message ); break; + case MSG_ID_DG_FANS_RPM_OVERRIDE: + handleFansRPMOverride( message ); + break; + case MSG_ID_DG_USED_ACID_VOLUME_ML_OVERRIDE: handleTestUsedAcidVolumeMLOverrideRequest( message ); break; @@ -1200,18 +1204,19 @@ handleSetDGUsageInfoRecord( message ); break; - case MSG_ID_HD_REQUEST_DG_ALARMS: - handleResendAllAlarmsCommand( message ); - break; - case MSG_ID_DG_SET_OP_MODE_REQUEST: handleTestSetOpModeRequest( message ); break; case MSG_ID_DG_RESERVOIR_TARE_REQUEST: handleTestTareReservoirRequest( message ); + break; + case MSG_ID_HD_REQUEST_DG_ALARMS: + handleResendAllAlarmsCommand( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r5e88efbadfacd95cbf2c3620a9520fe4f9b6fd46 -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5e88efbadfacd95cbf2c3620a9520fe4f9b6fd46) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -23,6 +23,7 @@ #include "Compatible.h" #include "ConcentratePumps.h" #include "ConductivitySensors.h" +#include "CPLD.h" #include "Fans.h" #include "FlowSensors.h" #include "FPGA.h" @@ -368,7 +369,6 @@ return result; } - // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -882,8 +882,6 @@ // has been already checked in POST getNVRecord2Driver( GET_SRR_RECORD, (U08*)&scheduledService, sizeof( DG_SCHEDULED_RUN_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - U08 *payloadPtr = msg.payload; - // Create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DG_SCHEDULED_RUNS_DATA; @@ -3239,37 +3237,6 @@ } /*********************************************************************//** - * @brief - * The handleFansRPMOverride function handles a request to override a fans RPM value. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleFansRPMOverride( MESSAGE_T *message ) -{ - TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; - BOOL result = FALSE; - - // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) - { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); - if ( FALSE == payload.reset ) - { - result = testSetFanRPMOverride( payload.index, payload.state.f32 ); - } - else - { - result = testResetFanRPMOverride( payload.index ); - } - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** * @brief * The handleStopDGRTCClock function handles a request to stop the RTC clock. * @details Inputs: none @@ -3408,10 +3375,41 @@ /*********************************************************************//** * @brief - * The handleTestFansRPMAlarmStartTimeOffsetRequest function handles a - * request to set the fans RPM alarm start time offset. + * The handleFansRPMOverride function handles a request to override a fans RPM value. * @details Inputs: none * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleFansRPMOverride( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetFanRPMOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetFanRPMOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestFansRPMAlarmStartTimeOverrideRequest function handles a + * request to override the fan RPM alarm start time. + * @details Inputs: none + * @details Outputs: message handled * @param message : a pointer to the message to handle * @return none *************************************************************************/ @@ -3434,7 +3432,6 @@ } /*********************************************************************//** - * @brief * The handleTestUsedAcidVolumeMLOverrideRequest function handles a * request to override the acid volume. * @details Inputs: none @@ -3727,30 +3724,6 @@ /*********************************************************************//** * @brief -* The handleResendAllAlarmsCommand function handles a request to re-send -* all active DG alarms. -* @details Inputs: none -* @details Outputs: message handled -* @param message a pointer to the message to handle -* @return none -*************************************************************************/ -void handleResendAllAlarmsCommand( MESSAGE_T *message ) -{ - BOOL result = FALSE; - - // verify payload length - if ( 0 == message->hdr.payloadLen ) - { - handleResendActiveAlarmsRequest(); - result = TRUE; - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** -* @brief * The handleServiceModeRequest function handles a request to enter service * mode. * @details Inputs: none @@ -3818,4 +3791,59 @@ return result; } +/*********************************************************************//** + * @brief + * The handleResendAllAlarmsCommand function handles a request to re-send + * all active DG alarms. + * The sendUIServiceModeResponse function sends out the DG response to a + * UI request to go to service mode. + * @details Inputs: none + * @details Outputs: Service mode request response msg constructed and queued + * @param accepted TRUE if request was accepted, FALSE if not + * @param rejCode Reject reason code explaining why request was rejected + * @return none + *************************************************************************/ +void handleResendAllAlarmsCommand( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // verify payload length + if ( 0 == message->hdr.payloadLen ) + { + handleResendActiveAlarmsRequest(); + result = TRUE; + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleCpldStatusRequest function handles a CPLD Status request message. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleCpldStatusRequest( MESSAGE_T *message ) +{ + MESSAGE_T msg; + CPLD_STATUS_T payload; + U08 *payloadPtr = msg.payload; + + // populate payload + getCPLDStatus( &payload ); + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_CPLD_STATUS; + msg.hdr.payloadLen = sizeof( CPLD_STATUS_T ); + + // fill message payload + memcpy( payloadPtr, &payload, sizeof( CPLD_STATUS_T ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -r608780a6e5449b5a9710ac07299ec028117c9f4d --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 608780a6e5449b5a9710ac07299ec028117c9f4d) @@ -166,6 +166,15 @@ // MSG_ID_DG_RESPONSE_SERVICE_MODE_REQUEST BOOL sendServiceModeResponse( BOOL accepted, U32 rejCode ); +// MSG_ID_HD_OP_MODE +BOOL handleSetHDOperationMode( MESSAGE_T *message ); + +// MSG_ID_HD_REQUEST_DG_USAGE_INFO +void handleHDRequestDGUsageInfo( MESSAGE_T * message ); + +// MSG_ID_REQUEST_CPLD_STATUS +void handleCpldStatusRequest( MESSAGE_T *message ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN @@ -370,6 +379,12 @@ // MSG_ID_DG_DRAIN_PUMP_MEASURED_RPM_OVERRIDE void handleSetDrainPumpMeasuredRPMOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_ALARM_INFO_SEND_INTERVAL_OVERRIDE +void handleTestAlarmInfoSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD +void handleTestSuperClearAlarmsRequest( MESSAGE_T *message ); + // MSG_ID_DG_SET_FANS_RPM_ALARM_START_TIME_OFFSET void handleTestFansRPMAlarmStartTimeOffsetRequest( MESSAGE_T *message ); @@ -391,15 +406,18 @@ // MSG_ID_DG_HD_COMMUNICATION_STATUS void handleTestHDCommunicationStatusOverrideRequest(MESSAGE_T *message); +// MSG_ID_DG_USED_ACID_VOLUME_ML_OVERRIDE +void handleTestUsedAcidVolumeMLOverrideRequest(MESSAGE_T *message); + +// MSG_ID_DG_USED_BICARB_VOLUME_ML_OVERRIDE +void handleTestUsedBicarbVolumeMLOverrideRequest(MESSAGE_T *message); + // MSG_ID_DG_GET_USAGE_INFO_RECORD void handleGetDGUsageInfoRecord( MESSAGE_T *message ); // MSG_ID_DG_SET_USAGE_INFO_RECORD void handleSetDGUsageInfoRecord( MESSAGE_T *message ); -// MSG_ID_HD_REQUEST_DG_ALARMS -void handleResendAllAlarmsCommand( MESSAGE_T *message ); - // MSG_ID_DG_SET_OP_MODE_REQUEST void handleTestSetOpModeRequest( MESSAGE_T *message ); @@ -409,6 +427,9 @@ // MSG_ID_HD_OP_MODE BOOL handleSetHDOperationMode( MESSAGE_T *message ); +// MSG_ID_HD_REQUEST_DG_ALARMS +void handleResendAllAlarmsCommand( MESSAGE_T *message ); + /**@}*/ #endif