/************************************************************************** * * Copyright (c) 2025-2025 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file RinsePump.c * * @author (last) Vinayakam Mani * @date (last) 02-Oct-2025 * * @author (original) Vinayakam Mani * @date (original) 02-Oct-2025 * ***************************************************************************/ #include "RinsePump.h" #include "Messaging.h" #include "OperationModes.h" #include "PersistentAlarm.h" #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" /** * @addtogroup RinsePump * @{ */ // ********** private definitions ********** #define RINSE_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Rinse pump data publish interval. #define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Rinse pump data publish start counter. // ********** private data ********** static RINSE_PUMP_STATE_T currentRinsePumpState; ///< Current rinse pump control state. static U32 rinsePumpDataPublicationTimerCounter; ///< Rinse pump data broadcast timer counter. static OVERRIDE_U32_T rinsePumpDataPublishInterval; ///< Rinse pump data broadcast interval (in ms). // ********** private function prototypes ********** static RINSE_PUMP_STATE_T handleRinsePumpStartState( void ); static RINSE_PUMP_STATE_T handleRinsePumpOffState( void ); static RINSE_PUMP_STATE_T handleRinsePumpOnState ( void ); static void publishRinsePumpData( void ); /*********************************************************************//** * @brief * The initRinsePump function initializes the rinse pump driver. * @details \b Inputs: none * @details \b Outputs: Rinse pump driver unit initialized * @return none *************************************************************************/ void initRinsePump(void) { // Initialize controller variables rinsePumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; currentRinsePumpState = RINSE_PUMP_STATE_INIT; rinsePumpDataPublishInterval.data = RINSE_PUMP_DATA_PUB_INTERVAL; rinsePumpDataPublishInterval.ovData = RINSE_PUMP_DATA_PUB_INTERVAL; rinsePumpDataPublishInterval.ovInitData = RINSE_PUMP_DATA_PUB_INTERVAL; rinsePumpDataPublishInterval.override = OVERRIDE_RESET; } /*********************************************************************//** * @brief * The setRinsePumpState function sets the current rinse pump state machine state. * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if invalid state given. * @details \b Inputs: currentRinsePumpState * @details \b Outputs: currentRinsePumpState * @param state Rinse pump state to set * @return none *************************************************************************/ void setRinsePumpState( RINSE_PUMP_STATE_T state ) { if ( state < NUM_OF_RINSE_PUMP_STATES ) { currentRinsePumpState = state; } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_RINSE_PUMP_INVALID_STATE1, (U32)state ) } } /*********************************************************************//** * @brief * The getRinsePumpState function returns the current rinse pump state machine. * @details \b Inputs: currentRinsePumpState * @details \b Outputs: none * @return current state of the rinse pump state machine. *************************************************************************/ RINSE_PUMP_STATE_T getRinsePumpState( void ) { return currentRinsePumpState; } /*********************************************************************//** * @brief * The execRinsePumpController function executes the rinse pump state machine. * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. * @details \b Inputs: currentRinsePumpState * @details \b Outputs: currentRinsePumpState * @return none *************************************************************************/ void execRinsePumpController( void ) { switch( currentRinsePumpState ) { case RINSE_PUMP_STATE_INIT: currentRinsePumpState = handleRinsePumpStartState(); break; case RINSE_PUMP_STATE_OFF: currentRinsePumpState = handleRinsePumpOffState(); break; case RINSE_PUMP_STATE_ON: currentRinsePumpState = handleRinsePumpOnState(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_RINSE_PUMP_INVALID_EXEC_STATE, (U32)currentRinsePumpState ) break; } publishRinsePumpData(); } /*********************************************************************//** * @brief * The handleRinsePumpStartState function starts the rinse pump state machine. * @details \b Inputs: none * @details \b Outputs: none * @return next state of the rinse pump state machine *************************************************************************/ static RINSE_PUMP_STATE_T handleRinsePumpStartState( void ) { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; return state; } /*********************************************************************//** * @brief * The handleRinsePumpOffState function stops the rinse pump * @details \b Inputs: none * @details \b Outputs: Rinse pump motor turned off * @return next state of the rinse pump state machine *************************************************************************/ static RINSE_PUMP_STATE_T handleRinsePumpOffState( void ) { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; // Current alpha system uses valve D65 to turn on the rinse pump // and its just On/off control for now. setValveState( D79_PMP_VALV, VALVE_STATE_CLOSED ); return state; } /*********************************************************************//** * @brief * The handleRinsePumpOnState function starts the rinse pump * @details \b Inputs: none * @details \b Outputs: Rinse pump motor turned on. * @return next state of the rinse pump state machine *************************************************************************/ static RINSE_PUMP_STATE_T handleRinsePumpOnState( void ) { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_ON; // D79 Pump On/off control setValveState( D79_PMP_VALV, VALVE_STATE_OPEN ); return state; } /*********************************************************************//** * @brief * The publishRinsePumpData function constructs and sends the rinse pump data * broadcast message. * @details \b Message \b Sent: MSG_ID_DD_RINSE_PUMP_DATA * @details \b Inputs: rinsePumpDataPublicationTimerCounter, currentRinsePumpState * @details \b Outputs: rinsePumpDataPublicationTimerCounter * @return none *************************************************************************/ static void publishRinsePumpData( void ) { if ( ++rinsePumpDataPublicationTimerCounter >= getU32OverrideValue( &rinsePumpDataPublishInterval ) ) { RINSE_PUMP_PAYLOAD_T data; data.d79State = getRinsePumpState(); broadcastData( MSG_ID_DD_RINSE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( RINSE_PUMP_PAYLOAD_T ) ); rinsePumpDataPublicationTimerCounter = 0; } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testRinsePumpDataPublishIntervalOverride function overrides the interval * at which the DD rinse pump data is published. * @details \b Inputs: none * @details \b Outputs: rinsePumpDataPublishInterval * @param message Override message from Dialin which includes the interval * (in ms) to override the rinse pump broadcast interval to. * @return TRUE if override request is successful, FALSE if not *************************************************************************/ BOOL testRinsePumpDataPublishIntervalOverride( MESSAGE_T *message ) { BOOL result = u32BroadcastIntervalOverride( message, &rinsePumpDataPublishInterval, TASK_GENERAL_INTERVAL ); return result; } /**@}*/