#ifndef __MAILBOX_H__#define __MAILBOX_H__#include <stdint.h>#include <stdlib.h>#include <string.h>typedef struct{ // uint32_t Capacity; uint8_t * Memory; uint32_t MailSize; uint32_t MailCount; uint32_t ReadIndex; uint32_t ReadCount;} MAILBOX;// Creates a new mailbox and Init it.MAILBOX * MBX_Create( uint32_t MailSize, uint32_t MailCount );// Deletes a specified mailbox.void MBX_Delete( MAILBOX * Mailbox );// Clears all messages in a specified mailbox.void MBX_Clear( MAILBOX * Mailbox );// Init a new mailbox.void MBX_Init( MAILBOX * Mailbox, uint32_t MailSize, uint32_t MailCount, void * Memory );// Stores a new message of a predefined size in a mailbox.uint32_t MBX_Write( MAILBOX * Mailbox, void * Mail );/* * Stores a new message of a predefined size into a mailbox in front of all * other messages, if the mailbox is able to accept one more message. * The new message will be retrieved first. */uint32_t MBX_WriteFront( MAILBOX * Mailbox, void * Mail );/* Retrieves a new message of a predefined size from a mailbox. * Mail : Pointer to the memory area that the message should be stored at. * Make sure that it points to a valid memory area and that there is sufficient * space for an entiremessage. The message size (in bytes) was defined * when the mailbox was created. */uint32_t MBX_Read( MAILBOX * Mailbox, void * Mail );// Returns the number of mail currently available in a specified mailbox.uint32_t MBX_GetCount( MAILBOX * Mailbox );#endif /* __MAILBOX_H__ */
#include "mailbox.h"#include "macro_misc.h"#include "cmsis_os.h"// Creates a new mailbox and Init it.MAILBOX * MBX_Create( uint32_t MailSize, uint32_t MailCount ){ uint32_t Size = ALIGN_UP( sizeof(MAILBOX), 4 ) + MailSize * MailCount; MAILBOX * Mailbox = (MAILBOX *) osMalloc( Size, osWaitForever ); if ( Mailbox == 0 ) return Mailbox; uint8_t * Memory = // (uint8_t *) ( ( (uint32_t) ( Mailbox ) ) + ALIGN_UP( sizeof(MAILBOX), 4 ) ); MBX_Init( Mailbox, MailSize, MailCount, Memory ); return Mailbox;}// Deletes a specified mailbox.void MBX_Delete( MAILBOX * Mailbox ){ osFree( Mailbox );}// Clears all messages in a specified mailbox.void MBX_Clear( MAILBOX * Mailbox ){ Mailbox->ReadCount = 0;}// Returns the number of mail currently available in a specified mailbox.uint32_t MBX_GetCount( MAILBOX * Mailbox ){ return Mailbox->ReadCount;}// Init a new mailbox.void MBX_Init( MAILBOX * Mailbox, uint32_t MailSize, uint32_t MailCount, void * Memory ){ // Mailbox->Capacity = MailCount * MailSize; Mailbox->MailSize = MailSize; Mailbox->MailCount = MailCount; Mailbox->Memory = Memory; Mailbox->ReadIndex = 0; Mailbox->ReadCount = 0;}/* Stores a new message of a predefined size in a mailbox. * * 0: Message could not be stored (mailbox is full). * 1: Success; message stored. */uint32_t MBX_Write( MAILBOX * Mailbox, void * Mail ){ if ( Mailbox->ReadCount == Mailbox->MailCount ) return 0; uint32_t Value = osDisableInterrupt( ); uint32_t IndexToWrite = ( Mailbox->ReadIndex + Mailbox->ReadCount ); if ( IndexToWrite == Mailbox->MailCount ) IndexToWrite = 0; uint32_t MemoryIndexToWrite = IndexToWrite * Mailbox->MailSize; memcpy( &Mailbox->Memory[ MemoryIndexToWrite ], Mail, Mailbox->MailSize ); Mailbox->ReadCount++; osRestoreInterrupt( Value ); return 1;}/* * Stores a new message of a predefined size into a mailbox in front of all * other messages, if the mailbox is able to accept one more message. * The new message will be retrieved first. * * 0: Message could not be stored (mailbox is full). * 1: Success; message stored. */uint32_t MBX_WriteFront( MAILBOX * Mailbox, void * Mail ){ if ( Mailbox->ReadCount == Mailbox->MailCount ) return 0; if ( Mailbox->ReadCount == 0 ) return MBX_Write( Mailbox, Mail ); uint32_t Value = osDisableInterrupt( ); uint32_t IndexToWrite; if ( Mailbox->ReadIndex ) IndexToWrite = Mailbox->ReadIndex - 1; else IndexToWrite = Mailbox->MailCount - 1; uint32_t MemoryIndexToWrite = IndexToWrite * Mailbox->MailSize; memcpy( &Mailbox->Memory[ MemoryIndexToWrite ], Mail, Mailbox->MailSize ); Mailbox->ReadIndex = IndexToWrite; Mailbox->ReadCount++; osRestoreInterrupt( Value ); return 1;}/* Retrieves a new message of a predefined size from a mailbox. * Mail : Pointer to the memory area that the message should be stored at. * Make sure that it points to a valid memory area and that there is sufficient * space for an entiremessage. The message size (in bytes) was defined * when the mailbox was created. * * 0: Message could not be retrieved (mailbox is empty) * 1: Success; message retrieved. */uint32_t MBX_Read( MAILBOX * Mailbox, void * Mail ){ if ( Mailbox->ReadCount == 0 ) return 0; uint32_t Value = osDisableInterrupt( ); uint32_t MemoryIndexToRead = Mailbox->ReadIndex * Mailbox->MailSize; memcpy( Mail, &Mailbox->Memory[ MemoryIndexToRead ], Mailbox->MailSize ); Mailbox->ReadIndex++; if ( Mailbox->ReadIndex == Mailbox->MailCount ) Mailbox->ReadIndex = 0; Mailbox->ReadCount--; osRestoreInterrupt( Value ); return 1;}