/* * CommBuffers.c * * Created on: Aug 2, 2024 * Author: fw */ #include // For memcpy #include "CommBuffers.h" #include "Utilities.h" #define MAX_NUM_OF_CAN_BYTES ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_PAYLOAD_SIZE ) typedef struct { U32 SWUpdateFrameCount; U08 SWUpdateBuffer[ MAX_NUM_OF_CAN_BYTES ]; } SW_UPDATE_BUFFER_T; static SW_UPDATE_BUFFER_T SWUpdateBuffer[ NUM_OF_SW_UPDATE_MBOXES ]; void initCommBuffers( void ) { SW_UPDATE_CAN_MAIL_BOX_T mailBox; for ( mailBox = SW_UPDATE_NOT_USED; mailBox < NUM_OF_SW_UPDATE_MBOXES; mailBox++ ) { clearCommBuffer( mailBox ); } } BOOL addToCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data, U32 len ) { BOOL status = FALSE; if ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) { _disable_IRQ(); U32 currentFrameCount = SWUpdateBuffer[ mailBox ].SWUpdateFrameCount; if ( ( currentFrameCount * CAN_MESSAGE_PAYLOAD_SIZE ) <= MAX_NUM_OF_CAN_BYTES ) { U32 currentBufferIndex = currentFrameCount * len; memcpy( SWUpdateBuffer[ mailBox ].SWUpdateBuffer + currentBufferIndex, data, len ); SWUpdateBuffer[ mailBox ].SWUpdateFrameCount += 1; status = TRUE; } _enable_IRQ(); } return status; } BOOL getCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data, U32 len ) { BOOL status = FALSE; if ( ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) && ( len <= MAX_NUM_OF_CAN_BYTES ) ) { _disable_IRQ(); memcpy( data, SWUpdateBuffer[ mailBox ].SWUpdateBuffer, len ); status = TRUE; _enable_IRQ(); } return status; } S32 getNumberOfBytesInBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { S32 bytes = -1; if ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) { bytes = SWUpdateBuffer[ mailBox ].SWUpdateFrameCount * CAN_MESSAGE_PAYLOAD_SIZE; } return bytes; } void clearCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { _disable_IRQ(); if ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) { memset( &SWUpdateBuffer[ mailBox ], 0x0, sizeof( SW_UPDATE_BUFFER_T ) ); } _enable_IRQ(); } // ********** private functions **********