Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r6be821de57d67cf638e4da6dbbda72b293bd091e -rc2df1e4a1b450f5d83d2d3fc5c671e16c270e5d7 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 6be821de57d67cf638e4da6dbbda72b293bd091e) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision c2df1e4a1b450f5d83d2d3fc5c671e16c270e5d7) @@ -49,7 +49,6 @@ #define LOAD_CELL_MIN_ALLOWED_WEIGHT_BEFORE_TARE_GRAMS 1600.0F ///< Load cell minimum allowed weight before tare in grams. #define LOAD_CELL_WEIGHT_OUT_RANGE_PERSISTENT_PERIOD_MS (5 * MS_PER_SECOND) ///< Load cell weight out of range persistent period in milliseconds. #define LOAD_CELL_PRIMARY_BACKUP_MAX_DRIFT_PERSISTENT_PERIOD_MS (5 * MS_PER_SECOND) ///< Load cell primary and backup maximum allowed weight drift persistent period in milliseconds. -#define EMPTY_RESERVOIR_WEIGHT_GRAMS 1700.0F ///< Reservoirs empty weight in grams. #define MAX_ALLOWED_EXTRA_WEIGHT_BEFORE_FIRST_TARE_GRAMS 300.0F ///< Max allowed extra weight before first tare in grams. #define HEAT_ACTIVE_COOL_MAX_ALLOWED_EXTRA_WEIGHT_TARE_GRAMS 200.0F ///< Heat disinfect active cool max allowed weight before tare in grams. #define MAX_ALLOWED_EXTRA_WEIGHT_BEFORE_TARE_GRAMS 60.0F ///< Max allowed extra weight before tare in grams. @@ -88,7 +87,8 @@ static U32 smallReadingsIdx; ///< Index for next sample in load cell small rolling average sample array. static U32 largeReadingsIdx; ///< Index for next sample in load cell large rolling average sample array. static DG_LOAD_CELLS_CAL_RECORD_T loadCellsCalRecord; ///< Load cells calibration record. -static BOOL hasLoadCellBeenTared[ NUM_OF_LOAD_CELLS ]; ///< Flags indicating whether loadcells have been tared yet. +static DG_RESERVOIR_VOLUME_RECORD_T reservoirsCalRecord; ///< DG reservoirs non-volatile record. +static BOOL hasLoadCellBeenTared[ NUM_OF_LOAD_CELLS ]; ///< Flags indicating whether load cells have been tared yet. // ********** private function prototypes ********** @@ -202,14 +202,31 @@ // Check if a new calibration is available if ( TRUE == isNewCalibrationRecordAvailable() ) { + F32 reservoir1EmptyWeightG = EMPTY_RESERVOIR_WEIGHT_GRAMS; + F32 reservoir2EmptyWeightG = EMPTY_RESERVOIR_WEIGHT_GRAMS; + + getNVRecord2Driver( GET_CAL_RSRVRS_VOL_RECORD, (U08*)&reservoirsCalRecord, sizeof( DG_RESERVOIR_VOLUME_RECORD_T ), + NUM_OF_CAL_DATA_RSRVRS, ALARM_ID_DG_RESERVOIRS_INVALID_CAL_RECORD ); + getNVRecord2Driver( GET_CAL_LOAD_CELL_SENSORS, (U08*)&loadCellsCalRecord, sizeof( DG_LOAD_CELLS_CAL_RECORD_T ), NUM_OF_CAL_DATA_LOAD_CELLS, ALARM_ID_DG_LOAD_CELLS_INVALID_CAL_RECORD ); + if ( reservoirsCalRecord.reservoir[ CAL_DATA_RSRVR_1 ].rsrvrUnfilledWeight != 0.0F ) + { + // Use the hard coded empty reservoir weight until the cal data is available + reservoir1EmptyWeightG = ( reservoirsCalRecord.reservoir[ CAL_DATA_RSRVR_1 ].rsrvrUnfilledWeight ); + } + + if ( reservoirsCalRecord.reservoir[ CAL_DATA_RSRVR_2 ].rsrvrUnfilledWeight != 0.0F ) + { + reservoir2EmptyWeightG = ( reservoirsCalRecord.reservoir[ CAL_DATA_RSRVR_2 ].rsrvrUnfilledWeight ); + } + // Zero the current tare values when new calibration data is available - loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].autoCalOffset = EMPTY_RESERVOIR_WEIGHT_GRAMS; - loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].autoCalOffset = EMPTY_RESERVOIR_WEIGHT_GRAMS; - loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].autoCalOffset = EMPTY_RESERVOIR_WEIGHT_GRAMS; - loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].autoCalOffset = EMPTY_RESERVOIR_WEIGHT_GRAMS; + loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].autoCalOffset = reservoir1EmptyWeightG; + loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].autoCalOffset = reservoir1EmptyWeightG; + loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].autoCalOffset = reservoir2EmptyWeightG; + loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].autoCalOffset = reservoir2EmptyWeightG; } // Rolling average of last 100 raw samples in small filter @@ -303,10 +320,14 @@ SELF_TEST_STATUS_T execLoadCellsSelfTest ( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + BOOL calStatus = FALSE; - BOOL calStatus = getNVRecord2Driver( GET_CAL_LOAD_CELL_SENSORS, (U08*)&loadCellsCalRecord, sizeof( DG_LOAD_CELLS_CAL_RECORD_T ), - NUM_OF_CAL_DATA_LOAD_CELLS, ALARM_ID_DG_LOAD_CELLS_INVALID_CAL_RECORD ); + calStatus |= getNVRecord2Driver( GET_CAL_LOAD_CELL_SENSORS, (U08*)&loadCellsCalRecord, sizeof( DG_LOAD_CELLS_CAL_RECORD_T ), + NUM_OF_CAL_DATA_LOAD_CELLS, ALARM_ID_DG_LOAD_CELLS_INVALID_CAL_RECORD ); + calStatus |= getNVRecord2Driver( GET_CAL_RSRVRS_VOL_RECORD, (U08*)&reservoirsCalRecord, sizeof( DG_RESERVOIR_VOLUME_RECORD_T ), + NUM_OF_CAL_DATA_RSRVRS, ALARM_ID_DG_RESERVOIRS_INVALID_CAL_RECORD ); + if ( TRUE == calStatus ) { result = SELF_TEST_STATUS_PASSED; Index: firmware/App/Controllers/LoadCell.h =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -rc2df1e4a1b450f5d83d2d3fc5c671e16c270e5d7 --- firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision c2df1e4a1b450f5d83d2d3fc5c671e16c270e5d7) @@ -30,6 +30,7 @@ */ // ********** public definitions ********** +#define EMPTY_RESERVOIR_WEIGHT_GRAMS 1700.0F ///< Reservoirs empty weight in grams. // ********** public function prototypes ********** Index: firmware/App/Modes/ModeService.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -rc2df1e4a1b450f5d83d2d3fc5c671e16c270e5d7 --- firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Modes/ModeService.c (.../ModeService.c) (revision c2df1e4a1b450f5d83d2d3fc5c671e16c270e5d7) @@ -17,6 +17,7 @@ #include "ConcentratePumps.h" #include "CPLD.h" +#include "LoadCell.h" #include "ModeService.h" #include "OperationModes.h" @@ -59,6 +60,11 @@ deenergizeActuators( NO_PARK_CONC_PUMPS ); initServiceMode(); setCurrentSubState( NO_SUB_STATE ); + resetLoadCellOffset( LOAD_CELL_RESERVOIR_1_PRIMARY ); + resetLoadCellOffset( LOAD_CELL_RESERVOIR_1_BACKUP ); + resetLoadCellOffset( LOAD_CELL_RESERVOIR_2_PRIMARY ); + resetLoadCellOffset( LOAD_CELL_RESERVOIR_2_BACKUP ); + return serviceState; }