Index: firmware/App/Controllers/RinsePump.c =================================================================== diff -u -r30199912da641d8832d8dcd8239b6fc5fe53b204 -rbe3fa274cd01b6dec1f98fa7266739b55648d582 --- firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision 30199912da641d8832d8dcd8239b6fc5fe53b204) +++ firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision be3fa274cd01b6dec1f98fa7266739b55648d582) @@ -19,6 +19,7 @@ #include "FpgaDD.h" #include "Messaging.h" #include "OperationModes.h" +#include "PersistentAlarm.h" #include "RinsePump.h" #include "TaskGeneral.h" #include "Timers.h" @@ -46,7 +47,10 @@ #define RINSE_PUMP_PULSE_WIDTH_INVALID_MIN 0U ///< Invalid pulse width minimum (no rotation). #define RINSE_PUMP_PULSE_WIDTH_INVALID_MAX 0xFFFFU ///< Invalid pulse width maximum (sensor fault). #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 ********** @@ -85,8 +89,10 @@ rinsePumpPwmPercentage.ovData = RINSE_PUMP_DEFAULT_PWM_PERCENT; rinsePumpPwmPercentage.ovInitData = RINSE_PUMP_DEFAULT_PWM_PERCENT; rinsePumpPwmPercentage.override = OVERRIDE_RESET; - rinsePumpMeasuredSpeed = 0U; - rinsePumpTargetSpeedRPM = 0U; + rinsePumpMeasuredSpeed = RINSE_PUMP_ZERO_U32; + rinsePumpTargetSpeedRPM = RINSE_PUMP_ZERO_U32; + + initPersistentAlarm( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE, 0, RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS ); } /*********************************************************************//** @@ -160,7 +166,7 @@ { // Pulse width in 10us resolution U16 pumpPulseWidth = getFPGAD79RinsePumpPulseWidth(); - U32 pumpSpeedPerSec = 0U; + U32 pumpSpeedPerSec = RINSE_PUMP_ZERO_U32; if ( ( RINSE_PUMP_PULSE_WIDTH_INVALID_MIN != pumpPulseWidth ) && ( RINSE_PUMP_PULSE_WIDTH_INVALID_MAX != pumpPulseWidth ) ) { @@ -171,7 +177,7 @@ } else { - rinsePumpMeasuredSpeed = 0U; + rinsePumpMeasuredSpeed = RINSE_PUMP_ZERO_U32; } } @@ -181,34 +187,19 @@ * @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. Data1=measured RPM, Data2=target RPM. + * commanded vs measured speed deviates beyond tolerance for RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS (persistent alarm). * @return none *************************************************************************/ void execRinsePumpMonitor( void ) { - U08 fpgaConcPumpsFault = getFPGAConcentratePumpsFault(); - BOOL isConcPumpFault = ( fpgaConcPumpsFault > 0 ? TRUE : FALSE ); - - - // Check if a new calibration is available -// if ( TRUE == isNewCalibrationRecordAvailable() ) -// { -// // Get the calibration values of acid and bicarb -// getNVRecord2Driver( GET_CAL_ACID_CONCENTREATES, (U08*)&acidConcentrateCalRecord, sizeof( acidConcentrateCalRecord ), -// NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK, ALARM_ID_DD_ACID_CONCENTRATE_INVALID_CAL_RECORD ); -// getNVRecord2Driver( GET_CAL_BICARB_CONCENTRATES, (U08*)&bicarbConcentrateCalRecord, sizeof( bicarbConcentrateCalRecord ), -// NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK, ALARM_ID_DD_BICARB_CONCENTRATE_INVALID_CAL_RECORD ); -// } - // Calculate rinse pump speed calculateRinsePumpSpeed(); - - // Monitor pump speed (commanded vs measured tolerance, triggers ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE) + // Monitor pump speed monitorRinsePumpSpeed(); - //Publish rinse pump data // TODO should be done in monitor or controller? -// publishRinsePumpData(); + // Publish rinse pump data + publishRinsePumpData(); } @@ -242,13 +233,13 @@ break; } - publishRinsePumpData(); } /*********************************************************************//** * @brief * The monitorRinsePumpSpeed function monitors the rinse pump speed and - * triggers the alarms if they are out of range. + * triggers the alarm via the persistent alarm API when out of range for + * RINSE_PUMP_SPEED_OUT_PERSISTENCE_MS. * @details \b Inputs: none * @details \b Outputs: none * @return none @@ -257,30 +248,24 @@ { F32 rpTargetSpeed = (F32)rinsePumpTargetSpeedRPM; F32 rpMeasSpeed = (F32)rinsePumpMeasuredSpeed; - F32 rpError = 0.0F; + F32 rpError = RINSE_PUMP_ZERO_F32; 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 > 0.0F ) + if ( rpTargetSpeed > RINSE_PUMP_ZERO_F32 ) { rpError = rpError / rpTargetSpeed; } isRpSpeedOut = ( rpError > tolerance ? TRUE : FALSE ); } - if ( TRUE == isRpSpeedOut ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE, rinsePumpMeasuredSpeed, rinsePumpTargetSpeedRPM ); - } - else - { - clearAlarmConditionDD( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE ); - } + checkPersistentAlarm( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE, isRpSpeedOut, + (F32)rinsePumpMeasuredSpeed, (F32)rinsePumpTargetSpeedRPM ); } /*********************************************************************//** @@ -308,7 +293,7 @@ { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; - rinsePumpTargetSpeedRPM = 0U; + rinsePumpTargetSpeedRPM = RINSE_PUMP_ZERO_U32; if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { @@ -396,7 +381,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 = 0; + rinsePumpDataPublicationTimerCounter = RINSE_PUMP_ZERO_U32; } } Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -rf66ffb2807dae4ad719d41520bc8c3739210bfd0 -rbe3fa274cd01b6dec1f98fa7266739b55648d582 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision f66ffb2807dae4ad719d41520bc8c3739210bfd0) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision be3fa274cd01b6dec1f98fa7266739b55648d582) @@ -144,7 +144,7 @@ U08 fpgaRevLab; ///< Reg 3. FPGA revision (lab) being reported } FPGA_HEADER_T; // read only on FPGA -#if 1 // Remove when Beta 1.9 is obsolete +#if 1 // TODO: Remove when Beta 1.9 is obsolete /// FPGA sensor readings struct. typedef struct { @@ -450,7 +450,7 @@ U08 fpgaP18CalMemCounter; ///< Reg 820. TBD } DD_FPGA_SENSORS_T; -#if 1 // Remove when Beta 1.9 is obsolete +#if 1 // TODO: Remove when Beta 1.9 is obsolete typedef struct { U16 fpgaValveControl; ///< Reg 04. Valve control register @@ -658,7 +658,7 @@ fpgaActuatorSetPoints.fpgaDDSpareValvePWMControl = FPGA_ENABLE_UF_VALVES_PWM; fpgaActuatorSetPoints.fpgaADCControl = FPGA_ADC_AUTO_READ_ENABLE; -#if 1 // Remove when Beta 1.9 is obsolete +#if 1 // TODO: Remove when Beta 1.9 is obsolete // Set the valve control mode and default state of valve for Beta 1.9 HW fpgaBeta19ActuatorSetPoints.fpgaValveControl = FPGA_ENABLE_VALVES_CONTROL; fpgaBeta19ActuatorSetPoints.fpgaValvePWMEnable = FPGA_ENABLE_VALVES_PWM; @@ -776,21 +776,22 @@ * The setFPGADDValveStates function sets the DD valve states with a 16-bit * set of states - one bit per valve, with a 1 meaning "energized" and a 0 * meaning "de-energized". The bit positions for these bit states are as follows: - * 0 - D53Valve.\n + * 0 - D14Valve.\n * 1 - D52Valve.\n * 2 - D8Valve.\n * 3 - D54Valve.\n - * 4 - D14Valve.\n - * 5 - D65Valve.\n + * 4 - Unused.\n + * 5 - D34Valve.\n * 6 - D64Valve.\n * 7 - D31Valve.\n - * 8 - D34Valve.\n + * 8 - D65Valve.\n * 9 - D35Valve.\n * 10 - D40Valve.\n * 11 - D47Valve.\n * 12 - D3Valve.\n - * 13 - M4Valve.\n - * 14..15 - reserved or unused. + * 13 - D80Valve.\n + * 14 - D81Valve.\n + * 15 - D85Valve.\n * @details \b Inputs: none * @details \b Outputs: fpgaValveControl * @param valveStates bit mask for the various valve states @@ -829,13 +830,13 @@ * The setFPGASpareValveStates function sets the DD spare valve states with a * 8-bit set of states - one bit per valve, with a 1 meaning "energized" and a 0 * meaning "de-energized". Bit positions per HDD (2.0 valves - beta 1/1.9 to be deprecated): - * 0 - D88 valve (Spare valve 0).\n - * 1 - D83 valve (Spare valve 1).\n - * 2 - D91 valve (Spare valve 2).\n - * 3 - D104 valve (Spare valve 3).\n - * 4 - D95 valve (Spare valve 4).\n + * 0 - D88 valve.\n + * 1 - D83 valve.\n + * 2 - D91 valve.\n + * 3 - D104 valve.\n + * 4 - D95 valve.\n * 5 - Spare valve 5.\n - * 6 - D100 valve (Spare valve 6).\n + * 6 - D100 valve.\n * 7 - Spare valve 7.\n * @details \b Inputs: none * @details \b Outputs: fpgaDDSpareValveControl @@ -1071,7 +1072,7 @@ *************************************************************************/ void setFPGAD48PumpSpeed( U16 speed ) { -#ifdef __MAXON_SPEED_UPDATE__ /* Enable for B1.0/B1.9 with Diener Silencer 2000 pumps */ +#ifdef __MAXON_SPEED_UPDATE__ //TODO: Enable for Beat 1/1.9 with Diener silencer 2000 pump. { U16 currentSpeed =(U16)( ( ( speed + PUMP_SPEED_OFFSET ) / PUMP_SPEED_FULL_SCALE ) * MAX_PUMP_SPEED ); SET_FPGA_ACTUATOR_FIELD( fpgaD48PumpSpeed, currentSpeed );