RabbitECUTeensyMCUXpresso/source/OS/MSG.c

175 lines
3.7 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:KERNEL */
/* PACKAGE TITLE: MSG */
/* DESCRIPTION: This code provides functions for OS messaging */
/* */
/* FILE NAME: MSG.c */
/* REVISION HISTORY: 28-03-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#define __MSG_C
#include "mk64f12.h"
#include <TYPES.h>
#include <DECLARATIONS.h>
#include "MSG.h"
MSG_tstMBX MSG_astMBX[MSG_nMBXCount];
static sint32 MSG_u32GetFreeMBX(void);
void MSG_vStart(uint32* const pu32Stat)
{
uint32 u32MBXIDX;
for (u32MBXIDX = 0; u32MBXIDX < MSG_nMBXCount; u32MBXIDX++)
{
MSG_astMBX[u32MBXIDX].enMSGType = MSG_enNone;
MSG_astMBX[u32MBXIDX].pstMSG = NULL;
}
}
void MSG_vRun(uint32* const pu32Stat)
{
}
void MSG_vTerminate(uint32* const pu32Stat)
{
}
MSG_tenMBXErr MSG_enMBXNew(MSG_tstMBX** ppstMBX, MSG_tenMSGType enMSGType)
{
MSG_tenMBXErr enMBXErr = MSG_enBadMSGType;
sint32 i32MBXIDX = -1;
if ((MSG_enNone < enMSGType) && (MSG_enMSGTypeCount > enMSGType))
{
i32MBXIDX = MSG_u32GetFreeMBX();
enMBXErr = MSG_enMBXQueueFull;
if (-1 != i32MBXIDX)
{
MSG_astMBX[i32MBXIDX].enMSGType = enMSGType;
*ppstMBX = &MSG_astMBX[i32MBXIDX];
enMBXErr = MSG_enOK;
}
}
return enMBXErr;
}
void MSG_vMBXFree(MSG_tstMBX* const pstMBX)
{
pstMBX->enMSGType = MSG_enNone;
pstMBX->pstMSG = NULL;
}
void MSG_vMBXPost(MSG_tstMBX* const pstMBX, void* const pstMSG)
{
if ((MSG_enNone != pstMBX->enMSGType) && (NULL == pstMBX->pstMSG) && (NULL != pstMBX))
{
pstMBX->pstMSG = pstMSG;
}
}
MSG_tenMBXErr MSG_vMBXTryPost(MSG_tstMBX* const pstMBX, void* const pstMSG)
{
MSG_tenMBXErr enMBXErr = MSG_enBadMBX;
//todo wait
if(MSG_enNone != pstMBX->enMSGType)
{
enMBXErr = MSG_enMBXFull;
if (NULL == pstMBX->pstMSG)
{
pstMBX->pstMSG = pstMSG;
enMBXErr = MSG_enOK;
}
}
return enMBXErr;
}
MSG_tenMBXErr MSG_enMBXTryFetchWait(MSG_tstMBX* const pstMBX, void* pstMSG)
{
MSG_tenMBXErr enMBXErr = MSG_enBadMBX;
//todo wait
if(MSG_enNone != pstMBX->enMSGType)
{
enMBXErr = MSG_enNoMSG;
if (NULL != pstMBX->pstMSG)
{
pstMSG = pstMBX->pstMSG;
enMBXErr = MSG_enOK;
}
}
/* TODO suppress warning */
(void)pstMSG;
return enMBXErr;
}
MSG_tenMBXErr MSG_enMBXTryFetch(MSG_tstMBX* const pstMBX, void* pstMSG)
{
MSG_tenMBXErr enMBXErr = MSG_enBadMBX;
if(MSG_enNone != pstMBX->enMSGType)
{
enMBXErr = MSG_enNoMSG;
if (NULL != pstMBX->pstMSG)
{
pstMSG = pstMBX->pstMSG;
enMBXErr = MSG_enOK;
}
}
return enMBXErr;
}
bool MSG_boMBXValid(MSG_tstMBX* const pstMBX)
{
bool boValid = false;
if (NULL != pstMBX)
{
boValid = MSG_enNone != pstMBX->enMSGType;
}
else
{
#ifdef BUILD_ERR_PRINTF
printf("Invalid mailbox\n");
while (1){}
#endif
}
return boValid;
}
void MSG_boMBXInvalidate(MSG_tstMBX* const pstMBX)
{
pstMBX->enMSGType = MSG_enNone;
}
static sint32 MSG_u32GetFreeMBX(void)
{
uint32 u32MBXIDX;
sint32 i32RetIDX;
for (u32MBXIDX = 0; u32MBXIDX < MSG_nMBXCount; u32MBXIDX++)
{
if (MSG_enNone == MSG_astMBX[u32MBXIDX].enMSGType)
{
i32RetIDX = u32MBXIDX;
break;
}
}
return i32RetIDX;
}