Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -62,6 +62,29 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 0 ///< Data publish counter start count. +/*************************DVT Definitions********************************************/ + +#define CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP 0x07 ///< Concentrate pump control 1/8th step. +#define CONCENTRATE_PUMP_CONTROL_REVERSE_DIR 0x08 ///< Concentrate pump control reverse direction. +#define CONCENTRATE_PUMP_CONTROL_FORWARD_DIR 0x00 ///< Concentrate pump control forward direction. +#define CONCENTRATE_PUMP_CONTROL_ENABLE 0x00 ///< Concentrate pump control enable pump. +#define CONCENTRATE_PUMP_CONTROL_NOT_RESET 0x20 ///< Concentrate pump control not reset. +#define CONCENTRATE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Concentrate pump control sleep off. + +static const U32 CONCENTRATE_PUMP_CONTROL_FORWARD = CONCENTRATE_PUMP_CONTROL_SLEEP_OFF | + CONCENTRATE_PUMP_CONTROL_NOT_RESET | + CONCENTRATE_PUMP_CONTROL_ENABLE | + CONCENTRATE_PUMP_CONTROL_FORWARD_DIR | + CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP; ///< Concentrate pump control forward. + +static const U32 CONCENTRATE_PUMP_CONTROL_REVERSE = CONCENTRATE_PUMP_CONTROL_SLEEP_OFF | + CONCENTRATE_PUMP_CONTROL_NOT_RESET | + CONCENTRATE_PUMP_CONTROL_ENABLE | + CONCENTRATE_PUMP_CONTROL_REVERSE_DIR | + CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP; ///< Concentrate pump control reverse. + +/*************************DVT Definitions********************************************/ + /// Enumeration of concentrate pump states. typedef enum ConcentratePumpState { @@ -84,8 +107,8 @@ U16 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). U08 direction; ///< Concentrate pump motor direction. - void ( *control )( U08 ); ///< Concentrate pump FPGA control function pointer. - void ( *setStepSpeed )( U16 ); ///< Concentrate pump FPGA set step speed function pointer. + U08 controlSet; ///< Concentrate pump control set. (Used in DVT) + F32 pulseWidthUS; ///< Concentrate pump pulse width in microseconds. } CONCENTRATE_PUMP_T; // ********** private data ********** @@ -100,17 +123,12 @@ static DG_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. static DG_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. -static F32 cp1PulsetemporaryRemove; -static F32 cp2PulsetemporaryRemove; - - // ********** private function prototypes ********** static void stopConcentratePump( CONCENTRATE_PUMPS_T pumpId ); static CONCENTRATE_PUMP_STATE_T handleConcentratePumpOffState( CONCENTRATE_PUMPS_T pumpId ); static CONCENTRATE_PUMP_STATE_T handleConcentratePumpRampToTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ); static CONCENTRATE_PUMP_STATE_T handleConcentratePumpControlTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ); - static BOOL stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ); static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ); @@ -124,23 +142,16 @@ void initConcentratePump( void ) { CONCENTRATE_PUMPS_T pumpId; - concentratePumpMonitorTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].control = &setFPGACP1Control; - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].setStepSpeed = &setFPGACP1SetStepSpeed; - - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].control = &setFPGACP2Control; - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].setStepSpeed = &setFPGACP2SetStepSpeed; - for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; - concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; - + concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 + concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT stopConcentratePump( pumpId ); } @@ -179,40 +190,40 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); } - calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); + calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); - // Get CP1 specifications - U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; - F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); - - // Get CP2 specifications - U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; - F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); - + U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; + F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; + F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); + U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; + F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; + F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + // Use the above values to prepare the broadcast data data.cp1CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1SetSpeed * -1.0 : cp1SetSpeed ); data.cp1MeasuredSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1Speed * -1.0 : cp1Speed ); data.cp2CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp2Direction ? cp2SetSpeed * -1.0 : cp2SetSpeed ); data.cp2MeasuredSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp2Direction ? cp2Speed * -1.0 : cp2Speed ); data.cp1State = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState; data.cp2State = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState; + data.cp1PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pulseWidthUS; + data.cp2PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pulseWidthUS; - data.cp1PulseInSeconds = cp1PulsetemporaryRemove; - data.cp2PulseInSeconds = cp2PulsetemporaryRemove; - #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONC_PUMPS_SPEED_ALARM ) != SW_CONFIG_ENABLE_VALUE ) #endif { - F32 cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - F32 cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - checkPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, cp1Error > CONCENTRATE_PUMP_ERROR_TOLERANCE, cp1Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); - checkPersistentAlarm( ALARM_ID_CP2_SPEED_CONTROL_ERROR, cp2Error > CONCENTRATE_PUMP_ERROR_TOLERANCE, cp2Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); + F32 cp1TargetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; + F32 cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - cp1TargetSpeed ) / cp1TargetSpeed; + BOOL isCP1SpeedOut = ( cp1Error > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); + + F32 cp2TargetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; + F32 cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - cp2TargetSpeed ) / cp2TargetSpeed; + BOOL isCP2SpeedOut = ( cp2Error > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, isCP1SpeedOut, cp1Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); + checkPersistentAlarm( ALARM_ID_CP2_SPEED_CONTROL_ERROR, isCP2SpeedOut, cp2Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); } concentratePumpMonitorTimerCounter = 0; @@ -247,10 +258,13 @@ concentratePumps[ pumpId ].execState = handleConcentratePumpControlTargetSpeedState( pumpId ); break; +#ifndef _VECTORCAST_ + // The switch case is in a for loop so the default case cannot be covered in VectorCAST default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, pumpId ) concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; break; +#endif } } } @@ -277,14 +291,7 @@ calStatus |= getNVRecord2Driver( GET_CAL_CONCENTRATE_PUMPS_RECORD, (U08*)&concentratePumpsCalRecord, sizeof( DG_CONC_PUMPS_CAL_RECORD_T ), NUM_OF_CAL_DATA_DG_CONC_PUMPS, ALARM_ID_NO_ALARM ); - if ( TRUE == calStatus ) - { - result = SELF_TEST_STATUS_PASSED; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } + result = ( TRUE == calStatus ? SELF_TEST_STATUS_PASSED : SELF_TEST_STATUS_FAILED ); return result; } @@ -328,10 +335,8 @@ { if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { -#ifndef DISABLE_CONC_PUMPS concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; - concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; -#endif + concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; } else { @@ -355,12 +360,14 @@ { if ( targetSpeed_ml_min >= 0.0 ) { - concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; + concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 + concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT } else { - concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_REVERSE_DIR; - targetSpeed_ml_min *= -1.0; + concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_REVERSE_DIR; // For V3 + concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_REVERSE; // For DV + targetSpeed_ml_min *= -1.0; } if ( ( CONCENTRATE_PUMP_MIN_SPEED <= targetSpeed_ml_min ) && ( targetSpeed_ml_min <= CONCENTRATE_PUMP_MAX_SPEED ) ) @@ -477,8 +484,16 @@ concentratePumps[ pumpId ].currentPumpSpeed = 0.0; concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; - concentratePumps[ pumpId ].control( CONCENTRATE_PUMP_OFF_CONTROL ); - concentratePumps[ pumpId ].setStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) + { + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAV3AcidPumpControl( CONCENTRATE_PUMP_OFF_CONTROL ) : + setFPGAV3BicarbPumpControl( CONCENTRATE_PUMP_OFF_CONTROL ); + } +#endif + + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ) : + setFPGABicarbSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } /*********************************************************************//** @@ -496,9 +511,20 @@ if ( TRUE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) { - U08 controlValue = ( CONCENTRATE_PUMP_ON_CONTROL | concentratePumps[ pumpId ].direction ); + U08 controlSet = 0; +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) + { + controlSet = ( CONCENTRATE_PUMP_ON_CONTROL | concentratePumps[ pumpId ].direction ); + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAV3AcidPumpControl( controlSet ) : setFPGAV3BicarbPumpControl( controlSet ); + } + else +#endif + { + controlSet = concentratePumps[ pumpId ].controlSet; + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpControl( controlSet ) : setFPGABicarbPumpControl( controlSet ); + } - concentratePumps[ pumpId ].control( controlValue ); state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } @@ -544,7 +570,6 @@ if ( ++concentratePumps[ pumpId ].controlTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) { concentratePumps[ pumpId ].controlTimerCounter = 0; - stepConcentratePumpToTargetSpeed( pumpId ); } @@ -569,7 +594,6 @@ static BOOL stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ) { F32 speedIncrease; - BOOL hasTgtBeenReached = FALSE; F32 currentToTargetDiff = fabs( concentratePumps[ pumpId ].pumpTargetSpeed - concentratePumps[ pumpId ].currentPumpSpeed ); @@ -605,7 +629,8 @@ concentratePumps[ pumpId ].togglePeriodCount = CONCENTRATE_PUMP_ZERO_FLOW_RATE; } - concentratePumps[ pumpId ].setStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ) : + setFPGABicarbSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); return hasTgtBeenReached; } @@ -622,36 +647,27 @@ *************************************************************************/ static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ) { - if ( ( concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState != CONCENTRATE_PUMP_OFF_STATE ) && - ( concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState != CONCENTRATE_PUMP_OFF_STATE ) ) + //if ( ( concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState != CONCENTRATE_PUMP_OFF_STATE ) && + // ( concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState != CONCENTRATE_PUMP_OFF_STATE ) ) // DEBUG_DENALI + if ( TRUE ) { - F32 pulseWidthInMicroSecond = (F32)pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; - BOOL isPulseWidthOut = ( pulseWidthInMicroSecond <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); + F32 pulseWidthInMicroSeconds = (F32)pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; + BOOL isPulseWidthOut = ( pulseWidthInMicroSeconds <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); + concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; - // TODO once the pulse is figured out remove this code - if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) - { - cp1PulsetemporaryRemove = pulseWidthInMicroSecond; - } - else - { - cp2PulsetemporaryRemove = pulseWidthInMicroSecond; - } - // TODO once the pulse is figured out remove this code - - checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSecond, + checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSeconds, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); if ( FALSE == isPulseWidthOut ) { - concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSecond ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; } } - else + /*else { // Clear the alarm condition checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, FALSE, 0, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); - } + }*/ if ( CONCENTRATE_PUMP_ZERO_FLOW_RATE == pulseWidthCount ) { Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r669f36cf32c3b500aa2fd5b08c58ee5e6b2e7f08 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 669f36cf32c3b500aa2fd5b08c58ee5e6b2e7f08) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -50,8 +50,8 @@ F32 cp2MeasuredSpeed; ///< Concentrate pump CP2 measured speed U32 cp1State; ///< Concentrate pump CP1 current state U32 cp2State; ///< Concentrate pump CP2 current state - F32 cp1PulseInSeconds; ///< Concentrate pump CP1 pulse in seconds - F32 cp2PulseInSeconds; ///< Concentrate pump CP2 pulse in seconds + F32 cp1PulseUS; ///< Concentrate pump CP1 pulse in microseconds + F32 cp2PulseUS; ///< Concentrate pump CP2 pulse in microseconds } CONCENTRATE_PUMP_DATA_T; // ********** public function prototypes ********** Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -79,8 +79,24 @@ U16 status; ///< Status for measurement data package U08 reserved2[4]; ///< Comma separator and index of current range } EMSTAT_VARIABLE_T; + +/// Emstat board structure +typedef struct +{ + BOOL packageStarted; ///< Emstat package started flag. + U08 packageIndex; ///< Emstat package index number. + U08 package[ 50 ]; ///< Emstat read buffer package. +} EMSTAT_READ_T; #pragma pack(pop) +/// Emstat boards for CPi/CPo and CD1/CD2 +typedef enum EmstatBoards +{ + CPI_CPO_EMSTAT_BOARD = 0, ///< Emstat CPi/CPo board. + CD1_CD2_EMSTAT_BOARD, ///< Emstat CD1/CD2 board. + NUM_OF_EMSTAT_BOARDS ///< Number of Emstat boards. +} EMSTAT_BOARD_T; + // ********** private data ********** /// Conductivity sensors' associated temperature sensors @@ -98,16 +114,21 @@ static F32 rawConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest raw conductivity values. static F32 roRejectionRatio; ///< Latest RO rejection ratio. static U32 sensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest sensor hardware status. - static OVERRIDE_U32_T conductivityDataPublishInterval = { COND_SENSOR_REPORT_PERIOD, COND_SENSOR_REPORT_PERIOD, 0, 0 }; ///< Conductivity sensors publish time interval override. static U32 conductivityDataPublicationTimerCounter; ///< Conductivity sensors data publish timer counter. +static EMSTAT_READ_T emstatBoardRead[ NUM_OF_EMSTAT_BOARDS ]; ///< EMSTAT board read. static BOOL packageStarted; ///< Flag to indicate the start of a package measurement data. static U08 packageIndex; ///< Current package measurement data bytes index. static U08 package[ 50 ]; ///< Storage of package bytes until ready to process. static DG_COND_SENSORS_CAL_RECORD_T condSensorsCalRecord; ///< Conductivity sensors' calibration record. +// TODo can we combine the two +static BOOL newPackageStarted; +static U08 newPackageIndex; +static U08 newPackage[ 50 ]; + // ********** private function prototypes ********** static F32 calcCompensatedConductivity( F32 conductivity, F32 temperature ); @@ -116,7 +137,8 @@ static U32 prefixStrToSIFactor( U08 prefix ); static void processMeasurementDataPackage( U32 sensorId ); -static void processCD1CD2SensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ); +static void processCD1CD2EmstatSensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ); +static void processEmstatSensorRead( CONDUCTIVITY_SENSORS_T sensor, U16 fpgaReadCount, U08 fpgaErrorCount ); static F32 getCalibrationAppliedConductivityValue( U32 sensorId, F32 compensatedValue ); /*********************************************************************//** @@ -128,36 +150,38 @@ *************************************************************************/ void initConductivitySensors( void ) { - U32 i; - + U08 i; roRejectionRatio = 0.0; packageIndex = 0U; packageStarted = FALSE; conductivityDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) { - readCount[ i ] = 0; - internalErrorCount[ i ] = 0; - rawConductivityValues[ i ] = 0.0; - + readCount[ i ] = 0; + internalErrorCount[ i ] = 0; + rawConductivityValues[ i ] = 0.0; compensatedConductivityValues[ i ].data = 0.0; compensatedConductivityValues[ i ].ovData = 0.0; compensatedConductivityValues[ i ].ovInitData = 0.0; compensatedConductivityValues[ i ].override = OVERRIDE_RESET; - benignPolynomialCalRecord( &condSensorsCalRecord.condSensors[ i ] ); } - setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); - setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); + for ( i = 0; i < NUM_OF_EMSTAT_BOARDS; i++ ) + { + memset( &emstatBoardRead[ i ], 0x0, sizeof( EMSTAT_BOARD_T ) ); + } - 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, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, RO_REJECTION_RATIO_PERSISTENCE_PERIOD, RO_REJECTION_RATIO_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); // TODO can we leave this here? + setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); // TODO can we leave this here? + + 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, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, RO_REJECTION_RATIO_PERSISTENCE_PERIOD, RO_REJECTION_RATIO_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); } /*********************************************************************//** @@ -177,12 +201,12 @@ getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); } - - processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); #ifndef ENABLE_DVT_BOARD + processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPO_SENSOR, getFPGACPo(), getFPGACPoReadCount(), getFPGACPoErrorCount(), getFPGACPoFault() ); #endif - processCD1CD2SensorRead( getFPGAEmstatRxFifoCount(), getFPGAEmstatRxErrCount() ); + processCD1CD2EmstatSensorRead( getFPGAEmstatRxFifoCount(), getFPGAEmstatRxErrCount() ); + processEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); // TODO can this be replacing the top function? if ( ++conductivityDataPublicationTimerCounter >= getU32OverrideValue( &conductivityDataPublishInterval ) ) { @@ -223,19 +247,10 @@ SELF_TEST_STATUS_T execConductivitySensorsSelfTest( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; - - BOOL calStatus = getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), + BOOL calStatus = getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); + result = ( TRUE == calStatus ? SELF_TEST_STATUS_PASSED : SELF_TEST_STATUS_FAILED ); - if ( TRUE == calStatus ) - { - result = SELF_TEST_STATUS_PASSED; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } - return result; } @@ -393,14 +408,14 @@ { if ( ( readCount[ sensorId ] != fpgaReadCount ) ) { - F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); - F32 conductivity = ( (F32)( fgpaRead ) / COND_SENSOR_DECIMAL_CONVERSION ); + F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); + F32 conductivity = ( (F32)( fgpaRead ) / COND_SENSOR_DECIMAL_CONVERSION ); F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); - readCount[ sensorId ] = fpgaReadCount; - internalErrorCount[ sensorId ] = 0; + readCount[ sensorId ] = fpgaReadCount; + internalErrorCount[ sensorId ] = 0; compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); - rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CPi and CPo + rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CPi and CPo } else { @@ -474,12 +489,22 @@ *************************************************************************/ static void processMeasurementDataPackage( U32 sensorId ) { - EMSTAT_VARIABLE_T const * const measurementPtr = (EMSTAT_VARIABLE_T *)&package; - U32 status = hexStrToDec( (U08 *)&measurementPtr->status, sizeof( measurementPtr->status ) ); - sensorStatus[ sensorId ] = status; + //EMSTAT_VARIABLE_T const * const measurementPtr = (EMSTAT_VARIABLE_T *)&package; // TODO remove + EMSTAT_VARIABLE_T* measurementPtr; - if ( EMSTAT_PICO_GOOD_STATUS == status ) + if ( ( CONDUCTIVITYSENSORS_CD1_SENSOR == sensorId ) || ( CONDUCTIVITYSENSORS_CD2_SENSOR == sensorId ) ) { + measurementPtr = (EMSTAT_VARIABLE_T *)&package; + } + else + { + measurementPtr = (EMSTAT_VARIABLE_T *)&newPackage; + } + + sensorStatus[ sensorId ] = hexStrToDec( (U08 *)&measurementPtr->status, sizeof( measurementPtr->status ) ); + + if ( EMSTAT_PICO_GOOD_STATUS == sensorStatus[ sensorId ] ) + { U32 prefix = prefixStrToSIFactor( measurementPtr->prefix ); F32 resistance = ( ( F32 )( hexStrToDec( measurementPtr->value, sizeof( measurementPtr->value ) ) - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); @@ -491,20 +516,20 @@ rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CD1 and CD2 // Clear the alarm - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, FALSE, status, EMSTAT_PICO_GOOD_STATUS ); + checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, FALSE, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); } else { #ifndef DISABLE_COND_STATUS_CHECK - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, TRUE, status, EMSTAT_PICO_GOOD_STATUS ); + checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, TRUE, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); #endif } - if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == status ) + if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == sensorStatus[ sensorId ] ) { if ( ++internalErrorCount[ sensorId ] > MAX_CONDUCTIVITY_SENSOR_FAILURES ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); // TODO DVT + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); } } else @@ -520,17 +545,17 @@ * it raises an alarm. If the read count has changed, the new reading will be processed. * @details Inputs: none * @details Outputs: none - * @param fpgaReadCount FPGA read count for rx fifo + * @param fpgaReadCount FPGA read count for Rx FIFO * @param fpgaErrorCount FPGA error count * @return none *************************************************************************/ -static void processCD1CD2SensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ) +static void processCD1CD2EmstatSensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ) { - if ( fpgaErrorCount == 0 ) + if ( 0 == fpgaErrorCount ) { - if ( ( fpgaReadCount > 0 ) && ( ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) == 0 ) ) + if ( ( fpgaReadCount > 0 ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) ) { - U08 const emstatByte = getFPGAEmstatOutByte(); + U08 emstatByte = getFPGAEmstatCD1CD2OutByte(); switch ( emstatByte ) { @@ -540,23 +565,23 @@ break; case ';': - if ( packageStarted ) + if ( TRUE == packageStarted ) { processMeasurementDataPackage( CONDUCTIVITYSENSORS_CD1_SENSOR ); packageIndex = 0; } break; case '\n': - if ( packageStarted ) + if ( TRUE == packageStarted ) { processMeasurementDataPackage( CONDUCTIVITYSENSORS_CD2_SENSOR ); packageStarted = FALSE; } break; default: - if ( packageStarted ) + if ( TRUE == packageStarted ) { package[ packageIndex++ ] = emstatByte; } @@ -572,12 +597,54 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_COND_SENSOR_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); // TODO DVT + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); } } } } +static void processEmstatSensorRead( CONDUCTIVITY_SENSORS_T sensor, U16 fpgaReadCount, U08 fpgaErrorCount ) +{ + if ( 0 == fpgaErrorCount ) + { + if ( ( fpgaReadCount > 0 ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) ) + { + U08 emstatByte = getFPGAEmstatCPiCPoByteOut(); + + switch ( emstatByte ) + { + case 'P': + newPackageStarted = TRUE; + newPackageIndex = 0; + break; + + case ';': + if ( TRUE == newPackageStarted ) + { + processMeasurementDataPackage( CONDUCTIVITYSENSORS_CPI_SENSOR ); + newPackageIndex = 0; + } + break; + + case '\n': + if ( TRUE == newPackageStarted ) + { + processMeasurementDataPackage( CONDUCTIVITYSENSORS_CPO_SENSOR ); + newPackageStarted = FALSE; + } + break; + + default: + if ( TRUE == newPackageStarted ) + { + newPackage[ newPackageIndex++ ] = emstatByte; + } + break; + } + } + } +} + /*********************************************************************//** * @brief * The getCalibrationAppliedConductivityValue function gets the temperature Index: firmware/App/Controllers/DialysateFlow.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/DialysateFlow.c (.../DialysateFlow.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Controllers/DialysateFlow.c (.../DialysateFlow.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -52,8 +52,8 @@ static OVERRIDE_F32_T measuredDialysateFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< Measured Dialysate flow rate (in L/min). -static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. -static U32 flowFilterCounter = 0; ///< Flow filtering counter. +static S32 measuredFlowReadingsSum; ///< Raw flow reading sums for averaging. +static U32 flowFilterCounter; ///< Flow filtering counter. static DG_FLOW_SENSORS_CAL_RECORD_T flowSensorsCalRecord; ///< Flow sensors calibration record. // ********** private function prototypes ********** @@ -138,7 +138,7 @@ measuredDialysateFlowRateLPM.data = pow(flow, 4) * flowSensorsCalRecord.flowSensors[ CAL_DATA_DIALYSATE_FLOW_SENSOR ].fourthOrderCoeff + pow(flow, 3) * flowSensorsCalRecord.flowSensors[ CAL_DATA_DIALYSATE_FLOW_SENSOR ].thirdOrderCoeff + pow(flow, 2) * flowSensorsCalRecord.flowSensors[ CAL_DATA_DIALYSATE_FLOW_SENSOR ].secondOrderCoeff + - flow * flowSensorsCalRecord.flowSensors[ CAL_DATA_DIALYSATE_FLOW_SENSOR ].gain + + flow * flowSensorsCalRecord.flowSensors[ CAL_DATA_DIALYSATE_FLOW_SENSOR ].gain + flowSensorsCalRecord.flowSensors[ CAL_DATA_DIALYSATE_FLOW_SENSOR ].offset; // If the flow is less than a certain value, FPGA will return 0xFFFF meaning that the flow is 0. @@ -148,11 +148,11 @@ } measuredFlowReadingsSum = 0; - flowFilterCounter = 0; + flowFilterCounter = 0; } - currentFlow = getMeasuredDialysateFlowRate(); - isFlowOutOfUpperRange = currentFlow > MAX_DIALYSATE_FLOWRATE_LPM; + currentFlow = getMeasuredDialysateFlowRate(); + isFlowOutOfUpperRange = ( currentFlow > MAX_DIALYSATE_FLOWRATE_LPM ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_DIALYSATE_FLOW_RATE_OUT_OF_RANGE, isFlowOutOfUpperRange, currentFlow, MAX_DIALYSATE_FLOWRATE_LPM ); // Publish dialysate flow meter data on the CAN bus according to the specified interval Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -53,26 +53,19 @@ #define MINIMUM_TARGET_TEMPERATURE 10.0F ///< Minimum allowed target temperature for the heaters. #define MAXIMUM_TARGET_TEMPERATURE 90.0F ///< Maximum allowed target temperature for the heaters. -#define MAXIMUM_IDLE_DRAIN_TARGET_TEMPERATURE 58.0F ///< Maximum allowed target temperature for the idle and drain modes. -#define HEATERS_CONTROL_STATE_CHECK_INTERVAL_COUNT ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Temperature sensors interval count. -#define HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ( ( 3 * MS_PER_SECOND ) / TASK_PRIORITY_INTERVAL ) ///< Heaters are on but there is no sufficient flow timeout in counts. -#define HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C 170.0F ///< Heaters max allowed internal temperature in C. -#define HEATERS_MAX_ALLOWED_COLD_JUNCTION_TEMPERATURE_C 80.0F ///< Heaters max allowed cold junction temperature in C. -#define HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heaters max allowed internal temperature timeout in milliseconds. #define HEATERS_ON_NO_FLOW_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Heaters on with no flow time out in milliseconds. #define HEATERS_MAX_OPERATING_VOLTAGE_V 24.0F ///< Heaters max operating voltage in volts. #define HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Heaters voltage out of range time out in milliseconds. #define HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL 0.2F ///< Heaters max voltage out of range tolerance. -#define HEATERS_MIN_RAMP_TIME_MS ( 6 * MS_PER_SECOND ) ///< Heaters minimum time that they have to stay in the ramp state in milliseconds. #define TRIMMER_HEATER_MAX_POWER_W 66.5F ///< Trimmer heater maximum power in Watts. +#define TRIMMER_HEATER_CONTROL_CHECK_INTERVAL_COUNT ( ( 30 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. #define DELTA_TEMPERATURE_TIME_COSNTANT_C 8.6F ///< Delta temperature calculated from time constant. -#define MAXIMUM_ALLOWED_TARGET_TEMPERATURE_DEVIATION_C 2.5F ///< Maximum allowed temperature deviation from target temperature in C. #define PRIMARY_HEATER_DUTY_CYCLE_PER_TEMPERATURE_C 0.03F ///< Primary heaters duty cycle per temperature in C. #define DATA_PUBLISH_COUNTER_START_COUNT 70 ///< Data publish counter start count. -static const F32 WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES = 4184 / SEC_PER_MIN; ///< Water specific heat in J/KgC / 60. +static const F32 WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES = 4184 / SEC_PER_MIN; ///< Water specific heat in J/KgC / 60. static const F32 PRIMARY_HEATERS_MAXIMUM_POWER_WATTS = 475 + 237.5F; ///< Primary heaters maximum power (main primary = 475W and small primary = 237.5W). /// Heaters exec states @@ -105,6 +98,7 @@ static HEATER_STATUS_T heatersStatus[ NUM_OF_DG_HEATERS ]; ///< Heaters status. static U32 dataPublicationTimerCounter; ///< Data publication timer counter. +static U32 trimmerHeaterControlCounter; ///< Trimmer heater control counter. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. // ********** private function prototypes ********** @@ -132,13 +126,15 @@ * The initHeaters initializes the heaters driver. * @details Inputs: none * @details Outputs: voltageMonitorTimeCounter, heaterStatus, - * hasTreatmentInternalTempBeenSet, dataPublicationTimerCounter + * hasTreatmentInternalTempBeenSet, dataPublicationTimerCounter, + * trimmerHeaterControlCounter * @return none *************************************************************************/ void initHeaters( void ) { DG_HEATERS_T heater; dataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + trimmerHeaterControlCounter = 0; for ( heater = DG_PRIMARY_HEATER; heater < NUM_OF_DG_HEATERS; heater++ ) { @@ -544,8 +540,10 @@ } // Update the calculated target temperature - heatersStatus[ DG_TRIMMER_HEATER ].calculatedTemperature = currentTemperature; - heatersStatus[ DG_TRIMMER_HEATER ].inactiveRsrvr = getInactiveReservoir(); + heatersStatus[ heater ].calculatedTemperature = currentTemperature; + heatersStatus[ heater ].inactiveRsrvr = getInactiveReservoir(); + heatersStatus[ heater ].targetFlow = targetFlowLPM; + trimmerHeaterControlCounter = 0; setHeaterDutyCycle( heater, dutyCycle ); return state; @@ -554,9 +552,9 @@ /*********************************************************************//** * @brief * The handleHeaterStateTrimmerControlToTarget function handles the trimmer - * heater's control to target. - * @details Inputs: heaterStatus - * @details Outputs: heaterStatus + * heater's control to target state. + * @details Inputs: heaterStatus, trimmerHeaterControlCounter + * @details Outputs: heaterStatus, trimmerHeaterControlCounter * @return next state of the state machine *************************************************************************/ static HEATERS_STATE_T handleHeaterStateTrimmerControlToTarget( void ) @@ -569,6 +567,17 @@ { state = HEATER_EXEC_STATE_TRIMMER_RAMP_TO_TARGET; } + else if ( ++trimmerHeaterControlCounter > TRIMMER_HEATER_CONTROL_CHECK_INTERVAL_COUNT ) + { + // When the trimmer heater is on, its duty cycle is adjusted at the control interval. For this control check, + // dialysate inlet temperature sensor is used rather than the theoretical calculations. + F32 outletRedundantTemperature = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); // TODO Change to TRo in DVT + F32 targetTemperature = heatersStatus[ DG_TRIMMER_HEATER ].targetTemp; + F32 targetFlowLPM = heatersStatus[ DG_TRIMMER_HEATER ].targetFlow; + F32 dutyCycle = calculateTrimmerHeaterDutyCycle( targetTemperature, outletRedundantTemperature, targetFlowLPM, TRUE ); + trimmerHeaterControlCounter = 0; + setHeaterDutyCycle( DG_TRIMMER_HEATER, dutyCycle ); + } return state; } @@ -632,7 +641,7 @@ // If the last fill temperature > target temperature, it means the primary heater overshot the duty cycle // so with its efficiency is toned down for the next fill cycle // If the heater under-shoots the duty cycle, the efficiency increases the duty cycle for the next fill cycle - if ( lastFillTemperature - primaryTargetTemperature > MAXIMUM_ALLOWED_TARGET_TEMPERATURE_DEVIATION_C ) + if ( lastFillTemperature - primaryTargetTemperature < NEARLY_ZERO ) { heaterEfficiency -= ( lastFillTemperature - primaryTargetTemperature ) * PRIMARY_HEATER_DUTY_CYCLE_PER_TEMPERATURE_C; } @@ -641,7 +650,9 @@ heaterEfficiency += ( primaryTargetTemperature - lastFillTemperature ) * PRIMARY_HEATER_DUTY_CYCLE_PER_TEMPERATURE_C; } - heaterEfficiency = ( heaterEfficiency <= 0.0 ? 0.0 : heaterEfficiency ); + // If the efficiency is less than 0, set it to 0 but if the efficiency is greater than 100, it is not enforced + // to be 100 since the duty cycle range check will cap the duty cycle to 100 anyways. + heaterEfficiency = MAX( heaterEfficiency, 0.0 ); // Update the heaters efficiency heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency = heaterEfficiency; @@ -654,8 +665,8 @@ fabs( targetTemperature - currentTemperature ) * flow ) / PRIMARY_HEATERS_MAXIMUM_POWER_WATTS ) * heaterEfficiency; // Check the boundaries of the calculated duty cycle - dutyCycle = ( dutyCycle > HEATERS_MAX_DUTY_CYCLE ? HEATERS_MAX_DUTY_CYCLE : dutyCycle ); - dutyCycle = ( dutyCycle < HEATERS_MIN_DUTY_CYCLE ? HEATERS_MIN_DUTY_CYCLE : dutyCycle ); + dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); + dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); return dutyCycle; } @@ -685,11 +696,13 @@ { if ( TRUE == checkEfficiency ) { - // TODO Do we need to recalculate the efficiency? + // TODO Do we need efficiency for the trimmer heater? } } - dutyCycle = ( flow * WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * ( targetTemperature - currentTemperature ) * heaterEfficiency ) / TRIMMER_HEATER_MAX_POWER_W; + // Duty cycle = ( 69.73 * flow rate * deltaT / primary heater maximum power ) and multiply the duty cycle to the heater efficiency + dutyCycle = ( ( flow * WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * + ( targetTemperature - currentTemperature ) * heaterEfficiency ) / TRIMMER_HEATER_MAX_POWER_W ) * heaterEfficiency; // Check the boundaries of the calculated duty cycle dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); @@ -827,14 +840,7 @@ checkPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPri, mainPriVoltageTol ); checkPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isSmallPriOut, smallPri, smallPriVoltageTol ); - //checkPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmer, trimmerVoltageTol ); // TODO check this voltage - - // TODO test code remove - if ( TRUE == isAlarmActive(ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE)) - { - BOOL test = FALSE; - } - // TODO test code remove + checkPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmer, trimmerVoltageTol ); } Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -167,10 +167,10 @@ loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].rawReading = b2 & MASK_OFF_U32_MSB; // Check error bits from new readings - a1 = ( a1 >> 31 ) << SHIFT_24_BITS; - a2 = ( a2 >> 31 ) << SHIFT_16_BITS_FOR_WORD_SHIFT; - b1 = ( b1 >> 31 ) << SHIFT_8_BITS_FOR_BYTE_SHIFT; - b2 = ( b2 >> 31 ); + a1 = ( a1 >> SHIFT_BITS_BY_31 ) << SHIFT_24_BITS; + a2 = ( a2 >> SHIFT_BITS_BY_31 ) << SHIFT_16_BITS_FOR_WORD_SHIFT; + b1 = ( b1 >> SHIFT_BITS_BY_31 ) << SHIFT_8_BITS_FOR_BYTE_SHIFT; + b2 = ( b2 >> SHIFT_BITS_BY_31 ); if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_DG_LOAD_CELL_ADC_ERROR, ( ( a1 > 0 ) || ( a2 > 0 ) || ( b1 > 0 ) || ( b2 > 0 ) ) ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_LOAD_CELL_ADC_ERROR, ( a1 | a2 | b1 | b2 ) ) @@ -311,7 +311,7 @@ } else { - isWeightOutOfRange = ( /*fabs*/( weight ) > MAX_ALLOWED_EXTRA_WEIGHT_BEFORE_TARE_GRAMS ? TRUE : FALSE ); + isWeightOutOfRange = ( fabs( weight ) > MAX_ALLOWED_EXTRA_WEIGHT_BEFORE_TARE_GRAMS ? TRUE : FALSE ); } if ( FALSE == isWeightOutOfRange ) Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -135,7 +135,6 @@ *************************************************************************/ void checkInletWaterPressure( void ) { -#ifndef DISABLE_WATER_QUALITY_CHECK #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WATER_QUALITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif @@ -153,7 +152,6 @@ checkPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, FALSE, pressure, MAX_INLET_WATER_PRESSURE_WARNING_LOW ); } } -#endif } /*********************************************************************//** Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -35,11 +35,11 @@ // ********** private definitions ********** #define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 8U ///< Primary heater external temperature sensors gain. -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 19600U ///< Primary heater external temperature sensors reference resistance. +#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 20000//*/19600U // 20000 for dvt ///< Primary heater external temperature sensors reference resistance. #define PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U ///< Primary heater external temperature sensors zero degree resistance. #define COND_SENSORS_TEMP_SENSOR_GAIN 8U ///< Temperature sensor for conductivity gain. -#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U ///< Temperature sensor for conductivity reference resistance. +#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 20000///19600U ///< Temperature sensor for conductivity reference resistance. #define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U ///< Temperature sensor for conductivity zero degree resistance. #define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gain. @@ -53,7 +53,7 @@ #define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors. #define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 to create a 4 for averaging 4 samples. #define SHIFT_BITS_BY_2_FOR_AVERAGING 2U ///< Shift the ADCs of the temperature sensors by 2 to average them. -#define INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for temperature sensors out of range error period. +#define INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Inlet water temperature sensors timeout in milliseconds. #define MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE 22.0F ///< Low range minimum water input temperature. #define MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE 24.0F ///< Low range maximum water input temperature. @@ -79,15 +79,14 @@ #define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 ///< Heaters internal temperature sensor fault. #define TEMP_SENSORS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Temperature sensors publish data time interval. -#define TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ( 5 * MS_PER_SECOND ) ///< Temperature sensors FPGA error persistent period. -#define TEMPERATURE_SENSORS_INTERNAL_ERROR_PERSISTENT_PERIOD ( 3 * MS_PER_SECOND ) ///< Temperature sensors internal error persistent period. +#define TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Temperature sensors FPGA error timeout in milliseconds. #define FPGA_RAW_ADC_READ_INTERVAL_COUNT 8 ///< Time interval in counts to read the raw ADC reads from FPGA. -#define TEMPERATURE_SENSORS_ERROR_FLAG_PERSISTENT_PERIOD ( 5 * MS_PER_SECOND ) ///< Temperature sensors error flag persistent period. +#define TEMP_SENSORS_ERROR_BIT_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Temperature sensors error bit timeout in milliseconds. #define TEMP_SENSORS_MIN_ALLOWED_DEGREE_C 0.0F ///< Temperature sensors minimum allowed temperature in C. #define TEMP_SENSORS_MAX_ALLOWED_DEGREE_C 120.0F ///< Temperature sensors maximum allowed temperature in C. #define NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C 80.0F ///< Non fluid temperature sensors path maximum allowed temperature in C. -#define TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS ( 5 * MS_PER_SECOND ) ///< Temperature sensor out of range persistent period in milliseconds. +#define TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS ( 5 * MS_PER_SECOND ) ///< Temperature sensor out of range persistent period in milliseconds. #define DATA_PUBLISH_COUNTER_START_COUNT 30 ///< Data publish counter start count. // The count cannot be within 0.1V of the rail on both sides therefore: @@ -119,8 +118,11 @@ S32 adcRunningSum; ///< ADC running sum U32 readCount; ///< Read counts from FPGA OVERRIDE_F32_T temperatureValues; ///< Temperature values with override - F32 maxAllowedTemperature; ///< Maximum allowed temperature of the sensor + F32 maxAllowedTemp; ///< Maximum allowed temperature of the sensor U32 alarmStartTime; ///< Alarm start time + U08 sensorErrorBitStatus; ///< Temperature sensor error bit status + BOOL fpgaErrorStatus; ///< Temperature sensor FPGA error status + BOOL adcErrorStatus; ///< Temperature sensor ADC error status } TEMP_SENSOR_T; // ********** private data ********** @@ -167,13 +169,12 @@ static F32 getADC2TempConversion( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance, F32 adcConversionCoeff ); static void getHeaterInternalTemp( U32 TCIndex, U32 CJIndex ); -static void processTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); +static void processTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount, BOOL fpgaCheck ); static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U16 adc, U32 fpgaError, U32 fpgaCount ); static BOOL isADCReadValid( U32 sensorIndex, U32 fpgaError, U32 fpgaCount ); static void processADCRead( U32 sensorIndex, S32 adc ); static void publishTemperatureSensorsData( void ); static void monitorTemperatureSnsrs( U32 sensorIndex ); -static void checkAlarmStatus( U32 sensorIndex, ALARM_ID_T alarm, BOOL alarmOccurred, U32 alarmTimeout ); /*********************************************************************//** * @brief @@ -187,7 +188,6 @@ void initTemperatureSensors( void ) { U08 i; - // Initialize the variables tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; elapsedTime = 0; @@ -206,105 +206,95 @@ for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; ++i ) { memset( &tempSensors[ i ], 0x0, sizeof( TEMP_SENSOR_T ) ); - benignPolynomialCalRecord( &tempSensorCalRecord.tempSensors[ i ] ); } // Initialize TPi and TPo constants tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].gain = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].refResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].zeroDegreeResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].gain = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].refResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].zeroDegreeResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_OUTLET_PRIMARY_HEATER ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; // Initialize TD1 and TD2 constants tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].gain = COND_SENSORS_TEMP_SENSOR_GAIN; tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].refResistance = COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE; tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].zeroDegreeResistance = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; - tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].gain = COND_SENSORS_TEMP_SENSOR_GAIN; tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].refResistance = COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE; tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].zeroDegreeResistance = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; - tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; // Initialize TRo and TDi constants tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].gain = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].refResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].zeroDegreeResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_OUTLET_REDUNDANT ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].gain = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].refResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].zeroDegreeResistance = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_INLET_DIALYSATE ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; // Initialize the heaters internal thermocouples constants tempSensors[ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ].conversionCoeff = HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF; - tempSensors[ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ].conversionCoeff = HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF; - tempSensors[ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; // Initialize the heaters cold junction constants tempSensors[ TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ].conversionCoeff = HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF; - tempSensors[ TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ].conversionCoeff = HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF; - tempSensors[ TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ].maxAllowedTemperature = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; // FPGA board temperature conversion coefficient tempSensors[ TEMPSENSORS_FPGA_BOARD_SENSOR ].conversionCoeff = 503.975 / (F32)TWELVE_BIT_RESOLUTION; - tempSensors[ TEMPSENSORS_FPGA_BOARD_SENSOR ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_FPGA_BOARD_SENSOR ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; F32 const conversionCoeff = 1.0 / 13584.0; // Board temperature sensors conversion coefficient tempSensors[ TEMPSENSORS_LOAD_CELL_A1_B1 ].conversionCoeff = conversionCoeff; - tempSensors[ TEMPSENSORS_LOAD_CELL_A1_B1 ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_LOAD_CELL_A1_B1 ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_LOAD_CELL_A2_B2 ].conversionCoeff = conversionCoeff; - tempSensors[ TEMPSENSORS_LOAD_CELL_A2_B2 ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_LOAD_CELL_A2_B2 ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; - tempSensors[ TEMPSENSORS_INTERNAL_TRO_RTD ].conversionCoeff = conversionCoeff; - tempSensors[ TEMPSENSORS_INTERNAL_TRO_RTD ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_INTERNAL_TRO_RTD ].conversionCoeff = conversionCoeff; + tempSensors[ TEMPSENSORS_INTERNAL_TRO_RTD ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_INTERNAL_TDI_RTD ].conversionCoeff = conversionCoeff; - tempSensors[ TEMPSENSORS_INTERNAL_TDI_RTD ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_INTERNAL_TDI_RTD ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; tempSensors[ TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR ].conversionCoeff = conversionCoeff; - tempSensors[ TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; - tempSensors[ TEMPSENSORS_BAROMETRIC_TEMP_SENSOR ].maxAllowedTemperature = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; + tempSensors[ TEMPSENSORS_BAROMETRIC_TEMP_SENSOR ].maxAllowedTemp = NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; // Persistent alarms for inlet water high/low temperature - initPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, - INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS, INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS, INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS, INLET_WATER_TEMP_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, - INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); - - initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, - INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); - // Persistent alarm for the temperature sensors range check - initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS, - TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS ); + initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS, TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS ); // Persistent alarm for the temperature sensors range check - initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_ADC_OUT_OF_RANGE, TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS, - TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS ); + initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_ADC_FAULT, TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS, TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS ); // Persistent alarm for the temperature sensors error bit fault check - initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_FAULT, TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS, - TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS ); // TODO remove? + initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_ERROR_BIT_FAULT, TEMP_SENSORS_ERROR_BIT_TIMEOUT_MS, TEMP_SENSORS_ERROR_BIT_TIMEOUT_MS ); // Persistent alarm for temperature sensors ADC error // When the FPGA read count does not increment for a period of time, it is considered as an internal error of the temperature sensors // driver. This is internal because FPGA does not error out if the FPGA read count does not increment. - initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_ADC_FAULT, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD, - TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_FPGA_FAULT, TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS, TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS ); } /*********************************************************************//** @@ -375,7 +365,6 @@ *************************************************************************/ void checkInletWaterTemperature( void ) { -#ifndef DISABLE_WATER_QUALITY_CHECK #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WATER_QUALITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif @@ -407,7 +396,6 @@ checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, FALSE, temperature, MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE ); } } -#endif } /*********************************************************************//** @@ -564,14 +552,22 @@ * @param adc ADC value for the temperature sensor * @param fpgaError reported FPGA error status * @param fpgaCount reported FPGA read count + * @param fpgaCheck whether to check the FPGA error and count prior to converting + * the ADC to temperature * @return none *************************************************************************/ -static void processTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ) +static void processTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount, BOOL fpgaCheck ) { + BOOL isADCValid = TRUE; S32 convertedADC = (S32)( adc & MASK_OFF_U32_MSB ); - // All the sensors have ADC read and count values that have to be checked - BOOL isADCValid = isADCReadValid( sensorIndex, fpgaError, fpgaCount ); + if ( TRUE == fpgaCheck ) + { + // All the sensors have ADC read and count values that have to be checked + // but the FPGA read and error counts are shared among some of the sensors so if that counts has been checked + // once, do not check it again + isADCValid = isADCReadValid( sensorIndex, fpgaError, fpgaCount ); + } // Some of the temperature sensors have an MSB bit that is used as an // error flag. This flag will be a TRUE by default. @@ -591,27 +587,28 @@ case TEMPSENSORS_INLET_DIALYSATE: // 311 case TEMPSENSORS_INTERNAL_TDI_RTD: // 315 { - // The MSB bit of the last byte is the error flag, so that MSB - // is shifted 31 bits to the first bit of the U32 variable. - // If that bit is a 1, there is either CRC error or Status error - // that are ored on top of each other - U32 errorBit = adc >> 31; - isTemperatureNotValid = ( errorBit > 0 ? TRUE : FALSE ); + U08 i; + // Shift bits by 31 to right to check the error bit status + tempSensors[ sensorIndex ].sensorErrorBitStatus = adc >> SHIFT_BITS_BY_31; + for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) + { + // If that bit is a 1, there is either CRC error or Status error that are ored on top of each other + // NOTE: only a few sensors have the error bit available but for simplicity, all the sensors are looped. + // This variable is zeroed in the init function and the sensors that do not use this bit are never checked ( and set) to + // any other values so those sensors will never trigger this fault. + // If any of the sensors have this bit to be 1, set the error occurred be 1 + isTemperatureNotValid |= ( tempSensors[ i ].sensorErrorBitStatus > 0 ? TRUE : FALSE ); + } + // TODO for debugging only remove if ( TRUE == isTemperatureNotValid ) { BOOL test = FALSE; } - // TODO remove + // TODO remove for debugging only - //SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_TEMPERATURE_SENSOR_FAULT, sensorIndex ); - - //checkAlarmStatus( sensorIndex, ALARM_ID_DG_TEMPERATURE_SENSOR_FAULT, isTemperatureNotValid, TEMPERATURE_SENSORS_ERROR_FLAG_PERSISTENT_PERIOD ); - - // TODO remove this - //checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_FAULT, isTemperatureNotValid, sensorIndex, - // TEMPERATURE_SENSORS_ERROR_FLAG_PERSISTENT_PERIOD ); + checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_ERROR_BIT_FAULT, isTemperatureNotValid, sensorIndex, TEMP_SENSORS_ERROR_BIT_TIMEOUT_MS ); } break; @@ -669,31 +666,30 @@ *************************************************************************/ static BOOL isADCReadValid( U32 sensorIndex, U32 fpgaError, U32 fpgaCount ) { - BOOL isADCValid = FALSE; - + U08 i; + BOOL isADCValid = FALSE; + BOOL isTemperatureNotValid = FALSE; // Check the status of FPGA error and FPGA count - BOOL isFPGAErrorZero = ( fpgaError == 0 ? TRUE : FALSE ); + BOOL isFPGAErrorZero = ( 0 == fpgaError ? TRUE : FALSE ); BOOL isFPGACountChanging = ( tempSensors[ sensorIndex ].readCount != fpgaCount ? TRUE : FALSE ); - if ( TRUE == isFPGAErrorZero ) + if ( ( TRUE == isFPGAErrorZero ) && ( TRUE == isFPGACountChanging ) ) { - if ( TRUE == isFPGACountChanging ) - { - tempSensors[ sensorIndex ].readCount = fpgaCount; - isADCValid = TRUE; - } + tempSensors[ sensorIndex ].readCount = fpgaCount; + isADCValid = TRUE; } - BOOL isThereAnError = ( ( FALSE == isFPGACountChanging ) || ( FALSE == isFPGAErrorZero ) ? TRUE : FALSE ); + tempSensors[ sensorIndex ].fpgaErrorStatus = ( ( FALSE == isFPGACountChanging ) || ( FALSE == isFPGAErrorZero ) ? TRUE : FALSE ); - //checkAlarmStatus( sensorIndex, ALARM_ID_DG_TEMPERATURE_SENSORS_ADC_FAULT, isThereAnError, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); + for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) + { + // Loop through all the sensors and read their FPGA error status + isTemperatureNotValid |= tempSensors[ sensorIndex ].fpgaErrorStatus; + } - // TODO remove - //checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_ADC_FAULT, isThereAnError, sensorIndex, TEMPERATURE_SENSORS_FPGA_ERROR_PERSISTENT_PERIOD ); + checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_FPGA_FAULT, isTemperatureNotValid, sensorIndex, TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS ); - //return isADCValid; - - return TRUE; + return isADCValid; } /*********************************************************************//** @@ -709,29 +705,30 @@ *************************************************************************/ static void processADCRead( U32 sensorIndex, S32 adc ) { + U08 i; F32 temperature; - - U32 index = tempSensors[ sensorIndex ].adcNextIndex; - S32 indexValue = tempSensors[ sensorIndex ].rawADCReads [ index ]; - + F32 avgADCReads; + BOOL isADCNotValid = FALSE; + U32 index = tempSensors[ sensorIndex ].adcNextIndex; + S32 indexValue = tempSensors[ sensorIndex ].rawADCReads [ index ]; + // Update the temperature sensors' structure tempSensors[ sensorIndex ].rawADCReads[ index ] = adc; tempSensors[ sensorIndex ].adcNextIndex = INC_WRAP( index, 0, MAX_NUM_OF_RAW_ADC_SAMPLES - 1 ); tempSensors[ sensorIndex ].adcRunningSum = tempSensors[ sensorIndex ].adcRunningSum - indexValue + adc; + avgADCReads = tempSensors[ sensorIndex ].adcRunningSum >> SHIFT_BITS_BY_2_FOR_AVERAGING; // Calculate the average - // Calculate the average - F32 avgADCReads = tempSensors[ sensorIndex ].adcRunningSum >> SHIFT_BITS_BY_2_FOR_AVERAGING; + // Check if the average ADC is within the accepted range + tempSensors[ sensorIndex ].adcErrorStatus = ( ( (U32)avgADCReads < TEMP_SESNORS_MIN_ALLOWED_ADC_COUNT ) || + ( (U32)avgADCReads > TEMP_SENSORS_MAX_ALLOWED_ADC_COUNT ) ? TRUE : FALSE ); - // Check if the ADC value of the sensor is not out of range - if ( ( (U32)avgADCReads < TEMP_SESNORS_MIN_ALLOWED_ADC_COUNT ) || ( (U32)avgADCReads > TEMP_SENSORS_MAX_ALLOWED_ADC_COUNT ) ) + for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) { - checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_ADC_OUT_OF_RANGE, TRUE, sensorIndex, avgADCReads ); + // Loop through the ADC errors + isADCNotValid |= tempSensors[ sensorIndex ].adcErrorStatus; } - else - { - // Clear the alarm if it there was no alarm - checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_ADC_OUT_OF_RANGE, FALSE, sensorIndex, avgADCReads ); - } + checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_ADC_FAULT, isADCNotValid, sensorIndex, avgADCReads ); + // Different sensors have different ADC to temperature conversion methods switch( sensorIndex ) { @@ -745,7 +742,7 @@ case TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE: case TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION: case TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION: - temperature = getADC2TempConversion( avgADCReads, (U32)tempSensors [ sensorIndex ].gain,(U32)tempSensors [ sensorIndex ].refResistance, + temperature = getADC2TempConversion( avgADCReads, (U32)tempSensors [ sensorIndex ].gain, (U32)tempSensors [ sensorIndex ].refResistance, (U32)tempSensors [ sensorIndex ].zeroDegreeResistance, tempSensors [ sensorIndex ].conversionCoeff ); break; @@ -822,65 +819,49 @@ *************************************************************************/ static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues( void ) { - U32 rawADC = 0; U32 errorCount = 0; U32 readCount = 0; // Look at the error counter and the specific error flag to make sure the error is a temperature sensor // Add a byte array to have bits for each sensor to find out exactly what sensor failed if ( ++fpgaRawADCReadInterval >= FPGA_RAW_ADC_READ_INTERVAL_COUNT ) { - rawADC = getFPGATPiTemp(); errorCount = (U32)getFPGARTDErrorCount(); readCount = (U32)getFPGARTDReadCount(); - processTempSnsrsADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER, rawADC, errorCount, readCount ); + processTempSnsrsADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER, getFPGATPiTemp(), errorCount, readCount, TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER, getFPGATPoTemp(), errorCount, readCount, FALSE ); + processTempSnsrsADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1, getFPGACD1Temp(), errorCount, readCount, FALSE ); + processTempSnsrsADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2, getFPGACD2Temp(), errorCount, readCount, FALSE ); - rawADC = getFPGATPoTemp(); - processTempSnsrsADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER, rawADC, errorCount, readCount ); - - rawADC = getFPGACD1Temp(); - processTempSnsrsADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1, rawADC, errorCount, readCount ); - - rawADC = getFPGACD2Temp(); - processTempSnsrsADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2, rawADC, errorCount, readCount ); - - rawADC = getFPGATRoTemp(); errorCount = (U32)getFPGATRoErrorCount(); readCount = (U32)getFPGATRoReadCount(); - processTempSnsrsADCRead( TEMPSENSORS_OUTLET_REDUNDANT, rawADC, errorCount, readCount ); + processTempSnsrsADCRead( TEMPSENSORS_OUTLET_REDUNDANT, getFPGATRoTemp(), errorCount, readCount, TRUE ); - rawADC = getFPGATDiTemp(); errorCount = (U32)getFPGATDiErrorCount(); readCount = (U32)getFPGATDiReadCount(); - processTempSnsrsADCRead( TEMPSENSORS_INLET_DIALYSATE, rawADC, errorCount, readCount ); + processTempSnsrsADCRead( TEMPSENSORS_INLET_DIALYSATE, getFPGATDiTemp(), errorCount, readCount, TRUE ); - rawADC = getFPGAPrimaryHeaterTemp(); errorCount = (U32)getFPGAPrimaryHeaterFlags(); readCount = (U32)getFPGAPrimaryHeaterReadCount(); - processHtrsTempSnsrsADCRead( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE, rawADC, errorCount, readCount ); + processHtrsTempSnsrsADCRead( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE, getFPGAPrimaryHeaterTemp(), errorCount, readCount ); + processHtrsTempSnsrsADCRead( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION, getFPGAPrimaryColdJunctionTemp(), errorCount, readCount ); - rawADC = getFPGAPrimaryColdJunctionTemp(); - processHtrsTempSnsrsADCRead( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION, rawADC, errorCount, readCount ); - - rawADC = getFPGATrimmerHeaterTemp(); errorCount = (U32)getFPGATrimmerHeaterFlags(); readCount = (U32)getFPGATrimmerHeaterReadCount(); - processHtrsTempSnsrsADCRead( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE, rawADC, errorCount, readCount ); + processHtrsTempSnsrsADCRead( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE, getFPGATrimmerHeaterTemp(), errorCount, readCount ); + processHtrsTempSnsrsADCRead( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION, getFPGATrimmerColdJunctionTemp(), errorCount, readCount ); - rawADC = getFPGATrimmerColdJunctionTemp(); - processHtrsTempSnsrsADCRead( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION, rawADC, errorCount, readCount ); - // NOTE: FPGA board temperature sensor is different from the rest of the sensors. This sensor does not have FPGA count and error // coming from FPGA. It is kept here to do moving average on the values. The supporting functions need to see the FPGA read count // incrementing internally so there will not be any errors. U32 simulatedCounter = tempSensors[ TEMPSENSORS_FPGA_BOARD_SENSOR ].readCount; - processTempSnsrsADCRead( TEMPSENSORS_FPGA_BOARD_SENSOR, getFPGABoardTemp(), 0, ++simulatedCounter ); - processTempSnsrsADCRead( TEMPSENSORS_LOAD_CELL_A1_B1, getFPGALoadCellsA1B1Temp(), getFPGAADC1ErrorCount(), getFPGAADC1ReadCount() ); - processTempSnsrsADCRead( TEMPSENSORS_LOAD_CELL_A2_B2, getFPGALoadCellsA2B2Temp(), getFPGAADC2ErrorCount(), getFPGAADC2ReadCount() ); - processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_TRO_RTD, getFPGATRoInternalTemp(), getFPGATRoErrorCount(), getFPGATRoReadCount() ); - processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_TDI_RTD, getFPGATDiInternalTemp(), getFPGATDiErrorCount(), getFPGATDiReadCount() ); - processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR, getFPGACondSnsrInternalTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processTempSnsrsADCRead( TEMPSENSORS_BAROMETRIC_TEMP_SENSOR, getFPGABaroTemperature(), getFPGABaroErrorCount(), getFPGABaroReadCount() ); + processTempSnsrsADCRead( TEMPSENSORS_FPGA_BOARD_SENSOR, getFPGABoardTemp(), 0, ++simulatedCounter, TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_LOAD_CELL_A1_B1, getFPGALoadCellsA1B1Temp(), getFPGAADC1ErrorCount(), getFPGAADC1ReadCount(), TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_LOAD_CELL_A2_B2, getFPGALoadCellsA2B2Temp(), getFPGAADC2ErrorCount(), getFPGAADC2ReadCount(), TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_TRO_RTD, getFPGATRoInternalTemp(), getFPGATRoErrorCount(), getFPGATRoReadCount(), TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_TDI_RTD, getFPGATDiInternalTemp(), getFPGATDiErrorCount(), getFPGATDiReadCount(), TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR, getFPGACondSnsrInternalTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount(), TRUE ); + processTempSnsrsADCRead( TEMPSENSORS_BAROMETRIC_TEMP_SENSOR, getFPGABaroTemperature(), getFPGABaroErrorCount(), getFPGABaroReadCount(), TRUE ); // Check if time has elapsed to calculate the internal temperature of the heaters if ( ++internalHeatersConversionTimer >= HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL ) @@ -909,7 +890,6 @@ if ( ++dataPublicationTimerCounter >= getU32OverrideValue( &tempSensorsPublishInterval ) ) { TEMPERATURE_SENSORS_DATA_T data; - data.inletPrimaryHeater = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ); data.heatDisinfect = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); data.outletPrimaryHeater = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); @@ -937,7 +917,6 @@ data.cond2Raw = tempSensors[ TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ].rawADCReads[ MAX_NUM_OF_RAW_ADC_SAMPLES - 1 ]; broadcastData( MSG_ID_DG_TEMPERATURE_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); - dataPublicationTimerCounter = 0; } } @@ -961,7 +940,7 @@ F32 temperature = getTemperatureValue( sensorIndex ); // Check both temperature and to be in range - if ( ( temperature < TEMP_SENSORS_MIN_ALLOWED_DEGREE_C ) || ( temperature > tempSensors[ sensorIndex ].maxAllowedTemperature ) ) + if ( ( temperature < TEMP_SENSORS_MIN_ALLOWED_DEGREE_C ) || ( temperature > tempSensors[ sensorIndex ].maxAllowedTemp ) ) { #ifndef ENABLE_DVT_BOARD checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, TRUE, sensorIndex, temperature ); @@ -970,41 +949,7 @@ } } -/*********************************************************************//** - * @brief - * The checkAlarmStatus function checks the status of an alarm and check whether - * it has timed out. - * @details Inputs: tempSensors - * @details Outputs: tempSensors - * @param sensorIndex the index of the temperature sensor - * @param alarm the alarm ID - * @param alarmOccures the boolean signal that indicates whether the error has - * occurred. - * @param alarmTimeout the timeout of the provided timeout - * @return none - *************************************************************************/ -static void checkAlarmStatus( U32 sensorIndex, ALARM_ID_T alarm, BOOL alarmOccurred, U32 alarmTimeout ) -{ - U32 startTime = tempSensors[ sensorIndex ].alarmStartTime; - if ( TRUE == alarmOccurred ) - { - if ( 0 == startTime ) - { - tempSensors[ sensorIndex ].alarmStartTime = getMSTimerCount(); - } - else if ( TRUE == didTimeout( startTime, alarmTimeout ) ) - { - SET_ALARM_WITH_2_U32_DATA( alarm, sensorIndex, alarmTimeout ); - } - } - else if ( ( FALSE == alarmOccurred ) && ( startTime != 0 ) ) - { - tempSensors[ sensorIndex ].alarmStartTime = 0; - } -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/DGCommon.h =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -41,7 +41,7 @@ #define DISABLE_RTC_CONFIG 1 // Not needed TODO investigate and remove -// #define ENABLE_DVT_BOARD 1 // TODo can we make this a sw config? TODO remove + #define ENABLE_DVT_BOARD 1 // TODo can we make this a sw config? TODO remove #include #include Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -113,6 +113,9 @@ { case DG_POST_STATE_START: postState = handlePOSTStateStart(); +#ifdef BOARD_WITH_NO_HARDWARE + postState = DG_POST_STATE_RTC; +#endif break; case DG_POST_STATE_FW_COMPATIBILITY: @@ -144,8 +147,12 @@ // NVDataMgmt must load all the calibration data into RAM so the actuators // can query their corresponding calibration values successfully case DG_POST_STATE_TEMPERATURE_SENSORS: +#ifndef BOARD_WITH_NO_HARDWARE testStatus = execTemperatureSensorsSelfTest(); postState = handlePOSTStatus( testStatus ); +#else + postState = DG_POST_STATE_COMPLETED; +#endif break; case DG_POST_STATE_ACCELEROMETER: Index: firmware/App/Modes/ModeService.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -52,6 +52,7 @@ *************************************************************************/ U32 transitionToServiceMode( void ) { + // Deenergize all the actuators return 0; } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -117,7 +117,7 @@ alarmConditionIsActive[ alarm ] = TRUE; // If alarm is a DG fault, request transition to fault mode - if ( TRUE == ALARM_TABLE[ alarm ].alarmIsDGFault ) + if ( ( TRUE == ALARM_TABLE[ alarm ].alarmIsDGFault ) && ( getCurrentOperationMode() != DG_MODE_SERV ) ) { requestNewOperationMode( DG_MODE_FAUL ); } Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -97,7 +97,7 @@ } FPGA_HEADER_T; // read only on FPGA /// FPGA sensors' readings struct. -typedef struct // TODO - add all sensor readings to this structure per FPGA register map +typedef struct { U32 fpgaLCA1; ///< Reg 256. ADC1 channel 0 - load cell A1 U32 fpgaLCB1; ///< Reg 260. ADC1 channel 1 - load cell B1 @@ -218,8 +218,8 @@ U08 fpgaCPiCPoEmstatRxErrCount; ///< Reg 461. CPi/CPo Emstat Rx error count U16 fpgaCPiCPoEmstatTxFIFOCount; ///< Reg 462. CPi/CPo Emstat Tx FIFO count U16 fpgaCPiCPoEmstatRxFIFOCount; ///< Reg 464. CPi/CPo Emstat Rx FIFO count - U08 fpgaDrainPumpFrequency; ///< Reg 466. drain pump frequency - U16 fpgaDrainPumpHallSnsrStatus; ///< Reg 468. drain pump hall sensor status + U16 fpgaPowerSupply2; ///< Reg 466. power supply 2 count + U16 fpgaOnBoardThermistor; ///< Reg 468. onboard thermistor } DG_FPGA_SENSORS_T; typedef struct @@ -290,10 +290,8 @@ U16 fpgaDACRegFIn; ///< Reg 126. Debug DAC channel F output U16 fpgaDACRegGIn; ///< Reg 128. Debug DAC channel G output U16 fpgaDACRegHIn; ///< Reg 130. Debug DAC channel H output - U32 fpgaCP1StepCount; ///< Reg 132. Concentrate pump 1 step count - U32 fpgaCP2StepCount; ///< Reg 136. Concentrate pump 2 step count - U08 fgpaNewCP2Control; ///< Reg 140. Concentrate pump 2 control - U08 fpgaNewCP1Control; ///< Reg 141. Concentrate pump 1 control + U08 fgpaNewCP2Control; ///< Reg 132. Concentrate pump 2 control + U08 fpgaNewCP1Control; ///< Reg 133. Concentrate pump 1 control } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -1117,60 +1115,92 @@ /*********************************************************************//** * @brief - * The setFPGACP1Control function sets the control configuration for + * The setFPGAcidPumpControl function sets the control configuration for * concentrate pump CP1. * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fpgaCP1Control * @param pumpControl The concentrate pump control configuration * @return none *************************************************************************/ -void setFPGACP1Control( U08 pumpControl ) +void setFPGAV3AcidPumpControl( U08 pumpControl ) { fpgaActuatorSetPoints.fpgaCP1Control = pumpControl; } /*********************************************************************//** * @brief - * The setFPGACP2Control function sets the control configuration for + * The setFPGABicarbPumpControl function sets the control configuration for * concentrate pump CP2. * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fpgaCP2Control * @param pumpControl The concentrate pump control configuration * @return none *************************************************************************/ -void setFPGACP2Control( U08 pumpControl ) +void setFPGAV3BicarbPumpControl( U08 pumpControl ) { fpgaActuatorSetPoints.fpgaCP2Control = pumpControl; } /*********************************************************************//** * @brief - * The setFPGACP1SetStepSpeed function sets the step speed period for concentrate pump CP1. + * The setFPGAAcidPumpSetStepSpeed function sets the step speed period for + * concentrate pump CP1. * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fpgaCP1StepSpeed * @param stepSpeed The concentrate pump step speed period * @return none *************************************************************************/ -void setFPGACP1SetStepSpeed( U16 stepSpeed ) +void setFPGAAcidPumpSetStepSpeed( U16 stepSpeed ) { fpgaActuatorSetPoints.fpgaCP1StepSpeed = stepSpeed; } /*********************************************************************//** * @brief - * The setFPGACP2SetStepSpeed function sets the step speed period for concentrate pump CP2. + * The setFPGABicarbSetStepSpeed function sets the step speed period for + * concentrate pump CP2. * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fpgaCP2StepSpeed * @param stepSpeed The concentrate pump step speed period * @return none *************************************************************************/ -void setFPGACP2SetStepSpeed( U16 stepSpeed ) +void setFPGABicarbSetStepSpeed( U16 stepSpeed ) { fpgaActuatorSetPoints.fpgaCP2StepSpeed = stepSpeed; } +/****************************DVT Functions*******************************************/ + /*********************************************************************//** * @brief + * The setFPGAAcidPumpControl function sets the DVT concentrate pump 1 + * (acid pump) control mode. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP1Control + * @param control Concentrate pump control set + * @return none + *************************************************************************/ +void setFPGAAcidPumpControl( U08 control ) +{ + fpgaActuatorSetPoints.fpgaNewCP1Control = control; +} + +/*********************************************************************//** + * @brief + * The setFPGABicarbPumpControl function sets the DVT concentrate pump 2 + * (bicarb pump) control mode. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control + * @param control Concentrate pump control set + * @return none + *************************************************************************/ +void setFPGABicarbPumpControl( U08 control ) +{ + fpgaActuatorSetPoints.fgpaNewCP2Control = control; +} + +/*********************************************************************//** + * @brief * The getFPGAVersions function gets the FPGA version numbers. * @details Inputs: fpgaHeader * @details Outputs: none @@ -1650,11 +1680,7 @@ *************************************************************************/ U32 getFPGACPi( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPi; -#else - return 0; -#endif } /*********************************************************************//** @@ -1715,11 +1741,7 @@ *************************************************************************/ U32 getFPGACPo( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPo; -#else - return 0; -#endif } /*********************************************************************//** @@ -1742,7 +1764,7 @@ * @details Outputs: none * @return Emstat conductivity sensor output byte *************************************************************************/ -U08 getFPGAEmstatOutByte( void ) +U08 getFPGAEmstatCD1CD2OutByte( void ) { return fpgaSensorReadings.fpgaCD1CD2EmstatOutByte; } @@ -2172,6 +2194,43 @@ return ( fpgaSensorReadings.fpgaBaroTemperature & MASK_OFF_U32_MSB ); } -/****************************DVT Functions*******************************************/ +/*********************************************************************//** + * @brief + * The getFPGAEmstatCPiCPoByteOut function gets the FPGA Emstat CPi/CPo + * byte out data. + * @details Inputs: fpgaSensorReadings.fpgaCPiCPoEmstatOutByte + * @details Outputs: none + * @return CPi/CPo Emstat byte out + *************************************************************************/ +U08 getFPGAEmstatCPiCPoByteOut( void ) +{ + return fpgaSensorReadings.fpgaCPiCPoEmstatOutByte; +} +/*********************************************************************//** + * @brief + * The getFPGAEmstatCPiCPoRxFifoCount function gets the FPGA Emstat CPi/CPo + * receive FIFO count. + * @details Inputs: fpgaSensorReadings.fpgaCD1CD2EmstatRxFifoCount + * @details Outputs: none + * @return CPi/CPo Rx FIFO count + *************************************************************************/ +U16 getFPGAEmstatCPiCPoRxFifoCount( void ) +{ + return fpgaSensorReadings.fpgaCD1CD2EmstatRxFifoCount; +} + +/*********************************************************************//** + * @brief + * The getFPGAEmstatCPiCPoRxErrCount function gets the FPGA Emstat CPi/CPo + * receive FIFO error count. + * @details Inputs: fpgaSensorReadings.fpgaCD1CD2EmstatRxErrorCount + * @details Outputs: none + * @return CPi/CPo Rx FIFO error count + *************************************************************************/ +U08 getFPGAEmstatCPiCPoRxErrCount( void ) +{ + return fpgaSensorReadings.fpgaCD1CD2EmstatRxErrorCount; +} + /**@}*/ Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -45,11 +45,16 @@ void setFPGADrainPumpSpeed( U08 drainPumpDAC ); void setFPGACPoProbeType( U16 probeType ); void setFPGACPiProbeType( U16 probeType ); -void setFPGACP1Control( U08 pumpControl ); -void setFPGACP2Control( U08 pumpControl ); -void setFPGACP1SetStepSpeed( U16 stepSpeed ); -void setFPGACP2SetStepSpeed( U16 stepSpeed ); +void setFPGAV3AcidPumpControl( U08 pumpControl ); +void setFPGAV3BicarbPumpControl( U08 pumpControl ); +void setFPGAAcidPumpSetStepSpeed( U16 stepSpeed ); +void setFPGABicarbSetStepSpeed( U16 stepSpeed ); +// DVT set functions +void setFPGAAcidPumpControl( U08 control ); +void setFPGABicarbPumpControl( U08 control ); +// DVT set functions + void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); U16 getFPGAValveStates( void ); U16 getFPGAROPumpFlowRate( void ); @@ -104,7 +109,7 @@ U08 getFPGAConcentratePumpsFault( void ); -U08 getFPGAEmstatOutByte( void ); +U08 getFPGAEmstatCD1CD2OutByte( void ); U08 getFPGAEmstatRxErrCount( void ); U16 getFPGAEmstatRxFifoCount( void ); @@ -153,7 +158,9 @@ U32 getFPGABaroPressure( void ); U32 getFPGABaroTemperature( void ); -// DVT functions +U08 getFPGAEmstatCPiCPoByteOut( void ); +U16 getFPGAEmstatCPiCPoRxFifoCount( void ); +U08 getFPGAEmstatCPiCPoRxErrCount( void ); /**@}*/ Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -538,9 +538,6 @@ heatersTempCalc.tempTargetTrimmer = params.trimmerTargetTemperature; heatersTempCalc.flowTargetDialysateLPM = params.dialysateFlowLPM; - // Set the trimmer heater target temperature since this value is needed for calculations - //setHeaterTargetTemperature( DG_TRIMMER_HEATER, getTrimmerHeaterTargetTemperature() ); // TODO remove - // Check if this is the first time that the dialysate heating parameters are set in DG if ( TRUE == isThisTheFirstCycle ) { Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -655,8 +655,8 @@ if ( TRUE == didTimeout( timeOfLastHDCheckIn, HD_COMM_TIMEOUT_IN_MS ) ) { hdCommunicationStatus.data = FALSE; -#ifndef ENABLE_DVT_BOARD - activateAlarmNoData( ALARM_ID_HD_COMM_TIMEOUT ); // TODO DVT +#ifndef BOARD_WITH_NO_HARDWARE + activateAlarmNoData( ALARM_ID_HD_COMM_TIMEOUT ); #endif } } Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -116,10 +116,10 @@ // Manage switches monitor execSwitches(); -#endif // Heaters controller execHeaters(); +#endif // Run non-volatile data management state machine that sends the data record // to Dialin Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -58,13 +58,12 @@ // SET_TASK_ON(); // TODO - uncomment and define TASK_TIMING_OUTPUT_ENABLED to monitor this tasks timing #endif +#ifndef BOARD_WITH_NO_HARDWARE // First pass for FPGA - execFPGAIn(); + execFPGAIn(); // Monitor internal ADC channels execInternalADC(); - -#ifndef BOARD_WITH_NO_HARDWARE // Monitor pressures execPressures(); @@ -99,10 +98,9 @@ // Monitor fluid leak detector execFluidLeak(); -#endif - // Second pass for FPGA - execFPGAOut(); + execFPGAOut(); +#endif // Check in with watchdog manager checkInWithWatchdogMgmt( TASK_PRIORITY );