2025-12-10 00:01:32 +08:00

309 lines
15 KiB
C

//-----------------------------------------------------------------------------
// (c) 2011 by Teledyne DALSA
// Section: Digital Imaging
// Project: GenCP
// Author: Eric Bourbonnais
//
// License: This file is published under the license of the EMVA GenICam Standard Group.
// A text file describing the legal terms is included in your installation as 'GenICam_license.pdf'.
// If for some reason you are missing this file please contact the EMVA or visit the website
// (http://www.genicam.org) for a full copy.
//
// THIS SOFTWARE IS PROVIDED BY THE EMVA GENICAM STANDARD GROUP "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 THE EMVA GENICAM STANDARD GROUP
// OR CONTRIBUTORS 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.
//-----------------------------------------------------------------------------
//
// Description:
// This file contains the defines required by GenCP protocol
//
//////////////////////////////////////////////////////////////////////////////
#ifndef __GEN_CP_DEFINES_H__
#define __GEN_CP_DEFINES_H__
// TODO: Move those includes!
#ifndef WIN32
#include <sys/types.h>
#include <netinet/in.h>
#endif
// TODO: Find os specific implementation of htonll
__inline static UINT64 htonll( UINT64 hostVlue)
{
UINT8 *in = (UINT8 *)&hostVlue;
union
{
UINT8 array[sizeof(UINT64)];
UINT64 value;
} out = {{in[7], in[6], in[5], in[4],
in[3], in[2], in[1], in[0]}};
return out.value;
}
#define ntohll htonll
//! Macro to set a QWORD in the datagram
#define SET_QWORD( p, o, v ) \
(*( PUINT64 )( ( (char *)(p) ) + o ) = htonll(v))
//! Macro to get a QWORD from the datagram
#define GET_QWORD( p, o ) \
(ntohll( *(( PUINT64 )( ( (char *)(p) ) + o ) ) ) )
//! Macro to set a DWORD in the datagram
#define SET_DWORD( p, o, v ) \
(*( int * )( ( (char *)(p) ) + o ) = htonl(v))
//! Macro to get a DWORD from the datagram
#define GET_DWORD( p, o ) \
(ntohl( *( int * )( ( (char *)(p) ) + o ) ))
//! Macro to set a WORD in the datagram
#define SET_WORD( p, o, v ) \
(*( short * )( ( (char *)(p) ) + o ) = htons(v))
//! Macro to get a WORD from the datagram
#define GET_WORD( p, o ) \
(ntohs( *( short * )( ( (char *)(p) ) + o ) ))
//! Macro to set a BYTE in the datagram
#define SET_BYTE( p, o, v ) \
(*( char * )( ( (char *)(p) ) + o ) = (v))
//! Macro to get a BYTE from the datagram
#define GET_BYTE( p, o ) \
( *( char * )( ( (char *)(p) ) + o ) )
//! Macro to get the address of a field in the datagram
#define GET_PTR( p, o ) \
( ( char * )( ( (char *)(p) ) + o ) )
///////////////////////////////////////////////////////////////////////////////
// Prefix
#ifdef CAMERA_LINK_HS
# define GENCP_PREFIX_PREAMBLE_SIZE sizeof(UINT16)
# define GENCP_PREFIX_CHANNEL_ID_SIZE sizeof(UINT16)
# define GENCP_PREFIX_SIZE ( GENCP_PREFIX_PREAMBLE_SIZE + GENCP_PREFIX_CHANNEL_ID_SIZE )
# define GENCP_PREFIX_PREAMBLE_OFFSET 0
# define GENCP_PREFIX_CHANNEL_ID_OFFSET ( GENCP_PREFIX_PREAMBLE_OFFSET + GENCP_PREFIX_PREAMBLE_SIZE )
# define GENCP_POSTFIX_CRC_SIZE sizeof(UINT16)
# define GENCP_POSTFIX_RESERVED_SIZE sizeof(UINT16)
# define GENCP_POSTFIX_SIZE ( GENCP_POSTFIX_CRC_SIZE + GENCP_POSTFIX_RESERVED_SIZE )
# define GENCP_POSTFIX_CRC_OFFSET 0
# define GENCP_POSTFIX_RESERVED_OFFSET ( GENCP_POSTFIX_CRC_OFFSET + GENCP_POSTFIX_CRC_SIZE )
# define GENCP_MAX_PACKET_SIZE 0xFFFF
#elif defined(CAMERA_LINK)
# define GENCP_PREFIX_PREAMBLE 0x0100
# define GENCP_PREFIX_PREAMBLE_LENGTH sizeof(UINT16)
# define GENCP_PREFIX_HEADER_SUM_LENGTH sizeof(UINT16)
# define GENCP_PREFIX_FRAME_SUM_LENGTH sizeof(UINT16)
# define GENCP_PREFIX_CHANNEL_LENGTH sizeof(UINT16)
# define GENCP_PREFIX_PREAMBLE_OFFSET 0
# define GENCP_PREFIX_HEADER_SUM_OFFSET ( GENCP_PREFIX_PREAMBLE_OFFSET + GENCP_PREFIX_PREAMBLE_LENGTH)
# define GENCP_PREFIX_FRAME_SUM_OFFSET ( GENCP_PREFIX_HEADER_SUM_OFFSET + GENCP_PREFIX_HEADER_SUM_LENGTH)
# define GENCP_PREFIX_CHANNEL_OFFSET ( GENCP_PREFIX_FRAME_SUM_OFFSET + GENCP_PREFIX_FRAME_SUM_LENGTH)
# define GENCP_PREFIX_SIZE 8
# define GENCP_POSTFIX_SIZE 0
# define GENCP_MAX_PACKET_SIZE ( (1000+8+8) + GENCP_PREFIX_SIZE + GENCP_POSTFIX_SIZE)
# define GENCP_PREFIX_CHANNEL_DEFAULT 0
#else
# define GENCP_PREFIX_SIZE 0
# define GENCP_POSTFIX_SIZE 0
# define GENCP_MAX_PACKET_SIZE 0xFFFF
#endif
#define GENCP_VERSION_ALPHA 0x00000005
#define GENCP_VERSION_RELEASE_1 0x00010000
#ifndef GENCP_VERSION_CURRENT
# define GENCP_VERSION_CURRENT GENCP_VERSION_RELEASE_1
#endif
typedef UINT16 GENCP_STATUS;
///////////////////////////////////////////////////////////////////////////////
// Common Command Section Header
#define GENCP_CCD_STATUS_LENGTH sizeof(UINT16)
#define GENCP_CCD_FLAG_LENGTH sizeof(UINT16)
#define GENCP_CCD_COMMAND_LENGTH sizeof(UINT16)
#define GENCP_CCD_LENGTH_LENGTH sizeof(UINT16)
#define GENCP_CCD_REQ_ID_LENGTH sizeof(UINT16)
#define GENCP_CCD_STATUS_OFFSET 0
#define GENCP_CCD_FLAGS_OFFSET 0
#define GENCP_CCD_COMMAND_OFFSET ( GENCP_CCD_FLAGS_OFFSET + GENCP_CCD_FLAG_LENGTH)
#define GENCP_CCD_LENGTH_OFFSET ( GENCP_CCD_COMMAND_OFFSET + GENCP_CCD_COMMAND_LENGTH)
#define GENCP_CCD_REQID_OFFSET ( GENCP_CCD_LENGTH_OFFSET + GENCP_CCD_LENGTH_LENGTH)
#define GENCP_CCD_SIZE ( GENCP_CCD_REQID_OFFSET + GENCP_CCD_REQ_ID_LENGTH)
///////////////////////////////////////////////////////////////////////////////
// Command Command Section Fields
// Flags
#define GENCP_CCD_FLAG_ACK_REQUEST (1<<14)
#define GENCP_CCD_FLAG_RESEND (1<<15)
// Commands
#define GENCP_CCD_COMMAND_READMEM_REQ 0x0800
#define GENCP_CCD_COMMAND_READMEM_ACK 0x0801
#define GENCP_CCD_COMMAND_WRITEMEM_REQ 0x0802
#define GENCP_CCD_COMMAND_WRITEMEM_ACK 0x0803
#define GENCP_CCD_COMMAND_PENDING_ACK 0x0805
#define GENCP_CCD_COMMAND_EVENT_REQ 0x0C00
#define GENCP_CCD_COMMAND_EVENT_ACK 0x0C01
// Status Code
#define GENCP_CCD_STATUS_SUCCESS 0x0000
#define GENCP_CCD_STATUS_NOT_IMPLEMENTED 0x8001
#define GENCP_CCD_STATUS_INVALID_PARAMETER 0x8002
#define GENCP_CCD_STATUS_INVALID_ADDRESS 0x8003
#define GENCP_CCD_STATUS_WRITE_PROTECT 0x8004
#define GENCP_CCD_STATUS_BAD_ALIGNMENT 0x8005
#define GENCP_CCD_STATUS_ACCESS_DENIED 0x8006
#define GENCP_CCD_STATUS_BUSY 0x8007
#define GENCP_CCD_STATUS_LOCAL_PROBLEM 0x8008
#define GENCP_CCD_STATUS_MISMATCH 0x8009
#define GENCP_CCD_STATUS_INVALID_PROTOCOL 0x800A
#define GENCP_CCD_STATUS_MSG_TIMEOUT 0x800B
#define GENCP_CCD_STATUS_INVALID_HEADER 0x800E
#define GENCP_CCD_STATUS_WRONG_CONFIG 0x800F
#define GENCP_CCD_STATUS_GENERIC_ERROR 0x8FFF
#define GENCP_LIB_STATUS_SUCCESS 0
#define GENCP_LIB_STATUS_BAD_PACKET_SIZE -20500
#define GENCP_LIB_STATUS_BAD_DATA_PACKET_SIZE -20501
#define GENCP_LIB_STATUS_INVALID_PACKET -20502
#define GENCP_LIB_STATUS_INVALID_ANSWER -20503
#define GENCP_LIB_STATUS_INVALID_REQ_ID -20504
#define GENCP_LIB_STATUS_INSUFFICENT_RESOURCE -20505
#define GENCP_LIB_STATUS_INCOMPATIBLE_PROTOCOL -20506
#define GENCP_LIB_STATUS_BAD_REGISTER_SIZE -20507
#define GENCP_LIB_STATUS_NO_TRANSACTION_PENDING -20508
#define GENCP_LIB_STATUS_UNZIPED_FAILED -20509
///////////////////////////////////////////////////////////////////////////////
// Specific Command Section Header
#define GENCP_MAX_SCD_SIZE ( GENCP_MAX_PACKET_SIZE - GENCP_CCD_SIZE)
#define GENCP_SCD_ADDR_SIZE ( sizeof(UINT64) )
#define GENCP_SCD_READMEM_RESERVE_SIZE ( sizeof(UINT16) )
#define GENCP_SCD_READMEM_LENGTH_SIZE ( sizeof(UINT16) )
#define GENCP_SCD_ADDR_OFFSET ( GENCP_CCD_SIZE )
#define GENCP_SCD_READMEM_DATA_OFFSET ( GENCP_CCD_SIZE )
#define GENCP_SCD_READMEM_RESERVE_OFFSET ( GENCP_SCD_ADDR_OFFSET + GENCP_SCD_ADDR_SIZE )
#define GENCP_SCD_READMEM_LENGTH_OFFSET ( GENCP_SCD_READMEM_RESERVE_OFFSET + GENCP_SCD_READMEM_RESERVE_SIZE )
#define GENCP_SCD_WRITEMEM_DATA_OFFSET ( GENCP_SCD_ADDR_OFFSET + GENCP_SCD_ADDR_SIZE )
#define GENCP_SCD_READMEM_REQ_SIZE ( GENCP_SCD_READMEM_LENGTH_OFFSET + GENCP_SCD_READMEM_LENGTH_SIZE )
#define GENCP_SCD_WRITEMEM_ACK_SIZE ( GENCP_CCD_SIZE )
#define GENCP_SCD_READMEM_MAX_DATA_SIZE ( GENCP_MAX_SCD_SIZE )
#define GENCP_SCD_WRITEMEM_MAX_DATA_SIZE ( GENCP_MAX_SCD_SIZE - GENCP_SCD_ADDR_SIZE )
// Pending
#define GENCP_SCD_PENDING_RESERVE_SIZE ( sizeof(UINT16) )
#define GENCP_SCD_PENDING_TIMEOUT_SIZE ( sizeof(UINT16) )
#define GENCP_SCD_PENDING_RESERVE_OFFSET ( GENCP_CCD_SIZE )
#define GENCP_SCD_PENDING_TIMEOUT_OFFSET ( GENCP_CCD_SIZE + GENCP_SCD_PENDING_RESERVE_SIZE )
#define GENCP_SCD_PENDING_ACK_SIZE ( GENCP_SCD_PENDING_TIMEOUT_OFFSET + GENCP_SCD_PENDING_TIMEOUT_SIZE )
// Event
#define GENCP_SCD_EVENT_RESERVED_SIZE ( sizeof(UINT16) )
#define GENCP_SCD_EVENTID_SIZE ( sizeof(UINT16) )
#define GENCP_SCD_TIMESTAMP_SIZE ( sizeof(UINT64) )
#define GENCP_SCD_EVENT_EVENTID_OFFSET ( GENCP_CCD_SIZE + GENCP_SCD_EVENT_RESERVED_SIZE)
#define GENCP_SCD_EVENT_TIMESTAMP_OFFSET ( GENCP_SCD_EVENT_EVENTID_OFFSET + GENCP_SCD_EVENTID_SIZE)
#define GENCP_SCD_EVENT_DATA_OFFSET ( GENCP_SCD_EVENT_TIMESTAMP_OFFSET + GENCP_SCD_TIMESTAMP_SIZE)
///////////////////////////////////////////////////////////////////////////////
// Boot Strap Registers
#if GENCP_VERSION_CURRENT >= 0x00010000
#define _GENCP_COMPATIBILITY_OFFSET 64
#else
#define _GENCP_COMPATIBILITY_OFFSET 0
#endif
#define PROTOCOL_VERSION_OFFSET 0x0000
#define MANUFACTURER_NAME_OFFSET 0x0004
#define DEVICE_MODEL_OFFSET 0x0044
#define DEVICE_FAMILY_OFFSET 0x0084
#define DEVICE_VERSION_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x0084 )
#define MANUFACTURER_INFO_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x00C4 )
#define SERIAL_NUMBER_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x0104 )
#define USER_DEFINED_NAME_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x0144 )
#define DEVICE_CAPABILITY_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x0184 )
#define MAX_DEVICE_RESPONSE_TIME_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x018C )
#define MANIFEST_TABLE_ADDR_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x0190 )
#define SBRM_ADDR_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x0198 )
#define DEVICE_CONFIGURATION_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x01A0 )
#define HEARTBEAT_TIMEOUT_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x01A8 )
#define MESSAGE_CHANNEL_ID_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x01AC )
#define TIMESTAMP_OFFSET ( _GENCP_COMPATIBILITY_OFFSET + 0x01B0 )
#define PROTOCOL_VERSION_SIZE 4
#define MANUFACTURER_NAME_SIZE 64
#define DEVICE_MODEL_SIZE 64
#define DEVICE_FAMILY_SIZE 64
#define DEVICE_VERSION_SIZE 64
#define MANUFACTURER_INFO_SIZE 64
#define SERIAL_NUMBER_SIZE 64
#define USER_DEFINED_NAME_SIZE 64
#define DEVICE_CAPABILITY_SIZE 8
#define MAX_DEVICE_RESPONSE_TIME_SIZE 4
#define MANIFEST_TABLE_ADDR_SIZE 8
#define SBRM_ADDR_SIZE 8
#define DEVICE_CONFIGURATION_SIZE 8
#define HEARTBEAT_TIMEOUT_SIZE 4
#define MESSAGE_CHANNEL_ID_SIZE 4
#define TIMESTAMP_SIZE 8
#define CAPABILITY_USER_NAME_AVAILABLE 0x0000000000000001ull
#define CAPABILITY_ACCESS_PRIVILEGE_AVAILABLE 0x0000000000000002ull
#define CAPABILITY_MESSAGE_CHANNEL_SUPPORTED 0x0000000000000004ull
#define CAPABILITY_TIMESTAMP_SUPPORTED 0x0000000000000008ull
#define CAPABILITY_STRING_ENCODING 0x00000000000000F0ull
#define CAPABILITY_FAMILY_REGISTER_AVAILABLE 0x0000000000000100ull
#define CAPABILITY_SBRM_SUPPORTED 0x0000000000000200ull
#define CAPABILITY_ENDIANESS_REGISTER_SUPPORTED 0x0000000000000400ull
#define CAPABILITY_WRITTEN_LENGTH_SUPPORTED 0x0000000000000800ull
#define CL_SERIAL_BITRATEX_AVAILABLE_OFFSET ( SBRM_OFFSET )
#define CL_SERIAL_BITRATE_AVAILABLE 4
#define CL_SERIAL_BITRATEX_OFFSET ( CL_SERIAL_BITRATEX_AVAILABLE_OFFSET + CL_SERIAL_BITRATE_AVAILABLE )
#define CL_SERIAL_BITRATE_SIZE 4
#define MANIFEST_ENTRY_FILE_INFO_INDEX 0
#define MANIFEST_ENTRY_FILE_VERSION_MAJOR_INDEX 0
#define MANIFEST_ENTRY_FILE_VERSION_MINOR_INDEX 1
#define MANIFEST_ENTRY_FILE_VERSION_SUBMINOR_INDEX 2
#define MANIFEST_ENTRY_FILE_GEN_VERSION_MAJOR_INDEX 4
#define MANIFEST_ENTRY_FILE_GEN_VERSION_MINOR_INDEX 5
#define MANIFEST_ENTRY_FILE_TYPE_INDEX 6
#define MANIFEST_ENTRY_FILE_ADDR_INDEX 8
#define MANIFEST_ENTRY_FILE_SIZE_INDEX 16
#define MANIFEST_ENTRY_RESERVED_INDEX 24
#define MANIFEST_ENTRY_COUNT_OFFSET MANIFEST_OFFSET
#define MANIFEST_ENTRY_COUNT_SIZE 8
#define MANIFEST_ENTRY_SIZE 24
#define MANIFEST_ENTRY_MAX_SIZE_SIZE 64
#define MANIFEST_ENTRYX_OFFSET(X) ( MANIFEST_ENTRY_COUNT_OFFSET + MANIFEST_ENTRY_COUNT_SIZE + ( X * MANIFEST_ENTRY_MAX_SIZE_SIZE ) )
#define MANIFEST_ENTRYX_INFO_OFFSET(X) ( MANIFEST_ENTRYX_OFFSET(X) + MANIFEST_ENTRY_FILE_INFO_INDEX )
#define MANIFEST_ENTRYX_FILE_ADDR_OFFSET(X) ( MANIFEST_ENTRYX_OFFSET(X) + MANIFEST_ENTRY_FILE_ADDR_INDEX )
#define MANIFEST_ENTRYX_FILE_SIZE_OFFSET(X) ( MANIFEST_ENTRYX_OFFSET(X) + MANIFEST_ENTRY_FILE_SIZE_INDEX )
#define MANIFEST_ENTRYX_RESERVED_OFFSET(X) ( MANIFEST_ENTRYX_OFFSET(X) + MANIFEST_ENTRY_RESERVED_INDEX )
//#define MANIFEST_URL_SIZE 256
#endif //__GEN_CP_DEFINES_H__