309 lines
15 KiB
C
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__
|