Index: firmware/App/Controllers/RinsePump.c =================================================================== diff -u -rcc893e9b6656058542c82ca3a72532944e46375b -re39cba3641902ed9c670f1ca7499f0b25b59bef1 --- firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision cc893e9b6656058542c82ca3a72532944e46375b) +++ firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision e39cba3641902ed9c670f1ca7499f0b25b59bef1) @@ -50,8 +50,6 @@ #define RINSE_PUMP_SPD_OUT_OF_RANGE_TOL_PCT 0.10F ///< Rinse pump commanded vs measured speed tolerance (10%). #define RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS 500 ///< Persistence time (ms) before declaring speed-out-of-range alarm. #define RINSE_PUMP_MAX_RPM_ESTIMATE 3000U ///< Estimated max rinse pump RPM (for PWM-to-target conversion). -#define RINSE_PUMP_ZERO_U32 0U ///< Zero value for U32 variables (speed, counts). -#define RINSE_PUMP_ZERO_F32 0.0F ///< Zero value for F32 variables (error). // ********** private data ********** @@ -90,8 +88,8 @@ rinsePumpPwmPercentage.ovData = RINSE_PUMP_DEFAULT_PWM_PERCENT; rinsePumpPwmPercentage.ovInitData = RINSE_PUMP_DEFAULT_PWM_PERCENT; rinsePumpPwmPercentage.override = OVERRIDE_RESET; - rinsePumpMeasuredSpeed = RINSE_PUMP_ZERO_U32; - rinsePumpTargetSpeedRPM = RINSE_PUMP_ZERO_U32; + rinsePumpMeasuredSpeed = 0; + rinsePumpTargetSpeedRPM = 0; initPersistentAlarm( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE, 0, RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS ); } @@ -167,7 +165,7 @@ { // Pulse width in 10us resolution U16 pumpPulseWidth = getFPGAD79RinsePumpPulseWidth(); - U32 pumpSpeedPerSec = RINSE_PUMP_ZERO_U32; + U32 pumpSpeedPerSec = 0; if ( ( RINSE_PUMP_PULSE_WIDTH_INVALID_MIN != pumpPulseWidth ) && ( RINSE_PUMP_PULSE_WIDTH_INVALID_MAX != pumpPulseWidth ) ) { @@ -178,17 +176,16 @@ } else { - rinsePumpMeasuredSpeed = RINSE_PUMP_ZERO_U32; + rinsePumpMeasuredSpeed = 0; } } /*********************************************************************//** * @brief - * The execRinsePumpMonitor function executes the rinse pump monitor. + * The execRinsePumpMonitor function executes the rinse pump monitor which + * calculates the rinse pump speed and monitors the rinse pump speed. * @details \b Inputs: none - * @details \b Outputs: publish rinse pump data - * @details \b Alarm: ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE when - * commanded vs measured speed deviates beyond tolerance for RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS (persistent alarm). + * @details \b Outputs: none * @return none *************************************************************************/ void execRinsePumpMonitor( void ) @@ -198,12 +195,8 @@ // Monitor pump speed monitorRinsePumpSpeed(); - - // Publish rinse pump data - publishRinsePumpData(); } - /*********************************************************************//** * @brief * The execRinsePumpController function executes the rinse pump state machine. @@ -214,7 +207,6 @@ *************************************************************************/ void execRinsePumpController( void ) { - switch( currentRinsePumpState ) { case RINSE_PUMP_STATE_INIT: @@ -234,6 +226,8 @@ break; } + // Publish rinse pump data + publishRinsePumpData(); } /*********************************************************************//** @@ -243,23 +237,25 @@ * RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS. * @details \b Inputs: none * @details \b Outputs: none + * @details \b Alarm: ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE when + * commanded vs measured speed deviates beyond tolerance for RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS. * @return none *************************************************************************/ static void monitorRinsePumpSpeed( void ) { F32 rpTargetSpeed = (F32)rinsePumpTargetSpeedRPM; F32 rpMeasSpeed = (F32)rinsePumpMeasuredSpeed; - F32 rpError = RINSE_PUMP_ZERO_F32; + F32 rpError = 0.0; BOOL isRpSpeedOut = FALSE; F32 tolerance = RINSE_PUMP_SPD_OUT_OF_RANGE_TOL_PCT; if ( RINSE_PUMP_STATE_ON == currentRinsePumpState ) { rpError = fabs( rpMeasSpeed - rpTargetSpeed ); - if ( rpTargetSpeed > RINSE_PUMP_ZERO_F32 ) + if ( rpTargetSpeed > 0.0 ) { - rpError = rpError / rpTargetSpeed; + rpError = rpError / rpTargetSpeed; } isRpSpeedOut = ( rpError > tolerance ? TRUE : FALSE ); @@ -295,7 +291,7 @@ { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; - rinsePumpTargetSpeedRPM = RINSE_PUMP_ZERO_U32; + rinsePumpTargetSpeedRPM = 0; if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { @@ -324,7 +320,7 @@ if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { F32 pwmPercent = getF32OverrideValue( &rinsePumpPwmPercentage ); // TODO should this conversion happen in setPWMCount function? - U08 pwmInCount = (U08)( ( pwmPercent / RINSE_PUMP_MAX_PWM_PERCENT ) * RINSE_PUMP_PWM_IN_COUNT_MAX ); + U32 pwmInCount = (U32)( ( pwmPercent / RINSE_PUMP_MAX_PWM_PERCENT ) * RINSE_PUMP_PWM_IN_COUNT_MAX ); rinsePumpTargetSpeedRPM = (U32)( ( (F32)pwmInCount / RINSE_PUMP_PWM_IN_COUNT_MAX ) * (F32)RINSE_PUMP_MAX_RPM_ESTIMATE ); @@ -383,7 +379,7 @@ data.d79PumpRPM = rinsePumpMeasuredSpeed; broadcastData( MSG_ID_DD_RINSE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( RINSE_PUMP_PAYLOAD_T ) ); - rinsePumpDataPublicationTimerCounter = RINSE_PUMP_ZERO_U32; + rinsePumpDataPublicationTimerCounter = 0; } } Index: firmware/App/Drivers/GPIO.c =================================================================== diff -u -rf66ffb2807dae4ad719d41520bc8c3739210bfd0 -re39cba3641902ed9c670f1ca7499f0b25b59bef1 --- firmware/App/Drivers/GPIO.c (.../GPIO.c) (revision f66ffb2807dae4ad719d41520bc8c3739210bfd0) +++ firmware/App/Drivers/GPIO.c (.../GPIO.c) (revision e39cba3641902ed9c670f1ca7499f0b25b59bef1) @@ -31,9 +31,6 @@ #define WD_PET_GIO_PORT_PIN 1U ///< Watchdog pet GPIO pin number. #define WD_EXP_GIO_PORT_PIN 0U ///< Watchdog expired GPIO pin number. -#define GPIO_AC_SWITCH_MASK 0x10U ///< AC switch status bit mask (concentrate cap switch per HDD). -#define GPIO_LEAK_SENSOR_MASK 0x04U ///< Leak sensor status bit mask (per HDD - update if different). - #define GET_WD_EXP() ( PIN_SIGNAL_STATE_T )( gioGetBit( gioPORTB, WD_EXP_GIO_PORT_PIN ) ) ///< Get watchdog expired pin state macro. #define TGL_WD_PET() gioToggleBit( gioPORTB, WD_PET_GIO_PORT_PIN ) ///< Macro to toggle watchdog pet signal state. @@ -94,50 +91,4 @@ return level; } -/*********************************************************************//** - * @brief - * The getGPIOStatusFromFPGA function returns the latest GPIO status register - * value reported by the DD FPGA. - * @details \b Inputs: fpgaSensorReadings.fpgaGPIOStatus (via FpgaDD service) - * @details \b Outputs: none - * @return GPIO status register value (bit-mapped per HDD definition) - *************************************************************************/ -U08 getGPIOStatusFromFPGA( void ) -{ - return getFPGAGPIOStatus(); -} - -/*********************************************************************//** - * @brief - * The getACSwitchStatus function returns the AC switch (concentrate cap - * switch) status from the FPGA GPIO register. - * @details \b Inputs: fpgaSensorReadings.fpgaGPIOStatus (via getGPIOStatusFromFPGA) - * @details \b Outputs: none - * @return TRUE if AC switch is asserted, FALSE otherwise - *************************************************************************/ -BOOL getACSwitchStatus( void ) -{ - U08 gpioStatus = getGPIOStatusFromFPGA(); - BOOL isAsserted = ( ( gpioStatus & GPIO_AC_SWITCH_MASK ) != 0U ) ? TRUE : FALSE; - - return isAsserted; -} - -/*********************************************************************//** - * @brief - * The getLeakSensorStatus function returns the leak sensor status from the - * FPGA GPIO register. Application code should trigger an alarm when - * LEAK_SENSOR_DETECTED is returned (e.g. in a monitor task). - * @details \b Inputs: fpgaSensorReadings.fpgaGPIOStatus (via getGPIOStatusFromFPGA) - * @details \b Outputs: none - * @return LEAK_SENSOR_NOT_DETECTED or LEAK_SENSOR_DETECTED - *************************************************************************/ -LEAK_SENSOR_STATUS_T getLeakSensorStatus( void ) -{ - U08 gpioStatus = getGPIOStatusFromFPGA(); - LEAK_SENSOR_STATUS_T status = ( ( gpioStatus & GPIO_LEAK_SENSOR_MASK ) != 0U ) ? LEAK_SENSOR_DETECTED : LEAK_SENSOR_NOT_DETECTED; - - return status; -} - /**@}*/ Index: firmware/App/Drivers/GPIO.h =================================================================== diff -u -rf66ffb2807dae4ad719d41520bc8c3739210bfd0 -re39cba3641902ed9c670f1ca7499f0b25b59bef1 --- firmware/App/Drivers/GPIO.h (.../GPIO.h) (revision f66ffb2807dae4ad719d41520bc8c3739210bfd0) +++ firmware/App/Drivers/GPIO.h (.../GPIO.h) (revision e39cba3641902ed9c670f1ca7499f0b25b59bef1) @@ -31,23 +31,12 @@ // ********** public definitions ********** -/// Leak sensor status enumeration (from FPGA GPIO register). -typedef enum LeakSensorStatus -{ - LEAK_SENSOR_NOT_DETECTED = 0, ///< No leak detected - LEAK_SENSOR_DETECTED, ///< Leak detected - NUM_OF_LEAK_SENSOR_STATUS -} LEAK_SENSOR_STATUS_T; - // ********** public function prototypes ********** void toggleWatchdogPetSignal( void ); void setWatchdogPetSignal( void ); void clrWatchdogPetSignal( void ); PIN_SIGNAL_STATE_T getWatchdogExpired( void ); -U08 getGPIOStatusFromFPGA( void ); -BOOL getACSwitchStatus( void ); -LEAK_SENSOR_STATUS_T getLeakSensorStatus( void ); /**@}*/ Index: firmware/App/Monitors/Level.c =================================================================== diff -u -rb9a6c61d168d8aad9314f05b749645c73158b621 -re39cba3641902ed9c670f1ca7499f0b25b59bef1 --- firmware/App/Monitors/Level.c (.../Level.c) (revision b9a6c61d168d8aad9314f05b749645c73158b621) +++ firmware/App/Monitors/Level.c (.../Level.c) (revision e39cba3641902ed9c670f1ca7499f0b25b59bef1) @@ -70,7 +70,7 @@ static void publishLevelsData( void ); static BOOL processLevelCount( U16 count ); -static LEVEL_STATE_T readFloaterLevelstatus( LEVEL_T levelId ); +static LEVEL_STATE_T readFloaterLevelStatus( LEVEL_T levelId ); static LEVEL_STATE_T getLevelState( U32 levelStatus ); static LEVEL_STATE_T getLevelStateBeta19( U32 levelStatus ); static LEVEL_STATE_T getLevelStateBeta10( U32 levelStatus ); @@ -130,7 +130,7 @@ { // Process the status of the Level case D6_LEVL: - currentLevelStatus = readFloaterLevelstatus( D6_LEVL ); + currentLevelStatus = readFloaterLevelStatus( D6_LEVL ); break; case D63_LEVL: @@ -167,7 +167,7 @@ break; case P25_LEVL: - currentLevelStatus = readFloaterLevelstatus( P25_LEVL ); + currentLevelStatus = readFloaterLevelStatus( P25_LEVL ); break; #ifndef _VECTORCAST_ @@ -394,13 +394,13 @@ /*********************************************************************//** * @brief - * The getFloaterLevelstatus function gets the floater level reported by FPGA + * The getFloaterLevelStatus function gets the floater level reported by FPGA * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. * @details \b Inputs: FPGA level sensor data * @details \b Outputs: level * @return level status *************************************************************************/ -static LEVEL_STATE_T readFloaterLevelstatus( LEVEL_T levelId ) +static LEVEL_STATE_T readFloaterLevelStatus( LEVEL_T levelId ) { LEVEL_STATE_T currentLevelStatus = LEVEL_STATE_HIGH; U32 levelStatus = 0; Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -re76c83e425e2cc692f65eb7a5cabc2163c8dfa2f -re39cba3641902ed9c670f1ca7499f0b25b59bef1 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision e76c83e425e2cc692f65eb7a5cabc2163c8dfa2f) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision e39cba3641902ed9c670f1ca7499f0b25b59bef1) @@ -25,6 +25,7 @@ #include "Comm.h" #include "Compatible.h" #include "FPGA.h" +#include "FpgaDD.h" #include "Messaging.h" #include "OperationModes.h" #include "PersistentAlarm.h" @@ -133,6 +134,9 @@ #define FPGA_D42_BLOOD_LEAK_STATUS_MASK 0x04 ///< Bit mask for blood leak detector. #define FPGA_D42_BLOOD_LEAK_ST_BIT_INDEX 2 ///< Bit index for the blood leak self test status bit. +#define GPIO_AC_SWITCH_MASK 0x10U ///< AC switch status bit mask. +#define FPGA_GPIO_LEAK_SENSOR_MASK 0x02U ///< GPIO_Status Bit 1 per HDD. + #define MAX_PUMP_SPEED 3000.0F ///< Maxon controller pump maximum speed #define PUMP_SPEED_OFFSET 168.7F ///< Speed Scale adjustment intercept factor #define PUMP_SPEED_FULL_SCALE 3187.0F ///< Speed scale adjustment slope factor @@ -147,7 +151,7 @@ U08 fpgaRevLab; ///< Reg 3. FPGA revision (lab) being reported } FPGA_HEADER_T; // read only on FPGA -#if 1 // TODO: Remove when Beta 1.9 is obsolete +// TODO: Remove when Beta 1.9 is obsolete /// FPGA sensor readings struct. typedef struct { @@ -286,9 +290,7 @@ U16 fpgaD74CondTemp; ///< Reg 756. D74 Temperature U08 fpgaD74CondReadCnt; ///< Reg 758. D74 successful read count U08 fpgaD74CondErrorCnt; ///< Reg 759. D74 error read count - } DD_FPGA_SENSORS_BETA_1_9_T; -#endif typedef struct { @@ -453,7 +455,7 @@ U08 fpgaP18CalMemCounter; ///< Reg 820. TBD } DD_FPGA_SENSORS_T; -// Remove when Beta 1.9 is obsolete +// TODO: Remove when Beta 1.9 is obsolete typedef struct { U16 fpgaValveControl; ///< Reg 04. Valve control register @@ -3078,7 +3080,8 @@ *************************************************************************/ U16 getFPGAD63LevelSensor( void ) { - U08 result; + U16 result; + #if 1 // Remove when Beta 1.9 is obsolete if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) == TRUE ) { @@ -3105,7 +3108,8 @@ *************************************************************************/ U16 getFPGAD98LevelSensor( void ) { - U08 result; + U16 result; + #if 1 // Remove when Beta 1.9 is obsolete if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) == TRUE ) { @@ -3132,7 +3136,8 @@ *************************************************************************/ U16 getFPGAD46LevelSensor( void ) { - U08 result; + U16 result; + #if 1 // Remove when Beta 1.9 is obsolete if ( getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) == TRUE ) { @@ -3369,6 +3374,52 @@ /*********************************************************************//** * @brief + * The getGPIOStatusFromFPGA function returns the latest GPIO status register + * value reported by the DD FPGA. + * @details \b Inputs: fpgaSensorReadings.fpgaGPIOStatus (via FpgaDD service) + * @details \b Outputs: none + * @return GPIO status register value (bit-mapped per HDD definition) + *************************************************************************/ +U08 getGPIOStatusFromFPGA( void ) +{ + return getFPGAGPIOStatus(); +} + +/*********************************************************************//** + * @brief + * The getACSwitchStatus function returns the AC switch (concentrate cap + * switch) status from the FPGA GPIO register. + * @details \b Inputs: fpgaSensorReadings.fpgaGPIOStatus (via getGPIOStatusFromFPGA) + * @details \b Outputs: none + * @return TRUE if AC switch is asserted, FALSE otherwise + *************************************************************************/ +BOOL getACSwitchStatus( void ) +{ + U08 gpioStatus = getGPIOStatusFromFPGA(); + BOOL isAsserted = ( ( gpioStatus & GPIO_AC_SWITCH_MASK ) == 0U ) ? TRUE : FALSE; + + return isAsserted; +} + +/*********************************************************************//** + * @brief + * The getFPGALeakSensorStatus function returns the leak sensor status from + * the FPGA GPIO_Status register (Bit 1 per HDD). Application should trigger + * an alarm when LEAK_SENSOR_DETECTED is returned. + * @details \b Inputs: fpgaSensorReadings.fpgaGPIOStatus + * @details \b Outputs: none + * @return FPGA_GPIO_LEAK_SENSOR_NOT_DETECTED or FPGA_GPIO_LEAK_SENSOR_DETECTED + *************************************************************************/ +FPGA_GPIO_LEAK_SENSOR_STATUS_T getFPGALeakSensorStatus( void ) +{ + U08 gpioStatus = getFPGAGPIOStatus(); + FPGA_GPIO_LEAK_SENSOR_STATUS_T status = ( ( gpioStatus & FPGA_GPIO_LEAK_SENSOR_MASK ) != 0U ) ? FPGA_GPIO_LEAK_SENSOR_NOT_DETECTED : FPGA_GPIO_LEAK_SENSOR_DETECTED; + + return status; +} + +/*********************************************************************//** + * @brief * The getFPGATempTax1 function gets the Tax1 temperature sensor reading. * @details \b Inputs: fpgaSensorReadings * @details \b Outputs: none Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -rdcdc84e87fe5d67c15e83bc4e4a4bbacb0f4b63b -re39cba3641902ed9c670f1ca7499f0b25b59bef1 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision dcdc84e87fe5d67c15e83bc4e4a4bbacb0f4b63b) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision e39cba3641902ed9c670f1ca7499f0b25b59bef1) @@ -230,7 +230,7 @@ U16 getFPGAD63LevelSensor( void ); U16 getFPGAD98LevelSensor( void ); U16 getFPGAD46LevelSensor( void ); -BOOL getFPGAD6LevelStatus( void ); +U08 getFPGAD6LevelStatus( void ); U08 getFPGAFloater2Status( void ); //Temperature sensors @@ -245,6 +245,19 @@ U08 getFPGAIOExpanderErrorCount( void ); U08 getFPGAHallSensorStatus( void ); U08 getFPGAGPIOStatus( void ); + +/// Leak sensor status from FPGA GPIO_Status register (Bit 1 per HDD). +typedef enum FpgaGpioLeakSensorStatus +{ + FPGA_GPIO_LEAK_SENSOR_NOT_DETECTED = 0, ///< No leak (Bit 1 = 1, DRY) + FPGA_GPIO_LEAK_SENSOR_DETECTED, ///< Leak detected (Bit 1 = 0, WET) - application should trigger alarm + NUM_OF_FPGA_GPIO_LEAK_SENSOR_STATUS +} FPGA_GPIO_LEAK_SENSOR_STATUS_T; + +U08 getGPIOStatusFromFPGA( void ); +BOOL getACSwitchStatus( void ); +FPGA_GPIO_LEAK_SENSOR_STATUS_T getFPGALeakSensorStatus( void ); + U32 getFPGATempTax1( void ); U32 getFPGATempRTD( void ); U08 getFPGAAD7124ReadCount( void );