Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -11,20 +11,12 @@ #include "CommBuffers.h" #include "Utilities.h" -#define NUM_OF_FW_STACKS 3 -#define CAN_MESSAGE_PAYLOAD_SIZE 8 -#define SW_UPDATE_FINAL_MSG_INDEX 0xFFFF +#define NUM_OF_FW_STACKS 3 +#define CAN_MESSAGE_PAYLOAD_SIZE 8 +#define SW_UPDATE_FINAL_MSG_INDEX 0xFFFF typedef struct { - U08 msgID; - U08 updateCmd; - U16 cyberRandom; - U32 msgCRC; -} SW_UPDATE_CMD_STATUS_T; - -typedef struct -{ U32 SWUpdateFrameCount; U08 msgID; U08 updateDest; @@ -43,7 +35,7 @@ static const U32 NUM_OF_CAN_FRAMES_TO_UPDATE = ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_PAYLOAD_SIZE ) / CAN_MESSAGE_PAYLOAD_SIZE; -static const SW_UPDATE_CAN_MAIL_BOXES_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = +static const SW_UPDATE_CAN_MAIL_BOX_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = { SW_UPDATE_TD_UPDATE, SW_UPDATE_DD_UPDATE, @@ -53,18 +45,21 @@ static SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; static SW_UPDATE_RCV_STATUS_T SWUpdateRcvStatus; static SW_UPDATE_BUFFER_STATUS_T SWUpdateBufferStatus; +static SW_UPDATE_CAN_MAIL_BOX_T thisStackMailBox; static void consumeReceivedUpdateCANFrame( U08* data ); static void processReceivedUpdateCANFrame( void ); static void processRecievedCmdCANFrame( U08* data ); void initCommBuffers( void ) { - clearSWUpdateBuffer( TRUE ); - clearSWUpdateBuffer( FALSE ); + thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; + + clearSWUpdateBuffer( SW_UPDATE_COMMAD ); + clearSWUpdateBuffer( thisStackMailBox ); } -void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ) +void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T MailBox ) { // TODO do we need check the range of the messages? @@ -84,8 +79,6 @@ } else { - SW_UPDATE_CAN_MAIL_BOXES_T thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; - if ( thisStackMailBox == MailBox ) { if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) @@ -109,37 +102,52 @@ void getSWUpdateBuffer( U08* data ) { - memcpy( data, &SWUpdateRcvStatus.SWUpdateBuffer, sizeof( SWUpdateRcvStatus.SWUpdateBuffer ) ); + memcpy( data, SWUpdateRcvStatus.SWUpdateBuffer, sizeof( SWUpdateRcvStatus.SWUpdateBuffer ) ); } -void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, BOOL cmd ) +void getSWUpdateCmdStatus( SW_UPDATE_CMD_STATUS_T* status ) { + memcpy( status, &SWUpdateCmdStatus, sizeof( SW_UPDATE_CMD_STATUS_T ) ); +} + +void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, SW_UPDATE_CAN_MAIL_BOX_T mailBox ) +{ SW_UPDATE_RESP_STATUS_T resp; U32 calcCRC = 0; - resp.msgID = ( TRUE == cmd ? SWUpdateCmdStatus.msgID : SWUpdateRcvStatus.msgID ); + resp.msgID = ( SW_UPDATE_COMMAD == mailBox ? SWUpdateCmdStatus.msgID : SWUpdateRcvStatus.msgID ); resp.msgAckNackStatus = status; resp.cyberRandom = 0; resp.msgCRC = crc32( calcCRC, (U08*)&resp, sizeof( SW_UPDATE_RESP_STATUS_T ) - sizeof( U32 ) ); if ( 0 != canTransmit( canREG1, (U32)SW_UPDATE_RESP, (U08*)&resp ) ) { - clearSWUpdateBuffer( cmd ); + //clearSWUpdateBuffer( mailBox ); } } -void clearSWUpdateBuffer( BOOL cmd ) +void clearSWUpdateBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { - if ( FALSE == cmd ) + switch ( mailBox ) { - memset( &SWUpdateRcvStatus, 0x0, sizeof( SW_UPDATE_RCV_STATUS_T ) ); - memset( &SWUpdateBufferStatus, 0x0, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); + case SW_UPDATE_COMMAD: + memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); + // After setting the buffer to 0 set the command status to idle since the 0 is start, so the standby mode does not transition to update mode + SWUpdateCmdStatus.updateCmd = UPDATE_CMD_IDLE; + break; + + case SW_UPDATE_TD_UPDATE: + case SW_UPDATE_DD_UPDATE: + case SW_UPDATE_RO_UPDATE: + memset( &SWUpdateRcvStatus, 0x0, sizeof( SW_UPDATE_RCV_STATUS_T ) ); + memset( &SWUpdateBufferStatus, 0x0, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); + break; + + default: + // Do nothing, no other buffers need to be cleared + break; } - else - { - memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); - } } @@ -199,8 +207,8 @@ } else { - sendAckNackStatusFromFirmware( ACK, FALSE ); - clearSWUpdateBuffer( FALSE ); + sendAckNackStatusFromFirmware( ACK, thisStackMailBox ); + clearSWUpdateBuffer( thisStackMailBox ); } break; @@ -235,6 +243,6 @@ hasCRCPassed = ( SWUpdateRcvStatus.msgCRC == calcCRC ? TRUE : FALSE ); ackStatus = ( TRUE == hasCRCPassed ? ACK : NACK ); - sendAckNackStatusFromFirmware( ackStatus, TRUE ); + sendAckNackStatusFromFirmware( ackStatus, SW_UPDATE_COMMAD ); }