/* * CommBuffers.c * * Created on: Aug 2, 2024 * Author: fw */ #include "string.h" // For memset #include "can.h" #include "CommBuffers.h" #define NUM_OF_FW_STACKS 3 #define CAN_MESSAGE_PAYLOAD_SIZE 8 typedef struct { U32 SWUpdateFrameCount; BOOL isUpdateBufferReady; U08 SWUpdateBuffer[ SW_UPDATE_BUFFER_SIZE ]; } SW_UPDATE_STATUS_T; static const SW_UPDATE_CAN_MAIL_BOXES_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = { SW_UPDATE_TD_UPDATE, SW_UPDATE_DD_UPDATE, SW_UPDATE_RO_UPDATE }; static const U32 NUM_OF_CAN_FRAMES_TO_UPDATE = SW_UPDATE_BUFFER_SIZE / CAN_MESSAGE_PAYLOAD_SIZE; static SW_UPDATE_STATUS_T SWUpdateStatus; static void resetSWUpdateVariables( void ); static void consumeReceivedCANFrame( U08* data ); void initCommBuffers( void ) { resetSWUpdateVariables(); } BOOL isSWUpdateBufferReady( void ) { return SWUpdateStatus.isUpdateBufferReady; } void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ) { // TODO do we need check the range of the messages? if ( SW_UPDATE_RESP == MailBox ) { // transmit } else if ( SW_UPDATE_COMMAD == MailBox ) { } else { SW_UPDATE_CAN_MAIL_BOXES_T thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; if ( thisStackMailBox == MailBox ) { U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) { U32 result = canGetData( canREG1, MailBox, data ); if ( result != 0 ) { consumeReceivedCANFrame( data ); } } } } } static void resetSWUpdateVariables( void ) { SWUpdateStatus.SWUpdateFrameCount = 0; SWUpdateStatus.SWUpdateFrameCount = FALSE; memcpy( SWUpdateStatus.SWUpdateBuffer, 0x0, SW_UPDATE_BUFFER_SIZE ); } static void consumeReceivedCANFrame( U08* data ) { if ( SWUpdateStatus.SWUpdateFrameCount <= NUM_OF_CAN_FRAMES_TO_UPDATE ) { U32 currentBufferIndex = SWUpdateStatus.SWUpdateFrameCount * CAN_MESSAGE_PAYLOAD_SIZE; memcpy( SWUpdateStatus.SWUpdateBuffer + currentBufferIndex, data, CAN_MESSAGE_PAYLOAD_SIZE ); SWUpdateStatus.isUpdateBufferReady = ( NUM_OF_CAN_FRAMES_TO_UPDATE == SWUpdateStatus.SWUpdateFrameCount ? TRUE : FALSE ); // TODO test code remove //if (TRUE == SWUpdateStatus.isUpdateBufferReady) if ( NUM_OF_CAN_FRAMES_TO_UPDATE == SWUpdateStatus.SWUpdateFrameCount ) { BOOL test = FALSE; } // TODO remove SWUpdateStatus.SWUpdateFrameCount++; } }