Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -redd2e65f2ee38fbfdb3d5d3dd06412758ffb1f3a -r8c56613f3786e5605c61824fd75af59702dae648 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision edd2e65f2ee38fbfdb3d5d3dd06412758ffb1f3a) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8c56613f3786e5605c61824fd75af59702dae648) @@ -60,7 +60,8 @@ #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 or DG channel when Pending ACKs are overriden. +#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 DG channel when Pending ACKs are overriden. #pragma pack(push, 1) @@ -878,15 +879,24 @@ static BOOL matchACKtoPendingACKList( S16 seqNo ) { BOOL result = FALSE; - U32 i; + U32 i; // 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; + { + if ( ( ( getU32OverrideValue( &pendingACKOverride ) == PENDING_ACK_LIST_OVERRIDE_UI_CHANNEL ) && ( pendingAckList[ i ].channel == COMM_BUFFER_OUT_CAN_HD_2_UI ) ) || + ( ( getU32OverrideValue( &pendingACKOverride ) == PENDING_ACK_LIST_OVERRIDE_DG_CHANNEL ) && ( pendingAckList[ i ].channel == COMM_BUFFER_OUT_CAN_HD_2_DG ) ) ) + { + pendingAckList[ i ].used = TRUE; + result = FALSE; + } + else // Remove message pending ACK from list + { + pendingAckList[ i ].used = FALSE; + result = TRUE; + } break; } } @@ -910,7 +920,7 @@ // Find expired messages pending ACK for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) { // Pending ACK expired? - if ( ( TRUE == pendingAckList[ i ].used ) && ( ( TRUE == didTimeout( pendingAckList[ i ].timeStamp, MSG_NOT_ACKED_TIMEOUT_MS ) ) || ( getU32OverrideValue( &pendingACKOverride ) > 0 ) ) ) + if ( ( TRUE == pendingAckList[ i ].used ) && ( ( TRUE == didTimeout( pendingAckList[ i ].timeStamp, MSG_NOT_ACKED_TIMEOUT_MS ) ) ) ) { // If retries left, reset and resend pending message if ( pendingAckList[ i ].retries > 0 ) { // Re-queue message for transmit @@ -925,8 +935,7 @@ memcpy( &msgID, (U08*)&pendingAckList[ i ].msg[ sizeof( U08 ) + sizeof( U16) ], sizeof( U16 ) ); - if ( ( pendingAckList[ i ].channel != COMM_BUFFER_OUT_CAN_HD_2_DG ) || - ( getU32OverrideValue( &pendingACKOverride ) == PENDING_ACK_LIST_OVERRIDE_UI_CHANNEL ) ) + if ( pendingAckList[ i ].channel != COMM_BUFFER_OUT_CAN_HD_2_DG ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_CAN_MESSAGE_NOT_ACKED_BY_UI, (U32)msgID ); }