Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -r4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d -rcb9bcb7376f09096f833ce59cfb9a71f43263315 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision 4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision cb9bcb7376f09096f833ce59cfb9a71f43263315) @@ -6,44 +6,228 @@ */ #include "Valves.h" +#include "FPGA.h" +/** + * @addtogroup Valves + * @{ + */ +// ********** private definitions ********** + +// Valve dialyzer inlet defines +#define VDI_ENABLE_PID_INTERFACE 0x0010 +#define VDI_ENABLE_BYPASS_INTERFACE 0x00EF + +#define VDI_INITIALIZATION_STATUS_BIT_MASK 0x0040 +#define VDI_ENABLE_PID_STATUS_BIT_MASK 0x0080 +#define VDI_ENABLE_BYPASS_STATUS_BIT_MASK 0x00100 + +// Valve dialyzer outlet defines +#define VDO_ENABLE_PID_INTERFACE 0x0040 +#define VDO_ENABLE_BYPASS_INTERFACE 0x00BF + +// Valve blood arterial defines +#define VBA_ENABLE_PID_INTERFACE 0x0001 +#define VBA_ENABLE_BYPASS_INTERFACE 0x00FE + +// Vlave blood venous defines +#define VBV_ENABLE_PID_INTERFACE 0x0004 +#define VBV_ENABLE_BYPASS_INTERFACE 0x00FB + +#define INITIAL_DENERGIZED_READ_COUNT 0U +#define INITIAL_ENERGIZED_READ_COUNT 12000U +#define INITIAL_OFFSET_READ_COUNT 40U + +// ********** private data ********** + +/// Valve States +typedef enum valveStates +{ + VALVE_STATE_WAIT_FOR_POST = 0, + VALVE_STATE_IDLE, + VALVE_STATE_IN_TRANSITION, + VALVE_STATE_HOMING_START, //TODO do we need this? + VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE, + VALVE_STATE_HOMING_FIND_DENERGIZED_EDGE, + NUM_OF_VALVE_STATES, +} VALVE_STATE_T; + +typedef struct +{ + VALVE_POSITION_T commandedPosition; + VALVE_POSITION_T currentPosition; + BOOL hasTransitionBeenRequested; + BOOL isHomingSuccessfull; // TODO do we need this? + BOOL hasValveBeenEnabled; // TODO do we need this? + S16 homingPosition; +} VALVE_STATUS_T; + +static VALVE_STATE_T dialyzerInletValveState = VALVE_STATE_WAIT_FOR_POST; +static VALVE_STATE_T dialyzerOutletValveState = VALVE_STATE_WAIT_FOR_POST; +static VALVE_STATE_T bloodArterialValveState = VALVE_STATE_WAIT_FOR_POST; +static VALVE_STATE_T bloodVenousValveState = VALVE_STATE_WAIT_FOR_POST; + +static VALVE_STATUS_T valvesStatus [ NUM_OF_VALVE_POSITIONS ]; + +static VALVE_STATE_T handleValveStateIdle( void ); +static VALVE_STATE_T handleValveStateInTransition( void ); +static VALVE_STATE_T handleValveStateHomingStart( void ); +static VALVE_STATE_T handleValveStateHomingFindEnergizedEdge( void ); +static VALVE_STATE_T handleValveStateHomingFineDenergizedEdge( void ); + + void initValves( void ) { + dialyzerOutletValveState = VALVE_STATE_WAIT_FOR_POST; + // TODO REMOVE THIS CODE + dialyzerInletValveState = VALVE_STATE_IDLE; + //TODO REMOVE THIS CODE + + dialyzerOutletValveState = VALVE_STATE_WAIT_FOR_POST; + bloodArterialValveState = VALVE_STATE_WAIT_FOR_POST; + bloodVenousValveState = VALVE_STATE_WAIT_FOR_POST; } SELF_TEST_STATUS_T execValvesSelfTest( void ) { } + void execValves( void ) { + // VDi state machine + switch ( dialyzerInletValveState ) + { + case VALVE_STATE_WAIT_FOR_POST: + break; + case VALVE_STATE_IDLE: + break; + + case VALVE_STATE_IN_TRANSITION: + break; + + case VALVE_STATE_HOMING_START: + break; + + case VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE: + break; + + case VALVE_STATE_HOMING_FIND_DENERGIZED_EDGE: + break; + + default: + break; + } } -BOOL homeDialyzerInletValve( void ) +BOOL homeValve( VALVE_T valve, VALVE_POSITION_T position ) { + BOOL result = FALSE; + switch ( valve ) + { + case VDI: + dialyzerInletValveState = VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE; + break; + + case VDO: + //enableValvesPIDControl( VDO_ENABLE_PID_INTERFACE ); + break; + + case VBA: + //enableValvesPIDControl( VBA_ENABLE_PID_INTERFACE ); + break; + + case VBV: + //enableValvesPIDControl( VBV_ENABLE_PID_INTERFACE ); + break; + + default: + break; + } + + return result; } -BOOL homeDialyzerOutletValve( void ) + +BOOL enableValvePIDController( VALVE_T valve ) { + BOOL result = FALSE; + switch ( valve ) + { + case VDI: + enableValvesPIDControl( VDI_ENABLE_PID_INTERFACE ); + break; + + case VDO: + enableValvesPIDControl( VDO_ENABLE_PID_INTERFACE ); + break; + + case VBA: + enableValvesPIDControl( VBA_ENABLE_PID_INTERFACE ); + break; + + case VBV: + enableValvesPIDControl( VBV_ENABLE_PID_INTERFACE ); + break; + + default: + break; + } + + return result; } -BOOL homeBloodArterialValve( void ) +BOOL enableValveBypassController( VALVE_T valve ) { + BOOL result = FALSE; + switch ( valve ) + { + case VDI: + enableValvesBypassControl( VDI_ENABLE_PID_INTERFACE ); + break; + + case VDO: + enableValvesBypassControl( VDO_ENABLE_BYPASS_INTERFACE ); + break; + + case VBA: + enableValvesBypassControl( VBA_ENABLE_BYPASS_INTERFACE ); + break; + + case VBV: + enableValvesBypassControl( VBV_ENABLE_BYPASS_INTERFACE ); + break; + + default: + break; + } + + return result; } -BOOL homeBloodVenousValve( void ) +BOOL setValvePosition( VALVE_T valve, VALVE_POSITION_T position ) { } -BOOL homeBloodTrapValve( void ) +S16 getValvePosition( VALVE_T valve) { } + + +BOOL energizeBloodTrapValve( void ) +{ + +} +BOOL denergizeBloodTrapValve( void ) +{ + +} Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -r4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d -rcb9bcb7376f09096f833ce59cfb9a71f43263315 --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision 4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision cb9bcb7376f09096f833ce59cfb9a71f43263315) @@ -10,38 +10,57 @@ #include "Common.h" +/** + * @defgroup Valves Valves + * @brief Valves module + * Driver that runs the valves in HD. + * + * @addtogroup Valves + * @{ + */ + +// ********** public definitions ********** + typedef enum valveStatesNames { - VALVE_STATE_POS_A_INSERT_EJECT = 0, - VALVE_STATE_POS_B_OPEN, - VALVE_STATE_POS_C_CLOSE, - NUM_OF_VALVE_STATES, -} VALVE_STATE_NAMES_T; + VALVE_POSITION_NOT_IN_POSITION = 0, + VALVE_POSITION_A_INSERT_EJECT, + VALVE_POSITION_B_OPEN, + VALVE_POSITION_C_CLOSE, + NUM_OF_VALVE_POSITIONS, +} VALVE_POSITION_T; typedef enum valveNames { VDI = 0, VDO, VBA, VBV, - VAT, NUM_OF_VALVES -} VALVES_T; +} VALVE_T; + +// ********** public function prototypes ********* + void initValves( void ); SELF_TEST_STATUS_T execValvesSelfTest( void ); void execValves( void ); -BOOL homeDialyzerInletValve( void ); +BOOL homeValve( VALVE_T valve, VALVE_POSITION_T position ); -BOOL homeDialyzerOutletValve( void ); +BOOL enableValvePIDController( VALVE_T valve ); -BOOL homeBloodArterialValve( void ); +BOOL enableValveBypassController( VALVE_T valve ); -BOOL homeBloodVenousValve( void ); +BOOL setValvePosition( VALVE_T valve, VALVE_POSITION_T position ); -BOOL homeBloodTrapValve( void ); +S16 getValvePosition( VALVE_T valve ); +BOOL energizeBloodTrapValve( void ); +BOOL denergizeBloodTrapValve( void ); + +/**@}*/ + #endif Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d -rcb9bcb7376f09096f833ce59cfb9a71f43263315 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision cb9bcb7376f09096f833ce59cfb9a71f43263315) @@ -170,10 +170,10 @@ typedef struct // TODO - add all actuator set points to this structure per FPGA register map { U16 fpgaPIDControl; ///< Reg 12. Valve PID enables. - U16 VBASetPoint; ///< Reg 14. VBA pinch valve is commanded to this set point position. - U16 VBVSetPoint; ///< Reg 16. VBV pinch valve is commanded to this set point position. - U16 VDiSetPoint; ///< Reg 18. VDi pinch valve is commanded to this set point position. - U16 VDoSetPoint; ///< Reg 20. VDo pinch valve is commanded to this set point position. + S16 VBASetPoint; ///< Reg 14. VBA pinch valve is commanded to this set point position. + S16 VBVSetPoint; ///< Reg 16. VBV pinch valve is commanded to this set point position. + S16 VDiSetPoint; ///< Reg 18. VDi pinch valve is commanded to this set point position. + S16 VDoSetPoint; ///< Reg 20. VDo pinch valve is commanded to this set point position. U16 VSpareSetPoint; ///< Reg 22. VSpare pinch valve is commanded to this set point position. U16 VBAPWMFixed; ///< Reg 24. VBA PWM set to fixed current by setting fixed PWM duty cycle. Range 750 to 4250. < 2500 is reverse direction. U16 VBVPWMFixed; ///< Reg 26. VBV PWM set to fixed current by setting fixed PWM duty cycle. Range 750 to 4250. < 2500 is reverse direction. @@ -1312,43 +1312,163 @@ *err = fpgaSensorReadings.accelFaultRegister; } -void enableValvesPIDControl( U16 enableBits ) +/*********************************************************************//** + * @brief + * The enableValvesPIDControl function enables the PID controller \n + * bit of the valves + * @details + * Inputs : fpgaActuatorSetPoints + * Outputs : fpgaActuatorSetPoints + * @param bits : The bits to enable the PID controller of a valve + * @return none + *************************************************************************/ +void enableValvesPIDControl( U16 bits ) { - fpgaActuatorSetPoints.fpgaPIDControl = 0xFF; + fpgaActuatorSetPoints.fpgaPIDControl = + fpgaActuatorSetPoints.fpgaPIDControl | bits; } -void setDialyzerInletValvePosition( U16 setPoint ) +/*********************************************************************//** + * @brief + * The enableValvesBypassControl function enables the bypass controller \n + * bit of the valves + * @details + * Inputs : fpgaActuatorSetPoints + * Outputs : fpgaActuatorSetPoints + * @param bits : The bits to enable the bypass controller of a valve + * @return none + *************************************************************************/ +void enableValvesBypassControl( U16 bits ) { + fpgaActuatorSetPoints.fpgaPIDControl = + fpgaActuatorSetPoints.fpgaPIDControl & bits; +} + +/*********************************************************************//** + * @brief + * The getValvesStatus function reads the status of the valves + * @details + * Inputs : fpgaSensorReadings + * Outputs : none + * @return The status of the valves + *************************************************************************/ +U16 getValvesStatus( void ) +{ + return fpgaSensorReadings.valveStatus; +} + +/*********************************************************************//** + * @brief + * The setValveDialyzerInletPosition function sets the position of VDi \n + * in counts + * @details + * Inputs : fpgaActuatorSetPoints + * Outputs : fpgaActuatorSetPoints + * @param setPoint : Next position of the valve in counts + * @return none + *************************************************************************/ +void setValveDialyzerInletPosition( S16 setPoint ) +{ fpgaActuatorSetPoints.VDiSetPoint = setPoint; } -S16 getDialyzerInletValvePosition( void ) + +/*********************************************************************//** + * @brief + * The getValveDialyzerInletPosition function reads the current position \n + * of VDi in counts + * @details + * Inputs : none + * Outputs : fpgaSensorReadings + * @return The current position of VDi + *************************************************************************/ +S16 getValveDialyzerInletPosition( void ) { return fpgaSensorReadings.VDiPosition; } -void setDialyzerOutletValvePosition( U16 setPoint ) +/*********************************************************************//** + * @brief + * The setValveDialyzerOutletPosition function sets the position of VDo \n + * in counts + * @details + * Inputs : fpgaActuatorSetPoints + * Outputs : fpgaActuatorSetPoints + * @param setPoint : Next position of the valve in counts + * @return none + *************************************************************************/ +void setValveDialyzerOutletPosition( S16 setPoint ) { fpgaActuatorSetPoints.VDoSetPoint = setPoint; } -S16 getDialyzerOutletValvePosition( void ) + +/*********************************************************************//** + * @brief + * The getDialyzerOutletValvePosition function reads the current position \n + * of VDo in counts + * @details + * Inputs : none + * Outputs : fpgaSensorReadings + * @return The current position of VDo + *************************************************************************/ +S16 getValveDialyzerOutletPosition( void ) { return fpgaSensorReadings.VDoPosition; } -void setVenousBloodValvePosition( U16 setPoint ) +/*********************************************************************//** + * @brief + * The setValveBloodVenousPosition function sets the position of VBV \n + * in counts + * @details + * Inputs : fpgaActuatorSetPoints + * Outputs : fpgaActuatorSetPoints + * @param setPoint : Next position of the valve in counts + * @return none + *************************************************************************/ +void setValveBloodVenousPosition( S16 setPoint ) { fpgaActuatorSetPoints.VBVSetPoint = setPoint; } -S16 getVenousBloodValvePoistion( void ) + +/*********************************************************************//** + * @brief + * The getValveBloodVenousPosition function reads the current position \n + * of VBV in counts + * @details + * Inputs : none + * Outputs : fpgaSensorReadings + * @return The current position of VBV + *************************************************************************/ +S16 getValveBloodVenousPosition( void ) { return fpgaSensorReadings.VBVPosition; } -void setArterialBloodValvePosition( U16 setPoint ) +/*********************************************************************//** + * @brief + * The setValveBloodArterialPosition function sets the position of VBA \n + * in counts + * @details + * Inputs : fpgaActuatorSetPoints + * Outputs : fpgaActuatorSetPoints + * @param setPoint : Next position of the valve in counts + * @return none + *************************************************************************/ +void setValveBloodArterialPosition( S16 setPoint ) { fpgaActuatorSetPoints.VBASetPoint = setPoint; } -S16 getArterialBloodValvePoistion( void ) + +/*********************************************************************//** + * @brief + * The getValveBloodArterialPosition function reads the current position \n + * of VBA in counts + * @details + * Inputs : none + * Outputs : fpgaSensorReadings + * @return The current position of VBA + *************************************************************************/ +S16 getValveBloodArterialPosition( void ) { return fpgaSensorReadings.VBAPosition; } Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d -rcb9bcb7376f09096f833ce59cfb9a71f43263315 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 4a5f3c9dfe803562a40aeea3bbc9fc3be0d1e26d) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision cb9bcb7376f09096f833ce59cfb9a71f43263315) @@ -68,19 +68,21 @@ void getFPGAAccelMaxes( S16 *xm, S16*ym, S16*zm ); void getFPGAAccelStatus( U16 *cnt, U16 *accelFPGAFaultReg ); -void enableValvesPIDControl( U16 enableBits ); +void enableValvesPIDControl( U16 bits ); +void enableValvesBypassControl( U16 bits ); +U16 getValvesStatus( void ); -void setDialyzerInletValvePosition( U16 setPoint ); -S16 getDialyzerInletValvePosition( void ); +void setValveDialyzerInletPosition( S16 setPoint ); +S16 getValveDialyzerInletPosition( void ); -void setDialyzerOutletValvePosition( U16 setPoint ); -S16 getDialyzerOutletValvePosition( void ); +void setValveDialyzerOutletPosition( S16 setPoint ); +S16 getValveDialyzerOutletPosition( void ); -void setVenousBloodValvePosition( U16 setPoint ); -S16 getVenousBloodValvePoistion( void ); +void setValveBloodVenousPosition( S16 setPoint ); +S16 getValveBloodVenousPosition( void ); -void setArterialBloodValvePosition( U16 setPoint ); -S16 getArterialBloodValvePoistion( void ); +void setValveBloodArterialPosition( S16 setPoint ); +S16 getValveBloodArterialPosition( void ); /**@}*/ Index: firmware/source/sys_main.c =================================================================== diff -u -rc84daa1f07003427fc5cdde8f5651434478f7313 -rcb9bcb7376f09096f833ce59cfb9a71f43263315 --- firmware/source/sys_main.c (.../sys_main.c) (revision c84daa1f07003427fc5cdde8f5651434478f7313) +++ firmware/source/sys_main.c (.../sys_main.c) (revision cb9bcb7376f09096f833ce59cfb9a71f43263315) @@ -82,6 +82,7 @@ #include "SystemComm.h" #include "TaskBG.h" #include "Timers.h" +#include "Valves.h" #include "WatchdogMgmt.h" static void initProcessor( void ); @@ -183,6 +184,7 @@ initOperationModes(); initRTC(); initNVDataMgmt(); + initValves(); } /*************************************************************************