Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rac305d5eedc7fb0e85adef5cd4aa34e58e94e3b8 -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ac305d5eedc7fb0e85adef5cd4aa34e58e94e3b8) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2024 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 SystemComm.c * -* @author (last) Dara Navaei -* @date (last) 20-May-2023 +* @author (last) Sean Nash +* @date (last) 05-Oct-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -21,14 +21,15 @@ #include "sci.h" #include "sys_dma.h" -#include "DrainPump.h" -#include "SystemComm.h" #include "Comm.h" +#include "DrainPump.h" +#include "Heaters.h" #include "Interrupts.h" #include "OperationModes.h" +#include "SystemComm.h" +#include "SystemCommMessages.h" #include "Timers.h" #include "Utilities.h" -#include "SystemCommMessages.h" /** * @addtogroup SystemComm @@ -56,6 +57,9 @@ #define MAX_FPGA_CLOCK_SPEED_ERRORS 3 ///< maximum number of FPGA clock speed errors within window period before alarm #define MAX_FPGA_CLOCK_SPEED_ERROR_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< FPGA clock speed error window +#define PENDING_ACK_LIST_OVERRIDE_UI_CHANNEL 1 ///< Value for determining UI channel when Pending ACKs are overriden. +#define PENDING_ACK_LIST_OVERRIDE_DG_CHANNEL 2 ///< Value for determining HD channel when Pending ACKs are overriden. + #pragma pack(push, 1) /// Record for transmitted message that is pending acknowledgement from receiver. @@ -106,6 +110,7 @@ static U32 canXmitRetryCtr = 0; ///< counter for CAN transmit retries. static OVERRIDE_U32_T hdCommunicationStatus = {0, 0, 0, 0}; ///< has HD sent a message since last check static volatile U32 timeOfLastHDCheckIn = 0; ///< last time we received an HD broadcast +static OVERRIDE_U32_T pendingACKOverride = { 0, 0, 0, 0 }; ///< Pending ACK override data structure. // ********** private function prototypes ********** @@ -160,7 +165,7 @@ *************************************************************************/ BOOL isHDCommunicating( void ) { - return getU32OverrideValue(&hdCommunicationStatus); + return getU32OverrideValue( &hdCommunicationStatus ); } /*********************************************************************//** @@ -668,6 +673,8 @@ if ( TRUE == didTimeout( timeOfLastHDCheckIn, HD_COMM_TIMEOUT_IN_MS ) ) { hdCommunicationStatus.data = FALSE; + setHDOperationMode( 0, 0 ); // If HD off or not connected, consider HD mode is fault. + stopHeater( DG_TRIMMER_HEATER ); // If HD off or not connected, ensure trimmer heater is off. } } @@ -748,13 +755,18 @@ BOOL result = FALSE; U32 i; - // find match + // Find match for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) { if ( ( TRUE == pendingAckList[ i ].used ) && ( pendingAckList[ i ].seqNo == seqNo ) ) - { // remove message pending ACK from list - pendingAckList[ i ].used = FALSE; + { result = TRUE; + // Remove message pending ACK from list + if ( ( ( getU32OverrideValue( &pendingACKOverride ) != PENDING_ACK_LIST_OVERRIDE_UI_CHANNEL ) || ( pendingAckList[ i ].channel != COMM_BUFFER_OUT_CAN_DG_2_UI ) ) && + ( ( getU32OverrideValue( &pendingACKOverride ) != PENDING_ACK_LIST_OVERRIDE_DG_CHANNEL ) || ( pendingAckList[ i ].channel != COMM_BUFFER_OUT_CAN_DG_2_HD ) ) ) + { + pendingAckList[ i ].used = FALSE; + } break; } } @@ -881,6 +893,10 @@ handleHDStartStopTrimmerHeaterCmd( message ); break; + case MSG_ID_DG_PARK_CONCENTRATE_PUMPS_CMD_REQUEST: + handleParkConecentratePumpsCmd( message ); + break; + case MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD: handleDGStartStopTrimmerHeater( message ); break; @@ -1028,7 +1044,7 @@ handleTestValveStateOverrideRequest( message ); break; - case MSG_ID_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE: + case MSG_ID_DG_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE: handleTestValvesStatesPublishIntervalOverrideRequest( message ); break; @@ -1356,6 +1372,38 @@ handleTestDGSetRecoverFromFaultModeSignal( message ); break; + case MSG_ID_DG_DRAIN_MODE_BROADCAST_INTERVAL_OVERRIDE: + handleTestDGDrainModeBroadcastOverrideRequest( message ); + break; + + case MSG_ID_DG_DIALIN_RO_ONLY_MODE_STATUS_REQUEST: + handleDGROStatusRequest( message ); + break; + + case MSG_ID_DG_RAM_STATUS_OVERRIDE: + handleTestDGRAMStatusOverrideRequest( message ); + break; + + case MSG_ID_DG_RESERVOIR_BROADCAST_INTERVAL_OVERRIDE: + handleTestDGReservoirOverrideRequest( message ); + break; + + case MSG_ID_DG_CAN_RECEIVE_ACK_MESSAGE_OVERRIDE: + handleTestDGPendingACKOverrideRequest( message ); + break; + + case MSG_ID_DG_STATE_TIMER_82C_OVERRIDE: + handleTestDG82CStateTimerOverride( message ); + break; + + case MSG_ID_DG_STATE_TIMER_77C_OVERRIDE: + handleTestDG77CStateTimerOverride( message ); + break; + + case MSG_ID_DG_CHEM_DISINFECT_ACID_OVERRIDE: + handleTestChemDisinfectAcidOverride( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; @@ -1413,4 +1461,48 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetPendingACKOverride function overrides the + * pendingACKOverride variable. + * @details Inputs: none + * @details Outputs: pendingACKOverride + * @param value override for pendingACKOverride + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetPendingACKOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + pendingACKOverride.ovData = value; + pendingACKOverride.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetPendingACKOverride function resets the override + * of the pendingACKOverride variable. + * @details Inputs: none + * @details Outputs: pendingACKOverride + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetPendingACKOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + pendingACKOverride.override = OVERRIDE_RESET; + pendingACKOverride.ovData = pendingACKOverride.ovInitData; + } + + return result; +} /**@}*/