Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r8f8776e48894e31cba816ebef2edf96d14306ba8 -r4a41a54d255afc5cef0599e2a832927ed2b0ee5d --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8f8776e48894e31cba816ebef2edf96d14306ba8) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 4a41a54d255afc5cef0599e2a832927ed2b0ee5d) @@ -72,10 +72,12 @@ static g_dmaCTRL pcDMAXmitControlRecord; // DMA transmit control record (UART-debug) static g_dmaCTRL pcDMARecvControlRecord; // DMA receive control record (UART-debug) -static BOOL dgIsCommunicating = FALSE; // has DG sent a message since last check -static BOOL uiIsCommunicating = FALSE; // has UI sent a message since last check -static BOOL uiDidCommunicate = FALSE; // has UI every sent a message +static volatile BOOL canXmitSucceeded = FALSE; // indicates that the last CAN packet transmitted was successful +static volatile BOOL dgIsCommunicating = FALSE; // has DG sent a message since last check +static volatile BOOL uiIsCommunicating = FALSE; // has UI sent a message since last check +static volatile BOOL uiDidCommunicate = FALSE; // has UI every sent a message + // ********** private function prototypes ********** static void initUARTAndDMA( void ); @@ -250,14 +252,12 @@ // message interrupt is for a transmit message box? if ( TRUE == isCANBoxForXmit( srcCANBox ) ) { - if ( FALSE == canIsTxMessagePending( canREG1, srcCANBox ) ) - { - U32 bytesXmitted = transmitNextCANPacket(); + //U32 bytesXmitted = transmitNextCANPacket(); - if ( 0 == bytesXmitted ) - { - signalCANXmitsCompleted(); - } + //if ( 0 == bytesXmitted ) + { + canXmitSucceeded = TRUE; + signalCANXmitsCompleted(); } } else if ( TRUE == isCANBoxForRecv( srcCANBox ) ) @@ -485,33 +485,43 @@ static U32 transmitNextCANPacket( void ) { U32 result = 0; - COMM_BUFFER_T buffer = findNextHighestPriorityCANPacketToTransmit(); - - // if a buffer is found with a packet to transmit, get packet from buffer and transmit it - if ( buffer != COMM_BUFFER_NOT_USED ) + while ( 1 ) // TODO - add timeout and/or max packets per call { - U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; - U32 dataSize = getFromCommBuffer( buffer, data, CAN_MESSAGE_PAYLOAD_SIZE ); - CAN_MESSAGE_BOX_T mBox = buffer; // CAN message boxes and comm buffers are aligned + COMM_BUFFER_T buffer = findNextHighestPriorityCANPacketToTransmit(); - // if there's another CAN packet to send, send it - if ( dataSize == CAN_MESSAGE_PAYLOAD_SIZE ) + // if a buffer is found with a packet to transmit, get packet from buffer and transmit it + if ( buffer != COMM_BUFFER_NOT_USED ) { - signalCANXmitsInitiated(); - if ( 0 != canTransmit( canREG1, mBox, data ) ) + U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; + U32 dataSize = getFromCommBuffer( buffer, data, CAN_MESSAGE_PAYLOAD_SIZE ); + CAN_MESSAGE_BOX_T mBox = buffer; // CAN message boxes and comm buffers are aligned + + // if there's another CAN packet to send, send it + if ( dataSize == CAN_MESSAGE_PAYLOAD_SIZE ) { - result = CAN_MESSAGE_PAYLOAD_SIZE; + signalCANXmitsInitiated(); + if ( 0 != canTransmit( canREG1, mBox, data ) ) + { + result = CAN_MESSAGE_PAYLOAD_SIZE; + + canXmitSucceeded = FALSE; + while ( FALSE == canXmitSucceeded ); // TODO - add timeout (2ms) + } + else + { + signalCANXmitsCompleted(); + // TODO - shouldn't get here, but let's see if we do + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_SOFTWARE_FAULT, (U32)mBox ) + } } else - { - signalCANXmitsCompleted(); - // TODO - shouldn't get here, but let's see if we do - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_SOFTWARE_FAULT, (U32)mBox ) + { // TODO - shouldn't get here - just testing - set first data to new s/w fault enum later + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, (U32)buffer, (U32)dataSize ) } } else - { // TODO - shouldn't get here - just testing - set first data to new s/w fault enum later - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, (U32)buffer, (U32)dataSize ) + { + break; } }