Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r0c296cef29037819be204c45a23d4d38a52b2718 -r984bfc66d6fe07456671a1039472356871f0161c --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 0c296cef29037819be204c45a23d4d38a52b2718) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 984bfc66d6fe07456671a1039472356871f0161c) @@ -54,11 +54,13 @@ #define LOAD_CELL_PRIMARY_BACKUP_MAX_ALLOWED_DRIFT_GRAMS 60.0F ///< Load cell primary and backup maximum allowed weight drift in grams. #define DATA_PUBLISH_COUNTER_START_COUNT 0 ///< Data publish counter start count. #define LOAD_CELL_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Load cell FPGA error timeout in milliseconds. +#define LOAD_CELL_FPGA_SIGN_BIT 0x800000 ///< Load cell FPGA sign bit. +#define LOAD_CELL_SIGN_EXTENSION 0xFF800000 ///< Load cell FPGA sign bit extension. /// Load cell data structure. typedef struct { - U32 rawReading; ///< Latest raw load cell reading. + S32 rawReading; ///< Latest raw load cell reading. OVERRIDE_F32_T weight; ///< Latest load cell weight. F32 autoCalOffset; ///< Load cell auto-calibration offset. F32 loadCellVelocity_g_min; ///< Velocity (in g/min) of load cell. @@ -168,16 +170,26 @@ U32 b2 = getFPGALoadCellB2(); // Check error bits from new readings - U32 a1Err = ( a1 >> SHIFT_BITS_BY_31 ) << SHIFT_24_BITS; - U32 a2Err = ( a2 >> SHIFT_BITS_BY_31 ) << SHIFT_16_BITS_FOR_WORD_SHIFT; - U32 b1Err = ( b1 >> SHIFT_BITS_BY_31 ) << SHIFT_8_BITS_FOR_BYTE_SHIFT; + U32 a1Err = ( a1 >> SHIFT_BITS_BY_31 ); + U32 a2Err = ( a2 >> SHIFT_BITS_BY_31 ); + U32 b1Err = ( b1 >> SHIFT_BITS_BY_31 ); U32 b2Err = ( b2 >> SHIFT_BITS_BY_31 ); - loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].rawReading = ( 0 == a1Err ? a1 & MASK_OFF_U32_MSB : loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].rawReading ); - loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].rawReading = ( 0 == a2Err ? a2 & MASK_OFF_U32_MSB : loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].rawReading ); - loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].rawReading = ( 0 == b1Err ? b1 & MASK_OFF_U32_MSB : loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].rawReading ); - loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].rawReading = ( 0 == b2Err ? b2 & MASK_OFF_U32_MSB : loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].rawReading ); + U32 a1Sign = ( ( a1 & MASK_OFF_U32_MSB ) & LOAD_CELL_FPGA_SIGN_BIT ) >> SHIFT_BITS_BY_23; + U32 a2Sign = ( ( a2 & MASK_OFF_U32_MSB ) & LOAD_CELL_FPGA_SIGN_BIT ) >> SHIFT_BITS_BY_23; + U32 b1Sign = ( ( b1 & MASK_OFF_U32_MSB ) & LOAD_CELL_FPGA_SIGN_BIT ) >> SHIFT_BITS_BY_23; + U32 b2Sign = ( ( b2 & MASK_OFF_U32_MSB ) & LOAD_CELL_FPGA_SIGN_BIT ) >> SHIFT_BITS_BY_23; + S32 a1Signed = (S32)( 1 == a1Sign ? ( a1 & MASK_OFF_U32_MSB ) | LOAD_CELL_SIGN_EXTENSION : ( a1 & MASK_OFF_U32_MSB ) ); + S32 a2Signed = (S32)( 1 == a2Sign ? ( a2 & MASK_OFF_U32_MSB ) | LOAD_CELL_SIGN_EXTENSION : ( a2 & MASK_OFF_U32_MSB ) ); + S32 b1Signed = (S32)( 1 == b1Sign ? ( b1 & MASK_OFF_U32_MSB ) | LOAD_CELL_SIGN_EXTENSION : ( b1 & MASK_OFF_U32_MSB ) ); + S32 b2Signed = (S32)( 1 == b2Sign ? ( b2 & MASK_OFF_U32_MSB ) | LOAD_CELL_SIGN_EXTENSION : ( b2 & MASK_OFF_U32_MSB ) ); + + loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].rawReading = ( 0 == a1Err ? a1Signed : loadcells[ LOAD_CELL_RESERVOIR_1_PRIMARY ].rawReading ); + loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].rawReading = ( 0 == a2Err ? a2Signed : loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].rawReading ); + loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].rawReading = ( 0 == b1Err ? b1Signed : loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].rawReading ); + loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].rawReading = ( 0 == b2Err ? b2Signed : loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].rawReading ); + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_LOAD_CELL_A1_B1_SENSORS, getFPGAADC1ErrorCount(), getFPGAADC1ReadCount() ); checkFPGAPersistentAlarms( FPGA_PERS_ERROR_LOAD_CELL_A2_B2_SENSORS, getFPGAADC2ErrorCount(), getFPGAADC2ReadCount() );