Index: firmware/App/Drivers/EjectorMotor.c =================================================================== diff -u -rae4a44c74291d5891ef2a7f45320158e73fecbbc -rcf22584fb68bb29311d81d1e5ad79f8cf064b8fb --- firmware/App/Drivers/EjectorMotor.c (.../EjectorMotor.c) (revision ae4a44c74291d5891ef2a7f45320158e73fecbbc) +++ firmware/App/Drivers/EjectorMotor.c (.../EjectorMotor.c) (revision cf22584fb68bb29311d81d1e5ad79f8cf064b8fb) @@ -49,6 +49,9 @@ #define EJECTOR_MOTOR_CONTROL_32TH_STEP 0x03 ///< Ejector motor control register bits for 1/32 micro-stepping mode. #define EJECTOR_MOTOR_CONTROL_FULL_STEP 0x00 ///< Ejector motor control register bits for full stepping mode. +#define EJECTOR_OPT_SENSOR_ACTIVE 0 ///< Ejector optical sensor active. +#define EJECTOR_OPT_SENSOR_INACTIVE 1 ///< Ejector optical sensor inactive. + /// Control bits to run ejector motor in reverse direction static const U08 EJECTOR_MOTOR_CONTROL_RUN_REVERSE = EJECTOR_MOTOR_CONTROL_SLEEP_OFF | EJECTOR_MOTOR_CONTROL_NOT_RESET | @@ -71,16 +74,17 @@ /// Payload record structure for ejector motor set request typedef struct { - F32 setSpeed; ///< Set speed for ejector motor (in RPM). Negative RPM indicates reverse direction. + F32 setSpeed; ///< Set speed for ejector motor (in RPM). Negative RPM indicates reverse direction. } EJECTOR_MOTOR_SET_CMD_PAYLOAD_T; // ********** private data ********** -static F32 currentEjectorMotorSetSpeed; ///< Current ejector motor set speed (in RPM). -static U32 ejectorMotorSetToggleTime; ///< Time (in uSec) between microstep toggles. -static U32 ejectorMotorRampUpToggleTime; ///< Current ramp time (in uSec) between microstep toggles. -static U32 ejectorMotorRampTimerCtr; ///< Used to track ramp up time. -static BOOL ejectorMotorRampUpInProgress; ///< Flag indicating whether a ramp up is in progress. +static F32 currentEjectorMotorSetSpeed; ///< Current ejector motor set speed (in RPM). +static U32 ejectorMotorSetToggleTime; ///< Time (in uSec) between microstep toggles. +static U32 ejectorMotorRampUpToggleTime; ///< Current ramp time (in uSec) between microstep toggles. +static U32 ejectorMotorRampTimerCtr; ///< Used to track ramp up time. +static BOOL ejectorMotorRampUpInProgress; ///< Flag indicating whether a ramp up is in progress. +static OVERRIDE_U32_T ejectorOpticalSensors[ NUM_OF_EJECTOR_OPT_SENSORS ]; ///< Ejector retract optical sensor. // ********** private function prototypes ********** @@ -95,12 +99,22 @@ *************************************************************************/ void initEjectorMotor(void) { + U32 optSensor; + currentEjectorMotorSetSpeed = 0.0F; ejectorMotorSetToggleTime = EJECTOR_MOTOR_MICROSTEP_TOGGLE_TIME_FOR_STOP; ejectorMotorRampUpToggleTime = EJECTOR_MOTOR_MICROSTEP_TOGGLE_TIME_FOR_STOP; ejectorMotorRampTimerCtr = 0; ejectorMotorRampUpInProgress = FALSE; + for ( optSensor = EJECTOR_OPT_SENSOR_RETRACT; optSensor < NUM_OF_EJECTOR_OPT_SENSORS; optSensor++ ) + { + ejectorOpticalSensors[ optSensor ].data = 0; + ejectorOpticalSensors[ optSensor ].ovData = 0; + ejectorOpticalSensors[ optSensor ].ovInitData = 0; + ejectorOpticalSensors[ optSensor ].override = OVERRIDE_RESET; + } + setH5StepToggleTime( ejectorMotorSetToggleTime ); setH5ControlFlags( EJECTOR_MOTOR_CONTROL_DISABLED ); } @@ -195,6 +209,11 @@ *************************************************************************/ void execEjectorMotorRamping( void ) { + // Update the optical sensor values + // TODO is debouncing needed?? + ejectorOpticalSensors[ EJECTOR_OPT_SENSOR_RETRACT ].data = getFPGAEjectorRetractOpticalSensor(); + ejectorOpticalSensors[ EJECTOR_OPT_SENSOR_ENGAGE ].data = getFPGAEjectorEngageOpticalSensor(); + if ( TRUE == ejectorMotorRampUpInProgress ) { ejectorMotorRampTimerCtr++; @@ -218,6 +237,39 @@ /*********************************************************************//** * @brief + * The isEjectorOpticalSensorActive function checks whether either of the + * ejector optical sensors are active or inactive. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if the ejector optical sensor + * is not in range. + * @details Inputs: ejectorOpticalSensors + * @details Outputs: none + * @param rsensorID the optical sensor to check + * @return TRUE if the sensor is active otherwise, FALSE + *************************************************************************/ +BOOL isEjectorOpticalSensorActive( EJECTOR_OPT_SENSOR_T sensorID ) +{ + BOOL status = FALSE; + + switch ( sensorID ) + { + case EJECTOR_OPT_SENSOR_RETRACT: + status = ( EJECTOR_OPT_SENSOR_ACTIVE == getU32OverrideValue( &ejectorOpticalSensors[ EJECTOR_OPT_SENSOR_RETRACT ] ) ? TRUE : FALSE ); + break; + + case EJECTOR_OPT_SENSOR_ENGAGE: + status = ( EJECTOR_OPT_SENSOR_ACTIVE == getU32OverrideValue( &ejectorOpticalSensors[ EJECTOR_OPT_SENSOR_ENGAGE ] ) ? TRUE : FALSE ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_EJECTOR_OPTICAL_SENSOR_INVALID_REQ, (U32)sensorID ) + break; + } + + return status; +} + +/*********************************************************************//** + * @brief * The calcEjectorStepToggleTimeFromSetSpeed function calculates the stepper * toggle period for a given set speed (in RPM). * @details Inputs: none @@ -283,5 +335,21 @@ return result; } +/*********************************************************************//** + * @brief + * The testEjectorOpticalSensorOverride function overrides the optical sensors. + * @details \b Inputs: none + * @details \b Outputs: ejectorOpticalSensors + * @param message Override message from Dialin which includes the sensor to + * override its value. + * @return TRUE if override request is successful, FALSE if not + *************************************************************************/ +BOOL testEjectorOpticalSensorOverride( MESSAGE_T *message ) +{ + BOOL result = u32ArrayOverride( message, &ejectorOpticalSensors[ EJECTOR_OPT_SENSOR_RETRACT ], NUM_OF_EJECTOR_OPT_SENSORS - 1, EJECTOR_OPT_SENSOR_ACTIVE, EJECTOR_OPT_SENSOR_INACTIVE ); + + return result; +} + /**@}*/