Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -re69bbaaeac26fb962c6123b28af5b3f4794fe1c3 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision e69bbaaeac26fb962c6123b28af5b3f4794fe1c3) @@ -1,15 +1,15 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file FPGA.c * -* @author (last) Dara Navaei -* @date (last) 10-Nov-2022 +* @author (last) Sean Nash +* @date (last) 20-Dec-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -89,6 +89,12 @@ #define FPGA_VBF_PWM_PERIOD 16666 ///< FPGA VBf PWM period. #define FPGA_ENABLE_VALVES_PWM 0x0020 ///< FPGA enable valves PWM. #define CONCENTRATE_CAP_SWITCH_MASK 0x10 ///< Concentrate cap switch bit mask. +#define FPGA_CONC_PUMP_FAULT_BITS 0x03 ///< Concentrate pump fault bits mask. +#define FPGA_CP1_PARKED_BIT 0x04 ///< Concentrate pump 1 parked status bit mask. +#define FPGA_CP2_PARKED_BIT 0x10 ///< Concentrate pump 2 parked status bit mask. +#define FPGA_CP1_PARK_FAULT_BIT 0x08 ///< Concentrate pump 1 park fault status bit mask. +#define FPGA_CP2_PARK_FAULT_BIT 0x20 ///< Concentrate pump 2 park fault status bit mask. +#define FPGA_CONC_PUMP_PARK_COMMAND 0x80 ///< Park command bit for the concentrate pumps. #define DIALYSATE_CAP_SWITCH_MASK 0x20 ///< Dialysate cap switch bit mask. #define FPGA_THD_CONTROL_COMMAND 0X01 ///< FPGA THd control command. #define FPGA_POWER_OUT_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< FPGA power out timeout in milliseconds. @@ -776,6 +782,12 @@ fpgaWriteCmdBuffer[ FPGA_WRITE_CMD_HDR_LEN + sizeof( FPGA_ACTUATORS_T ) ] = GET_MSB_OF_WORD( crc ); fpgaWriteCmdBuffer[ FPGA_WRITE_CMD_HDR_LEN + sizeof( FPGA_ACTUATORS_T ) + 1 ] = GET_LSB_OF_WORD( crc ); + // reset one-time sets after actuator set points xmit message created + fpgaActuatorSetPoints.fpgaNewCP1Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; // clear concentrate pump park command bits + fpgaActuatorSetPoints.fgpaNewCP2Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; + fpgaActuatorSetPoints.fpgaCP1Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; + fpgaActuatorSetPoints.fpgaCP2Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; + // construct bulk read command to read sensor data registers starting at address 8 fpgaReadCmdBuffer[ 0 ] = FPGA_READ_CMD_CODE; fpgaReadCmdBuffer[ 1 ] = GET_LSB_OF_WORD( FPGA_BULK_READ_START_ADDR ); @@ -1195,7 +1207,8 @@ *************************************************************************/ void setFPGAV3AcidPumpControl( U08 pumpControl ) { - fpgaActuatorSetPoints.fpgaCP1Control = pumpControl; + fpgaActuatorSetPoints.fpgaCP1Control &= FPGA_CONC_PUMP_PARK_COMMAND; + fpgaActuatorSetPoints.fpgaCP1Control |= pumpControl; } /*********************************************************************//** @@ -1209,11 +1222,38 @@ *************************************************************************/ void setFPGAV3BicarbPumpControl( U08 pumpControl ) { - fpgaActuatorSetPoints.fpgaCP2Control = pumpControl; + fpgaActuatorSetPoints.fpgaCP2Control &= FPGA_CONC_PUMP_PARK_COMMAND; + fpgaActuatorSetPoints.fpgaCP2Control |= pumpControl; } /*********************************************************************//** * @brief + * The setFPGABicarbPumpControl function sets the park command bit for the + * concentrate pump CP1. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP1Control + * @return none + *************************************************************************/ +void setFPGAV3AcidPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fpgaCP1Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief + * The setFPGAV3BicarbPumpParkCmd function sets the park command bit for the + * concentrate pump CP2. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP2Control + * @return none + *************************************************************************/ +void setFPGAV3BicarbPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fpgaCP2Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief * The setFPGAAcidPumpSetStepSpeed function sets the step speed period for * concentrate pump CP1. * @details Inputs: none @@ -1244,32 +1284,78 @@ * @brief * The setFPGAAcidPumpControl function sets the DVT concentrate pump 1 * (acid pump) control mode. + * bit 7: Park (set in different function) + * bit 6: nSleep + * bit 5: nReset + * bit 4: nEnable + * bit 3: Direction (1=Fwd, 0=Rev) + * bit 0-2: Microstepping resolution * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP1Control * @param control Concentrate pump control set * @return none *************************************************************************/ void setFPGAAcidPumpControl( U08 control ) { - fpgaActuatorSetPoints.fpgaNewCP1Control = control; + fpgaActuatorSetPoints.fpgaNewCP1Control &= FPGA_CONC_PUMP_PARK_COMMAND; // preserve msb (park command bit) + fpgaActuatorSetPoints.fpgaNewCP1Control |= control; } /*********************************************************************//** * @brief * The setFPGABicarbPumpControl function sets the DVT concentrate pump 2 * (bicarb pump) control mode. + * bit 7: Park (set in different function) + * bit 6: nSleep + * bit 5: nReset + * bit 4: nEnable + * bit 3: Direction (1=Fwd, 0=Rev) + * bit 0-2: Microstepping resolution * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control * @param control Concentrate pump control set * @return none *************************************************************************/ void setFPGABicarbPumpControl( U08 control ) { - fpgaActuatorSetPoints.fgpaNewCP2Control = control; + fpgaActuatorSetPoints.fgpaNewCP2Control &= FPGA_CONC_PUMP_PARK_COMMAND; // preserve msb (park command bit) + fpgaActuatorSetPoints.fgpaNewCP2Control |= control; } /*********************************************************************//** * @brief + * The setFPGAAcidPumpParkCmd function sets the DVT concentrate pump 1 + * (acid pump) park command bit. + * bit 7: Park command bit + * bit 0-6: Other pump control bits (set in different function) + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP1Control + * @param Park command bit set + * @return none + *************************************************************************/ +void setFPGAAcidPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fpgaNewCP1Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief + * The setFPGABicarbPumpParkCmd function sets the DVT concentrate pump 2 + * (bicarb pump) park command bit. + * bit 7: Park command bit + * bit 0-6: Other pump control bits (set in different function) + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control + * @param Park command bit set + * @return none + *************************************************************************/ +void setFPGABicarbPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fgpaNewCP2Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief * The getFPGAVersions function gets the FPGA version numbers. * @details Inputs: fpgaHeader * @details Outputs: none @@ -1799,11 +1885,75 @@ *************************************************************************/ U08 getFPGAConcentratePumpsFault( void ) { - return fpgaSensorReadings.fpgaCP1CP2Fault; + return fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CONC_PUMP_FAULT_BITS; } /*********************************************************************//** * @brief + * The getFPGAAcidPumpIsParked function gets whether the acid pump is currently + * parked. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if acid pump is parked, FALSE if not + *************************************************************************/ +BOOL getFPGAAcidPumpIsParked( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP1_PARKED_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGABicarbPumpIsParked function gets whether the bicarb pump is currently + * parked. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if bicarb pump is parked, FALSE if not + *************************************************************************/ +BOOL getFPGABicarbPumpIsParked( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP2_PARKED_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAAcidPumpParkFault function gets whether the acid pump park command + * has faulted. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if acid pump park command faulted, FALSE if not + *************************************************************************/ +BOOL getFPGAAcidPumpParkFault( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP1_PARK_FAULT_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGABicarbPumpParkFault function gets whether the bicarb pump park command + * has faulted. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if bicarb pump park command faulted, FALSE if not + *************************************************************************/ +BOOL getFPGABicarbPumpParkFault( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP2_PARK_FAULT_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief * The getFPGAEmstatOutByte function gets Emstat conductivity sensor output byte. * @details Inputs: fpgaSensorReadings.fpgaEmstatOutByte * @details Outputs: none @@ -2160,8 +2310,12 @@ *************************************************************************/ HARDWARE_CONFIG_T getHardwareConfigStatus( void ) { + static U32 counter = 0; HARDWARE_CONFIG_T configValue = (HARDWARE_CONFIG_T)fpgaSensorReadings.fpgaHWConfigReg; + if (HW_CONFIG_BETA == configValue) + counter++; + return configValue; } #endif