Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -rcd7ff5665a2ac5142e29c0cad5339af0639e7c57 -r417631131615f93f77d6d1bfe44c385a8eab6d5b --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision cd7ff5665a2ac5142e29c0cad5339af0639e7c57) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 417631131615f93f77d6d1bfe44c385a8eab6d5b) @@ -7,8 +7,8 @@ * * @file ConductivitySensors.c * -* @author (last) Dara Navaei -* @date (last) 28-Mar-2023 +* @author (last) Bill Bracken +* @date (last) 31-Mar-2023 * * @author (original) Quang Nguyen * @date (original) 13-Jul-2020 @@ -57,7 +57,7 @@ #define MIN_RO_ONLY_COND_SENSOR_CPI_HIGH_US_PER_CM 90.0F ///< Minimum RO only mode high conductivity value in uS/cm. #define MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< New reading every 800 ms, expect to get valid new reading in 1s. -#define MAX_CONDUCTIVITY_SENSOR_FAILURES 5 ///< maximum number of conductivity sensor errors within window period before alarm. +#define MAX_CONDUCTIVITY_SENSOR_FAILURES 2 ///< maximum number of conductivity sensor errors within window period before alarm. #define MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ( 60 * MS_PER_SECOND ) ///< Conductivity sensor error window. #define COND_SENSOR_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity sensor out of range error. @@ -78,6 +78,9 @@ #define EMSTAT_CPI_OR_CD1_INDEX 0 ///< Emstat board CPi index number. #define EMSTAT_CPO_OR_CD2_INDEX 1 ///< Emstat board CPo index number. +#define EMSTAT_PACKAGE_BUFFER_SIZE 50 ///< EmStat package buffer size +#define EMSTAT_RX_FIFO_COUNT_MASK 0x7FFF ///< EmStat Rx fifo count mask + #define DATA_PUBLISH_COUNTER_START_COUNT 40 ///< Data publish counter start count. #define COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ( 1 * MS_PER_SECOND ) ///< Conductivity sensor bad status persistence period. #define COND_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Conductivity sensors FPGA error timeout in milliseconds. @@ -108,7 +111,7 @@ { BOOL packageStarted; ///< Emstat package started flag. U08 packageIndex; ///< Emstat package index number. - U08 package[ 50 ]; ///< Emstat read buffer package. + U08 package[ EMSTAT_PACKAGE_BUFFER_SIZE ]; ///< Emstat read buffer package. EMSTAT_COND_SENSORS_T sensors[ EMSTAT_NUM_OF_SENSORS_PER_BOARD ]; ///< Emstat conductivity and corresponding temperature sensors. } EMSTAT_READ_T; @@ -117,9 +120,11 @@ { U08 readCount; ///< Conductivity sensor FPGA read count (For V3). U32 internalErrorCount; ///< Conductivity sensor internal error count. + U32 badCharErrorCount; ///< Conductivity sensor bad char error count OVERRIDE_F32_T compensatedCondValue; ///< Conductivity sensor compensated value F32 rawCondValue; ///< Conductivity sensor raw value. U32 sensorStatus; ///< Conductivity sensor status. + U32 rawEmstatCondValue; ///< Conductivity sensor from Emstat. } COND_SENSOR_STATUS_T; #pragma pack(pop) @@ -186,6 +191,7 @@ emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CPO_SENSOR; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrTempSnsr = TEMPSENSORS_OUTLET_PRIMARY_HEATER; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrHex2StrAlarm = ALARM_ID_DG_CPO_COND_SENSOR_INVALID_CHAR; + // CD1/CD2 Emstat board conductivity sensors and their corresponding temperature sensors // NOTE: For CD1, use TD2 temperature sensor for compensation since it is a more accurate temperature sensor emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CD1_SENSOR; @@ -202,11 +208,6 @@ initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR, MAX_CONDUCTIVITY_SENSOR_FAILURES, MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ); initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE, INLET_WATER_COND_SENSOR_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_COND_SENSOR_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, INLET_WATER_COND_SENSOR_OUT_OF_RANGE_CLEAR_MS, INLET_WATER_COND_SENSOR_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_DG_CPI_COND_SENSOR_INVALID_CHAR, COND_SENSORS_BAD_CHAR_TIME_OUT_MS, COND_SENSORS_BAD_CHAR_TIME_OUT_MS ); - initPersistentAlarm( ALARM_ID_DG_CPO_COND_SENSOR_INVALID_CHAR, COND_SENSORS_BAD_CHAR_TIME_OUT_MS, COND_SENSORS_BAD_CHAR_TIME_OUT_MS ); - initPersistentAlarm( ALARM_ID_DG_CD1_COND_SENSOR_INVALID_CHAR, COND_SENSORS_BAD_CHAR_TIME_OUT_MS, COND_SENSORS_BAD_CHAR_TIME_OUT_MS ); - initPersistentAlarm( ALARM_ID_DG_CD2_COND_SENSOR_INVALID_CHAR, COND_SENSORS_BAD_CHAR_TIME_OUT_MS, COND_SENSORS_BAD_CHAR_TIME_OUT_MS ); initPersistentAlarm( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_HIGH, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_LOW, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); @@ -537,24 +538,34 @@ static void processEmstatBoard( EMSTAT_BOARD_T board ) { U08 emstatByte = 0; - U08 fpgaErrorCount = 0; + U16 rxFifoCount = 0; switch ( board ) { case EMSTAT_CPI_CPO_BOARD: - emstatByte = getFPGAEmstatCPiCPoByteOut(); - fpgaErrorCount = getFPGAEmstatCPiCPoRxErrCount(); + // Check for continuous incoming bytes + rxFifoCount = getFPGAEmstatCPiCPoRxFifoCount() & EMSTAT_RX_FIFO_COUNT_MASK; + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_CPI_CPO_COND_SENSORS, rxFifoCount ); - checkFPGAPersistentErrorCountAlarm( FPGA_PERS_ERROR_CPI_CPO_COND_SENSORS, fpgaErrorCount ); - processEmstatSensorRead( &emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ], emstatByte ); + // Only process the sensor read if there is a new byte + if ( 0 != rxFifoCount ) + { + emstatByte = getFPGAEmstatCPiCPoByteOut(); + processEmstatSensorRead( &emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ], emstatByte ); + } break; case EMSTAT_CD1_CD2_BOARD: - emstatByte = getFPGAEmstatCD1CD2OutByte(); - fpgaErrorCount = getFPGAEmstatCD1CD2RxErrCount(); + // Check for continuous incoming bytes + rxFifoCount = getFPGAEmstatCD1CD2RxFifoCount() & EMSTAT_RX_FIFO_COUNT_MASK; + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_CD1_CD2_COND_SENSORS, rxFifoCount ); - checkFPGAPersistentErrorCountAlarm( FPGA_PERS_ERROR_CD1_CD2_COND_SENSORS, fpgaErrorCount ); - processEmstatSensorRead( &emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ], emstatByte ); + // Only process the sensor read if there is a new byte + if ( 0 != rxFifoCount) + { + emstatByte = getFPGAEmstatCD1CD2OutByte(); + processEmstatSensorRead( &emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ], emstatByte ); + } break; default: @@ -601,7 +612,10 @@ default: if ( TRUE == readPackage->packageStarted ) { - readPackage->package[ readPackage->packageIndex++ ] = emstatByte; + if ( readPackage->packageIndex < EMSTAT_PACKAGE_BUFFER_SIZE ) + { + readPackage->package[ readPackage->packageIndex++ ] = emstatByte; + } } break; } @@ -620,6 +634,7 @@ *************************************************************************/ static void processEmstatMeasurementDataPackets( U08 boardSensorIndex, EMSTAT_READ_T* readPackage, EMSTAT_VARIABLE_T* receivedPackets ) { + CONDUCTIVITY_SENSORS_T sensorId = readPackage->sensors[ boardSensorIndex ].condSnsr; BOOL convStatus = hexStrToDec( (U08*)&receivedPackets->status, &condSensorStatus[ sensorId ].sensorStatus, sizeof( receivedPackets->status ) ); BOOL isSensorStatusBad = ( EMSTAT_PICO_STATUS_TIMING_NOT_MET == condSensorStatus[ sensorId ].sensorStatus ? TRUE : FALSE ); @@ -629,8 +644,9 @@ if ( FALSE == isSensorStatusBad ) { U32 prefix = prefixStrToSIFactor( receivedPackets->prefix ); - convStatus = hexStrToDec( receivedPackets->value, &condSensorStatus[ sensorId ].sensorStatus, sizeof( receivedPackets->value ) ); - F32 resistance = ( ( F32 )( condSensorStatus[ sensorId ].sensorStatus - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); + convStatus = hexStrToDec( receivedPackets->value, &condSensorStatus[ sensorId ].rawEmstatCondValue, sizeof( receivedPackets->value ) ); + + F32 resistance = ( ( F32 )( condSensorStatus[ sensorId ].rawEmstatCondValue - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); F32 temperature = getTemperatureValue( readPackage->sensors[ boardSensorIndex ].condSnsrTempSnsr ); F32 conductivity = ( 1.0F / resistance ) * SIEMENS_TO_MICROSIEMENS_CONVERSION; F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); @@ -642,15 +658,23 @@ isConvNotValid = ( TRUE == convStatus ? FALSE : TRUE ); // Check the conductivity sensors bad status alarm - checkPersistentAlarm( badHexAlarm, isConvNotValid, isConvNotValid, COND_SENSORS_BAD_CHAR_TIME_OUT_MS ); - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, isSensorStatusBad, condSensorStatus[ sensorId ].sensorStatus, - EMSTAT_PICO_STATUS_TIMING_NOT_MET ); + if ( TRUE == isConvNotValid ) + { + if ( ++condSensorStatus[ sensorId ].badCharErrorCount > MAX_CONDUCTIVITY_SENSOR_FAILURES ) + { + SET_ALARM_WITH_1_U32_DATA( badHexAlarm, sensorId ); + } + } + else + { + condSensorStatus[ sensorId ].badCharErrorCount = 0; + } if ( EMSTAT_PICO_STATUS_TIMING_NOT_MET == condSensorStatus[ sensorId ].sensorStatus ) { if ( ++condSensorStatus[ sensorId ].internalErrorCount > MAX_CONDUCTIVITY_SENSOR_FAILURES ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId, condSensorStatus[ sensorId ].sensorStatus ); } } else Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rff676a9640e5dfe162de78d2b24f356f63bad5bb -r417631131615f93f77d6d1bfe44c385a8eab6d5b --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ff676a9640e5dfe162de78d2b24f356f63bad5bb) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 417631131615f93f77d6d1bfe44c385a8eab6d5b) @@ -7,8 +7,8 @@ * * @file Heaters.c * -* @author (last) Michael Garthwaite -* @date (last) 16-Mar-2023 +* @author (last) Bill Bracken +* @date (last) 31-Mar-2023 * * @author (original) Dara Navaei * @date (original) 23-Apr-2020 @@ -114,7 +114,7 @@ static HEATERS_STATE_T handleHeaterStateTrimmerRampToTarget( void ); static HEATERS_STATE_T handleHeaterStateTrimmerControlToTarget( void ); -static void setHeaterDutyCycle( DG_HEATERS_T heater, F32 pwm ); +static void setHeaterDutyCycle( DG_HEATERS_T heater ); static F32 calculatePrimaryHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static F32 calculateTrimmerHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static BOOL haveHeaterControlConditionsChanged( DG_HEATERS_T heater ); @@ -339,7 +339,8 @@ // Check if the heater is requested to be off if ( FALSE == heatersStatus[ heater ].isHeaterOn ) { - setHeaterDutyCycle( heater, HEATERS_MIN_DUTY_CYCLE ); + heatersStatus[ heater ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; + setHeaterDutyCycle( heater ); heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; } } @@ -558,7 +559,8 @@ heatersStatus[ DG_PRIMARY_HEATER ].calculatedTemperatureC = targetTemperature; heatersStatus[ DG_PRIMARY_HEATER ].targetFlowLPM = targetFlowLPM; heatersStatus[ DG_PRIMARY_HEATER ].nomTargetFlowLPM = getTargetROPumpFlowRateLPM(); - setHeaterDutyCycle( heater, dutyCycle ); + heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = dutyCycle; + setHeaterDutyCycle( heater ); return state; } @@ -590,7 +592,8 @@ heatersStatus[ heater ].calculatedTemperatureC = targetTemperature; heatersStatus[ heater ].targetFlowLPM = targetFlow; heatersStatus[ heater ].hasTargetTempChanged = FALSE; - setHeaterDutyCycle( heater, dutyCycle ); + heatersStatus[ heater ].dutyCycle.data = dutyCycle; + setHeaterDutyCycle( heater ); } return state; @@ -614,18 +617,24 @@ if ( currentTemperature < targetTemperature ) { - setHeaterDutyCycle( DG_TRIMMER_HEATER, HEATERS_MAX_DUTY_CYCLE ); - setHeaterDutyCycle( DG_PRIMARY_HEATER, HEATERS_MAX_DUTY_CYCLE ); + heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_MAX_DUTY_CYCLE; + heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_MAX_DUTY_CYCLE; + setHeaterDutyCycle( DG_TRIMMER_HEATER ); + setHeaterDutyCycle( DG_PRIMARY_HEATER ); } else if ( currentTemperature - targetTemperature < HEATERS_DISINFECT_TEMPERATURE_DRIFT_C ) { - setHeaterDutyCycle( DG_TRIMMER_HEATER, HEATERS_DISINFECT_DUTY_CYCLE ); - setHeaterDutyCycle( DG_PRIMARY_HEATER, HEATERS_DISINFECT_DUTY_CYCLE ); + heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_DISINFECT_DUTY_CYCLE; + heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_DISINFECT_DUTY_CYCLE; + setHeaterDutyCycle( DG_TRIMMER_HEATER ); + setHeaterDutyCycle( DG_PRIMARY_HEATER ); } else { - setHeaterDutyCycle( DG_TRIMMER_HEATER, HEATERS_MIN_DUTY_CYCLE ); - setHeaterDutyCycle( DG_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE ); + heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; + heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; + setHeaterDutyCycle( DG_TRIMMER_HEATER ); + setHeaterDutyCycle( DG_PRIMARY_HEATER ); } return state; @@ -689,8 +698,8 @@ heatersStatus[ heater ].isThisFirstControl = TRUE; // Cap the minimum duty cycle. So if it is calculated to negative, set it to 0 - dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); - setHeaterDutyCycle( heater, dutyCycle ); + heatersStatus[ heater ].dutyCycle.data = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); + setHeaterDutyCycle( heater ); return state; } @@ -733,8 +742,8 @@ tempDutyCycle = heatersStatus[ heater ].dutyCycle.data + dutyCycle; tempDutyCycle = MIN( tempDutyCycle, HEATERS_MAX_DUTY_CYCLE ); tempDutyCycle = MAX( tempDutyCycle, HEATERS_MIN_DUTY_CYCLE ); - - setHeaterDutyCycle( heater, tempDutyCycle ); + heatersStatus[ heater ].dutyCycle.data = tempDutyCycle; + setHeaterDutyCycle( heater ); } return state; @@ -749,14 +758,13 @@ * @param pwm: The PWM that is set * @return none *************************************************************************/ -static void setHeaterDutyCycle( DG_HEATERS_T heater, F32 pwm ) +static void setHeaterDutyCycle( DG_HEATERS_T heater ) { if ( heater < NUM_OF_DG_HEATERS ) { F32 duty; - heatersStatus[ heater ].dutyCycle.data = pwm; - duty = getHeaterDutyCycle( heater ); + duty = getHeaterDutyCycle( heater ); if ( DG_PRIMARY_HEATER == heater ) { @@ -1008,9 +1016,8 @@ else #endif { - // TODO this is not working on DVT-002 - // If the system is DVT, check the FPGA persistent alarm of the main primary heater's voltage ADC - //checkFPGAPersistentAlarms( FPGA_PERS_ERROR_MAIN_PRIMARY_HEATER_VOLTAGE_ADC, getFPGAHeaterGateADCErrorCount(), getFPGAHeaterGateADCReadCount() ); + // If the system is DVT, check the FPGA persistent alarm of the main primary heater's voltage ADC + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_MAIN_PRIMARY_HEATER_VOLTAGE_ADC, getFPGAHeaterGateADCReadCount() ); } isMainPriOut = ( fabs( mainPriExpectedVoltage - mainPriVoltage ) > HEATERS_VOLTAGE_TOLERANCE_V ? TRUE : FALSE ); @@ -1053,7 +1060,7 @@ if ( TRUE == heatersStatus[ (DG_HEATERS_T)heater ].isHeaterOn ) { - setHeaterDutyCycle( (DG_HEATERS_T)heater, value ); + setHeaterDutyCycle( (DG_HEATERS_T)heater ); } } } @@ -1078,11 +1085,8 @@ result = TRUE; heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.override = OVERRIDE_RESET; heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovData = heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovInitData; + setHeaterDutyCycle( (DG_HEATERS_T)heater ); - if ( TRUE == heatersStatus[ (DG_HEATERS_T)heater ].isHeaterOn ) - { - setHeaterDutyCycle( (DG_HEATERS_T)heater, heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.data ); - } } return result; Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -rcd7ff5665a2ac5142e29c0cad5339af0639e7c57 -r417631131615f93f77d6d1bfe44c385a8eab6d5b --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision cd7ff5665a2ac5142e29c0cad5339af0639e7c57) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 417631131615f93f77d6d1bfe44c385a8eab6d5b) @@ -7,8 +7,8 @@ * * @file TemperatureSensors.c * -* @author (last) Dara Navaei -* @date (last) 15-Mar-2023 +* @author (last) Bill Bracken +* @date (last) 28-Mar-2023 * * @author (original) Dara Navaei * @date (original) 08-Apr-2020 @@ -868,56 +868,51 @@ *************************************************************************/ static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues( void ) { - U32 errorCount = 0; U32 readCount = 0; - errorCount = (U32)getFPGARTDErrorCount(); readCount = (U32)getFPGARTDReadCount(); - checkFPGAPersistentAlarms( FPGA_PERS_ERROR_TWO_WIRE_ADC_TEMP_SENSORS, errorCount, readCount ); + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_TWO_WIRE_ADC_TEMP_SENSORS, readCount ); processTempSnsrsADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER, getFPGATPiTemp() ); processTempSnsrsADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER, getFPGATPoTemp() ); processTempSnsrsADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1, getFPGACD1Temp() ); processTempSnsrsADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2, getFPGACD2Temp() ); processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR, getFPGACondSnsrInternalTemp() ); #ifndef _RELEASE_ - if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) + if ( ( getHardwareConfigStatus() != HW_CONFIG_BETA ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) #endif { - if ( getCurrentOperationMode() != DG_MODE_INIT ) - { - errorCount = (U32)getFPGATHdErrorCount(); - readCount = (U32)getFPGATHdReadCount(); + readCount = (U32)getFPGATHdReadCount(); - checkFPGAPersistentAlarms( FPGA_PERS_ERROR_THD_ADC_TEMP_SENSORS, errorCount, readCount ); - processTempSnsrsADCRead( TEMPSENSORS_HEAT_DISINFECT, getFPGATHdTemp() ); - processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_THD_RTD, getFPGATHdInternalTemp() ); + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_THD_ADC_TEMP_SENSORS, readCount ); + processTempSnsrsADCRead( TEMPSENSORS_HEAT_DISINFECT, getFPGATHdTemp() ); - // Make sure the baro sensor coefficients are not corrupted - checkBaroSensorCRC(); + // Make sure the baro sensor coefficients are not corrupted + checkBaroSensorCRC(); - baroConvConsts.refTemperature = getFPGABaroReferenceTemperature(); - baroConvConsts.temperatureCoeff = getFPGABaroTempCoeffOfTemperature(); - errorCount = getFPGABaroErrorCount(); - readCount = getFPGABaroReadCount(); + processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_THD_RTD, getFPGATHdInternalTemp() ); - checkFPGAPersistentAlarms( FPGA_PERS_ERROR_BARO_SENSOR, errorCount, readCount ); - processTempSnsrsADCRead( TEMPSENSORS_BAROMETRIC_TEMP_SENSOR, getFPGABaroTemperature() ); - } + // Make sure the baro sensor coefficients are not corrupted + checkBaroSensorCRC(); + + baroConvConsts.refTemperature = getFPGABaroReferenceTemperature(); + baroConvConsts.temperatureCoeff = getFPGABaroTempCoeffOfTemperature(); + readCount = getFPGABaroReadCount(); + + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_BARO_SENSOR, readCount ); + processTempSnsrsADCRead( TEMPSENSORS_BAROMETRIC_TEMP_SENSOR, getFPGABaroTemperature() ); } - errorCount = (U32)getFPGATRoErrorCount(); readCount = (U32)getFPGATRoReadCount(); - checkFPGAPersistentAlarms( FPGA_PERS_ERROR_TRO_ADC_TEMP_SENSORS, errorCount, readCount ); + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_TRO_ADC_TEMP_SENSORS, readCount ); processTempSnsrsADCRead( TEMPSENSORS_OUTLET_REDUNDANT, getFPGATRoTemp() ); processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_TRO_RTD, getFPGATRoInternalTemp() ); - errorCount = (U32)getFPGATDiErrorCount(); readCount = (U32)getFPGATDiReadCount(); - checkFPGAPersistentAlarms( FPGA_PERS_ERROR_TDI_ADC_TEMP_SENSORS, errorCount, readCount ); + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_TDI_ADC_TEMP_SENSORS, readCount ); processTempSnsrsADCRead( TEMPSENSORS_INLET_DIALYSATE, getFPGATDiTemp() ); processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_TDI_RTD, getFPGATDiInternalTemp() ); Index: firmware/App/Controllers/Voltages.c =================================================================== diff -u -r9d81cf1a22a20dcbd60dce18f9e8acaeff742d85 -r417631131615f93f77d6d1bfe44c385a8eab6d5b --- firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 9d81cf1a22a20dcbd60dce18f9e8acaeff742d85) +++ firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 417631131615f93f77d6d1bfe44c385a8eab6d5b) @@ -7,8 +7,8 @@ * * @file Voltages.c * -* @author (last) James Walter Taylor -* @date (last) 30-Nov-2022 +* @author (last) Bill Bracken +* @date (last) 10-Mar-2023 * * @author (original) Sean Nash * @date (original) 21-Apr-2021 @@ -316,37 +316,37 @@ *************************************************************************/ static void checkVoltageRanges( void ) { - U32 i; + MONITORED_VOLTAGES_T channel; // Check range - for ( i = 0; i <= MONITORED_LINE_LAST_RANGE_CHECKED_LINE; i++ ) + for ( channel = MONITORED_LINE_FIRST_VOLTAGE; channel <= MONITORED_LINE_LAST_RANGE_CHECKED_LINE; channel++ ) { - F32 volts = getMonitoredLineLevel( (MONITORED_VOLTAGES_T)i ); + F32 volts = getMonitoredLineLevel( channel ); - if ( ( isSafetyShutdownActivated() != TRUE ) || ( ( i != MONITORED_LINE_24V_MAIN ) && ( i != MONITORED_LINE_24V_POWER_PRIM_HTR_V ) ) ) + if ( ( isSafetyShutdownActivated() != TRUE ) || ( ( channel != MONITORED_LINE_24V_MAIN ) && ( channel != MONITORED_LINE_24V_POWER_PRIM_HTR_V ) ) ) { - if ( volts > MAX_VOLTAGES[ i ] ) + if ( volts > MAX_VOLTAGES[ channel ] ) { - if ( ++voltageAlarmPersistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) + if ( ++voltageAlarmPersistenceCtr[ channel ] > VOLTAGES_ALARM_PERSISTENCE ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)channel, volts ) } } - else if ( volts < MIN_VOLTAGES[ i ] ) + else if ( volts < MIN_VOLTAGES[ channel ] ) { - if ( ++voltageAlarmPersistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) + if ( ++voltageAlarmPersistenceCtr[ channel ] > VOLTAGES_ALARM_PERSISTENCE ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)channel, volts ) } } else { - voltageAlarmPersistenceCtr[ i ] = 0; + voltageAlarmPersistenceCtr[ channel ] = 0; } } else { - voltageAlarmPersistenceCtr[ i ] = 0; + voltageAlarmPersistenceCtr[ channel ] = 0; } } } Index: firmware/App/Controllers/Voltages.h =================================================================== diff -u -r9d81cf1a22a20dcbd60dce18f9e8acaeff742d85 -r417631131615f93f77d6d1bfe44c385a8eab6d5b --- firmware/App/Controllers/Voltages.h (.../Voltages.h) (revision 9d81cf1a22a20dcbd60dce18f9e8acaeff742d85) +++ firmware/App/Controllers/Voltages.h (.../Voltages.h) (revision 417631131615f93f77d6d1bfe44c385a8eab6d5b) @@ -7,8 +7,8 @@ * * @file Voltages.h * -* @author (last) Dara Navaei -* @date (last) 11-Jan-2023 +* @author (last) Bill Bracken +* @date (last) 14-Mar-2023 * * @author (original) Sean Nash * @date (original) 21-Apr-2021 @@ -33,8 +33,9 @@ /// Enumeration of voltages monitored by this module. typedef enum Voltages -{ - MONITORED_LINE_24V_MAIN = 0, ///< Main voltage (24V) (non-isolated) +{ + MONITORED_LINE_24V_MAIN = 0, ///< First voltage in list + MONITORED_LINE_FIRST_VOLTAGE = MONITORED_LINE_24V_MAIN, ///< Main voltage (24V) (non-isolated) MONITORED_LINE_1_8V_FPGA, ///< FPGA logic voltage (1.8V) MONITORED_LINE_1V_FPGA, ///< FPGA reference voltage (1V) MONITORED_LINE_3_3V_SENSORS, ///< Sensors voltage (3.3V) Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -r9bb4c963e60cef18d211e286ff2276c4471a122e -r417631131615f93f77d6d1bfe44c385a8eab6d5b --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 9bb4c963e60cef18d211e286ff2276c4471a122e) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 417631131615f93f77d6d1bfe44c385a8eab6d5b) @@ -7,8 +7,8 @@ * * @file WatchdogMgmt.c * -* @author (last) Dara Navaei -* @date (last) 17-Jan-2023 +* @author (last) Bill Bracken +* @date (last) 14-Mar-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -116,12 +116,14 @@ if ( PIN_SIGNAL_LOW == getCPLDWatchdogExpired() ) { // ignore expired watchdog until after watchdog POST - if ( ( WATCHDOG_SELF_TEST_STATE_COMPLETE == watchdogSelfTestState ) || - ( getCurrentOperationMode() != DG_MODE_INIT ) ) - { -#ifndef DEBUG_ENABLED + if ( getCurrentOperationMode() != DG_MODE_INIT ) + { + /* DEBUG WARNING + * It may be necessary to comment out the following + * line to prevent the alarm from occurring while + * debugging. + */ activateAlarmNoData( ALARM_ID_DG_WATCHDOG_EXPIRED ); -#endif } } }