Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -464,8 +464,8 @@ HEATERS_STATE_T state = HEATER_EXEC_STATE_PRIMARY_RAMP_TO_TARGET; DG_HEATERS_T heater = DG_PRIMARY_HEATER; F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_HEAT_DISINFECT ); - F32 targetFlow = 0.0; - F32 dutyCycle = 0.0; + F32 targetFlow = 0.0F; + F32 dutyCycle = 0.0F; F32 targetTemperature = heatersStatus[ heater ].targetTemp; DG_OP_MODE_T opMode = getCurrentOperationMode(); @@ -851,14 +851,14 @@ // The duty cycle of the primary heater is divided into 2 parts and is applied to main // and small primary heaters. So they are always the same. - data.mainPrimayHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * 100.0; - data.smallPrimaryHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * 100.0; - data.trimmerHeaterDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle * 100.0; + data.mainPrimayHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; + data.smallPrimaryHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; + data.trimmerHeaterDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; data.primaryTargetTemp = heatersStatus[ DG_PRIMARY_HEATER ].targetTemp; data.trimmerTargetTemp = heatersStatus[ DG_TRIMMER_HEATER ].targetTemp; data.primaryHeaterState = heatersStatus[ DG_PRIMARY_HEATER ].state; data.trimmerHeaterState = heatersStatus[ DG_TRIMMER_HEATER ].state; - data.primaryEfficiency = heatersStatus[ DG_PRIMARY_HEATER ].heaterEstGain * 100; + data.primaryEfficiency = heatersStatus[ DG_PRIMARY_HEATER ].heaterEstGain * FRACTION_TO_PERCENT_FACTOR; data.primaryCalcTargetTemp = heatersStatus[ DG_PRIMARY_HEATER ].calculatedTemperature; data.trimmerCalcCurrentTemp = heatersStatus[ DG_TRIMMER_HEATER ].calculatedTemperature; dataPublicationTimerCounter = 0; Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -303,15 +303,15 @@ void signalROPumpHardStop( void ) { stopROPump(); - targetROPumpFlowRateLPM = 0; + targetROPumpFlowRateLPM = 0.0F; roPumpState = RO_PUMP_OFF_STATE; - roPumpPWMDutyCyclePct = 0.0; - roPumpOpenLoopTargetDutyCycle = 0.0; + roPumpPWMDutyCyclePct = 0.0F; + roPumpOpenLoopTargetDutyCycle = 0.0F; roControlTimerCounter = 0; isROPumpOn = FALSE; targetROPumpMaxPressure = 0; - pendingROPumpCmdMaxPressure = 0.0; - pendingROPumpCmdTargetFlow = 0.0; + pendingROPumpCmdMaxPressure = 0.0F; + pendingROPumpCmdTargetFlow = 0.0F; pendingROPumpCmdCountDown = 0; resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_PUMP_DUTY_CYCLE ); } @@ -492,13 +492,13 @@ /*********************************************************************//** * @brief - * The getTargetROPumpPressure function gets the current target RO pump + * The getTargetROPumpPressurePSI function gets the current target RO pump * pressure. - * @details Inputs: targetROPumpPressure - * @details Outputs: targetROPumpPressure - * @return the current target RO targetROPumpPressure in psi. + * @details Inputs: none + * @details Outputs: targetROPumpMaxPressure + * @return the current target RO pump pressure in psi. *************************************************************************/ -F32 getTargetROPumpPressure( void ) +F32 getTargetROPumpPressurePSI( void ) { return targetROPumpMaxPressure; } @@ -581,7 +581,7 @@ F32 actualFlowRate = getMeasuredFlowRateLPM( RO_FLOW_SENSOR ); F32 flowRateDeviation = fabs( targetFlowRate - actualFlowRate ) / targetFlowRate; BOOL isFlowOutOfRange = flowRateDeviation > ROP_FLOW_TARGET_TOLERANCE; - F32 targetPressure = getTargetROPumpPressure(); + F32 targetPressure = getTargetROPumpPressurePSI(); if ( ++roControlTimerCounter >= ROP_RAMP_UP_CONTROL_INTERVAL ) { @@ -777,7 +777,7 @@ RO_PUMP_DATA_T pumpData; pumpData.roPumpTgtFlowRateLM = getTargetROPumpFlowRateLPM(); - pumpData.roPumpTgtPressure = getTargetROPumpPressure(); + pumpData.roPumpTgtPressure = getTargetROPumpPressurePSI(); pumpData.roPumpDutyCycle = roPumpDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; pumpData.roPumpState = (U32)roPumpState; pumpData.roPumpFBDutyCycle = roPumpFeedbackDutyCyclePct * FRACTION_TO_PERCENT_FACTOR; Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -61,7 +61,7 @@ BOOL isROPumpRunning( void ); F32 getTargetROPumpFlowRateLPM( void ); -F32 getTargetROPumpPressure( void ); +F32 getTargetROPumpPressurePSI( void ); F32 getROGeneratedVolumeL( void ); void resetROGenerateVolumeL( void ); Index: firmware/App/Controllers/Switches.c =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Controllers/Switches.c (.../Switches.c) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Controllers/Switches.c (.../Switches.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -100,8 +100,11 @@ currentSwitchStatus = ( getFPGADialysateCapStatus() != 0 ? STATE_OPEN : STATE_CLOSED ); break; - // NOTE: the default case was removed since this switch case is executed using a for loop so the default - // case is never called. The default case is unreachable in development testing. +#ifndef _VECTORCAST_ + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_SWITCH_SELECTED, i ); + break; +#endif } // Check if the current switch status is not the same as the recorded data @@ -115,16 +118,23 @@ // If the debounce time has been elapsed, update the switch status to the new status else if ( TRUE == didTimeout( switchesStatus[ i ].debounceStartTime, SWITCHES_DEBOUNCE_TIME_MS ) ) { - if ( CONCENTRATE_CAP == i ) + switch ( i ) { - SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_CONCENTRATE_CAP_SWITCH_CHANGE, - (U32)switchesStatus[ i ].status.data, (U32)currentSwitchStatus ); + case CONCENTRATE_CAP: + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_CONCENTRATE_CAP_SWITCH_CHANGE, (U32)switchesStatus[ i ].status.data, (U32)currentSwitchStatus ); + break; + + case DIALYSATE_CAP: + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_DIALYSATE_CAP_SWITCH_CHANGE, (U32)switchesStatus[ i ].status.data, (U32)currentSwitchStatus ); + break; + +#ifndef _VECTORCAST_ + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_SWITCH_SELECTED, i ); + break; +#endif } - else if ( DIALYSATE_CAP == i ) - { - SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_DIALYSATE_CAP_SWITCH_CHANGE, - (U32)switchesStatus[ i ].status.data, (U32)currentSwitchStatus ); - } + switchesStatus[ i ].debounceStartTime = 0; switchesStatus[ i ].status.data = currentSwitchStatus; } Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -168,21 +168,21 @@ fillState = DG_FILL_MODE_STATE_START; dialysateFillStartTime = 0; dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - reservoirBaseWeight = 0.0; - integratedVolumeML = 0.0; + reservoirBaseWeight = 0.0F; + integratedVolumeML = 0.0F; concentrateTestStartTime = 0; - acidConductivityTotal = 0.0; - bicarbConductivityTotal = 0.0; + acidConductivityTotal = 0.0F; + bicarbConductivityTotal = 0.0F; conductivitySampleCount = 0; concentratePumpPrimeCount = 0; pumpSpeedIndex = 0; - averageBicarbConductivity = 0.0; - averageAcidConductivity = 0.0; - pctDiffInConductivity = 0.0; + averageBicarbConductivity = 0.0F; + averageAcidConductivity = 0.0F; + pctDiffInConductivity = 0.0F; bicarbConductivitySampleCount = 0; acidConductivitySampleCount = 0; - totalBicarbConductivity = 0.0; - totalAcidConductivity = 0.0; + totalBicarbConductivity = 0.0F; + totalAcidConductivity = 0.0F; havePauseActuatorsBeenSet = FALSE; initPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, 0, DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ); @@ -333,16 +333,10 @@ *************************************************************************/ void resetFillStatusParameters( void ) { - DG_HEATERS_RECORD_T heaterInfo; - - // Get the heaters info from the NV data management. Do not alarm on the status of the data since it has already been checked in NV POST - getNVRecord2Driver( GET_INF_HEATERS_RECORD, (U08*)&heaterInfo, sizeof( DG_HEATERS_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - - // If the data in the NV data management was not initialized properly, set it to 0 otherwise, set the average flow rate - fillStatus.fillFlowRateAverageLPM = ( heaterInfo.averageFillFlow < NEARLY_ZERO ? 0.0 : heaterInfo.averageFillFlow ); - fillStatus.fillFlowRateRunningSum = 0.0; + fillStatus.fillFlowRateAverageLPM = getTargetROPumpFlowRateLPM(); + fillStatus.fillFlowRateRunningSum = 0.0F; fillStatus.fillSampleCounter = 0; - fillStatus.fillTemperatureRunningSum = 0.0; + fillStatus.fillTemperatureRunningSum = 0.0F; // At the beginning the last and average temperatures are considered as the trimmer heater target temperature which // is the dialysate temperature fillStatus.fillTemperatureAverage = getHeaterTargetTemperature( DG_TRIMMER_HEATER ); @@ -821,8 +815,8 @@ // Get the last fill temperature before leaving to Generation Idle fillStatus.fillFlowRateAverageLPM = fillStatus.fillFlowRateRunningSum / (F32)fillStatus.fillSampleCounter; fillStatus.fillTemperatureAverage = fillStatus.fillTemperatureRunningSum / (F32)fillStatus.fillSampleCounter; - fillStatus.fillFlowRateRunningSum = 0.0; - fillStatus.fillTemperatureRunningSum = 0.0; + fillStatus.fillFlowRateRunningSum = 0.0F; + fillStatus.fillTemperatureRunningSum = 0.0F; fillStatus.fillSampleCounter = 0; fillStatus.fillLastTemperature = getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -139,6 +139,7 @@ SW_FAULT_ID_WRITE_USAGE_INFO_TO_NV_FAILURE, SW_FAULT_ID_INVALID_FPGA_ERROR_GROUP_SELECTED, SW_FAULT_ID_INVALID_LED_COLOR_SELECTED, // 110 + SW_FAULT_ID_INVALID_SWITCH_SELECTED, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -2404,11 +2404,27 @@ return fpgaSensorReadings.fpgaHeaterGNDADC; } +/*********************************************************************//** + * @brief + * The getFPGAHeaterGateADCReadCount function returns the main primary heater + * voltage ADC read count. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return main primary heater voltage ADC read count + *************************************************************************/ U08 getFPGAHeaterGateADCReadCount( void ) { return fpgaSensorReadings.fpgaHeater1ADCReadCount; } +/*********************************************************************//** + * @brief + * The getFPGAHeaterGateADCReadCount function returns the main primary heater + * voltage ADC error count. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return main primary heater voltage ADC error count + *************************************************************************/ U08 getFPGAHeaterGateADCErrorCount( void ) { return fpgaSensorReadings.fpgaHeater1ADCErrorCount; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -139,9 +139,9 @@ /*********************************************************************//** * @brief * The execReservoirs function manages periodic tasks for the Reservoirs module. - * @details Inputs: reservoirDataPublicationTimerCounter - * @details Outputs: reservoirDataPublicationTimerCounter, heatingCalRecord, - * reservoirsCalRecord + * @details Inputs: dataPublishCounter, nvOps + * @details Outputs: dataPublishCounter, heatingConstsCalRecord, + * reservoirsCalRecord, nvOps * @return none *************************************************************************/ void execReservoirs( void ) Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r2e21405574597474db0ebae86cdd7fa2d517f71c -re6c4c61c793a91f9ed9dfe969e01bdeee565347d --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 2e21405574597474db0ebae86cdd7fa2d517f71c) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision e6c4c61c793a91f9ed9dfe969e01bdeee565347d) @@ -912,9 +912,11 @@ break; } +#ifndef _VECTORCAST_ // handle any test messages if tester has logged in successfully // NOTE: END_OF_MSG_IDS = 65536 which is out of the range of a U16 so it is subtracted by 1. This is unreachable in development testing if ( ( msgID > MSG_ID_FIRST_DG_TESTER_MESSAGE ) && ( msgID <= END_OF_MSG_IDS - 1 ) && ( TRUE == isTestingActivated() ) ) +#endif { switch ( msgID ) {