Index: firmware/App/Controllers/Ejector.c =================================================================== diff -u -re130387b9e8ed54237a6e4c3020222060c2be5a9 -re24a98a344ba13ceb0663b415268a7e1dd5ce99e --- firmware/App/Controllers/Ejector.c (.../Ejector.c) (revision e130387b9e8ed54237a6e4c3020222060c2be5a9) +++ firmware/App/Controllers/Ejector.c (.../Ejector.c) (revision e24a98a344ba13ceb0663b415268a7e1dd5ce99e) @@ -7,11 +7,11 @@ * * @file Ejector.c * -* @author (last) Sean -* @date (last) 13-May-2025 +* @author (last) Dara Navaei +* @date (last) 25-Nov-2025 * -* @author (original) Sean -* @date (original) 13-May-2025 +* @author (original) Sean Nash +* @date (original) 15-May-2025 * ***************************************************************************/ @@ -43,10 +43,10 @@ /// Enumeration of ejector states. typedef enum EjectorOperations { - EJECTOR_OPERATION_HOME = 0, ///< Ejector home operation - EJECTOR_OPERATION_RETRACT, ///< Ejector retract operation - EJECTOR_OPERATION_EXTEND, ///< Ejector extend operation - NUM_OF_EJECTOR_OPERATIONS, ///< Number of ejector operations + EJECTOR_OPERATION_HOME = 0, ///< Ejector home operation + EJECTOR_OPERATION_RETRACT, ///< Ejector retract operation + EJECTOR_OPERATION_EXTEND, ///< Ejector extend operation + NUM_OF_EJECTOR_OPERATIONS, ///< Number of ejector operations } EJECTOR_OPERATION_T; // ********** private data ********** @@ -73,6 +73,7 @@ static EJECTOR_STATE_T handleEjectorRetractBackoffState( void ); static EJECTOR_STATE_T handleEjectorDirChangeStopState( void ); static EJECTOR_STATE_T handleEjectorAbortState( void ); +static void setEjectorSpeed( F32 speed ); static void resetEjectorFlags( void ); static void publishEjectorData( void ); @@ -122,6 +123,7 @@ * sets the ejector motor speed to that speed. * @details \b Inputs: none * @details \b Outputs: currentEjectorSetSpeed + * @param speed Target speed for ejector motor. * @return none *************************************************************************/ static void setEjectorSpeed( F32 speed ) @@ -197,15 +199,26 @@ /*********************************************************************//** * @brief * The abortEjectorOperation function requests an ejector abort operation. - * @details \b Inputs: none + * @details \b Inputs: currentEjectorState * @details \b Outputs: ejectorAbortRequested * @return none *************************************************************************/ void abortEjectorOperation( void ) { - setEjectorMotorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); - // Set the flag to TRUE regardless of where the ejector is at - ejectorAbortRequested = TRUE; + switch ( currentEjectorState ) + { + case EJECTOR_STATE_HOMING: + case EJECTOR_STATE_RETRACTING: + case EJECTOR_STATE_EXTENDING: + setEjectorMotorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); + // Set the flag to TRUE regardless of where the ejector is at + ejectorAbortRequested = TRUE; + break; + + default: + // Do nothing on the rest of the states. Only initiate the abort sequence if an operation is in progress. + break; + } } /*********************************************************************//** @@ -397,7 +410,8 @@ { EJECTOR_STATE_T state = EJECTOR_STATE_RETRACTING; - if ( ++ejectorOperationTimerCounter >= EJECTOR_RETRACT_OP_TIME ) + // If the optical sensor is active it means the ejector has reached to the full retract position + if ( ( ++ejectorOperationTimerCounter >= EJECTOR_RETRACT_OP_TIME ) || ( TRUE == isEjectorOpticalSensorActive( EJECTOR_OPT_SENSOR_RETRACT ) ) ) { ejectorOperationTimerCounter = 0; setEjectorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); @@ -463,7 +477,8 @@ { EJECTOR_STATE_T state = EJECTOR_STATE_EXTENDING; - if ( ++ejectorOperationTimerCounter >= EJECTOR_EXTEND_OP_TIME ) + // If the optical sensor is active it means the ejector has reached to the full extended (engage) position + if ( ( ++ejectorOperationTimerCounter >= EJECTOR_EXTEND_OP_TIME ) || ( TRUE == isEjectorOpticalSensorActive( EJECTOR_OPT_SENSOR_ENGAGE ) ) ) { ejectorOperationTimerCounter = 0; setEjectorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); @@ -511,8 +526,10 @@ { EJECTOR_PAYLOAD_T data; - data.h5State = getEjectorState(); - data.h5SetSpeed = currentEjectorSetSpeed; + data.h5State = getEjectorState(); + data.h5SetSpeed = currentEjectorSetSpeed; + data.retractOpticalSensor = (U32)isEjectorOpticalSensorActive( EJECTOR_OPT_SENSOR_RETRACT ); + data.engageOpticalSensor = (U32)isEjectorOpticalSensorActive( EJECTOR_OPT_SENSOR_ENGAGE ); broadcastData( MSG_ID_TD_EJECTOR_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( EJECTOR_PAYLOAD_T ) ); ejectorDataPublicationTimerCounter = 0;