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 ) +{ + +}