nxdrvlinux/examples/tcpserver/Marshaller/MarshallerInternal.h
Sebastian Doell ac2f4d1789 Add initial driver source based on svn versions:
- toolkit V2.8.0.1@14806
 - BSL V1.8.0.0@14590
 - tcpserver: V1.4.3.0@14676 (marshaller V2.4.0.1@14551)
2024-02-05 09:23:09 +01:00

238 lines
10 KiB
C

/**************************************************************************************
Copyright (c) Hilscher GmbH. All Rights Reserved.
**************************************************************************************
Filename:
$Id: MarshallerInternal.h 13309 2019-11-05 12:03:27Z AlexanderMinor $
Last Modification:
$Author: AlexanderMinor $
$Date: 2019-11-05 13:03:27 +0100 (Di, 05 Nov 2019) $
$Revision: 13309 $
Targets:
OS independent : yes
Description:
Marshaller internal structure definitions
Changes:
Version Date Author Description
----------------------------------------------------------------------------------
5 06.07.2010 MT Change:
- Re-Added Tx Buffers, as they were used by
Packet Transport
- Added new configuration elements per
connector for configuration of TX Buffers (see HIL_MARSHALLER_CONNECTOR_T)
4 23.09.2009 MS Change:
- Removed unused Tx buffers and doubled number of Rx buffers to avoid resource errors without increasing memory footprint.
3 22.09.2009 MS Addon:
- Added member ulMode to CONNECTOR_DATA_T.
2 28.07.2009 MS Change:
- Moved Marshaller version constants to MarshallerVersion.h.
1 25.05.2009 MT initial version
**************************************************************************************/
/*****************************************************************************/
/*! \file MarshallerInternal.h
* Internal structure and API definitions of the netX Marshaller */
/*****************************************************************************/
#ifndef __MARSHALLERINTERNAL__H
#define __MARSHALLERINTERNAL__H
#include "cifXAPI_Wrapper.h"
#include "MarshallerConfig.h"
#include "HilTransport.h"
#include <sys/queue.h>
#include <stdbool.h>
/*****************************************************************************/
/*! \addtogroup NETX_MARSHALLER_INTERNAL
* \{ */
/*****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
typedef enum MARSHALLER_BUFFER_TYPE_Etag
{
eMARSHALLER_RX_BUFFER,
eMARSHALLER_TX_BUFFER,
eMARSHALLER_ACK_BUFFER,
eMARSHALLER_KEEPALIVE_BUFFER,
} MARSHALLER_BUFFER_TYPE_E;
/*****************************************************************************/
/*! Marshaller Send/Receive buffer structure */
/*****************************************************************************/
struct HIL_MARSHALLER_BUFFER_Ttag
{
/* Single linked list */
STAILQ_ENTRY(HIL_MARSHALLER_BUFFER_Ttag) tList;
struct
{
uint32_t ulConnectorIdx; /*!< Connector number of this buffer */
void* pvMarshaller; /*!< Marshaller object this buffer has been allocated by */
MARSHALLER_BUFFER_TYPE_E eType; /*!< Type of buffer */
uint32_t ulDataBufferLen; /*!< Total length of buffer (only counting the size of abData[] */
uint32_t ulUsedDataBufferLen; /*!< Number of used bytes in abData[] */
uint32_t ulActualSendOffset; /*!< Can be used by connector for fragmented sending */
} tMgmt;
HIL_TRANSPORT_HEADER tTransport; /*!< Transport header */
uint8_t abData[1]; /*!< User data */
};
typedef struct HIL_MARSHALLER_BUFFER_Ttag HIL_MARSHALLER_BUFFER_T;
typedef uint32_t(*PFN_CONN_TRANSMIT)(HIL_MARSHALLER_BUFFER_T* ptBuffer, void* pvUser);
typedef void(*PFN_CONN_DEINIT)(void* pvUser);
typedef void(*PFN_CONN_POLL)(void* pvUser);
/*****************************************************************************/
/*! Connector registration information (filled by Connector) */
/*****************************************************************************/
typedef struct HIL_MARSHALLER_CONNECTOR_Ttag
{
PFN_CONN_TRANSMIT pfnTransmit; /*!< Transmit function */
PFN_CONN_DEINIT pfnDeinit; /*!< Uninitialization function */
PFN_CONN_POLL pfnPoll; /*!< Function to call, if the connector needs to be polled */
uint32_t ulDataBufferSize; /*!< Size for the RX buffers in Bytes */
uint32_t ulDataBufferCnt; /*!< Number of RX buffers to allocate per Connector */
uint32_t ulTimeout; /*!< Timeout for RX state machine */
void* pvUser; /*!< User parameter to provide on function calls */
/* NOTE: These information were added to the end of the structure to be old
compatible. When using the previous structure initializations these fields
will automatically be set to 0 */
uint32_t ulTxBufferSize; /*!< TX Buffer size for unsolicited packets / calls (indication / callbacks) */
uint32_t ulTxBufferCnt; /*!< TX Buffer count for unsolicited packets / calls (indication / callbacks) */
} HIL_MARSHALLER_CONNECTOR_T;
typedef void(*PFN_TRANSPORT_HANDLER)(void* pvMarshaller, HIL_MARSHALLER_BUFFER_T* ptBuffer, void* pvUser);
typedef void(*PFN_TRANSPORT_DEINIT)(void* pvUser);
typedef void(*PFN_TRANSPORT_POLL)(void* pvUser);
/*****************************************************************************/
/*! Transport layer registration information */
/*****************************************************************************/
typedef struct TRANSPORT_LAYER_DATA_Ttag
{
uint16_t usDataType;
uint16_t usReserved;
PFN_TRANSPORT_HANDLER pfnHandler;
PFN_TRANSPORT_DEINIT pfnDeinit;
PFN_TRANSPORT_POLL pfnPoll;
void* pvUser;
} TRANSPORT_LAYER_DATA_T;
/* This function is called by a connector when it receives data from the line */
uint32_t HilMarshallerConnRxData(void* pvMarshaller, uint32_t ulConnector, uint8_t* pbData, uint32_t ulDataCnt);
/* This function is called by a transport, to send an answer */
uint32_t HilMarshallerConnTxData(void* pvMarshaller, uint32_t ulConnector, HIL_MARSHALLER_BUFFER_T* ptBuffer);
/* This function is called by a connector, to signal transfer complete */
uint32_t HilMarshallerConnTxComplete(void* pvMarshaller, uint32_t ulConnector, HIL_MARSHALLER_BUFFER_T* ptBuffer);
/* Connector registration/deregistration */
uint32_t HilMarshallerRegisterConnector(void* pvMarshaller, uint32_t* pulConnectorIdx, HIL_MARSHALLER_CONNECTOR_T* ptConn);
void HilMarshallerUnregisterConnector(void* pvMarshaller, uint32_t ulConnectorIdx);
/* Register data transport layers */
uint32_t HilMarshallerRegisterTransport(void* pvMarshaller, const TRANSPORT_LAYER_DATA_T* ptLayerData);
void HilMarshallerUnregisterTransport(void* pvMarshaller, uint16_t usDataType);
void HilMarshallerFreeBuffer(HIL_MARSHALLER_BUFFER_T* ptBuffer);
HIL_MARSHALLER_BUFFER_T* HilMarshallerGetBuffer(void* pvMarshaller, MARSHALLER_BUFFER_TYPE_E eType, uint32_t ulConnector);
/*****************************************************************************/
/*! Enum for the receive data state machine */
/*****************************************************************************/
typedef enum
{
HIL_SCAN_DONE = 0,
HIL_SEARCH_TELEGRAM_COOKIE,
HIL_SEARCH_TELEGRAM_HEADER,
HIL_WAIT_TELEGRAM_DATA,
HIL_CHECK_TELEGRAM
} HIL_SCAN_STATE_E;
STAILQ_HEAD(MARSHALLER_BUFFER_HEAD, HIL_MARSHALLER_BUFFER_Ttag);
/*****************************************************************************/
/*! Marshaller internal connector data storage */
/*****************************************************************************/
typedef struct CONNECTOR_DATA_Ttag
{
bool fInUse; /*!< TRUE if connector slot is in use (contains a registered connector) */
uint32_t ulConnectorIdx; /*!< Number of the connector */
uint32_t ulMode; /*!< connector mode, see MARSHALLER_MODE_xxx constants */
/* Connector Registration data */
HIL_MARSHALLER_CONNECTOR_T tConn; /*!< Registration data */
/* Data for parsing RX telegram data */
HIL_SCAN_STATE_E eScanState; /*!< Current state of receive state machine */
HIL_TRANSPORT_HEADER tRxHeader; /*!< Transport header used by parser for start of frame detection */
uint32_t ulRxOffset; /*!< Current receive offset inside tRxHeader (used by parser) */
bool fMonitorTimeout; /*!< TRUE if timeout should be monitored */
uint32_t ulElapsedTime; /*!< Time since last scanner process, used for RX data timeout */
uint32_t ulKeepaliveID; /*!< Last valid keep alive ID */
HIL_MARSHALLER_BUFFER_T* ptCurrentRxBuffer;/*!< Current used RX buffer to collect data */
/* RX / Ack Buffer list */
struct MARSHALLER_BUFFER_HEAD tRxBuffer;
struct MARSHALLER_BUFFER_HEAD tTxBuffer;
struct MARSHALLER_BUFFER_HEAD tAckBuffer;
struct MARSHALLER_BUFFER_HEAD tKeepAliveBuffer;
} CONNECTOR_DATA_T;
/*****************************************************************************/
/*! Marshaller data storage */
/*****************************************************************************/
typedef struct HIL_MARSHALLER_DATA_Ttag
{
char szServerName[HIL_TRANSPORT_QUERYSERVER_NAMELEN];
uint32_t ulMaxConnectors; /*!< Maximum number of connectors (size of atConnectors[]) */
CONNECTOR_DATA_T* atConnectors; /*!< Array of available connectors */
/* cifX API Layer configuration */
uint32_t ulTransports; /*!< Number of available transport handler */
TRANSPORT_LAYER_DATA_T* ptTransports; /*!< Array of available transport handler */
struct MARSHALLER_BUFFER_HEAD tPendingRequests;
PFN_MARSHALLER_REQUEST pfnRequest;
void* pvUser;
} HIL_MARSHALLER_DATA_T;
#ifdef __cplusplus
}
#endif
/*****************************************************************************/
/*! \} */
/*****************************************************************************/
#endif /* __MARSHALLERINTERNAL__H */