Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r933a18d740285e70be9d00696ed0f5a5381bc8e4 -r911f6526ec3ba03ba0131681c7fb371c0abda6bb --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 933a18d740285e70be9d00696ed0f5a5381bc8e4) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 911f6526ec3ba03ba0131681c7fb371c0abda6bb) @@ -15,7 +15,7 @@ * ***************************************************************************/ -#include // for memcpy() +#include // For memcpy() #include "can.h" #include "sci.h" @@ -28,40 +28,36 @@ #include "Utilities.h" #include "SystemCommMessages.h" -#ifdef RM46_EVAL_BOARD_TARGET - #include "CPLD.h" -#endif - /** * @addtogroup SystemComm * @{ */ // ********** private definitions ********** -#define NUM_OF_CAN_OUT_BUFFERS 5 ///< number of CAN buffers for transmit -#define NUM_OF_CAN_IN_BUFFERS 7 ///< number of CAN buffers for receiving +#define NUM_OF_CAN_OUT_BUFFERS 5 ///< Number of CAN buffers for transmit +#define NUM_OF_CAN_IN_BUFFERS 7 ///< Number of CAN buffers for receiving #ifndef DEBUG_ENABLED - #define NUM_OF_MSG_IN_BUFFERS 7 ///< number of Msg buffers for receiving + #define NUM_OF_MSG_IN_BUFFERS 7 ///< Number of Msg buffers for receiving #else #define NUM_OF_MSG_IN_BUFFERS 8 #define SCI1_RECEIVE_DMA_REQUEST 30 #define SCI1_TRANSMIT_DMA_REQUEST 31 #endif -#define CAN_XMIT_PACKET_TIMEOUT_MS 200 ///< if transmitted CAN frame does not cause a transmit complete interrupt within this time, re-send or move on -#define MAX_XMIT_RETRIES 5 ///< maximum number of retries on no transmit complete interrupt timeout +#define CAN_XMIT_PACKET_TIMEOUT_MS 200 ///< If transmitted CAN frame does not cause a transmit complete interrupt within this time, re-send or move on +#define MAX_XMIT_RETRIES 5 ///< Maximum number of retries on no transmit complete interrupt timeout #define UI_COMM_TIMEOUT_IN_MS 5000 ///< UI has not checked in for this much time #define DG_COMM_TIMEOUT_IN_MS 2000 ///< DG has not checked in for this much time -#define MAX_COMM_CRC_FAILURES 5 ///< maximum number of CRC errors within window period before alarm +#define MAX_COMM_CRC_FAILURES 5 ///< Maximum number of CRC errors within window period before alarm #define MAX_COMM_CRC_FAILURE_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< CRC error window -#define MSG_NOT_ACKED_TIMEOUT_MS 150 ///< maximum time for a Denali message that requires ACK to be ACK'd -#define MSG_NOT_ACKED_MAX_RETRIES 3 ///< maximum number of times a message that requires ACK that was not ACK'd can be re-sent before alarm -#define PENDING_ACK_LIST_SIZE 25 ///< maximum number of Delanli messages that can be pending ACK at any given time +#define MSG_NOT_ACKED_TIMEOUT_MS 150 ///< Maximum time for a Denali message that requires ACK to be ACK'd +#define MSG_NOT_ACKED_MAX_RETRIES 3 ///< Maximum number of times a message that requires ACK that was not ACK'd can be re-sent before alarm +#define PENDING_ACK_LIST_SIZE 25 ///< Maximum number of Delanli messages that can be pending ACK at any given time #pragma pack(push, 1) @@ -110,22 +106,22 @@ static CAN_MESSAGE_BOX_T lastCANPacketSentChannel = (CAN_MESSAGE_BOX_T)0; ///< Keep channel last packet was sent on CAN bus in case we need to re-send. static U32 lastCANPacketSentTimeStamp = 0; ///< Keep time last packet sent on CAN bus so we can timeout on transmission attempt. -static volatile PENDING_ACK_RECORD_T pendingAckList[ PENDING_ACK_LIST_SIZE ]; ///< list of outgoing messages that are awaiting an ACK +static volatile PENDING_ACK_RECORD_T pendingAckList[ PENDING_ACK_LIST_SIZE ]; ///< List of outgoing messages that are awaiting an ACK -static volatile BOOL hdIsOnlyCANNode = TRUE; ///< flag indicating whether HD is alone on CAN bus. -static U32 canXmitRetryCtr = 0; ///< counter for CAN transmit retries. -static volatile BOOL dgIsCommunicating = FALSE; ///< has DG sent a message since last check -static U32 timeOfLastDGCheckIn = 0; ///< last time DG checked in -static volatile BOOL uiIsCommunicating = FALSE; ///< has UI sent a message since last check -static U32 timeOfLastUICheckIn = 0; ///< last time UI checked in -static volatile BOOL uiDidCommunicate = FALSE; ///< has UI every sent a message +static volatile BOOL hdIsOnlyCANNode = TRUE; ///< Flag indicating whether HD is alone on CAN bus. +static U32 canXmitRetryCtr = 0; ///< Counter for CAN transmit retries. +static volatile BOOL dgIsCommunicating = FALSE; ///< Has DG sent a message since last check +static U32 timeOfLastDGCheckIn = 0; ///< Last time DG checked in +static volatile BOOL uiIsCommunicating = FALSE; ///< Has UI sent a message since last check +static U32 timeOfLastUICheckIn = 0; ///< Last time UI checked in +static volatile BOOL uiDidCommunicate = FALSE; ///< Has UI every sent a message #ifdef EMC_TEST_BUILD - static U32 badCANCount; // test code in support of EMC testing + static U32 badCANCount; // Test code in support of EMC testing #endif #ifdef DEBUG_ENABLED - // debug buffers + // Debug buffers static U08 pcXmitPacket[ 1024 ]; static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; @@ -170,14 +166,14 @@ U32 i; #ifdef DEBUG_ENABLED - // initialize UART and DMA for PC communication + // Initialize UART and DMA for PC communication initUARTAndDMA(); #endif - // initialize bad message CRC time windowed count + // Initialize bad message CRC time windowed count initTimeWindowedCount( TIME_WINDOWED_COUNT_BAD_MSG_CRC, MAX_COMM_CRC_FAILURES, MAX_COMM_CRC_FAILURE_WINDOW_MS ); - // initialize pending ACK list + // Initialize pending ACK list for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) { pendingAckList[ i ].used = FALSE; @@ -277,16 +273,16 @@ *************************************************************************/ void execSystemCommRx( void ) { - // parse messages from comm buffers and queue them + // Parse messages from comm buffers and queue them processIncomingData(); - // process received messages in the queue + // Process received messages in the queue processReceivedMessages(); - // check for sub-system comm timeouts + // Check for sub-system comm timeouts checkForCommTimeouts(); - // check ACK list for messages that need to be re-sent because they haven't been ACK'd + // Check ACK list for messages that need to be re-sent because they have not been ACK'd checkPendingACKList(); } @@ -300,23 +296,23 @@ *************************************************************************/ void execSystemCommTx( void ) { - // don't bother with transmitting if no other nodes on CAN bus + // Do not transmit if no other nodes on CAN bus if ( FALSE == hdIsOnlyCANNode ) { - // if CAN transmitter is idle, start transmitting any pending packets + // If CAN transmitter is idle, start transmitting any pending packets if ( 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 + // Generally, transmitter should not be busy at time of this function call - check timeout just in case so we do not get stuck waiting forever if ( TRUE == didTimeout( lastCANPacketSentTimeStamp, CAN_XMIT_PACKET_TIMEOUT_MS ) ) { - // assume last packet was not successfully transmitted. Re-send last packet. + // Assume last packet was not successfully transmitted. Re-send last packet. if ( ++canXmitRetryCtr <= MAX_XMIT_RETRIES ) { - // ensure we have a previous CAN packet/channel to resend - canTransmit() channel param MUST be valid + // 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 ); @@ -330,13 +326,13 @@ } #endif } - // we must be only node on CAN bus - nobody is ACKing our transmitted frames + // We must be only node on CAN bus - nobody is ACKing our transmitted frames else { - hdIsOnlyCANNode = TRUE; // set only CAN node flag + hdIsOnlyCANNode = 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 + signalCANXmitsCompleted(); // Clear pending xmit flag + clearCANXmitBuffers(); // Clear xmit buffers - nothing is going out right now #ifdef DEBUG_ENABLED { char debugStr[100]; @@ -350,7 +346,7 @@ } #ifdef DEBUG_ENABLED - // if UART transmitter is idle, start transmitting any pending packets + // If UART transmitter is idle, start transmitting any pending packets if ( FALSE == isSCI1DMATransmitInProgress() ) { transmitNextUARTPacket(); @@ -371,14 +367,14 @@ *************************************************************************/ void handleCANMsgInterrupt( CAN_MESSAGE_BOX_T srcCANBox ) { - // message interrupt is for a transmit message box? + // Message interrupt is for a transmit message box? if ( TRUE == isCANBoxForXmit( srcCANBox ) ) { U32 bytesXmitted; bytesXmitted = transmitNextCANPacket(); - // if nothing more to send, signal that transmitter is available + // If nothing more to send, signal that transmitter is available if ( 0 == bytesXmitted ) { signalCANXmitsCompleted(); @@ -388,22 +384,22 @@ { U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; - // get CAN packet received on given CAN message box + // Get CAN packet received on given CAN message box if ( FALSE != canIsRxMessageArrived( canREG1, srcCANBox ) ) { U32 result = canGetData( canREG1, srcCANBox, data ); - // if packet retrieved, add to buffer + // If packet retrieved, add to buffer if ( result != 0 ) { - // add CAN packet to appropriate comm buffer based on the message box it came in on (s/b same #) + // Add CAN packet to appropriate comm buffer based on the message box it came in on (s/b same #) addToCommBuffer( srcCANBox, data, CAN_MESSAGE_PAYLOAD_SIZE ); } } } else { - // shouldn't get here - not an active message box + // Should not get here - not an active message box // TODO - s/w fault? } } @@ -419,9 +415,9 @@ #ifdef DEBUG_ENABLED void handleUARTMsgRecvPacketInterrupt( void ) { - // buffer received packet + // Buffer received packet addToCommBuffer( COMM_BUFFER_IN_UART_PC, pcRecvPacket, PC_MESSAGE_PACKET_SIZE ); - // prepare to receive next packet + // Prepare to receive next packet dmaSetCtrlPacket( DMA_CH1, pcDMARecvControlRecord ); dmaSetChEnable( DMA_CH1, DMA_HW ); setSCI1DMAReceiveInterrupt(); @@ -463,50 +459,50 @@ dmaEnableInterrupt( DMA_CH1, BTC ); dmaEnableInterrupt( DMA_CH3, BTC ); - // assign DMA channels to h/w DMA requests + // Assign DMA channels to h/w DMA requests dmaReqAssign( DMA_CH1, SCI1_RECEIVE_DMA_REQUEST ); dmaReqAssign( DMA_CH3, SCI1_TRANSMIT_DMA_REQUEST ); - // set DMA channel priorities + // Set DMA channel priorities dmaSetPriority( DMA_CH1, HIGHPRIORITY ); dmaSetPriority( DMA_CH3, LOWPRIORITY ); - // initialize PC DMA Transmit Control Record - pcDMAXmitControlRecord.PORTASGN = 4; // port B (only choice per datasheet) - pcDMAXmitControlRecord.DADD = (U32)(&(sciREG->TD)); // dest. is SCI2 xmit register - pcDMAXmitControlRecord.SADD = (U32)pcXmitPacket; // source - pcDMAXmitControlRecord.CHCTRL = 0; // no chaining - pcDMAXmitControlRecord.ELCNT = 1; // frame is 1 element - pcDMAXmitControlRecord.FRCNT = PC_MESSAGE_PACKET_SIZE; // block is 8 frames - pcDMAXmitControlRecord.RDSIZE = ACCESS_8_BIT; // element size is 1 byte + // Initialize PC DMA Transmit Control Record + pcDMAXmitControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + pcDMAXmitControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI2 xmit register + pcDMAXmitControlRecord.SADD = (U32)pcXmitPacket; // Source + pcDMAXmitControlRecord.CHCTRL = 0; // No chaining + pcDMAXmitControlRecord.ELCNT = 1; // Frame is 1 element + pcDMAXmitControlRecord.FRCNT = PC_MESSAGE_PACKET_SIZE; // Block is 8 frames + pcDMAXmitControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte pcDMAXmitControlRecord.WRSIZE = ACCESS_8_BIT; // - pcDMAXmitControlRecord.TTYPE = FRAME_TRANSFER; // transfer type is block transfer - pcDMAXmitControlRecord.ADDMODEWR = ADDR_FIXED; // dest. addressing mode is fixed - pcDMAXmitControlRecord.ADDMODERD = ADDR_INC1; // source addressing mode is post-increment - pcDMAXmitControlRecord.AUTOINIT = AUTOINIT_OFF; // auto-init off - pcDMAXmitControlRecord.ELSOFFSET = 0; // not used - pcDMAXmitControlRecord.ELDOFFSET = 0; // not used - pcDMAXmitControlRecord.FRSOFFSET = 0; // not used - pcDMAXmitControlRecord.FRDOFFSET = 0; // not used + pcDMAXmitControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + pcDMAXmitControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed + pcDMAXmitControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment + pcDMAXmitControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + pcDMAXmitControlRecord.ELSOFFSET = 0; // Not used + pcDMAXmitControlRecord.ELDOFFSET = 0; // Not used + pcDMAXmitControlRecord.FRSOFFSET = 0; // Not used + pcDMAXmitControlRecord.FRDOFFSET = 0; // Not used - // initialize PC DMA Receipt Control Record - pcDMARecvControlRecord.PORTASGN = 4; // port B (only choice per datasheet) - pcDMARecvControlRecord.SADD = (U32)(&(sciREG->RD)); // source is SCI2 recv register - pcDMARecvControlRecord.DADD = (U32)pcRecvPacket; // transfer destination address - pcDMARecvControlRecord.CHCTRL = 0; // no chaining - pcDMARecvControlRecord.ELCNT = 1; // frame is 1 element - pcDMARecvControlRecord.FRCNT = PC_MESSAGE_PACKET_SIZE; // block is 8 frames - pcDMARecvControlRecord.RDSIZE = ACCESS_8_BIT; // element size is 1 byte + // Initialize PC DMA Receipt Control Record + pcDMARecvControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + pcDMARecvControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI2 recv register + pcDMARecvControlRecord.DADD = (U32)pcRecvPacket; // Transfer destination address + pcDMARecvControlRecord.CHCTRL = 0; // No chaining + pcDMARecvControlRecord.ELCNT = 1; // Frame is 1 element + pcDMARecvControlRecord.FRCNT = PC_MESSAGE_PACKET_SIZE; // Block is 8 frames + pcDMARecvControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte pcDMARecvControlRecord.WRSIZE = ACCESS_8_BIT; // - pcDMARecvControlRecord.TTYPE = FRAME_TRANSFER; // transfer type is block transfer - pcDMARecvControlRecord.ADDMODERD = ADDR_FIXED; // source addressing mode is fixed - pcDMARecvControlRecord.ADDMODEWR = ADDR_INC1; // dest. addressing mode is post-increment - pcDMARecvControlRecord.AUTOINIT = AUTOINIT_OFF; // auto-init off - pcDMARecvControlRecord.ELDOFFSET = 0; // not used - pcDMARecvControlRecord.ELSOFFSET = 0; // not used - pcDMARecvControlRecord.FRDOFFSET = 0; // not used - pcDMARecvControlRecord.FRSOFFSET = 0; // not used + pcDMARecvControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + pcDMARecvControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed + pcDMARecvControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment + pcDMARecvControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + pcDMARecvControlRecord.ELDOFFSET = 0; // Not used + pcDMARecvControlRecord.ELSOFFSET = 0; // Not used + pcDMARecvControlRecord.FRDOFFSET = 0; // Not used + pcDMARecvControlRecord.FRSOFFSET = 0; // Not used - // initiate PC packet receiving readiness via DMA + // Initiate PC packet receiving readiness via DMA dmaSetCtrlPacket( DMA_CH1, pcDMARecvControlRecord ); dmaSetChEnable( DMA_CH1, DMA_HW ); setSCI1DMAReceiveInterrupt(); @@ -602,13 +598,13 @@ COMM_BUFFER_T result = COMM_BUFFER_NOT_USED; U32 i; - // search for next priority CAN packet to transmit + // Search for next priority CAN packet to transmit for ( i = 0; i < NUM_OF_CAN_OUT_BUFFERS; i++ ) { if ( numberOfBytesInCommBuffer( CAN_OUT_BUFFERS[ i ] ) >= CAN_MESSAGE_PAYLOAD_SIZE ) { result = CAN_OUT_BUFFERS[ i ]; - break; // found highest priority packet to transmit - we're done + break; // Found highest priority packet to transmit - we are done } } @@ -628,19 +624,19 @@ 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 a buffer is found with a packet to transmit, get packet from buffer and transmit it if ( buffer != COMM_BUFFER_NOT_USED ) { 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 there is another CAN packet to send, send it if ( dataSize == CAN_MESSAGE_PAYLOAD_SIZE ) { - // we're transmitting another packet - signal transmitter is busy + // We are transmitting another packet - signal transmitter is busy signalCANXmitsInitiated(); - // remember packet data being transmitted here in case transmission fails and we need to re-send + // Remember packet data being transmitted here in case transmission fails and we need to re-send memcpy( lastCANPacketSent, data, CAN_MESSAGE_PAYLOAD_SIZE ); lastCANPacketSentChannel = mBox; lastCANPacketSentTimeStamp = getMSTimerCount(); @@ -651,13 +647,12 @@ else { signalCANXmitsCompleted(); - // TODO - shouldn't get here, but let's see if we do - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)mBox ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, (U32)mBox ) } } 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_HD_SOFTWARE_FAULT, (U32)buffer, (U32)dataSize ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, ((U32)buffer << 16) | dataSize ) } } @@ -682,11 +677,11 @@ { result = getFromCommBuffer( COMM_BUFFER_OUT_UART_PC, pcXmitPacket, dataPend ); - // if there's data to transmit, transmit it + // If there is data to transmit, transmit it if ( result > 0 ) { signalSCI1XmitsInitiated(); - pcDMAXmitControlRecord.FRCNT = result; // set DMA transfer size + pcDMAXmitControlRecord.FRCNT = result; // Set DMA transfer size dmaSetCtrlPacket( DMA_CH3, pcDMAXmitControlRecord ); dmaSetChEnable( DMA_CH3, DMA_HW ); setSCI1DMATransmitInterrupt(); @@ -712,77 +707,77 @@ *************************************************************************/ static void processIncomingData( void ) { - U08 data[ 512 ]; // message work space + U08 data[ 512 ]; // Message work space U32 i; BOOL badCRCDetected = FALSE; - // queue any received messages + // Queue any received messages for ( i = 0; i < NUM_OF_MSG_IN_BUFFERS; i++ ) { - BOOL messagesInBuffer = TRUE; // assume true at first to get into while loop + BOOL messagesInBuffer = TRUE; // Assume true at first to get into while loop while ( TRUE == messagesInBuffer ) { U32 numOfBytesInBuffer; - // assume false so we don't get stuck in loop - only set to true if we find another complete message in buffer + // Assume false so we do not get stuck in loop. Set to true only if we find another complete message in buffer messagesInBuffer = FALSE; - // since messages can have 8-byte alignment padding left unconsumed by last get, get padding out of buffer + // Since messages can have 8-byte alignment padding left unconsumed by last get, get padding out of buffer consumeBufferPaddingBeforeSync( MSG_IN_BUFFERS[ i ] ); - // do we have enough bytes in buffer for smallest message? + // Do we have enough bytes in buffer for smallest message? numOfBytesInBuffer = numberOfBytesInCommBuffer( MSG_IN_BUFFERS[ i ] ); if ( numOfBytesInBuffer >= MESSAGE_OVERHEAD_SIZE ) - { // peek at minimum of all bytes available or max message size (+1 for sync byte) + { // Peek at minimum of all bytes available or max message size (+1 for sync byte) U32 bytesPeeked = peekFromCommBuffer( MSG_IN_BUFFERS[ i ], data, MIN( numOfBytesInBuffer, sizeof( MESSAGE_WRAPPER_T ) + 1 ) ); S32 msgSize = parseMessageFromBuffer( data, bytesPeeked ); - hdIsOnlyCANNode = FALSE; // if we're getting a message, we can't be alone + hdIsOnlyCANNode = FALSE; // Since we are getting a message, this indicates we are not the only node on the CAN bus canXmitRetryCtr = 0; - if ( msgSize > 0 ) // valid, complete message found? + if ( msgSize > 0 ) // Valid, complete message found? { MESSAGE_WRAPPER_T rcvMsg; - U08 *dataPtr = data+1; // skip over sync byte + U08 *dataPtr = data+1; // Skip over sync byte - // consume message (+sync byte) + // Consume message (+sync byte) msgSize = getFromCommBuffer( MSG_IN_BUFFERS[ i ], data, msgSize + 1 ); - // convert received message data to a message and add to message queue - messagesInBuffer = TRUE; // keep processing this buffer - // blank the new message record + // Convert received message data to a message and add to message queue + messagesInBuffer = TRUE; // Keep processing this buffer + // Blank the new message record blankMessageInWrapper( &rcvMsg ); - // copy message header portion of message data to the new message + // Copy message header portion of message data to the new message memcpy( &(rcvMsg.msg.hdr), dataPtr, sizeof(MESSAGE_HEADER_T) ); dataPtr += sizeof(MESSAGE_HEADER_T); - // copy message payload portion of message data to the new message + // Copy message payload portion of message data to the new message memcpy( &(rcvMsg.msg.payload), dataPtr, rcvMsg.msg.hdr.payloadLen ); dataPtr += rcvMsg.msg.hdr.payloadLen; - // copy CRC portion of message data to the new message + // Copy CRC portion of message data to the new message rcvMsg.crc = *dataPtr; - // add new message to queue for later processing + // Add new message to queue for later processing addToMsgQueue( MSG_Q_IN, &rcvMsg ); - // if message from DG broadcast channel, update DG comm status + // If message from DG broadcast channel, update DG comm status if ( COMM_BUFFER_IN_CAN_DG_BROADCAST == MSG_IN_BUFFERS[ i ] ) { dgIsCommunicating = TRUE; timeOfLastDGCheckIn = getMSTimerCount(); } } - else if ( -1 == msgSize ) // candidate message with bad CRC found? + else if ( -1 == msgSize ) // Candidate message with bad CRC found? { badCRCDetected = TRUE; #ifdef EMC_TEST_BUILD badCANCount++; broadcastCANErrorCount( badCANCount ); #endif - getFromCommBuffer( MSG_IN_BUFFERS[ i ], data, 1 ); // consume sync byte so we can re-sync - messagesInBuffer = TRUE; // keep processing this buffer - } // looks like there is a complete message in the comm buffer - } // enough data left in comm buffer to possibly be a complete message - } // while loop to get all complete messages for each comm buffer - } // for loop to check all comm buffers for messages + getFromCommBuffer( MSG_IN_BUFFERS[ i ], data, 1 ); // Consume sync byte so we can re-sync + messagesInBuffer = TRUE; // Keep processing this buffer + } // Looks like there is a complete message in the comm buffer + } // Enough data left in comm buffer to possibly be a complete message + } // While loop to get all complete messages for each comm buffer + } // For loop to check all comm buffers for messages - // if any bad CRCs detected, see if too many + // If any bad CRCs detected, see if too many if ( TRUE == badCRCDetected ) { checkTooManyBadMsgCRCs(); @@ -803,15 +798,15 @@ U08 data; U32 numOfBytesInBuffer = numberOfBytesInCommBuffer( buffer ); - // consume bytes out of buffer 1 at a time until we find the sync byte or it's empty + // Consume bytes out of buffer 1 at a time until we find the sync byte or it is empty while ( numOfBytesInBuffer > 0 ) { peekFromCommBuffer( buffer, &data, 1 ); if ( MESSAGE_SYNC_BYTE == data ) { - break; // we found a sync - we're done + break; // We found a sync - we are done } - else // not a sync byte, so consume it + else // Not a sync byte, so consume it { getFromCommBuffer( buffer, &data, 1 ); numOfBytesInBuffer = numberOfBytesInCommBuffer( buffer ); @@ -839,27 +834,27 @@ for ( i = 0; i < len; i++ ) { - // find sync byte + // Find sync byte if ( MESSAGE_SYNC_BYTE == data[ i ] ) { - U32 pos = i + 1; // skip past sync byte implemented + U32 pos = i + 1; // Skip past sync byte implemented U32 remSize = len - pos; - // if a minimum sized msg would fit in remaining, continue + // If a minimum sized msg would fit in remaining, continue if ( remSize >= MESSAGE_OVERHEAD_SIZE ) { payloadSize = data[ pos + sizeof(MESSAGE_HEADER_T) - sizeof(U08) ]; msgSize = MESSAGE_OVERHEAD_SIZE + payloadSize; - // we now know the size of the message - we can now know if full message is contained in buffer + // We now know the size of the message - we can now know if full message is contained in buffer if ( msgSize <= remSize ) - { // check CRC to make sure it's a valid message + { // Check CRC to make sure it is a valid message if ( data[i+msgSize] == crc8( &data[pos], msgSize - 1 ) ) { - result = msgSize; // we found a complete, valid message of this size + result = msgSize; // We found a complete, valid message of this size } else // CRC failed { - result = -1; // we found a complete, invalid message + result = -1; // We found a complete, invalid message } } } @@ -880,30 +875,30 @@ *************************************************************************/ static void processReceivedMessages( void ) { - BOOL isThereMsgRcvd = TRUE; // assume TRUE at first to get into while loop + BOOL isThereMsgRcvd = TRUE; // Assume TRUE at first to get into while loop MESSAGE_WRAPPER_T message; while ( TRUE == isThereMsgRcvd ) { - // see if any messages received + // See if any messages received isThereMsgRcvd = getFromMsgQueue( MSG_Q_IN, &message ); if ( TRUE == isThereMsgRcvd ) { // CRC should be good because we checked it during parsing before adding to queue - but check it again for good measure if ( message.crc == crc8( (U08*)(&message), sizeof(MESSAGE_HEADER_T) + message.msg.hdr.payloadLen ) ) { - // if ACK, mark pending message ACK'd - if ( MSG_ID_ACK == message.msg.hdr.msgID ) + // If ACK, mark pending message ACK'd + if ( MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK == message.msg.hdr.msgID ) { matchACKtoPendingACKList( message.msg.hdr.seqNo ); } else { - // if received message requires ACK, queue one up + // If received message requires ACK, queue one up if ( message.msg.hdr.seqNo < 0 ) { sendACKMsg( &message.msg ); } - // process the received message + // Process the received message processReceivedMessage( &message.msg ); } } @@ -985,13 +980,13 @@ BOOL result = FALSE; U32 i; - // find first open slot in pending ACK list and add given msg data to it + // Find first open slot in pending ACK list and add given msg data to it for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) { - _disable_IRQ(); // slot selection needs interrupt protection + _disable_IRQ(); // Slot selection needs interrupt protection if ( FALSE == pendingAckList[ i ].used ) { - S16 seqNo = msg->hdr.seqNo * -1; // remove ACK bit from seq # + S16 seqNo = msg->hdr.seqNo * -1; // Remove ACK bit from seq # pendingAckList[ i ].used = TRUE; _enable_IRQ(); @@ -1030,11 +1025,11 @@ 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 + { // Remove message pending ACK from list pendingAckList[ i ].used = FALSE; result = TRUE; break; @@ -1057,25 +1052,25 @@ { U32 i; - // find expired messages pending ACK + // Find expired messages pending ACK for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) - { // pending ACK expired? + { // Pending ACK expired? if ( ( TRUE == pendingAckList[ i ].used ) && ( TRUE == didTimeout( pendingAckList[ i ].timeStamp, MSG_NOT_ACKED_TIMEOUT_MS ) ) ) - { // if retries left, reset and resend pending message + { // If retries left, reset and resend pending message if ( pendingAckList[ i ].retries > 0 ) - { // re-queue message for transmit + { // Re-queue message for transmit pendingAckList[ i ].retries--; pendingAckList[ i ].timeStamp = getMSTimerCount(); addToCommBuffer( pendingAckList[ i ].channel, (U08*)pendingAckList[ i ].msg, pendingAckList[ i ].msgSize ); } - // if no retries left, alarm + // If no retries left, alarm else { U16 msgID; memcpy( &msgID, (U08*)&pendingAckList[ i ].msg[ sizeof( U08 ) + sizeof( U16) ], sizeof( U16 ) ); SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); - pendingAckList[ i ].used = FALSE; // take pending message off of list + pendingAckList[ i ].used = FALSE; // Take pending message off of list } } } @@ -1093,24 +1088,25 @@ { U16 msgID = message->hdr.msgID; - // handle any messages from other sub-systems + // Handle any messages from other sub-systems switch ( msgID ) { case MSG_ID_OFF_BUTTON_PRESS: handleOffButtonConfirmMsgFromUI( message ); -#ifdef RM46_EVAL_BOARD_TARGET - setUserLED( TRUE ); -#endif break; case MSG_ID_ALARM_TRIGGERED: handleAlarmTriggered( message ); break; - case MSG_ID_ALARM_CLEARED: + case MSG_ID_ALARM_CONDITION_CLEARED: handleAlarmCleared( message ); break; + case MSG_ID_UI_ALARM_USER_ACTION: + handleAlarmUserAction( message ); + break; + case MSG_ID_DG_CHECK_IN: handleDGCheckIn( message ); break; @@ -1175,8 +1171,8 @@ handleDGReservoirData( message ); break; - case MSG_ID_TESTER_LOGIN_REQUEST: - handleTesterLogInRequest( message ); + case MSG_ID_USER_REQUEST_ALARM_SILENCE: + handleUIAlarmSilenceRequest( message ); break; case MSG_ID_UI_NEW_TREATMENT_PARAMS: @@ -1199,12 +1195,20 @@ handleChangePressureLimitsRequest( message ); break; + case MSG_ID_UI_SET_UF_VOLUME_PARAMETER: + handleUFVolumeSetRequest( message ); + break; + + case MSG_ID_TESTER_LOGIN_REQUEST: + handleTesterLogInRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; } - // handle any test messages if tester has logged in successfully + // Handle any test messages if tester has logged in successfully if ( ( msgID > MSG_ID_FIRST_TESTER_MESSAGE ) && ( msgID <= END_OF_MSG_IDS ) && ( TRUE == isTestingActivated() ) ) { switch ( msgID ) @@ -1253,10 +1257,6 @@ handleTestBloodFlowBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_ALARM_STATUS_SEND_INTERVAL_OVERRIDE: - handleTestAlarmStatusBroadcastIntervalOverrideRequest( message ); - break; - case MSG_ID_BLOOD_PUMP_MEAS_SPEED_OVERRIDE: handleTestBloodPumpMeasuredSpeedOverrideRequest( message ); break;