mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-05 22:12:57 -05:00
Staging: epl: run Lindent on *.c files
It's a start, still a mess... Cc: Daniel Krueger <daniel.krueger@systec-electronic.com> Cc: Ronald Sieber <Ronald.Sieber@systec-electronic.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -75,7 +75,6 @@
|
||||
#include <asm/uaccess.h>
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -100,7 +99,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -114,7 +112,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -130,36 +127,33 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#if ((EPL_API_PROCESS_IMAGE_SIZE_IN > 0) || (EPL_API_PROCESS_IMAGE_SIZE_OUT > 0))
|
||||
typedef struct
|
||||
{
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
|
||||
BYTE m_abProcessImageInput[EPL_API_PROCESS_IMAGE_SIZE_IN];
|
||||
#endif
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
|
||||
BYTE m_abProcessImageOutput[EPL_API_PROCESS_IMAGE_SIZE_OUT];
|
||||
#endif
|
||||
typedef struct {
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
|
||||
BYTE m_abProcessImageInput[EPL_API_PROCESS_IMAGE_SIZE_IN];
|
||||
#endif
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
|
||||
BYTE m_abProcessImageOutput[EPL_API_PROCESS_IMAGE_SIZE_OUT];
|
||||
#endif
|
||||
|
||||
} tEplApiProcessImageInstance;
|
||||
} tEplApiProcessImageInstance;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplApiProcessImageInstance EplApiProcessImageInstance_g;
|
||||
static tEplApiProcessImageInstance EplApiProcessImageInstance_g;
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
// //
|
||||
//=========================================================================//
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplApiProcessImageSetup()
|
||||
@@ -177,125 +171,101 @@ static tEplApiProcessImageInstance EplApiProcessImageInstance_g;
|
||||
|
||||
tEplKernel PUBLIC EplApiProcessImageSetup(void)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
#if ((EPL_API_PROCESS_IMAGE_SIZE_IN > 0) || (EPL_API_PROCESS_IMAGE_SIZE_OUT > 0))
|
||||
unsigned int uiVarEntries;
|
||||
tEplObdSize ObdSize;
|
||||
unsigned int uiVarEntries;
|
||||
tEplObdSize ObdSize;
|
||||
#endif
|
||||
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2000,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(0x2000,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2001,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(0x2001,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2010,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2010,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2011,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2011,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2020,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2020,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2021,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_IN / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2021,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
#endif
|
||||
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2030,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(0x2030,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2031,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT;
|
||||
ObdSize = 1;
|
||||
Ret = EplApiLinkObject(0x2031,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2040,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2040,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2041,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 2;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2041,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2050,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2050,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(
|
||||
0x2051,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
&uiVarEntries,
|
||||
&ObdSize,
|
||||
1);
|
||||
ObdSize = 4;
|
||||
uiVarEntries = EPL_API_PROCESS_IMAGE_SIZE_OUT / ObdSize;
|
||||
Ret = EplApiLinkObject(0x2051,
|
||||
EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput, &uiVarEntries, &ObdSize,
|
||||
1);
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -310,26 +280,29 @@ tEplObdSize ObdSize;
|
||||
// State:
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplApiProcessImageExchangeIn(tEplApiProcessImage* pPI_p)
|
||||
tEplKernel PUBLIC EplApiProcessImageExchangeIn(tEplApiProcessImage * pPI_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_IN > 0
|
||||
#if (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
copy_to_user(pPI_p->m_pImage,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
min(pPI_p->m_uiSize, sizeof (EplApiProcessImageInstance_g.m_abProcessImageInput)));
|
||||
#else
|
||||
EPL_MEMCPY(pPI_p->m_pImage,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
min(pPI_p->m_uiSize, sizeof (EplApiProcessImageInstance_g.m_abProcessImageInput)));
|
||||
#endif
|
||||
#if (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
copy_to_user(pPI_p->m_pImage,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
min(pPI_p->m_uiSize,
|
||||
sizeof(EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput)));
|
||||
#else
|
||||
EPL_MEMCPY(pPI_p->m_pImage,
|
||||
EplApiProcessImageInstance_g.m_abProcessImageInput,
|
||||
min(pPI_p->m_uiSize,
|
||||
sizeof(EplApiProcessImageInstance_g.
|
||||
m_abProcessImageInput)));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Function: EplApiProcessImageExchangeOut()
|
||||
//
|
||||
@@ -342,33 +315,33 @@ tEplKernel Ret = kEplSuccessful;
|
||||
// State:
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplApiProcessImageExchangeOut(tEplApiProcessImage* pPI_p)
|
||||
tEplKernel PUBLIC EplApiProcessImageExchangeOut(tEplApiProcessImage * pPI_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
#if EPL_API_PROCESS_IMAGE_SIZE_OUT > 0
|
||||
#if (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
copy_from_user(EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
pPI_p->m_pImage,
|
||||
min(pPI_p->m_uiSize, sizeof (EplApiProcessImageInstance_g.m_abProcessImageOutput)));
|
||||
#else
|
||||
EPL_MEMCPY(EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
pPI_p->m_pImage,
|
||||
min(pPI_p->m_uiSize, sizeof (EplApiProcessImageInstance_g.m_abProcessImageOutput)));
|
||||
#endif
|
||||
#if (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
copy_from_user(EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
pPI_p->m_pImage,
|
||||
min(pPI_p->m_uiSize,
|
||||
sizeof(EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput)));
|
||||
#else
|
||||
EPL_MEMCPY(EplApiProcessImageInstance_g.m_abProcessImageOutput,
|
||||
pPI_p->m_pImage,
|
||||
min(pPI_p->m_uiSize,
|
||||
sizeof(EplApiProcessImageInstance_g.
|
||||
m_abProcessImageOutput)));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
// //
|
||||
//=========================================================================//
|
||||
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -78,7 +78,6 @@
|
||||
#include "kernel/EplDllkCal.h"
|
||||
#endif
|
||||
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
|
||||
/***************************************************************************/
|
||||
@@ -105,7 +104,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -119,7 +117,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -134,9 +131,8 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tEplDlluCbAsnd m_apfnDlluCbAsnd[EPL_DLL_MAX_ASND_SERVICE_ID];
|
||||
typedef struct {
|
||||
tEplDlluCbAsnd m_apfnDlluCbAsnd[EPL_DLL_MAX_ASND_SERVICE_ID];
|
||||
|
||||
} tEplDlluCalInstance;
|
||||
|
||||
@@ -146,13 +142,15 @@ typedef struct
|
||||
|
||||
// if no dynamic memory allocation shall be used
|
||||
// define structures statically
|
||||
static tEplDlluCalInstance EplDlluCalInstance_g;
|
||||
static tEplDlluCalInstance EplDlluCalInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p, tEplDllAsndFilter Filter_p);
|
||||
static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId
|
||||
ServiceId_p,
|
||||
tEplDllAsndFilter Filter_p);
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
@@ -177,12 +175,12 @@ static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceI
|
||||
|
||||
tEplKernel EplDlluCalAddInstance()
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof (EplDlluCalInstance_g));
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof(EplDlluCalInstance_g));
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -202,15 +200,14 @@ tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
tEplKernel EplDlluCalDelInstance()
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof (EplDlluCalInstance_g));
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof(EplDlluCalInstance_g));
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplDlluCalProcess
|
||||
@@ -228,37 +225,40 @@ tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
tEplKernel EplDlluCalProcess(tEplEvent * pEvent_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplMsgType MsgType;
|
||||
unsigned int uiAsndServiceId;
|
||||
tEplFrameInfo FrameInfo;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplMsgType MsgType;
|
||||
unsigned int uiAsndServiceId;
|
||||
tEplFrameInfo FrameInfo;
|
||||
|
||||
if (pEvent_p->m_EventType == kEplEventTypeAsndRx)
|
||||
{
|
||||
FrameInfo.m_pFrame = (tEplFrame*) pEvent_p->m_pArg;
|
||||
FrameInfo.m_uiFrameSize = pEvent_p->m_uiSize;
|
||||
// extract NetTime
|
||||
FrameInfo.m_NetTime = pEvent_p->m_NetTime;
|
||||
if (pEvent_p->m_EventType == kEplEventTypeAsndRx) {
|
||||
FrameInfo.m_pFrame = (tEplFrame *) pEvent_p->m_pArg;
|
||||
FrameInfo.m_uiFrameSize = pEvent_p->m_uiSize;
|
||||
// extract NetTime
|
||||
FrameInfo.m_NetTime = pEvent_p->m_NetTime;
|
||||
|
||||
MsgType = (tEplMsgType)AmiGetByteFromLe(&FrameInfo.m_pFrame->m_le_bMessageType);
|
||||
if (MsgType != kEplMsgTypeAsnd)
|
||||
{
|
||||
Ret = kEplInvalidOperation;
|
||||
goto Exit;
|
||||
}
|
||||
MsgType =
|
||||
(tEplMsgType) AmiGetByteFromLe(&FrameInfo.m_pFrame->
|
||||
m_le_bMessageType);
|
||||
if (MsgType != kEplMsgTypeAsnd) {
|
||||
Ret = kEplInvalidOperation;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
uiAsndServiceId = (unsigned int) AmiGetByteFromLe(&FrameInfo.m_pFrame->m_Data.m_Asnd.m_le_bServiceId);
|
||||
if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID)
|
||||
{ // ASnd service ID is valid
|
||||
if (EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId] != NULL)
|
||||
{ // handler was registered
|
||||
Ret = EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId](&FrameInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
uiAsndServiceId =
|
||||
(unsigned int)AmiGetByteFromLe(&FrameInfo.m_pFrame->m_Data.
|
||||
m_Asnd.m_le_bServiceId);
|
||||
if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID) { // ASnd service ID is valid
|
||||
if (EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId] != NULL) { // handler was registered
|
||||
Ret =
|
||||
EplDlluCalInstance_g.
|
||||
m_apfnDlluCbAsnd[uiAsndServiceId]
|
||||
(&FrameInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -279,26 +279,26 @@ tEplFrameInfo FrameInfo;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel EplDlluCalRegAsndService(tEplDllAsndServiceId ServiceId_p, tEplDlluCbAsnd pfnDlluCbAsnd_p, tEplDllAsndFilter Filter_p)
|
||||
tEplKernel EplDlluCalRegAsndService(tEplDllAsndServiceId ServiceId_p,
|
||||
tEplDlluCbAsnd pfnDlluCbAsnd_p,
|
||||
tEplDllAsndFilter Filter_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
if (ServiceId_p < tabentries (EplDlluCalInstance_g.m_apfnDlluCbAsnd))
|
||||
{
|
||||
// memorize function pointer
|
||||
EplDlluCalInstance_g.m_apfnDlluCbAsnd[ServiceId_p] = pfnDlluCbAsnd_p;
|
||||
if (ServiceId_p < tabentries(EplDlluCalInstance_g.m_apfnDlluCbAsnd)) {
|
||||
// memorize function pointer
|
||||
EplDlluCalInstance_g.m_apfnDlluCbAsnd[ServiceId_p] =
|
||||
pfnDlluCbAsnd_p;
|
||||
|
||||
if (pfnDlluCbAsnd_p == NULL)
|
||||
{ // close filter
|
||||
Filter_p = kEplDllAsndFilterNone;
|
||||
}
|
||||
if (pfnDlluCbAsnd_p == NULL) { // close filter
|
||||
Filter_p = kEplDllAsndFilterNone;
|
||||
}
|
||||
// set filter in DLL module in kernel part
|
||||
Ret = EplDlluCalSetAsndServiceIdFilter(ServiceId_p, Filter_p);
|
||||
|
||||
// set filter in DLL module in kernel part
|
||||
Ret = EplDlluCalSetAsndServiceIdFilter(ServiceId_p, Filter_p);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -319,21 +319,21 @@ tEplKernel Ret = kEplSuccessful;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo_p, tEplDllAsyncReqPriority Priority_p)
|
||||
tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo_p,
|
||||
tEplDllAsyncReqPriority Priority_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
|
||||
pFrameInfo_p->m_uiFrameSize += 14; // add size of ethernet header
|
||||
Ret = EplDllkCalAsyncSend(pFrameInfo_p, Priority_p);
|
||||
pFrameInfo_p->m_uiFrameSize += 14; // add size of ethernet header
|
||||
Ret = EplDllkCalAsyncSend(pFrameInfo_p, Priority_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -354,43 +354,42 @@ tEplKernel Ret = kEplSuccessful;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel EplDlluCalIssueRequest(tEplDllReqServiceId Service_p, unsigned int uiNodeId_p, BYTE bSoaFlag1_p)
|
||||
tEplKernel EplDlluCalIssueRequest(tEplDllReqServiceId Service_p,
|
||||
unsigned int uiNodeId_p, BYTE bSoaFlag1_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
// add node to appropriate request queue
|
||||
switch (Service_p)
|
||||
{
|
||||
case kEplDllReqServiceIdent:
|
||||
case kEplDllReqServiceStatus:
|
||||
{
|
||||
tEplEvent Event;
|
||||
tEplDllCalIssueRequest IssueReq;
|
||||
// add node to appropriate request queue
|
||||
switch (Service_p) {
|
||||
case kEplDllReqServiceIdent:
|
||||
case kEplDllReqServiceStatus:
|
||||
{
|
||||
tEplEvent Event;
|
||||
tEplDllCalIssueRequest IssueReq;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkIssueReq;
|
||||
IssueReq.m_Service = Service_p;
|
||||
IssueReq.m_uiNodeId = uiNodeId_p;
|
||||
IssueReq.m_bSoaFlag1 = bSoaFlag1_p;
|
||||
Event.m_pArg = &IssueReq;
|
||||
Event.m_uiSize = sizeof (IssueReq);
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkIssueReq;
|
||||
IssueReq.m_Service = Service_p;
|
||||
IssueReq.m_uiNodeId = uiNodeId_p;
|
||||
IssueReq.m_bSoaFlag1 = bSoaFlag1_p;
|
||||
Event.m_pArg = &IssueReq;
|
||||
Event.m_uiSize = sizeof(IssueReq);
|
||||
|
||||
Ret = EplEventuPost(&Event);
|
||||
break;
|
||||
}
|
||||
Ret = EplEventuPost(&Event);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
Ret = kEplDllInvalidParam;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
Ret = kEplDllInvalidParam;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplDlluCalAddNode()
|
||||
@@ -408,20 +407,19 @@ tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
tEplKernel EplDlluCalAddNode(tEplDllNodeInfo * pNodeInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkAddNode;
|
||||
Event.m_pArg = pNodeInfo_p;
|
||||
Event.m_uiSize = sizeof (tEplDllNodeInfo);
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkAddNode;
|
||||
Event.m_pArg = pNodeInfo_p;
|
||||
Event.m_uiSize = sizeof(tEplDllNodeInfo);
|
||||
|
||||
Ret = EplEventuPost(&Event);
|
||||
Ret = EplEventuPost(&Event);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplDlluCalDeleteNode()
|
||||
@@ -439,20 +437,19 @@ tEplEvent Event;
|
||||
|
||||
tEplKernel EplDlluCalDeleteNode(unsigned int uiNodeId_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkDelNode;
|
||||
Event.m_pArg = &uiNodeId_p;
|
||||
Event.m_uiSize = sizeof (uiNodeId_p);
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkDelNode;
|
||||
Event.m_pArg = &uiNodeId_p;
|
||||
Event.m_uiSize = sizeof(uiNodeId_p);
|
||||
|
||||
Ret = EplEventuPost(&Event);
|
||||
Ret = EplEventuPost(&Event);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplDlluCalSoftDeleteNode()
|
||||
@@ -470,23 +467,21 @@ tEplEvent Event;
|
||||
|
||||
tEplKernel EplDlluCalSoftDeleteNode(unsigned int uiNodeId_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkSoftDelNode;
|
||||
Event.m_pArg = &uiNodeId_p;
|
||||
Event.m_uiSize = sizeof (uiNodeId_p);
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkSoftDelNode;
|
||||
Event.m_pArg = &uiNodeId_p;
|
||||
Event.m_uiSize = sizeof(uiNodeId_p);
|
||||
|
||||
Ret = EplEventuPost(&Event);
|
||||
Ret = EplEventuPost(&Event);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -509,26 +504,26 @@ tEplEvent Event;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId ServiceId_p, tEplDllAsndFilter Filter_p)
|
||||
static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId
|
||||
ServiceId_p,
|
||||
tEplDllAsndFilter Filter_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplDllCalAsndServiceIdFilter ServFilter;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplDllCalAsndServiceIdFilter ServFilter;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkServFilter;
|
||||
ServFilter.m_ServiceId = ServiceId_p;
|
||||
ServFilter.m_Filter = Filter_p;
|
||||
Event.m_pArg = &ServFilter;
|
||||
Event.m_uiSize = sizeof (ServFilter);
|
||||
Event.m_EventSink = kEplEventSinkDllkCal;
|
||||
Event.m_EventType = kEplEventTypeDllkServFilter;
|
||||
ServFilter.m_ServiceId = ServiceId_p;
|
||||
ServFilter.m_Filter = Filter_p;
|
||||
Event.m_pArg = &ServFilter;
|
||||
Event.m_uiSize = sizeof(ServFilter);
|
||||
|
||||
Ret = EplEventuPost(&Event);
|
||||
Ret = EplEventuPost(&Event);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -77,9 +77,9 @@
|
||||
#include "Benchmark.h"
|
||||
|
||||
#ifdef EPL_NO_FIFO
|
||||
#include "kernel/EplEventk.h"
|
||||
#include "kernel/EplEventk.h"
|
||||
#else
|
||||
#include "SharedBuff.h"
|
||||
#include "SharedBuff.h"
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
@@ -96,28 +96,27 @@
|
||||
|
||||
// TracePoint support for realtime-debugging
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
void PUBLIC TgtDbgSignalTracePoint (BYTE bTracePointNumber_p);
|
||||
void PUBLIC TgtDbgPostTraceValue (DWORD dwTraceValue_p);
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
|
||||
void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p);
|
||||
void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p);
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
|
||||
#else
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v)
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v)
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
#ifndef EPL_NO_FIFO
|
||||
tShbInstance m_pShbKernelToUserInstance;
|
||||
tShbInstance m_pShbUserToKernelInstance;
|
||||
tShbInstance m_pShbKernelToUserInstance;
|
||||
tShbInstance m_pShbUserToKernelInstance;
|
||||
#endif
|
||||
tEplProcessEventCb m_pfnApiProcessEventCb;
|
||||
tEplProcessEventCb m_pfnApiProcessEventCb;
|
||||
|
||||
}tEplEventuInstance;
|
||||
} tEplEventuInstance;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// modul globale vars
|
||||
@@ -133,9 +132,8 @@ static tEplEventuInstance EplEventuInstance_g;
|
||||
|
||||
#ifndef EPL_NO_FIFO
|
||||
// callback function for incomming events
|
||||
static void EplEventuRxSignalHandlerCb (
|
||||
tShbInstance pShbRxInstance_p,
|
||||
unsigned long ulDataSize_p);
|
||||
static void EplEventuRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
|
||||
unsigned long ulDataSize_p);
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
@@ -176,17 +174,14 @@ static void EplEventuRxSignalHandlerCb (
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplEventuInit(tEplProcessEventCb pfnApiProcessEventCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplEventuAddInstance(pfnApiProcessEventCb_p);
|
||||
|
||||
Ret = EplEventuAddInstance(pfnApiProcessEventCb_p);
|
||||
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplEventuAddInstance
|
||||
@@ -204,62 +199,67 @@ return Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplEventuAddInstance(tEplProcessEventCb pfnApiProcessEventCb_p)
|
||||
tEplKernel PUBLIC EplEventuAddInstance(tEplProcessEventCb
|
||||
pfnApiProcessEventCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
#ifndef EPL_NO_FIFO
|
||||
tShbError ShbError;
|
||||
unsigned int fShbNewCreated;
|
||||
tShbError ShbError;
|
||||
unsigned int fShbNewCreated;
|
||||
#endif
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
|
||||
// init instance variables
|
||||
EplEventuInstance_g.m_pfnApiProcessEventCb = pfnApiProcessEventCb_p;
|
||||
// init instance variables
|
||||
EplEventuInstance_g.m_pfnApiProcessEventCb = pfnApiProcessEventCb_p;
|
||||
|
||||
#ifndef EPL_NO_FIFO
|
||||
// init shared loop buffer
|
||||
// kernel -> user
|
||||
ShbError = ShbCirAllocBuffer (EPL_EVENT_SIZE_SHB_KERNEL_TO_USER,
|
||||
EPL_EVENT_NAME_SHB_KERNEL_TO_USER,
|
||||
&EplEventuInstance_g.m_pShbKernelToUserInstance,
|
||||
&fShbNewCreated);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuAddInstance(): ShbCirAllocBuffer(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
// init shared loop buffer
|
||||
// kernel -> user
|
||||
ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_KERNEL_TO_USER,
|
||||
EPL_EVENT_NAME_SHB_KERNEL_TO_USER,
|
||||
&EplEventuInstance_g.
|
||||
m_pShbKernelToUserInstance,
|
||||
&fShbNewCreated);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuAddInstance(): ShbCirAllocBuffer(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// user -> kernel
|
||||
ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_USER_TO_KERNEL,
|
||||
EPL_EVENT_NAME_SHB_USER_TO_KERNEL,
|
||||
&EplEventuInstance_g.
|
||||
m_pShbUserToKernelInstance,
|
||||
&fShbNewCreated);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuAddInstance(): ShbCirAllocBuffer(U2K) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
// register eventhandler
|
||||
ShbError =
|
||||
ShbCirSetSignalHandlerNewData(EplEventuInstance_g.
|
||||
m_pShbKernelToUserInstance,
|
||||
EplEventuRxSignalHandlerCb,
|
||||
kShbPriorityNormal);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuAddInstance(): ShbCirSetSignalHandlerNewData(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// user -> kernel
|
||||
ShbError = ShbCirAllocBuffer (EPL_EVENT_SIZE_SHB_USER_TO_KERNEL,
|
||||
EPL_EVENT_NAME_SHB_USER_TO_KERNEL,
|
||||
&EplEventuInstance_g.m_pShbUserToKernelInstance,
|
||||
&fShbNewCreated);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuAddInstance(): ShbCirAllocBuffer(U2K) -> 0x%X\n", ShbError);
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// register eventhandler
|
||||
ShbError = ShbCirSetSignalHandlerNewData (EplEventuInstance_g.m_pShbKernelToUserInstance,
|
||||
EplEventuRxSignalHandlerCb,
|
||||
kShbPriorityNormal);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuAddInstance(): ShbCirSetSignalHandlerNewData(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
Exit:
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -282,51 +282,52 @@ unsigned int fShbNewCreated;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplEventuDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
#ifndef EPL_NO_FIFO
|
||||
tShbError ShbError;
|
||||
tShbError ShbError;
|
||||
#endif
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
#ifndef EPL_NO_FIFO
|
||||
// set eventhandler to NULL
|
||||
ShbError = ShbCirSetSignalHandlerNewData (EplEventuInstance_g.m_pShbKernelToUserInstance,
|
||||
NULL,
|
||||
kShbPriorityNormal);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuDelInstance(): ShbCirSetSignalHandlerNewData(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplNoResource;
|
||||
}
|
||||
// set eventhandler to NULL
|
||||
ShbError =
|
||||
ShbCirSetSignalHandlerNewData(EplEventuInstance_g.
|
||||
m_pShbKernelToUserInstance, NULL,
|
||||
kShbPriorityNormal);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuDelInstance(): ShbCirSetSignalHandlerNewData(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplNoResource;
|
||||
}
|
||||
// free buffer User -> Kernel
|
||||
ShbError =
|
||||
ShbCirReleaseBuffer(EplEventuInstance_g.m_pShbUserToKernelInstance);
|
||||
if ((ShbError != kShbOk) && (ShbError != kShbMemUsedByOtherProcs)) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuDelInstance(): ShbCirReleaseBuffer(U2K) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplNoResource;
|
||||
} else {
|
||||
EplEventuInstance_g.m_pShbUserToKernelInstance = NULL;
|
||||
}
|
||||
|
||||
// free buffer User -> Kernel
|
||||
ShbError = ShbCirReleaseBuffer (EplEventuInstance_g.m_pShbUserToKernelInstance);
|
||||
if((ShbError != kShbOk) && (ShbError != kShbMemUsedByOtherProcs))
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuDelInstance(): ShbCirReleaseBuffer(U2K) -> 0x%X\n", ShbError);
|
||||
Ret = kEplNoResource;
|
||||
}
|
||||
else
|
||||
{
|
||||
EplEventuInstance_g.m_pShbUserToKernelInstance = NULL;
|
||||
}
|
||||
|
||||
// free buffer Kernel -> User
|
||||
ShbError = ShbCirReleaseBuffer (EplEventuInstance_g.m_pShbKernelToUserInstance);
|
||||
if((ShbError != kShbOk) && (ShbError != kShbMemUsedByOtherProcs))
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuDelInstance(): ShbCirReleaseBuffer(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplNoResource;
|
||||
}
|
||||
else
|
||||
{
|
||||
EplEventuInstance_g.m_pShbKernelToUserInstance = NULL;
|
||||
}
|
||||
// free buffer Kernel -> User
|
||||
ShbError =
|
||||
ShbCirReleaseBuffer(EplEventuInstance_g.m_pShbKernelToUserInstance);
|
||||
if ((ShbError != kShbOk) && (ShbError != kShbMemUsedByOtherProcs)) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuDelInstance(): ShbCirReleaseBuffer(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplNoResource;
|
||||
} else {
|
||||
EplEventuInstance_g.m_pShbKernelToUserInstance = NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -347,159 +348,153 @@ return Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplEventuProcess(tEplEvent* pEvent_p)
|
||||
tEplKernel PUBLIC EplEventuProcess(tEplEvent * pEvent_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplEventSource EventSource;
|
||||
tEplKernel Ret;
|
||||
tEplEventSource EventSource;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// check m_EventSink
|
||||
switch(pEvent_p->m_EventSink)
|
||||
{
|
||||
// NMT-User-Module
|
||||
case kEplEventSinkNmtu:
|
||||
{
|
||||
// check m_EventSink
|
||||
switch (pEvent_p->m_EventSink) {
|
||||
// NMT-User-Module
|
||||
case kEplEventSinkNmtu:
|
||||
{
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
|
||||
Ret = EplNmtuProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceNmtu;
|
||||
Ret = EplNmtuProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
|
||||
EventSource = kEplEventSourceNmtu;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
// NMT-MN-User-Module
|
||||
case kEplEventSinkNmtMnu:
|
||||
{
|
||||
Ret = EplNmtMnuProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceNmtMnu;
|
||||
// NMT-MN-User-Module
|
||||
case kEplEventSinkNmtMnu:
|
||||
{
|
||||
Ret = EplNmtMnuProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
|
||||
EventSource = kEplEventSourceNmtMnu;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) \
|
||||
|| (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0))
|
||||
// events for asynchronus SDO Sequence Layer
|
||||
case kEplEventSinkSdoAsySeq:
|
||||
{
|
||||
Ret = EplSdoAsySeqProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceSdoAsySeq;
|
||||
// events for asynchronus SDO Sequence Layer
|
||||
case kEplEventSinkSdoAsySeq:
|
||||
{
|
||||
Ret = EplSdoAsySeqProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
|
||||
EventSource = kEplEventSourceSdoAsySeq;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
// LED user part module
|
||||
case kEplEventSinkLedu:
|
||||
{
|
||||
// LED user part module
|
||||
case kEplEventSinkLedu:
|
||||
{
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_LEDU)) != 0)
|
||||
Ret = EplLeduProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceLedu;
|
||||
Ret = EplLeduProcessEvent(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
|
||||
EventSource = kEplEventSourceLedu;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// event for EPL api
|
||||
case kEplEventSinkApi:
|
||||
{
|
||||
if (EplEventuInstance_g.m_pfnApiProcessEventCb != NULL)
|
||||
{
|
||||
Ret = EplEventuInstance_g.m_pfnApiProcessEventCb(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceEplApi;
|
||||
// event for EPL api
|
||||
case kEplEventSinkApi:
|
||||
{
|
||||
if (EplEventuInstance_g.m_pfnApiProcessEventCb != NULL) {
|
||||
Ret =
|
||||
EplEventuInstance_g.
|
||||
m_pfnApiProcessEventCb(pEvent_p);
|
||||
if ((Ret != kEplSuccessful)
|
||||
&& (Ret != kEplShutdown)) {
|
||||
EventSource = kEplEventSourceEplApi;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
}
|
||||
break;
|
||||
// Error event for API layer
|
||||
EplEventuPostError
|
||||
(kEplEventSourceEventu, Ret,
|
||||
sizeof(EventSource), &EventSource);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
case kEplEventSinkDlluCal:
|
||||
{
|
||||
Ret = EplDlluCalProcess(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceDllu;
|
||||
case kEplEventSinkDlluCal:
|
||||
{
|
||||
Ret = EplDlluCalProcess(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
|
||||
EventSource = kEplEventSourceDllu;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
break;
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
case kEplEventSinkErru:
|
||||
{
|
||||
/*
|
||||
Ret = EplErruProcess(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceErru;
|
||||
case kEplEventSinkErru:
|
||||
{
|
||||
/*
|
||||
Ret = EplErruProcess(pEvent_p);
|
||||
if ((Ret != kEplSuccessful) && (Ret != kEplShutdown))
|
||||
{
|
||||
EventSource = kEplEventSourceErru;
|
||||
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
*/
|
||||
break;
|
||||
// Error event for API layer
|
||||
EplEventuPostError(kEplEventSourceEventu,
|
||||
Ret,
|
||||
sizeof(EventSource),
|
||||
&EventSource);
|
||||
}
|
||||
*/
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// unknown sink
|
||||
default:
|
||||
{
|
||||
Ret = kEplEventUnknownSink;
|
||||
}
|
||||
// unknown sink
|
||||
default:
|
||||
{
|
||||
Ret = kEplEventUnknownSink;
|
||||
}
|
||||
|
||||
} // end of switch(pEvent_p->m_EventSink)
|
||||
} // end of switch(pEvent_p->m_EventSink)
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -522,143 +517,158 @@ tEplEventSource EventSource;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplEventuPost(tEplEvent * pEvent_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
#ifndef EPL_NO_FIFO
|
||||
tShbError ShbError;
|
||||
tShbCirChunk ShbCirChunk;
|
||||
unsigned long ulDataSize;
|
||||
unsigned int fBufferCompleted;
|
||||
tShbError ShbError;
|
||||
tShbCirChunk ShbCirChunk;
|
||||
unsigned long ulDataSize;
|
||||
unsigned int fBufferCompleted;
|
||||
#endif
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
#ifndef EPL_NO_FIFO
|
||||
// 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue.
|
||||
ulDataSize = sizeof(tEplEvent) + ((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0);
|
||||
// 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue.
|
||||
ulDataSize =
|
||||
sizeof(tEplEvent) +
|
||||
((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0);
|
||||
#endif
|
||||
|
||||
// decide in which buffer the event have to write
|
||||
switch(pEvent_p->m_EventSink)
|
||||
{
|
||||
// kernelspace modules
|
||||
case kEplEventSinkSync:
|
||||
case kEplEventSinkNmtk:
|
||||
case kEplEventSinkDllk:
|
||||
case kEplEventSinkDllkCal:
|
||||
case kEplEventSinkPdok:
|
||||
case kEplEventSinkErrk:
|
||||
{
|
||||
// decide in which buffer the event have to write
|
||||
switch (pEvent_p->m_EventSink) {
|
||||
// kernelspace modules
|
||||
case kEplEventSinkSync:
|
||||
case kEplEventSinkNmtk:
|
||||
case kEplEventSinkDllk:
|
||||
case kEplEventSinkDllkCal:
|
||||
case kEplEventSinkPdok:
|
||||
case kEplEventSinkErrk:
|
||||
{
|
||||
#ifndef EPL_NO_FIFO
|
||||
// post message
|
||||
ShbError = ShbCirAllocDataBlock (EplEventuInstance_g.m_pShbUserToKernelInstance,
|
||||
&ShbCirChunk,
|
||||
ulDataSize);
|
||||
if (ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n", ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbUserToKernelInstance,
|
||||
&ShbCirChunk,
|
||||
pEvent_p,
|
||||
sizeof (tEplEvent),
|
||||
&fBufferCompleted);
|
||||
if (ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n", ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
if (fBufferCompleted == FALSE)
|
||||
{
|
||||
ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbUserToKernelInstance,
|
||||
&ShbCirChunk,
|
||||
pEvent_p->m_pArg,
|
||||
(unsigned long) pEvent_p->m_uiSize,
|
||||
&fBufferCompleted);
|
||||
if ((ShbError != kShbOk) || (fBufferCompleted == FALSE))
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n", ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
// post message
|
||||
ShbError =
|
||||
ShbCirAllocDataBlock(EplEventuInstance_g.
|
||||
m_pShbUserToKernelInstance,
|
||||
&ShbCirChunk, ulDataSize);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
ShbError =
|
||||
ShbCirWriteDataChunk(EplEventuInstance_g.
|
||||
m_pShbUserToKernelInstance,
|
||||
&ShbCirChunk, pEvent_p,
|
||||
sizeof(tEplEvent),
|
||||
&fBufferCompleted);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
if (fBufferCompleted == FALSE) {
|
||||
ShbError =
|
||||
ShbCirWriteDataChunk(EplEventuInstance_g.
|
||||
m_pShbUserToKernelInstance,
|
||||
&ShbCirChunk,
|
||||
pEvent_p->m_pArg,
|
||||
(unsigned long)
|
||||
pEvent_p->m_uiSize,
|
||||
&fBufferCompleted);
|
||||
if ((ShbError != kShbOk)
|
||||
|| (fBufferCompleted == FALSE)) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
#else
|
||||
Ret = EplEventkProcess(pEvent_p);
|
||||
Ret = EplEventkProcess(pEvent_p);
|
||||
#endif
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// userspace modules
|
||||
case kEplEventSinkNmtMnu:
|
||||
case kEplEventSinkNmtu:
|
||||
case kEplEventSinkSdoAsySeq:
|
||||
case kEplEventSinkApi:
|
||||
case kEplEventSinkDlluCal:
|
||||
case kEplEventSinkErru:
|
||||
case kEplEventSinkLedu:
|
||||
{
|
||||
// userspace modules
|
||||
case kEplEventSinkNmtMnu:
|
||||
case kEplEventSinkNmtu:
|
||||
case kEplEventSinkSdoAsySeq:
|
||||
case kEplEventSinkApi:
|
||||
case kEplEventSinkDlluCal:
|
||||
case kEplEventSinkErru:
|
||||
case kEplEventSinkLedu:
|
||||
{
|
||||
#ifndef EPL_NO_FIFO
|
||||
// post message
|
||||
ShbError = ShbCirAllocDataBlock (EplEventuInstance_g.m_pShbKernelToUserInstance,
|
||||
&ShbCirChunk,
|
||||
ulDataSize);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbKernelToUserInstance,
|
||||
&ShbCirChunk,
|
||||
pEvent_p,
|
||||
sizeof (tEplEvent),
|
||||
&fBufferCompleted);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
if (fBufferCompleted == FALSE)
|
||||
{
|
||||
ShbError = ShbCirWriteDataChunk (EplEventuInstance_g.m_pShbKernelToUserInstance,
|
||||
&ShbCirChunk,
|
||||
pEvent_p->m_pArg,
|
||||
(unsigned long) pEvent_p->m_uiSize,
|
||||
&fBufferCompleted);
|
||||
if ((ShbError != kShbOk) || (fBufferCompleted == FALSE))
|
||||
{
|
||||
EPL_DBGLVL_EVENTK_TRACE1("EplEventuPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n", ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
// post message
|
||||
ShbError =
|
||||
ShbCirAllocDataBlock(EplEventuInstance_g.
|
||||
m_pShbKernelToUserInstance,
|
||||
&ShbCirChunk, ulDataSize);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
ShbError =
|
||||
ShbCirWriteDataChunk(EplEventuInstance_g.
|
||||
m_pShbKernelToUserInstance,
|
||||
&ShbCirChunk, pEvent_p,
|
||||
sizeof(tEplEvent),
|
||||
&fBufferCompleted);
|
||||
if (ShbError != kShbOk) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
if (fBufferCompleted == FALSE) {
|
||||
ShbError =
|
||||
ShbCirWriteDataChunk(EplEventuInstance_g.
|
||||
m_pShbKernelToUserInstance,
|
||||
&ShbCirChunk,
|
||||
pEvent_p->m_pArg,
|
||||
(unsigned long)
|
||||
pEvent_p->m_uiSize,
|
||||
&fBufferCompleted);
|
||||
if ((ShbError != kShbOk)
|
||||
|| (fBufferCompleted == FALSE)) {
|
||||
EPL_DBGLVL_EVENTK_TRACE1
|
||||
("EplEventuPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n",
|
||||
ShbError);
|
||||
Ret = kEplEventPostError;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
#else
|
||||
Ret = EplEventuProcess(pEvent_p);
|
||||
Ret = EplEventuProcess(pEvent_p);
|
||||
#endif
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
Ret = kEplEventUnknownSink;
|
||||
}
|
||||
default:
|
||||
{
|
||||
Ret = kEplEventUnknownSink;
|
||||
}
|
||||
|
||||
|
||||
}// end of switch(pEvent_p->m_EventSink)
|
||||
} // end of switch(pEvent_p->m_EventSink)
|
||||
|
||||
#ifndef EPL_NO_FIFO
|
||||
Exit:
|
||||
Exit:
|
||||
#endif
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplEventuPostError
|
||||
@@ -680,36 +690,35 @@ unsigned int fBufferCompleted;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplEventuPostError(tEplEventSource EventSource_p,
|
||||
tEplKernel EplError_p,
|
||||
unsigned int uiArgSize_p,
|
||||
void* pArg_p)
|
||||
tEplKernel EplError_p,
|
||||
unsigned int uiArgSize_p, void *pArg_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
BYTE abBuffer[EPL_MAX_EVENT_ARG_SIZE];
|
||||
tEplEventError* pEventError = (tEplEventError*) abBuffer;
|
||||
tEplEvent EplEvent;
|
||||
tEplKernel Ret;
|
||||
BYTE abBuffer[EPL_MAX_EVENT_ARG_SIZE];
|
||||
tEplEventError *pEventError = (tEplEventError *) abBuffer;
|
||||
tEplEvent EplEvent;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// create argument
|
||||
pEventError->m_EventSource = EventSource_p;
|
||||
pEventError->m_EplError = EplError_p;
|
||||
EPL_MEMCPY(&pEventError->m_Arg, pArg_p, uiArgSize_p);
|
||||
// create argument
|
||||
pEventError->m_EventSource = EventSource_p;
|
||||
pEventError->m_EplError = EplError_p;
|
||||
EPL_MEMCPY(&pEventError->m_Arg, pArg_p, uiArgSize_p);
|
||||
|
||||
// create event
|
||||
EplEvent.m_EventType = kEplEventTypeError;
|
||||
EplEvent.m_EventSink = kEplEventSinkApi;
|
||||
EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(EplEvent.m_NetTime));
|
||||
EplEvent.m_uiSize = (sizeof(EventSource_p)+ sizeof(EplError_p)+ uiArgSize_p);
|
||||
EplEvent.m_pArg = &abBuffer[0];
|
||||
// create event
|
||||
EplEvent.m_EventType = kEplEventTypeError;
|
||||
EplEvent.m_EventSink = kEplEventSinkApi;
|
||||
EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(EplEvent.m_NetTime));
|
||||
EplEvent.m_uiSize =
|
||||
(sizeof(EventSource_p) + sizeof(EplError_p) + uiArgSize_p);
|
||||
EplEvent.m_pArg = &abBuffer[0];
|
||||
|
||||
// post errorevent
|
||||
Ret = EplEventuPost(&EplEvent);
|
||||
// post errorevent
|
||||
Ret = EplEventuPost(&EplEvent);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -735,19 +744,18 @@ tEplEvent EplEvent;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
#ifndef EPL_NO_FIFO
|
||||
static void EplEventuRxSignalHandlerCb (
|
||||
tShbInstance pShbRxInstance_p,
|
||||
unsigned long ulDataSize_p)
|
||||
static void EplEventuRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
|
||||
unsigned long ulDataSize_p)
|
||||
{
|
||||
tEplEvent *pEplEvent;
|
||||
tShbError ShbError;
|
||||
tEplEvent *pEplEvent;
|
||||
tShbError ShbError;
|
||||
//unsigned long ulBlockCount;
|
||||
//unsigned long ulDataSize;
|
||||
BYTE abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
|
||||
// d.k.: abDataBuffer contains the complete tEplEvent structure
|
||||
// and behind this the argument
|
||||
BYTE abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
|
||||
// d.k.: abDataBuffer contains the complete tEplEvent structure
|
||||
// and behind this the argument
|
||||
|
||||
TGT_DBG_SIGNAL_TRACE_POINT(21);
|
||||
TGT_DBG_SIGNAL_TRACE_POINT(21);
|
||||
|
||||
// d.k. not needed because it is already done in SharedBuff
|
||||
/* do
|
||||
@@ -763,38 +771,32 @@ BYTE abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
|
||||
|
||||
BENCHMARK_MOD_28_RESET(1); // 14 <20>s until set
|
||||
*/
|
||||
// copy data from event queue
|
||||
ShbError = ShbCirReadDataBlock (pShbRxInstance_p,
|
||||
&abDataBuffer[0],
|
||||
sizeof(abDataBuffer),
|
||||
&ulDataSize_p);
|
||||
if(ShbError != kShbOk)
|
||||
{
|
||||
// error goto exit
|
||||
goto Exit;
|
||||
}
|
||||
// copy data from event queue
|
||||
ShbError = ShbCirReadDataBlock(pShbRxInstance_p,
|
||||
&abDataBuffer[0],
|
||||
sizeof(abDataBuffer), &ulDataSize_p);
|
||||
if (ShbError != kShbOk) {
|
||||
// error goto exit
|
||||
goto Exit;
|
||||
}
|
||||
// resolve the pointer to the event structure
|
||||
pEplEvent = (tEplEvent *) abDataBuffer;
|
||||
// set Datasize
|
||||
pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent));
|
||||
if (pEplEvent->m_uiSize > 0) {
|
||||
// set pointer to argument
|
||||
pEplEvent->m_pArg = &abDataBuffer[sizeof(tEplEvent)];
|
||||
} else {
|
||||
//set pointer to NULL
|
||||
pEplEvent->m_pArg = NULL;
|
||||
}
|
||||
|
||||
// resolve the pointer to the event structure
|
||||
pEplEvent = (tEplEvent *) abDataBuffer;
|
||||
// set Datasize
|
||||
pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent));
|
||||
if(pEplEvent->m_uiSize > 0)
|
||||
{
|
||||
// set pointer to argument
|
||||
pEplEvent->m_pArg = &abDataBuffer[sizeof(tEplEvent)];
|
||||
}
|
||||
else
|
||||
{
|
||||
//set pointer to NULL
|
||||
pEplEvent->m_pArg = NULL;
|
||||
}
|
||||
BENCHMARK_MOD_28_SET(1);
|
||||
// call processfunction
|
||||
EplEventuProcess(pEplEvent);
|
||||
|
||||
BENCHMARK_MOD_28_SET(1);
|
||||
// call processfunction
|
||||
EplEventuProcess(pEplEvent);
|
||||
|
||||
BENCHMARK_MOD_28_RESET(1);
|
||||
// read number of left messages to process
|
||||
BENCHMARK_MOD_28_RESET(1);
|
||||
// read number of left messages to process
|
||||
// d.k. not needed because it is already done in SharedBuff
|
||||
/* ShbError = ShbCirGetReadBlockCount (pShbRxInstance_p, &ulBlockCount);
|
||||
if (ShbError != kShbOk)
|
||||
@@ -804,10 +806,9 @@ BYTE abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
|
||||
}
|
||||
} while (ulBlockCount > 0);
|
||||
*/
|
||||
Exit:
|
||||
return;
|
||||
Exit:
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -95,7 +95,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -109,7 +108,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -124,10 +122,9 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tEplIdentResponse* m_apIdentResponse[254]; // the IdentResponse are managed dynamically
|
||||
tEplIdentuCbResponse m_apfnCbResponse[254];
|
||||
typedef struct {
|
||||
tEplIdentResponse *m_apIdentResponse[254]; // the IdentResponse are managed dynamically
|
||||
tEplIdentuCbResponse m_apfnCbResponse[254];
|
||||
|
||||
} tEplIdentuInstance;
|
||||
|
||||
@@ -135,7 +132,7 @@ typedef struct
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplIdentuInstance EplIdentuInstance_g;
|
||||
static tEplIdentuInstance EplIdentuInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
@@ -169,14 +166,13 @@ static tEplKernel PUBLIC EplIdentuCbIdentResponse(tEplFrameInfo * pFrameInfo_p);
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplIdentuInit()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplIdentuAddInstance();
|
||||
Ret = EplIdentuAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplIdentuAddInstance
|
||||
@@ -197,21 +193,23 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplIdentuAddInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplIdentuInstance_g, 0, sizeof (EplIdentuInstance_g));
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplIdentuInstance_g, 0, sizeof(EplIdentuInstance_g));
|
||||
|
||||
// register IdentResponse callback function
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndIdentResponse, EplIdentuCbIdentResponse, kEplDllAsndFilterAny);
|
||||
// register IdentResponse callback function
|
||||
Ret =
|
||||
EplDlluCalRegAsndService(kEplDllAsndIdentResponse,
|
||||
EplIdentuCbIdentResponse,
|
||||
kEplDllAsndFilterAny);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplIdentuDelInstance
|
||||
@@ -232,20 +230,21 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplIdentuDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// deregister IdentResponse callback function
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndIdentResponse, NULL, kEplDllAsndFilterNone);
|
||||
// deregister IdentResponse callback function
|
||||
Ret =
|
||||
EplDlluCalRegAsndService(kEplDllAsndIdentResponse, NULL,
|
||||
kEplDllAsndFilterNone);
|
||||
|
||||
Ret = EplIdentuReset();
|
||||
Ret = EplIdentuReset();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplIdentuReset
|
||||
@@ -266,26 +265,25 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplIdentuReset()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
int iIndex;
|
||||
tEplKernel Ret;
|
||||
int iIndex;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
for (iIndex = 0; iIndex < tabentries (EplIdentuInstance_g.m_apIdentResponse); iIndex++)
|
||||
{
|
||||
if (EplIdentuInstance_g.m_apIdentResponse[iIndex] != NULL)
|
||||
{ // free memory
|
||||
EPL_FREE(EplIdentuInstance_g.m_apIdentResponse[iIndex]);
|
||||
}
|
||||
}
|
||||
for (iIndex = 0;
|
||||
iIndex < tabentries(EplIdentuInstance_g.m_apIdentResponse);
|
||||
iIndex++) {
|
||||
if (EplIdentuInstance_g.m_apIdentResponse[iIndex] != NULL) { // free memory
|
||||
EPL_FREE(EplIdentuInstance_g.m_apIdentResponse[iIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
EPL_MEMSET(&EplIdentuInstance_g, 0, sizeof (EplIdentuInstance_g));
|
||||
EPL_MEMSET(&EplIdentuInstance_g, 0, sizeof(EplIdentuInstance_g));
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplIdentuGetIdentResponse
|
||||
@@ -302,31 +300,28 @@ int iIndex;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplIdentuGetIdentResponse(
|
||||
unsigned int uiNodeId_p,
|
||||
tEplIdentResponse** ppIdentResponse_p)
|
||||
tEplKernel PUBLIC EplIdentuGetIdentResponse(unsigned int uiNodeId_p,
|
||||
tEplIdentResponse **
|
||||
ppIdentResponse_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// decrement node ID, because array is zero based
|
||||
uiNodeId_p--;
|
||||
if (uiNodeId_p < tabentries (EplIdentuInstance_g.m_apIdentResponse))
|
||||
{
|
||||
*ppIdentResponse_p = EplIdentuInstance_g.m_apIdentResponse[uiNodeId_p];
|
||||
}
|
||||
else
|
||||
{ // invalid node ID specified
|
||||
*ppIdentResponse_p = NULL;
|
||||
Ret = kEplInvalidNodeId;
|
||||
}
|
||||
// decrement node ID, because array is zero based
|
||||
uiNodeId_p--;
|
||||
if (uiNodeId_p < tabentries(EplIdentuInstance_g.m_apIdentResponse)) {
|
||||
*ppIdentResponse_p =
|
||||
EplIdentuInstance_g.m_apIdentResponse[uiNodeId_p];
|
||||
} else { // invalid node ID specified
|
||||
*ppIdentResponse_p = NULL;
|
||||
Ret = kEplInvalidNodeId;
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplIdentuRequestIdentResponse
|
||||
@@ -343,42 +338,38 @@ tEplKernel Ret;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplIdentuRequestIdentResponse(
|
||||
unsigned int uiNodeId_p,
|
||||
tEplIdentuCbResponse pfnCbResponse_p)
|
||||
tEplKernel PUBLIC EplIdentuRequestIdentResponse(unsigned int uiNodeId_p,
|
||||
tEplIdentuCbResponse
|
||||
pfnCbResponse_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// decrement node ID, because array is zero based
|
||||
uiNodeId_p--;
|
||||
if (uiNodeId_p < tabentries (EplIdentuInstance_g.m_apfnCbResponse))
|
||||
{
|
||||
// decrement node ID, because array is zero based
|
||||
uiNodeId_p--;
|
||||
if (uiNodeId_p < tabentries(EplIdentuInstance_g.m_apfnCbResponse)) {
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
if (EplIdentuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL)
|
||||
{ // request already issued (maybe by someone else)
|
||||
Ret = kEplInvalidOperation;
|
||||
}
|
||||
else
|
||||
{
|
||||
EplIdentuInstance_g.m_apfnCbResponse[uiNodeId_p] = pfnCbResponse_p;
|
||||
Ret = EplDlluCalIssueRequest(kEplDllReqServiceIdent, (uiNodeId_p + 1), 0xFF);
|
||||
}
|
||||
if (EplIdentuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL) { // request already issued (maybe by someone else)
|
||||
Ret = kEplInvalidOperation;
|
||||
} else {
|
||||
EplIdentuInstance_g.m_apfnCbResponse[uiNodeId_p] =
|
||||
pfnCbResponse_p;
|
||||
Ret =
|
||||
EplDlluCalIssueRequest(kEplDllReqServiceIdent,
|
||||
(uiNodeId_p + 1), 0xFF);
|
||||
}
|
||||
#else
|
||||
Ret = kEplInvalidOperation;
|
||||
Ret = kEplInvalidOperation;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{ // invalid node ID specified
|
||||
Ret = kEplInvalidNodeId;
|
||||
}
|
||||
} else { // invalid node ID specified
|
||||
Ret = kEplInvalidNodeId;
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplIdentuGetRunningRequests
|
||||
@@ -399,21 +390,18 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT DWORD PUBLIC EplIdentuGetRunningRequests(void)
|
||||
{
|
||||
DWORD dwReqs = 0;
|
||||
unsigned int uiIndex;
|
||||
DWORD dwReqs = 0;
|
||||
unsigned int uiIndex;
|
||||
|
||||
for (uiIndex = 0; uiIndex < 32; uiIndex++)
|
||||
{
|
||||
if (EplIdentuInstance_g.m_apfnCbResponse[uiIndex] != NULL)
|
||||
{
|
||||
dwReqs |= (1 << uiIndex);
|
||||
}
|
||||
}
|
||||
for (uiIndex = 0; uiIndex < 32; uiIndex++) {
|
||||
if (EplIdentuInstance_g.m_apfnCbResponse[uiIndex] != NULL) {
|
||||
dwReqs |= (1 << uiIndex);
|
||||
}
|
||||
}
|
||||
|
||||
return dwReqs;
|
||||
return dwReqs;
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -440,58 +428,61 @@ unsigned int uiIndex;
|
||||
|
||||
static tEplKernel PUBLIC EplIdentuCbIdentResponse(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiIndex;
|
||||
tEplIdentuCbResponse pfnCbResponse;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiIndex;
|
||||
tEplIdentuCbResponse pfnCbResponse;
|
||||
|
||||
uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
|
||||
uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
|
||||
|
||||
uiIndex = uiNodeId - 1;
|
||||
uiIndex = uiNodeId - 1;
|
||||
|
||||
if (uiIndex < tabentries (EplIdentuInstance_g.m_apfnCbResponse))
|
||||
{
|
||||
// memorize pointer to callback function
|
||||
pfnCbResponse = EplIdentuInstance_g.m_apfnCbResponse[uiIndex];
|
||||
// reset callback function pointer so that caller may issue next request immediately
|
||||
EplIdentuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
|
||||
if (uiIndex < tabentries(EplIdentuInstance_g.m_apfnCbResponse)) {
|
||||
// memorize pointer to callback function
|
||||
pfnCbResponse = EplIdentuInstance_g.m_apfnCbResponse[uiIndex];
|
||||
// reset callback function pointer so that caller may issue next request immediately
|
||||
EplIdentuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
|
||||
|
||||
if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_IDENTRES)
|
||||
{ // IdentResponse not received or it has invalid size
|
||||
if (pfnCbResponse == NULL)
|
||||
{ // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
Ret = pfnCbResponse(uiNodeId, NULL);
|
||||
}
|
||||
else
|
||||
{ // IdentResponse received
|
||||
if (EplIdentuInstance_g.m_apIdentResponse[uiIndex] == NULL)
|
||||
{ // memory for IdentResponse must be allocated
|
||||
EplIdentuInstance_g.m_apIdentResponse[uiIndex] = EPL_MALLOC(sizeof (tEplIdentResponse));
|
||||
if (EplIdentuInstance_g.m_apIdentResponse[uiIndex] == NULL)
|
||||
{ // malloc failed
|
||||
if (pfnCbResponse == NULL)
|
||||
{ // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
Ret = pfnCbResponse(uiNodeId, &pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse);
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
// copy IdentResponse to instance structure
|
||||
EPL_MEMCPY(EplIdentuInstance_g.m_apIdentResponse[uiIndex], &pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_IdentResponse, sizeof(tEplIdentResponse));
|
||||
if (pfnCbResponse == NULL)
|
||||
{ // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
Ret = pfnCbResponse(uiNodeId, EplIdentuInstance_g.m_apIdentResponse[uiIndex]);
|
||||
}
|
||||
}
|
||||
if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_IDENTRES) { // IdentResponse not received or it has invalid size
|
||||
if (pfnCbResponse == NULL) { // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
Ret = pfnCbResponse(uiNodeId, NULL);
|
||||
} else { // IdentResponse received
|
||||
if (EplIdentuInstance_g.m_apIdentResponse[uiIndex] == NULL) { // memory for IdentResponse must be allocated
|
||||
EplIdentuInstance_g.m_apIdentResponse[uiIndex] =
|
||||
EPL_MALLOC(sizeof(tEplIdentResponse));
|
||||
if (EplIdentuInstance_g.m_apIdentResponse[uiIndex] == NULL) { // malloc failed
|
||||
if (pfnCbResponse == NULL) { // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
Ret =
|
||||
pfnCbResponse(uiNodeId,
|
||||
&pFrameInfo_p->
|
||||
m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_IdentResponse);
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
// copy IdentResponse to instance structure
|
||||
EPL_MEMCPY(EplIdentuInstance_g.
|
||||
m_apIdentResponse[uiIndex],
|
||||
&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.
|
||||
m_Payload.m_IdentResponse,
|
||||
sizeof(tEplIdentResponse));
|
||||
if (pfnCbResponse == NULL) { // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
Ret =
|
||||
pfnCbResponse(uiNodeId,
|
||||
EplIdentuInstance_g.
|
||||
m_apIdentResponse[uiIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -90,10 +90,9 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int m_uiNodeId;
|
||||
tEplNmtuCheckEventCallback m_pfnCheckEventCb;
|
||||
typedef struct {
|
||||
unsigned int m_uiNodeId;
|
||||
tEplNmtuCheckEventCallback m_pfnCheckEventCb;
|
||||
|
||||
} tEplNmtCnuInstance;
|
||||
|
||||
@@ -101,7 +100,7 @@ typedef struct
|
||||
// modul globale vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplNmtCnuInstance EplNmtCnuInstance_g;
|
||||
static tEplNmtCnuInstance EplNmtCnuInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
@@ -109,12 +108,10 @@ static tEplNmtCnuInstance EplNmtCnuInstance_g;
|
||||
|
||||
static tEplNmtCommand EplNmtCnuGetNmtCommand(tEplFrameInfo * pFrameInfo_p);
|
||||
|
||||
static BOOL EplNmtCnuNodeIdList(BYTE* pbNmtCommandDate_p);
|
||||
static BOOL EplNmtCnuNodeIdList(BYTE * pbNmtCommandDate_p);
|
||||
|
||||
static tEplKernel PUBLIC EplNmtCnuCommandCb(tEplFrameInfo * pFrameInfo_p);
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -140,11 +137,11 @@ static tEplKernel PUBLIC EplNmtCnuCommandCb(tEplFrameInfo * pFrameInfo_p);
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtCnuInit(unsigned int uiNodeId_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplNmtCnuAddInstance(uiNodeId_p);
|
||||
Ret = EplNmtCnuAddInstance(uiNodeId_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -166,25 +163,24 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtCnuAddInstance(unsigned int uiNodeId_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplNmtCnuInstance_g, 0, sizeof (EplNmtCnuInstance_g));
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplNmtCnuInstance_g, 0, sizeof(EplNmtCnuInstance_g));
|
||||
|
||||
// save nodeid
|
||||
EplNmtCnuInstance_g.m_uiNodeId = uiNodeId_p;
|
||||
// save nodeid
|
||||
EplNmtCnuInstance_g.m_uiNodeId = uiNodeId_p;
|
||||
|
||||
// register callback-function for NMT-commands
|
||||
// register callback-function for NMT-commands
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndNmtCommand,
|
||||
EplNmtCnuCommandCb,
|
||||
kEplDllAsndFilterLocal);
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndNmtCommand,
|
||||
EplNmtCnuCommandCb,
|
||||
kEplDllAsndFilterLocal);
|
||||
#endif
|
||||
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -207,18 +203,17 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtCnuDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
// deregister callback function from DLL
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndNmtCommand,
|
||||
NULL,
|
||||
kEplDllAsndFilterNone);
|
||||
// deregister callback function from DLL
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndNmtCommand,
|
||||
NULL, kEplDllAsndFilterNone);
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -239,49 +234,50 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtCnuSendNmtRequest(
|
||||
unsigned int uiNodeId_p,
|
||||
tEplNmtCommand NmtCommand_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtCnuSendNmtRequest(unsigned int uiNodeId_p,
|
||||
tEplNmtCommand
|
||||
NmtCommand_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplFrameInfo NmtRequestFrameInfo;
|
||||
tEplFrame NmtRequestFrame;
|
||||
tEplKernel Ret;
|
||||
tEplFrameInfo NmtRequestFrameInfo;
|
||||
tEplFrame NmtRequestFrame;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
// build frame
|
||||
EPL_MEMSET(&NmtRequestFrame.m_be_abDstMac[0], 0x00, sizeof(NmtRequestFrame.m_be_abDstMac)); // set by DLL
|
||||
EPL_MEMSET(&NmtRequestFrame.m_be_abSrcMac[0], 0x00, sizeof(NmtRequestFrame.m_be_abSrcMac)); // set by DLL
|
||||
AmiSetWordToBe(&NmtRequestFrame.m_be_wEtherType,
|
||||
EPL_C_DLL_ETHERTYPE_EPL);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_le_bDstNodeId, (BYTE) EPL_C_ADR_MN_DEF_NODE_ID); // node id of the MN
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_le_bMessageType,
|
||||
(BYTE) kEplMsgTypeAsnd);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_le_bServiceId,
|
||||
(BYTE) kEplDllAsndNmtRequest);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.
|
||||
m_NmtRequestService.m_le_bNmtCommandId,
|
||||
(BYTE) NmtCommand_p);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.m_le_bTargetNodeId, (BYTE) uiNodeId_p); // target for the nmt command
|
||||
EPL_MEMSET(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.
|
||||
m_le_abNmtCommandData[0], 0x00,
|
||||
sizeof(NmtRequestFrame.m_Data.m_Asnd.m_Payload.
|
||||
m_NmtRequestService.m_le_abNmtCommandData));
|
||||
|
||||
// build frame
|
||||
EPL_MEMSET(&NmtRequestFrame.m_be_abDstMac[0], 0x00, sizeof(NmtRequestFrame.m_be_abDstMac)); // set by DLL
|
||||
EPL_MEMSET(&NmtRequestFrame.m_be_abSrcMac[0], 0x00, sizeof(NmtRequestFrame.m_be_abSrcMac)); // set by DLL
|
||||
AmiSetWordToBe(&NmtRequestFrame.m_be_wEtherType, EPL_C_DLL_ETHERTYPE_EPL);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_le_bDstNodeId, (BYTE) EPL_C_ADR_MN_DEF_NODE_ID); // node id of the MN
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_le_bMessageType, (BYTE)kEplMsgTypeAsnd);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_le_bServiceId, (BYTE) kEplDllAsndNmtRequest);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.m_le_bNmtCommandId,
|
||||
(BYTE)NmtCommand_p);
|
||||
AmiSetByteToLe(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.m_le_bTargetNodeId,
|
||||
(BYTE)uiNodeId_p); // target for the nmt command
|
||||
EPL_MEMSET(&NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.m_le_abNmtCommandData[0], 0x00, sizeof(NmtRequestFrame.m_Data.m_Asnd.m_Payload.m_NmtRequestService.m_le_abNmtCommandData));
|
||||
// build info-structure
|
||||
NmtRequestFrameInfo.m_NetTime.m_dwNanoSec = 0;
|
||||
NmtRequestFrameInfo.m_NetTime.m_dwSec = 0;
|
||||
NmtRequestFrameInfo.m_pFrame = &NmtRequestFrame;
|
||||
NmtRequestFrameInfo.m_uiFrameSize = EPL_C_DLL_MINSIZE_NMTREQ; // sizeof(NmtRequestFrame);
|
||||
|
||||
|
||||
|
||||
// build info-structure
|
||||
NmtRequestFrameInfo.m_NetTime.m_dwNanoSec = 0;
|
||||
NmtRequestFrameInfo.m_NetTime.m_dwSec = 0;
|
||||
NmtRequestFrameInfo.m_pFrame = &NmtRequestFrame;
|
||||
NmtRequestFrameInfo.m_uiFrameSize = EPL_C_DLL_MINSIZE_NMTREQ; // sizeof(NmtRequestFrame);
|
||||
|
||||
// send NMT-Request
|
||||
// send NMT-Request
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
Ret = EplDlluCalAsyncSend(&NmtRequestFrameInfo, // pointer to frameinfo
|
||||
kEplDllAsyncReqPrioNmt); // priority
|
||||
Ret = EplDlluCalAsyncSend(&NmtRequestFrameInfo, // pointer to frameinfo
|
||||
kEplDllAsyncReqPrioNmt); // priority
|
||||
#endif
|
||||
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplNmtCnuRegisterStateChangeCb
|
||||
@@ -301,17 +297,18 @@ tEplFrame NmtRequestFrame;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtCnuRegisterCheckEventCb(
|
||||
tEplNmtuCheckEventCallback pfnEplNmtCheckEventCb_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC
|
||||
EplNmtCnuRegisterCheckEventCb(tEplNmtuCheckEventCallback
|
||||
pfnEplNmtCheckEventCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// save callback-function in modul global var
|
||||
EplNmtCnuInstance_g.m_pfnCheckEventCb = pfnEplNmtCheckEventCb_p;
|
||||
// save callback-function in modul global var
|
||||
EplNmtCnuInstance_g.m_pfnCheckEventCb = pfnEplNmtCheckEventCb_p;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -321,7 +318,6 @@ tEplKernel Ret;
|
||||
// //
|
||||
//=========================================================================//
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplNmtCnuCommandCb
|
||||
@@ -341,273 +337,290 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
static tEplKernel PUBLIC EplNmtCnuCommandCb(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplNmtCommand NmtCommand;
|
||||
BOOL fNodeIdInList;
|
||||
tEplNmtEvent NmtEvent = kEplNmtEventNoEvent;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplNmtCommand NmtCommand;
|
||||
BOOL fNodeIdInList;
|
||||
tEplNmtEvent NmtEvent = kEplNmtEventNoEvent;
|
||||
|
||||
if (pFrameInfo_p == NULL) {
|
||||
Ret = kEplNmtInvalidFramePointer;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if(pFrameInfo_p == NULL)
|
||||
{
|
||||
Ret = kEplNmtInvalidFramePointer;
|
||||
goto Exit;
|
||||
}
|
||||
NmtCommand = EplNmtCnuGetNmtCommand(pFrameInfo_p);
|
||||
|
||||
NmtCommand = EplNmtCnuGetNmtCommand(pFrameInfo_p);
|
||||
// check NMT-Command
|
||||
switch (NmtCommand) {
|
||||
|
||||
// check NMT-Command
|
||||
switch(NmtCommand)
|
||||
{
|
||||
//------------------------------------------------------------------------
|
||||
// plain NMT state commands
|
||||
case kEplNmtCmdStartNode:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventStartNode
|
||||
NmtEvent = kEplNmtEventStartNode;
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// plain NMT state commands
|
||||
case kEplNmtCmdStartNode:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventStartNode
|
||||
NmtEvent = kEplNmtEventStartNode;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdStopNode:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventStopNode
|
||||
NmtEvent = kEplNmtEventStopNode;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdStopNode:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventStopNode
|
||||
NmtEvent = kEplNmtEventStopNode;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdEnterPreOperational2:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventEnterPreOperational2
|
||||
NmtEvent = kEplNmtEventEnterPreOperational2;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdEnterPreOperational2:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventEnterPreOperational2
|
||||
NmtEvent = kEplNmtEventEnterPreOperational2;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdEnableReadyToOperate:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventEnableReadyToOperate
|
||||
NmtEvent = kEplNmtEventEnableReadyToOperate;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdEnableReadyToOperate:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventEnableReadyToOperate
|
||||
NmtEvent = kEplNmtEventEnableReadyToOperate;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdResetNode:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventResetNode
|
||||
NmtEvent = kEplNmtEventResetNode;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdResetNode:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventResetNode
|
||||
NmtEvent = kEplNmtEventResetNode;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdResetCommunication:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventResetCom
|
||||
NmtEvent = kEplNmtEventResetCom;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdResetCommunication:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventResetCom
|
||||
NmtEvent = kEplNmtEventResetCom;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdResetConfiguration:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventResetConfig
|
||||
NmtEvent = kEplNmtEventResetConfig;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdResetConfiguration:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventResetConfig
|
||||
NmtEvent = kEplNmtEventResetConfig;
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdSwReset:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventSwReset
|
||||
NmtEvent = kEplNmtEventSwReset;
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdSwReset:
|
||||
{ // send NMT-Event to state maschine kEplNmtEventSwReset
|
||||
NmtEvent = kEplNmtEventSwReset;
|
||||
break;
|
||||
}
|
||||
//------------------------------------------------------------------------
|
||||
// extended NMT state commands
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// extended NMT state commands
|
||||
case kEplNmtCmdStartNodeEx:
|
||||
{
|
||||
// check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&
|
||||
(pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]));
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventStartNode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdStartNodeEx:
|
||||
{
|
||||
// check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&(pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]));
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventStartNode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdStopNodeEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventStopNode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdStopNodeEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventStopNode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdEnterPreOperational2Ex:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventEnterPreOperational2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdEnterPreOperational2Ex:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventEnterPreOperational2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdEnableReadyToOperateEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventEnableReadyToOperate;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdEnableReadyToOperateEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventEnableReadyToOperate;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdResetNodeEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventResetNode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdResetNodeEx:
|
||||
{// check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventResetNode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdResetCommunicationEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventResetCom;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdResetCommunicationEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventResetCom;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdResetConfigurationEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventResetConfig;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdResetConfigurationEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventResetConfig;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdSwResetEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList =
|
||||
EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.
|
||||
m_NmtCommandService.
|
||||
m_le_abNmtCommandData[0]);
|
||||
if (fNodeIdInList != FALSE) { // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventSwReset;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdSwResetEx:
|
||||
{ // check if own nodeid is in EPL node list
|
||||
fNodeIdInList = EplNmtCnuNodeIdList(&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService.m_le_abNmtCommandData[0]);
|
||||
if(fNodeIdInList != FALSE)
|
||||
{ // own nodeid in list
|
||||
// send event to process command
|
||||
NmtEvent = kEplNmtEventSwReset;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//------------------------------------------------------------------------
|
||||
// NMT managing commands
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// NMT managing commands
|
||||
// TODO: add functions to process managing command (optional)
|
||||
|
||||
// TODO: add functions to process managing command (optional)
|
||||
case kEplNmtCmdNetHostNameSet:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdNetHostNameSet:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdFlushArpEntry:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdFlushArpEntry:
|
||||
{
|
||||
break;
|
||||
}
|
||||
//------------------------------------------------------------------------
|
||||
// NMT info services
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// NMT info services
|
||||
// TODO: forward event with infos to the application (optional)
|
||||
|
||||
// TODO: forward event with infos to the application (optional)
|
||||
case kEplNmtCmdPublishConfiguredCN:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishConfiguredCN:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishActiveCN:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishActiveCN:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishPreOperational1:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishPreOperational1:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishPreOperational2:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishPreOperational2:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishReadyToOperate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishReadyToOperate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishOperational:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishOperational:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishStopped:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishStopped:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishEmergencyNew:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishEmergencyNew:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case kEplNmtCmdPublishTime:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case kEplNmtCmdPublishTime:
|
||||
{
|
||||
break;
|
||||
}
|
||||
//-----------------------------------------------------------------------
|
||||
// error from MN
|
||||
// -> requested command not supported by MN
|
||||
case kEplNmtCmdInvalidService:
|
||||
{
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// error from MN
|
||||
// -> requested command not supported by MN
|
||||
case kEplNmtCmdInvalidService:
|
||||
{
|
||||
// TODO: errorevent to application
|
||||
break;
|
||||
}
|
||||
|
||||
// TODO: errorevent to application
|
||||
break;
|
||||
}
|
||||
//------------------------------------------------------------------------
|
||||
// default
|
||||
default:
|
||||
{
|
||||
Ret = kEplNmtUnknownCommand;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// default
|
||||
default:
|
||||
{
|
||||
Ret = kEplNmtUnknownCommand;
|
||||
goto Exit;
|
||||
}
|
||||
} // end of switch(NmtCommand)
|
||||
|
||||
}// end of switch(NmtCommand)
|
||||
|
||||
if (NmtEvent != kEplNmtEventNoEvent)
|
||||
{
|
||||
if (EplNmtCnuInstance_g.m_pfnCheckEventCb != NULL)
|
||||
{
|
||||
Ret = EplNmtCnuInstance_g.m_pfnCheckEventCb(NmtEvent);
|
||||
if (Ret == kEplReject)
|
||||
{
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
else if (Ret != kEplSuccessful)
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
if (NmtEvent != kEplNmtEventNoEvent) {
|
||||
if (EplNmtCnuInstance_g.m_pfnCheckEventCb != NULL) {
|
||||
Ret = EplNmtCnuInstance_g.m_pfnCheckEventCb(NmtEvent);
|
||||
if (Ret == kEplReject) {
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
} else if (Ret != kEplSuccessful) {
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
|
||||
Ret = EplNmtuNmtEvent(NmtEvent);
|
||||
Ret = EplNmtuNmtEvent(NmtEvent);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -631,14 +644,18 @@ tEplNmtEvent NmtEvent = kEplNmtEventNoEvent;
|
||||
//---------------------------------------------------------------------------
|
||||
static tEplNmtCommand EplNmtCnuGetNmtCommand(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplNmtCommand NmtCommand;
|
||||
tEplNmtCommandService* pNmtCommandService;
|
||||
tEplNmtCommand NmtCommand;
|
||||
tEplNmtCommandService *pNmtCommandService;
|
||||
|
||||
pNmtCommandService = &pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_NmtCommandService;
|
||||
pNmtCommandService =
|
||||
&pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.
|
||||
m_NmtCommandService;
|
||||
|
||||
NmtCommand = (tEplNmtCommand)AmiGetByteFromLe(&pNmtCommandService->m_le_bNmtCommandId);
|
||||
NmtCommand =
|
||||
(tEplNmtCommand) AmiGetByteFromLe(&pNmtCommandService->
|
||||
m_le_bNmtCommandId);
|
||||
|
||||
return NmtCommand;
|
||||
return NmtCommand;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -659,33 +676,29 @@ tEplNmtCommandService* pNmtCommandService;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
static BOOL EplNmtCnuNodeIdList(BYTE* pbNmtCommandDate_p)
|
||||
static BOOL EplNmtCnuNodeIdList(BYTE * pbNmtCommandDate_p)
|
||||
{
|
||||
BOOL fNodeIdInList;
|
||||
unsigned int uiByteOffset;
|
||||
BYTE bBitOffset;
|
||||
BYTE bNodeListByte;
|
||||
BOOL fNodeIdInList;
|
||||
unsigned int uiByteOffset;
|
||||
BYTE bBitOffset;
|
||||
BYTE bNodeListByte;
|
||||
|
||||
// get byte-offset of the own nodeid in NodeIdList
|
||||
// devide though 8
|
||||
uiByteOffset = (unsigned int)(EplNmtCnuInstance_g.m_uiNodeId >> 3);
|
||||
// get bitoffset
|
||||
bBitOffset = (BYTE) EplNmtCnuInstance_g.m_uiNodeId % 8;
|
||||
// get byte-offset of the own nodeid in NodeIdList
|
||||
// devide though 8
|
||||
uiByteOffset = (unsigned int)(EplNmtCnuInstance_g.m_uiNodeId >> 3);
|
||||
// get bitoffset
|
||||
bBitOffset = (BYTE) EplNmtCnuInstance_g.m_uiNodeId % 8;
|
||||
|
||||
bNodeListByte = AmiGetByteFromLe(&pbNmtCommandDate_p[uiByteOffset]);
|
||||
if((bNodeListByte & bBitOffset) == 0)
|
||||
{
|
||||
fNodeIdInList = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
fNodeIdInList = TRUE;
|
||||
}
|
||||
bNodeListByte = AmiGetByteFromLe(&pbNmtCommandDate_p[uiByteOffset]);
|
||||
if ((bNodeListByte & bBitOffset) == 0) {
|
||||
fNodeIdInList = FALSE;
|
||||
} else {
|
||||
fNodeIdInList = TRUE;
|
||||
}
|
||||
|
||||
return fNodeIdInList;
|
||||
return fNodeIdInList;
|
||||
}
|
||||
|
||||
#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_CN)) != 0)
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -71,11 +71,9 @@
|
||||
|
||||
#include "kernel/EplNmtkCal.h"
|
||||
|
||||
|
||||
// TODO: init function needed to prepare EplNmtkGetNmtState for
|
||||
// io-controll-call from EplNmtuCal-Modul
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -100,8 +98,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -126,7 +122,6 @@
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -151,7 +146,4 @@
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -68,7 +68,6 @@
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include "EplInc.h"
|
||||
#include "user/EplNmtu.h"
|
||||
#include "user/EplObdu.h"
|
||||
@@ -94,10 +93,9 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tEplNmtuStateChangeCallback m_pfnNmtChangeCb;
|
||||
tEplTimerHdl m_TimerHdl;
|
||||
typedef struct {
|
||||
tEplNmtuStateChangeCallback m_pfnNmtChangeCb;
|
||||
tEplTimerHdl m_TimerHdl;
|
||||
|
||||
} tEplNmtuInstance;
|
||||
|
||||
@@ -136,11 +134,11 @@ static tEplNmtuInstance EplNmtuInstance_g;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuInit()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplNmtuAddInstance();
|
||||
Ret = EplNmtuAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -162,13 +160,13 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuAddInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
EplNmtuInstance_g.m_pfnNmtChangeCb = NULL;
|
||||
EplNmtuInstance_g.m_pfnNmtChangeCb = NULL;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -191,16 +189,16 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
EplNmtuInstance_g.m_pfnNmtChangeCb = NULL;
|
||||
EplNmtuInstance_g.m_pfnNmtChangeCb = NULL;
|
||||
|
||||
// delete timer
|
||||
Ret = EplTimeruDeleteTimer(&EplNmtuInstance_g.m_TimerHdl);
|
||||
// delete timer
|
||||
Ret = EplTimeruDeleteTimer(&EplNmtuInstance_g.m_TimerHdl);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -223,20 +221,19 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuNmtEvent(tEplNmtEvent NmtEvent_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret;
|
||||
tEplEvent Event;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkNmtk;
|
||||
Event.m_NetTime.m_dwNanoSec = 0;
|
||||
Event.m_NetTime.m_dwSec = 0;
|
||||
Event.m_EventType = kEplEventTypeNmtEvent;
|
||||
Event.m_pArg = &NmtEvent_p;
|
||||
Event.m_uiSize = sizeof(NmtEvent_p);
|
||||
Event.m_EventSink = kEplEventSinkNmtk;
|
||||
Event.m_NetTime.m_dwNanoSec = 0;
|
||||
Event.m_NetTime.m_dwSec = 0;
|
||||
Event.m_EventType = kEplEventTypeNmtEvent;
|
||||
Event.m_pArg = &NmtEvent_p;
|
||||
Event.m_uiSize = sizeof(NmtEvent_p);
|
||||
|
||||
Ret = EplEventuPost(&Event);
|
||||
Ret = EplEventuPost(&Event);
|
||||
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -258,16 +255,16 @@ tEplEvent Event;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplNmtState PUBLIC EplNmtuGetNmtState()
|
||||
{
|
||||
tEplNmtState NmtState;
|
||||
tEplNmtState NmtState;
|
||||
|
||||
// $$$ call function of communication abstraction layer
|
||||
// $$$ call function of communication abstraction layer
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
|
||||
NmtState = EplNmtkGetNmtState();
|
||||
NmtState = EplNmtkGetNmtState();
|
||||
#else
|
||||
NmtState = 0;
|
||||
NmtState = 0;
|
||||
#endif
|
||||
|
||||
return NmtState;
|
||||
return NmtState;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -287,335 +284,366 @@ tEplNmtState NmtState;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuProcessEvent(
|
||||
tEplEvent* pEplEvent_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuProcessEvent(tEplEvent * pEplEvent_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// process event
|
||||
switch(pEplEvent_p->m_EventType)
|
||||
{
|
||||
// state change of NMT-Module
|
||||
case kEplEventTypeNmtStateChange:
|
||||
{
|
||||
tEplEventNmtStateChange* pNmtStateChange;
|
||||
// process event
|
||||
switch (pEplEvent_p->m_EventType) {
|
||||
// state change of NMT-Module
|
||||
case kEplEventTypeNmtStateChange:
|
||||
{
|
||||
tEplEventNmtStateChange *pNmtStateChange;
|
||||
|
||||
// delete timer
|
||||
Ret = EplTimeruDeleteTimer(&EplNmtuInstance_g.m_TimerHdl);
|
||||
// delete timer
|
||||
Ret =
|
||||
EplTimeruDeleteTimer(&EplNmtuInstance_g.m_TimerHdl);
|
||||
|
||||
pNmtStateChange = (tEplEventNmtStateChange*)pEplEvent_p->m_pArg;
|
||||
pNmtStateChange =
|
||||
(tEplEventNmtStateChange *) pEplEvent_p->m_pArg;
|
||||
|
||||
// call cb-functions to inform higher layer
|
||||
if(EplNmtuInstance_g.m_pfnNmtChangeCb != NULL)
|
||||
{
|
||||
Ret = EplNmtuInstance_g.m_pfnNmtChangeCb(*pNmtStateChange);
|
||||
}
|
||||
// call cb-functions to inform higher layer
|
||||
if (EplNmtuInstance_g.m_pfnNmtChangeCb != NULL) {
|
||||
Ret =
|
||||
EplNmtuInstance_g.
|
||||
m_pfnNmtChangeCb(*pNmtStateChange);
|
||||
}
|
||||
|
||||
if (Ret == kEplSuccessful)
|
||||
{ // everything is OK, so switch to next state if necessary
|
||||
switch (pNmtStateChange->m_NewNmtState)
|
||||
{
|
||||
// EPL stack is not running
|
||||
case kEplNmtGsOff:
|
||||
break;
|
||||
if (Ret == kEplSuccessful) { // everything is OK, so switch to next state if necessary
|
||||
switch (pNmtStateChange->m_NewNmtState) {
|
||||
// EPL stack is not running
|
||||
case kEplNmtGsOff:
|
||||
break;
|
||||
|
||||
// first init of the hardware
|
||||
case kEplNmtGsInitialising:
|
||||
{
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventEnterResetApp);
|
||||
break;
|
||||
}
|
||||
// first init of the hardware
|
||||
case kEplNmtGsInitialising:
|
||||
{
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventEnterResetApp);
|
||||
break;
|
||||
}
|
||||
|
||||
// init of the manufacturer-specific profile area and the
|
||||
// standardised device profile area
|
||||
case kEplNmtGsResetApplication:
|
||||
{
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventEnterResetCom);
|
||||
break;
|
||||
}
|
||||
// init of the manufacturer-specific profile area and the
|
||||
// standardised device profile area
|
||||
case kEplNmtGsResetApplication:
|
||||
{
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventEnterResetCom);
|
||||
break;
|
||||
}
|
||||
|
||||
// init of the communication profile area
|
||||
case kEplNmtGsResetCommunication:
|
||||
{
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventEnterResetConfig);
|
||||
break;
|
||||
}
|
||||
// init of the communication profile area
|
||||
case kEplNmtGsResetCommunication:
|
||||
{
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventEnterResetConfig);
|
||||
break;
|
||||
}
|
||||
|
||||
// build the configuration with infos from OD
|
||||
case kEplNmtGsResetConfiguration:
|
||||
{
|
||||
unsigned int uiNodeId;
|
||||
// build the configuration with infos from OD
|
||||
case kEplNmtGsResetConfiguration:
|
||||
{
|
||||
unsigned int uiNodeId;
|
||||
|
||||
// get node ID from OD
|
||||
// get node ID from OD
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
|
||||
uiNodeId = EplObduGetNodeId(EPL_MCO_PTR_INSTANCE_PTR);
|
||||
uiNodeId =
|
||||
EplObduGetNodeId
|
||||
(EPL_MCO_PTR_INSTANCE_PTR);
|
||||
#else
|
||||
uiNodeId = 0;
|
||||
uiNodeId = 0;
|
||||
#endif
|
||||
//check node ID if not should be master or slave
|
||||
if (uiNodeId == EPL_C_ADR_MN_DEF_NODE_ID)
|
||||
{ // node shall be MN
|
||||
//check node ID if not should be master or slave
|
||||
if (uiNodeId == EPL_C_ADR_MN_DEF_NODE_ID) { // node shall be MN
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventEnterMsNotActive);
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventEnterMsNotActive);
|
||||
#else
|
||||
TRACE0("EplNmtuProcess(): no MN functionality implemented\n");
|
||||
TRACE0
|
||||
("EplNmtuProcess(): no MN functionality implemented\n");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{ // node shall be CN
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventEnterCsNotActive);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else { // node shall be CN
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventEnterCsNotActive);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------
|
||||
// CN part of the state machine
|
||||
//-----------------------------------------------------------
|
||||
// CN part of the state machine
|
||||
|
||||
// node listens for EPL-Frames and check timeout
|
||||
case kEplNmtCsNotActive:
|
||||
{
|
||||
DWORD dwBuffer;
|
||||
tEplObdSize ObdSize;
|
||||
tEplTimerArg TimerArg;
|
||||
// node listens for EPL-Frames and check timeout
|
||||
case kEplNmtCsNotActive:
|
||||
{
|
||||
DWORD dwBuffer;
|
||||
tEplObdSize ObdSize;
|
||||
tEplTimerArg TimerArg;
|
||||
|
||||
// create timer to switch automatically to BasicEthernet if no MN available in network
|
||||
// create timer to switch automatically to BasicEthernet if no MN available in network
|
||||
|
||||
// read NMT_CNBasicEthernetTimerout_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
// read NMT_CNBasicEthernetTimerout_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
|
||||
Ret = EplObduReadEntry(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F99,
|
||||
0x00,
|
||||
&dwBuffer,
|
||||
&ObdSize);
|
||||
Ret =
|
||||
EplObduReadEntry
|
||||
(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F99, 0x00, &dwBuffer,
|
||||
&ObdSize);
|
||||
#else
|
||||
Ret = kEplObdIndexNotExist;
|
||||
Ret = kEplObdIndexNotExist;
|
||||
#endif
|
||||
if(Ret != kEplSuccessful)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (dwBuffer != 0)
|
||||
{ // BasicEthernet is enabled
|
||||
// convert us into ms
|
||||
dwBuffer = dwBuffer / 1000;
|
||||
if (dwBuffer == 0)
|
||||
{ // timer was below one ms
|
||||
// set one ms
|
||||
dwBuffer = 1;
|
||||
}
|
||||
TimerArg.m_EventSink = kEplEventSinkNmtk;
|
||||
TimerArg.m_ulArg = (unsigned long) kEplNmtEventTimerBasicEthernet;
|
||||
Ret = EplTimeruModifyTimerMs(&EplNmtuInstance_g.m_TimerHdl, (unsigned long) dwBuffer, TimerArg);
|
||||
// potential error is forwarded to event queue which generates error event
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (Ret != kEplSuccessful) {
|
||||
break;
|
||||
}
|
||||
if (dwBuffer != 0) { // BasicEthernet is enabled
|
||||
// convert us into ms
|
||||
dwBuffer =
|
||||
dwBuffer / 1000;
|
||||
if (dwBuffer == 0) { // timer was below one ms
|
||||
// set one ms
|
||||
dwBuffer = 1;
|
||||
}
|
||||
TimerArg.m_EventSink =
|
||||
kEplEventSinkNmtk;
|
||||
TimerArg.m_ulArg =
|
||||
(unsigned long)
|
||||
kEplNmtEventTimerBasicEthernet;
|
||||
Ret =
|
||||
EplTimeruModifyTimerMs
|
||||
(&EplNmtuInstance_g.
|
||||
m_TimerHdl,
|
||||
(unsigned long)
|
||||
dwBuffer,
|
||||
TimerArg);
|
||||
// potential error is forwarded to event queue which generates error event
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// node processes only async frames
|
||||
case kEplNmtCsPreOperational1:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// node processes only async frames
|
||||
case kEplNmtCsPreOperational1:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// node processes isochronous and asynchronous frames
|
||||
case kEplNmtCsPreOperational2:
|
||||
{
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventEnterReadyToOperate);
|
||||
break;
|
||||
}
|
||||
// node processes isochronous and asynchronous frames
|
||||
case kEplNmtCsPreOperational2:
|
||||
{
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventEnterReadyToOperate);
|
||||
break;
|
||||
}
|
||||
|
||||
// node should be configured und application is ready
|
||||
case kEplNmtCsReadyToOperate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// node should be configured und application is ready
|
||||
case kEplNmtCsReadyToOperate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// normal work state
|
||||
case kEplNmtCsOperational:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// normal work state
|
||||
case kEplNmtCsOperational:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// node stopped by MN
|
||||
// -> only process asynchronous frames
|
||||
case kEplNmtCsStopped:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// node stopped by MN
|
||||
// -> only process asynchronous frames
|
||||
case kEplNmtCsStopped:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// no EPL cycle
|
||||
// -> normal ethernet communication
|
||||
case kEplNmtCsBasicEthernet:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// no EPL cycle
|
||||
// -> normal ethernet communication
|
||||
case kEplNmtCsBasicEthernet:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------
|
||||
// MN part of the state machine
|
||||
//-----------------------------------------------------------
|
||||
// MN part of the state machine
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
// node listens for EPL-Frames and check timeout
|
||||
case kEplNmtMsNotActive:
|
||||
{
|
||||
DWORD dwBuffer;
|
||||
tEplObdSize ObdSize;
|
||||
tEplTimerArg TimerArg;
|
||||
// node listens for EPL-Frames and check timeout
|
||||
case kEplNmtMsNotActive:
|
||||
{
|
||||
DWORD dwBuffer;
|
||||
tEplObdSize ObdSize;
|
||||
tEplTimerArg TimerArg;
|
||||
|
||||
// create timer to switch automatically to BasicEthernet/PreOp1 if no other MN active in network
|
||||
// create timer to switch automatically to BasicEthernet/PreOp1 if no other MN active in network
|
||||
|
||||
// check NMT_StartUp_U32.Bit13
|
||||
// read NMT_StartUp_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
// check NMT_StartUp_U32.Bit13
|
||||
// read NMT_StartUp_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
|
||||
Ret = EplObduReadEntry(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F80,
|
||||
0x00,
|
||||
&dwBuffer,
|
||||
&ObdSize);
|
||||
Ret =
|
||||
EplObduReadEntry
|
||||
(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F80, 0x00, &dwBuffer,
|
||||
&ObdSize);
|
||||
#else
|
||||
Ret = kEplObdIndexNotExist;
|
||||
Ret = kEplObdIndexNotExist;
|
||||
#endif
|
||||
if(Ret != kEplSuccessful)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (Ret != kEplSuccessful) {
|
||||
break;
|
||||
}
|
||||
|
||||
if((dwBuffer & EPL_NMTST_BASICETHERNET) == 0)
|
||||
{ // NMT_StartUp_U32.Bit13 == 0
|
||||
// new state PreOperational1
|
||||
TimerArg.m_ulArg = (unsigned long) kEplNmtEventTimerMsPreOp1;
|
||||
}
|
||||
else
|
||||
{ // NMT_StartUp_U32.Bit13 == 1
|
||||
// new state BasicEthernet
|
||||
TimerArg.m_ulArg = (unsigned long) kEplNmtEventTimerBasicEthernet;
|
||||
}
|
||||
if ((dwBuffer & EPL_NMTST_BASICETHERNET) == 0) { // NMT_StartUp_U32.Bit13 == 0
|
||||
// new state PreOperational1
|
||||
TimerArg.m_ulArg =
|
||||
(unsigned long)
|
||||
kEplNmtEventTimerMsPreOp1;
|
||||
} else { // NMT_StartUp_U32.Bit13 == 1
|
||||
// new state BasicEthernet
|
||||
TimerArg.m_ulArg =
|
||||
(unsigned long)
|
||||
kEplNmtEventTimerBasicEthernet;
|
||||
}
|
||||
|
||||
// read NMT_BootTime_REC.MNWaitNotAct_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
// read NMT_BootTime_REC.MNWaitNotAct_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
|
||||
Ret = EplObduReadEntry(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F89,
|
||||
0x01,
|
||||
&dwBuffer,
|
||||
&ObdSize);
|
||||
Ret =
|
||||
EplObduReadEntry
|
||||
(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F89, 0x01, &dwBuffer,
|
||||
&ObdSize);
|
||||
#else
|
||||
Ret = kEplObdIndexNotExist;
|
||||
Ret = kEplObdIndexNotExist;
|
||||
#endif
|
||||
if(Ret != kEplSuccessful)
|
||||
{
|
||||
break;
|
||||
}
|
||||
// convert us into ms
|
||||
dwBuffer = dwBuffer / 1000;
|
||||
if (dwBuffer == 0)
|
||||
{ // timer was below one ms
|
||||
// set one ms
|
||||
dwBuffer = 1;
|
||||
}
|
||||
TimerArg.m_EventSink = kEplEventSinkNmtk;
|
||||
Ret = EplTimeruModifyTimerMs(&EplNmtuInstance_g.m_TimerHdl, (unsigned long) dwBuffer, TimerArg);
|
||||
// potential error is forwarded to event queue which generates error event
|
||||
break;
|
||||
}
|
||||
if (Ret != kEplSuccessful) {
|
||||
break;
|
||||
}
|
||||
// convert us into ms
|
||||
dwBuffer = dwBuffer / 1000;
|
||||
if (dwBuffer == 0) { // timer was below one ms
|
||||
// set one ms
|
||||
dwBuffer = 1;
|
||||
}
|
||||
TimerArg.m_EventSink =
|
||||
kEplEventSinkNmtk;
|
||||
Ret =
|
||||
EplTimeruModifyTimerMs
|
||||
(&EplNmtuInstance_g.
|
||||
m_TimerHdl,
|
||||
(unsigned long)dwBuffer,
|
||||
TimerArg);
|
||||
// potential error is forwarded to event queue which generates error event
|
||||
break;
|
||||
}
|
||||
|
||||
// node processes only async frames
|
||||
case kEplNmtMsPreOperational1:
|
||||
{
|
||||
DWORD dwBuffer = 0;
|
||||
tEplObdSize ObdSize;
|
||||
tEplTimerArg TimerArg;
|
||||
// node processes only async frames
|
||||
case kEplNmtMsPreOperational1:
|
||||
{
|
||||
DWORD dwBuffer = 0;
|
||||
tEplObdSize ObdSize;
|
||||
tEplTimerArg TimerArg;
|
||||
|
||||
// create timer to switch automatically to PreOp2 if MN identified all mandatory CNs
|
||||
// create timer to switch automatically to PreOp2 if MN identified all mandatory CNs
|
||||
|
||||
// read NMT_BootTime_REC.MNWaitPreOp1_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
// read NMT_BootTime_REC.MNWaitPreOp1_U32 from OD
|
||||
ObdSize = sizeof(dwBuffer);
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) || (EPL_OBD_USE_KERNEL != FALSE)
|
||||
Ret = EplObduReadEntry(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F89,
|
||||
0x03,
|
||||
&dwBuffer,
|
||||
&ObdSize);
|
||||
if(Ret != kEplSuccessful)
|
||||
{
|
||||
// ignore error, because this timeout is optional
|
||||
dwBuffer = 0;
|
||||
}
|
||||
Ret =
|
||||
EplObduReadEntry
|
||||
(EPL_MCO_PTR_INSTANCE_PTR_
|
||||
0x1F89, 0x03, &dwBuffer,
|
||||
&ObdSize);
|
||||
if (Ret != kEplSuccessful) {
|
||||
// ignore error, because this timeout is optional
|
||||
dwBuffer = 0;
|
||||
}
|
||||
#endif
|
||||
if (dwBuffer == 0)
|
||||
{ // delay is deactivated
|
||||
// immediately post timer event
|
||||
Ret = EplNmtuNmtEvent(kEplNmtEventTimerMsPreOp2);
|
||||
break;
|
||||
}
|
||||
// convert us into ms
|
||||
dwBuffer = dwBuffer / 1000;
|
||||
if (dwBuffer == 0)
|
||||
{ // timer was below one ms
|
||||
// set one ms
|
||||
dwBuffer = 1;
|
||||
}
|
||||
TimerArg.m_EventSink = kEplEventSinkNmtk;
|
||||
TimerArg.m_ulArg = (unsigned long) kEplNmtEventTimerMsPreOp2;
|
||||
Ret = EplTimeruModifyTimerMs(&EplNmtuInstance_g.m_TimerHdl, (unsigned long) dwBuffer, TimerArg);
|
||||
// potential error is forwarded to event queue which generates error event
|
||||
break;
|
||||
}
|
||||
if (dwBuffer == 0) { // delay is deactivated
|
||||
// immediately post timer event
|
||||
Ret =
|
||||
EplNmtuNmtEvent
|
||||
(kEplNmtEventTimerMsPreOp2);
|
||||
break;
|
||||
}
|
||||
// convert us into ms
|
||||
dwBuffer = dwBuffer / 1000;
|
||||
if (dwBuffer == 0) { // timer was below one ms
|
||||
// set one ms
|
||||
dwBuffer = 1;
|
||||
}
|
||||
TimerArg.m_EventSink =
|
||||
kEplEventSinkNmtk;
|
||||
TimerArg.m_ulArg =
|
||||
(unsigned long)
|
||||
kEplNmtEventTimerMsPreOp2;
|
||||
Ret =
|
||||
EplTimeruModifyTimerMs
|
||||
(&EplNmtuInstance_g.
|
||||
m_TimerHdl,
|
||||
(unsigned long)dwBuffer,
|
||||
TimerArg);
|
||||
// potential error is forwarded to event queue which generates error event
|
||||
break;
|
||||
}
|
||||
|
||||
// node processes isochronous and asynchronous frames
|
||||
case kEplNmtMsPreOperational2:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// node processes isochronous and asynchronous frames
|
||||
case kEplNmtMsPreOperational2:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// node should be configured und application is ready
|
||||
case kEplNmtMsReadyToOperate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// node should be configured und application is ready
|
||||
case kEplNmtMsReadyToOperate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// normal work state
|
||||
case kEplNmtMsOperational:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// normal work state
|
||||
case kEplNmtMsOperational:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// no EPL cycle
|
||||
// -> normal ethernet communication
|
||||
case kEplNmtMsBasicEthernet:
|
||||
{
|
||||
break;
|
||||
}
|
||||
// no EPL cycle
|
||||
// -> normal ethernet communication
|
||||
case kEplNmtMsBasicEthernet:
|
||||
{
|
||||
break;
|
||||
}
|
||||
#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
|
||||
default:
|
||||
{
|
||||
TRACE1("EplNmtuProcess(): unhandled NMT state 0x%X\n", pNmtStateChange->m_NewNmtState);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (Ret == kEplReject)
|
||||
{ // application wants to change NMT state itself
|
||||
// it's OK
|
||||
Ret = kEplSuccessful;
|
||||
}
|
||||
default:
|
||||
{
|
||||
TRACE1
|
||||
("EplNmtuProcess(): unhandled NMT state 0x%X\n",
|
||||
pNmtStateChange->
|
||||
m_NewNmtState);
|
||||
}
|
||||
}
|
||||
} else if (Ret == kEplReject) { // application wants to change NMT state itself
|
||||
// it's OK
|
||||
Ret = kEplSuccessful;
|
||||
}
|
||||
|
||||
EPL_DBGLVL_NMTU_TRACE0("EplNmtuProcessEvent(): NMT-State-Maschine announce change of NMT State\n");
|
||||
break;
|
||||
}
|
||||
EPL_DBGLVL_NMTU_TRACE0
|
||||
("EplNmtuProcessEvent(): NMT-State-Maschine announce change of NMT State\n");
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
Ret = kEplNmtInvalidEvent;
|
||||
}
|
||||
default:
|
||||
{
|
||||
Ret = kEplNmtInvalidEvent;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//Exit:
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -636,17 +664,18 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplNmtuRegisterStateChangeCb(
|
||||
tEplNmtuStateChangeCallback pfnEplNmtStateChangeCb_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC
|
||||
EplNmtuRegisterStateChangeCb(tEplNmtuStateChangeCallback
|
||||
pfnEplNmtStateChangeCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// save callback-function in modul global var
|
||||
EplNmtuInstance_g.m_pfnNmtChangeCb = pfnEplNmtStateChangeCb_p;
|
||||
// save callback-function in modul global var
|
||||
EplNmtuInstance_g.m_pfnNmtChangeCb = pfnEplNmtStateChangeCb_p;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -676,6 +705,4 @@ tEplKernel Ret;
|
||||
|
||||
#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTU)) != 0)
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -95,9 +95,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -124,14 +121,14 @@
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplNmtState PUBLIC EplNmtkCalGetNmtState()
|
||||
{
|
||||
tEplNmtState NmtState;
|
||||
// for test direkt call for EplNmtkGetNmtState()
|
||||
tEplNmtState NmtState;
|
||||
// for test direkt call for EplNmtkGetNmtState()
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
|
||||
NmtState = EplNmtkGetNmtState();
|
||||
NmtState = EplNmtkGetNmtState();
|
||||
#else
|
||||
NmtState = 0;
|
||||
NmtState = 0;
|
||||
#endif
|
||||
return NmtState;
|
||||
return NmtState;
|
||||
}
|
||||
|
||||
//=========================================================================//
|
||||
@@ -158,7 +155,4 @@ return NmtState;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -96,9 +96,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -123,7 +120,6 @@
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -148,7 +144,4 @@
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -97,8 +97,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -123,19 +121,18 @@
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduWriteEntry (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduWriteEntry(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void *pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalWriteEntry(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
|
||||
Ret = EplObduCalWriteEntry(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplObduReadEntry()
|
||||
@@ -156,19 +153,18 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduReadEntry (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pDstData_p,
|
||||
tEplObdSize* pSize_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduReadEntry(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void *pDstData_p,
|
||||
tEplObdSize * pSize_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalReadEntry(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
Ret = EplObduCalReadEntry(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplObdAccessOdPart()
|
||||
@@ -183,14 +179,14 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduAccessOdPart (tEplObdPart ObdPart_p,
|
||||
tEplObdDir Direction_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduAccessOdPart(tEplObdPart ObdPart_p,
|
||||
tEplObdDir Direction_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalAccessOdPart(ObdPart_p, Direction_p);
|
||||
Ret = EplObduCalAccessOdPart(ObdPart_p, Direction_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -206,13 +202,13 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduDefineVar (tEplVarParam MEM* pVarParam_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduDefineVar(tEplVarParam MEM * pVarParam_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalDefineVar(pVarParam_p);
|
||||
Ret = EplObduCalDefineVar(pVarParam_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -230,14 +226,14 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT void* PUBLIC EplObduGetObjectDataPtr (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p)
|
||||
EPLDLLEXPORT void *PUBLIC EplObduGetObjectDataPtr(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p)
|
||||
{
|
||||
void* pData;
|
||||
void *pData;
|
||||
|
||||
pData = EplObduCalGetObjectDataPtr(uiIndex_p, uiSubIndex_p);
|
||||
pData = EplObduCalGetObjectDataPtr(uiIndex_p, uiSubIndex_p);
|
||||
|
||||
return pData;
|
||||
return pData;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -254,13 +250,13 @@ void* pData;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduRegisterUserOd (tEplObdEntryPtr pUserOd_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduRegisterUserOd(tEplObdEntryPtr pUserOd_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalRegisterUserOd(pUserOd_p);
|
||||
Ret = EplObduCalRegisterUserOd(pUserOd_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
#endif
|
||||
@@ -279,10 +275,11 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT void PUBLIC EplObduInitVarEntry (tEplObdVarEntry MEM* pVarEntry_p,
|
||||
BYTE bType_p, tEplObdSize ObdSize_p)
|
||||
EPLDLLEXPORT void PUBLIC EplObduInitVarEntry(tEplObdVarEntry MEM * pVarEntry_p,
|
||||
BYTE bType_p,
|
||||
tEplObdSize ObdSize_p)
|
||||
{
|
||||
EplObduCalInitVarEntry(pVarEntry_p, bType_p, ObdSize_p);
|
||||
EplObduCalInitVarEntry(pVarEntry_p, bType_p, ObdSize_p);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -303,13 +300,13 @@ EPLDLLEXPORT void PUBLIC EplObduInitVarEntry (tEplObdVarEntry MEM* pVarEntry_p,
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplObdSize PUBLIC EplObduGetDataSize(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p)
|
||||
unsigned int uiSubIndex_p)
|
||||
{
|
||||
tEplObdSize Size;
|
||||
tEplObdSize Size;
|
||||
|
||||
Size = EplObduCalGetDataSize(uiIndex_p, uiSubIndex_p);
|
||||
Size = EplObduCalGetDataSize(uiIndex_p, uiSubIndex_p);
|
||||
|
||||
return Size;
|
||||
return Size;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -328,11 +325,11 @@ tEplObdSize Size;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT unsigned int PUBLIC EplObduGetNodeId()
|
||||
{
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiNodeId;
|
||||
|
||||
uiNodeId = EplObduCalGetNodeId();
|
||||
uiNodeId = EplObduCalGetNodeId();
|
||||
|
||||
return uiNodeId;
|
||||
return uiNodeId;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -351,13 +348,13 @@ unsigned int uiNodeId;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduSetNodeId(unsigned int uiNodeId_p,
|
||||
tEplObdNodeIdType NodeIdType_p)
|
||||
tEplObdNodeIdType NodeIdType_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalSetNodeId(uiNodeId_p, NodeIdType_p);
|
||||
Ret = EplObduCalSetNodeId(uiNodeId_p, NodeIdType_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -377,14 +374,16 @@ tEplKernel Ret;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduGetAccessType(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
tEplObdAccess* pAccessTyp_p)
|
||||
unsigned int uiSubIndex_p,
|
||||
tEplObdAccess *
|
||||
pAccessTyp_p)
|
||||
{
|
||||
tEplObdAccess AccessType;
|
||||
tEplObdAccess AccessType;
|
||||
|
||||
AccessType = EplObduCalGetAccessType(uiIndex_p, uiSubIndex_p, pAccessTyp_p);
|
||||
AccessType =
|
||||
EplObduCalGetAccessType(uiIndex_p, uiSubIndex_p, pAccessTyp_p);
|
||||
|
||||
return AccessType;
|
||||
return AccessType;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -411,16 +410,18 @@ tEplObdAccess AccessType;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduReadEntryToLe (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pDstData_p,
|
||||
tEplObdSize * pSize_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduReadEntryToLe(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void *pDstData_p,
|
||||
tEplObdSize * pSize_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalReadEntryToLe(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
Ret =
|
||||
EplObduCalReadEntryToLe(uiIndex_p, uiSubIndex_p, pDstData_p,
|
||||
pSize_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -444,16 +445,19 @@ return Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduWriteEntryFromLe (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduWriteEntryFromLe(unsigned int uiIndex_p,
|
||||
unsigned int
|
||||
uiSubIndex_p,
|
||||
void *pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalWriteEntryFromLe(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
|
||||
Ret =
|
||||
EplObduCalWriteEntryFromLe(uiIndex_p, uiSubIndex_p, pSrcData_p,
|
||||
Size_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -471,17 +475,19 @@ return Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduSearchVarEntry (EPL_MCO_DECL_INSTANCE_PTR_
|
||||
unsigned int uiIndex_p,
|
||||
unsigned int uiSubindex_p,
|
||||
tEplObdVarEntry MEM** ppVarEntry_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_
|
||||
unsigned int uiIndex_p,
|
||||
unsigned int uiSubindex_p,
|
||||
tEplObdVarEntry MEM **
|
||||
ppVarEntry_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplObduCalSearchVarEntry(uiIndex_p, uiSubindex_p, ppVarEntry_p);
|
||||
Ret = EplObduCalSearchVarEntry(uiIndex_p, uiSubindex_p, ppVarEntry_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -509,4 +515,3 @@ return Ret;
|
||||
#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) && (EPL_OBD_USE_KERNEL != FALSE)
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -99,8 +98,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -124,24 +121,22 @@
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalWriteEntry (
|
||||
unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalWriteEntry(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void *pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdWriteEntry(uiIndex_p,uiSubIndex_p,pSrcData_p,Size_p);
|
||||
Ret = EplObdWriteEntry(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplObduCalReadEntry()
|
||||
@@ -160,24 +155,22 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalReadEntry (
|
||||
unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pDstData_p,
|
||||
tEplObdSize *pSize_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalReadEntry(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void *pDstData_p,
|
||||
tEplObdSize * pSize_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdReadEntry(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
Ret = EplObdReadEntry(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplObduCalAccessOdPart()
|
||||
@@ -192,19 +185,18 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalAccessOdPart (
|
||||
tEplObdPart ObdPart_p,
|
||||
tEplObdDir Direction_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalAccessOdPart(tEplObdPart ObdPart_p,
|
||||
tEplObdDir Direction_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdAccessOdPart(ObdPart_p, Direction_p);
|
||||
Ret = EplObdAccessOdPart(ObdPart_p, Direction_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -220,17 +212,18 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalDefineVar (tEplVarParam MEM* pVarParam_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalDefineVar(tEplVarParam MEM *
|
||||
pVarParam_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdDefineVar(pVarParam_p);
|
||||
Ret = EplObdDefineVar(pVarParam_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -247,18 +240,18 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT void* PUBLIC EplObduCalGetObjectDataPtr ( unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p)
|
||||
EPLDLLEXPORT void *PUBLIC EplObduCalGetObjectDataPtr(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p)
|
||||
{
|
||||
void* pData;
|
||||
void *pData;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
pData = EplObdGetObjectDataPtr(uiIndex_p, uiSubIndex_p);
|
||||
pData = EplObdGetObjectDataPtr(uiIndex_p, uiSubIndex_p);
|
||||
#else
|
||||
pData = NULL;
|
||||
pData = NULL;
|
||||
#endif
|
||||
|
||||
return pData;
|
||||
return pData;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -275,17 +268,18 @@ void* pData;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
#if (defined (EPL_OBD_USER_OD) && (EPL_OBD_USER_OD != FALSE))
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalRegisterUserOd (tEplObdEntryPtr pUserOd_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalRegisterUserOd(tEplObdEntryPtr
|
||||
pUserOd_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdRegisterUserOd(pUserOd_p);
|
||||
Ret = EplObdRegisterUserOd(pUserOd_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
#endif
|
||||
@@ -304,15 +298,15 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT void PUBLIC EplObduCalInitVarEntry (tEplObdVarEntry MEM* pVarEntry_p,
|
||||
BYTE bType_p, tEplObdSize ObdSize_p)
|
||||
EPLDLLEXPORT void PUBLIC EplObduCalInitVarEntry(tEplObdVarEntry MEM *
|
||||
pVarEntry_p, BYTE bType_p,
|
||||
tEplObdSize ObdSize_p)
|
||||
{
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
EplObdInitVarEntry(pVarEntry_p, bType_p, ObdSize_p);
|
||||
EplObdInitVarEntry(pVarEntry_p, bType_p, ObdSize_p);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplObduCalGetDataSize()
|
||||
@@ -331,17 +325,17 @@ EPLDLLEXPORT void PUBLIC EplObduCalInitVarEntry (tEplObdVarEntry MEM* pVarEntry_
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplObdSize PUBLIC EplObduCalGetDataSize(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p)
|
||||
unsigned int uiSubIndex_p)
|
||||
{
|
||||
tEplObdSize Size;
|
||||
tEplObdSize Size;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Size = EplObdGetDataSize(uiIndex_p, uiSubIndex_p);
|
||||
Size = EplObdGetDataSize(uiIndex_p, uiSubIndex_p);
|
||||
#else
|
||||
Size = 0;
|
||||
Size = 0;
|
||||
#endif
|
||||
|
||||
return Size;
|
||||
return Size;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -360,15 +354,15 @@ tEplObdSize Size;
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT unsigned int PUBLIC EplObduCalGetNodeId()
|
||||
{
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiNodeId;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
uiNodeId = EplObdGetNodeId();
|
||||
uiNodeId = EplObdGetNodeId();
|
||||
#else
|
||||
uiNodeId = 0;
|
||||
uiNodeId = 0;
|
||||
#endif
|
||||
|
||||
return uiNodeId;
|
||||
return uiNodeId;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -387,17 +381,18 @@ unsigned int uiNodeId;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalSetNodeId(unsigned int uiNodeId_p,
|
||||
tEplObdNodeIdType NodeIdType_p)
|
||||
tEplObdNodeIdType
|
||||
NodeIdType_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdSetNodeId(uiNodeId_p, NodeIdType_p);
|
||||
Ret = EplObdSetNodeId(uiNodeId_p, NodeIdType_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -417,19 +412,20 @@ tEplKernel Ret;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalGetAccessType(unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
tEplObdAccess* pAccessTyp_p)
|
||||
|
||||
unsigned int
|
||||
uiSubIndex_p,
|
||||
tEplObdAccess *
|
||||
pAccessTyp_p)
|
||||
{
|
||||
tEplObdAccess AccesType;
|
||||
tEplObdAccess AccesType;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
AccesType = EplObdGetAccessType(uiIndex_p, uiSubIndex_p, pAccessTyp_p);
|
||||
AccesType = EplObdGetAccessType(uiIndex_p, uiSubIndex_p, pAccessTyp_p);
|
||||
#else
|
||||
AccesType = 0;
|
||||
AccesType = 0;
|
||||
#endif
|
||||
|
||||
return AccesType;
|
||||
return AccesType;
|
||||
|
||||
}
|
||||
|
||||
@@ -451,20 +447,21 @@ return AccesType;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalReadEntryToLe (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pDstData_p,
|
||||
tEplObdSize * pSize_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalReadEntryToLe(unsigned int uiIndex_p,
|
||||
unsigned int
|
||||
uiSubIndex_p,
|
||||
void *pDstData_p,
|
||||
tEplObdSize * pSize_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdReadEntryToLe(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
Ret = EplObdReadEntryToLe(uiIndex_p, uiSubIndex_p, pDstData_p, pSize_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -484,19 +481,22 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalWriteEntryFromLe (unsigned int uiIndex_p,
|
||||
unsigned int uiSubIndex_p,
|
||||
void * pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalWriteEntryFromLe(unsigned int
|
||||
uiIndex_p,
|
||||
unsigned int
|
||||
uiSubIndex_p,
|
||||
void *pSrcData_p,
|
||||
tEplObdSize Size_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdWriteEntryFromLe(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
|
||||
Ret =
|
||||
EplObdWriteEntryFromLe(uiIndex_p, uiSubIndex_p, pSrcData_p, Size_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -514,23 +514,21 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplObduCalSearchVarEntry (EPL_MCO_DECL_INSTANCE_PTR_
|
||||
unsigned int uiIndex_p,
|
||||
unsigned int uiSubindex_p,
|
||||
tEplObdVarEntry MEM** ppVarEntry_p)
|
||||
EPLDLLEXPORT tEplKernel PUBLIC
|
||||
EplObduCalSearchVarEntry(EPL_MCO_DECL_INSTANCE_PTR_ unsigned int uiIndex_p,
|
||||
unsigned int uiSubindex_p,
|
||||
tEplObdVarEntry MEM ** ppVarEntry_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) != 0)
|
||||
Ret = EplObdSearchVarEntry(uiIndex_p, uiSubindex_p, ppVarEntry_p);
|
||||
Ret = EplObdSearchVarEntry(uiIndex_p, uiSubindex_p, ppVarEntry_p);
|
||||
#else
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
#endif
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -557,6 +555,4 @@ tEplKernel Ret;
|
||||
|
||||
#endif //(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0)
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -82,13 +82,13 @@
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) == 0)
|
||||
|
||||
#error 'ERROR: Missing DLLk-Modul!'
|
||||
#error 'ERROR: Missing DLLk-Modul!'
|
||||
|
||||
#endif
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDK)) == 0)
|
||||
|
||||
#error 'ERROR: Missing OBDk-Modul!'
|
||||
#error 'ERROR: Missing OBDk-Modul!'
|
||||
|
||||
#endif
|
||||
/***************************************************************************/
|
||||
@@ -120,7 +120,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -134,7 +133,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -153,12 +151,10 @@
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -183,7 +179,7 @@
|
||||
tEplKernel EplPdokAddInstance(void)
|
||||
{
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -204,10 +200,9 @@ tEplKernel EplPdokAddInstance(void)
|
||||
tEplKernel EplPdokDelInstance(void)
|
||||
{
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplPdokCbPdoReceived
|
||||
@@ -228,27 +223,27 @@ tEplKernel EplPdokDelInstance(void)
|
||||
|
||||
tEplKernel EplPdokCbPdoReceived(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
|
||||
#if (DEV_SYSTEM == _DEV_GNU_CF548X_)
|
||||
// reset LED
|
||||
// reset LED
|
||||
// MCF_GPIO_PODR_PCIBG &= ~PDO_LED; // Level
|
||||
#endif
|
||||
|
||||
Event.m_EventSink = kEplEventSinkPdok;
|
||||
Event.m_EventType = kEplEventTypePdoRx;
|
||||
// limit copied data to size of PDO (because from some CNs the frame is larger than necessary)
|
||||
Event.m_uiSize = AmiGetWordFromLe(&pFrameInfo_p->m_pFrame->m_Data.m_Pres.m_le_wSize) + 24; // pFrameInfo_p->m_uiFrameSize;
|
||||
Event.m_pArg = pFrameInfo_p->m_pFrame;
|
||||
Ret = EplEventkPost(&Event);
|
||||
Event.m_EventSink = kEplEventSinkPdok;
|
||||
Event.m_EventType = kEplEventTypePdoRx;
|
||||
// limit copied data to size of PDO (because from some CNs the frame is larger than necessary)
|
||||
Event.m_uiSize = AmiGetWordFromLe(&pFrameInfo_p->m_pFrame->m_Data.m_Pres.m_le_wSize) + 24; // pFrameInfo_p->m_uiFrameSize;
|
||||
Event.m_pArg = pFrameInfo_p->m_pFrame;
|
||||
Ret = EplEventkPost(&Event);
|
||||
|
||||
#if (DEV_SYSTEM == _DEV_GNU_CF548X_)
|
||||
// set LED
|
||||
// set LED
|
||||
// MCF_GPIO_PODR_PCIBG |= PDO_LED; // Level
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -271,26 +266,26 @@ tEplEvent Event;
|
||||
|
||||
tEplKernel EplPdokCbPdoTransmitted(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
|
||||
#if (DEV_SYSTEM == _DEV_GNU_CF548X_)
|
||||
// reset LED
|
||||
MCF_GPIO_PODR_PCIBG &= ~PDO_LED; // Level
|
||||
// reset LED
|
||||
MCF_GPIO_PODR_PCIBG &= ~PDO_LED; // Level
|
||||
#endif
|
||||
|
||||
Event.m_EventSink = kEplEventSinkPdok;
|
||||
Event.m_EventType = kEplEventTypePdoTx;
|
||||
Event.m_uiSize = sizeof (tEplFrameInfo);
|
||||
Event.m_pArg = pFrameInfo_p;
|
||||
Ret = EplEventkPost(&Event);
|
||||
Event.m_EventSink = kEplEventSinkPdok;
|
||||
Event.m_EventType = kEplEventTypePdoTx;
|
||||
Event.m_uiSize = sizeof(tEplFrameInfo);
|
||||
Event.m_pArg = pFrameInfo_p;
|
||||
Ret = EplEventkPost(&Event);
|
||||
|
||||
#if (DEV_SYSTEM == _DEV_GNU_CF548X_)
|
||||
// set LED
|
||||
MCF_GPIO_PODR_PCIBG |= PDO_LED; // Level
|
||||
// set LED
|
||||
MCF_GPIO_PODR_PCIBG |= PDO_LED; // Level
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -311,16 +306,16 @@ tEplEvent Event;
|
||||
|
||||
tEplKernel EplPdokCbSoa(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplEvent Event;
|
||||
|
||||
Event.m_EventSink = kEplEventSinkPdok;
|
||||
Event.m_EventType = kEplEventTypePdoSoa;
|
||||
Event.m_uiSize = 0;
|
||||
Event.m_pArg = NULL;
|
||||
Ret = EplEventkPost(&Event);
|
||||
Event.m_EventSink = kEplEventSinkPdok;
|
||||
Event.m_EventType = kEplEventTypePdoSoa;
|
||||
Event.m_uiSize = 0;
|
||||
Event.m_pArg = NULL;
|
||||
Ret = EplEventkPost(&Event);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -343,323 +338,331 @@ tEplEvent Event;
|
||||
|
||||
tEplKernel EplPdokProcess(tEplEvent * pEvent_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
WORD wPdoSize;
|
||||
WORD wBitOffset;
|
||||
WORD wBitSize;
|
||||
WORD wVarSize;
|
||||
QWORD qwObjectMapping;
|
||||
BYTE bMappSubindex;
|
||||
BYTE bObdSubindex;
|
||||
WORD wObdMappIndex;
|
||||
WORD wObdCommIndex;
|
||||
WORD wPdoId;
|
||||
BYTE bObdData;
|
||||
BYTE bObjectCount;
|
||||
BYTE bFrameData;
|
||||
BOOL fValid;
|
||||
tEplObdSize ObdSize;
|
||||
tEplFrame *pFrame;
|
||||
tEplFrameInfo *pFrameInfo;
|
||||
unsigned int uiNodeId;
|
||||
tEplMsgType MsgType;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
WORD wPdoSize;
|
||||
WORD wBitOffset;
|
||||
WORD wBitSize;
|
||||
WORD wVarSize;
|
||||
QWORD qwObjectMapping;
|
||||
BYTE bMappSubindex;
|
||||
BYTE bObdSubindex;
|
||||
WORD wObdMappIndex;
|
||||
WORD wObdCommIndex;
|
||||
WORD wPdoId;
|
||||
BYTE bObdData;
|
||||
BYTE bObjectCount;
|
||||
BYTE bFrameData;
|
||||
BOOL fValid;
|
||||
tEplObdSize ObdSize;
|
||||
tEplFrame *pFrame;
|
||||
tEplFrameInfo *pFrameInfo;
|
||||
unsigned int uiNodeId;
|
||||
tEplMsgType MsgType;
|
||||
|
||||
// 0xFF=invalid, RPDO: 0x00=PReq, localNodeId=PRes, remoteNodeId=PRes
|
||||
// TPDO: 0x00=PRes, MN: CnNodeId=PReq
|
||||
// 0xFF=invalid, RPDO: 0x00=PReq, localNodeId=PRes, remoteNodeId=PRes
|
||||
// TPDO: 0x00=PRes, MN: CnNodeId=PReq
|
||||
|
||||
switch (pEvent_p->m_EventType)
|
||||
{
|
||||
case kEplEventTypePdoRx: // RPDO received
|
||||
pFrame = (tEplFrame *) pEvent_p->m_pArg;
|
||||
switch (pEvent_p->m_EventType) {
|
||||
case kEplEventTypePdoRx: // RPDO received
|
||||
pFrame = (tEplFrame *) pEvent_p->m_pArg;
|
||||
|
||||
// check if received RPDO is valid
|
||||
bFrameData = AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
|
||||
if ((bFrameData & EPL_FRAME_FLAG1_RD) == 0)
|
||||
{ // RPDO invalid
|
||||
goto Exit;
|
||||
}
|
||||
// check if received RPDO is valid
|
||||
bFrameData =
|
||||
AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
|
||||
if ((bFrameData & EPL_FRAME_FLAG1_RD) == 0) { // RPDO invalid
|
||||
goto Exit;
|
||||
}
|
||||
// retrieve EPL message type
|
||||
MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
|
||||
if (MsgType == kEplMsgTypePreq) { // RPDO is PReq frame
|
||||
uiNodeId = EPL_PDO_PREQ_NODE_ID; // 0x00
|
||||
} else { // RPDO is PRes frame
|
||||
// retrieve node ID
|
||||
uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
|
||||
}
|
||||
|
||||
// retrieve EPL message type
|
||||
MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
|
||||
if (MsgType == kEplMsgTypePreq)
|
||||
{ // RPDO is PReq frame
|
||||
uiNodeId = EPL_PDO_PREQ_NODE_ID; // 0x00
|
||||
}
|
||||
else
|
||||
{ // RPDO is PRes frame
|
||||
// retrieve node ID
|
||||
uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
|
||||
}
|
||||
// search for appropriate valid RPDO in OD
|
||||
wObdMappIndex = EPL_PDOK_OBD_IDX_RX_MAPP_PARAM;
|
||||
for (wObdCommIndex = EPL_PDOK_OBD_IDX_RX_COMM_PARAM;
|
||||
wObdCommIndex < (EPL_PDOK_OBD_IDX_RX_COMM_PARAM + 0x00FF);
|
||||
wObdCommIndex++, wObdMappIndex++) {
|
||||
ObdSize = 1;
|
||||
// read node ID from OD
|
||||
Ret =
|
||||
EplObdReadEntry(wObdCommIndex, 0x01, &bObdData,
|
||||
&ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
} else if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObdData != uiNodeId) { // node ID does not equal - wrong PDO, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
ObdSize = 1;
|
||||
// read number of mapped objects from OD; this indicates if the PDO is valid
|
||||
Ret =
|
||||
EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount,
|
||||
&ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
} else if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObjectCount == 0) { // PDO in OD not valid, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
|
||||
// search for appropriate valid RPDO in OD
|
||||
wObdMappIndex = EPL_PDOK_OBD_IDX_RX_MAPP_PARAM;
|
||||
for (wObdCommIndex = EPL_PDOK_OBD_IDX_RX_COMM_PARAM;
|
||||
wObdCommIndex < (EPL_PDOK_OBD_IDX_RX_COMM_PARAM + 0x00FF);
|
||||
wObdCommIndex++, wObdMappIndex++)
|
||||
{
|
||||
ObdSize = 1;
|
||||
// read node ID from OD
|
||||
Ret = EplObdReadEntry(wObdCommIndex, 0x01, &bObdData, &ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart))
|
||||
{ // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
else if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObdData != uiNodeId)
|
||||
{ // node ID does not equal - wrong PDO, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
ObdSize = 1;
|
||||
// read number of mapped objects from OD; this indicates if the PDO is valid
|
||||
Ret = EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount, &ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart))
|
||||
{ // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
else if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObjectCount == 0)
|
||||
{ // PDO in OD not valid, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
ObdSize = 1;
|
||||
// check PDO mapping version
|
||||
Ret =
|
||||
EplObdReadEntry(wObdCommIndex, 0x02, &bObdData,
|
||||
&ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
// retrieve PDO version from frame
|
||||
bFrameData =
|
||||
AmiGetByteFromLe(&pFrame->m_Data.m_Pres.
|
||||
m_le_bPdoVersion);
|
||||
if ((bObdData & EPL_VERSION_MAIN) != (bFrameData & EPL_VERSION_MAIN)) { // PDO versions do not match
|
||||
// $$$ raise PDO error
|
||||
// termiate processing of this RPDO
|
||||
goto Exit;
|
||||
}
|
||||
// valid RPDO found
|
||||
|
||||
ObdSize = 1;
|
||||
// check PDO mapping version
|
||||
Ret = EplObdReadEntry(wObdCommIndex, 0x02, &bObdData, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
// retrieve PDO version from frame
|
||||
bFrameData = AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bPdoVersion);
|
||||
if ((bObdData & EPL_VERSION_MAIN) != (bFrameData & EPL_VERSION_MAIN))
|
||||
{ // PDO versions do not match
|
||||
// $$$ raise PDO error
|
||||
// termiate processing of this RPDO
|
||||
goto Exit;
|
||||
}
|
||||
// retrieve PDO size
|
||||
wPdoSize =
|
||||
AmiGetWordFromLe(&pFrame->m_Data.m_Pres.m_le_wSize);
|
||||
|
||||
// valid RPDO found
|
||||
// process mapping
|
||||
for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
|
||||
bMappSubindex++) {
|
||||
ObdSize = 8; // QWORD
|
||||
// read object mapping from OD
|
||||
Ret =
|
||||
EplObdReadEntry(wObdMappIndex,
|
||||
bMappSubindex,
|
||||
&qwObjectMapping, &ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
|
||||
if (qwObjectMapping == 0) { // invalid entry, continue with next entry
|
||||
continue;
|
||||
}
|
||||
// decode object mapping
|
||||
wObdCommIndex =
|
||||
(WORD) (qwObjectMapping &
|
||||
0x000000000000FFFFLL);
|
||||
bObdSubindex =
|
||||
(BYTE) ((qwObjectMapping &
|
||||
0x0000000000FF0000LL) >> 16);
|
||||
wBitOffset =
|
||||
(WORD) ((qwObjectMapping &
|
||||
0x0000FFFF00000000LL) >> 32);
|
||||
wBitSize =
|
||||
(WORD) ((qwObjectMapping &
|
||||
0xFFFF000000000000LL) >> 48);
|
||||
|
||||
// retrieve PDO size
|
||||
wPdoSize = AmiGetWordFromLe(&pFrame->m_Data.m_Pres.m_le_wSize);
|
||||
// check if object exceeds PDO size
|
||||
if (((wBitOffset + wBitSize) >> 3) > wPdoSize) { // wrong object mapping; PDO size is too low
|
||||
// $$$ raise PDO error
|
||||
// terminate processing of this RPDO
|
||||
goto Exit;
|
||||
}
|
||||
// copy object from RPDO to process/OD variable
|
||||
ObdSize = wBitSize >> 3;
|
||||
Ret =
|
||||
EplObdWriteEntryFromLe(wObdCommIndex,
|
||||
bObdSubindex,
|
||||
&pFrame->m_Data.
|
||||
m_Pres.
|
||||
m_le_abPayload[(wBitOffset >> 3)], ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// process mapping
|
||||
for (bMappSubindex = 1; bMappSubindex <= bObjectCount; bMappSubindex++)
|
||||
{
|
||||
ObdSize = 8; // QWORD
|
||||
// read object mapping from OD
|
||||
Ret = EplObdReadEntry(wObdMappIndex, bMappSubindex, &qwObjectMapping, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
// check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
|
||||
if (qwObjectMapping == 0)
|
||||
{ // invalid entry, continue with next entry
|
||||
continue;
|
||||
}
|
||||
// processing finished successfully
|
||||
goto Exit;
|
||||
}
|
||||
break;
|
||||
|
||||
// decode object mapping
|
||||
wObdCommIndex = (WORD) (qwObjectMapping & 0x000000000000FFFFLL);
|
||||
bObdSubindex = (BYTE) ((qwObjectMapping & 0x0000000000FF0000LL) >> 16);
|
||||
wBitOffset = (WORD) ((qwObjectMapping & 0x0000FFFF00000000LL) >> 32);
|
||||
wBitSize = (WORD) ((qwObjectMapping & 0xFFFF000000000000LL) >> 48);
|
||||
case kEplEventTypePdoTx: // TPDO transmitted
|
||||
pFrameInfo = (tEplFrameInfo *) pEvent_p->m_pArg;
|
||||
pFrame = pFrameInfo->m_pFrame;
|
||||
|
||||
// check if object exceeds PDO size
|
||||
if (((wBitOffset + wBitSize) >> 3) > wPdoSize)
|
||||
{ // wrong object mapping; PDO size is too low
|
||||
// $$$ raise PDO error
|
||||
// terminate processing of this RPDO
|
||||
goto Exit;
|
||||
}
|
||||
// set TPDO invalid, so that only fully processed TPDOs are sent as valid
|
||||
bFrameData =
|
||||
AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
|
||||
AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bFlag1,
|
||||
(bFrameData & ~EPL_FRAME_FLAG1_RD));
|
||||
|
||||
// copy object from RPDO to process/OD variable
|
||||
ObdSize = wBitSize >> 3;
|
||||
Ret = EplObdWriteEntryFromLe(wObdCommIndex, bObdSubindex, &pFrame->m_Data.m_Pres.m_le_abPayload[(wBitOffset >> 3)], ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// retrieve EPL message type
|
||||
MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
|
||||
if (MsgType == kEplMsgTypePres) { // TPDO is PRes frame
|
||||
uiNodeId = EPL_PDO_PRES_NODE_ID; // 0x00
|
||||
} else { // TPDO is PReq frame
|
||||
// retrieve node ID
|
||||
uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bDstNodeId);
|
||||
}
|
||||
|
||||
}
|
||||
// search for appropriate valid TPDO in OD
|
||||
wObdMappIndex = EPL_PDOK_OBD_IDX_TX_MAPP_PARAM;
|
||||
wObdCommIndex = EPL_PDOK_OBD_IDX_TX_COMM_PARAM;
|
||||
for (wPdoId = 0;; wPdoId++, wObdCommIndex++, wObdMappIndex++) {
|
||||
ObdSize = 1;
|
||||
// read node ID from OD
|
||||
Ret =
|
||||
EplObdReadEntry(wObdCommIndex, 0x01, &bObdData,
|
||||
&ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
} else if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObdData != uiNodeId) { // node ID does not equal - wrong PDO, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
ObdSize = 1;
|
||||
// read number of mapped objects from OD; this indicates if the PDO is valid
|
||||
Ret =
|
||||
EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount,
|
||||
&ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart)) { // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
} else if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObjectCount == 0) { // PDO in OD not valid, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
// valid TPDO found
|
||||
|
||||
// processing finished successfully
|
||||
goto Exit;
|
||||
}
|
||||
break;
|
||||
ObdSize = 1;
|
||||
// get PDO mapping version from OD
|
||||
Ret =
|
||||
EplObdReadEntry(wObdCommIndex, 0x02, &bObdData,
|
||||
&ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
// set PDO version in frame
|
||||
AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bPdoVersion,
|
||||
bObdData);
|
||||
|
||||
case kEplEventTypePdoTx: // TPDO transmitted
|
||||
pFrameInfo = (tEplFrameInfo *) pEvent_p->m_pArg;
|
||||
pFrame = pFrameInfo->m_pFrame;
|
||||
// calculate PDO size
|
||||
wPdoSize = 0;
|
||||
|
||||
// set TPDO invalid, so that only fully processed TPDOs are sent as valid
|
||||
bFrameData = AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
|
||||
AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bFlag1, (bFrameData & ~EPL_FRAME_FLAG1_RD));
|
||||
// process mapping
|
||||
for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
|
||||
bMappSubindex++) {
|
||||
ObdSize = 8; // QWORD
|
||||
// read object mapping from OD
|
||||
Ret =
|
||||
EplObdReadEntry(wObdMappIndex,
|
||||
bMappSubindex,
|
||||
&qwObjectMapping, &ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
|
||||
if (qwObjectMapping == 0) { // invalid entry, continue with next entry
|
||||
continue;
|
||||
}
|
||||
// decode object mapping
|
||||
wObdCommIndex =
|
||||
(WORD) (qwObjectMapping &
|
||||
0x000000000000FFFFLL);
|
||||
bObdSubindex =
|
||||
(BYTE) ((qwObjectMapping &
|
||||
0x0000000000FF0000LL) >> 16);
|
||||
wBitOffset =
|
||||
(WORD) ((qwObjectMapping &
|
||||
0x0000FFFF00000000LL) >> 32);
|
||||
wBitSize =
|
||||
(WORD) ((qwObjectMapping &
|
||||
0xFFFF000000000000LL) >> 48);
|
||||
|
||||
// retrieve EPL message type
|
||||
MsgType = AmiGetByteFromLe(&pFrame->m_le_bMessageType);
|
||||
if (MsgType == kEplMsgTypePres)
|
||||
{ // TPDO is PRes frame
|
||||
uiNodeId = EPL_PDO_PRES_NODE_ID; // 0x00
|
||||
}
|
||||
else
|
||||
{ // TPDO is PReq frame
|
||||
// retrieve node ID
|
||||
uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bDstNodeId);
|
||||
}
|
||||
// calculate max PDO size
|
||||
ObdSize = wBitSize >> 3;
|
||||
wVarSize = (wBitOffset >> 3) + (WORD) ObdSize;
|
||||
if ((unsigned int)(wVarSize + 24) > pFrameInfo->m_uiFrameSize) { // TPDO is too short
|
||||
// $$$ raise PDO error, set Ret
|
||||
goto Exit;
|
||||
}
|
||||
if (wVarSize > wPdoSize) { // memorize new PDO size
|
||||
wPdoSize = wVarSize;
|
||||
}
|
||||
// copy object from process/OD variable to TPDO
|
||||
Ret =
|
||||
EplObdReadEntryToLe(wObdCommIndex,
|
||||
bObdSubindex,
|
||||
&pFrame->m_Data.m_Pres.
|
||||
m_le_abPayload[(wBitOffset >> 3)], &ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// search for appropriate valid TPDO in OD
|
||||
wObdMappIndex = EPL_PDOK_OBD_IDX_TX_MAPP_PARAM;
|
||||
wObdCommIndex = EPL_PDOK_OBD_IDX_TX_COMM_PARAM;
|
||||
for (wPdoId = 0; ; wPdoId++, wObdCommIndex++, wObdMappIndex++)
|
||||
{
|
||||
ObdSize = 1;
|
||||
// read node ID from OD
|
||||
Ret = EplObdReadEntry(wObdCommIndex, 0x01, &bObdData, &ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart))
|
||||
{ // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
else if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObdData != uiNodeId)
|
||||
{ // node ID does not equal - wrong PDO, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
ObdSize = 1;
|
||||
// read number of mapped objects from OD; this indicates if the PDO is valid
|
||||
Ret = EplObdReadEntry(wObdMappIndex, 0x00, &bObjectCount, &ObdSize);
|
||||
if ((Ret == kEplObdIndexNotExist)
|
||||
|| (Ret == kEplObdSubindexNotExist)
|
||||
|| (Ret == kEplObdIllegalPart))
|
||||
{ // PDO does not exist; last PDO reached
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
else if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObjectCount == 0)
|
||||
{ // PDO in OD not valid, try next PDO in OD
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// valid TPDO found
|
||||
// set PDO size in frame
|
||||
AmiSetWordToLe(&pFrame->m_Data.m_Pres.m_le_wSize,
|
||||
wPdoSize);
|
||||
|
||||
ObdSize = 1;
|
||||
// get PDO mapping version from OD
|
||||
Ret = EplObdReadEntry(wObdCommIndex, 0x02, &bObdData, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
// set PDO version in frame
|
||||
AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bPdoVersion, bObdData);
|
||||
Ret = EplPdokCalAreTpdosValid(&fValid);
|
||||
if (fValid != FALSE) {
|
||||
// set TPDO valid
|
||||
bFrameData =
|
||||
AmiGetByteFromLe(&pFrame->m_Data.m_Pres.
|
||||
m_le_bFlag1);
|
||||
AmiSetByteToLe(&pFrame->m_Data.m_Pres.
|
||||
m_le_bFlag1,
|
||||
(bFrameData |
|
||||
EPL_FRAME_FLAG1_RD));
|
||||
}
|
||||
// processing finished successfully
|
||||
|
||||
// calculate PDO size
|
||||
wPdoSize = 0;
|
||||
goto Exit;
|
||||
}
|
||||
break;
|
||||
|
||||
// process mapping
|
||||
for (bMappSubindex = 1; bMappSubindex <= bObjectCount; bMappSubindex++)
|
||||
{
|
||||
ObdSize = 8; // QWORD
|
||||
// read object mapping from OD
|
||||
Ret = EplObdReadEntry(wObdMappIndex, bMappSubindex, &qwObjectMapping, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
case kEplEventTypePdoSoa: // SoA received
|
||||
|
||||
// check if object mapping entry is valid, i.e. unequal zero, because "empty" entries are allowed
|
||||
if (qwObjectMapping == 0)
|
||||
{ // invalid entry, continue with next entry
|
||||
continue;
|
||||
}
|
||||
// invalidate TPDOs
|
||||
Ret = EplPdokCalSetTpdosValid(FALSE);
|
||||
break;
|
||||
|
||||
// decode object mapping
|
||||
wObdCommIndex = (WORD) (qwObjectMapping & 0x000000000000FFFFLL);
|
||||
bObdSubindex = (BYTE) ((qwObjectMapping & 0x0000000000FF0000LL) >> 16);
|
||||
wBitOffset = (WORD) ((qwObjectMapping & 0x0000FFFF00000000LL) >> 32);
|
||||
wBitSize = (WORD) ((qwObjectMapping & 0xFFFF000000000000LL) >> 48);
|
||||
default:
|
||||
{
|
||||
ASSERTMSG(FALSE,
|
||||
"EplPdokProcess(): unhandled event type!\n");
|
||||
}
|
||||
}
|
||||
|
||||
// calculate max PDO size
|
||||
ObdSize = wBitSize >> 3;
|
||||
wVarSize = (wBitOffset >> 3) + (WORD) ObdSize;
|
||||
if ((unsigned int)(wVarSize + 24) > pFrameInfo->m_uiFrameSize)
|
||||
{ // TPDO is too short
|
||||
// $$$ raise PDO error, set Ret
|
||||
goto Exit;
|
||||
}
|
||||
if (wVarSize > wPdoSize)
|
||||
{ // memorize new PDO size
|
||||
wPdoSize = wVarSize;
|
||||
}
|
||||
|
||||
// copy object from process/OD variable to TPDO
|
||||
Ret = EplObdReadEntryToLe(wObdCommIndex, bObdSubindex, &pFrame->m_Data.m_Pres.m_le_abPayload[(wBitOffset >> 3)], &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// set PDO size in frame
|
||||
AmiSetWordToLe(&pFrame->m_Data.m_Pres.m_le_wSize, wPdoSize);
|
||||
|
||||
Ret = EplPdokCalAreTpdosValid(&fValid);
|
||||
if (fValid != FALSE)
|
||||
{
|
||||
// set TPDO valid
|
||||
bFrameData = AmiGetByteFromLe(&pFrame->m_Data.m_Pres.m_le_bFlag1);
|
||||
AmiSetByteToLe(&pFrame->m_Data.m_Pres.m_le_bFlag1, (bFrameData | EPL_FRAME_FLAG1_RD));
|
||||
}
|
||||
|
||||
// processing finished successfully
|
||||
|
||||
goto Exit;
|
||||
}
|
||||
break;
|
||||
|
||||
case kEplEventTypePdoSoa: // SoA received
|
||||
|
||||
// invalidate TPDOs
|
||||
Ret = EplPdokCalSetTpdosValid(FALSE);
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
ASSERTMSG(FALSE, "EplPdokProcess(): unhandled event type!\n");
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//=========================================================================//
|
||||
@@ -689,4 +692,3 @@ tEplMsgType MsgType;
|
||||
#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -72,7 +72,6 @@
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -97,7 +96,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -111,7 +109,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -126,9 +123,8 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
BOOL m_fTpdosValid;
|
||||
typedef struct {
|
||||
BOOL m_fTpdosValid;
|
||||
|
||||
} tEplPdokCalInstance;
|
||||
|
||||
@@ -136,13 +132,12 @@ typedef struct
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplPdokCalInstance EplPdokCalInstance_g;
|
||||
static tEplPdokCalInstance EplPdokCalInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -167,9 +162,9 @@ static tEplPdokCalInstance EplPdokCalInstance_g;
|
||||
tEplKernel EplPdokCalAddInstance(void)
|
||||
{
|
||||
|
||||
EPL_MEMSET(&EplPdokCalInstance_g, 0, sizeof(EplPdokCalInstance_g));
|
||||
EPL_MEMSET(&EplPdokCalInstance_g, 0, sizeof(EplPdokCalInstance_g));
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -190,10 +185,9 @@ tEplKernel EplPdokCalAddInstance(void)
|
||||
tEplKernel EplPdokCalDelInstance(void)
|
||||
{
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplPdokCalSetTpdosValid()
|
||||
@@ -212,11 +206,11 @@ tEplKernel EplPdokCalDelInstance(void)
|
||||
|
||||
tEplKernel EplPdokCalSetTpdosValid(BOOL fValid_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
EplPdokCalInstance_g.m_fTpdosValid = fValid_p;
|
||||
EplPdokCalInstance_g.m_fTpdosValid = fValid_p;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -236,14 +230,13 @@ tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
tEplKernel EplPdokCalAreTpdosValid(BOOL * pfValid_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
*pfValid_p = EplPdokCalInstance_g.m_fTpdosValid;
|
||||
*pfValid_p = EplPdokCalInstance_g.m_fTpdosValid;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -271,4 +264,3 @@ tEplKernel Ret = kEplSuccessful;
|
||||
#endif
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -82,7 +82,6 @@
|
||||
#error "EPL PDOu module needs EPL module OBDU or OBDK!"
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -103,7 +102,6 @@
|
||||
#define EPL_PDOU_OBD_IDX_MASK 0xFF00
|
||||
#define EPL_PDOU_PDO_ID_MASK 0x00FF
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -116,7 +114,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -130,7 +127,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -149,25 +145,23 @@
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam MEM* pParam_p, unsigned int uiIndex_p);
|
||||
static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam MEM * pParam_p,
|
||||
unsigned int uiIndex_p);
|
||||
|
||||
static void EplPdouDecodeObjectMapping(QWORD qwObjectMapping_p,
|
||||
unsigned int* puiIndex_p,
|
||||
unsigned int* puiSubIndex_p,
|
||||
unsigned int* puiBitOffset_p,
|
||||
unsigned int* puiBitSize_p);
|
||||
unsigned int *puiIndex_p,
|
||||
unsigned int *puiSubIndex_p,
|
||||
unsigned int *puiBitOffset_p,
|
||||
unsigned int *puiBitSize_p);
|
||||
|
||||
static tEplKernel EplPdouCheckObjectMapping(QWORD qwObjectMapping_p,
|
||||
tEplObdAccess AccessType_p,
|
||||
DWORD* pdwAbortCode_p,
|
||||
unsigned int* puiPdoSize_p);
|
||||
|
||||
|
||||
tEplObdAccess AccessType_p,
|
||||
DWORD * pdwAbortCode_p,
|
||||
unsigned int *puiPdoSize_p);
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
@@ -193,10 +187,9 @@ static tEplKernel EplPdouCheckObjectMapping(QWORD qwObjectMapping_p,
|
||||
tEplKernel EplPdouAddInstance(void)
|
||||
{
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplPdouDelInstance()
|
||||
@@ -215,10 +208,9 @@ tEplKernel EplPdouAddInstance(void)
|
||||
tEplKernel EplPdouDelInstance(void)
|
||||
{
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplPdouCbObdAccess
|
||||
@@ -234,170 +226,153 @@ tEplKernel EplPdouDelInstance(void)
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplPdouCbObdAccess(tEplObdCbParam MEM* pParam_p)
|
||||
tEplKernel PUBLIC EplPdouCbObdAccess(tEplObdCbParam MEM * pParam_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiPdoId;
|
||||
unsigned int uiIndexType;
|
||||
tEplObdSize ObdSize;
|
||||
BYTE bObjectCount;
|
||||
QWORD qwObjectMapping;
|
||||
tEplObdAccess AccessType;
|
||||
BYTE bMappSubindex;
|
||||
unsigned int uiCurPdoSize;
|
||||
WORD wMaxPdoSize;
|
||||
unsigned int uiSubIndex;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiPdoId;
|
||||
unsigned int uiIndexType;
|
||||
tEplObdSize ObdSize;
|
||||
BYTE bObjectCount;
|
||||
QWORD qwObjectMapping;
|
||||
tEplObdAccess AccessType;
|
||||
BYTE bMappSubindex;
|
||||
unsigned int uiCurPdoSize;
|
||||
WORD wMaxPdoSize;
|
||||
unsigned int uiSubIndex;
|
||||
|
||||
// fetch PDO ID
|
||||
uiPdoId = pParam_p->m_uiIndex & EPL_PDOU_PDO_ID_MASK;
|
||||
// fetch PDO ID
|
||||
uiPdoId = pParam_p->m_uiIndex & EPL_PDOU_PDO_ID_MASK;
|
||||
|
||||
// fetch object index type
|
||||
uiIndexType = pParam_p->m_uiIndex & EPL_PDOU_OBD_IDX_MASK;
|
||||
// fetch object index type
|
||||
uiIndexType = pParam_p->m_uiIndex & EPL_PDOU_OBD_IDX_MASK;
|
||||
|
||||
if (pParam_p->m_ObdEvent != kEplObdEvPreWrite)
|
||||
{ // read accesses, post write events etc. are OK
|
||||
pParam_p->m_dwAbortCode = 0;
|
||||
goto Exit;
|
||||
}
|
||||
if (pParam_p->m_ObdEvent != kEplObdEvPreWrite) { // read accesses, post write events etc. are OK
|
||||
pParam_p->m_dwAbortCode = 0;
|
||||
goto Exit;
|
||||
}
|
||||
// check index type
|
||||
switch (uiIndexType) {
|
||||
case EPL_PDOU_OBD_IDX_RX_COMM_PARAM:
|
||||
// RPDO communication parameter accessed
|
||||
case EPL_PDOU_OBD_IDX_TX_COMM_PARAM:
|
||||
{ // TPDO communication parameter accessed
|
||||
Ret = EplPdouCheckPdoValidity(pParam_p,
|
||||
(EPL_PDOU_OBD_IDX_MAPP_PARAM
|
||||
| pParam_p->m_uiIndex));
|
||||
if (Ret != kEplSuccessful) { // PDO is valid or does not exist
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check index type
|
||||
switch (uiIndexType)
|
||||
{
|
||||
case EPL_PDOU_OBD_IDX_RX_COMM_PARAM:
|
||||
// RPDO communication parameter accessed
|
||||
case EPL_PDOU_OBD_IDX_TX_COMM_PARAM:
|
||||
{ // TPDO communication parameter accessed
|
||||
Ret = EplPdouCheckPdoValidity(pParam_p,
|
||||
(EPL_PDOU_OBD_IDX_MAPP_PARAM | pParam_p->m_uiIndex));
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // PDO is valid or does not exist
|
||||
goto Exit;
|
||||
}
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
goto Exit;
|
||||
}
|
||||
case EPL_PDOU_OBD_IDX_RX_MAPP_PARAM:
|
||||
{ // RPDO mapping parameter accessed
|
||||
|
||||
case EPL_PDOU_OBD_IDX_RX_MAPP_PARAM:
|
||||
{ // RPDO mapping parameter accessed
|
||||
AccessType = kEplObdAccWrite;
|
||||
break;
|
||||
}
|
||||
|
||||
AccessType = kEplObdAccWrite;
|
||||
break;
|
||||
}
|
||||
case EPL_PDOU_OBD_IDX_TX_MAPP_PARAM:
|
||||
{ // TPDO mapping parameter accessed
|
||||
|
||||
case EPL_PDOU_OBD_IDX_TX_MAPP_PARAM:
|
||||
{ // TPDO mapping parameter accessed
|
||||
AccessType = kEplObdAccRead;
|
||||
break;
|
||||
}
|
||||
|
||||
AccessType = kEplObdAccRead;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{ // this callback function is only for
|
||||
// PDO mapping and communication parameters
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
{ // this callback function is only for
|
||||
// PDO mapping and communication parameters
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
// RPDO and TPDO mapping parameter accessed
|
||||
|
||||
// RPDO and TPDO mapping parameter accessed
|
||||
if (pParam_p->m_uiSubIndex == 0) { // object mapping count accessed
|
||||
|
||||
if (pParam_p->m_uiSubIndex == 0)
|
||||
{ // object mapping count accessed
|
||||
// PDO is enabled or disabled
|
||||
bObjectCount = *((BYTE *) pParam_p->m_pArg);
|
||||
|
||||
// PDO is enabled or disabled
|
||||
bObjectCount = *((BYTE*) pParam_p->m_pArg);
|
||||
if (bObjectCount == 0) { // PDO shall be disabled
|
||||
|
||||
if (bObjectCount == 0)
|
||||
{ // PDO shall be disabled
|
||||
// that is always possible
|
||||
goto Exit;
|
||||
}
|
||||
// PDO shall be enabled
|
||||
// it should have been disabled for this operation
|
||||
Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex);
|
||||
if (Ret != kEplSuccessful) { // PDO is valid or does not exist
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// that is always possible
|
||||
goto Exit;
|
||||
}
|
||||
if (AccessType == kEplObdAccWrite) {
|
||||
uiSubIndex = 0x04; // PReqActPayloadLimit_U16
|
||||
} else {
|
||||
uiSubIndex = 0x05; // PResActPayloadLimit_U16
|
||||
}
|
||||
|
||||
// PDO shall be enabled
|
||||
// it should have been disabled for this operation
|
||||
Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // PDO is valid or does not exist
|
||||
goto Exit;
|
||||
}
|
||||
// fetch maximum PDO size from Object 1F98h: NMT_CycleTiming_REC
|
||||
ObdSize = sizeof(wMaxPdoSize);
|
||||
Ret =
|
||||
EplObduReadEntry(0x1F98, uiSubIndex, &wMaxPdoSize,
|
||||
&ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
|
||||
goto Exit;
|
||||
}
|
||||
// check all objectmappings
|
||||
for (bMappSubindex = 1; bMappSubindex <= bObjectCount;
|
||||
bMappSubindex++) {
|
||||
// read object mapping from OD
|
||||
ObdSize = sizeof(qwObjectMapping); // QWORD
|
||||
Ret = EplObduReadEntry(pParam_p->m_uiIndex,
|
||||
bMappSubindex, &qwObjectMapping,
|
||||
&ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
pParam_p->m_dwAbortCode =
|
||||
EPL_SDOAC_GENERAL_ERROR;
|
||||
goto Exit;
|
||||
}
|
||||
// check object mapping
|
||||
Ret = EplPdouCheckObjectMapping(qwObjectMapping,
|
||||
AccessType,
|
||||
&pParam_p->
|
||||
m_dwAbortCode,
|
||||
&uiCurPdoSize);
|
||||
if (Ret != kEplSuccessful) { // illegal object mapping
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (AccessType == kEplObdAccWrite)
|
||||
{
|
||||
uiSubIndex = 0x04; // PReqActPayloadLimit_U16
|
||||
}
|
||||
else
|
||||
{
|
||||
uiSubIndex = 0x05; // PResActPayloadLimit_U16
|
||||
}
|
||||
if (uiCurPdoSize > wMaxPdoSize) { // mapping exceeds object size
|
||||
pParam_p->m_dwAbortCode =
|
||||
EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
}
|
||||
|
||||
// fetch maximum PDO size from Object 1F98h: NMT_CycleTiming_REC
|
||||
ObdSize = sizeof (wMaxPdoSize);
|
||||
Ret = EplObduReadEntry(0x1F98, uiSubIndex, &wMaxPdoSize, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
// check all objectmappings
|
||||
for (bMappSubindex = 1; bMappSubindex <= bObjectCount; bMappSubindex++)
|
||||
{
|
||||
// read object mapping from OD
|
||||
ObdSize = sizeof (qwObjectMapping); // QWORD
|
||||
Ret = EplObduReadEntry(pParam_p->m_uiIndex,
|
||||
bMappSubindex, &qwObjectMapping, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
|
||||
goto Exit;
|
||||
}
|
||||
} else { // ObjectMapping
|
||||
Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex);
|
||||
if (Ret != kEplSuccessful) { // PDO is valid or does not exist
|
||||
goto Exit;
|
||||
}
|
||||
// check existence of object and validity of object length
|
||||
|
||||
// check object mapping
|
||||
Ret = EplPdouCheckObjectMapping(qwObjectMapping,
|
||||
AccessType,
|
||||
&pParam_p->m_dwAbortCode,
|
||||
&uiCurPdoSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // illegal object mapping
|
||||
goto Exit;
|
||||
}
|
||||
qwObjectMapping = *((QWORD *) pParam_p->m_pArg);
|
||||
|
||||
if (uiCurPdoSize > wMaxPdoSize)
|
||||
{ // mapping exceeds object size
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
}
|
||||
Ret = EplPdouCheckObjectMapping(qwObjectMapping,
|
||||
AccessType,
|
||||
&pParam_p->m_dwAbortCode,
|
||||
&uiCurPdoSize);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{ // ObjectMapping
|
||||
Ret = EplPdouCheckPdoValidity(pParam_p, pParam_p->m_uiIndex);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // PDO is valid or does not exist
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check existence of object and validity of object length
|
||||
|
||||
qwObjectMapping = *((QWORD*) pParam_p->m_pArg);
|
||||
|
||||
Ret = EplPdouCheckObjectMapping(qwObjectMapping,
|
||||
AccessType,
|
||||
&pParam_p->m_dwAbortCode,
|
||||
&uiCurPdoSize);
|
||||
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -419,33 +394,32 @@ unsigned int uiSubIndex;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam MEM* pParam_p, unsigned int uiIndex_p)
|
||||
static tEplKernel EplPdouCheckPdoValidity(tEplObdCbParam MEM * pParam_p,
|
||||
unsigned int uiIndex_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplObdSize ObdSize;
|
||||
BYTE bObjectCount;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplObdSize ObdSize;
|
||||
BYTE bObjectCount;
|
||||
|
||||
ObdSize = 1;
|
||||
// read number of mapped objects from OD; this indicates if the PDO is valid
|
||||
Ret = EplObduReadEntry(uiIndex_p, 0x00, &bObjectCount, &ObdSize);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // other fatal error occured
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GEN_INTERNAL_INCOMPATIBILITY;
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObjectCount != 0)
|
||||
{ // PDO in OD is still valid
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GEN_PARAM_INCOMPATIBILITY;
|
||||
Ret = kEplPdoNotExist;
|
||||
goto Exit;
|
||||
}
|
||||
ObdSize = 1;
|
||||
// read number of mapped objects from OD; this indicates if the PDO is valid
|
||||
Ret = EplObduReadEntry(uiIndex_p, 0x00, &bObjectCount, &ObdSize);
|
||||
if (Ret != kEplSuccessful) { // other fatal error occured
|
||||
pParam_p->m_dwAbortCode =
|
||||
EPL_SDOAC_GEN_INTERNAL_INCOMPATIBILITY;
|
||||
goto Exit;
|
||||
}
|
||||
// entry read successfully
|
||||
if (bObjectCount != 0) { // PDO in OD is still valid
|
||||
pParam_p->m_dwAbortCode = EPL_SDOAC_GEN_PARAM_INCOMPATIBILITY;
|
||||
Ret = kEplPdoNotExist;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplPdouDecodeObjectMapping
|
||||
@@ -466,26 +440,25 @@ BYTE bObjectCount;
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static void EplPdouDecodeObjectMapping(QWORD qwObjectMapping_p,
|
||||
unsigned int* puiIndex_p,
|
||||
unsigned int* puiSubIndex_p,
|
||||
unsigned int* puiBitOffset_p,
|
||||
unsigned int* puiBitSize_p)
|
||||
unsigned int *puiIndex_p,
|
||||
unsigned int *puiSubIndex_p,
|
||||
unsigned int *puiBitOffset_p,
|
||||
unsigned int *puiBitSize_p)
|
||||
{
|
||||
*puiIndex_p = (unsigned int)
|
||||
(qwObjectMapping_p & 0x000000000000FFFFLL);
|
||||
*puiIndex_p = (unsigned int)
|
||||
(qwObjectMapping_p & 0x000000000000FFFFLL);
|
||||
|
||||
*puiSubIndex_p = (unsigned int)
|
||||
((qwObjectMapping_p & 0x0000000000FF0000LL) >> 16);
|
||||
*puiSubIndex_p = (unsigned int)
|
||||
((qwObjectMapping_p & 0x0000000000FF0000LL) >> 16);
|
||||
|
||||
*puiBitOffset_p = (unsigned int)
|
||||
((qwObjectMapping_p & 0x0000FFFF00000000LL) >> 32);
|
||||
*puiBitOffset_p = (unsigned int)
|
||||
((qwObjectMapping_p & 0x0000FFFF00000000LL) >> 32);
|
||||
|
||||
*puiBitSize_p = (unsigned int)
|
||||
((qwObjectMapping_p & 0xFFFF000000000000LL) >> 48);
|
||||
*puiBitSize_p = (unsigned int)
|
||||
((qwObjectMapping_p & 0xFFFF000000000000LL) >> 48);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplPdouCheckObjectMapping
|
||||
@@ -508,101 +481,85 @@ static void EplPdouDecodeObjectMapping(QWORD qwObjectMapping_p,
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplKernel EplPdouCheckObjectMapping(QWORD qwObjectMapping_p,
|
||||
tEplObdAccess AccessType_p,
|
||||
DWORD* pdwAbortCode_p,
|
||||
unsigned int* puiPdoSize_p)
|
||||
tEplObdAccess AccessType_p,
|
||||
DWORD * pdwAbortCode_p,
|
||||
unsigned int *puiPdoSize_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplObdSize ObdSize;
|
||||
unsigned int uiIndex;
|
||||
unsigned int uiSubIndex;
|
||||
unsigned int uiBitOffset;
|
||||
unsigned int uiBitSize;
|
||||
tEplObdAccess AccessType;
|
||||
BOOL fNumerical;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplObdSize ObdSize;
|
||||
unsigned int uiIndex;
|
||||
unsigned int uiSubIndex;
|
||||
unsigned int uiBitOffset;
|
||||
unsigned int uiBitSize;
|
||||
tEplObdAccess AccessType;
|
||||
BOOL fNumerical;
|
||||
|
||||
if (qwObjectMapping_p == 0)
|
||||
{ // discard zero value
|
||||
*puiPdoSize_p = 0;
|
||||
goto Exit;
|
||||
}
|
||||
if (qwObjectMapping_p == 0) { // discard zero value
|
||||
*puiPdoSize_p = 0;
|
||||
goto Exit;
|
||||
}
|
||||
// decode object mapping
|
||||
EplPdouDecodeObjectMapping(qwObjectMapping_p,
|
||||
&uiIndex,
|
||||
&uiSubIndex, &uiBitOffset, &uiBitSize);
|
||||
|
||||
// decode object mapping
|
||||
EplPdouDecodeObjectMapping(qwObjectMapping_p,
|
||||
&uiIndex,
|
||||
&uiSubIndex,
|
||||
&uiBitOffset,
|
||||
&uiBitSize);
|
||||
if ((uiBitOffset & 0x7) != 0x0) { // bit mapping is not supported
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoGranularityMismatch;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ((uiBitOffset & 0x7) != 0x0)
|
||||
{ // bit mapping is not supported
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoGranularityMismatch;
|
||||
goto Exit;
|
||||
}
|
||||
if ((uiBitSize & 0x7) != 0x0) { // bit mapping is not supported
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoGranularityMismatch;
|
||||
goto Exit;
|
||||
}
|
||||
// check access type
|
||||
Ret = EplObduGetAccessType(uiIndex, uiSubIndex, &AccessType);
|
||||
if (Ret != kEplSuccessful) { // entry doesn't exist
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ((uiBitSize & 0x7) != 0x0)
|
||||
{ // bit mapping is not supported
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoGranularityMismatch;
|
||||
goto Exit;
|
||||
}
|
||||
if ((AccessType & kEplObdAccPdo) == 0) { // object is not mappable
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check access type
|
||||
Ret = EplObduGetAccessType(uiIndex, uiSubIndex, &AccessType);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // entry doesn't exist
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST;
|
||||
goto Exit;
|
||||
}
|
||||
if ((AccessType & AccessType_p) == 0) { // object is not writeable (RPDO) or readable (TPDO) respectively
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ((AccessType & kEplObdAccPdo) == 0)
|
||||
{ // object is not mappable
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
goto Exit;
|
||||
}
|
||||
ObdSize = EplObduGetDataSize(uiIndex, uiSubIndex);
|
||||
if (ObdSize < (uiBitSize >> 3)) { // object does not exist or has smaller size
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
}
|
||||
|
||||
if ((AccessType & AccessType_p) == 0)
|
||||
{ // object is not writeable (RPDO) or readable (TPDO) respectively
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_MAPPABLE;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
goto Exit;
|
||||
}
|
||||
Ret = EplObduIsNumerical(uiIndex, uiSubIndex, &fNumerical);
|
||||
if (Ret != kEplSuccessful) { // entry doesn't exist
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
ObdSize = EplObduGetDataSize(uiIndex, uiSubIndex);
|
||||
if (ObdSize < (uiBitSize >> 3))
|
||||
{ // object does not exist or has smaller size
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
}
|
||||
if ((fNumerical != FALSE)
|
||||
&& ((uiBitSize >> 3) != ObdSize)) {
|
||||
// object is numerical,
|
||||
// therefor size has to fit, but it does not.
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
goto Exit;
|
||||
}
|
||||
// calucaled needed PDO size
|
||||
*puiPdoSize_p = (uiBitOffset >> 3) + (uiBitSize >> 3);
|
||||
|
||||
Ret = EplObduIsNumerical(uiIndex, uiSubIndex, &fNumerical);
|
||||
if (Ret != kEplSuccessful)
|
||||
{ // entry doesn't exist
|
||||
*pdwAbortCode_p = EPL_SDOAC_OBJECT_NOT_EXIST;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ((fNumerical != FALSE)
|
||||
&& ((uiBitSize >> 3) != ObdSize))
|
||||
{
|
||||
// object is numerical,
|
||||
// therefor size has to fit, but it does not.
|
||||
*pdwAbortCode_p = EPL_SDOAC_GENERAL_ERROR;
|
||||
Ret = kEplPdoVarNotFound;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// calucaled needed PDO size
|
||||
*puiPdoSize_p = (uiBitOffset >> 3) + (uiBitSize >> 3);
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
#endif // #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOU)) != 0)
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -94,11 +94,9 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// instance table
|
||||
typedef struct
|
||||
{
|
||||
unsigned int m_auiSdoAsndConnection[EPL_SDO_MAX_CONNECTION_ASND];
|
||||
tEplSequLayerReceiveCb m_fpSdoAsySeqCb;
|
||||
|
||||
typedef struct {
|
||||
unsigned int m_auiSdoAsndConnection[EPL_SDO_MAX_CONNECTION_ASND];
|
||||
tEplSequLayerReceiveCb m_fpSdoAsySeqCb;
|
||||
|
||||
} tEplSdoAsndInstance;
|
||||
|
||||
@@ -106,7 +104,7 @@ typedef struct
|
||||
// modul globale vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplSdoAsndInstance SdoAsndInstance_g;
|
||||
static tEplSdoAsndInstance SdoAsndInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
@@ -127,8 +125,6 @@ tEplKernel PUBLIC EplSdoAsnduCb(tEplFrameInfo * pFrameInfo_p);
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -155,15 +151,13 @@ tEplKernel PUBLIC EplSdoAsnduCb(tEplFrameInfo * pFrameInfo_p);
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduInit(tEplSequLayerReceiveCb fpReceiveCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplSdoAsnduAddInstance(fpReceiveCb_p);
|
||||
|
||||
Ret = EplSdoAsnduAddInstance(fpReceiveCb_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplSdoAsnduAddInstance
|
||||
@@ -184,30 +178,26 @@ return Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduAddInstance(tEplSequLayerReceiveCb fpReceiveCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// init control structure
|
||||
EPL_MEMSET(&SdoAsndInstance_g, 0x00, sizeof(SdoAsndInstance_g));
|
||||
// init control structure
|
||||
EPL_MEMSET(&SdoAsndInstance_g, 0x00, sizeof(SdoAsndInstance_g));
|
||||
|
||||
// save pointer to callback-function
|
||||
if (fpReceiveCb_p != NULL)
|
||||
{
|
||||
SdoAsndInstance_g.m_fpSdoAsySeqCb = fpReceiveCb_p;
|
||||
}
|
||||
else
|
||||
{
|
||||
Ret = kEplSdoUdpMissCb;
|
||||
}
|
||||
// save pointer to callback-function
|
||||
if (fpReceiveCb_p != NULL) {
|
||||
SdoAsndInstance_g.m_fpSdoAsySeqCb = fpReceiveCb_p;
|
||||
} else {
|
||||
Ret = kEplSdoUdpMissCb;
|
||||
}
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndSdo,
|
||||
EplSdoAsnduCb,
|
||||
kEplDllAsndFilterLocal);
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndSdo,
|
||||
EplSdoAsnduCb, kEplDllAsndFilterLocal);
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -230,21 +220,19 @@ tEplKernel Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
// deregister callback function from DLL
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndSdo,
|
||||
NULL,
|
||||
kEplDllAsndFilterNone);
|
||||
// deregister callback function from DLL
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndSdo,
|
||||
NULL, kEplDllAsndFilterNone);
|
||||
#endif
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplSdoAsnduInitCon
|
||||
@@ -263,61 +251,53 @@ return Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduInitCon(tEplSdoConHdl* pSdoConHandle_p,
|
||||
unsigned int uiTargetNodeId_p)
|
||||
tEplKernel PUBLIC EplSdoAsnduInitCon(tEplSdoConHdl * pSdoConHandle_p,
|
||||
unsigned int uiTargetNodeId_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiCount;
|
||||
unsigned int uiFreeCon;
|
||||
unsigned int* puiConnection;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiCount;
|
||||
unsigned int uiFreeCon;
|
||||
unsigned int *puiConnection;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
if ((uiTargetNodeId_p == EPL_C_ADR_INVALID)
|
||||
|| (uiTargetNodeId_p >= EPL_C_ADR_BROADCAST))
|
||||
{
|
||||
Ret = kEplSdoAsndInvalidNodeId;
|
||||
goto Exit;
|
||||
}
|
||||
if ((uiTargetNodeId_p == EPL_C_ADR_INVALID)
|
||||
|| (uiTargetNodeId_p >= EPL_C_ADR_BROADCAST)) {
|
||||
Ret = kEplSdoAsndInvalidNodeId;
|
||||
goto Exit;
|
||||
}
|
||||
// get free entry in control structure
|
||||
uiCount = 0;
|
||||
uiFreeCon = EPL_SDO_MAX_CONNECTION_ASND;
|
||||
puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[0];
|
||||
while (uiCount < EPL_SDO_MAX_CONNECTION_ASND) {
|
||||
if (*puiConnection == uiTargetNodeId_p) { // existing connection to target node found
|
||||
// save handle for higher layer
|
||||
*pSdoConHandle_p = (uiCount | EPL_SDO_ASND_HANDLE);
|
||||
|
||||
// get free entry in control structure
|
||||
uiCount = 0;
|
||||
uiFreeCon = EPL_SDO_MAX_CONNECTION_ASND;
|
||||
puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[0];
|
||||
while(uiCount < EPL_SDO_MAX_CONNECTION_ASND)
|
||||
{
|
||||
if (*puiConnection == uiTargetNodeId_p)
|
||||
{ // existing connection to target node found
|
||||
// save handle for higher layer
|
||||
*pSdoConHandle_p = (uiCount | EPL_SDO_ASND_HANDLE );
|
||||
goto Exit;
|
||||
} else if (*puiConnection == 0) { // free entry-> save target nodeId
|
||||
uiFreeCon = uiCount;
|
||||
}
|
||||
uiCount++;
|
||||
puiConnection++;
|
||||
}
|
||||
|
||||
goto Exit;
|
||||
}
|
||||
else if (*puiConnection == 0)
|
||||
{ // free entry-> save target nodeId
|
||||
uiFreeCon = uiCount;
|
||||
}
|
||||
uiCount++;
|
||||
puiConnection++;
|
||||
}
|
||||
if (uiFreeCon == EPL_SDO_MAX_CONNECTION_ASND) {
|
||||
// no free connection
|
||||
Ret = kEplSdoAsndNoFreeHandle;
|
||||
} else {
|
||||
puiConnection =
|
||||
&SdoAsndInstance_g.m_auiSdoAsndConnection[uiFreeCon];
|
||||
*puiConnection = uiTargetNodeId_p;
|
||||
// save handle for higher layer
|
||||
*pSdoConHandle_p = (uiFreeCon | EPL_SDO_ASND_HANDLE);
|
||||
|
||||
if (uiFreeCon == EPL_SDO_MAX_CONNECTION_ASND)
|
||||
{
|
||||
// no free connection
|
||||
Ret = kEplSdoAsndNoFreeHandle;
|
||||
}
|
||||
else
|
||||
{
|
||||
puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[uiFreeCon];
|
||||
*puiConnection = uiTargetNodeId_p;
|
||||
// save handle for higher layer
|
||||
*pSdoConHandle_p = (uiFreeCon | EPL_SDO_ASND_HANDLE );
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -339,47 +319,47 @@ unsigned int* puiConnection;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduSendData(tEplSdoConHdl SdoConHandle_p,
|
||||
tEplFrame * pSrcData_p,
|
||||
DWORD dwDataSize_p)
|
||||
tEplKernel PUBLIC EplSdoAsnduSendData(tEplSdoConHdl SdoConHandle_p,
|
||||
tEplFrame * pSrcData_p,
|
||||
DWORD dwDataSize_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiArray;
|
||||
tEplFrameInfo FrameInfo;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiArray;
|
||||
tEplFrameInfo FrameInfo;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
|
||||
if(uiArray > EPL_SDO_MAX_CONNECTION_ASND)
|
||||
{
|
||||
Ret = kEplSdoAsndInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
if (uiArray > EPL_SDO_MAX_CONNECTION_ASND) {
|
||||
Ret = kEplSdoAsndInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// fillout Asnd header
|
||||
// own node id not needed -> filled by DLL
|
||||
|
||||
// fillout Asnd header
|
||||
// own node id not needed -> filled by DLL
|
||||
// set message type
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bMessageType, (BYTE) kEplMsgTypeAsnd); // ASnd == 0x06
|
||||
// target node id
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bDstNodeId,
|
||||
(BYTE) SdoAsndInstance_g.
|
||||
m_auiSdoAsndConnection[uiArray]);
|
||||
// set source-nodeid (filled by DLL 0)
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bSrcNodeId, 0x00);
|
||||
|
||||
// set message type
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bMessageType, (BYTE)kEplMsgTypeAsnd); // ASnd == 0x06
|
||||
// target node id
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bDstNodeId, (BYTE) SdoAsndInstance_g.m_auiSdoAsndConnection[uiArray]);
|
||||
// set source-nodeid (filled by DLL 0)
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bSrcNodeId, 0x00);
|
||||
// calc size
|
||||
dwDataSize_p += EPL_ASND_HEADER_SIZE;
|
||||
|
||||
// calc size
|
||||
dwDataSize_p += EPL_ASND_HEADER_SIZE;
|
||||
|
||||
// send function of DLL
|
||||
FrameInfo.m_uiFrameSize = dwDataSize_p;
|
||||
FrameInfo.m_pFrame = pSrcData_p;
|
||||
EPL_MEMSET(&FrameInfo.m_NetTime , 0x00, sizeof(tEplNetTime));
|
||||
// send function of DLL
|
||||
FrameInfo.m_uiFrameSize = dwDataSize_p;
|
||||
FrameInfo.m_pFrame = pSrcData_p;
|
||||
EPL_MEMSET(&FrameInfo.m_NetTime, 0x00, sizeof(tEplNetTime));
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
|
||||
Ret = EplDlluCalAsyncSend(&FrameInfo,kEplDllAsyncReqPrioGeneric);
|
||||
Ret = EplDlluCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric);
|
||||
#endif
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -401,25 +381,22 @@ tEplFrameInfo FrameInfo;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduDelCon(tEplSdoConHdl SdoConHandle_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiArray;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiArray;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
// check parameter
|
||||
if (uiArray > EPL_SDO_MAX_CONNECTION_ASND) {
|
||||
Ret = kEplSdoAsndInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// set target nodeId to 0
|
||||
SdoAsndInstance_g.m_auiSdoAsndConnection[uiArray] = 0;
|
||||
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
// check parameter
|
||||
if(uiArray > EPL_SDO_MAX_CONNECTION_ASND)
|
||||
{
|
||||
Ret = kEplSdoAsndInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// set target nodeId to 0
|
||||
SdoAsndInstance_g.m_auiSdoAsndConnection[uiArray] = 0;
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//=========================================================================//
|
||||
@@ -447,63 +424,60 @@ unsigned int uiArray;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoAsnduCb(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiCount;
|
||||
unsigned int* puiConnection;
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiFreeEntry = 0xFFFF;
|
||||
tEplSdoConHdl SdoConHdl;
|
||||
tEplFrame* pFrame;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiCount;
|
||||
unsigned int *puiConnection;
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiFreeEntry = 0xFFFF;
|
||||
tEplSdoConHdl SdoConHdl;
|
||||
tEplFrame *pFrame;
|
||||
|
||||
pFrame = pFrameInfo_p->m_pFrame;
|
||||
pFrame = pFrameInfo_p->m_pFrame;
|
||||
|
||||
uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
|
||||
uiNodeId = AmiGetByteFromLe(&pFrame->m_le_bSrcNodeId);
|
||||
|
||||
// search corresponding entry in control structure
|
||||
uiCount = 0;
|
||||
puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[0];
|
||||
while (uiCount < EPL_SDO_MAX_CONNECTION_ASND)
|
||||
{
|
||||
if (uiNodeId == *puiConnection)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ((*puiConnection == 0)
|
||||
&& (uiFreeEntry == 0xFFFF))
|
||||
{ // free entry
|
||||
uiFreeEntry = uiCount;
|
||||
}
|
||||
uiCount++;
|
||||
puiConnection++;
|
||||
}
|
||||
// search corresponding entry in control structure
|
||||
uiCount = 0;
|
||||
puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[0];
|
||||
while (uiCount < EPL_SDO_MAX_CONNECTION_ASND) {
|
||||
if (uiNodeId == *puiConnection) {
|
||||
break;
|
||||
} else if ((*puiConnection == 0)
|
||||
&& (uiFreeEntry == 0xFFFF)) { // free entry
|
||||
uiFreeEntry = uiCount;
|
||||
}
|
||||
uiCount++;
|
||||
puiConnection++;
|
||||
}
|
||||
|
||||
if (uiCount == EPL_SDO_MAX_CONNECTION_ASND)
|
||||
{
|
||||
if (uiFreeEntry != 0xFFFF)
|
||||
{
|
||||
puiConnection = &SdoAsndInstance_g.m_auiSdoAsndConnection[uiFreeEntry];
|
||||
*puiConnection = uiNodeId;
|
||||
uiCount = uiFreeEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
EPL_DBGLVL_SDO_TRACE0("EplSdoAsnduCb(): no free handle\n");
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
if (uiCount == EPL_SDO_MAX_CONNECTION_ASND) {
|
||||
if (uiFreeEntry != 0xFFFF) {
|
||||
puiConnection =
|
||||
&SdoAsndInstance_g.
|
||||
m_auiSdoAsndConnection[uiFreeEntry];
|
||||
*puiConnection = uiNodeId;
|
||||
uiCount = uiFreeEntry;
|
||||
} else {
|
||||
EPL_DBGLVL_SDO_TRACE0
|
||||
("EplSdoAsnduCb(): no free handle\n");
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
// if (uiNodeId == *puiConnection)
|
||||
{ // entry found or created
|
||||
SdoConHdl = (uiCount | EPL_SDO_ASND_HANDLE );
|
||||
{ // entry found or created
|
||||
SdoConHdl = (uiCount | EPL_SDO_ASND_HANDLE);
|
||||
|
||||
SdoAsndInstance_g.m_fpSdoAsySeqCb(SdoConHdl, &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame, (pFrameInfo_p->m_uiFrameSize - 18));
|
||||
}
|
||||
SdoAsndInstance_g.m_fpSdoAsySeqCb(SdoConHdl,
|
||||
&pFrame->m_Data.m_Asnd.
|
||||
m_Payload.m_SdoSequenceFrame,
|
||||
(pFrameInfo_p->m_uiFrameSize -
|
||||
18));
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_ASND)) != 0)
|
||||
// EOF
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -68,7 +68,6 @@
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include "user/EplSdoUdpu.h"
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
|
||||
@@ -79,7 +78,6 @@
|
||||
#include <linux/sched.h>
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -100,29 +98,27 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned long m_ulIpAddr; // in network byte order
|
||||
unsigned int m_uiPort; // in network byte order
|
||||
typedef struct {
|
||||
unsigned long m_ulIpAddr; // in network byte order
|
||||
unsigned int m_uiPort; // in network byte order
|
||||
|
||||
} tEplSdoUdpCon;
|
||||
|
||||
// instance table
|
||||
typedef struct
|
||||
{
|
||||
tEplSdoUdpCon m_aSdoAbsUdpConnection[EPL_SDO_MAX_CONNECTION_UDP];
|
||||
tEplSequLayerReceiveCb m_fpSdoAsySeqCb;
|
||||
SOCKET m_UdpSocket;
|
||||
typedef struct {
|
||||
tEplSdoUdpCon m_aSdoAbsUdpConnection[EPL_SDO_MAX_CONNECTION_UDP];
|
||||
tEplSequLayerReceiveCb m_fpSdoAsySeqCb;
|
||||
SOCKET m_UdpSocket;
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
HANDLE m_ThreadHandle;
|
||||
LPCRITICAL_SECTION m_pCriticalSection;
|
||||
CRITICAL_SECTION m_CriticalSection;
|
||||
HANDLE m_ThreadHandle;
|
||||
LPCRITICAL_SECTION m_pCriticalSection;
|
||||
CRITICAL_SECTION m_CriticalSection;
|
||||
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
struct completion m_CompletionUdpThread;
|
||||
int m_ThreadHandle;
|
||||
int m_iTerminateThread;
|
||||
struct completion m_CompletionUdpThread;
|
||||
int m_ThreadHandle;
|
||||
int m_iTerminateThread;
|
||||
#endif
|
||||
|
||||
} tEplSdoUdpInstance;
|
||||
@@ -131,7 +127,7 @@ typedef struct
|
||||
// modul globale vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplSdoUdpInstance SdoUdpInstance_g;
|
||||
static tEplSdoUdpInstance SdoUdpInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
@@ -141,7 +137,7 @@ static tEplSdoUdpInstance SdoUdpInstance_g;
|
||||
static DWORD PUBLIC EplSdoUdpThread(LPVOID lpParameter);
|
||||
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
static int EplSdoUdpThread(void * pArg_p);
|
||||
static int EplSdoUdpThread(void *pArg_p);
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
@@ -157,8 +153,6 @@ static int EplSdoUdpThread(void * pArg_p);
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -185,12 +179,11 @@ static int EplSdoUdpThread(void * pArg_p);
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuInit(tEplSequLayerReceiveCb fpReceiveCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplSdoUdpuAddInstance(fpReceiveCb_p);
|
||||
|
||||
Ret = EplSdoUdpuAddInstance(fpReceiveCb_p);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -214,59 +207,54 @@ return Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuAddInstance(tEplSequLayerReceiveCb fpReceiveCb_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
int iError;
|
||||
WSADATA Wsa;
|
||||
int iError;
|
||||
WSADATA Wsa;
|
||||
|
||||
#endif
|
||||
|
||||
// set instance variables to 0
|
||||
EPL_MEMSET(&SdoUdpInstance_g, 0x00, sizeof(SdoUdpInstance_g));
|
||||
// set instance variables to 0
|
||||
EPL_MEMSET(&SdoUdpInstance_g, 0x00, sizeof(SdoUdpInstance_g));
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// save pointer to callback-function
|
||||
if (fpReceiveCb_p != NULL)
|
||||
{
|
||||
SdoUdpInstance_g.m_fpSdoAsySeqCb = fpReceiveCb_p;
|
||||
}
|
||||
else
|
||||
{
|
||||
Ret = kEplSdoUdpMissCb;
|
||||
goto Exit;
|
||||
}
|
||||
// save pointer to callback-function
|
||||
if (fpReceiveCb_p != NULL) {
|
||||
SdoUdpInstance_g.m_fpSdoAsySeqCb = fpReceiveCb_p;
|
||||
} else {
|
||||
Ret = kEplSdoUdpMissCb;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// start winsock2 for win32
|
||||
// windows specific start of socket
|
||||
iError = WSAStartup(MAKEWORD(2,0),&Wsa);
|
||||
if (iError != 0)
|
||||
{
|
||||
Ret = kEplSdoUdpNoSocket;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// create critical section for acccess of instnace variables
|
||||
SdoUdpInstance_g.m_pCriticalSection = &SdoUdpInstance_g.m_CriticalSection;
|
||||
InitializeCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// start winsock2 for win32
|
||||
// windows specific start of socket
|
||||
iError = WSAStartup(MAKEWORD(2, 0), &Wsa);
|
||||
if (iError != 0) {
|
||||
Ret = kEplSdoUdpNoSocket;
|
||||
goto Exit;
|
||||
}
|
||||
// create critical section for acccess of instnace variables
|
||||
SdoUdpInstance_g.m_pCriticalSection =
|
||||
&SdoUdpInstance_g.m_CriticalSection;
|
||||
InitializeCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
init_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
|
||||
SdoUdpInstance_g.m_iTerminateThread = 0;
|
||||
init_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
|
||||
SdoUdpInstance_g.m_iTerminateThread = 0;
|
||||
#endif
|
||||
|
||||
SdoUdpInstance_g.m_ThreadHandle = 0;
|
||||
SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
|
||||
SdoUdpInstance_g.m_ThreadHandle = 0;
|
||||
SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
|
||||
|
||||
Ret = EplSdoUdpuConfig(INADDR_ANY, 0);
|
||||
Ret = EplSdoUdpuConfig(INADDR_ANY, 0);
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplSdoUdpuDelInstance
|
||||
@@ -287,56 +275,52 @@ WSADATA Wsa;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
BOOL fTermError;
|
||||
BOOL fTermError;
|
||||
#endif
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
if (SdoUdpInstance_g.m_ThreadHandle != 0)
|
||||
{ // listen thread was started
|
||||
// close thread
|
||||
if (SdoUdpInstance_g.m_ThreadHandle != 0) { // listen thread was started
|
||||
// close thread
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
fTermError = TerminateThread(SdoUdpInstance_g.m_ThreadHandle, 0);
|
||||
if(fTermError == FALSE)
|
||||
{
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
fTermError =
|
||||
TerminateThread(SdoUdpInstance_g.m_ThreadHandle, 0);
|
||||
if (fTermError == FALSE) {
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
SdoUdpInstance_g.m_iTerminateThread = 1;
|
||||
/* kill_proc(SdoUdpInstance_g.m_ThreadHandle, SIGTERM, 1 ); */
|
||||
send_sig(SIGTERM, SdoUdpInstance_g.m_ThreadHandle, 1);
|
||||
wait_for_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
|
||||
SdoUdpInstance_g.m_iTerminateThread = 1;
|
||||
/* kill_proc(SdoUdpInstance_g.m_ThreadHandle, SIGTERM, 1 ); */
|
||||
send_sig(SIGTERM, SdoUdpInstance_g.m_ThreadHandle, 1);
|
||||
wait_for_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
|
||||
#endif
|
||||
|
||||
SdoUdpInstance_g.m_ThreadHandle = 0;
|
||||
}
|
||||
|
||||
if (SdoUdpInstance_g.m_UdpSocket != INVALID_SOCKET)
|
||||
{
|
||||
// close socket
|
||||
closesocket(SdoUdpInstance_g.m_UdpSocket);
|
||||
SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
|
||||
}
|
||||
SdoUdpInstance_g.m_ThreadHandle = 0;
|
||||
}
|
||||
|
||||
if (SdoUdpInstance_g.m_UdpSocket != INVALID_SOCKET) {
|
||||
// close socket
|
||||
closesocket(SdoUdpInstance_g.m_UdpSocket);
|
||||
SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
|
||||
}
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// delete critical section
|
||||
DeleteCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// delete critical section
|
||||
DeleteCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
#endif
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// for win 32
|
||||
WSACleanup();
|
||||
// for win 32
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
Exit:
|
||||
Exit:
|
||||
#endif
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -356,120 +340,107 @@ BOOL fTermError;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuConfig(unsigned long ulIpAddr_p, unsigned int uiPort_p)
|
||||
tEplKernel PUBLIC EplSdoUdpuConfig(unsigned long ulIpAddr_p,
|
||||
unsigned int uiPort_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
struct sockaddr_in Addr;
|
||||
int iError;
|
||||
tEplKernel Ret;
|
||||
struct sockaddr_in Addr;
|
||||
int iError;
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
BOOL fTermError;
|
||||
unsigned long ulThreadId;
|
||||
BOOL fTermError;
|
||||
unsigned long ulThreadId;
|
||||
#endif
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
if (uiPort_p == 0)
|
||||
{ // set UDP port to default port number
|
||||
uiPort_p = EPL_C_SDO_EPL_PORT;
|
||||
}
|
||||
else if (uiPort_p > 65535)
|
||||
{
|
||||
Ret = kEplSdoUdpSocketError;
|
||||
goto Exit;
|
||||
}
|
||||
if (uiPort_p == 0) { // set UDP port to default port number
|
||||
uiPort_p = EPL_C_SDO_EPL_PORT;
|
||||
} else if (uiPort_p > 65535) {
|
||||
Ret = kEplSdoUdpSocketError;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (SdoUdpInstance_g.m_ThreadHandle != 0)
|
||||
{ // listen thread was started
|
||||
if (SdoUdpInstance_g.m_ThreadHandle != 0) { // listen thread was started
|
||||
|
||||
// close old thread
|
||||
// close old thread
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
fTermError = TerminateThread(SdoUdpInstance_g.m_ThreadHandle, 0);
|
||||
if(fTermError == FALSE)
|
||||
{
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
fTermError =
|
||||
TerminateThread(SdoUdpInstance_g.m_ThreadHandle, 0);
|
||||
if (fTermError == FALSE) {
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
SdoUdpInstance_g.m_iTerminateThread = 1;
|
||||
/* kill_proc(SdoUdpInstance_g.m_ThreadHandle, SIGTERM, 1 ); */
|
||||
send_sig(SIGTERM, SdoUdpInstance_g.m_ThreadHandle, 1);
|
||||
wait_for_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
|
||||
SdoUdpInstance_g.m_iTerminateThread = 0;
|
||||
SdoUdpInstance_g.m_iTerminateThread = 1;
|
||||
/* kill_proc(SdoUdpInstance_g.m_ThreadHandle, SIGTERM, 1 ); */
|
||||
send_sig(SIGTERM, SdoUdpInstance_g.m_ThreadHandle, 1);
|
||||
wait_for_completion(&SdoUdpInstance_g.m_CompletionUdpThread);
|
||||
SdoUdpInstance_g.m_iTerminateThread = 0;
|
||||
#endif
|
||||
|
||||
SdoUdpInstance_g.m_ThreadHandle = 0;
|
||||
}
|
||||
SdoUdpInstance_g.m_ThreadHandle = 0;
|
||||
}
|
||||
|
||||
if (SdoUdpInstance_g.m_UdpSocket != INVALID_SOCKET)
|
||||
{
|
||||
// close socket
|
||||
iError = closesocket(SdoUdpInstance_g.m_UdpSocket);
|
||||
SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
|
||||
if(iError != 0)
|
||||
{
|
||||
Ret = kEplSdoUdpSocketError;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
// create Socket
|
||||
SdoUdpInstance_g.m_UdpSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (SdoUdpInstance_g.m_UdpSocket == INVALID_SOCKET)
|
||||
{
|
||||
Ret = kEplSdoUdpNoSocket;
|
||||
EPL_DBGLVL_SDO_TRACE0("EplSdoUdpuConfig: socket() failed\n");
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// bind socket
|
||||
Addr.sin_family = AF_INET;
|
||||
Addr.sin_port = htons((unsigned short) uiPort_p);
|
||||
Addr.sin_addr.s_addr = htonl(ulIpAddr_p);
|
||||
iError = bind(SdoUdpInstance_g.m_UdpSocket, (struct sockaddr*)&Addr, sizeof (Addr));
|
||||
if (iError < 0)
|
||||
{
|
||||
//iError = WSAGetLastError();
|
||||
EPL_DBGLVL_SDO_TRACE1("EplSdoUdpuConfig: bind() finished with %i\n", iError);
|
||||
Ret = kEplSdoUdpNoSocket;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// create Listen-Thread
|
||||
if (SdoUdpInstance_g.m_UdpSocket != INVALID_SOCKET) {
|
||||
// close socket
|
||||
iError = closesocket(SdoUdpInstance_g.m_UdpSocket);
|
||||
SdoUdpInstance_g.m_UdpSocket = INVALID_SOCKET;
|
||||
if (iError != 0) {
|
||||
Ret = kEplSdoUdpSocketError;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
// create Socket
|
||||
SdoUdpInstance_g.m_UdpSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
if (SdoUdpInstance_g.m_UdpSocket == INVALID_SOCKET) {
|
||||
Ret = kEplSdoUdpNoSocket;
|
||||
EPL_DBGLVL_SDO_TRACE0("EplSdoUdpuConfig: socket() failed\n");
|
||||
goto Exit;
|
||||
}
|
||||
// bind socket
|
||||
Addr.sin_family = AF_INET;
|
||||
Addr.sin_port = htons((unsigned short)uiPort_p);
|
||||
Addr.sin_addr.s_addr = htonl(ulIpAddr_p);
|
||||
iError =
|
||||
bind(SdoUdpInstance_g.m_UdpSocket, (struct sockaddr *)&Addr,
|
||||
sizeof(Addr));
|
||||
if (iError < 0) {
|
||||
//iError = WSAGetLastError();
|
||||
EPL_DBGLVL_SDO_TRACE1
|
||||
("EplSdoUdpuConfig: bind() finished with %i\n", iError);
|
||||
Ret = kEplSdoUdpNoSocket;
|
||||
goto Exit;
|
||||
}
|
||||
// create Listen-Thread
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// for win32
|
||||
|
||||
// create thread
|
||||
SdoUdpInstance_g.m_ThreadHandle = CreateThread(NULL,
|
||||
0,
|
||||
EplSdoUdpThread,
|
||||
&SdoUdpInstance_g,
|
||||
0,
|
||||
&ulThreadId);
|
||||
if(SdoUdpInstance_g.m_ThreadHandle == NULL)
|
||||
{
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
// for win32
|
||||
|
||||
// create thread
|
||||
SdoUdpInstance_g.m_ThreadHandle = CreateThread(NULL,
|
||||
0,
|
||||
EplSdoUdpThread,
|
||||
&SdoUdpInstance_g,
|
||||
0, &ulThreadId);
|
||||
if (SdoUdpInstance_g.m_ThreadHandle == NULL) {
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
|
||||
SdoUdpInstance_g.m_ThreadHandle = kernel_thread(EplSdoUdpThread, &SdoUdpInstance_g, CLONE_KERNEL);
|
||||
if(SdoUdpInstance_g.m_ThreadHandle == 0)
|
||||
{
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
SdoUdpInstance_g.m_ThreadHandle =
|
||||
kernel_thread(EplSdoUdpThread, &SdoUdpInstance_g, CLONE_KERNEL);
|
||||
if (SdoUdpInstance_g.m_ThreadHandle == 0) {
|
||||
Ret = kEplSdoUdpThreadError;
|
||||
goto Exit;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplSdoUdpuInitCon
|
||||
@@ -488,57 +459,51 @@ unsigned long ulThreadId;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuInitCon(tEplSdoConHdl* pSdoConHandle_p,
|
||||
unsigned int uiTargetNodeId_p)
|
||||
tEplKernel PUBLIC EplSdoUdpuInitCon(tEplSdoConHdl * pSdoConHandle_p,
|
||||
unsigned int uiTargetNodeId_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiCount;
|
||||
unsigned int uiFreeCon;
|
||||
tEplSdoUdpCon* pSdoUdpCon;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiCount;
|
||||
unsigned int uiFreeCon;
|
||||
tEplSdoUdpCon *pSdoUdpCon;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// get free entry in control structure
|
||||
uiCount = 0;
|
||||
uiFreeCon = EPL_SDO_MAX_CONNECTION_UDP;
|
||||
pSdoUdpCon = &SdoUdpInstance_g.m_aSdoAbsUdpConnection[0];
|
||||
while (uiCount < EPL_SDO_MAX_CONNECTION_UDP)
|
||||
{
|
||||
if ((pSdoUdpCon->m_ulIpAddr & htonl(0xFF)) == htonl(uiTargetNodeId_p))
|
||||
{ // existing connection to target node found
|
||||
// set handle
|
||||
*pSdoConHandle_p = (uiCount | EPL_SDO_UDP_HANDLE);
|
||||
// get free entry in control structure
|
||||
uiCount = 0;
|
||||
uiFreeCon = EPL_SDO_MAX_CONNECTION_UDP;
|
||||
pSdoUdpCon = &SdoUdpInstance_g.m_aSdoAbsUdpConnection[0];
|
||||
while (uiCount < EPL_SDO_MAX_CONNECTION_UDP) {
|
||||
if ((pSdoUdpCon->m_ulIpAddr & htonl(0xFF)) == htonl(uiTargetNodeId_p)) { // existing connection to target node found
|
||||
// set handle
|
||||
*pSdoConHandle_p = (uiCount | EPL_SDO_UDP_HANDLE);
|
||||
|
||||
goto Exit;
|
||||
}
|
||||
else if ((pSdoUdpCon->m_ulIpAddr == 0)
|
||||
&& (pSdoUdpCon->m_uiPort == 0))
|
||||
{
|
||||
uiFreeCon = uiCount;
|
||||
}
|
||||
uiCount++;
|
||||
pSdoUdpCon++;
|
||||
}
|
||||
goto Exit;
|
||||
} else if ((pSdoUdpCon->m_ulIpAddr == 0)
|
||||
&& (pSdoUdpCon->m_uiPort == 0)) {
|
||||
uiFreeCon = uiCount;
|
||||
}
|
||||
uiCount++;
|
||||
pSdoUdpCon++;
|
||||
}
|
||||
|
||||
if (uiFreeCon == EPL_SDO_MAX_CONNECTION_UDP)
|
||||
{
|
||||
// error no free handle
|
||||
Ret = kEplSdoUdpNoFreeHandle;
|
||||
}
|
||||
else
|
||||
{
|
||||
pSdoUdpCon = &SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiFreeCon];
|
||||
// save infos for connection
|
||||
pSdoUdpCon->m_uiPort = htons(EPL_C_SDO_EPL_PORT);
|
||||
pSdoUdpCon->m_ulIpAddr = htonl(0xC0A86400 | uiTargetNodeId_p); // 192.168.100.uiTargetNodeId_p
|
||||
if (uiFreeCon == EPL_SDO_MAX_CONNECTION_UDP) {
|
||||
// error no free handle
|
||||
Ret = kEplSdoUdpNoFreeHandle;
|
||||
} else {
|
||||
pSdoUdpCon =
|
||||
&SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiFreeCon];
|
||||
// save infos for connection
|
||||
pSdoUdpCon->m_uiPort = htons(EPL_C_SDO_EPL_PORT);
|
||||
pSdoUdpCon->m_ulIpAddr = htonl(0xC0A86400 | uiTargetNodeId_p); // 192.168.100.uiTargetNodeId_p
|
||||
|
||||
// set handle
|
||||
*pSdoConHandle_p = (uiFreeCon | EPL_SDO_UDP_HANDLE);
|
||||
// set handle
|
||||
*pSdoConHandle_p = (uiFreeCon | EPL_SDO_UDP_HANDLE);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -561,67 +526,67 @@ tEplSdoUdpCon* pSdoUdpCon;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuSendData(tEplSdoConHdl SdoConHandle_p,
|
||||
tEplFrame * pSrcData_p,
|
||||
DWORD dwDataSize_p)
|
||||
tEplKernel PUBLIC EplSdoUdpuSendData(tEplSdoConHdl SdoConHandle_p,
|
||||
tEplFrame * pSrcData_p, DWORD dwDataSize_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
int iError;
|
||||
unsigned int uiArray;
|
||||
struct sockaddr_in Addr;
|
||||
tEplKernel Ret;
|
||||
int iError;
|
||||
unsigned int uiArray;
|
||||
struct sockaddr_in Addr;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
if(uiArray >= EPL_SDO_MAX_CONNECTION_UDP)
|
||||
{
|
||||
Ret = kEplSdoUdpInvalidHdl;
|
||||
goto Exit;
|
||||
}
|
||||
//set message type
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bMessageType, 0x06); // SDO
|
||||
// target node id (for Udp = 0)
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bDstNodeId, 0x00);
|
||||
// set source-nodeid (for Udp = 0)
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bSrcNodeId, 0x00);
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
if (uiArray >= EPL_SDO_MAX_CONNECTION_UDP) {
|
||||
Ret = kEplSdoUdpInvalidHdl;
|
||||
goto Exit;
|
||||
}
|
||||
//set message type
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bMessageType, 0x06); // SDO
|
||||
// target node id (for Udp = 0)
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bDstNodeId, 0x00);
|
||||
// set source-nodeid (for Udp = 0)
|
||||
AmiSetByteToLe(&pSrcData_p->m_le_bSrcNodeId, 0x00);
|
||||
|
||||
// calc size
|
||||
dwDataSize_p += EPL_ASND_HEADER_SIZE;
|
||||
// calc size
|
||||
dwDataSize_p += EPL_ASND_HEADER_SIZE;
|
||||
|
||||
// call sendto
|
||||
Addr.sin_family = AF_INET;
|
||||
// call sendto
|
||||
Addr.sin_family = AF_INET;
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// enter critical section for process function
|
||||
EnterCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// enter critical section for process function
|
||||
EnterCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
#endif
|
||||
|
||||
Addr.sin_port = (unsigned short) SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_uiPort;
|
||||
Addr.sin_addr.s_addr = SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_ulIpAddr;
|
||||
Addr.sin_port =
|
||||
(unsigned short)SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].
|
||||
m_uiPort;
|
||||
Addr.sin_addr.s_addr =
|
||||
SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_ulIpAddr;
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
#endif
|
||||
|
||||
iError = sendto (SdoUdpInstance_g.m_UdpSocket, // sockethandle
|
||||
(const char*) &pSrcData_p->m_le_bMessageType, // data to send
|
||||
dwDataSize_p, // number of bytes to send
|
||||
0, // flags
|
||||
(struct sockaddr*)&Addr, // target
|
||||
sizeof(struct sockaddr_in)); // sizeof targetadress
|
||||
if(iError < 0)
|
||||
{
|
||||
EPL_DBGLVL_SDO_TRACE1("EplSdoUdpuSendData: sendto() finished with %i\n", iError);
|
||||
Ret = kEplSdoUdpSendError;
|
||||
goto Exit;
|
||||
}
|
||||
iError = sendto(SdoUdpInstance_g.m_UdpSocket, // sockethandle
|
||||
(const char *)&pSrcData_p->m_le_bMessageType, // data to send
|
||||
dwDataSize_p, // number of bytes to send
|
||||
0, // flags
|
||||
(struct sockaddr *)&Addr, // target
|
||||
sizeof(struct sockaddr_in)); // sizeof targetadress
|
||||
if (iError < 0) {
|
||||
EPL_DBGLVL_SDO_TRACE1
|
||||
("EplSdoUdpuSendData: sendto() finished with %i\n", iError);
|
||||
Ret = kEplSdoUdpSendError;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplSdoUdpuDelCon
|
||||
@@ -640,29 +605,24 @@ struct sockaddr_in Addr;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplSdoUdpuDelCon(tEplSdoConHdl SdoConHandle_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiArray;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiArray;
|
||||
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
|
||||
uiArray = (SdoConHandle_p & ~EPL_SDO_ASY_HANDLE_MASK);
|
||||
if (uiArray >= EPL_SDO_MAX_CONNECTION_UDP) {
|
||||
Ret = kEplSdoUdpInvalidHdl;
|
||||
goto Exit;
|
||||
} else {
|
||||
Ret = kEplSuccessful;
|
||||
}
|
||||
|
||||
if(uiArray >= EPL_SDO_MAX_CONNECTION_UDP)
|
||||
{
|
||||
Ret = kEplSdoUdpInvalidHdl;
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
Ret = kEplSuccessful;
|
||||
}
|
||||
// delete connection
|
||||
SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_ulIpAddr = 0;
|
||||
SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_uiPort = 0;
|
||||
|
||||
|
||||
// delete connection
|
||||
SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_ulIpAddr = 0;
|
||||
SdoUdpInstance_g.m_aSdoAbsUdpConnection[uiArray].m_uiPort = 0;
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//=========================================================================//
|
||||
@@ -691,131 +651,140 @@ unsigned int uiArray;
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
static DWORD PUBLIC EplSdoUdpThread(LPVOID lpParameter)
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
static int EplSdoUdpThread(void * pArg_p)
|
||||
static int EplSdoUdpThread(void *pArg_p)
|
||||
#endif
|
||||
{
|
||||
|
||||
tEplSdoUdpInstance* pInstance;
|
||||
struct sockaddr_in RemoteAddr;
|
||||
int iError;
|
||||
int iCount;
|
||||
int iFreeEntry;
|
||||
BYTE abBuffer[EPL_MAX_SDO_REC_FRAME_SIZE];
|
||||
unsigned int uiSize;
|
||||
tEplSdoConHdl SdoConHdl;
|
||||
tEplSdoUdpInstance *pInstance;
|
||||
struct sockaddr_in RemoteAddr;
|
||||
int iError;
|
||||
int iCount;
|
||||
int iFreeEntry;
|
||||
BYTE abBuffer[EPL_MAX_SDO_REC_FRAME_SIZE];
|
||||
unsigned int uiSize;
|
||||
tEplSdoConHdl SdoConHdl;
|
||||
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
pInstance = (tEplSdoUdpInstance*)lpParameter;
|
||||
|
||||
for (;;)
|
||||
pInstance = (tEplSdoUdpInstance *) lpParameter;
|
||||
|
||||
for (;;)
|
||||
#elif (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
pInstance = (tEplSdoUdpInstance*)pArg_p;
|
||||
daemonize("EplSdoUdpThread");
|
||||
allow_signal( SIGTERM );
|
||||
pInstance = (tEplSdoUdpInstance *) pArg_p;
|
||||
daemonize("EplSdoUdpThread");
|
||||
allow_signal(SIGTERM);
|
||||
|
||||
for (;pInstance->m_iTerminateThread == 0;)
|
||||
for (; pInstance->m_iTerminateThread == 0;)
|
||||
#endif
|
||||
|
||||
{
|
||||
// wait for data
|
||||
uiSize = sizeof(struct sockaddr);
|
||||
iError = recvfrom(pInstance->m_UdpSocket, // Socket
|
||||
(char *)&abBuffer[0], // buffer for data
|
||||
sizeof(abBuffer), // size of the buffer
|
||||
0, // flags
|
||||
(struct sockaddr*)&RemoteAddr,
|
||||
(int*)&uiSize);
|
||||
{
|
||||
// wait for data
|
||||
uiSize = sizeof(struct sockaddr);
|
||||
iError = recvfrom(pInstance->m_UdpSocket, // Socket
|
||||
(char *)&abBuffer[0], // buffer for data
|
||||
sizeof(abBuffer), // size of the buffer
|
||||
0, // flags
|
||||
(struct sockaddr *)&RemoteAddr,
|
||||
(int *)&uiSize);
|
||||
#if (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
if (iError == -ERESTARTSYS)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (iError == -ERESTARTSYS) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (iError > 0)
|
||||
{
|
||||
// get handle for higher layer
|
||||
iCount = 0;
|
||||
iFreeEntry = 0xFFFF;
|
||||
if (iError > 0) {
|
||||
// get handle for higher layer
|
||||
iCount = 0;
|
||||
iFreeEntry = 0xFFFF;
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// enter critical section for process function
|
||||
EnterCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// enter critical section for process function
|
||||
EnterCriticalSection(SdoUdpInstance_g.
|
||||
m_pCriticalSection);
|
||||
#endif
|
||||
while (iCount < EPL_SDO_MAX_CONNECTION_UDP)
|
||||
{
|
||||
// check if this connection is already known
|
||||
if((pInstance->m_aSdoAbsUdpConnection[iCount].m_ulIpAddr == RemoteAddr.sin_addr.s_addr)
|
||||
&& (pInstance->m_aSdoAbsUdpConnection[iCount].m_uiPort == RemoteAddr.sin_port))
|
||||
{
|
||||
break;
|
||||
}
|
||||
while (iCount < EPL_SDO_MAX_CONNECTION_UDP) {
|
||||
// check if this connection is already known
|
||||
if ((pInstance->m_aSdoAbsUdpConnection[iCount].
|
||||
m_ulIpAddr == RemoteAddr.sin_addr.s_addr)
|
||||
&& (pInstance->
|
||||
m_aSdoAbsUdpConnection[iCount].
|
||||
m_uiPort == RemoteAddr.sin_port)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if((pInstance->m_aSdoAbsUdpConnection[iCount].m_ulIpAddr == 0)
|
||||
&& (pInstance->m_aSdoAbsUdpConnection[iCount].m_uiPort == 0)
|
||||
&& (iFreeEntry == 0xFFFF))
|
||||
if ((pInstance->m_aSdoAbsUdpConnection[iCount].
|
||||
m_ulIpAddr == 0)
|
||||
&& (pInstance->
|
||||
m_aSdoAbsUdpConnection[iCount].
|
||||
m_uiPort == 0)
|
||||
&& (iFreeEntry == 0xFFFF))
|
||||
{
|
||||
iFreeEntry = iCount;
|
||||
}
|
||||
|
||||
{
|
||||
iFreeEntry = iCount;
|
||||
}
|
||||
iCount++;
|
||||
}
|
||||
|
||||
iCount++;
|
||||
}
|
||||
|
||||
if (iCount == EPL_SDO_MAX_CONNECTION_UDP)
|
||||
{
|
||||
// connection unknown
|
||||
// see if there is a free handle
|
||||
if (iFreeEntry != 0xFFFF)
|
||||
{
|
||||
// save adress infos
|
||||
pInstance->m_aSdoAbsUdpConnection[iFreeEntry].m_ulIpAddr =
|
||||
RemoteAddr.sin_addr.s_addr;
|
||||
pInstance->m_aSdoAbsUdpConnection[iFreeEntry].m_uiPort =
|
||||
RemoteAddr.sin_port;
|
||||
if (iCount == EPL_SDO_MAX_CONNECTION_UDP) {
|
||||
// connection unknown
|
||||
// see if there is a free handle
|
||||
if (iFreeEntry != 0xFFFF) {
|
||||
// save adress infos
|
||||
pInstance->
|
||||
m_aSdoAbsUdpConnection[iFreeEntry].
|
||||
m_ulIpAddr =
|
||||
RemoteAddr.sin_addr.s_addr;
|
||||
pInstance->
|
||||
m_aSdoAbsUdpConnection[iFreeEntry].
|
||||
m_uiPort = RemoteAddr.sin_port;
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.
|
||||
m_pCriticalSection);
|
||||
#endif
|
||||
// call callback
|
||||
SdoConHdl = iFreeEntry;
|
||||
SdoConHdl |= EPL_SDO_UDP_HANDLE;
|
||||
// offset 4 -> start of SDO Sequence header
|
||||
pInstance->m_fpSdoAsySeqCb(SdoConHdl, (tEplAsySdoSeq*)&abBuffer[4], (iError - 4));
|
||||
}
|
||||
else
|
||||
{
|
||||
EPL_DBGLVL_SDO_TRACE0("Error in EplSdoUdpThread() no free handle\n");
|
||||
// call callback
|
||||
SdoConHdl = iFreeEntry;
|
||||
SdoConHdl |= EPL_SDO_UDP_HANDLE;
|
||||
// offset 4 -> start of SDO Sequence header
|
||||
pInstance->m_fpSdoAsySeqCb(SdoConHdl,
|
||||
(tEplAsySdoSeq
|
||||
*) &
|
||||
abBuffer[4],
|
||||
(iError -
|
||||
4));
|
||||
} else {
|
||||
EPL_DBGLVL_SDO_TRACE0
|
||||
("Error in EplSdoUdpThread() no free handle\n");
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.
|
||||
m_pCriticalSection);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// known connection
|
||||
// call callback with correct handle
|
||||
SdoConHdl = iCount;
|
||||
SdoConHdl |= EPL_SDO_UDP_HANDLE;
|
||||
} else {
|
||||
// known connection
|
||||
// call callback with correct handle
|
||||
SdoConHdl = iCount;
|
||||
SdoConHdl |= EPL_SDO_UDP_HANDLE;
|
||||
#if (TARGET_SYSTEM == _WIN32_)
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.m_pCriticalSection);
|
||||
// leave critical section for process function
|
||||
LeaveCriticalSection(SdoUdpInstance_g.
|
||||
m_pCriticalSection);
|
||||
#endif
|
||||
// offset 4 -> start of SDO Sequence header
|
||||
pInstance->m_fpSdoAsySeqCb(SdoConHdl, (tEplAsySdoSeq*)&abBuffer[4], (iError - 4));
|
||||
}
|
||||
} // end of if(iError!=SOCKET_ERROR)
|
||||
}// end of for(;;)
|
||||
// offset 4 -> start of SDO Sequence header
|
||||
pInstance->m_fpSdoAsySeqCb(SdoConHdl,
|
||||
(tEplAsySdoSeq *) &
|
||||
abBuffer[4],
|
||||
(iError - 4));
|
||||
}
|
||||
} // end of if(iError!=SOCKET_ERROR)
|
||||
} // end of for(;;)
|
||||
|
||||
#if (TARGET_SYSTEM == _LINUX_) && defined(__KERNEL__)
|
||||
complete_and_exit(&SdoUdpInstance_g.m_CompletionUdpThread, 0);
|
||||
complete_and_exit(&SdoUdpInstance_g.m_CompletionUdpThread, 0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDO_UDP)) != 0)
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -95,7 +95,6 @@
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -109,7 +108,6 @@
|
||||
//
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
@@ -124,9 +122,8 @@
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tEplStatusuCbResponse m_apfnCbResponse[254];
|
||||
typedef struct {
|
||||
tEplStatusuCbResponse m_apfnCbResponse[254];
|
||||
|
||||
} tEplStatusuInstance;
|
||||
|
||||
@@ -134,13 +131,14 @@ typedef struct
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplStatusuInstance EplStatusuInstance_g;
|
||||
static tEplStatusuInstance EplStatusuInstance_g;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo * pFrameInfo_p);
|
||||
static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo *
|
||||
pFrameInfo_p);
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
@@ -168,14 +166,13 @@ static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo * pFrameInfo_p
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplStatusuInit()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplStatusuAddInstance();
|
||||
Ret = EplStatusuAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplStatusuAddInstance
|
||||
@@ -196,21 +193,23 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplStatusuAddInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof (EplStatusuInstance_g));
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof(EplStatusuInstance_g));
|
||||
|
||||
// register StatusResponse callback function
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndStatusResponse, EplStatusuCbStatusResponse, kEplDllAsndFilterAny);
|
||||
// register StatusResponse callback function
|
||||
Ret =
|
||||
EplDlluCalRegAsndService(kEplDllAsndStatusResponse,
|
||||
EplStatusuCbStatusResponse,
|
||||
kEplDllAsndFilterAny);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplStatusuDelInstance
|
||||
@@ -231,18 +230,19 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplStatusuDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// deregister StatusResponse callback function
|
||||
Ret = EplDlluCalRegAsndService(kEplDllAsndStatusResponse, NULL, kEplDllAsndFilterNone);
|
||||
// deregister StatusResponse callback function
|
||||
Ret =
|
||||
EplDlluCalRegAsndService(kEplDllAsndStatusResponse, NULL,
|
||||
kEplDllAsndFilterNone);
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplStatusuReset
|
||||
@@ -260,18 +260,17 @@ tEplKernel Ret;
|
||||
|
||||
EPLDLLEXPORT tEplKernel PUBLIC EplStatusuReset()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof (EplStatusuInstance_g));
|
||||
// reset instance structure
|
||||
EPL_MEMSET(&EplStatusuInstance_g, 0, sizeof(EplStatusuInstance_g));
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplStatusuRequestStatusResponse
|
||||
@@ -288,42 +287,38 @@ tEplKernel Ret;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplStatusuRequestStatusResponse(
|
||||
unsigned int uiNodeId_p,
|
||||
tEplStatusuCbResponse pfnCbResponse_p)
|
||||
tEplKernel PUBLIC EplStatusuRequestStatusResponse(unsigned int uiNodeId_p,
|
||||
tEplStatusuCbResponse
|
||||
pfnCbResponse_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// decrement node ID, because array is zero based
|
||||
uiNodeId_p--;
|
||||
if (uiNodeId_p < tabentries (EplStatusuInstance_g.m_apfnCbResponse))
|
||||
{
|
||||
// decrement node ID, because array is zero based
|
||||
uiNodeId_p--;
|
||||
if (uiNodeId_p < tabentries(EplStatusuInstance_g.m_apfnCbResponse)) {
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
if (EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL)
|
||||
{ // request already issued (maybe by someone else)
|
||||
Ret = kEplInvalidOperation;
|
||||
}
|
||||
else
|
||||
{
|
||||
EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] = pfnCbResponse_p;
|
||||
Ret = EplDlluCalIssueRequest(kEplDllReqServiceStatus, (uiNodeId_p + 1), 0xFF);
|
||||
}
|
||||
if (EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] != NULL) { // request already issued (maybe by someone else)
|
||||
Ret = kEplInvalidOperation;
|
||||
} else {
|
||||
EplStatusuInstance_g.m_apfnCbResponse[uiNodeId_p] =
|
||||
pfnCbResponse_p;
|
||||
Ret =
|
||||
EplDlluCalIssueRequest(kEplDllReqServiceStatus,
|
||||
(uiNodeId_p + 1), 0xFF);
|
||||
}
|
||||
#else
|
||||
Ret = kEplInvalidOperation;
|
||||
Ret = kEplInvalidOperation;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{ // invalid node ID specified
|
||||
Ret = kEplInvalidNodeId;
|
||||
}
|
||||
} else { // invalid node ID specified
|
||||
Ret = kEplInvalidNodeId;
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -347,41 +342,39 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo * pFrameInfo_p)
|
||||
static tEplKernel PUBLIC EplStatusuCbStatusResponse(tEplFrameInfo *
|
||||
pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiIndex;
|
||||
tEplStatusuCbResponse pfnCbResponse;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiNodeId;
|
||||
unsigned int uiIndex;
|
||||
tEplStatusuCbResponse pfnCbResponse;
|
||||
|
||||
uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
|
||||
uiNodeId = AmiGetByteFromLe(&pFrameInfo_p->m_pFrame->m_le_bSrcNodeId);
|
||||
|
||||
uiIndex = uiNodeId - 1;
|
||||
uiIndex = uiNodeId - 1;
|
||||
|
||||
if (uiIndex < tabentries (EplStatusuInstance_g.m_apfnCbResponse))
|
||||
{
|
||||
// memorize pointer to callback function
|
||||
pfnCbResponse = EplStatusuInstance_g.m_apfnCbResponse[uiIndex];
|
||||
if (pfnCbResponse == NULL)
|
||||
{ // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
// reset callback function pointer so that caller may issue next request
|
||||
EplStatusuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
|
||||
if (uiIndex < tabentries(EplStatusuInstance_g.m_apfnCbResponse)) {
|
||||
// memorize pointer to callback function
|
||||
pfnCbResponse = EplStatusuInstance_g.m_apfnCbResponse[uiIndex];
|
||||
if (pfnCbResponse == NULL) { // response was not requested
|
||||
goto Exit;
|
||||
}
|
||||
// reset callback function pointer so that caller may issue next request
|
||||
EplStatusuInstance_g.m_apfnCbResponse[uiIndex] = NULL;
|
||||
|
||||
if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_STATUSRES)
|
||||
{ // StatusResponse not received or it has invalid size
|
||||
Ret = pfnCbResponse(uiNodeId, NULL);
|
||||
}
|
||||
else
|
||||
{ // StatusResponse received
|
||||
Ret = pfnCbResponse(uiNodeId, &pFrameInfo_p->m_pFrame->m_Data.m_Asnd.m_Payload.m_StatusResponse);
|
||||
}
|
||||
}
|
||||
if (pFrameInfo_p->m_uiFrameSize < EPL_C_DLL_MINSIZE_STATUSRES) { // StatusResponse not received or it has invalid size
|
||||
Ret = pfnCbResponse(uiNodeId, NULL);
|
||||
} else { // StatusResponse received
|
||||
Ret =
|
||||
pfnCbResponse(uiNodeId,
|
||||
&pFrameInfo_p->m_pFrame->m_Data.
|
||||
m_Asnd.m_Payload.m_StatusResponse);
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -86,10 +86,9 @@
|
||||
//---------------------------------------------------------------------------
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
typedef struct
|
||||
{
|
||||
struct timer_list m_Timer;
|
||||
tEplTimerArg TimerArgument;
|
||||
typedef struct {
|
||||
struct timer_list m_Timer;
|
||||
tEplTimerArg TimerArgument;
|
||||
|
||||
} tEplTimeruData;
|
||||
|
||||
@@ -137,14 +136,13 @@ static void PUBLIC EplTimeruCbMs(unsigned long ulParameter_p);
|
||||
|
||||
tEplKernel PUBLIC EplTimeruInit()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplTimeruAddInstance();
|
||||
Ret = EplTimeruAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruAddInstance
|
||||
@@ -161,14 +159,13 @@ tEplKernel Ret;
|
||||
|
||||
tEplKernel PUBLIC EplTimeruAddInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruDelInstance
|
||||
@@ -187,14 +184,13 @@ tEplKernel Ret;
|
||||
|
||||
tEplKernel PUBLIC EplTimeruDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruSetTimerMs
|
||||
@@ -211,43 +207,40 @@ tEplKernel Ret;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplTimeruSetTimerMs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
tEplKernel PUBLIC EplTimeruSetTimerMs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData* pData;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData *pData;
|
||||
|
||||
// check pointer to handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check pointer to handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
pData = (tEplTimeruData*) EPL_MALLOC(sizeof (tEplTimeruData));
|
||||
if (pData == NULL)
|
||||
{
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData *) EPL_MALLOC(sizeof(tEplTimeruData));
|
||||
if (pData == NULL) {
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
init_timer(&pData->m_Timer);
|
||||
pData->m_Timer.function = EplTimeruCbMs;
|
||||
pData->m_Timer.data = (unsigned long) pData;
|
||||
pData->m_Timer.expires = jiffies + ulTime_p * HZ / 1000;
|
||||
init_timer(&pData->m_Timer);
|
||||
pData->m_Timer.function = EplTimeruCbMs;
|
||||
pData->m_Timer.data = (unsigned long)pData;
|
||||
pData->m_Timer.expires = jiffies + ulTime_p * HZ / 1000;
|
||||
|
||||
EPL_MEMCPY(&pData->TimerArgument, &Argument_p, sizeof(tEplTimerArg));
|
||||
EPL_MEMCPY(&pData->TimerArgument, &Argument_p, sizeof(tEplTimerArg));
|
||||
|
||||
add_timer(&pData->m_Timer);
|
||||
add_timer(&pData->m_Timer);
|
||||
|
||||
*pTimerHdl_p = (tEplTimerHdl) pData;
|
||||
*pTimerHdl_p = (tEplTimerHdl) pData;
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruModifyTimerMs
|
||||
@@ -264,57 +257,50 @@ tEplTimeruData* pData;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplTimeruModifyTimerMs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
tEplKernel PUBLIC EplTimeruModifyTimerMs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData* pData;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData *pData;
|
||||
|
||||
// check pointer to handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check pointer to handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check handle itself, i.e. was the handle initialized before
|
||||
if (*pTimerHdl_p == 0) {
|
||||
Ret = EplTimeruSetTimerMs(pTimerHdl_p, ulTime_p, Argument_p);
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData *) * pTimerHdl_p;
|
||||
if ((tEplTimeruData *) pData->m_Timer.data != pData) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check handle itself, i.e. was the handle initialized before
|
||||
if (*pTimerHdl_p == 0)
|
||||
{
|
||||
Ret = EplTimeruSetTimerMs(pTimerHdl_p, ulTime_p, Argument_p);
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData*) *pTimerHdl_p;
|
||||
if ((tEplTimeruData*)pData->m_Timer.data != pData)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
mod_timer(&pData->m_Timer, (jiffies + ulTime_p * HZ / 1000));
|
||||
|
||||
mod_timer(&pData->m_Timer, (jiffies + ulTime_p * HZ / 1000));
|
||||
// copy the TimerArg after the timer is restarted,
|
||||
// so that a timer occured immediately before mod_timer
|
||||
// won't use the new TimerArg and
|
||||
// therefore the old timer cannot be distinguished from the new one.
|
||||
// But if the new timer is too fast, it may get lost.
|
||||
EPL_MEMCPY(&pData->TimerArgument, &Argument_p, sizeof(tEplTimerArg));
|
||||
|
||||
// copy the TimerArg after the timer is restarted,
|
||||
// so that a timer occured immediately before mod_timer
|
||||
// won't use the new TimerArg and
|
||||
// therefore the old timer cannot be distinguished from the new one.
|
||||
// But if the new timer is too fast, it may get lost.
|
||||
EPL_MEMCPY(&pData->TimerArgument, &Argument_p, sizeof(tEplTimerArg));
|
||||
|
||||
// check if timer is really running
|
||||
if (timer_pending(&pData->m_Timer) == 0)
|
||||
{ // timer is not running
|
||||
// retry starting it
|
||||
add_timer(&pData->m_Timer);
|
||||
}
|
||||
|
||||
// set handle to pointer of tEplTimeruData
|
||||
// check if timer is really running
|
||||
if (timer_pending(&pData->m_Timer) == 0) { // timer is not running
|
||||
// retry starting it
|
||||
add_timer(&pData->m_Timer);
|
||||
}
|
||||
// set handle to pointer of tEplTimeruData
|
||||
// *pTimerHdl_p = (tEplTimerHdl) pData;
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruDeleteTimer
|
||||
@@ -329,50 +315,45 @@ tEplTimeruData* pData;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplTimeruDeleteTimer(tEplTimerHdl* pTimerHdl_p)
|
||||
tEplKernel PUBLIC EplTimeruDeleteTimer(tEplTimerHdl * pTimerHdl_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData* pData;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData *pData;
|
||||
|
||||
// check pointer to handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check handle itself, i.e. was the handle initialized before
|
||||
if (*pTimerHdl_p == 0)
|
||||
{
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData*) *pTimerHdl_p;
|
||||
if ((tEplTimeruData*)pData->m_Timer.data != pData)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check pointer to handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check handle itself, i.e. was the handle initialized before
|
||||
if (*pTimerHdl_p == 0) {
|
||||
Ret = kEplSuccessful;
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData *) * pTimerHdl_p;
|
||||
if ((tEplTimeruData *) pData->m_Timer.data != pData) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/* if (del_timer(&pData->m_Timer) == 1)
|
||||
{
|
||||
kfree(pData);
|
||||
}
|
||||
*/
|
||||
// try to delete the timer
|
||||
del_timer(&pData->m_Timer);
|
||||
// free memory in any case
|
||||
kfree(pData);
|
||||
// try to delete the timer
|
||||
del_timer(&pData->m_Timer);
|
||||
// free memory in any case
|
||||
kfree(pData);
|
||||
|
||||
// uninitialize handle
|
||||
*pTimerHdl_p = 0;
|
||||
// uninitialize handle
|
||||
*pTimerHdl_p = 0;
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruIsTimerActive
|
||||
@@ -391,33 +372,28 @@ tEplTimeruData* pData;
|
||||
|
||||
BOOL PUBLIC EplTimeruIsTimerActive(tEplTimerHdl TimerHdl_p)
|
||||
{
|
||||
BOOL fActive = FALSE;
|
||||
tEplTimeruData* pData;
|
||||
BOOL fActive = FALSE;
|
||||
tEplTimeruData *pData;
|
||||
|
||||
// check handle itself, i.e. was the handle initialized before
|
||||
if (TimerHdl_p == 0)
|
||||
{ // timer was not created yet, so it is not active
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData*) TimerHdl_p;
|
||||
if ((tEplTimeruData*)pData->m_Timer.data != pData)
|
||||
{ // invalid timer
|
||||
goto Exit;
|
||||
}
|
||||
// check handle itself, i.e. was the handle initialized before
|
||||
if (TimerHdl_p == 0) { // timer was not created yet, so it is not active
|
||||
goto Exit;
|
||||
}
|
||||
pData = (tEplTimeruData *) TimerHdl_p;
|
||||
if ((tEplTimeruData *) pData->m_Timer.data != pData) { // invalid timer
|
||||
goto Exit;
|
||||
}
|
||||
// check if timer is running
|
||||
if (timer_pending(&pData->m_Timer) == 0) { // timer is not running
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check if timer is running
|
||||
if (timer_pending(&pData->m_Timer) == 0)
|
||||
{ // timer is not running
|
||||
goto Exit;
|
||||
}
|
||||
fActive = TRUE;
|
||||
|
||||
fActive = TRUE;
|
||||
|
||||
Exit:
|
||||
return fActive;
|
||||
Exit:
|
||||
return fActive;
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
@@ -443,30 +419,28 @@ tEplTimeruData* pData;
|
||||
//---------------------------------------------------------------------------
|
||||
static void PUBLIC EplTimeruCbMs(unsigned long ulParameter_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData* pData;
|
||||
tEplEvent EplEvent;
|
||||
tEplTimerEventArg TimerEventArg;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplTimeruData *pData;
|
||||
tEplEvent EplEvent;
|
||||
tEplTimerEventArg TimerEventArg;
|
||||
|
||||
pData = (tEplTimeruData*) ulParameter_p;
|
||||
pData = (tEplTimeruData *) ulParameter_p;
|
||||
|
||||
// call event function
|
||||
TimerEventArg.m_TimerHdl = (tEplTimerHdl)pData;
|
||||
TimerEventArg.m_ulArg = pData->TimerArgument.m_ulArg;
|
||||
// call event function
|
||||
TimerEventArg.m_TimerHdl = (tEplTimerHdl) pData;
|
||||
TimerEventArg.m_ulArg = pData->TimerArgument.m_ulArg;
|
||||
|
||||
EplEvent.m_EventSink = pData->TimerArgument.m_EventSink;
|
||||
EplEvent.m_EventType = kEplEventTypeTimer;
|
||||
EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(tEplNetTime));
|
||||
EplEvent.m_pArg = &TimerEventArg;
|
||||
EplEvent.m_uiSize = sizeof(TimerEventArg);
|
||||
EplEvent.m_EventSink = pData->TimerArgument.m_EventSink;
|
||||
EplEvent.m_EventType = kEplEventTypeTimer;
|
||||
EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(tEplNetTime));
|
||||
EplEvent.m_pArg = &TimerEventArg;
|
||||
EplEvent.m_uiSize = sizeof(TimerEventArg);
|
||||
|
||||
Ret = EplEventuPost(&EplEvent);
|
||||
Ret = EplEventuPost(&EplEvent);
|
||||
|
||||
// d.k. do not free memory, user has to call EplTimeruDeleteTimer()
|
||||
//kfree(pData);
|
||||
// d.k. do not free memory, user has to call EplTimeruDeleteTimer()
|
||||
//kfree(pData);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -132,11 +132,11 @@
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruInit()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplTimeruAddInstance();
|
||||
Ret = EplTimeruAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -158,11 +158,11 @@ return Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruAddInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -186,11 +186,11 @@ return Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -212,27 +212,24 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruSetTimerMs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
tEplKernel PUBLIC EplTimeruSetTimerMs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
// check handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// check handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruModifyTimerMs
|
||||
@@ -252,24 +249,22 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruModifyTimerMs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
tEplKernel PUBLIC EplTimeruModifyTimerMs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// check parameter
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check parameter
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -289,25 +284,22 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruDeleteTimer(tEplTimerHdl* pTimerHdl_p)
|
||||
tEplKernel PUBLIC EplTimeruDeleteTimer(tEplTimerHdl * pTimerHdl_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// check parameter
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check parameter
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// set handle invalide
|
||||
*pTimerHdl_p = 0;
|
||||
|
||||
// set handle invalide
|
||||
*pTimerHdl_p = 0;
|
||||
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -317,7 +309,4 @@ tEplKernel Ret;
|
||||
// //
|
||||
//=========================================================================//
|
||||
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -85,24 +85,22 @@
|
||||
//---------------------------------------------------------------------------
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
typedef struct
|
||||
{
|
||||
tEplTimerArg TimerArgument;
|
||||
HANDLE DelteHandle;
|
||||
unsigned long ulTimeout;
|
||||
typedef struct {
|
||||
tEplTimerArg TimerArgument;
|
||||
HANDLE DelteHandle;
|
||||
unsigned long ulTimeout;
|
||||
|
||||
}tEplTimeruThread;
|
||||
} tEplTimeruThread;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
LPCRITICAL_SECTION m_pCriticalSection;
|
||||
CRITICAL_SECTION m_CriticalSection;
|
||||
}tEplTimeruInstance;
|
||||
typedef struct {
|
||||
LPCRITICAL_SECTION m_pCriticalSection;
|
||||
CRITICAL_SECTION m_CriticalSection;
|
||||
} tEplTimeruInstance;
|
||||
//---------------------------------------------------------------------------
|
||||
// modul globale vars
|
||||
//---------------------------------------------------------------------------
|
||||
static tEplTimeruInstance EplTimeruInstance_g;
|
||||
static tEplTimeruThread ThreadData_l;
|
||||
static tEplTimeruThread ThreadData_l;
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -146,11 +144,11 @@ DWORD PUBLIC EplSdoTimeruThreadms(LPVOID lpParameter);
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruInit()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplTimeruAddInstance();
|
||||
Ret = EplTimeruAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -172,18 +170,16 @@ return Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruAddInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// create critical section
|
||||
EplTimeruInstance_g.m_pCriticalSection =
|
||||
&EplTimeruInstance_g.m_CriticalSection;
|
||||
InitializeCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// create critical section
|
||||
EplTimeruInstance_g.m_pCriticalSection = &EplTimeruInstance_g.m_CriticalSection;
|
||||
InitializeCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -207,11 +203,11 @@ return Ret;
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruDelInstance()
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -233,71 +229,60 @@ tEplKernel Ret;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruSetTimerMs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
tEplKernel PUBLIC EplTimeruSetTimerMs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
HANDLE DeleteHandle;
|
||||
HANDLE ThreadHandle;
|
||||
DWORD ThreadId;
|
||||
tEplKernel Ret;
|
||||
HANDLE DeleteHandle;
|
||||
HANDLE ThreadHandle;
|
||||
DWORD ThreadId;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
// check handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// enter critical section
|
||||
EnterCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// check handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// first create event to delete timer
|
||||
DeleteHandle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (DeleteHandle == NULL) {
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// set handle for caller
|
||||
*pTimerHdl_p = (tEplTimerHdl) DeleteHandle;
|
||||
|
||||
// enter critical section
|
||||
EnterCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
// fill data for thread
|
||||
ThreadData_l.DelteHandle = DeleteHandle;
|
||||
EPL_MEMCPY(&ThreadData_l.TimerArgument, &Argument_p,
|
||||
sizeof(tEplTimerArg));
|
||||
ThreadData_l.ulTimeout = ulTime_p;
|
||||
|
||||
// first create event to delete timer
|
||||
DeleteHandle = CreateEvent(NULL,FALSE,FALSE, NULL);
|
||||
if(DeleteHandle == NULL)
|
||||
{
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// create thread to create waitable timer and wait for timer
|
||||
ThreadHandle = CreateThread(NULL,
|
||||
0,
|
||||
EplSdoTimeruThreadms,
|
||||
&ThreadData_l, 0, &ThreadId);
|
||||
if (ThreadHandle == NULL) {
|
||||
// leave critical section
|
||||
LeaveCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// set handle for caller
|
||||
*pTimerHdl_p = (tEplTimerHdl)DeleteHandle;
|
||||
// delte handle
|
||||
CloseHandle(DeleteHandle);
|
||||
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// fill data for thread
|
||||
ThreadData_l.DelteHandle = DeleteHandle;
|
||||
EPL_MEMCPY(&ThreadData_l.TimerArgument, &Argument_p, sizeof(tEplTimerArg));
|
||||
ThreadData_l.ulTimeout = ulTime_p;
|
||||
|
||||
// create thread to create waitable timer and wait for timer
|
||||
ThreadHandle = CreateThread(NULL,
|
||||
0,
|
||||
EplSdoTimeruThreadms,
|
||||
&ThreadData_l,
|
||||
0,
|
||||
&ThreadId);
|
||||
if(ThreadHandle == NULL)
|
||||
{
|
||||
// leave critical section
|
||||
LeaveCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// delte handle
|
||||
CloseHandle(DeleteHandle);
|
||||
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimeruModifyTimerMs
|
||||
@@ -317,69 +302,64 @@ DWORD ThreadId;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruModifyTimerMs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
tEplKernel PUBLIC EplTimeruModifyTimerMs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long ulTime_p,
|
||||
tEplTimerArg Argument_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
HANDLE DeleteHandle;
|
||||
HANDLE ThreadHandle;
|
||||
DWORD ThreadId;
|
||||
tEplKernel Ret;
|
||||
HANDLE DeleteHandle;
|
||||
HANDLE ThreadHandle;
|
||||
DWORD ThreadId;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// check parameter
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check parameter
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
DeleteHandle = (HANDLE)(*pTimerHdl_p);
|
||||
DeleteHandle = (HANDLE) (*pTimerHdl_p);
|
||||
|
||||
// set event to end timer task for this timer
|
||||
SetEvent(DeleteHandle);
|
||||
// set event to end timer task for this timer
|
||||
SetEvent(DeleteHandle);
|
||||
|
||||
// create new timer
|
||||
// first create event to delete timer
|
||||
DeleteHandle = CreateEvent(NULL,FALSE,FALSE, NULL);
|
||||
if(DeleteHandle == NULL)
|
||||
{
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// create new timer
|
||||
// first create event to delete timer
|
||||
DeleteHandle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if (DeleteHandle == NULL) {
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// set handle for caller
|
||||
*pTimerHdl_p = (tEplTimerHdl) DeleteHandle;
|
||||
|
||||
// set handle for caller
|
||||
*pTimerHdl_p = (tEplTimerHdl)DeleteHandle;
|
||||
// enter critical section
|
||||
EnterCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// enter critical section
|
||||
EnterCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
// fill data for thread
|
||||
ThreadData_l.DelteHandle = DeleteHandle;
|
||||
EPL_MEMCPY(&ThreadData_l.TimerArgument, &Argument_p,
|
||||
sizeof(tEplTimerArg));
|
||||
ThreadData_l.ulTimeout = ulTime_p;
|
||||
|
||||
// fill data for thread
|
||||
ThreadData_l.DelteHandle = DeleteHandle;
|
||||
EPL_MEMCPY(&ThreadData_l.TimerArgument, &Argument_p, sizeof(tEplTimerArg));
|
||||
ThreadData_l.ulTimeout = ulTime_p;
|
||||
// create thread to create waitable timer and wait for timer
|
||||
ThreadHandle = CreateThread(NULL,
|
||||
0,
|
||||
EplSdoTimeruThreadms,
|
||||
&ThreadData_l, 0, &ThreadId);
|
||||
if (ThreadHandle == NULL) {
|
||||
// leave critical section
|
||||
LeaveCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// create thread to create waitable timer and wait for timer
|
||||
ThreadHandle = CreateThread(NULL,
|
||||
0,
|
||||
EplSdoTimeruThreadms,
|
||||
&ThreadData_l,
|
||||
0,
|
||||
&ThreadId);
|
||||
if(ThreadHandle == NULL)
|
||||
{
|
||||
// leave critical section
|
||||
LeaveCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
// delte handle
|
||||
|
||||
// delte handle
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -399,31 +379,29 @@ DWORD ThreadId;
|
||||
// State:
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
tEplKernel PUBLIC EplTimeruDeleteTimer(tEplTimerHdl* pTimerHdl_p)
|
||||
tEplKernel PUBLIC EplTimeruDeleteTimer(tEplTimerHdl * pTimerHdl_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
HANDLE DeleteHandle;
|
||||
tEplKernel Ret;
|
||||
HANDLE DeleteHandle;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// check parameter
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check parameter
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
DeleteHandle = (HANDLE)(*pTimerHdl_p);
|
||||
DeleteHandle = (HANDLE) (*pTimerHdl_p);
|
||||
|
||||
// set event to end timer task for this timer
|
||||
SetEvent(DeleteHandle);
|
||||
// set event to end timer task for this timer
|
||||
SetEvent(DeleteHandle);
|
||||
|
||||
// set handle invalide
|
||||
*pTimerHdl_p = 0;
|
||||
// set handle invalide
|
||||
*pTimerHdl_p = 0;
|
||||
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
@@ -452,100 +430,84 @@ HANDLE DeleteHandle;
|
||||
//---------------------------------------------------------------------------
|
||||
DWORD PUBLIC EplSdoTimeruThreadms(LPVOID lpParameter)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplTimeruThread* pThreadData;
|
||||
HANDLE aHandles[2];
|
||||
BOOL fReturn;
|
||||
LARGE_INTEGER TimeoutTime;
|
||||
unsigned long ulEvent;
|
||||
tEplEvent EplEvent;
|
||||
tEplTimeruThread ThreadData;
|
||||
tEplTimerEventArg TimerEventArg;
|
||||
tEplKernel Ret;
|
||||
tEplTimeruThread *pThreadData;
|
||||
HANDLE aHandles[2];
|
||||
BOOL fReturn;
|
||||
LARGE_INTEGER TimeoutTime;
|
||||
unsigned long ulEvent;
|
||||
tEplEvent EplEvent;
|
||||
tEplTimeruThread ThreadData;
|
||||
tEplTimerEventArg TimerEventArg;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// get pointer to data
|
||||
pThreadData = (tEplTimeruThread*)lpParameter;
|
||||
// copy thread data
|
||||
EPL_MEMCPY(&ThreadData, pThreadData, sizeof(ThreadData));
|
||||
pThreadData = &ThreadData;
|
||||
// get pointer to data
|
||||
pThreadData = (tEplTimeruThread *) lpParameter;
|
||||
// copy thread data
|
||||
EPL_MEMCPY(&ThreadData, pThreadData, sizeof(ThreadData));
|
||||
pThreadData = &ThreadData;
|
||||
|
||||
// leave critical section
|
||||
LeaveCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
// leave critical section
|
||||
LeaveCriticalSection(EplTimeruInstance_g.m_pCriticalSection);
|
||||
|
||||
// create waitable timer
|
||||
aHandles[1] = CreateWaitableTimer(NULL,FALSE,NULL);
|
||||
if(aHandles[1] == NULL)
|
||||
{
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// create waitable timer
|
||||
aHandles[1] = CreateWaitableTimer(NULL, FALSE, NULL);
|
||||
if (aHandles[1] == NULL) {
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// set timer
|
||||
// set timeout interval -> needed to be negativ
|
||||
// -> because relative timeout
|
||||
// -> multiply by 10000 for 100 ns timebase of function
|
||||
TimeoutTime.QuadPart = (((long long)pThreadData->ulTimeout) * -10000);
|
||||
fReturn = SetWaitableTimer(aHandles[1],
|
||||
&TimeoutTime, 0, NULL, NULL, FALSE);
|
||||
if (fReturn == 0) {
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// save delte event handle in handle array
|
||||
aHandles[0] = pThreadData->DelteHandle;
|
||||
|
||||
// set timer
|
||||
// set timeout interval -> needed to be negativ
|
||||
// -> because relative timeout
|
||||
// -> multiply by 10000 for 100 ns timebase of function
|
||||
TimeoutTime.QuadPart = (((long long)pThreadData->ulTimeout) * -10000);
|
||||
fReturn = SetWaitableTimer(aHandles[1],
|
||||
&TimeoutTime,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
FALSE);
|
||||
if(fReturn == 0)
|
||||
{
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// wait for one of the events
|
||||
ulEvent = WaitForMultipleObjects(2, &aHandles[0], FALSE, INFINITE);
|
||||
if (ulEvent == WAIT_OBJECT_0) { // delte event
|
||||
|
||||
// save delte event handle in handle array
|
||||
aHandles[0] = pThreadData->DelteHandle;
|
||||
// close handels
|
||||
CloseHandle(aHandles[1]);
|
||||
// terminate thread
|
||||
goto Exit;
|
||||
} else if (ulEvent == (WAIT_OBJECT_0 + 1)) { // timer event
|
||||
// call event function
|
||||
TimerEventArg.m_TimerHdl =
|
||||
(tEplTimerHdl) pThreadData->DelteHandle;
|
||||
TimerEventArg.m_ulArg = pThreadData->TimerArgument.m_ulArg;
|
||||
|
||||
// wait for one of the events
|
||||
ulEvent = WaitForMultipleObjects( 2,
|
||||
&aHandles[0],
|
||||
FALSE,
|
||||
INFINITE);
|
||||
if(ulEvent == WAIT_OBJECT_0)
|
||||
{ // delte event
|
||||
EplEvent.m_EventSink = pThreadData->TimerArgument.m_EventSink;
|
||||
EplEvent.m_EventType = kEplEventTypeTimer;
|
||||
EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(tEplNetTime));
|
||||
EplEvent.m_pArg = &TimerEventArg;
|
||||
EplEvent.m_uiSize = sizeof(TimerEventArg);
|
||||
|
||||
// close handels
|
||||
CloseHandle(aHandles[1]);
|
||||
// terminate thread
|
||||
goto Exit;
|
||||
}
|
||||
else if(ulEvent == (WAIT_OBJECT_0 + 1))
|
||||
{ // timer event
|
||||
// call event function
|
||||
TimerEventArg.m_TimerHdl = (tEplTimerHdl)pThreadData->DelteHandle;
|
||||
TimerEventArg.m_ulArg = pThreadData->TimerArgument.m_ulArg;
|
||||
Ret = EplEventuPost(&EplEvent);
|
||||
|
||||
EplEvent.m_EventSink = pThreadData->TimerArgument.m_EventSink;
|
||||
EplEvent.m_EventType = kEplEventTypeTimer;
|
||||
EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(tEplNetTime));
|
||||
EplEvent.m_pArg = &TimerEventArg;
|
||||
EplEvent.m_uiSize = sizeof(TimerEventArg);
|
||||
// close handels
|
||||
CloseHandle(aHandles[1]);
|
||||
// terminate thread
|
||||
goto Exit;
|
||||
|
||||
Ret = EplEventuPost(&EplEvent);
|
||||
} else { // error
|
||||
ulEvent = GetLastError();
|
||||
TRACE1("Error in WaitForMultipleObjects Errorcode: 0x%x\n",
|
||||
ulEvent);
|
||||
// terminate thread
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
// close handels
|
||||
CloseHandle(aHandles[1]);
|
||||
// terminate thread
|
||||
goto Exit;
|
||||
|
||||
}
|
||||
else
|
||||
{ // error
|
||||
ulEvent = GetLastError();
|
||||
TRACE1("Error in WaitForMultipleObjects Errorcode: 0x%x\n",ulEvent);
|
||||
// terminate thread
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -68,12 +68,10 @@
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include <linux/net.h>
|
||||
#include <linux/in.h>
|
||||
#include "SocketLinuxKernel.h"
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -82,34 +80,26 @@
|
||||
/* */
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// const defines
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// modul globale vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Kernel Module specific Data Structures
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -136,75 +126,72 @@
|
||||
|
||||
SOCKET socket(int af, int type, int protocol)
|
||||
{
|
||||
int rc;
|
||||
SOCKET socket;
|
||||
int rc;
|
||||
SOCKET socket;
|
||||
|
||||
rc = sock_create_kern(af, type, protocol, &socket);
|
||||
if (rc < 0)
|
||||
{
|
||||
socket = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
rc = sock_create_kern(af, type, protocol, &socket);
|
||||
if (rc < 0) {
|
||||
socket = NULL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return socket;
|
||||
Exit:
|
||||
return socket;
|
||||
}
|
||||
|
||||
int bind(SOCKET socket_p, const struct sockaddr *addr, int addrlen)
|
||||
{
|
||||
int rc;
|
||||
int rc;
|
||||
|
||||
rc = socket_p->ops->bind(socket_p,
|
||||
(struct sockaddr *)addr,
|
||||
addrlen);
|
||||
rc = socket_p->ops->bind(socket_p, (struct sockaddr *)addr, addrlen);
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int closesocket(SOCKET socket_p)
|
||||
{
|
||||
sock_release(socket_p);
|
||||
sock_release(socket_p);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int recvfrom(SOCKET socket_p, char* buf, int len, int flags, struct sockaddr *from, int * fromlen)
|
||||
int recvfrom(SOCKET socket_p, char *buf, int len, int flags,
|
||||
struct sockaddr *from, int *fromlen)
|
||||
{
|
||||
int rc;
|
||||
struct msghdr msg;
|
||||
struct kvec iov;
|
||||
int rc;
|
||||
struct msghdr msg;
|
||||
struct kvec iov;
|
||||
|
||||
msg.msg_control = NULL;
|
||||
msg.msg_controllen = 0;
|
||||
msg.msg_name = from; // will be struct sock_addr
|
||||
msg.msg_namelen = *fromlen;
|
||||
iov.iov_len = len;
|
||||
iov.iov_base = buf;
|
||||
msg.msg_control = NULL;
|
||||
msg.msg_controllen = 0;
|
||||
msg.msg_name = from; // will be struct sock_addr
|
||||
msg.msg_namelen = *fromlen;
|
||||
iov.iov_len = len;
|
||||
iov.iov_base = buf;
|
||||
|
||||
rc = kernel_recvmsg(socket_p, &msg, &iov, 1, iov.iov_len, 0);
|
||||
rc = kernel_recvmsg(socket_p, &msg, &iov, 1, iov.iov_len, 0);
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
int sendto(SOCKET socket_p, const char* buf, int len, int flags, const struct sockaddr *to, int tolen)
|
||||
int sendto(SOCKET socket_p, const char *buf, int len, int flags,
|
||||
const struct sockaddr *to, int tolen)
|
||||
{
|
||||
int rc;
|
||||
struct msghdr msg;
|
||||
struct kvec iov;
|
||||
int rc;
|
||||
struct msghdr msg;
|
||||
struct kvec iov;
|
||||
|
||||
msg.msg_control = NULL;
|
||||
msg.msg_controllen = 0;
|
||||
msg.msg_name = (struct sockaddr *)to; // will be struct sock_addr
|
||||
msg.msg_namelen = tolen;
|
||||
msg.msg_flags = 0;
|
||||
iov.iov_len = len;
|
||||
iov.iov_base = (char *)buf;
|
||||
msg.msg_control = NULL;
|
||||
msg.msg_controllen = 0;
|
||||
msg.msg_name = (struct sockaddr *)to; // will be struct sock_addr
|
||||
msg.msg_namelen = tolen;
|
||||
msg.msg_flags = 0;
|
||||
iov.iov_len = len;
|
||||
iov.iov_base = (char *)buf;
|
||||
|
||||
rc = kernel_sendmsg(socket_p, &msg, &iov, 1, len);
|
||||
rc = kernel_sendmsg(socket_p, &msg, &iov, 1, len);
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -91,27 +91,25 @@
|
||||
// const defines
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#define TIMER_COUNT 2 /* max 15 timers selectable */
|
||||
#define TIMER_MIN_VAL_SINGLE 5000 /* min 5us */
|
||||
#define TIMER_MIN_VAL_CYCLE 100000 /* min 100us */
|
||||
#define TIMER_COUNT 2 /* max 15 timers selectable */
|
||||
#define TIMER_MIN_VAL_SINGLE 5000 /* min 5us */
|
||||
#define TIMER_MIN_VAL_CYCLE 100000 /* min 100us */
|
||||
|
||||
#define PROVE_OVERRUN
|
||||
|
||||
|
||||
#ifndef CONFIG_HIGH_RES_TIMERS
|
||||
#error "Kernel symbol CONFIG_HIGH_RES_TIMERS is required."
|
||||
#error "Kernel symbol CONFIG_HIGH_RES_TIMERS is required."
|
||||
#endif
|
||||
|
||||
|
||||
// TracePoint support for realtime-debugging
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
void PUBLIC TgtDbgSignalTracePoint (BYTE bTracePointNumber_p);
|
||||
void PUBLIC TgtDbgPostTraceValue (DWORD dwTraceValue_p);
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
|
||||
void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p);
|
||||
void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p);
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
|
||||
#else
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v)
|
||||
#define TGT_DBG_SIGNAL_TRACE_POINT(p)
|
||||
#define TGT_DBG_POST_TRACE_VALUE(v)
|
||||
#endif
|
||||
#define HRT_DBG_POST_TRACE_VALUE(Event_p, uiNodeId_p, wErrorCode_p) \
|
||||
TGT_DBG_POST_TRACE_VALUE((0xE << 28) | (Event_p << 24) \
|
||||
@@ -128,19 +126,17 @@
|
||||
// modul global types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tEplTimerEventArg m_EventArg;
|
||||
tEplTimerkCallback m_pfnCallback;
|
||||
struct hrtimer m_Timer;
|
||||
BOOL m_fContinuously;
|
||||
unsigned long long m_ullPeriod;
|
||||
typedef struct {
|
||||
tEplTimerEventArg m_EventArg;
|
||||
tEplTimerkCallback m_pfnCallback;
|
||||
struct hrtimer m_Timer;
|
||||
BOOL m_fContinuously;
|
||||
unsigned long long m_ullPeriod;
|
||||
|
||||
} tEplTimerHighReskTimerInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tEplTimerHighReskTimerInfo m_aTimerInfo[TIMER_COUNT];
|
||||
typedef struct {
|
||||
tEplTimerHighReskTimerInfo m_aTimerInfo[TIMER_COUNT];
|
||||
|
||||
} tEplTimerHighReskInstance;
|
||||
|
||||
@@ -148,13 +144,13 @@ typedef struct
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static tEplTimerHighReskInstance EplTimerHighReskInstance_l;
|
||||
static tEplTimerHighReskInstance EplTimerHighReskInstance_l;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
enum hrtimer_restart EplTimerHighReskCallback (struct hrtimer* pTimer_p);
|
||||
enum hrtimer_restart EplTimerHighReskCallback(struct hrtimer *pTimer_p);
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
@@ -162,7 +158,6 @@ enum hrtimer_restart EplTimerHighReskCallback (struct hrtimer* pTimer_p);
|
||||
// //
|
||||
//=========================================================================//
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimerHighReskInit()
|
||||
@@ -179,15 +174,14 @@ enum hrtimer_restart EplTimerHighReskCallback (struct hrtimer* pTimer_p);
|
||||
|
||||
tEplKernel PUBLIC EplTimerHighReskInit(void)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
tEplKernel Ret;
|
||||
|
||||
Ret = EplTimerHighReskAddInstance();
|
||||
Ret = EplTimerHighReskAddInstance();
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimerHighReskAddInstance()
|
||||
@@ -204,45 +198,45 @@ tEplKernel Ret;
|
||||
|
||||
tEplKernel PUBLIC EplTimerHighReskAddInstance(void)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiIndex;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiIndex;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
EPL_MEMSET(&EplTimerHighReskInstance_l, 0, sizeof (EplTimerHighReskInstance_l));
|
||||
EPL_MEMSET(&EplTimerHighReskInstance_l, 0,
|
||||
sizeof(EplTimerHighReskInstance_l));
|
||||
|
||||
#ifndef CONFIG_HIGH_RES_TIMERS
|
||||
printk("EplTimerHighResk: Kernel symbol CONFIG_HIGH_RES_TIMERS is required.\n");
|
||||
Ret = kEplNoResource;
|
||||
return Ret;
|
||||
printk
|
||||
("EplTimerHighResk: Kernel symbol CONFIG_HIGH_RES_TIMERS is required.\n");
|
||||
Ret = kEplNoResource;
|
||||
return Ret;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize hrtimer structures for all usable timers.
|
||||
*/
|
||||
for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++)
|
||||
{
|
||||
tEplTimerHighReskTimerInfo* pTimerInfo;
|
||||
struct hrtimer* pTimer;
|
||||
/*
|
||||
* Initialize hrtimer structures for all usable timers.
|
||||
*/
|
||||
for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++) {
|
||||
tEplTimerHighReskTimerInfo *pTimerInfo;
|
||||
struct hrtimer *pTimer;
|
||||
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
|
||||
pTimer = &pTimerInfo->m_Timer;
|
||||
hrtimer_init(pTimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
|
||||
pTimer = &pTimerInfo->m_Timer;
|
||||
hrtimer_init(pTimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
|
||||
pTimer->function = EplTimerHighReskCallback;
|
||||
pTimer->function = EplTimerHighReskCallback;
|
||||
|
||||
/*
|
||||
* We use HRTIMER_CB_SOFTIRQ here.
|
||||
* HRTIMER_CB_IRQSAFE is critical as the callback function
|
||||
* would be called with IRQs disabled.
|
||||
*/
|
||||
pTimer->cb_mode = HRTIMER_CB_SOFTIRQ;
|
||||
}
|
||||
/*
|
||||
* We use HRTIMER_CB_SOFTIRQ here.
|
||||
* HRTIMER_CB_IRQSAFE is critical as the callback function
|
||||
* would be called with IRQs disabled.
|
||||
*/
|
||||
pTimer->cb_mode = HRTIMER_CB_SOFTIRQ;
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimerHighReskDelInstance()
|
||||
@@ -259,30 +253,28 @@ unsigned int uiIndex;
|
||||
|
||||
tEplKernel PUBLIC EplTimerHighReskDelInstance(void)
|
||||
{
|
||||
tEplTimerHighReskTimerInfo* pTimerInfo;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo *pTimerInfo;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiIndex;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++)
|
||||
{
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[0];
|
||||
pTimerInfo->m_pfnCallback = NULL;
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = 0;
|
||||
/*
|
||||
* In this case we can not just try to cancel the timer.
|
||||
* We actually have to wait until its callback function
|
||||
* has returned.
|
||||
*/
|
||||
hrtimer_cancel(&pTimerInfo->m_Timer);
|
||||
}
|
||||
for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++) {
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[0];
|
||||
pTimerInfo->m_pfnCallback = NULL;
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = 0;
|
||||
/*
|
||||
* In this case we can not just try to cancel the timer.
|
||||
* We actually have to wait until its callback function
|
||||
* has returned.
|
||||
*/
|
||||
hrtimer_cancel(&pTimerInfo->m_Timer);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimerHighReskModifyTimerNs()
|
||||
@@ -313,96 +305,89 @@ unsigned int uiIndex;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplTimerHighReskModifyTimerNs(tEplTimerHdl* pTimerHdl_p,
|
||||
unsigned long long ullTimeNs_p,
|
||||
tEplTimerkCallback pfnCallback_p,
|
||||
unsigned long ulArgument_p,
|
||||
BOOL fContinuously_p)
|
||||
tEplKernel PUBLIC EplTimerHighReskModifyTimerNs(tEplTimerHdl * pTimerHdl_p,
|
||||
unsigned long long ullTimeNs_p,
|
||||
tEplTimerkCallback
|
||||
pfnCallback_p,
|
||||
unsigned long ulArgument_p,
|
||||
BOOL fContinuously_p)
|
||||
{
|
||||
tEplKernel Ret;
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo* pTimerInfo;
|
||||
ktime_t RelTime;
|
||||
tEplKernel Ret;
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo *pTimerInfo;
|
||||
ktime_t RelTime;
|
||||
|
||||
Ret = kEplSuccessful;
|
||||
Ret = kEplSuccessful;
|
||||
|
||||
// check pointer to handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check pointer to handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (*pTimerHdl_p == 0)
|
||||
{ // no timer created yet
|
||||
if (*pTimerHdl_p == 0) { // no timer created yet
|
||||
|
||||
// search free timer info structure
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[0];
|
||||
for (uiIndex = 0; uiIndex < TIMER_COUNT; uiIndex++, pTimerInfo++)
|
||||
{
|
||||
if (pTimerInfo->m_EventArg.m_TimerHdl == 0)
|
||||
{ // free structure found
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (uiIndex >= TIMER_COUNT)
|
||||
{ // no free structure found
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// search free timer info structure
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[0];
|
||||
for (uiIndex = 0; uiIndex < TIMER_COUNT;
|
||||
uiIndex++, pTimerInfo++) {
|
||||
if (pTimerInfo->m_EventArg.m_TimerHdl == 0) { // free structure found
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (uiIndex >= TIMER_COUNT) { // no free structure found
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = HDL_INIT(uiIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
uiIndex = HDL_TO_IDX(*pTimerHdl_p);
|
||||
if (uiIndex >= TIMER_COUNT)
|
||||
{ // invalid handle
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = HDL_INIT(uiIndex);
|
||||
} else {
|
||||
uiIndex = HDL_TO_IDX(*pTimerHdl_p);
|
||||
if (uiIndex >= TIMER_COUNT) { // invalid handle
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
|
||||
}
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
|
||||
}
|
||||
|
||||
/*
|
||||
* increment timer handle
|
||||
* (if timer expires right after this statement, the user
|
||||
* would detect an unknown timer handle and discard it)
|
||||
*/
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = HDL_INC(pTimerInfo->m_EventArg.m_TimerHdl);
|
||||
*pTimerHdl_p = pTimerInfo->m_EventArg.m_TimerHdl;
|
||||
/*
|
||||
* increment timer handle
|
||||
* (if timer expires right after this statement, the user
|
||||
* would detect an unknown timer handle and discard it)
|
||||
*/
|
||||
pTimerInfo->m_EventArg.m_TimerHdl =
|
||||
HDL_INC(pTimerInfo->m_EventArg.m_TimerHdl);
|
||||
*pTimerHdl_p = pTimerInfo->m_EventArg.m_TimerHdl;
|
||||
|
||||
// reject too small time values
|
||||
if ( (fContinuously_p && (ullTimeNs_p < TIMER_MIN_VAL_CYCLE))
|
||||
|| (!fContinuously_p && (ullTimeNs_p < TIMER_MIN_VAL_SINGLE)) )
|
||||
{
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
// reject too small time values
|
||||
if ((fContinuously_p && (ullTimeNs_p < TIMER_MIN_VAL_CYCLE))
|
||||
|| (!fContinuously_p && (ullTimeNs_p < TIMER_MIN_VAL_SINGLE))) {
|
||||
Ret = kEplTimerNoTimerCreated;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
pTimerInfo->m_EventArg.m_ulArg = ulArgument_p;
|
||||
pTimerInfo->m_pfnCallback = pfnCallback_p;
|
||||
pTimerInfo->m_fContinuously = fContinuously_p;
|
||||
pTimerInfo->m_ullPeriod = ullTimeNs_p;
|
||||
pTimerInfo->m_EventArg.m_ulArg = ulArgument_p;
|
||||
pTimerInfo->m_pfnCallback = pfnCallback_p;
|
||||
pTimerInfo->m_fContinuously = fContinuously_p;
|
||||
pTimerInfo->m_ullPeriod = ullTimeNs_p;
|
||||
|
||||
/*
|
||||
* HRTIMER_MODE_REL does not influence general handling of this timer.
|
||||
* It only sets relative mode for this start operation.
|
||||
* -> Expire time is calculated by: Now + RelTime
|
||||
* hrtimer_start also skips pending timer events.
|
||||
* The state HRTIMER_STATE_CALLBACK is ignored.
|
||||
* We have to cope with that in our callback function.
|
||||
*/
|
||||
RelTime = ktime_add_ns(ktime_set(0,0), ullTimeNs_p);
|
||||
hrtimer_start(&pTimerInfo->m_Timer, RelTime, HRTIMER_MODE_REL);
|
||||
/*
|
||||
* HRTIMER_MODE_REL does not influence general handling of this timer.
|
||||
* It only sets relative mode for this start operation.
|
||||
* -> Expire time is calculated by: Now + RelTime
|
||||
* hrtimer_start also skips pending timer events.
|
||||
* The state HRTIMER_STATE_CALLBACK is ignored.
|
||||
* We have to cope with that in our callback function.
|
||||
*/
|
||||
RelTime = ktime_add_ns(ktime_set(0, 0), ullTimeNs_p);
|
||||
hrtimer_start(&pTimerInfo->m_Timer, RelTime, HRTIMER_MODE_REL);
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimerHighReskDeleteTimer()
|
||||
@@ -418,64 +403,56 @@ ktime_t RelTime;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
tEplKernel PUBLIC EplTimerHighReskDeleteTimer(tEplTimerHdl* pTimerHdl_p)
|
||||
tEplKernel PUBLIC EplTimerHighReskDeleteTimer(tEplTimerHdl * pTimerHdl_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo* pTimerInfo;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo *pTimerInfo;
|
||||
|
||||
// check pointer to handle
|
||||
if(pTimerHdl_p == NULL)
|
||||
{
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
// check pointer to handle
|
||||
if (pTimerHdl_p == NULL) {
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (*pTimerHdl_p == 0)
|
||||
{ // no timer created yet
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
uiIndex = HDL_TO_IDX(*pTimerHdl_p);
|
||||
if (uiIndex >= TIMER_COUNT)
|
||||
{ // invalid handle
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
|
||||
if (pTimerInfo->m_EventArg.m_TimerHdl != *pTimerHdl_p)
|
||||
{ // invalid handle
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
if (*pTimerHdl_p == 0) { // no timer created yet
|
||||
goto Exit;
|
||||
} else {
|
||||
uiIndex = HDL_TO_IDX(*pTimerHdl_p);
|
||||
if (uiIndex >= TIMER_COUNT) { // invalid handle
|
||||
Ret = kEplTimerInvalidHandle;
|
||||
goto Exit;
|
||||
}
|
||||
pTimerInfo = &EplTimerHighReskInstance_l.m_aTimerInfo[uiIndex];
|
||||
if (pTimerInfo->m_EventArg.m_TimerHdl != *pTimerHdl_p) { // invalid handle
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
*pTimerHdl_p = 0;
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = 0;
|
||||
pTimerInfo->m_pfnCallback = NULL;
|
||||
*pTimerHdl_p = 0;
|
||||
pTimerInfo->m_EventArg.m_TimerHdl = 0;
|
||||
pTimerInfo->m_pfnCallback = NULL;
|
||||
|
||||
/*
|
||||
* Three return cases of hrtimer_try_to_cancel have to be tracked:
|
||||
* 1 - timer has been removed
|
||||
* 0 - timer was not active
|
||||
* We need not do anything. hrtimer timers just consist of
|
||||
* a hrtimer struct, which we might enqueue in the hrtimers
|
||||
* event list by calling hrtimer_start().
|
||||
* If a timer is not enqueued, it is not present in hrtimers.
|
||||
* -1 - callback function is running
|
||||
* In this case we have to ensure that the timer is not
|
||||
* continuously restarted. This has been done by clearing
|
||||
* its handle.
|
||||
*/
|
||||
hrtimer_try_to_cancel(&pTimerInfo->m_Timer);
|
||||
/*
|
||||
* Three return cases of hrtimer_try_to_cancel have to be tracked:
|
||||
* 1 - timer has been removed
|
||||
* 0 - timer was not active
|
||||
* We need not do anything. hrtimer timers just consist of
|
||||
* a hrtimer struct, which we might enqueue in the hrtimers
|
||||
* event list by calling hrtimer_start().
|
||||
* If a timer is not enqueued, it is not present in hrtimers.
|
||||
* -1 - callback function is running
|
||||
* In this case we have to ensure that the timer is not
|
||||
* continuously restarted. This has been done by clearing
|
||||
* its handle.
|
||||
*/
|
||||
hrtimer_try_to_cancel(&pTimerInfo->m_Timer);
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: EplTimerHighReskCallback()
|
||||
@@ -490,66 +467,63 @@ tEplTimerHighReskTimerInfo* pTimerInfo;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
enum hrtimer_restart EplTimerHighReskCallback (struct hrtimer* pTimer_p)
|
||||
enum hrtimer_restart EplTimerHighReskCallback(struct hrtimer *pTimer_p)
|
||||
{
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo* pTimerInfo;
|
||||
tEplTimerHdl OrgTimerHdl;
|
||||
enum hrtimer_restart Ret;
|
||||
unsigned int uiIndex;
|
||||
tEplTimerHighReskTimerInfo *pTimerInfo;
|
||||
tEplTimerHdl OrgTimerHdl;
|
||||
enum hrtimer_restart Ret;
|
||||
|
||||
BENCHMARK_MOD_24_SET(4);
|
||||
BENCHMARK_MOD_24_SET(4);
|
||||
|
||||
Ret = HRTIMER_NORESTART;
|
||||
pTimerInfo = container_of(pTimer_p, tEplTimerHighReskTimerInfo, m_Timer);
|
||||
uiIndex = HDL_TO_IDX(pTimerInfo->m_EventArg.m_TimerHdl);
|
||||
if (uiIndex >= TIMER_COUNT)
|
||||
{ // invalid handle
|
||||
goto Exit;
|
||||
}
|
||||
Ret = HRTIMER_NORESTART;
|
||||
pTimerInfo =
|
||||
container_of(pTimer_p, tEplTimerHighReskTimerInfo, m_Timer);
|
||||
uiIndex = HDL_TO_IDX(pTimerInfo->m_EventArg.m_TimerHdl);
|
||||
if (uiIndex >= TIMER_COUNT) { // invalid handle
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* We store the timer handle before calling the callback function
|
||||
* as the timer can be modified inside it.
|
||||
*/
|
||||
OrgTimerHdl = pTimerInfo->m_EventArg.m_TimerHdl;
|
||||
/*
|
||||
* We store the timer handle before calling the callback function
|
||||
* as the timer can be modified inside it.
|
||||
*/
|
||||
OrgTimerHdl = pTimerInfo->m_EventArg.m_TimerHdl;
|
||||
|
||||
if (pTimerInfo->m_pfnCallback != NULL)
|
||||
{
|
||||
pTimerInfo->m_pfnCallback(&pTimerInfo->m_EventArg);
|
||||
}
|
||||
if (pTimerInfo->m_pfnCallback != NULL) {
|
||||
pTimerInfo->m_pfnCallback(&pTimerInfo->m_EventArg);
|
||||
}
|
||||
|
||||
if (pTimerInfo->m_fContinuously)
|
||||
{
|
||||
ktime_t Interval;
|
||||
if (pTimerInfo->m_fContinuously) {
|
||||
ktime_t Interval;
|
||||
#ifdef PROVE_OVERRUN
|
||||
ktime_t Now;
|
||||
unsigned long Overruns;
|
||||
ktime_t Now;
|
||||
unsigned long Overruns;
|
||||
#endif
|
||||
|
||||
if (OrgTimerHdl != pTimerInfo->m_EventArg.m_TimerHdl)
|
||||
{
|
||||
/* modified timer has already been restarted */
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (OrgTimerHdl != pTimerInfo->m_EventArg.m_TimerHdl) {
|
||||
/* modified timer has already been restarted */
|
||||
goto Exit;
|
||||
}
|
||||
#ifdef PROVE_OVERRUN
|
||||
Now = ktime_get();
|
||||
Interval = ktime_add_ns(ktime_set(0,0), pTimerInfo->m_ullPeriod);
|
||||
Overruns = hrtimer_forward(pTimer_p, Now, Interval);
|
||||
if (Overruns > 1)
|
||||
{
|
||||
printk("EplTimerHighResk: Continuous timer (handle 0x%lX) had to skip %lu interval(s)!\n", pTimerInfo->m_EventArg.m_TimerHdl, Overruns-1);
|
||||
}
|
||||
Now = ktime_get();
|
||||
Interval =
|
||||
ktime_add_ns(ktime_set(0, 0), pTimerInfo->m_ullPeriod);
|
||||
Overruns = hrtimer_forward(pTimer_p, Now, Interval);
|
||||
if (Overruns > 1) {
|
||||
printk
|
||||
("EplTimerHighResk: Continuous timer (handle 0x%lX) had to skip %lu interval(s)!\n",
|
||||
pTimerInfo->m_EventArg.m_TimerHdl, Overruns - 1);
|
||||
}
|
||||
#else
|
||||
pTimer_p->expires = ktime_add_ns(pTimer_p->expires,
|
||||
pTimerInfo->m_ullPeriod);
|
||||
pTimer_p->expires = ktime_add_ns(pTimer_p->expires,
|
||||
pTimerInfo->m_ullPeriod);
|
||||
#endif
|
||||
|
||||
Ret = HRTIMER_RESTART;
|
||||
}
|
||||
Ret = HRTIMER_RESTART;
|
||||
}
|
||||
|
||||
Exit:
|
||||
BENCHMARK_MOD_24_RESET(4);
|
||||
return Ret;
|
||||
Exit:
|
||||
BENCHMARK_MOD_24_RESET(4);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
|
||||
Build Environment:
|
||||
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Revision History:
|
||||
@@ -75,7 +74,6 @@
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
@@ -93,13 +91,12 @@
|
||||
#include <linux/udp.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h> /* for struct sk_buff */
|
||||
#include <linux/skbuff.h> /* for struct sk_buff */
|
||||
|
||||
#include "kernel/VirtualEthernet.h"
|
||||
#include "kernel/EplDllkCal.h"
|
||||
#include "kernel/EplDllk.h"
|
||||
|
||||
|
||||
#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
|
||||
|
||||
/***************************************************************************/
|
||||
@@ -110,28 +107,24 @@
|
||||
/* */
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// const defines
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifndef EPL_VETH_TX_TIMEOUT
|
||||
//#define EPL_VETH_TX_TIMEOUT (2*HZ)
|
||||
#define EPL_VETH_TX_TIMEOUT 0 // d.k.: we use no timeout
|
||||
#define EPL_VETH_TX_TIMEOUT 0 // d.k.: we use no timeout
|
||||
#endif
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// modul globale vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static struct net_device * pVEthNetDevice_g = NULL;
|
||||
static struct net_device *pVEthNetDevice_g = NULL;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
@@ -140,11 +133,10 @@ static struct net_device * pVEthNetDevice_g = NULL;
|
||||
static int VEthOpen(struct net_device *pNetDevice_p);
|
||||
static int VEthClose(struct net_device *pNetDevice_p);
|
||||
static int VEthXmit(struct sk_buff *pSkb_p, struct net_device *pNetDevice_p);
|
||||
static struct net_device_stats* VEthGetStats(struct net_device *pNetDevice_p);
|
||||
static struct net_device_stats *VEthGetStats(struct net_device *pNetDevice_p);
|
||||
static void VEthTimeout(struct net_device *pNetDevice_p);
|
||||
static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p);
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -171,188 +163,182 @@ static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p);
|
||||
|
||||
static int VEthOpen(struct net_device *pNetDevice_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
//open the device
|
||||
//open the device
|
||||
// struct net_device_stats* pStats = (struct net_device_stats*)pNetDevice_p->priv;
|
||||
|
||||
//start the interface queue for the network subsystem
|
||||
netif_start_queue(pNetDevice_p);
|
||||
//start the interface queue for the network subsystem
|
||||
netif_start_queue(pNetDevice_p);
|
||||
|
||||
// register callback function in DLL
|
||||
Ret = EplDllkRegAsyncHandler(VEthRecvFrame);
|
||||
// register callback function in DLL
|
||||
Ret = EplDllkRegAsyncHandler(VEthRecvFrame);
|
||||
|
||||
EPL_DBGLVL_VETH_TRACE1("VEthOpen: EplDllkRegAsyncHandler returned 0x%02X\n", Ret);
|
||||
EPL_DBGLVL_VETH_TRACE1
|
||||
("VEthOpen: EplDllkRegAsyncHandler returned 0x%02X\n", Ret);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int VEthClose(struct net_device *pNetDevice_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthClose\n");
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthClose\n");
|
||||
|
||||
Ret = EplDllkDeregAsyncHandler(VEthRecvFrame);
|
||||
Ret = EplDllkDeregAsyncHandler(VEthRecvFrame);
|
||||
|
||||
//stop the interface queue for the network subsystem
|
||||
netif_stop_queue(pNetDevice_p);
|
||||
return 0;
|
||||
//stop the interface queue for the network subsystem
|
||||
netif_stop_queue(pNetDevice_p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int VEthXmit(struct sk_buff *pSkb_p, struct net_device *pNetDevice_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplFrameInfo FrameInfo;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplFrameInfo FrameInfo;
|
||||
|
||||
//transmit function
|
||||
struct net_device_stats* pStats = (struct net_device_stats*)pNetDevice_p->priv;
|
||||
//transmit function
|
||||
struct net_device_stats *pStats =
|
||||
(struct net_device_stats *)pNetDevice_p->priv;
|
||||
|
||||
//save timestemp
|
||||
pNetDevice_p->trans_start = jiffies;
|
||||
//save timestemp
|
||||
pNetDevice_p->trans_start = jiffies;
|
||||
|
||||
FrameInfo.m_pFrame = (tEplFrame *)pSkb_p->data;
|
||||
FrameInfo.m_uiFrameSize = pSkb_p->len;
|
||||
FrameInfo.m_pFrame = (tEplFrame *) pSkb_p->data;
|
||||
FrameInfo.m_uiFrameSize = pSkb_p->len;
|
||||
|
||||
//call send fkt on DLL
|
||||
Ret = EplDllkCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric);
|
||||
if (Ret != kEplSuccessful)
|
||||
{
|
||||
EPL_DBGLVL_VETH_TRACE1("VEthXmit: EplDllkCalAsyncSend returned 0x%02X\n", Ret);
|
||||
netif_stop_queue(pNetDevice_p);
|
||||
goto Exit;
|
||||
}
|
||||
else
|
||||
{
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthXmit: frame passed to DLL\n");
|
||||
dev_kfree_skb(pSkb_p);
|
||||
//call send fkt on DLL
|
||||
Ret = EplDllkCalAsyncSend(&FrameInfo, kEplDllAsyncReqPrioGeneric);
|
||||
if (Ret != kEplSuccessful) {
|
||||
EPL_DBGLVL_VETH_TRACE1
|
||||
("VEthXmit: EplDllkCalAsyncSend returned 0x%02X\n", Ret);
|
||||
netif_stop_queue(pNetDevice_p);
|
||||
goto Exit;
|
||||
} else {
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthXmit: frame passed to DLL\n");
|
||||
dev_kfree_skb(pSkb_p);
|
||||
|
||||
//set stats for the device
|
||||
pStats->tx_packets++;
|
||||
pStats->tx_bytes += FrameInfo.m_uiFrameSize;
|
||||
}
|
||||
//set stats for the device
|
||||
pStats->tx_packets++;
|
||||
pStats->tx_bytes += FrameInfo.m_uiFrameSize;
|
||||
}
|
||||
|
||||
Exit:
|
||||
return 0;
|
||||
Exit:
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static struct net_device_stats* VEthGetStats(struct net_device *pNetDevice_p)
|
||||
static struct net_device_stats *VEthGetStats(struct net_device *pNetDevice_p)
|
||||
{
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthGetStats\n");
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthGetStats\n");
|
||||
|
||||
return (struct net_device_stats *)pNetDevice_p->priv;
|
||||
return (struct net_device_stats *)pNetDevice_p->priv;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void VEthTimeout(struct net_device *pNetDevice_p)
|
||||
{
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthTimeout(\n");
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthTimeout(\n");
|
||||
|
||||
// $$$ d.k.: move to extra function, which is called by DLL when new space is available in TxFifo
|
||||
if (netif_queue_stopped (pNetDevice_p))
|
||||
{
|
||||
netif_wake_queue (pNetDevice_p);
|
||||
}
|
||||
// $$$ d.k.: move to extra function, which is called by DLL when new space is available in TxFifo
|
||||
if (netif_queue_stopped(pNetDevice_p)) {
|
||||
netif_wake_queue(pNetDevice_p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static tEplKernel VEthRecvFrame(tEplFrameInfo * pFrameInfo_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
struct net_device* pNetDevice = pVEthNetDevice_g;
|
||||
struct net_device_stats* pStats = (struct net_device_stats*)pNetDevice->priv;
|
||||
struct sk_buff *pSkb;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
struct net_device *pNetDevice = pVEthNetDevice_g;
|
||||
struct net_device_stats *pStats =
|
||||
(struct net_device_stats *)pNetDevice->priv;
|
||||
struct sk_buff *pSkb;
|
||||
|
||||
EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: FrameSize=%u\n", pFrameInfo_p->m_uiFrameSize);
|
||||
EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: FrameSize=%u\n",
|
||||
pFrameInfo_p->m_uiFrameSize);
|
||||
|
||||
pSkb = dev_alloc_skb(pFrameInfo_p->m_uiFrameSize + 2);
|
||||
if (pSkb == NULL)
|
||||
{
|
||||
pStats->rx_dropped++;
|
||||
goto Exit;
|
||||
}
|
||||
pSkb->dev = pNetDevice;
|
||||
pSkb = dev_alloc_skb(pFrameInfo_p->m_uiFrameSize + 2);
|
||||
if (pSkb == NULL) {
|
||||
pStats->rx_dropped++;
|
||||
goto Exit;
|
||||
}
|
||||
pSkb->dev = pNetDevice;
|
||||
|
||||
skb_reserve(pSkb, 2);
|
||||
skb_reserve(pSkb, 2);
|
||||
|
||||
memcpy((void *)skb_put(pSkb, pFrameInfo_p->m_uiFrameSize), pFrameInfo_p->m_pFrame, pFrameInfo_p->m_uiFrameSize);
|
||||
memcpy((void *)skb_put(pSkb, pFrameInfo_p->m_uiFrameSize),
|
||||
pFrameInfo_p->m_pFrame, pFrameInfo_p->m_uiFrameSize);
|
||||
|
||||
pSkb->protocol = eth_type_trans(pSkb, pNetDevice);
|
||||
pSkb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
pSkb->protocol = eth_type_trans(pSkb, pNetDevice);
|
||||
pSkb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
// call netif_rx with skb
|
||||
netif_rx(pSkb);
|
||||
// call netif_rx with skb
|
||||
netif_rx(pSkb);
|
||||
|
||||
EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: SrcMAC=0x%llx\n", AmiGetQword48FromBe(pFrameInfo_p->m_pFrame->m_be_abSrcMac));
|
||||
EPL_DBGLVL_VETH_TRACE1("VEthRecvFrame: SrcMAC=0x%llx\n",
|
||||
AmiGetQword48FromBe(pFrameInfo_p->m_pFrame->
|
||||
m_be_abSrcMac));
|
||||
|
||||
// update receive statistics
|
||||
pStats->rx_packets++;
|
||||
pStats->rx_bytes += pFrameInfo_p->m_uiFrameSize;
|
||||
// update receive statistics
|
||||
pStats->rx_packets++;
|
||||
pStats->rx_bytes += pFrameInfo_p->m_uiFrameSize;
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
tEplKernel PUBLIC VEthAddInstance(tEplDllkInitParam * pInitParam_p)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
// allocate net device structure with priv pointing to stats structure
|
||||
pVEthNetDevice_g = alloc_netdev(sizeof (struct net_device_stats), EPL_VETH_NAME, ether_setup);
|
||||
// allocate net device structure with priv pointing to stats structure
|
||||
pVEthNetDevice_g =
|
||||
alloc_netdev(sizeof(struct net_device_stats), EPL_VETH_NAME,
|
||||
ether_setup);
|
||||
// pVEthNetDevice_g = alloc_etherdev(sizeof (struct net_device_stats));
|
||||
|
||||
if (pVEthNetDevice_g == NULL)
|
||||
{
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
if (pVEthNetDevice_g == NULL) {
|
||||
Ret = kEplNoResource;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
pVEthNetDevice_g->open = VEthOpen;
|
||||
pVEthNetDevice_g->stop = VEthClose;
|
||||
pVEthNetDevice_g->get_stats = VEthGetStats;
|
||||
pVEthNetDevice_g->hard_start_xmit = VEthXmit;
|
||||
pVEthNetDevice_g->tx_timeout = VEthTimeout;
|
||||
pVEthNetDevice_g->watchdog_timeo = EPL_VETH_TX_TIMEOUT;
|
||||
pVEthNetDevice_g->destructor = free_netdev;
|
||||
pVEthNetDevice_g->open = VEthOpen;
|
||||
pVEthNetDevice_g->stop = VEthClose;
|
||||
pVEthNetDevice_g->get_stats = VEthGetStats;
|
||||
pVEthNetDevice_g->hard_start_xmit = VEthXmit;
|
||||
pVEthNetDevice_g->tx_timeout = VEthTimeout;
|
||||
pVEthNetDevice_g->watchdog_timeo = EPL_VETH_TX_TIMEOUT;
|
||||
pVEthNetDevice_g->destructor = free_netdev;
|
||||
|
||||
// copy own MAC address to net device structure
|
||||
memcpy(pVEthNetDevice_g->dev_addr, pInitParam_p->m_be_abSrcMac, 6);
|
||||
// copy own MAC address to net device structure
|
||||
memcpy(pVEthNetDevice_g->dev_addr, pInitParam_p->m_be_abSrcMac, 6);
|
||||
|
||||
//register VEth to the network subsystem
|
||||
if (register_netdev(pVEthNetDevice_g))
|
||||
{
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthAddInstance: Could not register VEth...\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
EPL_DBGLVL_VETH_TRACE0("VEthAddInstance: Register VEth successfull...\n");
|
||||
}
|
||||
//register VEth to the network subsystem
|
||||
if (register_netdev(pVEthNetDevice_g)) {
|
||||
EPL_DBGLVL_VETH_TRACE0
|
||||
("VEthAddInstance: Could not register VEth...\n");
|
||||
} else {
|
||||
EPL_DBGLVL_VETH_TRACE0
|
||||
("VEthAddInstance: Register VEth successfull...\n");
|
||||
}
|
||||
|
||||
Exit:
|
||||
return Ret;
|
||||
Exit:
|
||||
return Ret;
|
||||
}
|
||||
|
||||
|
||||
tEplKernel PUBLIC VEthDelInstance(void)
|
||||
{
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
tEplKernel Ret = kEplSuccessful;
|
||||
|
||||
if (pVEthNetDevice_g != NULL)
|
||||
{
|
||||
//unregister VEth from the network subsystem
|
||||
unregister_netdev(pVEthNetDevice_g);
|
||||
// destructor was set to free_netdev,
|
||||
// so we do not need to call free_netdev here
|
||||
pVEthNetDevice_g = NULL;
|
||||
}
|
||||
if (pVEthNetDevice_g != NULL) {
|
||||
//unregister VEth from the network subsystem
|
||||
unregister_netdev(pVEthNetDevice_g);
|
||||
// destructor was set to free_netdev,
|
||||
// so we do not need to call free_netdev here
|
||||
pVEthNetDevice_g = NULL;
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return Ret;
|
||||
}
|
||||
|
||||
#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_VETH)) != 0)
|
||||
|
||||
@@ -80,25 +80,21 @@
|
||||
// typedef
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
WORD m_wWord;
|
||||
typedef struct {
|
||||
WORD m_wWord;
|
||||
|
||||
} twStruct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD m_dwDword;
|
||||
typedef struct {
|
||||
DWORD m_dwDword;
|
||||
|
||||
} tdwStruct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
QWORD m_qwQword;
|
||||
typedef struct {
|
||||
QWORD m_qwQword;
|
||||
|
||||
} tqwStruct;
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -131,46 +127,39 @@ void PUBLIC AmiSetByteToBe (void FAR* pAddr_p, BYTE bByteVal_p)
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
//------------< write WORD in big endian >--------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetWordToBe (void FAR* pAddr_p, WORD wWordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetWordToBe(void FAR * pAddr_p, WORD wWordVal_p)
|
||||
{
|
||||
twStruct FAR* pwStruct;
|
||||
twStruct wValue;
|
||||
twStruct FAR *pwStruct;
|
||||
twStruct wValue;
|
||||
|
||||
wValue.m_wWord = (WORD)((wWordVal_p & 0x00FF) << 8); //LSB to MSB
|
||||
wValue.m_wWord |= (WORD)((wWordVal_p & 0xFF00) >> 8); //MSB to LSB
|
||||
wValue.m_wWord = (WORD) ((wWordVal_p & 0x00FF) << 8); //LSB to MSB
|
||||
wValue.m_wWord |= (WORD) ((wWordVal_p & 0xFF00) >> 8); //MSB to LSB
|
||||
|
||||
pwStruct = (twStruct FAR*)pAddr_p;
|
||||
pwStruct->m_wWord = wValue.m_wWord;
|
||||
pwStruct = (twStruct FAR *) pAddr_p;
|
||||
pwStruct->m_wWord = wValue.m_wWord;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//------------< write DWORD in big endian >-------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDwordToBe (void FAR* pAddr_p, DWORD dwDwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDwordToBe(void FAR * pAddr_p,
|
||||
DWORD dwDwordVal_p)
|
||||
{
|
||||
tdwStruct FAR* pdwStruct;
|
||||
tdwStruct dwValue;
|
||||
tdwStruct FAR *pdwStruct;
|
||||
tdwStruct dwValue;
|
||||
|
||||
dwValue.m_dwDword = ((dwDwordVal_p & 0x000000FF) << 24); //LSB to MSB
|
||||
dwValue.m_dwDword |= ((dwDwordVal_p & 0x0000FF00) << 8);
|
||||
dwValue.m_dwDword |= ((dwDwordVal_p & 0x00FF0000) >> 8);
|
||||
dwValue.m_dwDword |= ((dwDwordVal_p & 0xFF000000) >> 24); //MSB to LSB
|
||||
|
||||
dwValue.m_dwDword = ((dwDwordVal_p & 0x000000FF)<<24); //LSB to MSB
|
||||
dwValue.m_dwDword|= ((dwDwordVal_p & 0x0000FF00)<<8);
|
||||
dwValue.m_dwDword|= ((dwDwordVal_p & 0x00FF0000)>>8 );
|
||||
dwValue.m_dwDword|= ((dwDwordVal_p & 0xFF000000)>>24); //MSB to LSB
|
||||
|
||||
pdwStruct = (tdwStruct FAR*)pAddr_p;
|
||||
pdwStruct->m_dwDword = dwValue.m_dwDword;
|
||||
pdwStruct = (tdwStruct FAR *) pAddr_p;
|
||||
pdwStruct->m_dwDword = dwValue.m_dwDword;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetXXXToLe()
|
||||
@@ -197,35 +186,29 @@ void PUBLIC AmiSetByteToLe (void FAR* pAddr_p, BYTE bByteVal_p)
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
//------------< write WORD in little endian >--------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetWordToLe (void FAR* pAddr_p, WORD wWordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetWordToLe(void FAR * pAddr_p, WORD wWordVal_p)
|
||||
{
|
||||
twStruct FAR* pwStruct;
|
||||
twStruct FAR *pwStruct;
|
||||
|
||||
pwStruct = (twStruct FAR*)pAddr_p;
|
||||
pwStruct->m_wWord = wWordVal_p;
|
||||
pwStruct = (twStruct FAR *) pAddr_p;
|
||||
pwStruct->m_wWord = wWordVal_p;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//------------< write DWORD in little endian >-------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDwordToLe (void FAR* pAddr_p, DWORD dwDwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDwordToLe(void FAR * pAddr_p,
|
||||
DWORD dwDwordVal_p)
|
||||
{
|
||||
tdwStruct FAR* pdwStruct;
|
||||
tdwStruct FAR *pdwStruct;
|
||||
|
||||
pdwStruct = (tdwStruct FAR*)pAddr_p;
|
||||
pdwStruct->m_dwDword = dwDwordVal_p;
|
||||
pdwStruct = (tdwStruct FAR *) pAddr_p;
|
||||
pdwStruct->m_dwDword = dwDwordVal_p;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetXXXFromBe()
|
||||
@@ -251,46 +234,40 @@ BYTE PUBLIC AmiGetByteFromBe (void FAR* pAddr_p)
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
//------------< read WORD in big endian >---------------------------
|
||||
|
||||
INLINE_FUNCTION WORD PUBLIC AmiGetWordFromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION WORD PUBLIC AmiGetWordFromBe(void FAR * pAddr_p)
|
||||
{
|
||||
twStruct FAR* pwStruct;
|
||||
twStruct wValue;
|
||||
twStruct FAR *pwStruct;
|
||||
twStruct wValue;
|
||||
|
||||
pwStruct = (twStruct FAR*)pAddr_p;
|
||||
pwStruct = (twStruct FAR *) pAddr_p;
|
||||
|
||||
wValue.m_wWord = (WORD)((pwStruct->m_wWord & 0x00FF) << 8); //LSB to MSB
|
||||
wValue.m_wWord |= (WORD)((pwStruct->m_wWord & 0xFF00) >> 8); //MSB to LSB
|
||||
wValue.m_wWord = (WORD) ((pwStruct->m_wWord & 0x00FF) << 8); //LSB to MSB
|
||||
wValue.m_wWord |= (WORD) ((pwStruct->m_wWord & 0xFF00) >> 8); //MSB to LSB
|
||||
|
||||
return ( wValue.m_wWord );
|
||||
return (wValue.m_wWord);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//------------< read DWORD in big endian >--------------------------
|
||||
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDwordFromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDwordFromBe(void FAR * pAddr_p)
|
||||
{
|
||||
tdwStruct FAR* pdwStruct;
|
||||
tdwStruct dwValue;
|
||||
tdwStruct FAR *pdwStruct;
|
||||
tdwStruct dwValue;
|
||||
|
||||
pdwStruct = (tdwStruct FAR*)pAddr_p;
|
||||
pdwStruct = (tdwStruct FAR *) pAddr_p;
|
||||
|
||||
dwValue.m_dwDword = ((pdwStruct->m_dwDword & 0x000000FF)<<24); //LSB to MSB
|
||||
dwValue.m_dwDword|= ((pdwStruct->m_dwDword & 0x0000FF00)<<8);
|
||||
dwValue.m_dwDword|= ((pdwStruct->m_dwDword & 0x00FF0000)>>8 );
|
||||
dwValue.m_dwDword|= ((pdwStruct->m_dwDword & 0xFF000000)>>24); //MSB to LSB
|
||||
dwValue.m_dwDword = ((pdwStruct->m_dwDword & 0x000000FF) << 24); //LSB to MSB
|
||||
dwValue.m_dwDword |= ((pdwStruct->m_dwDword & 0x0000FF00) << 8);
|
||||
dwValue.m_dwDword |= ((pdwStruct->m_dwDword & 0x00FF0000) >> 8);
|
||||
dwValue.m_dwDword |= ((pdwStruct->m_dwDword & 0xFF000000) >> 24); //MSB to LSB
|
||||
|
||||
return ( dwValue.m_dwDword );
|
||||
return (dwValue.m_dwDword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetXXXFromLe()
|
||||
@@ -316,34 +293,28 @@ BYTE PUBLIC AmiGetByteFromLe (void FAR* pAddr_p)
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
//------------< read WORD in little endian >---------------------------
|
||||
|
||||
INLINE_FUNCTION WORD PUBLIC AmiGetWordFromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION WORD PUBLIC AmiGetWordFromLe(void FAR * pAddr_p)
|
||||
{
|
||||
twStruct FAR* pwStruct;
|
||||
twStruct FAR *pwStruct;
|
||||
|
||||
pwStruct = (twStruct FAR*)pAddr_p;
|
||||
return ( pwStruct->m_wWord );
|
||||
pwStruct = (twStruct FAR *) pAddr_p;
|
||||
return (pwStruct->m_wWord);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//------------< read DWORD in little endian >--------------------------
|
||||
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDwordFromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDwordFromLe(void FAR * pAddr_p)
|
||||
{
|
||||
tdwStruct FAR* pdwStruct;
|
||||
tdwStruct FAR *pdwStruct;
|
||||
|
||||
pdwStruct = (tdwStruct FAR*)pAddr_p;
|
||||
return ( pdwStruct->m_dwDword );
|
||||
pdwStruct = (tdwStruct FAR *) pAddr_p;
|
||||
return (pdwStruct->m_dwDword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetDword24ToBe()
|
||||
@@ -359,16 +330,16 @@ tdwStruct FAR* pdwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDword24ToBe (void FAR* pAddr_p, DWORD dwDwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDword24ToBe(void FAR * pAddr_p,
|
||||
DWORD dwDwordVal_p)
|
||||
{
|
||||
|
||||
((BYTE FAR*) pAddr_p)[0] = ((BYTE FAR*) &dwDwordVal_p)[2];
|
||||
((BYTE FAR*) pAddr_p)[1] = ((BYTE FAR*) &dwDwordVal_p)[1];
|
||||
((BYTE FAR*) pAddr_p)[2] = ((BYTE FAR*) &dwDwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[0] = ((BYTE FAR *) & dwDwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[1] = ((BYTE FAR *) & dwDwordVal_p)[1];
|
||||
((BYTE FAR *) pAddr_p)[2] = ((BYTE FAR *) & dwDwordVal_p)[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetDword24ToLe()
|
||||
@@ -384,16 +355,16 @@ INLINE_FUNCTION void PUBLIC AmiSetDword24ToBe (void FAR* pAddr_p, DWORD dwDwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDword24ToLe (void FAR* pAddr_p, DWORD dwDwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetDword24ToLe(void FAR * pAddr_p,
|
||||
DWORD dwDwordVal_p)
|
||||
{
|
||||
|
||||
((BYTE FAR*) pAddr_p)[0] = ((BYTE FAR*) &dwDwordVal_p)[0];
|
||||
((BYTE FAR*) pAddr_p)[1] = ((BYTE FAR*) &dwDwordVal_p)[1];
|
||||
((BYTE FAR*) pAddr_p)[2] = ((BYTE FAR*) &dwDwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[0] = ((BYTE FAR *) & dwDwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[1] = ((BYTE FAR *) & dwDwordVal_p)[1];
|
||||
((BYTE FAR *) pAddr_p)[2] = ((BYTE FAR *) & dwDwordVal_p)[2];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetDword24FromBe()
|
||||
@@ -408,19 +379,18 @@ INLINE_FUNCTION void PUBLIC AmiSetDword24ToLe (void FAR* pAddr_p, DWORD dwDwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDword24FromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDword24FromBe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tdwStruct dwStruct;
|
||||
tdwStruct dwStruct;
|
||||
|
||||
dwStruct.m_dwDword = AmiGetDwordFromBe (pAddr_p);
|
||||
dwStruct.m_dwDword >>= 8;
|
||||
dwStruct.m_dwDword = AmiGetDwordFromBe(pAddr_p);
|
||||
dwStruct.m_dwDword >>= 8;
|
||||
|
||||
return ( dwStruct.m_dwDword );
|
||||
return (dwStruct.m_dwDword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetDword24FromLe()
|
||||
@@ -435,19 +405,18 @@ tdwStruct dwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDword24FromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION DWORD PUBLIC AmiGetDword24FromLe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tdwStruct dwStruct;
|
||||
tdwStruct dwStruct;
|
||||
|
||||
dwStruct.m_dwDword = AmiGetDwordFromLe (pAddr_p);
|
||||
dwStruct.m_dwDword &= 0x00FFFFFF;
|
||||
dwStruct.m_dwDword = AmiGetDwordFromLe(pAddr_p);
|
||||
dwStruct.m_dwDword &= 0x00FFFFFF;
|
||||
|
||||
return ( dwStruct.m_dwDword );
|
||||
return (dwStruct.m_dwDword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//#ifdef USE_VAR64
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -465,21 +434,21 @@ tdwStruct dwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword64ToBe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword64ToBe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((BYTE FAR*) pAddr_p)[0] = ((BYTE FAR*) &qwQwordVal_p)[7];
|
||||
((BYTE FAR*) pAddr_p)[1] = ((BYTE FAR*) &qwQwordVal_p)[6];
|
||||
((BYTE FAR*) pAddr_p)[2] = ((BYTE FAR*) &qwQwordVal_p)[5];
|
||||
((BYTE FAR*) pAddr_p)[3] = ((BYTE FAR*) &qwQwordVal_p)[4];
|
||||
((BYTE FAR*) pAddr_p)[4] = ((BYTE FAR*) &qwQwordVal_p)[3];
|
||||
((BYTE FAR*) pAddr_p)[5] = ((BYTE FAR*) &qwQwordVal_p)[2];
|
||||
((BYTE FAR*) pAddr_p)[6] = ((BYTE FAR*) &qwQwordVal_p)[1];
|
||||
((BYTE FAR*) pAddr_p)[7] = ((BYTE FAR*) &qwQwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[0] = ((BYTE FAR *) & qwQwordVal_p)[7];
|
||||
((BYTE FAR *) pAddr_p)[1] = ((BYTE FAR *) & qwQwordVal_p)[6];
|
||||
((BYTE FAR *) pAddr_p)[2] = ((BYTE FAR *) & qwQwordVal_p)[5];
|
||||
((BYTE FAR *) pAddr_p)[3] = ((BYTE FAR *) & qwQwordVal_p)[4];
|
||||
((BYTE FAR *) pAddr_p)[4] = ((BYTE FAR *) & qwQwordVal_p)[3];
|
||||
((BYTE FAR *) pAddr_p)[5] = ((BYTE FAR *) & qwQwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[6] = ((BYTE FAR *) & qwQwordVal_p)[1];
|
||||
((BYTE FAR *) pAddr_p)[7] = ((BYTE FAR *) & qwQwordVal_p)[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword64ToLe()
|
||||
@@ -495,17 +464,17 @@ INLINE_FUNCTION void PUBLIC AmiSetQword64ToBe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword64ToLe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword64ToLe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
QWORD FAR* pqwDst;
|
||||
QWORD FAR *pqwDst;
|
||||
|
||||
pqwDst = (QWORD FAR*) pAddr_p;
|
||||
*pqwDst = qwQwordVal_p;
|
||||
pqwDst = (QWORD FAR *) pAddr_p;
|
||||
*pqwDst = qwQwordVal_p;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword64FromBe()
|
||||
@@ -520,25 +489,24 @@ QWORD FAR* pqwDst;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword64FromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword64FromBe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[0] = ((BYTE FAR*) pAddr_p)[7];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[1] = ((BYTE FAR*) pAddr_p)[6];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[2] = ((BYTE FAR*) pAddr_p)[5];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[3] = ((BYTE FAR*) pAddr_p)[4];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[4] = ((BYTE FAR*) pAddr_p)[3];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[5] = ((BYTE FAR*) pAddr_p)[2];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[6] = ((BYTE FAR*) pAddr_p)[1];
|
||||
((BYTE FAR*) &qwStruct.m_qwQword)[7] = ((BYTE FAR*) pAddr_p)[0];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[0] = ((BYTE FAR *) pAddr_p)[7];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[1] = ((BYTE FAR *) pAddr_p)[6];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[2] = ((BYTE FAR *) pAddr_p)[5];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[3] = ((BYTE FAR *) pAddr_p)[4];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[4] = ((BYTE FAR *) pAddr_p)[3];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[5] = ((BYTE FAR *) pAddr_p)[2];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[6] = ((BYTE FAR *) pAddr_p)[1];
|
||||
((BYTE FAR *) & qwStruct.m_qwQword)[7] = ((BYTE FAR *) pAddr_p)[0];
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword64FromLe()
|
||||
@@ -553,20 +521,19 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword64FromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword64FromLe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct FAR* pqwStruct;
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct FAR *pqwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
pqwStruct = (tqwStruct FAR*) pAddr_p;
|
||||
qwStruct.m_qwQword = pqwStruct->m_qwQword;
|
||||
pqwStruct = (tqwStruct FAR *) pAddr_p;
|
||||
qwStruct.m_qwQword = pqwStruct->m_qwQword;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword40ToBe()
|
||||
@@ -582,18 +549,18 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword40ToBe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword40ToBe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((BYTE FAR*) pAddr_p)[0] = ((BYTE FAR*) &qwQwordVal_p)[4];
|
||||
((BYTE FAR*) pAddr_p)[1] = ((BYTE FAR*) &qwQwordVal_p)[3];
|
||||
((BYTE FAR*) pAddr_p)[2] = ((BYTE FAR*) &qwQwordVal_p)[2];
|
||||
((BYTE FAR*) pAddr_p)[3] = ((BYTE FAR*) &qwQwordVal_p)[1];
|
||||
((BYTE FAR*) pAddr_p)[4] = ((BYTE FAR*) &qwQwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[0] = ((BYTE FAR *) & qwQwordVal_p)[4];
|
||||
((BYTE FAR *) pAddr_p)[1] = ((BYTE FAR *) & qwQwordVal_p)[3];
|
||||
((BYTE FAR *) pAddr_p)[2] = ((BYTE FAR *) & qwQwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[3] = ((BYTE FAR *) & qwQwordVal_p)[1];
|
||||
((BYTE FAR *) pAddr_p)[4] = ((BYTE FAR *) & qwQwordVal_p)[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword40ToLe()
|
||||
@@ -609,15 +576,15 @@ INLINE_FUNCTION void PUBLIC AmiSetQword40ToBe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword40ToLe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword40ToLe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((DWORD FAR*) pAddr_p)[0] = ((DWORD FAR*) &qwQwordVal_p)[0];
|
||||
((BYTE FAR*) pAddr_p)[4] = ((BYTE FAR*) &qwQwordVal_p)[4];
|
||||
((DWORD FAR *) pAddr_p)[0] = ((DWORD FAR *) & qwQwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[4] = ((BYTE FAR *) & qwQwordVal_p)[4];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword40FromBe()
|
||||
@@ -632,19 +599,18 @@ INLINE_FUNCTION void PUBLIC AmiSetQword40ToLe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword40FromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword40FromBe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
qwStruct.m_qwQword = AmiGetQword64FromBe (pAddr_p);
|
||||
qwStruct.m_qwQword >>= 24;
|
||||
qwStruct.m_qwQword = AmiGetQword64FromBe(pAddr_p);
|
||||
qwStruct.m_qwQword >>= 24;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword40FromLe()
|
||||
@@ -659,19 +625,18 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword40FromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword40FromLe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
qwStruct.m_qwQword = AmiGetQword64FromLe (pAddr_p);
|
||||
qwStruct.m_qwQword &= 0x000000FFFFFFFFFFLL;
|
||||
qwStruct.m_qwQword = AmiGetQword64FromLe(pAddr_p);
|
||||
qwStruct.m_qwQword &= 0x000000FFFFFFFFFFLL;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword48ToBe()
|
||||
@@ -687,19 +652,19 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword48ToBe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword48ToBe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((BYTE FAR*) pAddr_p)[0] = ((BYTE FAR*) &qwQwordVal_p)[5];
|
||||
((BYTE FAR*) pAddr_p)[1] = ((BYTE FAR*) &qwQwordVal_p)[4];
|
||||
((BYTE FAR*) pAddr_p)[2] = ((BYTE FAR*) &qwQwordVal_p)[3];
|
||||
((BYTE FAR*) pAddr_p)[3] = ((BYTE FAR*) &qwQwordVal_p)[2];
|
||||
((BYTE FAR*) pAddr_p)[4] = ((BYTE FAR*) &qwQwordVal_p)[1];
|
||||
((BYTE FAR*) pAddr_p)[5] = ((BYTE FAR*) &qwQwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[0] = ((BYTE FAR *) & qwQwordVal_p)[5];
|
||||
((BYTE FAR *) pAddr_p)[1] = ((BYTE FAR *) & qwQwordVal_p)[4];
|
||||
((BYTE FAR *) pAddr_p)[2] = ((BYTE FAR *) & qwQwordVal_p)[3];
|
||||
((BYTE FAR *) pAddr_p)[3] = ((BYTE FAR *) & qwQwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[4] = ((BYTE FAR *) & qwQwordVal_p)[1];
|
||||
((BYTE FAR *) pAddr_p)[5] = ((BYTE FAR *) & qwQwordVal_p)[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword48ToLe()
|
||||
@@ -715,15 +680,15 @@ INLINE_FUNCTION void PUBLIC AmiSetQword48ToBe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword48ToLe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword48ToLe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((DWORD FAR*) pAddr_p)[0] = ((DWORD FAR*) &qwQwordVal_p)[0];
|
||||
((WORD FAR*) pAddr_p)[2] = ((WORD FAR*) &qwQwordVal_p)[2];
|
||||
((DWORD FAR *) pAddr_p)[0] = ((DWORD FAR *) & qwQwordVal_p)[0];
|
||||
((WORD FAR *) pAddr_p)[2] = ((WORD FAR *) & qwQwordVal_p)[2];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword48FromBe()
|
||||
@@ -738,19 +703,18 @@ INLINE_FUNCTION void PUBLIC AmiSetQword48ToLe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword48FromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword48FromBe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
qwStruct.m_qwQword = AmiGetQword64FromBe (pAddr_p);
|
||||
qwStruct.m_qwQword >>= 16;
|
||||
qwStruct.m_qwQword = AmiGetQword64FromBe(pAddr_p);
|
||||
qwStruct.m_qwQword >>= 16;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword48FromLe()
|
||||
@@ -765,19 +729,18 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword48FromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword48FromLe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
qwStruct.m_qwQword = AmiGetQword64FromLe (pAddr_p);
|
||||
qwStruct.m_qwQword &= 0x0000FFFFFFFFFFFFLL;
|
||||
qwStruct.m_qwQword = AmiGetQword64FromLe(pAddr_p);
|
||||
qwStruct.m_qwQword &= 0x0000FFFFFFFFFFFFLL;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword56ToBe()
|
||||
@@ -793,20 +756,20 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword56ToBe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword56ToBe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((BYTE FAR*) pAddr_p)[0] = ((BYTE FAR*) &qwQwordVal_p)[6];
|
||||
((BYTE FAR*) pAddr_p)[1] = ((BYTE FAR*) &qwQwordVal_p)[5];
|
||||
((BYTE FAR*) pAddr_p)[2] = ((BYTE FAR*) &qwQwordVal_p)[4];
|
||||
((BYTE FAR*) pAddr_p)[3] = ((BYTE FAR*) &qwQwordVal_p)[3];
|
||||
((BYTE FAR*) pAddr_p)[4] = ((BYTE FAR*) &qwQwordVal_p)[2];
|
||||
((BYTE FAR*) pAddr_p)[5] = ((BYTE FAR*) &qwQwordVal_p)[1];
|
||||
((BYTE FAR*) pAddr_p)[6] = ((BYTE FAR*) &qwQwordVal_p)[0];
|
||||
((BYTE FAR *) pAddr_p)[0] = ((BYTE FAR *) & qwQwordVal_p)[6];
|
||||
((BYTE FAR *) pAddr_p)[1] = ((BYTE FAR *) & qwQwordVal_p)[5];
|
||||
((BYTE FAR *) pAddr_p)[2] = ((BYTE FAR *) & qwQwordVal_p)[4];
|
||||
((BYTE FAR *) pAddr_p)[3] = ((BYTE FAR *) & qwQwordVal_p)[3];
|
||||
((BYTE FAR *) pAddr_p)[4] = ((BYTE FAR *) & qwQwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[5] = ((BYTE FAR *) & qwQwordVal_p)[1];
|
||||
((BYTE FAR *) pAddr_p)[6] = ((BYTE FAR *) & qwQwordVal_p)[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetQword56ToLe()
|
||||
@@ -822,16 +785,16 @@ INLINE_FUNCTION void PUBLIC AmiSetQword56ToBe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword56ToLe (void FAR* pAddr_p, QWORD qwQwordVal_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetQword56ToLe(void FAR * pAddr_p,
|
||||
QWORD qwQwordVal_p)
|
||||
{
|
||||
|
||||
((DWORD FAR*) pAddr_p)[0] = ((DWORD FAR*) &qwQwordVal_p)[0];
|
||||
((WORD FAR*) pAddr_p)[2] = ((WORD FAR*) &qwQwordVal_p)[2];
|
||||
((BYTE FAR*) pAddr_p)[6] = ((BYTE FAR*) &qwQwordVal_p)[6];
|
||||
((DWORD FAR *) pAddr_p)[0] = ((DWORD FAR *) & qwQwordVal_p)[0];
|
||||
((WORD FAR *) pAddr_p)[2] = ((WORD FAR *) & qwQwordVal_p)[2];
|
||||
((BYTE FAR *) pAddr_p)[6] = ((BYTE FAR *) & qwQwordVal_p)[6];
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword56FromBe()
|
||||
@@ -846,19 +809,18 @@ INLINE_FUNCTION void PUBLIC AmiSetQword56ToLe (void FAR* pAddr_p, QWORD qwQwordV
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword56FromBe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword56FromBe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
qwStruct.m_qwQword = AmiGetQword64FromBe (pAddr_p);
|
||||
qwStruct.m_qwQword >>= 8;
|
||||
qwStruct.m_qwQword = AmiGetQword64FromBe(pAddr_p);
|
||||
qwStruct.m_qwQword >>= 8;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetQword56FromLe()
|
||||
@@ -873,19 +835,18 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword56FromLe (void FAR* pAddr_p)
|
||||
INLINE_FUNCTION QWORD PUBLIC AmiGetQword56FromLe(void FAR * pAddr_p)
|
||||
{
|
||||
|
||||
tqwStruct qwStruct;
|
||||
tqwStruct qwStruct;
|
||||
|
||||
qwStruct.m_qwQword = AmiGetQword64FromLe (pAddr_p);
|
||||
qwStruct.m_qwQword &= 0x00FFFFFFFFFFFFFFLL;
|
||||
qwStruct.m_qwQword = AmiGetQword64FromLe(pAddr_p);
|
||||
qwStruct.m_qwQword &= 0x00FFFFFFFFFFFFFFLL;
|
||||
|
||||
return ( qwStruct.m_qwQword );
|
||||
return (qwStruct.m_qwQword);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiSetTimeOfDay()
|
||||
@@ -901,15 +862,16 @@ tqwStruct qwStruct;
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiSetTimeOfDay (void FAR* pAddr_p, tTimeOfDay FAR* pTimeOfDay_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiSetTimeOfDay(void FAR * pAddr_p,
|
||||
tTimeOfDay FAR * pTimeOfDay_p)
|
||||
{
|
||||
|
||||
AmiSetDwordToLe (((BYTE FAR*) pAddr_p), pTimeOfDay_p->m_dwMs & 0x0FFFFFFF);
|
||||
AmiSetWordToLe (((BYTE FAR*) pAddr_p) + 4, pTimeOfDay_p->m_wDays);
|
||||
AmiSetDwordToLe(((BYTE FAR *) pAddr_p),
|
||||
pTimeOfDay_p->m_dwMs & 0x0FFFFFFF);
|
||||
AmiSetWordToLe(((BYTE FAR *) pAddr_p) + 4, pTimeOfDay_p->m_wDays);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Function: AmiGetTimeOfDay()
|
||||
@@ -925,21 +887,19 @@ INLINE_FUNCTION void PUBLIC AmiSetTimeOfDay (void FAR* pAddr_p, tTimeOfDay FAR*
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
INLINE_FUNCTION void PUBLIC AmiGetTimeOfDay (void FAR* pAddr_p, tTimeOfDay FAR* pTimeOfDay_p)
|
||||
INLINE_FUNCTION void PUBLIC AmiGetTimeOfDay(void FAR * pAddr_p,
|
||||
tTimeOfDay FAR * pTimeOfDay_p)
|
||||
{
|
||||
|
||||
pTimeOfDay_p->m_dwMs = AmiGetDwordFromLe (((BYTE FAR*) pAddr_p)) & 0x0FFFFFFF;
|
||||
pTimeOfDay_p->m_wDays = AmiGetWordFromLe (((BYTE FAR*) pAddr_p) + 4);
|
||||
pTimeOfDay_p->m_dwMs =
|
||||
AmiGetDwordFromLe(((BYTE FAR *) pAddr_p)) & 0x0FFFFFFF;
|
||||
pTimeOfDay_p->m_wDays = AmiGetWordFromLe(((BYTE FAR *) pAddr_p) + 4);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// EOF
|
||||
|
||||
// Die letzte Zeile mu<6D> unbedingt eine leere Zeile sein, weil manche Compiler
|
||||
// damit ein Problem haben, wenn das nicht so ist (z.B. GNU oder Borland C++ Builder).
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -91,11 +91,10 @@
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#ifdef CONFIG_COLDFIRE
|
||||
#include <asm/coldfire.h>
|
||||
#include "fec.h"
|
||||
#include <asm/coldfire.h>
|
||||
#include "fec.h"
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
@@ -113,45 +112,44 @@
|
||||
#endif
|
||||
|
||||
#ifndef DBG_TRACE_POINTS
|
||||
#define DBG_TRACE_POINTS 23 // # of supported debug trace points
|
||||
#define DBG_TRACE_POINTS 23 // # of supported debug trace points
|
||||
#endif
|
||||
|
||||
#ifndef DBG_TRACE_VALUES
|
||||
#define DBG_TRACE_VALUES 24 // # of supported debug trace values (size of circular buffer)
|
||||
#define DBG_TRACE_VALUES 24 // # of supported debug trace values (size of circular buffer)
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// modul global types
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local vars
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
atomic_t aatmDbgTracePoint_l[DBG_TRACE_POINTS];
|
||||
DWORD adwDbgTraceValue_l[DBG_TRACE_VALUES];
|
||||
DWORD dwDbgTraceValueOld_l;
|
||||
unsigned int uiDbgTraceValuePos_l;
|
||||
spinlock_t spinlockDbgTraceValue_l;
|
||||
unsigned long ulDbTraceValueFlags_l;
|
||||
atomic_t aatmDbgTracePoint_l[DBG_TRACE_POINTS];
|
||||
DWORD adwDbgTraceValue_l[DBG_TRACE_VALUES];
|
||||
DWORD dwDbgTraceValueOld_l;
|
||||
unsigned int uiDbgTraceValuePos_l;
|
||||
spinlock_t spinlockDbgTraceValue_l;
|
||||
unsigned long ulDbTraceValueFlags_l;
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int EplLinProcRead (char* pcBuffer_p, char** ppcStart_p, off_t Offset_p, int nBufferSize_p, int* pEof_p, void* pData_p);
|
||||
static int EplLinProcWrite(struct file *file, const char __user *buffer, unsigned long count, void *data);
|
||||
|
||||
void PUBLIC TgtDbgSignalTracePoint (BYTE bTracePointNumber_p);
|
||||
void PUBLIC TgtDbgPostTraceValue (DWORD dwTraceValue_p);
|
||||
static int EplLinProcRead(char *pcBuffer_p, char **ppcStart_p, off_t Offset_p,
|
||||
int nBufferSize_p, int *pEof_p, void *pData_p);
|
||||
static int EplLinProcWrite(struct file *file, const char __user * buffer,
|
||||
unsigned long count, void *data);
|
||||
|
||||
void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p);
|
||||
void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p);
|
||||
|
||||
EPLDLLEXPORT DWORD PUBLIC EplIdentuGetRunningRequests(void);
|
||||
|
||||
|
||||
//=========================================================================//
|
||||
// //
|
||||
// P U B L I C F U N C T I O N S //
|
||||
@@ -160,35 +158,32 @@ EPLDLLEXPORT DWORD PUBLIC EplIdentuGetRunningRequests(void);
|
||||
|
||||
tEplKernel EplLinProcInit(void)
|
||||
{
|
||||
struct proc_dir_entry* pProcDirEntry;
|
||||
pProcDirEntry = create_proc_entry (EPL_PROC_DEV_NAME, S_IRUGO, NULL);
|
||||
if (pProcDirEntry != NULL)
|
||||
{
|
||||
pProcDirEntry->read_proc = EplLinProcRead;
|
||||
pProcDirEntry->write_proc = EplLinProcWrite;
|
||||
pProcDirEntry->data = NULL; // device number or something else
|
||||
struct proc_dir_entry *pProcDirEntry;
|
||||
pProcDirEntry = create_proc_entry(EPL_PROC_DEV_NAME, S_IRUGO, NULL);
|
||||
if (pProcDirEntry != NULL) {
|
||||
pProcDirEntry->read_proc = EplLinProcRead;
|
||||
pProcDirEntry->write_proc = EplLinProcWrite;
|
||||
pProcDirEntry->data = NULL; // device number or something else
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return kEplNoResource;
|
||||
}
|
||||
} else {
|
||||
return kEplNoResource;
|
||||
}
|
||||
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
// initialize spinlock and circular buffer position
|
||||
spin_lock_init(&spinlockDbgTraceValue_l);
|
||||
uiDbgTraceValuePos_l = 0;
|
||||
dwDbgTraceValueOld_l = 0;
|
||||
// initialize spinlock and circular buffer position
|
||||
spin_lock_init(&spinlockDbgTraceValue_l);
|
||||
uiDbgTraceValuePos_l = 0;
|
||||
dwDbgTraceValueOld_l = 0;
|
||||
#endif
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
tEplKernel EplLinProcFree(void)
|
||||
{
|
||||
remove_proc_entry (EPL_PROC_DEV_NAME, NULL);
|
||||
remove_proc_entry(EPL_PROC_DEV_NAME, NULL);
|
||||
|
||||
return kEplSuccessful;
|
||||
return kEplSuccessful;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -196,225 +191,219 @@ tEplKernel EplLinProcFree(void)
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
void PUBLIC TgtDbgSignalTracePoint (
|
||||
BYTE bTracePointNumber_p)
|
||||
void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p)
|
||||
{
|
||||
|
||||
if (bTracePointNumber_p >= (sizeof(aatmDbgTracePoint_l) / sizeof(aatmDbgTracePoint_l[0])))
|
||||
{
|
||||
goto Exit;
|
||||
}
|
||||
if (bTracePointNumber_p >=
|
||||
(sizeof(aatmDbgTracePoint_l) / sizeof(aatmDbgTracePoint_l[0]))) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
atomic_inc(&aatmDbgTracePoint_l[bTracePointNumber_p]);
|
||||
|
||||
atomic_inc (&aatmDbgTracePoint_l[bTracePointNumber_p]);
|
||||
Exit:
|
||||
|
||||
Exit:
|
||||
|
||||
return;
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
void PUBLIC TgtDbgPostTraceValue (DWORD dwTraceValue_p)
|
||||
void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p)
|
||||
{
|
||||
|
||||
spin_lock_irqsave(&spinlockDbgTraceValue_l, ulDbTraceValueFlags_l);
|
||||
if (dwDbgTraceValueOld_l != dwTraceValue_p)
|
||||
{
|
||||
adwDbgTraceValue_l[uiDbgTraceValuePos_l] = dwTraceValue_p;
|
||||
uiDbgTraceValuePos_l = (uiDbgTraceValuePos_l + 1) % DBG_TRACE_VALUES;
|
||||
dwDbgTraceValueOld_l = dwTraceValue_p;
|
||||
}
|
||||
spin_unlock_irqrestore(&spinlockDbgTraceValue_l, ulDbTraceValueFlags_l);
|
||||
spin_lock_irqsave(&spinlockDbgTraceValue_l, ulDbTraceValueFlags_l);
|
||||
if (dwDbgTraceValueOld_l != dwTraceValue_p) {
|
||||
adwDbgTraceValue_l[uiDbgTraceValuePos_l] = dwTraceValue_p;
|
||||
uiDbgTraceValuePos_l =
|
||||
(uiDbgTraceValuePos_l + 1) % DBG_TRACE_VALUES;
|
||||
dwDbgTraceValueOld_l = dwTraceValue_p;
|
||||
}
|
||||
spin_unlock_irqrestore(&spinlockDbgTraceValue_l, ulDbTraceValueFlags_l);
|
||||
|
||||
return;
|
||||
return;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Read function for PROC-FS read access
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int EplLinProcRead (
|
||||
char* pcBuffer_p,
|
||||
char** ppcStart_p,
|
||||
off_t Offset_p,
|
||||
int nBufferSize_p,
|
||||
int* pEof_p,
|
||||
void* pData_p)
|
||||
static int EplLinProcRead(char *pcBuffer_p,
|
||||
char **ppcStart_p,
|
||||
off_t Offset_p,
|
||||
int nBufferSize_p, int *pEof_p, void *pData_p)
|
||||
{
|
||||
|
||||
int nSize;
|
||||
int Eof;
|
||||
tEplDllkCalStatistics* pDllkCalStats;
|
||||
int nSize;
|
||||
int Eof;
|
||||
tEplDllkCalStatistics *pDllkCalStats;
|
||||
|
||||
nSize = 0;
|
||||
Eof = 0;
|
||||
nSize = 0;
|
||||
Eof = 0;
|
||||
|
||||
// count calls of this function
|
||||
// count calls of this function
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
TgtDbgSignalTracePoint(0);
|
||||
TgtDbgSignalTracePoint(0);
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// generate static information
|
||||
//---------------------------------------------------------------
|
||||
//---------------------------------------------------------------
|
||||
// generate static information
|
||||
//---------------------------------------------------------------
|
||||
|
||||
// ---- Driver information ----
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"%s %s (c) 2006 %s\n",
|
||||
EPL_PRODUCT_NAME, EPL_PRODUCT_VERSION, EPL_PRODUCT_MANUFACTURER);
|
||||
// ---- Driver information ----
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"%s %s (c) 2006 %s\n",
|
||||
EPL_PRODUCT_NAME, EPL_PRODUCT_VERSION,
|
||||
EPL_PRODUCT_MANUFACTURER);
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// generate process information
|
||||
//---------------------------------------------------------------
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// generate process information
|
||||
//---------------------------------------------------------------
|
||||
// ---- EPL state ----
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"NMT state: 0x%04X\n",
|
||||
(WORD) EplNmtkGetNmtState());
|
||||
|
||||
// ---- EPL state ----
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"NMT state: 0x%04X\n",
|
||||
(WORD) EplNmtkGetNmtState());
|
||||
EplDllkCalGetStatistics(&pDllkCalStats);
|
||||
|
||||
EplDllkCalGetStatistics(&pDllkCalStats);
|
||||
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"CurAsyncTxGen=%lu CurAsyncTxNmt=%lu CurAsyncRx=%lu\nMaxAsyncTxGen=%lu MaxAsyncTxNmt=%lu MaxAsyncRx=%lu\n", pDllkCalStats->m_ulCurTxFrameCountGen, pDllkCalStats->m_ulCurTxFrameCountNmt, pDllkCalStats->m_ulCurRxFrameCount, pDllkCalStats->m_ulMaxTxFrameCountGen, pDllkCalStats->m_ulMaxTxFrameCountNmt, pDllkCalStats->m_ulMaxRxFrameCount);
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"CurAsyncTxGen=%lu CurAsyncTxNmt=%lu CurAsyncRx=%lu\nMaxAsyncTxGen=%lu MaxAsyncTxNmt=%lu MaxAsyncRx=%lu\n",
|
||||
pDllkCalStats->m_ulCurTxFrameCountGen,
|
||||
pDllkCalStats->m_ulCurTxFrameCountNmt,
|
||||
pDllkCalStats->m_ulCurRxFrameCount,
|
||||
pDllkCalStats->m_ulMaxTxFrameCountGen,
|
||||
pDllkCalStats->m_ulMaxTxFrameCountNmt,
|
||||
pDllkCalStats->m_ulMaxRxFrameCount);
|
||||
|
||||
#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
|
||||
// fetch running IdentRequests
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"running IdentRequests: 0x%08lX\n",
|
||||
EplIdentuGetRunningRequests());
|
||||
// fetch running IdentRequests
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"running IdentRequests: 0x%08lX\n",
|
||||
EplIdentuGetRunningRequests());
|
||||
|
||||
// fetch state of NmtMnu module
|
||||
{
|
||||
unsigned int uiMandatorySlaveCount;
|
||||
unsigned int uiSignalSlaveCount;
|
||||
WORD wFlags;
|
||||
// fetch state of NmtMnu module
|
||||
{
|
||||
unsigned int uiMandatorySlaveCount;
|
||||
unsigned int uiSignalSlaveCount;
|
||||
WORD wFlags;
|
||||
|
||||
EplNmtMnuGetDiagnosticInfo(&uiMandatorySlaveCount,
|
||||
&uiSignalSlaveCount,
|
||||
&wFlags);
|
||||
EplNmtMnuGetDiagnosticInfo(&uiMandatorySlaveCount,
|
||||
&uiSignalSlaveCount, &wFlags);
|
||||
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"MN MandSlaveCount: %u SigSlaveCount: %u Flags: 0x%X\n",
|
||||
uiMandatorySlaveCount, uiSignalSlaveCount,
|
||||
wFlags);
|
||||
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"MN MandSlaveCount: %u SigSlaveCount: %u Flags: 0x%X\n",
|
||||
uiMandatorySlaveCount, uiSignalSlaveCount, wFlags);
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// ---- FEC state ----
|
||||
#ifdef CONFIG_COLDFIRE
|
||||
{
|
||||
// Receive the base address
|
||||
unsigned long base_addr;
|
||||
#if (EDRV_USED_ETH_CTRL == 0)
|
||||
// Set the base address of FEC0
|
||||
base_addr = FEC_BASE_ADDR_FEC0;
|
||||
#else
|
||||
// Set the base address of FEC1
|
||||
base_addr = FEC_BASE_ADDR_FEC1;
|
||||
#endif
|
||||
// ---- FEC state ----
|
||||
#ifdef CONFIG_COLDFIRE
|
||||
{
|
||||
// Receive the base address
|
||||
unsigned long base_addr;
|
||||
#if (EDRV_USED_ETH_CTRL == 0)
|
||||
// Set the base address of FEC0
|
||||
base_addr = FEC_BASE_ADDR_FEC0;
|
||||
#else
|
||||
// Set the base address of FEC1
|
||||
base_addr = FEC_BASE_ADDR_FEC1;
|
||||
#endif
|
||||
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"FEC_ECR = 0x%08X FEC_EIR = 0x%08X FEC_EIMR = 0x%08X\nFEC_TCR = 0x%08X FECTFSR = 0x%08X FECRFSR = 0x%08X\n",
|
||||
FEC_ECR(base_addr), FEC_EIR(base_addr), FEC_EIMR(base_addr), FEC_TCR(base_addr), FEC_FECTFSR(base_addr), FEC_FECRFSR(base_addr));
|
||||
}
|
||||
#endif
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"FEC_ECR = 0x%08X FEC_EIR = 0x%08X FEC_EIMR = 0x%08X\nFEC_TCR = 0x%08X FECTFSR = 0x%08X FECRFSR = 0x%08X\n",
|
||||
FEC_ECR(base_addr), FEC_EIR(base_addr),
|
||||
FEC_EIMR(base_addr), FEC_TCR(base_addr),
|
||||
FEC_FECTFSR(base_addr),
|
||||
FEC_FECRFSR(base_addr));
|
||||
}
|
||||
#endif
|
||||
|
||||
// ---- DBG: TracePoints ----
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
{
|
||||
int nNum;
|
||||
|
||||
// ---- DBG: TracePoints ----
|
||||
#ifdef _DBG_TRACE_POINTS_
|
||||
{
|
||||
int nNum;
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"DbgTracePoints:\n");
|
||||
for (nNum = 0;
|
||||
nNum < (sizeof(aatmDbgTracePoint_l) / sizeof(atomic_t));
|
||||
nNum++) {
|
||||
nSize +=
|
||||
snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
" TracePoint[%2d]: %d\n", (int)nNum,
|
||||
atomic_read(&aatmDbgTracePoint_l[nNum]));
|
||||
}
|
||||
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"DbgTracePoints:\n");
|
||||
for (nNum=0; nNum<(sizeof(aatmDbgTracePoint_l)/sizeof(atomic_t)); nNum++)
|
||||
{
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
" TracePoint[%2d]: %d\n", (int)nNum,
|
||||
atomic_read(&aatmDbgTracePoint_l[nNum]));
|
||||
}
|
||||
nSize += snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"DbgTraceValues:\n");
|
||||
for (nNum = 0; nNum < DBG_TRACE_VALUES; nNum++) {
|
||||
if (nNum == uiDbgTraceValuePos_l) { // next value will be stored at that position
|
||||
nSize +=
|
||||
snprintf(pcBuffer_p + nSize,
|
||||
nBufferSize_p - nSize, "*%08lX",
|
||||
adwDbgTraceValue_l[nNum]);
|
||||
} else {
|
||||
nSize +=
|
||||
snprintf(pcBuffer_p + nSize,
|
||||
nBufferSize_p - nSize, " %08lX",
|
||||
adwDbgTraceValue_l[nNum]);
|
||||
}
|
||||
if ((nNum & 0x00000007) == 0x00000007) { // 8 values printed -> end of line reached
|
||||
nSize +=
|
||||
snprintf(pcBuffer_p + nSize,
|
||||
nBufferSize_p - nSize, "\n");
|
||||
}
|
||||
}
|
||||
if ((nNum & 0x00000007) != 0x00000007) { // number of values printed is not a multiple of 8 -> print new line
|
||||
nSize +=
|
||||
snprintf(pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"DbgTraceValues:\n");
|
||||
for (nNum=0; nNum<DBG_TRACE_VALUES; nNum++)
|
||||
{
|
||||
if (nNum == uiDbgTraceValuePos_l)
|
||||
{ // next value will be stored at that position
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"*%08lX", adwDbgTraceValue_l[nNum]);
|
||||
}
|
||||
else
|
||||
{
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
" %08lX", adwDbgTraceValue_l[nNum]);
|
||||
}
|
||||
if ((nNum & 0x00000007) == 0x00000007)
|
||||
{ // 8 values printed -> end of line reached
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"\n");
|
||||
}
|
||||
}
|
||||
if ((nNum & 0x00000007) != 0x00000007)
|
||||
{ // number of values printed is not a multiple of 8 -> print new line
|
||||
nSize += snprintf (pcBuffer_p + nSize, nBufferSize_p - nSize,
|
||||
"\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Eof = 1;
|
||||
goto Exit;
|
||||
|
||||
Exit:
|
||||
|
||||
Eof = 1;
|
||||
goto Exit;
|
||||
*pEof_p = Eof;
|
||||
|
||||
|
||||
Exit:
|
||||
|
||||
*pEof_p = Eof;
|
||||
|
||||
return (nSize);
|
||||
return (nSize);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Write function for PROC-FS write access
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int EplLinProcWrite(struct file *file, const char __user *buffer, unsigned long count, void *data)
|
||||
static int EplLinProcWrite(struct file *file, const char __user * buffer,
|
||||
unsigned long count, void *data)
|
||||
{
|
||||
char abBuffer[count + 1];
|
||||
int iErr;
|
||||
int iVal = 0;
|
||||
tEplNmtEvent NmtEvent;
|
||||
char abBuffer[count + 1];
|
||||
int iErr;
|
||||
int iVal = 0;
|
||||
tEplNmtEvent NmtEvent;
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
iErr = copy_from_user(abBuffer, buffer, count);
|
||||
if (iErr != 0)
|
||||
{
|
||||
return count;
|
||||
}
|
||||
abBuffer[count] = '\0';
|
||||
if (count > 0) {
|
||||
iErr = copy_from_user(abBuffer, buffer, count);
|
||||
if (iErr != 0) {
|
||||
return count;
|
||||
}
|
||||
abBuffer[count] = '\0';
|
||||
|
||||
iErr = sscanf(abBuffer, "%i", &iVal);
|
||||
}
|
||||
if ((iVal <= 0) || (iVal > 0x2F))
|
||||
{
|
||||
NmtEvent = kEplNmtEventSwReset;
|
||||
}
|
||||
else
|
||||
{
|
||||
NmtEvent = (tEplNmtEvent) iVal;
|
||||
}
|
||||
// execute specified NMT command on write access of /proc/epl
|
||||
EplNmtuNmtEvent(NmtEvent);
|
||||
iErr = sscanf(abBuffer, "%i", &iVal);
|
||||
}
|
||||
if ((iVal <= 0) || (iVal > 0x2F)) {
|
||||
NmtEvent = kEplNmtEventSwReset;
|
||||
} else {
|
||||
NmtEvent = (tEplNmtEvent) iVal;
|
||||
}
|
||||
// execute specified NMT command on write access of /proc/epl
|
||||
EplNmtuNmtEvent(NmtEvent);
|
||||
|
||||
return count;
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user