/************************************************************************** * * 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 ModePostGenDialysate.c * * @author (last) Vinayakam Mani * @date (last) 18-Apr-2025 * * @author (original) Vinayakam Mani * @date (original) 18-Apr-2025 * ***************************************************************************/ #include "ConcentratePumps.h" #include "DialysatePumps.h" #include "Heaters.h" #include "ModePostGenDialysate.h" #include "Messaging.h" #include "OperationModes.h" #include "TaskGeneral.h" #include "Utilities.h" #include "Valves.h" /** * @addtogroup DDPostGenDialysateMode * @{ */ // ********** private definitions ********** /// Interval (ms/task time) at which the post-treatment state data is published on the CAN bus. #define POST_GEN_DIALYSATE_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) // ********** private data ********** static DD_POST_GEN_DAILYSATE_STATE_T postGenDialysateState; ///< Currently active post gen dialysate state. static U32 postGenDialysatePublishTimerCounter; ///< PostGen Dialysate data broadcast timer counter used to schedule when to transmit data. static OVERRIDE_U32_T postGenDialysateModePublishInterval; ///< Interval (in task intervals) at which to publish post-gen dialysate mode data to CAN bus. // ********** private function prototypes ********** static void publishPostGenDialysateState( void ); static DD_POST_GEN_DAILYSATE_STATE_T handlePostGenDialysateStartState( void ); /*********************************************************************//** * @brief * The initPostGenDialysateMode function initializes the Post Generation * Dialysate Mode unit. * @details \b Inputs : none * @details \b Outputs: Post-Gen Dialysate mode unit initialized * @return none *************************************************************************/ void initPostGenDialysateMode( void ) { postGenDialysateState = DD_POST_GEN_DIALYSATE_STATE_START; postGenDialysateModePublishInterval.data = POST_GEN_DIALYSATE_DATA_PUB_INTERVAL; postGenDialysateModePublishInterval.ovData = POST_GEN_DIALYSATE_DATA_PUB_INTERVAL; postGenDialysateModePublishInterval.ovInitData = 0; postGenDialysateModePublishInterval.override = OVERRIDE_RESET; } /*********************************************************************//** * @brief * The transitionToPostGenDialysateMode function prepares for transition * to Post-Gen Dialysate mode from generate dialysate or pre-gen mode * @details \b Inputs: none * @details \b Outputs: none * @return initial state *************************************************************************/ U32 transitionToPostGenDialysateMode( void ) { initPostGenDialysateMode(); setCurrentSubState( NO_SUB_STATE ); return postGenDialysateState; } /*********************************************************************//** * @brief * The execPostGenDialysateMode function executes the Post-Gen Dialysate mode * state machine. * @details \b Inputs: postGenDialysateState * @details \b Outputs: Post-Gen Dialysate mode state machine executed * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when wrong post gen dialysate * state invoked * @return current state of Post-Gen Dialysate Mode *************************************************************************/ U32 execPostGenDialysateMode( void ) { // execute current post-gen dialysate state switch ( postGenDialysateState ) { case DD_POST_GEN_DIALYSATE_STATE_START: postGenDialysateState = handlePostGenDialysateStartState(); break; case DD_POST_GEN_DIALYSATE_STATE_COMPLETE: // TODO : handle post gen dialysate complete state break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_POST_GEND_MODE_INVALID_EXEC_STATE, postGenDialysateState ) break; } publishPostGenDialysateState(); return postGenDialysateState; } /*********************************************************************//** * @brief * The getCurrentPostGenDialysateState function returns the current state * of the Post-Gen Dialysate mode. * @details \b Inputs: postGenDialysateState * @details \b Outputs: none * @return current state of PostGenDialysate mode *************************************************************************/ DD_POST_GEN_DAILYSATE_STATE_T getCurrentPostGenDialysateState( void ) { return postGenDialysateState; } /*********************************************************************//** * @brief * The handlePostGenDialysateStartState function handles the post gen dialysate * start state. * @details \b Inputs: none * @details \b Outputs: none * @return current state of PostGenDialysate mode *************************************************************************/ static DD_POST_GEN_DAILYSATE_STATE_T handlePostGenDialysateStartState( void ) { //TODO: define start state return postGenDialysateState; } /*********************************************************************//** * @brief * The publishPostGenDialysateState function publishes Post-Generation dialysate * mode data. * @details \b Inputs: postGenDialysatePublishTimerCounter, postGenDialysateModePublishInterval * @details \b Outputs: postGenDialysatePublishTimerCounter * @details \b Message \Sent: MSG_ID_DD_POST_GEN_DIALYSATE_STATE_DATA to publish the * post generate dialysate mode data. * @return none *************************************************************************/ static void publishPostGenDialysateState( void ) { // publish data at periodic interval if ( ++postGenDialysatePublishTimerCounter >= getU32OverrideValue( &postGenDialysateModePublishInterval ) ) { POST_GEN_DIALYSATE_STATE_DATA_T postGenDialysateData; postGenDialysateData.postGenDialysateExecState = postGenDialysateState; broadcastData( MSG_ID_DD_POST_GEN_DIALYSATE_STATE_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&postGenDialysateData, sizeof( POST_GEN_DIALYSATE_STATE_DATA_T ) ); postGenDialysatePublishTimerCounter = 0; } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testDDPostGenDialysateDataPublishIntervalOverride function overrides the * DD post generate dialysate mode data publish interval. * @details \b Inputs: postGenDialysateModePublishInterval * @details \b Outputs: postGenDialysateModePublishInterval * @param Override message from Dialin which includes the interval * (in ms) to override the DD post generate dialysate data publish interval to. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testDDPostGenDialysateDataPublishIntervalOverride( MESSAGE_T *message ) { BOOL result = u32BroadcastIntervalOverride( message, &postGenDialysateModePublishInterval, TASK_GENERAL_INTERVAL ); return result; } /**@}*/