Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r6c60d0d0300828750c76f2e397d4e7ccaa84bbb2 -r05b4d416b6bd5e7af4347f112a20f9f81a257064 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 6c60d0d0300828750c76f2e397d4e7ccaa84bbb2) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 05b4d416b6bd5e7af4347f112a20f9f81a257064) @@ -844,16 +844,17 @@ *************************************************************************/ static void checkTooManyBadMsgCRCs( U16 msgID ) { - U32 listTimeInMS = calcTimeSince( badCRCTimeStamps[ badCRCListIdx ] ); + U32 listTimeInMS; // replace oldest bad CRC in list with this new one badCRCTimeStamps[ badCRCListIdx ] = getMSTimerCount(); // move list index to next position (may wrap) - badCRCListIdx = INC_WRAP( badCRCListIdx, 0, MAX_COMM_CRC_FAILURES ); + badCRCListIdx = INC_WRAP( badCRCListIdx, 0, MAX_COMM_CRC_FAILURES - 1 ); // update list count badCRCListCount = INC_CAP( badCRCListCount, MAX_COMM_CRC_FAILURES ); // check if too many bad CRCs in window of time - if ( listTimeInMS >= MAX_COMM_CRC_FAILURE_WINDOW_MS ) + listTimeInMS = calcTimeSince( badCRCTimeStamps[ badCRCListIdx ] ); + if ( listTimeInMS <= MAX_COMM_CRC_FAILURE_WINDOW_MS ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_COMM_TOO_MANY_BAD_CRCS, (U32)msgID ); } @@ -884,14 +885,10 @@ _disable_IRQ(); // slot selection needs interrupt protection if ( FALSE == pendingAckList[ i ].used ) { - S16 seqNo = msg->hdr.seqNo; + S16 seqNo = msg->hdr.seqNo * -1; // remove ACK bit from seq # pendingAckList[ i ].used = TRUE; _enable_IRQ(); - if ( seqNo < 0 ) - { - seqNo *= -1; - } pendingAckList[ i ].seqNo = seqNo; pendingAckList[ i ].channel = channel; pendingAckList[ i ].timeStamp = getMSTimerCount(); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r6c60d0d0300828750c76f2e397d4e7ccaa84bbb2 -r05b4d416b6bd5e7af4347f112a20f9f81a257064 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6c60d0d0300828750c76f2e397d4e7ccaa84bbb2) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 05b4d416b6bd5e7af4347f112a20f9f81a257064) @@ -109,16 +109,19 @@ // prefix data with message sync byte data[ msgSize++ ] = MESSAGE_SYNC_BYTE; - // set sequence # and ACK bit + // set sequence # and ACK bit (unless this is an ACK to a received message) #ifndef ACK_NOT_IMPLEMENTED - // thread protect next sequence # access & increment - _disable_IRQ(); - msg.hdr.seqNo = nextSeqNo; - nextSeqNo = INC_WRAP( nextSeqNo, MIN_MSG_SEQ_NO, MAX_MSG_SEQ_NO ); - _enable_IRQ(); - if ( TRUE == ackReq ) + if ( msg.hdr.msgID != MSG_ID_ACK ) { - msg.hdr.seqNo *= -1; + // thread protect next sequence # access & increment + _disable_IRQ(); + msg.hdr.seqNo = nextSeqNo; + nextSeqNo = INC_WRAP( nextSeqNo, MIN_MSG_SEQ_NO, MAX_MSG_SEQ_NO ); + _enable_IRQ(); + if ( TRUE == ackReq ) + { + msg.hdr.seqNo *= -1; + } } #endif