Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r699c4f96ab672fb9db9ac218a5a00358dc68c2c6 -r2db16f950f61815bd8be6d7d300a82eb1f6ee6da --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 699c4f96ab672fb9db9ac218a5a00358dc68c2c6) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 2db16f950f61815bd8be6d7d300a82eb1f6ee6da) @@ -231,45 +231,57 @@ * @return none *************************************************************************/ void execSystemCommTx( void ) -{ - // if CAN transmitter is idle, start transmitting any pending packets - if ( ( FALSE == dgIsOnlyCANNode ) && ( FALSE == isCAN1TransmitInProgress() ) ) - { - transmitNextCANPacket(); - } - else - { // generally, transmitter should not be busy at time of this function call - check timeout just in case so we don't get stuck waiting forever - if ( TRUE == didTimeout( lastCANPacketSentTimeStamp, CAN_XMIT_PACKET_TIMEOUT_MS ) ) +{ + // don't bother with transmitting if no other nodes on CAN bus + if ( FALSE == dgIsOnlyCANNode ) + { + // if CAN transmitter is idle, start transmitting any pending packets + if ( FALSE == isCAN1TransmitInProgress() ) { - // assume last packet was not successfully transmitted. Re-send last packet. - if ( ++canXmitRetryCtr <= MAX_XMIT_RETRIES ) + transmitNextCANPacket(); + } + else + { + // generally, transmitter should not be busy at time of this function call - check timeout just in case so we don't get stuck waiting forever + if ( TRUE == didTimeout( lastCANPacketSentTimeStamp, CAN_XMIT_PACKET_TIMEOUT_MS ) ) { - canTransmit( canREG1, lastCANPacketSentChannel, lastCANPacketSent ); -#ifdef DEBUG_ENABLED + // assume last packet was not successfully transmitted. Re-send last packet. + if ( ++canXmitRetryCtr <= MAX_XMIT_RETRIES ) { - char debugStr[100]; - sprintf( debugStr, "SystemComm-DG resend Last Frame.\n" ); - sendDebugDataToUI( (U08*)debugStr ); - } -#endif - } - // we must be only node on CAN bus - nobody is ACKing our transmitted frames - else - { - dgIsOnlyCANNode = TRUE; // set only CAN node flag - canXmitRetryCtr = MAX_XMIT_RETRIES; - signalCANXmitsCompleted(); // clear pending xmit flag - clearCANXmitBuffers(); // clear xmit buffers - nothing is going out right now + // ensure we have a previous CAN packet/channel to resend - canTransmit() channel param MUST be valid + if ( ( lastCANPacketSentChannel > COMM_BUFFER_NOT_USED ) && ( lastCANPacketSentChannel <= COMM_BUFFER_LAST_CAN_BUFFER ) ) + { + canTransmit( canREG1, lastCANPacketSentChannel, lastCANPacketSent ); + } #ifdef DEBUG_ENABLED - { - char debugStr[100]; - sprintf( debugStr, "SystemComm-DG is only node.\n" ); - sendDebugDataToUI( (U08*)debugStr ); + { + char debugStr[100]; + strcpy( debugStr, "SystemComm-DG resend Last Frame.\n" ); + sendDebugData( (U08*)debugStr, strlen(debugStr) ); + sendDebugDataToUI( (U08*)debugStr ); + } +#endif } + // we must be only node on CAN bus - nobody is ACKing our transmitted frames + else + { + if ( FALSE == dgIsOnlyCANNode ) + { +#ifdef DEBUG_ENABLED + char debugStr[100]; + strcpy( debugStr, "SystemComm-DG is only node.\n" ); + sendDebugData( (U08*)debugStr, strlen(debugStr) ); + sendDebugDataToUI( (U08*)debugStr ); #endif - } - } - } + dgIsOnlyCANNode = TRUE; // set only CAN node flag + canXmitRetryCtr = MAX_XMIT_RETRIES; + signalCANXmitsCompleted(); // clear pending xmit flag + clearCANXmitBuffers(); // clear xmit buffers - nothing is going out right now + } + } // end - are we retrying xmit or are we alone on CAN bus + } // end - pending xmit timeout? + } // end - transmit in progress or not + } // end - DG not alone on CAN bus #ifdef DEBUG_ENABLED // if UART transmitter is idle, start transmitting any pending packets @@ -883,7 +895,8 @@ #ifdef DEBUG_ENABLED { char debugStr[100]; - sprintf( debugStr, "SystemComm-DG-Bad Msg CRC.\n" ); + + strcpy( debugStr, "SystemComm-DG-Bad Msg CRC.\n" ); sendDebugDataToUI( (U08*)debugStr ); } #endif