forked from xuos/xiuos
powerlink: run the basic part of demo_cn_console
This commit is contained in:
parent
68179bec6c
commit
458a7c5d91
|
@ -128,10 +128,15 @@ int netselect_selectNetworkInterface(char* pDevName_p, size_t maxLen_p)
|
|||
|
||||
printf("--------------------------------------------------\n");
|
||||
printf("Select the interface to be used for POWERLINK (1-%u):", (unsigned int)i);
|
||||
#ifdef __XIUOS__
|
||||
printf("1\n");
|
||||
num = 1;
|
||||
#else
|
||||
if (scanf("%u", &num) == EOF)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("--------------------------------------------------\n");
|
||||
if ((num < 1) || (num > i))
|
||||
|
|
|
@ -387,6 +387,11 @@ static void loopMain(void)
|
|||
// wait for key hit
|
||||
while (!fExit)
|
||||
{
|
||||
#ifdef __XIUOS__
|
||||
ret = oplk_process();
|
||||
if (ret != kErrorOk)
|
||||
return;
|
||||
#endif
|
||||
if (console_kbhit())
|
||||
{
|
||||
cKey = (char)console_getch();
|
||||
|
|
|
@ -421,6 +421,11 @@ static void loopMain(void)
|
|||
|
||||
while (!fExit)
|
||||
{
|
||||
#ifdef __XIUOS__
|
||||
ret = oplk_process();
|
||||
if (ret != kErrorOk)
|
||||
return;
|
||||
#endif
|
||||
if (console_kbhit())
|
||||
{
|
||||
cKey = (char)console_getch();
|
||||
|
|
|
@ -11,6 +11,7 @@ This file contains the console input/output implementation for XiUOS.
|
|||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2020, AIIT XUOS Lab
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
@ -42,6 +43,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
// #include <strings.h>
|
||||
|
||||
#include <xsconfig.h>
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
|
@ -61,7 +65,7 @@ termios library.
|
|||
//------------------------------------------------------------------------------
|
||||
int console_getch(void)
|
||||
{
|
||||
return getchar();
|
||||
return 'p';
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
@ -78,5 +82,5 @@ The function checks the console for a keystroke.
|
|||
//------------------------------------------------------------------------------
|
||||
int console_kbhit(void)
|
||||
{
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -221,11 +221,6 @@ SET(EVENT_UCAL_LINUXUSER_SOURCES
|
|||
${USER_SOURCE_DIR}/event/eventucalintf-circbuf.c
|
||||
)
|
||||
|
||||
SET(EVENT_UCAL_XIUOS_SOURCES
|
||||
${USER_SOURCE_DIR}/event/eventucal-xiuos.c
|
||||
${USER_SOURCE_DIR}/event/eventucalintf-circbuf.c
|
||||
)
|
||||
|
||||
SET(EVENT_UCAL_LINUXIOCTL_SOURCES
|
||||
${USER_SOURCE_DIR}/event/eventucal-linuxioctl.c
|
||||
)
|
||||
|
@ -402,11 +397,6 @@ SET(EVENT_KCAL_WINDOWS_SOURCES
|
|||
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
||||
)
|
||||
|
||||
SET(EVENT_KCAL_XIUOS_SOURCES
|
||||
${KERNEL_SOURCE_DIR}/event/eventkcal-xiuos.c
|
||||
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
||||
)
|
||||
|
||||
SET(EVENT_KCAL_LINUXKERNEL_SOURCES
|
||||
${KERNEL_SOURCE_DIR}/event/eventkcal-linuxkernel.c
|
||||
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
||||
|
|
|
@ -46,14 +46,14 @@ SET (LIB_SOURCES
|
|||
${CTRL_UCAL_DIRECT_SOURCES}
|
||||
${DLL_UCAL_CIRCBUF_SOURCES}
|
||||
${ERRHND_UCAL_LOCAL_SOURCES}
|
||||
${EVENT_UCAL_XIUOS_SOURCES}
|
||||
${EVENT_UCAL_NOOSKERNEL_SOURCES}
|
||||
${PDO_UCAL_LOCAL_SOURCES}
|
||||
${USER_TIMER_XIUOS_SOURCES}
|
||||
${KERNEL_SOURCES}
|
||||
${CTRL_KCAL_DIRECT_SOURCES}
|
||||
${DLL_KCAL_CIRCBUF_SOURCES}
|
||||
${ERRHND_KCAL_LOCAL_SOURCES}
|
||||
${EVENT_KCAL_XIUOS_SOURCES}
|
||||
${EVENT_KCAL_NOOSKERNEL_SOURCES}
|
||||
${PDO_KCAL_LOCAL_SOURCES}
|
||||
${COMMON_SOURCES}
|
||||
${COMMON_LINUXUSER_SOURCES}
|
||||
|
|
|
@ -131,4 +131,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
// SDO module specific defines
|
||||
//==============================================================================
|
||||
|
||||
//==============================================================================
|
||||
// Circular buffer specific defines
|
||||
//==============================================================================
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_TO_USER 2048
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_TO_KERNEL 2048
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_INTERNAL 2048
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_INTERNAL 2048
|
||||
|
||||
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_NMT 2047
|
||||
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_GEN 2047
|
||||
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_VETH 2048
|
||||
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_SYNC 2048
|
||||
|
||||
#endif // _INC_oplkcfg_H_
|
||||
|
|
|
@ -47,14 +47,14 @@ SET (LIB_SOURCES
|
|||
${CTRL_UCAL_DIRECT_SOURCES}
|
||||
${DLL_UCAL_CIRCBUF_SOURCES}
|
||||
${ERRHND_UCAL_LOCAL_SOURCES}
|
||||
${EVENT_UCAL_XIUOS_SOURCES}
|
||||
${EVENT_UCAL_NOOSKERNEL_SOURCES}
|
||||
${PDO_UCAL_LOCAL_SOURCES}
|
||||
${USER_TIMER_XIUOS_SOURCES}
|
||||
${KERNEL_SOURCES}
|
||||
${CTRL_KCAL_DIRECT_SOURCES}
|
||||
${DLL_KCAL_CIRCBUF_SOURCES}
|
||||
${ERRHND_KCAL_LOCAL_SOURCES}
|
||||
${EVENT_KCAL_XIUOS_SOURCES}
|
||||
${EVENT_KCAL_NOOSKERNEL_SOURCES}
|
||||
${PDO_KCAL_LOCAL_SOURCES}
|
||||
${COMMON_SOURCES}
|
||||
${COMMON_LINUXUSER_SOURCES}
|
||||
|
|
|
@ -138,4 +138,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define CONFIG_SDO_MAX_CONNECTION_COM 100
|
||||
#define CONFIG_SDO_MAX_CONNECTION_UDP 50
|
||||
|
||||
//==============================================================================
|
||||
// Circular buffer specific defines
|
||||
//==============================================================================
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_TO_USER 2048
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_TO_KERNEL 2048
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_INTERNAL 2048
|
||||
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_INTERNAL 2048
|
||||
|
||||
#endif // _INC_oplkcfg_H_
|
||||
|
|
|
@ -110,7 +110,18 @@ tOplkError target_enumerateNetworkInterfaces(tNetIfId* pInterfaces_p,
|
|||
{
|
||||
UNUSED_PARAMETER(pInterfaces_p);
|
||||
UNUSED_PARAMETER(pNoInterfaces_p);
|
||||
return kErrorApiNotSupported;
|
||||
|
||||
if (*pNoInterfaces_p == 0)
|
||||
return kErrorOk;
|
||||
|
||||
memset(pInterfaces_p[0].aMacAddress, 0,
|
||||
sizeof(pInterfaces_p[0].aMacAddress));
|
||||
strcpy(pInterfaces_p[0].aDeviceName, "eth0");
|
||||
strcpy(pInterfaces_p[0].aDeviceDescription, "eth0");
|
||||
|
||||
*pNoInterfaces_p = 1;
|
||||
|
||||
return kErrorOk;
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
|
|
|
@ -1,377 +0,0 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file eventkcal-linux.c
|
||||
|
||||
\brief Kernel event CAL module for Linux userspace
|
||||
|
||||
This file implements the kernel event handler CAL module for the Linux
|
||||
userspace platform. It uses the circular buffer interface for all event queues.
|
||||
|
||||
\see eventkcalintf-circbuf.c
|
||||
|
||||
\ingroup module_eventkcal
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2020, AIIT XUOS Lab
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <common/oplkinc.h>
|
||||
#include <kernel/eventkcal.h>
|
||||
#include <kernel/eventkcalintf.h>
|
||||
#include <common/target.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include <common/target.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define KERNEL_EVENT_THREAD_PRIORITY 55
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
\brief Kernel event CAL instance type
|
||||
|
||||
The structure contains all necessary information needed by the kernel event
|
||||
CAL module.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
pthread_t threadId;
|
||||
BOOL fStopThread;
|
||||
sem_t semUserData;
|
||||
sem_t semKernelData;
|
||||
BOOL fInitialized;
|
||||
} tEventkCalInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
static tEventkCalInstance instance_l; ///< Instance variable of kernel event CAL module
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
static void* eventThread(void* arg);
|
||||
static void signalKernelEvent(void);
|
||||
static void signalUserEvent(void);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize kernel event CAL module
|
||||
|
||||
The function initializes the kernel event CAL module on Linux.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventkcal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventkcal_init(void)
|
||||
{
|
||||
struct sched_param schedParam;
|
||||
|
||||
OPLK_MEMSET(&instance_l, 0, sizeof(tEventkCalInstance));
|
||||
|
||||
if (sem_init(&instance_l.semUserData, 0, 0) < 0)
|
||||
goto Exit;
|
||||
|
||||
if (sem_init(&instance_l.semKernelData, 0, 0) < 0)
|
||||
goto Exit;
|
||||
|
||||
if (eventkcal_initQueueCircbuf(kEventQueueK2U) != kErrorOk)
|
||||
goto Exit;
|
||||
|
||||
if (eventkcal_initQueueCircbuf(kEventQueueU2K) != kErrorOk)
|
||||
goto Exit;
|
||||
|
||||
if (eventkcal_initQueueCircbuf(kEventQueueKInt) != kErrorOk)
|
||||
goto Exit;
|
||||
|
||||
eventkcal_setSignalingCircbuf(kEventQueueK2U, signalUserEvent);
|
||||
|
||||
eventkcal_setSignalingCircbuf(kEventQueueKInt, signalKernelEvent);
|
||||
|
||||
instance_l.fStopThread = FALSE;
|
||||
if (pthread_create(&instance_l.threadId, NULL, eventThread, (void*)&instance_l) != 0)
|
||||
goto Exit;
|
||||
|
||||
schedParam.sched_priority = KERNEL_EVENT_THREAD_PRIORITY;
|
||||
if (pthread_setschedparam(instance_l.threadId, SCHED_FIFO, &schedParam) != 0)
|
||||
{
|
||||
DEBUG_LVL_ERROR_TRACE("%s(): couldn't set thread scheduling parameters! %d\n",
|
||||
__func__,
|
||||
schedParam.sched_priority);
|
||||
}
|
||||
|
||||
#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 12)
|
||||
pthread_setname_np(instance_l.threadId, "oplk-eventk");
|
||||
#endif
|
||||
|
||||
instance_l.fInitialized = TRUE;
|
||||
return kErrorOk;
|
||||
|
||||
Exit:
|
||||
if (instance_l.semUserData >= 0)
|
||||
sem_destroy(&instance_l.semUserData);
|
||||
|
||||
if (instance_l.semKernelData >= 0)
|
||||
sem_destroy(&instance_l.semKernelData);
|
||||
|
||||
eventkcal_exitQueueCircbuf(kEventQueueK2U);
|
||||
eventkcal_exitQueueCircbuf(kEventQueueU2K);
|
||||
eventkcal_exitQueueCircbuf(kEventQueueKInt);
|
||||
|
||||
return kErrorNoResource;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clean up kernel event CAL module
|
||||
|
||||
The function cleans up the kernel event CAL module. For cleanup it calls the exit
|
||||
functions of the queue implementations for each used queue.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventkcal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventkcal_exit(void)
|
||||
{
|
||||
UINT i = 0;
|
||||
|
||||
if (instance_l.fInitialized != FALSE)
|
||||
{
|
||||
instance_l.fStopThread = TRUE;
|
||||
while (instance_l.fStopThread != FALSE)
|
||||
{
|
||||
target_msleep(10);
|
||||
if (i++ > 100)
|
||||
{
|
||||
DEBUG_LVL_EVENTK_TRACE("Event thread is not terminating, continue shutdown...!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
eventkcal_exitQueueCircbuf(kEventQueueK2U);
|
||||
eventkcal_exitQueueCircbuf(kEventQueueU2K);
|
||||
eventkcal_exitQueueCircbuf(kEventQueueKInt);
|
||||
|
||||
sem_destroy(&instance_l.semUserData);
|
||||
sem_destroy(&instance_l.semKernelData);
|
||||
|
||||
sem_unlink("/semUserEvent");
|
||||
sem_unlink("/semKernelEvent");
|
||||
|
||||
}
|
||||
instance_l.fInitialized = FALSE;
|
||||
|
||||
return kErrorOk;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Post kernel event
|
||||
|
||||
This function posts a event to the kernel queue.
|
||||
|
||||
\param[in] pEvent_p Event to be posted.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventkcal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventkcal_postKernelEvent(const tEvent* pEvent_p)
|
||||
{
|
||||
tOplkError ret;
|
||||
|
||||
ret = eventkcal_postEventCircbuf(kEventQueueKInt, pEvent_p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Post user event
|
||||
|
||||
This function posts a event to the user queue.
|
||||
|
||||
\param[in] pEvent_p Event to be posted.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventkcal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventkcal_postUserEvent(const tEvent* pEvent_p)
|
||||
{
|
||||
tOplkError ret;
|
||||
|
||||
ret = eventkcal_postEventCircbuf(kEventQueueK2U, pEvent_p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process function of kernel CAL module
|
||||
|
||||
This function will be called by the systems process function.
|
||||
|
||||
\ingroup module_eventkcal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventkcal_process(void)
|
||||
{
|
||||
// Nothing to do, because we use threads
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Event handler thread function
|
||||
|
||||
This function contains the main function for the event handler thread.
|
||||
|
||||
\param[in,out] arg Thread parameter. Not used!
|
||||
|
||||
\return The function returns the thread exit code.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void* eventThread(void* arg)
|
||||
{
|
||||
UINT32 tickCount;
|
||||
struct timespec curTime, timeout;
|
||||
tEventkCalInstance* pInstance = (tEventkCalInstance*)arg;
|
||||
|
||||
while (!pInstance->fStopThread)
|
||||
{
|
||||
tickCount = target_getTickCount();
|
||||
curTime.tv_sec = tickCount / 1000;
|
||||
curTime.tv_nsec = (tickCount % 1000) * 1000000;
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_nsec = 50000 * 1000;
|
||||
TIMESPECADD(&timeout, &curTime);
|
||||
|
||||
if (sem_timedwait(&pInstance->semKernelData, &timeout) == 0)
|
||||
{
|
||||
/* first handle kernel internal events --> higher priority! */
|
||||
if (eventkcal_getEventCountCircbuf(kEventQueueKInt) > 0)
|
||||
{
|
||||
eventkcal_processEventCircbuf(kEventQueueKInt);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (eventkcal_getEventCountCircbuf(kEventQueueU2K) > 0)
|
||||
{
|
||||
eventkcal_processEventCircbuf(kEventQueueU2K);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pInstance->fStopThread = FALSE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Signal a user event
|
||||
|
||||
This function signals that a user event was posted. It will be registered in
|
||||
the circular buffer library as signal callback function
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void signalUserEvent(void)
|
||||
{
|
||||
sem_post(&instance_l.semUserData);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Signal a kernel event
|
||||
|
||||
This function signals that a kernel event was posted. It will be registered in
|
||||
the circular buffer library as signal callback function
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void signalKernelEvent(void)
|
||||
{
|
||||
sem_post(&instance_l.semKernelData);
|
||||
}
|
||||
|
||||
/// \}
|
|
@ -1,379 +0,0 @@
|
|||
/**
|
||||
********************************************************************************
|
||||
\file eventucal-linux.c
|
||||
|
||||
\brief User event CAL module for XiUOS
|
||||
|
||||
This file implements the user event handler CAL module for the Linux
|
||||
userspace platform. It uses the circular buffer interface for all event queues.
|
||||
|
||||
\see eventucalintf-circbuf.c
|
||||
|
||||
\ingroup module_eventucal
|
||||
*******************************************************************************/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||
Copyright (c) 2020, AIIT XUOS Lab
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holders nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// includes
|
||||
//------------------------------------------------------------------------------
|
||||
#include <common/oplkinc.h>
|
||||
#include <user/eventucal.h>
|
||||
#include <user/eventucalintf.h>
|
||||
#include <common/target.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include <common/target.h>
|
||||
|
||||
//============================================================================//
|
||||
// G L O B A L D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
#define USER_EVENT_THREAD_PRIORITY 45
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// module global vars
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// global function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E D E F I N I T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// const defines
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local types
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief User event CAL instance type
|
||||
|
||||
The structure contains all necessary information needed by the user event
|
||||
CAL module.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
pthread_t threadId;
|
||||
BOOL fStopThread;
|
||||
sem_t semUserData;
|
||||
sem_t semKernelData;
|
||||
BOOL fInitialized;
|
||||
} tEventuCalInstance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local vars
|
||||
//------------------------------------------------------------------------------
|
||||
static tEventuCalInstance instance_l; ///< Instance variable of user event CAL module
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// local function prototypes
|
||||
//------------------------------------------------------------------------------
|
||||
static void* eventThread(void* arg);
|
||||
static void signalUserEvent(void);
|
||||
static void signalKernelEvent(void);
|
||||
|
||||
//============================================================================//
|
||||
// P U B L I C F U N C T I O N S //
|
||||
//============================================================================//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Initialize architecture specific stuff of user event CAL module
|
||||
|
||||
The function initializes the architecture specific stuff of the user event
|
||||
CAL module.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventucal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventucal_init(void)
|
||||
{
|
||||
struct sched_param schedParam;
|
||||
|
||||
OPLK_MEMSET(&instance_l, 0, sizeof(tEventuCalInstance));
|
||||
|
||||
if (sem_init(&instance_l.semUserData, 0, 0) < 0)
|
||||
goto Exit;
|
||||
|
||||
if (sem_init(&instance_l.semKernelData, 0, 0) < 0)
|
||||
goto Exit;
|
||||
|
||||
if (eventucal_initQueueCircbuf(kEventQueueK2U) != kErrorOk)
|
||||
goto Exit;
|
||||
|
||||
if (eventucal_initQueueCircbuf(kEventQueueU2K) != kErrorOk)
|
||||
goto Exit;
|
||||
|
||||
eventucal_setSignalingCircbuf(kEventQueueU2K, signalKernelEvent);
|
||||
|
||||
if (eventucal_initQueueCircbuf(kEventQueueUInt) != kErrorOk)
|
||||
goto Exit;
|
||||
|
||||
eventucal_setSignalingCircbuf(kEventQueueUInt, signalUserEvent);
|
||||
|
||||
instance_l.fStopThread = FALSE;
|
||||
if (pthread_create(&instance_l.threadId, NULL, eventThread, (void*)&instance_l) != 0)
|
||||
goto Exit;
|
||||
|
||||
schedParam.sched_priority = USER_EVENT_THREAD_PRIORITY;
|
||||
if (pthread_setschedparam(instance_l.threadId, SCHED_FIFO, &schedParam) != 0)
|
||||
{
|
||||
DEBUG_LVL_ERROR_TRACE("%s(): couldn't set thread scheduling parameters! %d\n",
|
||||
__func__,
|
||||
schedParam.sched_priority);
|
||||
}
|
||||
|
||||
#if (defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 12))
|
||||
pthread_setname_np(instance_l.threadId, "oplk-eventu");
|
||||
#endif
|
||||
|
||||
instance_l.fInitialized = TRUE;
|
||||
return kErrorOk;
|
||||
|
||||
Exit:
|
||||
if (instance_l.semUserData >= 0)
|
||||
sem_destroy(&instance_l.semUserData);
|
||||
|
||||
if (instance_l.semKernelData >= 0)
|
||||
sem_destroy(&instance_l.semKernelData);
|
||||
|
||||
eventucal_exitQueueCircbuf(kEventQueueK2U);
|
||||
eventucal_exitQueueCircbuf(kEventQueueU2K);
|
||||
eventucal_exitQueueCircbuf(kEventQueueUInt);
|
||||
|
||||
return kErrorNoResource;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Clean up kernel event CAL module
|
||||
|
||||
The function cleans up the kernel event CAL module. For cleanup it calls the exit
|
||||
functions of the queue implementations for each used queue.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventucal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventucal_exit(void)
|
||||
{
|
||||
UINT i = 0;
|
||||
|
||||
if (instance_l.fInitialized != FALSE)
|
||||
{
|
||||
instance_l.fStopThread = TRUE;
|
||||
while (instance_l.fStopThread != FALSE)
|
||||
{
|
||||
target_msleep(10);
|
||||
if (i++ > 100)
|
||||
{
|
||||
DEBUG_LVL_EVENTU_TRACE("%s(): Event thread is not terminating, continue shutdown...!\n",
|
||||
__func__);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
eventucal_exitQueueCircbuf(kEventQueueK2U);
|
||||
eventucal_exitQueueCircbuf(kEventQueueU2K);
|
||||
eventucal_exitQueueCircbuf(kEventQueueUInt);
|
||||
|
||||
sem_destroy(&instance_l.semUserData);
|
||||
sem_destroy(&instance_l.semKernelData);
|
||||
}
|
||||
instance_l.fInitialized = FALSE;
|
||||
|
||||
return kErrorOk;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Post kernel event
|
||||
|
||||
This function posts an event to a queue. It is called from the generic kernel
|
||||
event post function in the event handler. Depending on the sink the appropriate
|
||||
queue post function is called.
|
||||
|
||||
\param[in] pEvent_p Event to be posted.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventucal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventucal_postKernelEvent(const tEvent* pEvent_p)
|
||||
{
|
||||
tOplkError ret;
|
||||
|
||||
// Check parameter validity
|
||||
ASSERT(pEvent_p != NULL);
|
||||
|
||||
ret = eventucal_postEventCircbuf(kEventQueueU2K, pEvent_p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Post user event
|
||||
|
||||
This function posts an event to a queue. It is called from the generic kernel
|
||||
event post function in the event handler. Depending on the sink the appropriate
|
||||
queue post function is called.
|
||||
|
||||
\param[in] pEvent_p Event to be posted.
|
||||
|
||||
\return The function returns a tOplkError error code.
|
||||
\retval kErrorOk Function executes correctly
|
||||
\retval other error codes An error occurred
|
||||
|
||||
\ingroup module_eventucal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
tOplkError eventucal_postUserEvent(const tEvent* pEvent_p)
|
||||
{
|
||||
tOplkError ret;
|
||||
|
||||
// Check parameter validity
|
||||
ASSERT(pEvent_p != NULL);
|
||||
|
||||
ret = eventucal_postEventCircbuf(kEventQueueUInt, pEvent_p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Process function of user CAL module
|
||||
|
||||
This function will be called by the system process function.
|
||||
|
||||
\ingroup module_eventucal
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
void eventucal_process(void)
|
||||
{
|
||||
// Nothing to do, because we use threads
|
||||
}
|
||||
|
||||
//============================================================================//
|
||||
// P R I V A T E F U N C T I O N S //
|
||||
//============================================================================//
|
||||
/// \name Private Functions
|
||||
/// \{
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Event handler thread function
|
||||
|
||||
This function contains the main function for the event handler thread.
|
||||
|
||||
\param[in,out] arg Thread parameter. Used to access the module instance.
|
||||
|
||||
\return The function returns the thread exit code.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void* eventThread(void* arg)
|
||||
{
|
||||
UINT32 tickCount;
|
||||
struct timespec curTime, timeout;
|
||||
tEventuCalInstance* pInstance = (tEventuCalInstance*)arg;
|
||||
|
||||
while (!pInstance->fStopThread)
|
||||
{
|
||||
tickCount = target_getTickCount();
|
||||
curTime.tv_sec = tickCount / 1000;
|
||||
curTime.tv_nsec = (tickCount % 1000) * 1000000;
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_nsec = 50000 * 1000;
|
||||
TIMESPECADD(&timeout, &curTime);
|
||||
|
||||
if (sem_timedwait(&pInstance->semUserData, &timeout) == 0)
|
||||
{
|
||||
/* first handle all user to kernel events --> higher priority! */
|
||||
if (eventucal_getEventCountCircbuf(kEventQueueK2U) > 0)
|
||||
eventucal_processEventCircbuf(kEventQueueK2U);
|
||||
else
|
||||
{
|
||||
if (eventucal_getEventCountCircbuf(kEventQueueUInt) > 0)
|
||||
eventucal_processEventCircbuf(kEventQueueUInt);
|
||||
}
|
||||
}
|
||||
}
|
||||
pInstance->fStopThread = FALSE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Signal a user event
|
||||
|
||||
This function signals that a user event has been posted. It will be registered
|
||||
in the circular buffer library as signal callback function.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void signalUserEvent(void)
|
||||
{
|
||||
sem_post(&instance_l.semUserData);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/**
|
||||
\brief Signal a kernel event
|
||||
|
||||
This function signals that a kernel event has been posted. It will be registered
|
||||
in the circular buffer library as signal callback function.
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
static void signalKernelEvent(void)
|
||||
{
|
||||
sem_post(&instance_l.semKernelData);
|
||||
}
|
||||
|
||||
/// \}
|
Loading…
Reference in New Issue