Index: firmware/App/Modes/ModeGenPermeate.c =================================================================== diff -u -rcecaee70fe37b4622df8d1f10811a1d6721077a4 -rbe33dd1fa4f538d9247075c893e0d0c2ef3f6a28 --- firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision cecaee70fe37b4622df8d1f10811a1d6721077a4) +++ firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision be33dd1fa4f538d9247075c893e0d0c2ef3f6a28) @@ -42,7 +42,7 @@ static RO_GENP_MODE_STATE_T genPermeateState; ///< Currently active generate permeate water state. static U32 genPermeateDataPublicationTimerCounter; ///< Used to schedule generate permeate data publication to CAN bus. static OVERRIDE_U32_T genPermeateDataPublishInterval; ///< Generate permeate mode data publish interval. -static U32 stateDelayTime; ///< Time stamp to track delay before valve switch. +static U32 stateDelayTime; ///< Time stamp to track delay before valve switch. // ********** private function prototypes ********** @@ -95,6 +95,13 @@ *************************************************************************/ U32 execGenPermeateMode( void ) { + LEVEL_STATE_T level = getLevelStatus(); + + if ( LEVEL_STATE_ILLEGAL == level ) + { + // TODO: Raise illegal level alarm + } + // execute current gen permeate state switch ( genPermeateState ) { @@ -109,13 +116,15 @@ case RO_GENP_WATER_FULL_STATE: genPermeateState = handleGenPWaterFullState(); break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, state ) + break;: } //Publish Gen permeate mode data publishGenPermeateModeData(); return genPermeateState; - } /*********************************************************************//** @@ -136,20 +145,20 @@ // Do nothing break; case RO_GENP_WATER_LOW_STATE: - setValveState(M4_VALV,VALVE_STATE_OPEN); - setValveState(M7_VALV,VALVE_STATE_CLOSED); - setValveState(P6_VALV,VALVE_STATE_CLOSED); - setValveState(P39_VALV,VALVE_STATE_OPEN); - setValveState(P11_VALV, VALVE_STATE_OPEN); + setValveState( M4_VALV,VALVE_STATE_OPEN ); + setValveState( M7_VALV,VALVE_STATE_CLOSED ); + setValveState( P6_VALV,VALVE_STATE_CLOSED ); + setValveState( P39_VALV,VALVE_STATE_OPEN ); + setValveState( P11_VALV, VALVE_STATE_OPEN ); stateDelayTime = getMSTimerCount(); break; case RO_GENP_WATER_FULL_STATE: //set - setValveState(M4_VALV,VALVE_STATE_CLOSED); - setValveState(M7_VALV,VALVE_STATE_CLOSED); - setValveState(P6_VALV,VALVE_STATE_CLOSED); - setValveState(P39_VALV,VALVE_STATE_OPEN); - setValveState(P11_VALV, VALVE_STATE_CLOSED); + setValveState( M4_VALV,VALVE_STATE_CLOSED ); + setValveState( M7_VALV,VALVE_STATE_CLOSED ); + setValveState( P6_VALV,VALVE_STATE_CLOSED ); + setValveState( P39_VALV,VALVE_STATE_OPEN ); + setValveState( P11_VALV, VALVE_STATE_CLOSED ); stateDelayTime = getMSTimerCount(); break; default: @@ -162,7 +171,7 @@ * The handleGenPStartState handles the initial state of gen permeate. * @details \b Inputs: none * @details \b Outputs: none - * @return the current state of gen permeate mode + * @return the next state of gen permeate mode *************************************************************************/ static RO_GENP_MODE_STATE_T handleGenPStartState( void ) { @@ -172,96 +181,74 @@ if ( LEVEL_STATE_HIGH == level ) { - setModeGenPStateTransition(RO_GENP_WATER_FULL_STATE); + setModeGenPStateTransition( RO_GENP_WATER_FULL_STATE ); state = RO_GENP_WATER_FULL_STATE; } - else if ( LEVEL_STATE_MEDIUM == level ) + else if ( ( LEVEL_STATE_MEDIUM == level ) || ( LEVEL_STATE_LOW == level ) ) { - setModeGenPStateTransition(RO_GENP_WATER_LOW_STATE); + setModeGenPStateTransition( RO_GENP_WATER_LOW_STATE ); state = RO_GENP_WATER_LOW_STATE; } - else if (LEVEL_STATE_LOW == level ) - { - setModeGenPStateTransition(RO_GENP_WATER_LOW_STATE); - state = RO_GENP_WATER_LOW_STATE; - } - - else // Illegal level state - { - - } return state; } /*********************************************************************//** * @brief - * The handleGenPWaterLowState handles the initial state of gen permeate. - * @details \b Inputs: none + * The handleGenPWaterLowState handles the low water state of gen permeate. + * @details \b Inputs: stateDelayTime * @details \b Outputs: none - * @return the current state of gen permeate mode + * @return the next state of gen permeate mode *************************************************************************/ static RO_GENP_MODE_STATE_T handleGenPWaterLowState( void ) { RO_GENP_MODE_STATE_T state = RO_GENP_WATER_LOW_STATE; LEVEL_STATE_T level = getLevelStatus(); - if ( ( LEVEL_STATE_HIGH == level ) && ( TRUE == didTimeout( stateDelayTime, GEN_PERMEATE_TIMEOUT_MS ) ) ) + if (LEVEL_STATE_LOW == level ) { - setModeGenPStateTransition(RO_GENP_WATER_FULL_STATE); - state = RO_GENP_WATER_FULL_STATE; + // TODO: Trigger fault alarm. + // TODO: We need to wait for tank to fill to medium } - else if ( LEVEL_STATE_MEDIUM == level ) + else if ( ( LEVEL_STATE_HIGH == level ) ) { - + setModeGenPStateTransition( RO_GENP_WATER_FULL_STATE ); + state = RO_GENP_WATER_FULL_STATE; } - else if (LEVEL_STATE_LOW == level ) + else if ( LEVEL_STATE_MEDIUM == level ) { - + // expected state. Need to monitor? } - else // Illegal level state - { - - } return state; } /*********************************************************************//** * @brief - * The handleGenPWaterFullState handles the initial state of gen permeate. + * The handleGenPWaterFullState handles the high water state of gen permeate. * @details \b Inputs: none * @details \b Outputs: none - * @return the current state of gen permeate mode + * @return the next state of gen permeate mode *************************************************************************/ static RO_GENP_MODE_STATE_T handleGenPWaterFullState( void ) { RO_GENP_MODE_STATE_T state = RO_GENP_WATER_FULL_STATE; LEVEL_STATE_T level = getLevelStatus(); - if ( ( LEVEL_STATE_MEDIUM == level ) && ( TRUE == didTimeout( stateDelayTime, GEN_PERMEATE_TIMEOUT_MS ) ) ) + if (LEVEL_STATE_LOW == level ) { - setModeGenPStateTransition(RO_GENP_WATER_LOW_STATE); - state = RO_GENP_WATER_LOW_STATE; + // TODO: Trigger fault alarm. } - else if ( LEVEL_STATE_HIGH == level ) + else if ( ( LEVEL_STATE_MEDIUM >= level ) && ( TRUE == didTimeout( stateDelayTime, GEN_PERMEATE_TIMEOUT_MS ) ) ) { - + setModeGenPStateTransition( RO_GENP_WATER_LOW_STATE ); + state = RO_GENP_WATER_LOW_STATE; } - else if (LEVEL_STATE_LOW == level ) - { - - } - - else // Illegal level state - { - - } return state; } /** @@ -309,7 +296,7 @@ GEN_PERMEATE_MODE_DATA_T data; data.genPermeateExecState = (U32)getCurrentGenPermeateState(); - data.setFlowRate = (U32)getDDPermeateFlowRate(); + data.setFlowRate = (F32)getDDPermeateFlowRate(); broadcastData( MSG_ID_DD_GEN_DIALYSATE_MODE_DATA, COMM_BUFFER_OUT_CAN_RO_BROADCAST, (U08*)&data, sizeof( GEN_PERMEATE_MODE_DATA_T ) ); Index: firmware/App/Services/DDInterface.h =================================================================== diff -u -rf8bdb3ff260a42f46e178d08979758789db7c307 -rbe33dd1fa4f538d9247075c893e0d0c2ef3f6a28 --- firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision f8bdb3ff260a42f46e178d08979758789db7c307) +++ firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision be33dd1fa4f538d9247075c893e0d0c2ef3f6a28) @@ -5,7 +5,7 @@ * 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 ROInterface.h +* @file DDInterface.h * * @author (last) Michael Garthwaite * @date (last) 03-Mar-2025 @@ -38,8 +38,6 @@ void initDDInterface( void ); void execDDInterfaceMonitor( void ); - - F32 getDDPermeateFlowRate( void ); DD_OP_MODE_T getDDOpMode( void ); Index: firmware/App/Services/Messaging.h =================================================================== diff -u -rf8bdb3ff260a42f46e178d08979758789db7c307 -rbe33dd1fa4f538d9247075c893e0d0c2ef3f6a28 --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision f8bdb3ff260a42f46e178d08979758789db7c307) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision be33dd1fa4f538d9247075c893e0d0c2ef3f6a28) @@ -37,7 +37,6 @@ void handleIncomingMessage( MESSAGE_T *message ); BOOL handleUnhandledMsg( MESSAGE_T *message ); - BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); BOOL broadcastAlarmCleared( U32 alarm ); BOOL broadcastAlarmConditionCleared( U32 alarm );