Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -rfa4f2bfd1ec6a4f007b23789b002429125d7f1a8 -re5879a928e1ac6ed2e6960fd2f9a317ce166c699 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision fa4f2bfd1ec6a4f007b23789b002429125d7f1a8) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision e5879a928e1ac6ed2e6960fd2f9a317ce166c699) @@ -168,9 +168,18 @@ *************************************************************************/ void execAirTrapMonitor( void ) { - // TODO - get latest level readings + BOOL lower, upper; - // TODO - fault if illegal level readings persist + // get latest level readings + getFPGAAirTrapLevels( &lower, &upper ); + airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_LOWER ].data = (U32)( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_UPPER ].data = (U32)( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + + // check level readings are valid + if ( ( TRUE == lower ) && ( FALSE == upper ) ) + { + // TODO - fault if illegal level readings persist + } } /*********************************************************************//** @@ -183,41 +192,55 @@ *************************************************************************/ void execAirTrapController( void ) { - // execute state machine + // execute air trap state machine switch( airTrapControllerState ) { case AIR_TRAP_INIT_STATE: airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; break; case AIR_TRAP_MANUAL_CONTROL_STATE: + airTrapControllerState = handleAirTrapManualControlState(); break; case AIR_TRAP_VALVE_CLOSED_STATE: + airTrapControllerState = handleAirTrapValveClosedState(); break; case AIR_TRAP_VALVE_OPEN_STATE: + airTrapControllerState = handleAirTrapValveOpenState(); break; default: // TODO - s/w fault + airTrapControllerState = AIR_TRAP_INIT_STATE; break; } + + // publish air trap data if due + publishAirTrapData(); } /*********************************************************************//** * @brief * The handleAirTrapManualControlState function handles the manual control * state of the air trap. * @details - * Inputs : TBD - * Outputs : TBD + * Inputs : pendingStartAirTrapController + * Outputs : none * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_MANUAL_CONTROL_STATE; + // transition to valve control states when requested + if ( TRUE == pendingStartAirTrapController ) + { + pendingStartAirTrapController = FALSE; + result = AIR_TRAP_VALVE_CLOSED_STATE; + } + return result; } @@ -226,14 +249,27 @@ * The handleAirTrapValveClosedState function handles the valve closed state * of the air trap. * @details - * Inputs : TBD - * Outputs : TBD + * Inputs : pendingStopAirTrapController, airTrapLevels[] + * Outputs : none * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_CLOSED_STATE; + // transition to manual valve control state when requested + if ( TRUE == pendingStopAirTrapController ) + { + pendingStopAirTrapController = FALSE; + result = AIR_TRAP_MANUAL_CONTROL_STATE; + } + // transition to open valve state when air detected at lower level + else if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) + { + // TODO - command air trap valve to open + result = AIR_TRAP_VALVE_OPEN_STATE; + } + return result; } @@ -242,52 +278,28 @@ * The handleAirTrapValveOpenState function handles the valve open state of * the air trap. * @details - * Inputs : TBD - * Outputs : TBD + * Inputs : pendingStopAirTrapController, airTrapLevels[] + * Outputs : none * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_OPEN_STATE; - return result; -} - -/*********************************************************************//** - * @brief - * The publishAirTrapData function publishes air trap data at the set interval. - * @details - * Inputs : airTrapLevels[] - * Outputs : if broadcast is due, send air trap data - * @return none - *************************************************************************/ -static void publishAirTrapData( void ) -{ - // publish pressure/occlusion data on interval - if ( ++airTrapDataPublicationTimerCounter >= getPublishAirTrapDataInterval() ) + // transition to manual valve control state when requested + if ( TRUE == pendingStopAirTrapController ) { - AIR_TRAP_LEVELS_T lowLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); - AIR_TRAP_LEVELS_T highLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); - -// broadcastAirTrapData( (U32)lowLevel, (U32)highLevel ); - airTrapDataPublicationTimerCounter = 0; + pendingStopAirTrapController = FALSE; + result = AIR_TRAP_MANUAL_CONTROL_STATE; } -} + // transition to closed valve state when fluid detected at upper level + else if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) + { + // TODO - command air trap valve to close + result = AIR_TRAP_VALVE_CLOSED_STATE; + } -/*********************************************************************//** - * @brief - * The execAirTrapTest function executes the state machine for the air trap - * self-test. - * @details - * Inputs : none - * Outputs : none - * @return the current state of the PresOccl self-test. - *************************************************************************/ -SELF_TEST_STATUS_T execAirTrapTest( void ) -{ - SELF_TEST_STATUS_T status; - - return status; + return result; } /*********************************************************************//** @@ -342,7 +354,46 @@ return result; } +/*********************************************************************//** + * @brief + * The publishAirTrapData function publishes air trap data at the set interval. + * @details + * Inputs : airTrapLevels[] + * Outputs : if broadcast is due, send air trap data + * @return none + *************************************************************************/ +static void publishAirTrapData( void ) +{ + // publish pressure/occlusion data on interval + if ( ++airTrapDataPublicationTimerCounter >= getPublishAirTrapDataInterval() ) + { + AIR_TRAP_LEVELS_T lowLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); + AIR_TRAP_LEVELS_T highLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); +// broadcastAirTrapData( (U32)lowLevel, (U32)highLevel ); + airTrapDataPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief + * The execAirTrapTest function executes the state machine for the air trap + * self-test. + * @details + * Inputs : none + * Outputs : none + * @return the current state of the PresOccl self-test. + *************************************************************************/ +SELF_TEST_STATUS_T execAirTrapTest( void ) +{ + SELF_TEST_STATUS_T status; + + // TODO - implement POST + + return status; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -403,7 +454,7 @@ * Inputs : none * Outputs : airTrapLevels[] * @param sensor ID of level sensor to override - * @param value override level sensor with this + * @param level override level sensor with this * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ) @@ -430,6 +481,7 @@ * @details * Inputs : none * Outputs : airTrapLevels[] + * @param sensor ID of level sensor to reset override * @return TRUE if reset successful, FALSE if not *************************************************************************/ BOOL testResetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ) Index: firmware/App/Controllers/AirTrap.h =================================================================== diff -u -rfa4f2bfd1ec6a4f007b23789b002429125d7f1a8 -re5879a928e1ac6ed2e6960fd2f9a317ce166c699 --- firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision fa4f2bfd1ec6a4f007b23789b002429125d7f1a8) +++ firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision e5879a928e1ac6ed2e6960fd2f9a317ce166c699) @@ -58,10 +58,10 @@ void endAirTrapControl( void ); BOOL isAirTrapControlling( void ); +AIR_TRAP_LEVELS_T getAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ); + SELF_TEST_STATUS_T execAirTrapTest( void ); -AIR_TRAP_LEVELS_T getAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ); - BOOL testSetAirTrapDataPublishIntervalOverride( U32 value ); BOOL testResetAirTrapDataPublishIntervalOverride( void ); BOOL testSetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -re5879a928e1ac6ed2e6960fd2f9a317ce166c699 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision e5879a928e1ac6ed2e6960fd2f9a317ce166c699) @@ -78,6 +78,9 @@ #define FPGA_ADC1_AUTO_READ_ENABLE 0x01 ///< Auto-read enable bit for ADC1 control register. +#define FPGA_AIRTRAP_LEVEL_LOW_MASK 0x0008 ///< Bit mask for air trap lower level sensor. +#define FPGA_AIRTRAP_LEVEL_HIGH_MASK 0x0004 ///< Bit mask for air trap upper level sensor. + // FPGA Sensors Record #pragma pack(push,1) /// Record structure for FPGA header read. @@ -862,6 +865,26 @@ /*********************************************************************//** * @brief + * The consumeUnexpectedData function checks to see if a byte is sitting in + * the SCI2 received data register. + * @details + * Inputs : fpgaHeader + * Outputs : none + * @return fpgaDiag + *************************************************************************/ +static void consumeUnexpectedData( void ) +{ + // clear any errors + sciRxError( scilinREG ); + // if a byte is pending read, read it + if ( sciIsRxReady( scilinREG ) != 0 ) + { + sciReceiveByte( scilinREG ); + } +} + +/*********************************************************************//** + * @brief * The setupDMAForWriteCmd function sets the byte count for the next DMA * write command to the FPGA. * @details @@ -1321,15 +1344,14 @@ * Outputs : none * @return fpgaDiag *************************************************************************/ -static void consumeUnexpectedData( void ) +void getFPGAAirTrapLevels( BOOL *airAtLower, BOOL *airAtUpper ) { - // clear any errors - sciRxError( scilinREG ); - // if a byte is pending read, read it - if ( sciIsRxReady( scilinREG ) != 0 ) - { - sciReceiveByte( scilinREG ); - } + U16 fpgaGPIO = fpgaSensorReadings.fpgaGPIO; + U16 lower = fpgaGPIO & FPGA_AIRTRAP_LEVEL_LOW_MASK; + U16 upper = fpgaGPIO & FPGA_AIRTRAP_LEVEL_HIGH_MASK; + + *airAtLower = ( 0 == lower ? FALSE : TRUE ); + *airAtUpper = ( 0 == upper ? FALSE : TRUE ); } /**@}*/ Index: firmware/App/Services/FPGA.h =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -re5879a928e1ac6ed2e6960fd2f9a317ce166c699 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision e5879a928e1ac6ed2e6960fd2f9a317ce166c699) @@ -68,6 +68,9 @@ void getFPGAAccelMaxes( S16 *xm, S16*ym, S16*zm ); void getFPGAAccelStatus( U16 *cnt, U16 *accelFPGAFaultReg ); +void getFPGAAirTrapLevels( BOOL *airAtLower, BOOL *airAtUpper ); + + /**@}*/ #endif