Création du repo et ajout de la librairie PCAN

This commit is contained in:
jfmartel 2023-01-06 12:25:54 -05:00
commit 12d88f9a73
113 changed files with 18524 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.o
*.pro.user
*~*

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,543 @@
Attribute VB_Name = "PCANBasic"
' PCANBasic.bas
'
' ~~~~~~~~~~~~
'
' PCAN-Basic API
'
' ~~~~~~~~~~~~
'
' ------------------------------------------------------------------
' Author : Keneth Wagner
' Last change: 2022-07-06
'
' Language: Visual Basic 6.0
' ------------------------------------------------------------------
'
' Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
' more Info at http://www.peak-system.com
'
'///////////////////////////////////////////////////////////
'/ Value definitions
'///////////////////////////////////////////////////////////
' Currently defined and supported PCAN channels
'
Public Const PCAN_NONEBUS As Long = &H0 ' Undefined/default value for a PCAN bus
Public Const PCAN_ISABUS1 As Long = &H21 ' PCAN-ISA interface, channel 1
Public Const PCAN_ISABUS2 As Long = &H22 ' PCAN-ISA interface, channel 2
Public Const PCAN_ISABUS3 As Long = &H23 ' PCAN-ISA interface, channel 3
Public Const PCAN_ISABUS4 As Long = &H24 ' PCAN-ISA interface, channel 4
Public Const PCAN_ISABUS5 As Long = &H25 ' PCAN-ISA interface, channel 5
Public Const PCAN_ISABUS6 As Long = &H26 ' PCAN-ISA interface, channel 6
Public Const PCAN_ISABUS7 As Long = &H27 ' PCAN-ISA interface, channel 7
Public Const PCAN_ISABUS8 As Long = &H28 ' PCAN-ISA interface, channel 8
Public Const PCAN_DNGBUS1 As Long = &H31 ' PCAN-Dongle/LPT interface, channel 1
Public Const PCAN_PCIBUS1 As Long = &H41 ' PCAN-PCI interface, channel 1
Public Const PCAN_PCIBUS2 As Long = &H42 ' PCAN-PCI interface, channel 2
Public Const PCAN_PCIBUS3 As Long = &H43 ' PCAN-PCI interface, channel 3
Public Const PCAN_PCIBUS4 As Long = &H44 ' PCAN-PCI interface, channel 4
Public Const PCAN_PCIBUS5 As Long = &H45 ' PCAN-PCI interface, channel 5
Public Const PCAN_PCIBUS6 As Long = &H46 ' PCAN-PCI interface, channel 6
Public Const PCAN_PCIBUS7 As Long = &H47 ' PCAN-PCI interface, channel 7
Public Const PCAN_PCIBUS8 As Long = &H48 ' PCAN-PCI interface, channel 8
Public Const PCAN_PCIBUS9 As Long = &H409 ' PCAN-PCI interface, channel 9
Public Const PCAN_PCIBUS10 As Long = &H40A ' PCAN-PCI interface, channel 10
Public Const PCAN_PCIBUS11 As Long = &H40B ' PCAN-PCI interface, channel 11
Public Const PCAN_PCIBUS12 As Long = &H40C ' PCAN-PCI interface, channel 12
Public Const PCAN_PCIBUS13 As Long = &H40D ' PCAN-PCI interface, channel 13
Public Const PCAN_PCIBUS14 As Long = &H40E ' PCAN-PCI interface, channel 14
Public Const PCAN_PCIBUS15 As Long = &H40F ' PCAN-PCI interface, channel 15
Public Const PCAN_PCIBUS16 As Long = &H410 ' PCAN-PCI interface, channel 16
Public Const PCAN_USBBUS1 As Long = &H51 ' PCAN-USB interface, channel 1
Public Const PCAN_USBBUS2 As Long = &H52 ' PCAN-USB interface, channel 2
Public Const PCAN_USBBUS3 As Long = &H53 ' PCAN-USB interface, channel 3
Public Const PCAN_USBBUS4 As Long = &H54 ' PCAN-USB interface, channel 4
Public Const PCAN_USBBUS5 As Long = &H55 ' PCAN-USB interface, channel 5
Public Const PCAN_USBBUS6 As Long = &H56 ' PCAN-USB interface, channel 6
Public Const PCAN_USBBUS7 As Long = &H57 ' PCAN-USB interface, channel 7
Public Const PCAN_USBBUS8 As Long = &H58 ' PCAN-USB interface, channel 8
Public Const PCAN_USBBUS9 As Long = &H509 ' PCAN-USB interface, channel 9
Public Const PCAN_USBBUS10 As Long = &H50A ' PCAN-USB interface, channel 10
Public Const PCAN_USBBUS11 As Long = &H50B ' PCAN-USB interface, channel 11
Public Const PCAN_USBBUS12 As Long = &H50C ' PCAN-USB interface, channel 12
Public Const PCAN_USBBUS13 As Long = &H50D ' PCAN-USB interface, channel 13
Public Const PCAN_USBBUS14 As Long = &H50E ' PCAN-USB interface, channel 14
Public Const PCAN_USBBUS15 As Long = &H50F ' PCAN-USB interface, channel 15
Public Const PCAN_USBBUS16 As Long = &H510 ' PCAN-USB interface, channel 16
Public Const PCAN_PCCBUS1 As Long = &H61 ' PCAN-PC Card interface, channel 1
Public Const PCAN_PCCBUS2 As Long = &H62 ' PCAN-PC Card interface, channel 2
Public Const PCAN_LANBUS1 As Long = &H801 ' PCAN-LAN interface, channel 1
Public Const PCAN_LANBUS2 As Long = &H802 ' PCAN-LAN interface, channel 2
Public Const PCAN_LANBUS3 As Long = &H803 ' PCAN-LAN interface, channel 3
Public Const PCAN_LANBUS4 As Long = &H804 ' PCAN-LAN interface, channel 4
Public Const PCAN_LANBUS5 As Long = &H805 ' PCAN-LAN interface, channel 5
Public Const PCAN_LANBUS6 As Long = &H806 ' PCAN-LAN interface, channel 6
Public Const PCAN_LANBUS7 As Long = &H807 ' PCAN-LAN interface, channel 7
Public Const PCAN_LANBUS8 As Long = &H808 ' PCAN-LAN interface, channel 8
Public Const PCAN_LANBUS9 As Long = &H809 ' PCAN-LAN interface, channel 9
Public Const PCAN_LANBUS10 As Long = &H80A ' PCAN-LAN interface, channel 10
Public Const PCAN_LANBUS11 As Long = &H80B ' PCAN-LAN interface, channel 11
Public Const PCAN_LANBUS12 As Long = &H80C ' PCAN-LAN interface, channel 12
Public Const PCAN_LANBUS13 As Long = &H80D ' PCAN-LAN interface, channel 13
Public Const PCAN_LANBUS14 As Long = &H80E ' PCAN-LAN interface, channel 14
Public Const PCAN_LANBUS15 As Long = &H80F ' PCAN-LAN interface, channel 15
Public Const PCAN_LANBUS16 As Long = &H810 ' PCAN-LAN interface, channel 16
' Represent the PCAN error and status codes
'
Public Const PCAN_ERROR_OK As Long = &H0 ' No error
Public Const PCAN_ERROR_XMTFULL As Long = &H1 ' Transmit buffer in CAN controller is full
Public Const PCAN_ERROR_OVERRUN As Long = &H2 ' CAN controller was read too late
Public Const PCAN_ERROR_BUSLIGHT As Long = &H4 ' Bus error: an error counter reached the 'light' limit [Not used with the *FD functions]
Public Const PCAN_ERROR_BUSHEAVY As Long = &H8 ' Bus error: an error counter reached the 'heavy' limit
Public Const PCAN_ERROR_BUSWARNING = PCAN_ERROR_BUSHEAVY ' An error counter reached the 'warning' limit [ONLY used with the *FD functions]
Public Const PCAN_ERROR_BUSPASSIVE As Long = &H40000 ' Bus error: the CAN controller is in bus-off state
Public Const PCAN_ERROR_BUSOFF As Long = &H10 ' Bus error: the CAN controller is in bus-off state
Public Const PCAN_ERROR_ANYBUSERR = (PCAN_ERROR_BUSWARNING Or PCAN_ERROR_BUSLIGHT Or PCAN_ERROR_BUSHEAVY Or PCAN_ERROR_BUSOFF Or PCAN_ERROR_BUSPASSIVE) ' Mask for all bus errors
Public Const PCAN_ERROR_QRCVEMPTY As Long = &H20 ' Receive queue is empty
Public Const PCAN_ERROR_QOVERRUN As Long = &H40 ' Receive queue was read too late
Public Const PCAN_ERROR_QXMTFULL As Long = &H80 ' Transmit queue is full
Public Const PCAN_ERROR_REGTEST As Long = &H100 ' Test of the CAN controller hardware registers failed (no hardware found)
Public Const PCAN_ERROR_NODRIVER As Long = &H200 ' Driver not loaded
Public Const PCAN_ERROR_HWINUSE As Long = &H400 ' Hardware already in use by a Net
Public Const PCAN_ERROR_NETINUSE As Long = &H800 ' A Client is already connected to the Net
Public Const PCAN_ERROR_ILLHW As Long = &H1400 ' Hardware handle is invalid
Public Const PCAN_ERROR_ILLNET As Long = &H1800 ' Net handle is invalid
Public Const PCAN_ERROR_ILLCLIENT As Long = &H1C00 ' Client handle is invalid
Public Const PCAN_ERROR_ILLHANDLE = (PCAN_ERROR_ILLHW Or PCAN_ERROR_ILLNET Or PCAN_ERROR_ILLCLIENT) ' Mask for all handle errors
Public Const PCAN_ERROR_RESOURCE As Long = &H2000 ' Resource (FIFO, Client, timeout) cannot be created
Public Const PCAN_ERROR_ILLPARAMTYPE As Long = &H4000 ' Invalid parameter
Public Const PCAN_ERROR_ILLPARAMVAL As Long = &H8000 ' Invalid parameter value
Public Const PCAN_ERROR_UNKNOWN As Long = &H10000 ' Unknown error
Public Const PCAN_ERROR_ILLDATA As Long = &H20000 ' Invalid data, function, or action
Public Const PCAN_ERROR_ILLMODE As Long = &H80000 ' Driver object state is wrong for the attempted operation
Public Const PCAN_ERROR_CAUTION As Long = &H2000000 ' An operation was successfully carried out, however, irregularities were registered
Public Const PCAN_ERROR_INITIALIZE As Long = &H4000000 ' Channel is not initialized [Value was changed from &H40000 to &H4000000]
Public Const PCAN_ERROR_ILLOPERATION As Long = &H8000000 ' Invalid operation [Value was changed from &H80000 to &H8000000]
' PCAN devices
'
Public Const PCAN_NONE = &H0 ' Undefined, unknown or not selected PCAN device value
Public Const PCAN_PEAKCAN = &H1 ' PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
Public Const PCAN_ISA = &H2 ' PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
Public Const PCAN_DNG = &H3 ' PCAN-Dongle
Public Const PCAN_PCI = &H4 ' PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
Public Const PCAN_USB = &H5 ' PCAN-USB and PCAN-USB Pro
Public Const PCAN_PCC = &H6 ' PCAN-PC Card
Public Const PCAN_VIRTUAL = &H7 ' PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
Public Const PCAN_LAN = &H8 ' PCAN Gateway devices
' PCAN parameters
'
Public Const PCAN_DEVICE_ID = &H1 ' Device identifier parameter
Public Const PCAN_5VOLTS_POWER = &H2 ' 5-Volt power parameter
Public Const PCAN_RECEIVE_EVENT = &H3 ' PCAN receive event handler parameter
Public Const PCAN_MESSAGE_FILTER = &H4 ' PCAN message filter parameter
Public Const PCAN_API_VERSION = &H5 ' PCAN-Basic API version parameter
Public Const PCAN_CHANNEL_VERSION = &H6 ' PCAN device channel version parameter
Public Const PCAN_BUSOFF_AUTORESET = &H7 ' PCAN Reset-On-Busoff parameter
Public Const PCAN_LISTEN_ONLY = &H8 ' PCAN Listen-Only parameter
Public Const PCAN_LOG_LOCATION = &H9 ' Directory path for log files
Public Const PCAN_LOG_STATUS = &HA ' Debug-Log activation status
Public Const PCAN_LOG_CONFIGURE = &HB ' Configuration of the debugged information (LOG_FUNCTION_***)
Public Const PCAN_LOG_TEXT = &HC ' Custom insertion of text into the log file
Public Const PCAN_CHANNEL_CONDITION = &HD ' Availability status of a PCAN-Channel
Public Const PCAN_HARDWARE_NAME = &HE ' PCAN hardware name parameter
Public Const PCAN_RECEIVE_STATUS = &HF ' Message reception status of a PCAN-Channel
Public Const PCAN_CONTROLLER_NUMBER = &H10 ' CAN-Controller number of a PCAN-Channel
Public Const PCAN_TRACE_LOCATION = &H11 ' Directory path for PCAN trace files
Public Const PCAN_TRACE_STATUS = &H12 ' CAN tracing activation status
Public Const PCAN_TRACE_SIZE = &H13 ' Configuration of the maximum file size of a CAN trace.
Public Const PCAN_TRACE_CONFIGURE = &H14 ' Configuration of the trace file storing mode (TRACE_FILE_***)
Public Const PCAN_CHANNEL_IDENTIFYING = &H15 ' Physical identification of a USB based PCAN-Channel by blinking its associated LED
Public Const PCAN_CHANNEL_FEATURES = &H16 ' Capabilities of a PCAN device (FEATURE_***)
Public Const PCAN_BITRATE_ADAPTING = &H17 ' Using of an existing bit rate (PCAN-View connected to a channel)
Public Const PCAN_BITRATE_INFO = &H18 ' Configured bit rate as Btr0Btr1 value
Public Const PCAN_BITRATE_INFO_FD = &H19 ' Configured bit rate as TPCANBitrateFD string
Public Const PCAN_BUSSPEED_NOMINAL = &H1A ' Configured nominal CAN Bus speed as Bits per seconds
Public Const PCAN_BUSSPEED_DATA = &H1B ' Configured CAN data speed as Bits per seconds
Public Const PCAN_IP_ADDRESS = &H1C ' Remote address of a LAN channel as string in IPv4 format
Public Const PCAN_LAN_SERVICE_STATUS = &H1D ' Status of the Virtual PCAN-Gateway Service
Public Const PCAN_ALLOW_STATUS_FRAMES = &H1E ' Status messages reception status within a PCAN-Channel
Public Const PCAN_ALLOW_RTR_FRAMES = &H1F ' RTR messages reception status within a PCAN-Channel
Public Const PCAN_ALLOW_ERROR_FRAMES = &H20 ' Error messages reception status within a PCAN-Channel
Public Const PCAN_INTERFRAME_DELAY = &H21 ' Delay, in microseconds, between sending frames
Public Const PCAN_ACCEPTANCE_FILTER_11BIT = &H22 ' Filter over code and mask patterns for 11-Bit messages
Public Const PCAN_ACCEPTANCE_FILTER_29BIT = &H23 ' Filter over code and mask patterns for 29-Bit messages
Public Const PCAN_IO_DIGITAL_CONFIGURATION = &H24 ' Output mode Of 32 digital I/O pin Of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
Public Const PCAN_IO_DIGITAL_VALUE = &H25 ' Value assigned To a 32 digital I/O pins Of a PCAN-USB Chip
Public Const PCAN_IO_DIGITAL_SET = &H26 ' Value assigned To a 32 digital I/O pins Of a PCAN-USB Chip - Multiple digital I/O pins To 1 = High
Public Const PCAN_IO_DIGITAL_CLEAR = &H27 ' Clear multiple digital I/O pins To 0
Public Const PCAN_IO_ANALOG_VALUE = &H28 ' Get value Of a Single analog input pin
Public Const PCAN_FIRMWARE_VERSION = &H29 ' Get the version of the firmware used by the device associated With a PCAN-Channel
Public Const PCAN_ATTACHED_CHANNELS_COUNT = &H2A ' Get the amount of PCAN channels attached to a system
Public Const PCAN_ATTACHED_CHANNELS = &H2B ' Get information about PCAN channels attached to a system
Public Const PCAN_ALLOW_ECHO_FRAMES = &H2C ' Echo messages reception status within a PCAN-Channel
Public Const PCAN_DEVICE_PART_NUMBER = &H2D ' Get the part number associated To a device
' DEPRECATED parameters
'
Public Const PCAN_DEVICE_NUMBER = PCAN_DEVICE_ID ' Deprecated parameter. Use PCAN_DEVICE_ID instead
' PCAN parameter values
'
Public Const PCAN_PARAMETER_OFF = &H0 ' The PCAN parameter is not set (inactive)
Public Const PCAN_PARAMETER_ON = &H1 ' The PCAN parameter is set (active)
Public Const PCAN_FILTER_CLOSE = &H0 ' The PCAN filter is closed. No messages will be received
Public Const PCAN_FILTER_OPEN = &H1 ' The PCAN filter is fully opened. All messages will be received
Public Const PCAN_FILTER_CUSTOM = &H2 ' The PCAN filter is custom configured. Only registered messages will be received
Public Const PCAN_CHANNEL_UNAVAILABLE = &H0 ' The PCAN-Channel handle is illegal, or its associated hardware is not available
Public Const PCAN_CHANNEL_AVAILABLE = &H1 ' The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
Public Const PCAN_CHANNEL_OCCUPIED = &H2 ' The PCAN-Channel handle is valid, and is already being used
Public Const PCAN_CHANNEL_PCANVIEW = (PCAN_CHANNEL_AVAILABLE Or PCAN_CHANNEL_OCCUPIED) ' The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
Public Const LOG_FUNCTION_DEFAULT = &H0 ' Logs system exceptions / errors
Public Const LOG_FUNCTION_ENTRY = &H1 ' Logs the entries to the PCAN-Basic API functions
Public Const LOG_FUNCTION_PARAMETERS = &H2 ' Logs the parameters passed to the PCAN-Basic API functions
Public Const LOG_FUNCTION_LEAVE = &H4 ' Logs the exits from the PCAN-Basic API functions
Public Const LOG_FUNCTION_WRITE = &H8 ' Logs the CAN messages passed to the CAN_Write function
Public Const LOG_FUNCTION_READ = &H10 ' Logs the CAN messages received within the CAN_Read function
Public Const LOG_FUNCTION_ALL = &HFFFF ' Logs all possible information within the PCAN-Basic API functions
Public Const TRACE_FILE_SINGLE = &H0 ' A single file is written until it size reaches PAN_TRACE_SIZE.
Public Const TRACE_FILE_SEGMENTED = &H1 ' Traced data is distributed in several files with size PAN_TRACE_SIZE.
Public Const TRACE_FILE_DATE = &H2 ' Includes the date into the name of the trace file.
Public Const TRACE_FILE_TIME = &H4 ' Includes the start time into the name of the trace file.
Public Const TRACE_FILE_OVERWRITE = &H80 ' Causes the overwriting of available traces (same name).
Public Const FEATURE_FD_CAPABLE = &H1 ' Device supports flexible data-rate (CAN-FD)
Public Const FEATURE_DELAY_CAPABLE = &H2 ' Device supports a delay between sending frames (FPGA based USB devices)
Public Const FEATURE_IO_CAPABLE = &H4 ' Device supports I/O functionality for electronic circuits (USB-Chip devices)
Public Const SERVICE_STATUS_STOPPED = &H1 ' The service is not running
Public Const SERVICE_STATUS_RUNNING = &H4 ' The service is running
' Other constants
'
Public Const MAX_LENGTH_HARDWARE_NAME = 33 ' Maximum length of the name of a device: 32 characters + terminator
Public Const MAX_LENGTH_VERSION_STRING = 256 ' Maximum length of a version string: 255 characters + terminator
' PCAN message types
'
Public Const PCAN_MESSAGE_STANDARD = &H0 ' The PCAN message is a CAN Standard Frame (11-bit identifier)
Public Const PCAN_MESSAGE_RTR = &H1 ' The PCAN message is a CAN Remote-Transfer-Request Frame
Public Const PCAN_MESSAGE_EXTENDED = &H2 ' The PCAN message is a CAN Extended Frame (29-bit identifier)
Public Const PCAN_MESSAGE_FD = &H4 ' The PCAN message represents a FD frame in terms of CiA Specs
Public Const PCAN_MESSAGE_BRS = &H8 ' The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
Public Const PCAN_MESSAGE_ESI = &H10 ' The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
Public Const PCAN_MESSAGE_ECHO = &H20 ' The PCAN message represents an echo CAN Frame
Public Const PCAN_MESSAGE_ERRFRAME = &H40 ' The PCAN message represents an error frame
Public Const PCAN_MESSAGE_STATUS = &H80 ' The PCAN message represents a PCAN status message
' LookUp Parameters
'
Public Const LOOKUP_DEVICE_TYPE As String = "devicetype" ' Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
Public Const LOOKUP_DEVICE_ID As String = "deviceid" ' Lookup channel by device id
Public Const LOOKUP_CONTROLLER_NUMBER As String = "controllernumber" ' Lookup channel by CAN controller 0-based index
Public Const LOOKUP_IP_ADDRESS As String = "ipaddress" ' Lookup channel by IP address (LAN channels only)
' Frame Type / Initialization Mode
'
Public Const PCAN_MODE_STANDARD = PCAN_MESSAGE_STANDARD
Public Const PCAN_MODE_EXTENDED = PCAN_MESSAGE_EXTENDED
' Baud rate codes = BTR0/BTR1 register values for the CAN controller.
' You can define your own Baud rate with the BTROBTR1 register.
' Take a look at www.peak-system.com for our free software "BAUDTOOL"
' to calculate the BTROBTR1 register for every bit rate and sample point.
'
Public Const PCAN_BAUD_1M = &H14 ' 1 MBit/s
Public Const PCAN_BAUD_800K = &H16 ' 800 kBit/s
Public Const PCAN_BAUD_500K = &H1C ' 500 kBit/s
Public Const PCAN_BAUD_250K = &H11C ' 250 kBit/s
Public Const PCAN_BAUD_125K = &H31C ' 125 kBit/s
Public Const PCAN_BAUD_100K = &H432F ' 100 kBit/s
Public Const PCAN_BAUD_95K = &HC34E ' 95,238 kBit/s
Public Const PCAN_BAUD_83K = &H852B ' 83,333 kBit/s
Public Const PCAN_BAUD_50K = &H472F ' 50 kBit/s
Public Const PCAN_BAUD_47K = &H1414 ' 47,619 kBit/s
Public Const PCAN_BAUD_33K = &H8B2F ' 33,333 kBit/s
Public Const PCAN_BAUD_20K = &H532F ' 20 kBit/s
Public Const PCAN_BAUD_10K = &H672F ' 10 kBit/s
Public Const PCAN_BAUD_5K = &H7F7F ' 5 kBit/s
' Represents the configuration for a CAN bit rate
' Note:
' * Each parameter and its value must be separated with a '='.
' * Each pair of parameter/value must be separated using ','.
'
' Example:
' f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
'
Public Const PCAN_BR_CLOCK As String = "f_clock"
Public Const PCAN_BR_CLOCK_MHZ As String = "f_clock_mhz"
Public Const PCAN_BR_NOM_BRP As String = "nom_brp"
Public Const PCAN_BR_NOM_TSEG1 As String = "nom_tseg1"
Public Const PCAN_BR_NOM_TSEG2 As String = "nom_tseg2"
Public Const PCAN_BR_NOM_SJW As String = "nom_sjw"
Public Const PCAN_BR_NOM_SAMPLE As String = "nom_sam"
Public Const PCAN_BR_DATA_BRP As String = "data_brp"
Public Const PCAN_BR_DATA_TSEG1 As String = "data_tseg1"
Public Const PCAN_BR_DATA_TSEG2 As String = "data_tseg2"
Public Const PCAN_BR_DATA_SJW As String = "data_sjw"
Public Const PCAN_BR_DATA_SAMPLE As String = "data_ssp_offset"
' Type of PCAN (Non-PnP) hardware
'
Public Const PCAN_TYPE_ISA = &H1 ' PCAN-ISA 82C200
Public Const PCAN_TYPE_ISA_SJA = &H9 ' PCAN-ISA SJA1000
Public Const PCAN_TYPE_ISA_PHYTEC = &H4 ' PHYTEC ISA
Public Const PCAN_TYPE_DNG = &H2 ' PCAN-Dongle 82C200
Public Const PCAN_TYPE_DNG_EPP = &H3 ' PCAN-Dongle EPP 82C200
Public Const PCAN_TYPE_DNG_SJA = &H5 ' PCAN-Dongle SJA1000
Public Const PCAN_TYPE_DNG_SJA_EPP = &H6 ' PCAN-Dongle EPP SJA1000
' Represents a PCAN message
'
Public Type TPCANMsg
ID As Long ' 11/29-bit message identifier
MsgType As Byte ' Type of the message
LEN As Byte ' Data Length Code of the message (0..8)
DATA(7) As Byte ' Data of the message (DATA[0]..DATA[7])
End Type
' Represents a timestamp of a received PCAN message
' Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
'
Public Type TPCANTimestamp
millis As Long ' base-value: milliseconds: 0.. 2^32-1
millis_overflow As Integer ' roll-arounds of millis
micros As Integer ' microseconds: 0..999
End Type
' Represents a PCAN message from a FD capable hardware
'
Public Type TPCANMsgFD
ID As Long ' 11/29-bit message identifier
MsgType As Byte ' Type of the message
DLC As Byte ' Data Length Code of the message (0..15)
DATA(63) As Byte ' Data of the message (DATA[0]..DATA[63])
End Type
' Describes an available PCAN channel
'
Public Type TPCANChannelInformation
channel_handle As Integer ' PCAN channel handle
device_type As Byte ' Kind Of PCAN device
controller_number As Byte ' CAN-Controller number
device_features As Long ' Device capabilities flag (see FEATURE_*)
device_name(MAX_LENGTH_HARDWARE_NAME) As Byte ' Device name
device_id As Long ' Device number
channel_condition As Long ' Availability status of a PCAN-Channel
End Type
''' <summary>
''' Initializes a PCAN Channel
''' </summary>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
''' <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
''' <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
''' <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_Initialize Lib "PCANBasic.DLL" _
(ByVal channel As Integer, _
ByVal Btr0Btr1 As Integer, _
Optional ByVal HwType As Byte = 0, _
Optional ByVal IOPort As Long = 0, _
Optional ByVal Interrupt As Integer = 0) As Long
''' <summary>
''' Initializes a FD capable PCAN Channel
''' </summary>
''' <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
''' <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
''' <remarks>See PCAN_BR_* values
''' * parameter and values ust be separated by '='
''' * Couples of Parameter/value must be separated by ','
''' * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
''' nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
''' * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
'''</remarks>
''' <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_InitializeFD Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByVal BitrateFD As String) As Long
''' <summary>
''' Uninitializes one or all PCAN Channels initialized by CAN_Initialize
''' </summary>
''' <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
''' uninitialize all initialized channels</remarks>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_Uninitialize Lib "PCANBasic.DLL" _
(ByVal Channel As Integer) As Long
''' <summary>
''' Resets the receive and transmit queues of the PCAN Channel
''' </summary>
''' <remarks>
''' A reset of the CAN controller is not performed.
''' </remarks>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_Reset Lib "PCANBasic.DLL" _
(ByVal Channel As Integer) As Long
''' <summary>
''' Gets the current status of a PCAN Channel
''' </summary>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_GetStatus Lib "PCANBasic.DLL" _
(ByVal Channel As Integer) As Long
''' <summary>
''' Reads a CAN message from the receive queue of a PCAN Channel
''' </summary>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
''' <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
''' the reception time of the message. If this value is not desired, this parameter
''' should be passed as NULL"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_Read Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByRef MessageBuffer As TPCANMsg, _
ByRef TimestampBuffer As TPCANTimestamp) As Long
''' <summary>
''' Reads a CAN message from the receive queue of a FD capable PCAN Channel
''' </summary>
''' <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
''' <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
''' <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
''' the reception time of the message. If this value is not desired, this parameter
''' should be passed as NULL"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_ReadFD Lib "PCANBasic.DLL" _
(ByVal Channel As Integer,
ByRef MessageBuffer As TPCANMsgFD,
ByRef TimestampBuffer As Long) As Long
''' <summary>
''' Transmits a CAN message over a FD capable PCAN Channel
''' </summary>
''' <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
''' <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_WriteFD Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByRef MessageBuffer As TPCANMsgFD) As Long
''' <summary>
''' Transmits a CAN message
''' </summary>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_Write Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByRef MessageBuffer As TPCANMsg) As Long
''' <summary>
''' Configures the reception filter.
''' </summary>
''' <remarks>The message filter will be expanded with every call to
''' this function. If it is desired to reset the filter, please use
''' the CAN_SetValue function</remarks>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <param name="FromID">"The lowest CAN ID to be received"</param>
''' <param name="ToID">"The highest CAN ID to be received"</param>
''' <param name="Mode">"Message type, Standard (11-bit identifier) or
''' Extended (29-bit identifier)"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_FilterMessages Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByVal FromID As Long, _
ByVal ToID As Long, _
ByVal Mode As Byte) As Long
''' <summary>
''' Retrieves a PCAN Channel value
''' </summary>
''' <remarks>Parameters can be present or not according with the kind
''' of Hardware (PCAN Channel) being used. If a parameter is not available,
''' a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <param name="Parameter">"The TPCANParameter parameter to get"</param>
''' <param name="Buffer">"Buffer for the parameter value"</param>
''' <param name="BufferLength">"Size in bytes of the buffer"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_GetValue Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByVal Parameter As Byte, _
ByRef Buffer As Any, _
ByVal BufferLength As Long) As Long
''' <summary>
''' Configures or sets a PCAN Channel value
''' </summary>
''' <remarks>Parameters can be present or not according with the kind
''' of Hardware (PCAN Channel) being used. If a parameter is not available,
''' a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
''' <param name="Channel">"The handle of a PCAN Channel"</param>
''' <param name="Parameter">"The TPCANParameter parameter to set"</param>
''' <param name="Buffer">"Buffer with the value to be set"</param>
''' <param name="BufferLength">"Size in bytes of the buffer"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_SetValue Lib "PCANBasic.DLL" _
(ByVal Channel As Integer, _
ByVal Parameter As Byte, _
ByRef Buffer As Any, _
ByVal BufferLength As Long) As Long
''' <summary>
''' Returns a descriptive text of a given TPCANStatus error
''' code, in any desired language
''' </summary>
''' <remarks>The current languages available for translation are:
''' Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
''' Italian (0x10) and French (0x0C)</remarks>
''' <param name="Error">"A TPCANStatus error code"</param>
''' <param name="Language">"Indicates a 'Primary language ID'"</param>
''' <param name="Buffer">"Buffer for a null terminated char array"</param>
''' <returns>"A TPCANStatus error code"</returns>
Public Declare Function CAN_GetErrorText Lib "PCANBasic.DLL" _
(ByVal ErrorCode As Long,
ByVal Language As Integer,
ByVal Buffer As String) As Long
''' <summary>
''' Finds a PCAN-Basic channel that matches with the given parameters
''' </summary>
''' <param name="Parameters">A comma separated string contained pairs of
''' parameter-name/value to be matched within a PCAN-Basic channel</param>
''' <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
''' when found</param>
''' <returns>A TPCANStatus error code</returns>
Public Declare Function CAN_LookUpChannel Lib "PCANBasic.DLL" _
(ByVal Parameters As String,
ByRef FoundChannel As Integer) As Long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,838 @@
# PCANBasic.py
#
# ~~~~~~~~~~~~
#
# PCAN-Basic API
#
# ~~~~~~~~~~~~
#
# ------------------------------------------------------------------
# Author : Keneth Wagner
# Last change: 2022-07-06
#
# Language: Python 2.7, 3.8
# ------------------------------------------------------------------
#
# Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
# more Info at http://www.peak-system.com
#
# Module Imports
#
from ctypes import *
from string import *
import platform
#///////////////////////////////////////////////////////////
# Type definitions
#///////////////////////////////////////////////////////////
TPCANHandle = c_ushort # Represents a PCAN hardware channel handle
TPCANStatus = int # Represents a PCAN status/error code
TPCANParameter = c_ubyte # Represents a PCAN parameter to be read or set
TPCANDevice = c_ubyte # Represents a PCAN device
TPCANMessageType = c_ubyte # Represents the type of a PCAN message
TPCANType = c_ubyte # Represents the type of PCAN hardware to be initialized
TPCANMode = c_ubyte # Represents a PCAN filter mode
TPCANBaudrate = c_ushort # Represents a PCAN Baud rate register value
TPCANBitrateFD = c_char_p # Represents a PCAN-FD bit rate string
TPCANTimestampFD = c_ulonglong # Represents a timestamp of a received PCAN FD message
#///////////////////////////////////////////////////////////
# Value definitions
#///////////////////////////////////////////////////////////
# Currently defined and supported PCAN channels
#
PCAN_NONEBUS = TPCANHandle(0x00) # Undefined/default value for a PCAN bus
PCAN_ISABUS1 = TPCANHandle(0x21) # PCAN-ISA interface, channel 1
PCAN_ISABUS2 = TPCANHandle(0x22) # PCAN-ISA interface, channel 2
PCAN_ISABUS3 = TPCANHandle(0x23) # PCAN-ISA interface, channel 3
PCAN_ISABUS4 = TPCANHandle(0x24) # PCAN-ISA interface, channel 4
PCAN_ISABUS5 = TPCANHandle(0x25) # PCAN-ISA interface, channel 5
PCAN_ISABUS6 = TPCANHandle(0x26) # PCAN-ISA interface, channel 6
PCAN_ISABUS7 = TPCANHandle(0x27) # PCAN-ISA interface, channel 7
PCAN_ISABUS8 = TPCANHandle(0x28) # PCAN-ISA interface, channel 8
PCAN_DNGBUS1 = TPCANHandle(0x31) # PCAN-Dongle/LPT interface, channel 1
PCAN_PCIBUS1 = TPCANHandle(0x41) # PCAN-PCI interface, channel 1
PCAN_PCIBUS2 = TPCANHandle(0x42) # PCAN-PCI interface, channel 2
PCAN_PCIBUS3 = TPCANHandle(0x43) # PCAN-PCI interface, channel 3
PCAN_PCIBUS4 = TPCANHandle(0x44) # PCAN-PCI interface, channel 4
PCAN_PCIBUS5 = TPCANHandle(0x45) # PCAN-PCI interface, channel 5
PCAN_PCIBUS6 = TPCANHandle(0x46) # PCAN-PCI interface, channel 6
PCAN_PCIBUS7 = TPCANHandle(0x47) # PCAN-PCI interface, channel 7
PCAN_PCIBUS8 = TPCANHandle(0x48) # PCAN-PCI interface, channel 8
PCAN_PCIBUS9 = TPCANHandle(0x409) # PCAN-PCI interface, channel 9
PCAN_PCIBUS10 = TPCANHandle(0x40A) # PCAN-PCI interface, channel 10
PCAN_PCIBUS11 = TPCANHandle(0x40B) # PCAN-PCI interface, channel 11
PCAN_PCIBUS12 = TPCANHandle(0x40C) # PCAN-PCI interface, channel 12
PCAN_PCIBUS13 = TPCANHandle(0x40D) # PCAN-PCI interface, channel 13
PCAN_PCIBUS14 = TPCANHandle(0x40E) # PCAN-PCI interface, channel 14
PCAN_PCIBUS15 = TPCANHandle(0x40F) # PCAN-PCI interface, channel 15
PCAN_PCIBUS16 = TPCANHandle(0x410) # PCAN-PCI interface, channel 16
PCAN_USBBUS1 = TPCANHandle(0x51) # PCAN-USB interface, channel 1
PCAN_USBBUS2 = TPCANHandle(0x52) # PCAN-USB interface, channel 2
PCAN_USBBUS3 = TPCANHandle(0x53) # PCAN-USB interface, channel 3
PCAN_USBBUS4 = TPCANHandle(0x54) # PCAN-USB interface, channel 4
PCAN_USBBUS5 = TPCANHandle(0x55) # PCAN-USB interface, channel 5
PCAN_USBBUS6 = TPCANHandle(0x56) # PCAN-USB interface, channel 6
PCAN_USBBUS7 = TPCANHandle(0x57) # PCAN-USB interface, channel 7
PCAN_USBBUS8 = TPCANHandle(0x58) # PCAN-USB interface, channel 8
PCAN_USBBUS9 = TPCANHandle(0x509) # PCAN-USB interface, channel 9
PCAN_USBBUS10 = TPCANHandle(0x50A) # PCAN-USB interface, channel 10
PCAN_USBBUS11 = TPCANHandle(0x50B) # PCAN-USB interface, channel 11
PCAN_USBBUS12 = TPCANHandle(0x50C) # PCAN-USB interface, channel 12
PCAN_USBBUS13 = TPCANHandle(0x50D) # PCAN-USB interface, channel 13
PCAN_USBBUS14 = TPCANHandle(0x50E) # PCAN-USB interface, channel 14
PCAN_USBBUS15 = TPCANHandle(0x50F) # PCAN-USB interface, channel 15
PCAN_USBBUS16 = TPCANHandle(0x510) # PCAN-USB interface, channel 16
PCAN_PCCBUS1 = TPCANHandle(0x61) # PCAN-PC Card interface, channel 1
PCAN_PCCBUS2 = TPCANHandle(0x62) # PCAN-PC Card interface, channel 2
PCAN_LANBUS1 = TPCANHandle(0x801) # PCAN-LAN interface, channel 1
PCAN_LANBUS2 = TPCANHandle(0x802) # PCAN-LAN interface, channel 2
PCAN_LANBUS3 = TPCANHandle(0x803) # PCAN-LAN interface, channel 3
PCAN_LANBUS4 = TPCANHandle(0x804) # PCAN-LAN interface, channel 4
PCAN_LANBUS5 = TPCANHandle(0x805) # PCAN-LAN interface, channel 5
PCAN_LANBUS6 = TPCANHandle(0x806) # PCAN-LAN interface, channel 6
PCAN_LANBUS7 = TPCANHandle(0x807) # PCAN-LAN interface, channel 7
PCAN_LANBUS8 = TPCANHandle(0x808) # PCAN-LAN interface, channel 8
PCAN_LANBUS9 = TPCANHandle(0x809) # PCAN-LAN interface, channel 9
PCAN_LANBUS10 = TPCANHandle(0x80A) # PCAN-LAN interface, channel 10
PCAN_LANBUS11 = TPCANHandle(0x80B) # PCAN-LAN interface, channel 11
PCAN_LANBUS12 = TPCANHandle(0x80C) # PCAN-LAN interface, channel 12
PCAN_LANBUS13 = TPCANHandle(0x80D) # PCAN-LAN interface, channel 13
PCAN_LANBUS14 = TPCANHandle(0x80E) # PCAN-LAN interface, channel 14
PCAN_LANBUS15 = TPCANHandle(0x80F) # PCAN-LAN interface, channel 15
PCAN_LANBUS16 = TPCANHandle(0x810) # PCAN-LAN interface, channel 16
# Represent the PCAN error and status codes
#
PCAN_ERROR_OK = TPCANStatus(0x00000) # No error
PCAN_ERROR_XMTFULL = TPCANStatus(0x00001) # Transmit buffer in CAN controller is full
PCAN_ERROR_OVERRUN = TPCANStatus(0x00002) # CAN controller was read too late
PCAN_ERROR_BUSLIGHT = TPCANStatus(0x00004) # Bus error: an error counter reached the 'light' limit
PCAN_ERROR_BUSHEAVY = TPCANStatus(0x00008) # Bus error: an error counter reached the 'heavy' limit
PCAN_ERROR_BUSWARNING = TPCANStatus(PCAN_ERROR_BUSHEAVY) # Bus error: an error counter reached the 'warning' limit
PCAN_ERROR_BUSPASSIVE = TPCANStatus(0x40000) # Bus error: the CAN controller is error passive
PCAN_ERROR_BUSOFF = TPCANStatus(0x00010) # Bus error: the CAN controller is in bus-off state
PCAN_ERROR_ANYBUSERR = TPCANStatus(PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) # Mask for all bus errors
PCAN_ERROR_QRCVEMPTY = TPCANStatus(0x00020) # Receive queue is empty
PCAN_ERROR_QOVERRUN = TPCANStatus(0x00040) # Receive queue was read too late
PCAN_ERROR_QXMTFULL = TPCANStatus(0x00080) # Transmit queue is full
PCAN_ERROR_REGTEST = TPCANStatus(0x00100) # Test of the CAN controller hardware registers failed (no hardware found)
PCAN_ERROR_NODRIVER = TPCANStatus(0x00200) # Driver not loaded
PCAN_ERROR_HWINUSE = TPCANStatus(0x00400) # Hardware already in use by a Net
PCAN_ERROR_NETINUSE = TPCANStatus(0x00800) # A Client is already connected to the Net
PCAN_ERROR_ILLHW = TPCANStatus(0x01400) # Hardware handle is invalid
PCAN_ERROR_ILLNET = TPCANStatus(0x01800) # Net handle is invalid
PCAN_ERROR_ILLCLIENT = TPCANStatus(0x01C00) # Client handle is invalid
PCAN_ERROR_ILLHANDLE = TPCANStatus(PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) # Mask for all handle errors
PCAN_ERROR_RESOURCE = TPCANStatus(0x02000) # Resource (FIFO, Client, timeout) cannot be created
PCAN_ERROR_ILLPARAMTYPE = TPCANStatus(0x04000) # Invalid parameter
PCAN_ERROR_ILLPARAMVAL = TPCANStatus(0x08000) # Invalid parameter value
PCAN_ERROR_UNKNOWN = TPCANStatus(0x10000) # Unknown error
PCAN_ERROR_ILLDATA = TPCANStatus(0x20000) # Invalid data, function, or action
PCAN_ERROR_ILLMODE = TPCANStatus(0x80000) # Driver object state is wrong for the attempted operation
PCAN_ERROR_CAUTION = TPCANStatus(0x2000000)# An operation was successfully carried out, however, irregularities were registered
PCAN_ERROR_INITIALIZE = TPCANStatus(0x4000000)# Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
PCAN_ERROR_ILLOPERATION = TPCANStatus(0x8000000)# Invalid operation [Value was changed from 0x80000 to 0x8000000]
# PCAN devices
#
PCAN_NONE = TPCANDevice(0x00) # Undefined, unknown or not selected PCAN device value
PCAN_PEAKCAN = TPCANDevice(0x01) # PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
PCAN_ISA = TPCANDevice(0x02) # PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
PCAN_DNG = TPCANDevice(0x03) # PCAN-Dongle
PCAN_PCI = TPCANDevice(0x04) # PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
PCAN_USB = TPCANDevice(0x05) # PCAN-USB and PCAN-USB Pro
PCAN_PCC = TPCANDevice(0x06) # PCAN-PC Card
PCAN_VIRTUAL = TPCANDevice(0x07) # PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
PCAN_LAN = TPCANDevice(0x08) # PCAN Gateway devices
# PCAN parameters
#
PCAN_DEVICE_ID = TPCANParameter(0x01) # Device identifier parameter
PCAN_5VOLTS_POWER = TPCANParameter(0x02) # 5-Volt power parameter
PCAN_RECEIVE_EVENT = TPCANParameter(0x03) # PCAN receive event handler parameter
PCAN_MESSAGE_FILTER = TPCANParameter(0x04) # PCAN message filter parameter
PCAN_API_VERSION = TPCANParameter(0x05) # PCAN-Basic API version parameter
PCAN_CHANNEL_VERSION = TPCANParameter(0x06) # PCAN device channel version parameter
PCAN_BUSOFF_AUTORESET = TPCANParameter(0x07) # PCAN Reset-On-Busoff parameter
PCAN_LISTEN_ONLY = TPCANParameter(0x08) # PCAN Listen-Only parameter
PCAN_LOG_LOCATION = TPCANParameter(0x09) # Directory path for log files
PCAN_LOG_STATUS = TPCANParameter(0x0A) # Debug-Log activation status
PCAN_LOG_CONFIGURE = TPCANParameter(0x0B) # Configuration of the debugged information (LOG_FUNCTION_***)
PCAN_LOG_TEXT = TPCANParameter(0x0C) # Custom insertion of text into the log file
PCAN_CHANNEL_CONDITION = TPCANParameter(0x0D) # Availability status of a PCAN-Channel
PCAN_HARDWARE_NAME = TPCANParameter(0x0E) # PCAN hardware name parameter
PCAN_RECEIVE_STATUS = TPCANParameter(0x0F) # Message reception status of a PCAN-Channel
PCAN_CONTROLLER_NUMBER = TPCANParameter(0x10) # CAN-Controller number of a PCAN-Channel
PCAN_TRACE_LOCATION = TPCANParameter(0x11) # Directory path for PCAN trace files
PCAN_TRACE_STATUS = TPCANParameter(0x12) # CAN tracing activation status
PCAN_TRACE_SIZE = TPCANParameter(0x13) # Configuration of the maximum file size of a CAN trace
PCAN_TRACE_CONFIGURE = TPCANParameter(0x14) # Configuration of the trace file storing mode (TRACE_FILE_***)
PCAN_CHANNEL_IDENTIFYING = TPCANParameter(0x15) # Physical identification of a USB based PCAN-Channel by blinking its associated LED
PCAN_CHANNEL_FEATURES = TPCANParameter(0x16) # Capabilities of a PCAN device (FEATURE_***)
PCAN_BITRATE_ADAPTING = TPCANParameter(0x17) # Using of an existing bit rate (PCAN-View connected to a channel)
PCAN_BITRATE_INFO = TPCANParameter(0x18) # Configured bit rate as Btr0Btr1 value
PCAN_BITRATE_INFO_FD = TPCANParameter(0x19) # Configured bit rate as TPCANBitrateFD string
PCAN_BUSSPEED_NOMINAL = TPCANParameter(0x1A) # Configured nominal CAN Bus speed as Bits per seconds
PCAN_BUSSPEED_DATA = TPCANParameter(0x1B) # Configured CAN data speed as Bits per seconds
PCAN_IP_ADDRESS = TPCANParameter(0x1C) # Remote address of a LAN channel as string in IPv4 format
PCAN_LAN_SERVICE_STATUS = TPCANParameter(0x1D) # Status of the Virtual PCAN-Gateway Service
PCAN_ALLOW_STATUS_FRAMES = TPCANParameter(0x1E) # Status messages reception status within a PCAN-Channel
PCAN_ALLOW_RTR_FRAMES = TPCANParameter(0x1F) # RTR messages reception status within a PCAN-Channel
PCAN_ALLOW_ERROR_FRAMES = TPCANParameter(0x20) # Error messages reception status within a PCAN-Channel
PCAN_INTERFRAME_DELAY = TPCANParameter(0x21) # Delay, in microseconds, between sending frames
PCAN_ACCEPTANCE_FILTER_11BIT = TPCANParameter(0x22) # Filter over code and mask patterns for 11-Bit messages
PCAN_ACCEPTANCE_FILTER_29BIT = TPCANParameter(0x23) # Filter over code and mask patterns for 29-Bit messages
PCAN_IO_DIGITAL_CONFIGURATION = TPCANParameter(0x24) # Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
PCAN_IO_DIGITAL_VALUE = TPCANParameter(0x25) # Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
PCAN_IO_DIGITAL_SET = TPCANParameter(0x26) # Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
PCAN_IO_DIGITAL_CLEAR = TPCANParameter(0x27) # Clear multiple digital I/O pins to 0
PCAN_IO_ANALOG_VALUE = TPCANParameter(0x28) # Get value of a single analog input pin
PCAN_FIRMWARE_VERSION = TPCANParameter(0x29) # Get the version of the firmware used by the device associated with a PCAN-Channel
PCAN_ATTACHED_CHANNELS_COUNT = TPCANParameter(0x2A) # Get the amount of PCAN channels attached to a system
PCAN_ATTACHED_CHANNELS = TPCANParameter(0x2B) # Get information about PCAN channels attached to a system
PCAN_ALLOW_ECHO_FRAMES = TPCANParameter(0x2C) # Echo messages reception status within a PCAN-Channel
PCAN_DEVICE_PART_NUMBER = TPCANParameter(0x2D) # Get the part number associated to a device
# DEPRECATED parameters
#
PCAN_DEVICE_NUMBER = PCAN_DEVICE_ID # DEPRECATED. Use PCAN_DEVICE_ID instead
# PCAN parameter values
#
PCAN_PARAMETER_OFF = int(0x00) # The PCAN parameter is not set (inactive)
PCAN_PARAMETER_ON = int(0x01) # The PCAN parameter is set (active)
PCAN_FILTER_CLOSE = int(0x00) # The PCAN filter is closed. No messages will be received
PCAN_FILTER_OPEN = int(0x01) # The PCAN filter is fully opened. All messages will be received
PCAN_FILTER_CUSTOM = int(0x02) # The PCAN filter is custom configured. Only registered messages will be received
PCAN_CHANNEL_UNAVAILABLE = int(0x00) # The PCAN-Channel handle is illegal, or its associated hardware is not available
PCAN_CHANNEL_AVAILABLE = int(0x01) # The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
PCAN_CHANNEL_OCCUPIED = int(0x02) # The PCAN-Channel handle is valid, and is already being used
PCAN_CHANNEL_PCANVIEW = PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED # The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
LOG_FUNCTION_DEFAULT = int(0x00) # Logs system exceptions / errors
LOG_FUNCTION_ENTRY = int(0x01) # Logs the entries to the PCAN-Basic API functions
LOG_FUNCTION_PARAMETERS = int(0x02) # Logs the parameters passed to the PCAN-Basic API functions
LOG_FUNCTION_LEAVE = int(0x04) # Logs the exits from the PCAN-Basic API functions
LOG_FUNCTION_WRITE = int(0x08) # Logs the CAN messages passed to the CAN_Write function
LOG_FUNCTION_READ = int(0x10) # Logs the CAN messages received within the CAN_Read function
LOG_FUNCTION_ALL = int(0xFFFF) # Logs all possible information within the PCAN-Basic API functions
TRACE_FILE_SINGLE = int(0x00) # A single file is written until it size reaches PAN_TRACE_SIZE
TRACE_FILE_SEGMENTED = int(0x01) # Traced data is distributed in several files with size PAN_TRACE_SIZE
TRACE_FILE_DATE = int(0x02) # Includes the date into the name of the trace file
TRACE_FILE_TIME = int(0x04) # Includes the start time into the name of the trace file
TRACE_FILE_OVERWRITE = int(0x80) # Causes the overwriting of available traces (same name)
FEATURE_FD_CAPABLE = int(0x01) # Device supports flexible data-rate (CAN-FD)
FEATURE_DELAY_CAPABLE = int(0x02) # Device supports a delay between sending frames (FPGA based USB devices)
FEATURE_IO_CAPABLE = int(0x04) # Device supports I/O functionality for electronic circuits (USB-Chip devices)
SERVICE_STATUS_STOPPED = int(0x01) # The service is not running
SERVICE_STATUS_RUNNING = int(0x04) # The service is running
# Other constants
#
MAX_LENGTH_HARDWARE_NAME = int(33) # Maximum length of the name of a device: 32 characters + terminator
MAX_LENGTH_VERSION_STRING = int(256) # Maximum length of a version string: 255 characters + terminator
# PCAN message types
#
PCAN_MESSAGE_STANDARD = TPCANMessageType(0x00) # The PCAN message is a CAN Standard Frame (11-bit identifier)
PCAN_MESSAGE_RTR = TPCANMessageType(0x01) # The PCAN message is a CAN Remote-Transfer-Request Frame
PCAN_MESSAGE_EXTENDED = TPCANMessageType(0x02) # The PCAN message is a CAN Extended Frame (29-bit identifier)
PCAN_MESSAGE_FD = TPCANMessageType(0x04) # The PCAN message represents a FD frame in terms of CiA Specs
PCAN_MESSAGE_BRS = TPCANMessageType(0x08) # The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
PCAN_MESSAGE_ESI = TPCANMessageType(0x10) # The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
PCAN_MESSAGE_ECHO = TPCANMessageType(0x20) # The PCAN message represents an echo CAN Frame
PCAN_MESSAGE_ERRFRAME = TPCANMessageType(0x40) # The PCAN message represents an error frame
PCAN_MESSAGE_STATUS = TPCANMessageType(0x80) # The PCAN message represents a PCAN status message
# LookUp Parameters
#
LOOKUP_DEVICE_TYPE = b"devicetype" # Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
LOOKUP_DEVICE_ID = b"deviceid" # Lookup channel by device id
LOOKUP_CONTROLLER_NUMBER = b"controllernumber" # Lookup channel by CAN controller 0-based index
LOOKUP_IP_ADDRESS = b"ipaddress" # Lookup channel by IP address (LAN channels only)
# Frame Type / Initialization Mode
#
PCAN_MODE_STANDARD = PCAN_MESSAGE_STANDARD
PCAN_MODE_EXTENDED = PCAN_MESSAGE_EXTENDED
# Baud rate codes = BTR0/BTR1 register values for the CAN controller.
# You can define your own Baud rate with the BTROBTR1 register.
# Take a look at www.peak-system.com for our free software "BAUDTOOL"
# to calculate the BTROBTR1 register for every bit rate and sample point.
#
PCAN_BAUD_1M = TPCANBaudrate(0x0014) # 1 MBit/s
PCAN_BAUD_800K = TPCANBaudrate(0x0016) # 800 kBit/s
PCAN_BAUD_500K = TPCANBaudrate(0x001C) # 500 kBit/s
PCAN_BAUD_250K = TPCANBaudrate(0x011C) # 250 kBit/s
PCAN_BAUD_125K = TPCANBaudrate(0x031C) # 125 kBit/s
PCAN_BAUD_100K = TPCANBaudrate(0x432F) # 100 kBit/s
PCAN_BAUD_95K = TPCANBaudrate(0xC34E) # 95,238 kBit/s
PCAN_BAUD_83K = TPCANBaudrate(0x852B) # 83,333 kBit/s
PCAN_BAUD_50K = TPCANBaudrate(0x472F) # 50 kBit/s
PCAN_BAUD_47K = TPCANBaudrate(0x1414) # 47,619 kBit/s
PCAN_BAUD_33K = TPCANBaudrate(0x8B2F) # 33,333 kBit/s
PCAN_BAUD_20K = TPCANBaudrate(0x532F) # 20 kBit/s
PCAN_BAUD_10K = TPCANBaudrate(0x672F) # 10 kBit/s
PCAN_BAUD_5K = TPCANBaudrate(0x7F7F) # 5 kBit/s
# Represents the configuration for a CAN bit rate
# Note:
# * Each parameter and its value must be separated with a '='.
# * Each pair of parameter/value must be separated using ','.
#
# Example:
# f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
#
PCAN_BR_CLOCK = TPCANBitrateFD(b"f_clock")
PCAN_BR_CLOCK_MHZ = TPCANBitrateFD(b"f_clock_mhz")
PCAN_BR_NOM_BRP = TPCANBitrateFD(b"nom_brp")
PCAN_BR_NOM_TSEG1 = TPCANBitrateFD(b"nom_tseg1")
PCAN_BR_NOM_TSEG2 = TPCANBitrateFD(b"nom_tseg2")
PCAN_BR_NOM_SJW = TPCANBitrateFD(b"nom_sjw")
PCAN_BR_NOM_SAMPLE = TPCANBitrateFD(b"nom_sam")
PCAN_BR_DATA_BRP = TPCANBitrateFD(b"data_brp")
PCAN_BR_DATA_TSEG1 = TPCANBitrateFD(b"data_tseg1")
PCAN_BR_DATA_TSEG2 = TPCANBitrateFD(b"data_tseg2")
PCAN_BR_DATA_SJW = TPCANBitrateFD(b"data_sjw")
PCAN_BR_DATA_SAMPLE = TPCANBitrateFD(b"data_ssp_offset")
# Supported Non-PnP Hardware types
#
PCAN_TYPE_ISA = TPCANType(0x01) # PCAN-ISA 82C200
PCAN_TYPE_ISA_SJA = TPCANType(0x09) # PCAN-ISA SJA1000
PCAN_TYPE_ISA_PHYTEC = TPCANType(0x04) # PHYTEC ISA
PCAN_TYPE_DNG = TPCANType(0x02) # PCAN-Dongle 82C200
PCAN_TYPE_DNG_EPP = TPCANType(0x03) # PCAN-Dongle EPP 82C200
PCAN_TYPE_DNG_SJA = TPCANType(0x05) # PCAN-Dongle SJA1000
PCAN_TYPE_DNG_SJA_EPP = TPCANType(0x06) # PCAN-Dongle EPP SJA1000
# Represents a PCAN message
#
class TPCANMsg (Structure):
"""
Represents a PCAN message
"""
_fields_ = [ ("ID", c_uint), # 11/29-bit message identifier
("MSGTYPE", TPCANMessageType), # Type of the message
("LEN", c_ubyte), # Data Length Code of the message (0..8)
("DATA", c_ubyte * 8) ] # Data of the message (DATA[0]..DATA[7])
# Represents a timestamp of a received PCAN message
# Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
#
class TPCANTimestamp (Structure):
"""
Represents a timestamp of a received PCAN message
Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
"""
_fields_ = [ ("millis", c_uint), # Base-value: milliseconds: 0.. 2^32-1
("millis_overflow", c_ushort), # Roll-arounds of millis
("micros", c_ushort) ] # Microseconds: 0..999
# Represents a PCAN message from a FD capable hardware
#
class TPCANMsgFD (Structure):
"""
Represents a PCAN message
"""
_fields_ = [ ("ID", c_uint), # 11/29-bit message identifier
("MSGTYPE", TPCANMessageType), # Type of the message
("DLC", c_ubyte), # Data Length Code of the message (0..15)
("DATA", c_ubyte * 64) ] # Data of the message (DATA[0]..DATA[63])
# Describes an available PCAN channel
#
class TPCANChannelInformation (Structure):
"""
Describes an available PCAN channel
"""
_fields_ = [ ("channel_handle", TPCANHandle), # PCAN channel handle
("device_type", TPCANDevice), # Kind of PCAN device
("controller_number", c_ubyte), # CAN-Controller number
("device_features", c_uint), # Device capabilities flag (see FEATURE_*)
("device_name", c_char * MAX_LENGTH_HARDWARE_NAME), # Device name
("device_id", c_uint), # Device number
("channel_condition", c_uint) ] # Availability status of a PCAN-Channel
#///////////////////////////////////////////////////////////
# PCAN-Basic API function declarations
#///////////////////////////////////////////////////////////
# PCAN-Basic API class implementation
#
class PCANBasic:
"""
PCAN-Basic API class implementation
"""
def __init__(self):
# Loads the PCANBasic API
#
if platform.system() == 'Windows':
# Loads the API on Windows
self.__m_dllBasic = windll.LoadLibrary("PCANBasic")
elif platform.system() == 'Linux':
# Loads the API on Linux
self.__m_dllBasic = cdll.LoadLibrary("libpcanbasic.so")
elif platform.system() == 'Darwin':
# Loads the API on Mac
#
# NOTE:
# ~~~~~
# The macOS library for PCAN-USB interfaces from PEAK-System, PCBUSB library,
# is a third-party software creaded and mantained by the MacCAN project. For
# information and support, please contact MacCAN (info@mac-can).
#
self.__m_dllBasic = cdll.LoadLibrary("libPCBUSB.dylib")
if self.__m_dllBasic == None:
print ("Exception: The PCAN-Basic DLL couldn't be loaded!")
# Initializes a PCAN Channel
#
def Initialize(
self,
Channel,
Btr0Btr1,
HwType = TPCANType(0),
IOPort = c_uint(0),
Interrupt = c_ushort(0)):
"""
Initializes a PCAN Channel
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Btr0Btr1 : The speed for the communication (BTR0BTR1 code)
HwType : Non-PnP: The type of hardware and operation mode
IOPort : Non-PnP: The I/O address for the parallel port
Interrupt: Non-PnP: Interrupt number of the parallel port
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_Initialize(Channel,Btr0Btr1,HwType,IOPort,Interrupt)
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.Initialize")
raise
# Initializes a FD capable PCAN Channel
#
def InitializeFD(
self,
Channel,
BitrateFD):
"""
Initializes a FD capable PCAN Channel
Parameters:
Channel : The handle of a FD capable PCAN Channel
BitrateFD : The speed for the communication (FD bit rate string)
Remarks:
See PCAN_BR_* values.
* parameter and values must be separated by '='
* Couples of Parameter/value must be separated by ','
* Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
* Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
Example:
f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_InitializeFD(Channel,BitrateFD)
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.InitializeFD")
raise
# Uninitializes one or all PCAN Channels initialized by CAN_Initialize
#
def Uninitialize(
self,
Channel):
"""
Uninitializes one or all PCAN Channels initialized by CAN_Initialize
Remarks:
Giving the TPCANHandle value "PCAN_NONEBUS", uninitialize all initialized channels
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_Uninitialize(Channel)
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.Uninitialize")
raise
# Resets the receive and transmit queues of the PCAN Channel
#
def Reset(
self,
Channel):
"""
Resets the receive and transmit queues of the PCAN Channel
Remarks:
A reset of the CAN controller is not performed
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_Reset(Channel)
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.Reset")
raise
# Gets the current status of a PCAN Channel
#
def GetStatus(
self,
Channel):
"""
Gets the current status of a PCAN Channel
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_GetStatus(Channel)
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.GetStatus")
raise
# Reads a CAN message from the receive queue of a PCAN Channel
#
def Read(
self,
Channel):
"""
Reads a CAN message from the receive queue of a PCAN Channel
Remarks:
The return value of this method is a 3-touple, where
the first value is the result (TPCANStatus) of the method.
The order of the values are:
[0]: A TPCANStatus error code
[1]: A TPCANMsg structure with the CAN message read
[2]: A TPCANTimestamp structure with the time when a message was read
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Returns:
A touple with three values
"""
try:
msg = TPCANMsg()
timestamp = TPCANTimestamp()
res = self.__m_dllBasic.CAN_Read(Channel,byref(msg),byref(timestamp))
return TPCANStatus(res),msg,timestamp
except:
print ("Exception on PCANBasic.Read")
raise
# Reads a CAN message from the receive queue of a FD capable PCAN Channel
#
def ReadFD(
self,
Channel):
"""
Reads a CAN message from the receive queue of a FD capable PCAN Channel
Remarks:
The return value of this method is a 3-touple, where
the first value is the result (TPCANStatus) of the method.
The order of the values are:
[0]: A TPCANStatus error code
[1]: A TPCANMsgFD structure with the CAN message read
[2]: A TPCANTimestampFD that is the time when a message was read
Parameters:
Channel : The handle of a FD capable PCAN Channel
Returns:
A touple with three values
"""
try:
msg = TPCANMsgFD()
timestamp = TPCANTimestampFD()
res = self.__m_dllBasic.CAN_ReadFD(Channel,byref(msg),byref(timestamp))
return TPCANStatus(res),msg,timestamp
except:
print ("Exception on PCANBasic.ReadFD")
raise
# Transmits a CAN message
#
def Write(
self,
Channel,
MessageBuffer):
"""
Transmits a CAN message
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
MessageBuffer: A TPCANMsg representing the CAN message to be sent
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_Write(Channel,byref(MessageBuffer))
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.Write")
raise
# Transmits a CAN message over a FD capable PCAN Channel
#
def WriteFD(
self,
Channel,
MessageBuffer):
"""
Transmits a CAN message over a FD capable PCAN Channel
Parameters:
Channel : The handle of a FD capable PCAN Channel
MessageBuffer: A TPCANMsgFD buffer with the message to be sent
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_WriteFD(Channel,byref(MessageBuffer))
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.WriteFD")
raise
# Configures the reception filter
#
def FilterMessages(
self,
Channel,
FromID,
ToID,
Mode):
"""
Configures the reception filter
Remarks:
The message filter will be expanded with every call to this function.
If it is desired to reset the filter, please use the 'SetValue' function.
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
FromID : A c_uint value with the lowest CAN ID to be received
ToID : A c_uint value with the highest CAN ID to be received
Mode : A TPCANMode representing the message type (Standard, 11-bit
identifier, or Extended, 29-bit identifier)
Returns:
A TPCANStatus error code
"""
try:
res = self.__m_dllBasic.CAN_FilterMessages(Channel,FromID,ToID,Mode)
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.FilterMessages")
raise
# Retrieves a PCAN Channel value
#
def GetValue(
self,
Channel,
Parameter):
"""
Retrieves a PCAN Channel value
Remarks:
Parameters can be present or not according with the kind
of Hardware (PCAN Channel) being used. If a parameter is not available,
a PCAN_ERROR_ILLPARAMTYPE error will be returned.
The return value of this method is a 2-touple, where
the first value is the result (TPCANStatus) of the method and
the second one, the asked value
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Parameter : The TPCANParameter parameter to get
Returns:
A touple with 2 values
"""
try:
if Parameter == PCAN_API_VERSION or Parameter == PCAN_HARDWARE_NAME or Parameter == PCAN_CHANNEL_VERSION or Parameter == PCAN_LOG_LOCATION or Parameter == PCAN_TRACE_LOCATION or Parameter == PCAN_BITRATE_INFO_FD or Parameter == PCAN_IP_ADDRESS or Parameter == PCAN_FIRMWARE_VERSION or Parameter == PCAN_DEVICE_PART_NUMBER:
mybuffer = create_string_buffer(256)
elif Parameter == PCAN_ATTACHED_CHANNELS:
res = self.GetValue(Channel, PCAN_ATTACHED_CHANNELS_COUNT)
if TPCANStatus(res[0]) != PCAN_ERROR_OK:
return TPCANStatus(res[0]),
mybuffer = (TPCANChannelInformation * res[1])()
elif Parameter == PCAN_ACCEPTANCE_FILTER_11BIT or PCAN_ACCEPTANCE_FILTER_29BIT:
mybuffer = c_int64(0)
else:
mybuffer = c_int(0)
res = self.__m_dllBasic.CAN_GetValue(Channel,Parameter,byref(mybuffer),sizeof(mybuffer))
if Parameter == PCAN_ATTACHED_CHANNELS:
return TPCANStatus(res),mybuffer
else:
return TPCANStatus(res),mybuffer.value
except:
print ("Exception on PCANBasic.GetValue")
raise
# Returns a descriptive text of a given TPCANStatus
# error code, in any desired language
#
def SetValue(
self,
Channel,
Parameter,
Buffer):
"""
Configures or sets a PCAN Channel value
Remarks:
Parameters can be present or not according with the kind
of Hardware (PCAN Channel) being used. If a parameter is not available,
a PCAN_ERROR_ILLPARAMTYPE error will be returned.
Parameters:
Channel : A TPCANHandle representing a PCAN Channel
Parameter : The TPCANParameter parameter to set
Buffer : Buffer with the value to be set
BufferLength : Size in bytes of the buffer
Returns:
A TPCANStatus error code
"""
try:
if Parameter == PCAN_LOG_LOCATION or Parameter == PCAN_LOG_TEXT or Parameter == PCAN_TRACE_LOCATION:
mybuffer = create_string_buffer(256)
elif Parameter == PCAN_ACCEPTANCE_FILTER_11BIT or PCAN_ACCEPTANCE_FILTER_29BIT:
mybuffer = c_int64(0)
else:
mybuffer = c_int(0)
mybuffer.value = Buffer
res = self.__m_dllBasic.CAN_SetValue(Channel,Parameter,byref(mybuffer),sizeof(mybuffer))
return TPCANStatus(res)
except:
print ("Exception on PCANBasic.SetValue")
raise
def GetErrorText(
self,
Error,
Language = 0):
"""
Returns a descriptive text of a given TPCANStatus error
code, in any desired language
Remarks:
The current languages available for translation are:
Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
Italian (0x10) and French (0x0C)
The return value of this method is a 2-touple, where
the first value is the result (TPCANStatus) of the method and
the second one, the error text
Parameters:
Error : A TPCANStatus error code
Language : Indicates a 'Primary language ID' (Default is Neutral(0))
Returns:
A touple with 2 values
"""
try:
mybuffer = create_string_buffer(256)
res = self.__m_dllBasic.CAN_GetErrorText(Error,Language,byref(mybuffer))
return TPCANStatus(res),mybuffer.value
except:
print ("Exception on PCANBasic.GetErrorText")
raise
def LookUpChannel(
self,
Parameters):
"""
Finds a PCAN-Basic channel that matches with the given parameters
Remarks:
The return value of this method is a 2-touple, where
the first value is the result (TPCANStatus) of the method and
the second one a TPCANHandle value
Parameters:
Parameters : A comma separated string contained pairs of parameter-name/value
to be matched within a PCAN-Basic channel
Returns:
A touple with 2 values
"""
try:
mybuffer = TPCANHandle(0)
res = self.__m_dllBasic.CAN_LookUpChannel(Parameters,byref(mybuffer))
return TPCANStatus(res),mybuffer
except:
print ("Exception on PCANBasic.LookUpChannel")
raise

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,157 @@
===============================================================================
LiesMich.txt
PCAN-Basic V4.6.2.753
Copyright (c) 2022 PEAK-System Technik GmbH Darmstadt
Alle Rechte vorbehalten.
===============================================================================
Maximieren Sie das Editor-Fenster, um diese Datei leichter lesen zu können.
Inhalt:
-------
* Einleitung
* Systemvoraussetzungen
* Bedingungen zur Verwendung dieser Dateien
* Inhalt des Verzeichnisses
* Inbetriebnahme von PCAN-Hardware
* PEAK-System Technik GmbH kontaktieren
Einleitung
----------
Das PCAN-System der Firma PEAK-System Technik GmbH besteht aus einer Sammlung
von Windows Gerätetreibern. Diese sorgen für die Echtzeit-Anbindung von
Windows-Applikationen an alle CAN-Busse, die mittels PCAN-Hardware an den
PC angeschlossen sind.
PCAN-Basic ist eine einfache Programmier-Schnittstelle zum PCAN-System. Über
eine Interface-DLL wird die Verbindung eigener Applikationen an die
Gerätetreiber und die PCAN-Hardware ermöglicht, um eine CAN-Kommunikation zu
betreiben.
Die mitgelieferten Treiber, die PCAN-Basic API und die CAN-Bus Monitor
Software "PCAN-View" sind die im Funktionsumfang reduzierten Versionen
der käuflich zu erwerbenden Software-Pakete PCAN-Developer und PCAN-Explorer.
Bedingungen zur Verwendung dieser Dateien
-----------------------------------------
Bitte lesen Sie die Endbenutzer-Lizenzvereinbarung der Firma PEAK-System Technik GmbH unter:
www.peak-system.com/quick/eula
Die PEAK-System Technik GmbH räumt dem Kunden das Recht ein, die in diesem
Softwarepaket enthaltenen Dateien zu verwenden, solange dies in Verbindung mit
Hardware original von PEAK-System oder mit OEM-Hardware von PEAK-System
geschieht. Es ist ausdrücklich NICHT erlaubt, diese Dateien (auch auszugsweise)
mit Fremdhardware zu verwenden.
Wenn Sie nicht sicher sind, ob Sie mit der verwendeten Hardware auch eine
entsprechende Lizenz erworben haben, setzen Sie sich bitte mit unserem
technischen Support in Verbindung (support@peak-system.com).
Systemvoraussetzungen
---------------------
- Betriebssysteme: Windows 11 (x64/ARM64), Windows 10 (x64)
Inhalt des Verzeichnisses
-------------------------
LiesMich.txt
Diese Textdatei.
ReadMe.txt
Diese Textdatei in englischer Übersetzung.
PCANBasic_enu.chm
Die PCAN-Basic Dokumentation in englischer Sprache.
PCANBasic_deu.chm
Die PCAN-Basic Dokumentation in deutscher Sprache.
PCAN-Parameter_Documentation.pdf
Zusätzliche Dokumentation zu PCAN-Basic Get/Set-Parameter in englischer Sprache.
\Include
- Enthält PCAN-Basic Header-Dateien für verschiedene Programmiersprachen und
Entwicklungsumgebungen.
\x86
- Enthält die 32-Bit (x86) Interface-DLL sowie eine x86-Demoanwendung (exe).
\BB_LIB
x86 LIB-Datei für C++ Builder.
\VC_LIB
x86 LIB-Datei für Visual C/C++.
\x64
- Enthält die 64-Bit (x64) Interface-DLL sowie eine x64-Demoanwendung (exe).
\VC_LIB
x64 LIB-Datei für Visual C/C++.
\ARM64
- Enthält die ARM64 Interface-DLL sowie eine ARM64-Demoanwendung (exe).
\VC_LIB
ARM64 LIB-Datei für Visual C/C++.
\Samples
- Enthält Beispieldateien, welche die Verwendung der PCAN-Basic API in
verschiedenen Programmiersprachen und Entwicklungsumgebungen demonstrieren.
\NuGet
- Enthält das PCAN-Basic.NET-Assembly-NuGet-Paket.
Inbetriebnahme von PCAN-Hardware
--------------------------------
Informationen zur Installation von PCAN-Hardware befindet sich im
entsprechenden Hardware-Benutzerhandbuch. Diese Handbücher sind online
zugänlich unter: www.peak-system.com/quick/Dokumentation.
Auf dem Zielsystem muss die Bibliothek PCANBasic.dll installiert sein,
um Anwendungen ausführen zu können, die diese API verwenden. Es gibt zwei
Möglichkeiten, diese Bibliothek auf einem System zu installieren:
1. Über "Gerätetreiber-Setup" (empfohlen): Dieselbe Anwendung, die
für die Gerätetreiberinstallation verwendet wird, kann auch diese
Bibliothek installieren. Es kann unter folgendem Link heruntergeladen
werden: www.peak-system.com/quick/DrvSetup.
2. Bibliothek manuell kopieren: Kopieren Sie die in diesem Paket
enthaltenen Bibliotheksdateien wie folgt auf das Zielsystem:
Bei x64 Windows-Betriebssystemen:
\x86\PCANBasic.dll --> Windows\SysWOW64
\x64\PCANBasic.dll --> Windows\System32
Bei ARM64 Windows-Betriebssystemen:
\x86\PCANBasic.dll --> Windows\SysWOW64
\x64\PCANBasic.dll --> Anwendungsordner (x64 Anwendungen)
\ARM64\PCANBasic.dll --> Anwendungsordner (ARM64 Anwendungen)
NuGet-Paket Installation
--------------------------
Die Durchführung einer Online- oder Offline-Installation des NuGet-Pakets für
Microsoft Visual Studio or Visual Studio Code wird in der Dokumentation der
PCAN-Basic.NET-Assembly unter https://docs.peak-system.com/API/PCAN-Basic.Net/
im Kapitel „ Einführung\How-To's und Q&A's" erklärt.
PEAK-System Technik GmbH kontaktieren
-------------------------------------
Haben Sie Fragen bezüglich der Inbetriebnahme von PCAN-Hardware, oder benötigen
Sie Informationen über weitere PEAK CAN-Produkte, wenden Sie sich bitte an:
PEAK-System Technik GmbH
Otto-Röhm-Str. 69
64293 Darmstadt
Tel. +49 6151 / 8173-20
FAX +49 6151 / 8173-29
support@peak-system.com
http://www.peak-system.com

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,165 @@
===============================================================================
ReadMe.txt
PCAN-Basic V4.6.2.753
Copyright (c) 2022 PEAK-System Technik GmbH Darmstadt, Germany
All rights reserved.
===============================================================================
Maximize the Notepad Window to read this file more easily.
Contents:
---------
* Introduction
* System Requirements
* Rights to use these files
* Contents of this directory
* Installation of PCAN hardware
* How to contact PEAK-System Technik GmbH
* LIFE SUPPORT APPLIANCES
Introduction
------------
The PCAN system of the company PEAK-System Technik GmbH consists of a
collection of Windows Device Drivers. These allow the Real-time connection of
Windows applications to all CAN busses that are physically connected to the PC
via a PCAN hardware.
PCAN-Basic is a simple programming interface to the PCAN system. Via one
Interface DLL it is possible to connect own applications to the Device drivers
and the PCAN hardware, to communicate with the CAN busses.
The provided drivers, the PCAN-Basic API, and the PCAN-View CAN bus Monitor
software are the feature-reduced versions of the larger software packages
PCAN-Developer or PCAN-Explorer. These can be aquired separately.
Rights to use these files
-------------------------
Please read the End User License Agreement of the company PEAK-System Technik GmbH at:
www.peak-system.com/quick/eula
PEAK-System Technik GmbH grants the right to the customer to use the files in
this software package as long as this is done in connection with original
hardware by PEAK-System or OEM hardware coming from PEAK-System. It is NOT
allowed to use any of these files (even not parts) with third-party hardware.
If you are not sure whether you have acquired an appropriate license with the
used hardware, please contact our technical support team (support@peak-system.com).
System Requirements
-------------------
- Operating systems: Windows 11 (x64/ARM64), Windows 10 (x64)
Contents of this directory
--------------------------
ReadMe.txt
This text file.
LiesMich.txt
This text file in German language.
PCANBasic_enu.chm
The PCAN-Basic documentation in English.
PCANBasic_deu.chm
The PCAN-Basic documentation in German.
PCAN-Parameter_Documentation.pdf
Additional documentation about PCAN-Basic Get/Set parameters in English.
\Include
- The Header files for different programming languages and development
environments.
\x86
- Contains the 32-bit (x86) interface DLL and an x86 demo application (exe).
\BB_LIB
x86 LIB file for C++ Builder.
\VC_LIB
x86 LIB file for Visual C/C++.
\x64
- Contains the 64-bit (x64) interface DLL and an x64 demo application (exe).
\VC_LIB
x64 LIB file for Visual C/C++.
\ARM64
- Contains the ARM64 interface DLL and an ARM64 demo application (exe).
\VC_LIB
ARM64 LIB file for Visual C/C++
\Samples
- Contains example files that demonstrate the use of the PCAN-Basic API in
different programming languages and development environments.
\NuGet
- Contains the PCAN-Basic.NET assembly NuGet package.
Installation of PCAN hardware
-----------------------------
For information on installing PCAN hardware, please refer to the corresponding
hardware user manual. These manuals are accessible online at:
www.peak-system.com/quick/Documentation.
The target system requires to have the PCANBasic.dll library installed in order
to be able to run applications that use this API. There are two ways to get this
library installed on a system:
1. Via "Device Driver Setup" (recommended): The same application used for device
driver installation can also install this library. It can be downloaded using
the following link: www.peak-system.com/quick/DrvSetup.
2. Copying the library manually: Copy the library files contained in this package
to the target system as follow:
For x64 Windows systems:
\x86\PCANBasic.dll --> Windows\SysWOW64
\x64\PCANBasic.dll --> Windows\System32
For ARM64 Windows systems:
\x86\PCANBasic.dll --> Windows\SysWOW64
\x64\PCANBasic.dll --> Application folder (x64 applications)
\ARM64\PCANBasic.dll --> Application folder (ARM64 applications)
Installation of the NuGet Package
---------------------------------
Performing an online or offline installation of the NuGet package for Microsoft
Visual Studio or Visual Studio Code is described in the documentation of the
PCAN-Basic.NET Assembly at https://docs.peak-system.com/API/PCAN-Basic.Net/,
in chapter "Introduction\How-To's and Q&A's".
How to contact PEAK-System Technik GmbH
---------------------------------------
If you have any questions concerning the installation of PCAN hardware, or
require information about other PEAK CAN products, then please contact us:
PEAK-System Technik GmbH
Otto-Roehm-Str. 69
D-64293 Darmstadt
Germany
Tel. +49 6151 / 8173-20
FAX +49 6151 / 8173-29
support@peak-system.com
http://www.peak-system.com
LIFE SUPPORT APPLIANCES
-----------------------
These products are not designed for use in life support appliances, devices,
or systems where malfunction of these products can reasonably be expected to
result in personal injury. PEAK-System customers using or selling these
products for use in such applications do so at their own risk and agree to
fully indemnify PEAK-System for any damages resulting from such improper use
or sale.

View File

@ -0,0 +1,286 @@
#include "01_LookUpChannel.h"
LookUpChannel::LookUpChannel()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
std::cout << "Start searching...\n";
system("PAUSE");
std::cout << "\n";
char sParameters[MAX_PATH];
if (DeviceType != "")
sprintf_s(sParameters, sizeof(sParameters), "%s=%s", ConvertDefinesToChar((wchar_t*)LOOKUP_DEVICE_TYPE), DeviceType);
if (DeviceID != "")
{
if (sParameters != "")
sprintf_s(sParameters, sizeof(sParameters), "%s, ", sParameters);
sprintf_s(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, ConvertDefinesToChar((wchar_t*)LOOKUP_DEVICE_ID), DeviceID);
}
if (ControllerNumber != "")
{
if (sParameters != "")
sprintf_s(sParameters, sizeof(sParameters), "%s, ", sParameters);
sprintf_s(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, ConvertDefinesToChar((wchar_t*)LOOKUP_CONTROLLER_NUMBER), ControllerNumber);
}
if (IPAddress != "")
{
if (sParameters != "")
sprintf_s(sParameters, sizeof(sParameters), "%s, ", sParameters);
sprintf_s(sParameters, sizeof(sParameters), "%s%s=%s", sParameters, ConvertDefinesToChar((wchar_t*)LOOKUP_IP_ADDRESS), IPAddress);
}
TPCANHandle handle;
TPCANStatus stsResult = CAN_LookUpChannel((LPSTR)sParameters, &handle);
if (stsResult == PCAN_ERROR_OK)
{
if (handle != PCAN_NONEBUS)
{
UINT32 iFeatures;
stsResult = CAN_GetValue(handle, PCAN_CHANNEL_FEATURES, &iFeatures, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
char buffer[MAX_PATH];
FormatChannelName(handle, buffer, (iFeatures & FEATURE_FD_CAPABLE) == FEATURE_FD_CAPABLE);
std::cout << "The channel handle " << buffer << " was found\n";
}
else
std::cout << "There was an issue retrieveing supported channel features\n";
}
else
std::cout << "A handle for these lookup-criteria was not found\n";
}
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "There was an error looking up the device, are any hardware channels attached?\n";
ShowStatus(stsResult);
}
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
}
LookUpChannel::~LookUpChannel()
{
CAN_Uninitialize(PCAN_NONEBUS);
}
void LookUpChannel::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic LookUpChannel Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* DeviceType: Numeric value that represents a TPCANDevice |\n";
std::cout << "* DeviceID: Numeric value that represents the device identifier |\n";
std::cout << "* ControllerNumber: Numeric value that represents controller number |\n";
std::cout << "* IPAddress: String value that represents a valid Internet Protocol address |\n";
std::cout << " |\n";
std::cout << "For more information see 'LookUp Parameter Definition' within the documentation |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void LookUpChannel::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
std::cout << "* DeviceType: " << DeviceType << "\n";
std::cout << "* DeviceID: " << DeviceID << "\n";
std::cout << "* ControllerNumber: " << ControllerNumber << "\n";
std::cout << "* IPAddress: " << IPAddress << "\n";
std::cout << "\n";
}
void LookUpChannel::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void LookUpChannel::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void LookUpChannel::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void LookUpChannel::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void LookUpChannel::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}
char* LookUpChannel::ConvertDefinesToChar(wchar_t* define)
{
// Convert the wchar_t string to a char* string. Record
// the length of the original string and add 1 to it to
// account for the terminating null character.
size_t origsize = wcslen(define) + 1;
size_t convertedChars = 0;
// Allocate two bytes in the multibyte output string for every wide
// character in the input string (including a wide character
// null). Because a multibyte character can be one or two bytes,
// you should allot two bytes for each character. Having extra
// space for the new string is not an error, but having
// insufficient space is a potential security problem.
const size_t newsize = origsize * 2;
// The new string will contain a converted copy of the original
// string plus the type of string appended to it.
char* nstring = new char[newsize];
// Put a copy of the converted string into nstring
wcstombs_s(&convertedChars, nstring, newsize, define, _TRUNCATE);
return nstring;
}

View File

@ -0,0 +1,86 @@
#include"stdafx.h"
#include "PCANBasic.h"
class LookUpChannel
{
private:
/// <summary>
/// Sets a TPCANDevice value. The input can be numeric, in hexadecimal or decimal format, or as string denoting
/// a TPCANDevice value name.
/// </summary>
LPCSTR DeviceType = "PCAN_USB";
/// <summary>
/// Sets value in range of a double. The input can be hexadecimal or decimal format.
/// </summary>
LPCSTR DeviceID = "";
/// <summary>
/// Sets a zero-based index value in range of a double. The input can be hexadecimal or decimal format.
/// </summary>
LPCSTR ControllerNumber = "";
/// <summary>
/// Sets a valid Internet Protocol address
/// </summary>
LPCSTR IPAddress = "";
public:
// LookUpChannel constructor
//
LookUpChannel();
// LookUpChannel destructor
//
~LookUpChannel();
private:
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
/// <summary>
/// Converts PCANBasic Define (wchar_t*) to char*
/// </summary>
/// <param name="define">Define to be converted</param>
/// <returns>Define as char*</returns>
char* ConvertDefinesToChar(wchar_t* define);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LookUpChannel", "01_LookUpChannel.vcxproj", "{DE08AE69-04BD-43EA-8602-B6D5528D690B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Debug|x64.ActiveCfg = Debug|x64
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Debug|x64.Build.0 = Debug|x64
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Debug|x86.ActiveCfg = Debug|Win32
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Debug|x86.Build.0 = Debug|Win32
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Release|x64.ActiveCfg = Release|x64
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Release|x64.Build.0 = Release|x64
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Release|x86.ActiveCfg = Release|Win32
{DE08AE69-04BD-43EA-8602-B6D5528D690B}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4A9490BD-A688-47B4-8BCE-026E01EE20C2}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{de08ae69-04bd-43ea-8602-b6d5528d690b}</ProjectGuid>
<RootNamespace>LookUpChannel</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="01_LookUpChannel.cpp" />
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="01_LookUpChannel.h" />
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="01_LookUpChannel.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="01_LookUpChannel.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "01_LookUpChannel.h"
int main()
{
LookUpChannel start;
}

View File

@ -0,0 +1,7 @@
// stdafx.cpp : source file that includes just the standard includes
// PCANBasicExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"

View File

@ -0,0 +1,10 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#include <iostream>
#include <atlstr.h>
#include <conio.h>
#include <Windows.h>
#include "targetver.h"

View File

@ -0,0 +1,25 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif

View File

@ -0,0 +1,761 @@
#include "02_GetSetParameter.h"
GetSetParameter::GetSetParameter()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
TPCANStatus stsResult;
// Initialization of the selected channel
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Can not initialize. Please check the defines in the code.\n";
ShowStatus(stsResult);
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
return;
}
std::cout << "Successfully initialized.\n";
std::cout << "Get/set parameter\n";
system("PAUSE");
std::cout << "\n";
RunSelectedCommands();
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
}
GetSetParameter::~GetSetParameter()
{
CAN_Uninitialize(PCAN_NONEBUS);
}
void GetSetParameter::RunSelectedCommands()
{
// Fill commands here
std::cout << "Fill \"RunSelectedCommands\"-function with parameter functions from \"Parameter commands\"-Region in the code.\n";
}
void GetSetParameter::GetPCAN_DEVICE_ID()
{
UINT32 iDeviceID;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_DEVICE_ID, &iDeviceID, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_DEVICE_ID: " << iDeviceID << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_DEVICE_ID(UINT32 iDeviceID)
{
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_DEVICE_ID, &iDeviceID, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_DEVICE_ID: " << iDeviceID << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_ATTACHED_CHANNELS()
{
UINT32 iChannelsCount;
TPCANStatus stsResult = CAN_GetValue(PCAN_NONEBUS, PCAN_ATTACHED_CHANNELS_COUNT, &iChannelsCount, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
TPCANChannelInformation* ciChannelInformation = new TPCANChannelInformation[iChannelsCount];
stsResult = CAN_GetValue(PCAN_NONEBUS, PCAN_ATTACHED_CHANNELS, ciChannelInformation, iChannelsCount * sizeof(TPCANChannelInformation));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_ATTACHED_CHANNELS:\n";
for (int i = 0; i < (int)iChannelsCount; i++)
{
std::cout << "---------------------------\n";
char buffer[MAX_PATH];
GetTPCANHandleName(ciChannelInformation[i].channel_handle, buffer);
if (IsFD)
std::cout << "channel_handle: " << buffer << "BUS" << (ciChannelInformation[i].channel_handle & 0xFF) << "\n";
else
std::cout << "channel_handle: " << buffer << "BUS" << (ciChannelInformation[i].channel_handle & 0xF) << "\n";
std::cout << "device_type: " << ConvertDeviceTypeToString(ciChannelInformation[i].device_type) << "\n";
std::cout << "controller_number: " << (int)ciChannelInformation[i].controller_number << "\n";
std::cout << "device_features: " << ConvertToChannelFeatures(ciChannelInformation[i].device_features) << "\n";
std::cout << "device_name: " << ciChannelInformation[i].device_name << "\n";
std::cout << "device_id: " << ciChannelInformation[i].device_id << "\n";
std::cout << "channel_condition: " << ConvertToChannelCondition(ciChannelInformation[i].channel_condition) << "\n";
}
std::cout << "\n";
}
delete [] ciChannelInformation;
}
if (stsResult != PCAN_ERROR_OK)
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_CHANNEL_CONDITION()
{
UINT32 iChannelCondition;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_CHANNEL_CONDITION, &iChannelCondition, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_CHANNEL_CONDITION: " << ConvertToChannelCondition(iChannelCondition) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_CHANNEL_IDENTIFYING()
{
UINT32 iChannelIdentifying;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_CHANNEL_IDENTIFYING, &iChannelIdentifying, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_CHANNEL_IDENTIFYING: " << ConvertToParameterOnOff(iChannelIdentifying) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_CHANNEL_IDENTIFYING(bool value)
{
UINT32 ciChannelIdentifying;
if (value)
ciChannelIdentifying = PCAN_PARAMETER_ON;
else
ciChannelIdentifying = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_CHANNEL_IDENTIFYING, &ciChannelIdentifying, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_CHANNEL_IDENTIFYING: " << ConvertToParameterOnOff(ciChannelIdentifying) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_CHANNEL_FEATURES()
{
UINT32 iChannelFeatures;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_CHANNEL_FEATURES, &iChannelFeatures, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_CHANNEL_FEATURES: " << ConvertToChannelFeatures(iChannelFeatures) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_BITRATE_ADAPTING()
{
UINT32 iBitrateAdapting;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_BITRATE_ADAPTING, &iBitrateAdapting, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_BITRATE_ADAPTING: " << ConvertToParameterOnOff(iBitrateAdapting) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_BITRATE_ADAPTING(bool value)
{
UINT32 iBitrateAdapting;
// Note: SetPCAN_BITRATE_ADAPTING requires an uninitialized channel,
//
CAN_Uninitialize(PCAN_NONEBUS);
if (value)
iBitrateAdapting = PCAN_PARAMETER_ON;
else
iBitrateAdapting = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_BITRATE_ADAPTING, &iBitrateAdapting, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_BITRATE_ADAPTING: " << ConvertToParameterOnOff(iBitrateAdapting) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
// Channel will be connected again
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Error while re-initializing the channel.\n";
ShowStatus(stsResult);
}
}
void GetSetParameter::GetPCAN_ALLOW_STATUS_FRAMES()
{
UINT32 iAllowStatusFrames;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_ALLOW_STATUS_FRAMES, &iAllowStatusFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_ALLOW_STATUS_FRAMES: " << ConvertToParameterOnOff(iAllowStatusFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_ALLOW_STATUS_FRAMES(bool value)
{
UINT32 iAllowStatusFrames;
if (value)
iAllowStatusFrames = PCAN_PARAMETER_ON;
else
iAllowStatusFrames = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_ALLOW_STATUS_FRAMES, &iAllowStatusFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_ALLOW_STATUS_FRAMES: " << ConvertToParameterOnOff(iAllowStatusFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_ALLOW_RTR_FRAMES()
{
UINT32 iAllowRTRFrames;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_ALLOW_RTR_FRAMES, &iAllowRTRFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_ALLOW_RTR_FRAMES: " << ConvertToParameterOnOff(iAllowRTRFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_ALLOW_RTR_FRAMES(bool value)
{
UINT32 iAllowRTRFrames;
if (value)
iAllowRTRFrames = PCAN_PARAMETER_ON;
else
iAllowRTRFrames = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_ALLOW_RTR_FRAMES, &iAllowRTRFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_ALLOW_RTR_FRAMES: " << ConvertToParameterOnOff(iAllowRTRFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_ALLOW_ERROR_FRAMES()
{
UINT32 iAllowErrorFrames;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_ALLOW_ERROR_FRAMES, &iAllowErrorFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_ALLOW_ERROR_FRAMES: " << ConvertToParameterOnOff(iAllowErrorFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_ALLOW_ERROR_FRAMES(bool value)
{
UINT32 iAllowErrorFrames;
if (value)
iAllowErrorFrames = PCAN_PARAMETER_ON;
else
iAllowErrorFrames = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_ALLOW_ERROR_FRAMES, &iAllowErrorFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_ALLOW_ERROR_FRAMES: " << ConvertToParameterOnOff(iAllowErrorFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_ALLOW_ECHO_FRAMES()
{
UINT32 iAllowEchoFrames;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_ALLOW_ECHO_FRAMES, &iAllowEchoFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_ALLOW_ECHO_FRAMES: " << ConvertToParameterOnOff(iAllowEchoFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_ALLOW_ECHO_FRAMES(bool value)
{
UINT32 iAllowEchoFrames;
if (value)
iAllowEchoFrames = PCAN_PARAMETER_ON;
else
iAllowEchoFrames = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_ALLOW_ECHO_FRAMES, &iAllowEchoFrames, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_ALLOW_ECHO_FRAMES: " << ConvertToParameterOnOff(iAllowEchoFrames) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_ACCEPTANCE_FILTER_11BIT()
{
UINT64 iAcceptanceFilter11Bit;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_ACCEPTANCE_FILTER_11BIT, &iAcceptanceFilter11Bit, sizeof(UINT64));
if (stsResult == PCAN_ERROR_OK)
{
char result[MAX_PATH];
std::cout << "-----------------------------------------------------------------------------------------\n";
sprintf_s(result, sizeof(result), "%I64X", iAcceptanceFilter11Bit);
std::cout << "Get PCAN_ACCEPTANCE_FILTER_11BIT: " << std::setfill('0') << std::setw(16) << std::hex << result << "h\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_ACCEPTANCE_FILTER_11BIT(UINT64 iacceptancefilter11bit)
{
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_ACCEPTANCE_FILTER_11BIT, &iacceptancefilter11bit, sizeof(UINT64));
if (stsResult == PCAN_ERROR_OK)
{
char result[MAX_PATH];
std::cout << "-----------------------------------------------------------------------------------------\n";
sprintf_s(result, sizeof(result), "%I64X", iacceptancefilter11bit);
std::cout << "Set PCAN_ACCEPTANCE_FILTER_11BIT: " << std::setfill('0') << std::setw(16) << std::hex << result << "h\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_ACCEPTANCE_FILTER_29BIT()
{
UINT64 iAcceptanceFilter29Bit;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_ACCEPTANCE_FILTER_29BIT, &iAcceptanceFilter29Bit, sizeof(UINT64));
if (stsResult == PCAN_ERROR_OK)
{
char result[MAX_PATH];
std::cout << "-----------------------------------------------------------------------------------------\n";
sprintf_s(result, sizeof(result), "%I64X", iAcceptanceFilter29Bit);
std::cout << "Get PCAN_ACCEPTANCE_FILTER_29BIT: " << std::setfill('0') << std::setw(16) << std::hex << result << "h\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_ACCEPTANCE_FILTER_29BIT(UINT64 iacceptancefilter29bit)
{
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_ACCEPTANCE_FILTER_29BIT, &iacceptancefilter29bit, sizeof(UINT64));
if (stsResult == PCAN_ERROR_OK)
{
char result[MAX_PATH];
std::cout << "-----------------------------------------------------------------------------------------\n";
sprintf_s(result, sizeof(result), "%I64X", iacceptancefilter29bit);
std::cout << "Set PCAN_ACCEPTANCE_FILTER_29BIT: " << std::setfill('0') << std::setw(16) << std::hex << result << "h\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::GetPCAN_MESSAGE_FILTER()
{
UINT32 iMessageFilter;
TPCANStatus stsResult = CAN_GetValue(PcanHandle, PCAN_MESSAGE_FILTER, &iMessageFilter, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Get PCAN_MESSAGE_FILTER: " << ConvertToFilterOpenCloseCustom(iMessageFilter) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::SetPCAN_MESSAGE_FILTER(UINT32 imessagefilter)
{
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_MESSAGE_FILTER, &imessagefilter, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
std::cout << "-----------------------------------------------------------------------------------------\n";
std::cout << "Set PCAN_MESSAGE_FILTER: " << ConvertToFilterOpenCloseCustom(imessagefilter) << "\n";
std::cout << "\n";
}
else
ShowStatus(stsResult);
}
void GetSetParameter::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic GetSetParameter Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* PcanHandle: Numeric value that represents the handle of the PCAN-Basic channel to use. |\n";
std::cout << " See 'PCAN-Handle Definitions' within the documentation |\n";
std::cout << "* IsFD: Boolean value that indicates the communication mode, CAN (false) or CAN-FD (true)|\n";
std::cout << "* Bitrate: Numeric value that represents the BTR0/BR1 bitrate value to be used for CAN |\n";
std::cout << " communication |\n";
std::cout << "* BitrateFD: String value that represents the nominal/data bitrate value to be used for |\n";
std::cout << " CAN-FD communication |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void GetSetParameter::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
char buffer[MAX_PATH];
FormatChannelName(PcanHandle, buffer, IsFD);
std::cout << "* PCANHandle: " << buffer << "\n";
if (IsFD)
std::cout << "* IsFD: True\n";
else
std::cout << "* IsFD: False\n";
ConvertBitrateToString(Bitrate, buffer);
std::cout << "* Bitrate: " << buffer << "\n";
std::cout << "* BitrateFD: " << BitrateFD << "\n";
std::cout << "\n";
}
void GetSetParameter::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void GetSetParameter::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void GetSetParameter::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void GetSetParameter::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void GetSetParameter::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}
std::string GetSetParameter::ConvertDeviceTypeToString(BYTE devicetype)
{
switch (devicetype)
{
case 0:
return "PCAN_NONE";
case 1:
return "PCAN_PEAKCAN";
case 2:
return "PCAN_ISA";
case 3:
return "PCAN_DNG";
case 4:
return "PCAN_PCI";
case 5:
return "PCAN_USB";
case 6:
return "PCAN_PCC";
case 7:
return "PCAN_VIRTUAL";
case 8:
return "PCAN_LAN";
default:
return "";
}
}
std::string GetSetParameter::ConvertToParameterOnOff(UINT32 value)
{
switch (value)
{
case PCAN_PARAMETER_OFF:
return "PCAN_PARAMETER_OFF";
case PCAN_PARAMETER_ON:
return "PCAN_PARAMETER_ON";
default:
return "Status unknown: " + std::to_string(value);
}
}
std::string GetSetParameter::ConvertToChannelFeatures(UINT32 value)
{
std::string sFeatures = "";
if ((value & FEATURE_FD_CAPABLE) == FEATURE_FD_CAPABLE)
sFeatures += "FEATURE_FD_CAPABLE";
if ((value & FEATURE_DELAY_CAPABLE) == FEATURE_DELAY_CAPABLE)
if (sFeatures != "")
sFeatures += ", FEATURE_DELAY_CAPABLE";
else
sFeatures += "FEATURE_DELAY_CAPABLE";
if ((value & FEATURE_IO_CAPABLE) == FEATURE_IO_CAPABLE)
if (sFeatures != "")
sFeatures += ", FEATURE_IO_CAPABLE";
else
sFeatures += "FEATURE_IO_CAPABLE";
return sFeatures;
}
std::string GetSetParameter::ConvertToChannelCondition(UINT32 value)
{
switch (value)
{
case PCAN_CHANNEL_UNAVAILABLE:
return "PCAN_CHANNEL_UNAVAILABLE";
case PCAN_CHANNEL_AVAILABLE:
return "PCAN_CHANNEL_AVAILABLE";
case PCAN_CHANNEL_OCCUPIED:
return "PCAN_CHANNEL_OCCUPIED";
case PCAN_CHANNEL_PCANVIEW:
return "PCAN_CHANNEL_PCANVIEW";
default:
return "Status unknow: " + std::to_string(value);
}
}
std::string GetSetParameter::ConvertToFilterOpenCloseCustom(UINT32 value)
{
switch (value)
{
case PCAN_FILTER_CLOSE:
return "PCAN_FILTER_CLOSE";
case PCAN_FILTER_OPEN:
return "PCAN_FILTER_OPEN";
case PCAN_FILTER_CUSTOM:
return "PCAN_FILTER_CUSTOM";
default:
return "Status unknown: " + std::to_string(value);
}
}

View File

@ -0,0 +1,245 @@
#include "stdafx.h"
#include "PCANBasic.h"
class GetSetParameter
{
private:
/// <summary>
/// Sets the PCANHandle (Hardware Channel)
/// </summary>
const TPCANHandle PcanHandle = PCAN_USBBUS1;
/// <summary>
/// Sets the desired connection mode (CAN = false / CAN-FD = true)
/// </summary>
const bool IsFD = false;
/// <summary>
/// Sets the bitrate for normal CAN devices
/// </summary>
const TPCANBaudrate Bitrate = PCAN_BAUD_500K;
/// <summary>
/// Sets the bitrate for CAN FD devices.
/// Example - Bitrate Nom: 1Mbit/s Data: 2Mbit/s:
/// "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1"
/// </summary>
const TPCANBitrateFD BitrateFD = const_cast<LPSTR>("f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1");
public:
// GetSetParameter constructor
//
GetSetParameter();
// GetSetParameter destructor
//
~GetSetParameter();
private:
/// <summary>
/// Runs all commands for get or set parameters
/// </summary>
void RunSelectedCommands();
/// <summary>
/// Shows device identifier parameter
/// </summary>
void GetPCAN_DEVICE_ID();
/// <summary>
/// Sets device identifier parameter
/// </summary>
/// <param name="iDeviceID"></param>
void SetPCAN_DEVICE_ID(UINT32 iDeviceID);
/// <summary>
/// Shows all information about attached channels
/// </summary>
void GetPCAN_ATTACHED_CHANNELS();
/// <summary>
/// Shows the status of selected PCAN-Channel
/// </summary>
void GetPCAN_CHANNEL_CONDITION();
/// <summary>
/// Shows the status from the status LED of the USB devices
/// </summary>
void GetPCAN_CHANNEL_IDENTIFYING();
/// <summary>
/// De/Activates the status LED of the USB devices
/// </summary>
/// <param name="value">True to turn on; False to turn off</param>
void SetPCAN_CHANNEL_IDENTIFYING(bool value);
/// <summary>
/// Shows information about features
/// </summary>
void GetPCAN_CHANNEL_FEATURES();
/// <summary>
/// Shows the status from Bitrate-Adapting mode
/// </summary>
void GetPCAN_BITRATE_ADAPTING();
/// <summary>
/// De/Activates the Bitrate-Adapting mode
/// </summary>
/// <param name="value">True to turn on; False to turn off</param>
void SetPCAN_BITRATE_ADAPTING(bool value);
/// <summary>
/// Shows the status from the reception of status frames
/// </summary>
void GetPCAN_ALLOW_STATUS_FRAMES();
/// <summary>
/// De/Activates the reception of status frames
/// </summary>
/// <param name="value">True to turn on; False to turn off</param>
void SetPCAN_ALLOW_STATUS_FRAMES(bool value);
/// <summary>
/// Shows the status from the reception of RTR frames
/// </summary>
void GetPCAN_ALLOW_RTR_FRAMES();
/// <summary>
/// De/Activates the reception of RTR frames
/// </summary>
/// <param name="value">True to turn on; False to turn off</param>
void SetPCAN_ALLOW_RTR_FRAMES(bool value);
/// <summary>
/// Shows the status from the reception of CAN error frames
/// </summary>
void GetPCAN_ALLOW_ERROR_FRAMES();
/// <summary>
/// De/Activates the reception of CAN error frames
/// </summary>
/// <param name="value">True to turn on; False to turn off</param>
void SetPCAN_ALLOW_ERROR_FRAMES(bool value);
/// <summary>
/// Shows the status from the reception of Echo frames
/// </summary>
void GetPCAN_ALLOW_ECHO_FRAMES();
/// <summary>
/// De/Activates the reception of Echo frames
/// </summary>
/// <param name="value">True to turn on; False to turn off</param>
void SetPCAN_ALLOW_ECHO_FRAMES(bool value);
/// <summary>
/// Shows the reception filter with a specific 11-bit acceptance code and mask
/// </summary>
void GetPCAN_ACCEPTANCE_FILTER_11BIT();
/// <summary>
/// Sets the reception filter with a specific 11-bit acceptance code and mask
/// </summary>
/// <param name="iacceptancefilter11bit">Acceptance code and mask</param>
void SetPCAN_ACCEPTANCE_FILTER_11BIT(UINT64 iacceptancefilter11bit);
/// <summary>
/// Shows the reception filter with a specific 29-bit acceptance code and mask
/// </summary>
void GetPCAN_ACCEPTANCE_FILTER_29BIT();
/// <summary>
/// Sets the reception filter with a specific 29-bit acceptance code and mask
/// </summary>
/// <param name="iacceptancefilter29bit">Acceptance code and mask</param>
void SetPCAN_ACCEPTANCE_FILTER_29BIT(UINT64 iacceptancefilter29bit);
/// <summary>
/// Shows the status of the reception filter
/// </summary>
void GetPCAN_MESSAGE_FILTER();
/// <summary>
/// De/Activates the reception filter
/// </summary>
/// <param name="imessagefilter">Configure reception filter</param>
void SetPCAN_MESSAGE_FILTER(UINT32 imessagefilter);
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
/// <summary>
/// Convert BYTE value to readable string value
/// </summary>
/// <param name="devicetype"></param>
/// <returns></returns>
std::string ConvertDeviceTypeToString(BYTE devicetype);
/// <summary>
/// Convert uint value to readable string value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
std::string ConvertToParameterOnOff(UINT32 value);
/// <summary>
/// Convert uint value to readable string value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
std::string ConvertToChannelFeatures(UINT32 value);
/// <summary>
/// Convert uint value to readable string value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
std::string ConvertToChannelCondition(UINT32 value);
/// <summary>
/// Convert uint value to readable string value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
std::string ConvertToFilterOpenCloseCustom(UINT32 value);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GetSetParameter", "02_GetSetParameter.vcxproj", "{4333360A-2706-409C-8FE5-018B189219F6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4333360A-2706-409C-8FE5-018B189219F6}.Debug|x64.ActiveCfg = Debug|x64
{4333360A-2706-409C-8FE5-018B189219F6}.Debug|x64.Build.0 = Debug|x64
{4333360A-2706-409C-8FE5-018B189219F6}.Debug|x86.ActiveCfg = Debug|Win32
{4333360A-2706-409C-8FE5-018B189219F6}.Debug|x86.Build.0 = Debug|Win32
{4333360A-2706-409C-8FE5-018B189219F6}.Release|x64.ActiveCfg = Release|x64
{4333360A-2706-409C-8FE5-018B189219F6}.Release|x64.Build.0 = Release|x64
{4333360A-2706-409C-8FE5-018B189219F6}.Release|x86.ActiveCfg = Release|Win32
{4333360A-2706-409C-8FE5-018B189219F6}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DF41B51B-1929-46AD-9287-082CFBC458CE}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{4333360a-2706-409c-8fe5-018b189219f6}</ProjectGuid>
<RootNamespace>GetSetParameter</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="02_GetSetParameter.cpp" />
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="02_GetSetParameter.h" />
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="02_GetSetParameter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="02_GetSetParameter.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "02_GetSetParameter.h"
int main()
{
GetSetParameter start;
}

View File

@ -0,0 +1,7 @@
// stdafx.cpp : source file that includes just the standard includes
// PCANBasicExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"

View File

@ -0,0 +1,12 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#include <iostream>
#include <atlstr.h>
#include <conio.h>
#include <iomanip>
#include <Windows.h>
#include <string>
#include "targetver.h"

View File

@ -0,0 +1,25 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif

View File

@ -0,0 +1,392 @@
#include "03_ManualRead.h"
ManualRead::ManualRead()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
TPCANStatus stsResult;
// Initialization of the selected channel
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Can not initialize. Please check the defines in the code.\n";
ShowStatus(stsResult);
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
return;
}
// Reading messages...
std::cout << "Successfully initialized.\n";
std::cout << "Start reading...\n";
system("PAUSE");
do
{
system("cls");
ReadMessages();
std::cout << "Do you want to read again? yes[y] or any other key to close\n";
} while (_getch() == 121);
}
ManualRead::~ManualRead()
{
CAN_Uninitialize(PCAN_NONEBUS);
}
void ManualRead::ReadMessages()
{
TPCANStatus stsResult;
// We read at least one time the queue looking for messages. If a message is found, we look again trying to
// find more. If the queue is empty or an error occurr, we get out from the dowhile statement.
do
{
stsResult = IsFD ? ReadMessageFD() : ReadMessage();
if (stsResult != PCAN_ERROR_OK && stsResult != PCAN_ERROR_QRCVEMPTY)
{
ShowStatus(stsResult);
return;
}
} while (!(stsResult & PCAN_ERROR_QRCVEMPTY));
}
TPCANStatus ManualRead::ReadMessageFD()
{
TPCANMsgFD CANMsg;
TPCANTimestampFD CANTimeStamp;
// We execute the "Read" function of the PCANBasic
TPCANStatus stsResult = CAN_ReadFD(PcanHandle, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
// We process the received message
ProcessMessageCanFD(CANMsg, CANTimeStamp);
return stsResult;
}
TPCANStatus ManualRead::ReadMessage()
{
TPCANMsg CANMsg;
TPCANTimestamp CANTimeStamp;
// We execute the "Read" function of the PCANBasic
TPCANStatus stsResult = CAN_Read(PcanHandle, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
// We process the received message
ProcessMessageCan(CANMsg, CANTimeStamp);
return stsResult;
}
void ManualRead::ProcessMessageCan(TPCANMsg msg, TPCANTimestamp itsTimeStamp)
{
UINT64 microsTimestamp = ((UINT64)itsTimeStamp.micros + 1000 * (UINT64)itsTimeStamp.millis + 0x100000000 * 1000 * itsTimeStamp.millis_overflow);
std::cout << "Type: " << GetMsgTypeString(msg.MSGTYPE) << "\n";
std::cout << "ID: " << GetIdString(msg.ID, msg.MSGTYPE) << "\n";
char result[MAX_PATH] = { 0 };
sprintf_s(result, sizeof(result), "%i", msg.LEN);
std::cout << "Length: " << result << "\n";
std::cout << "Time: " << GetTimeString(microsTimestamp) << "\n";
std::cout << "Data: " << GetDataString(msg.DATA, msg.MSGTYPE, msg.LEN) << "\n";
std::cout << "----------------------------------------------------------\n";
}
void ManualRead::ProcessMessageCanFD(TPCANMsgFD msg, TPCANTimestampFD itsTimeStamp)
{
std::cout << "Type: " << GetMsgTypeString(msg.MSGTYPE) << "\n";
std::cout << "ID: " << GetIdString(msg.ID, msg.MSGTYPE) << "\n";
std::cout << "Length: " << GetLengthFromDLC(msg.DLC) << "\n";
std::cout << "Time: " << GetTimeString(itsTimeStamp) << "\n";
std::cout << "Data: " << GetDataString(msg.DATA, msg.MSGTYPE, GetLengthFromDLC(msg.DLC)) << "\n";
std::cout << "----------------------------------------------------------\n";
}
void ManualRead::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic ManualRead Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* PcanHandle: Numeric value that represents the handle of the PCAN-Basic channel to use. |\n";
std::cout << " See 'PCAN-Handle Definitions' within the documentation |\n";
std::cout << "* IsFD: Boolean value that indicates the communication mode, CAN (false) or CAN-FD (true)|\n";
std::cout << "* Bitrate: Numeric value that represents the BTR0/BR1 bitrate value to be used for CAN |\n";
std::cout << " communication |\n";
std::cout << "* BitrateFD: String value that represents the nominal/data bitrate value to be used for |\n";
std::cout << " CAN-FD communication |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void ManualRead::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
char buffer[MAX_PATH];
FormatChannelName(PcanHandle, buffer, IsFD);
std::cout << "* PCANHandle: " << buffer << "\n";
if (IsFD)
std::cout << "* IsFD: True\n";
else
std::cout << "* IsFD: False\n";
ConvertBitrateToString(Bitrate, buffer);
std::cout << "* Bitrate: " << buffer << "\n";
std::cout << "* BitrateFD: " << BitrateFD << "\n";
std::cout << "\n";
}
void ManualRead::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void ManualRead::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void ManualRead::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void ManualRead::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void ManualRead::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}
std::string ManualRead::GetMsgTypeString(TPCANMessageType msgType)
{
if ((msgType & PCAN_MESSAGE_STATUS) == PCAN_MESSAGE_STATUS)
return "STATUS";
if ((msgType & PCAN_MESSAGE_ERRFRAME) == PCAN_MESSAGE_ERRFRAME)
return "ERROR";
std::string strTemp;
if ((msgType & PCAN_MESSAGE_EXTENDED) == PCAN_MESSAGE_EXTENDED)
strTemp = "EXT";
else
strTemp = "STD";
if ((msgType & PCAN_MESSAGE_RTR) == PCAN_MESSAGE_RTR)
strTemp = (strTemp + "/RTR");
else
if (msgType > PCAN_MESSAGE_EXTENDED)
{
strTemp = (strTemp + " [ ");
if (msgType & PCAN_MESSAGE_FD)
strTemp = (strTemp + " FD");
if (msgType & PCAN_MESSAGE_BRS)
strTemp = (strTemp + " BRS");
if (msgType & PCAN_MESSAGE_ESI)
strTemp = (strTemp + " ESI");
strTemp = (strTemp + " ]");
}
return strTemp;
}
std::string ManualRead::GetIdString(UINT32 id, TPCANMessageType msgType)
{
char result[MAX_PATH] = { 0 };
if ((msgType & PCAN_MESSAGE_EXTENDED) == PCAN_MESSAGE_EXTENDED)
{
sprintf_s(result, sizeof(result), "%08Xh", id);
return result;
}
sprintf_s(result, sizeof(result), "%03Xh", id);
return result;
}
int ManualRead::GetLengthFromDLC(BYTE dlc)
{
switch (dlc)
{
case 9: return 12;
case 10: return 16;
case 11: return 20;
case 12: return 24;
case 13: return 32;
case 14: return 48;
case 15: return 64;
default: return dlc;
}
}
std::string ManualRead::GetTimeString(TPCANTimestampFD time)
{
char result[MAX_PATH] = { 0 };
double fTime = (time / 1000.0);
sprintf_s(result, sizeof(result), "%.1f", fTime);
return result;
}
std::string ManualRead::GetDataString(BYTE data[], TPCANMessageType msgType, int dataLength)
{
if ((msgType & PCAN_MESSAGE_RTR) == PCAN_MESSAGE_RTR)
return "Remote Request";
else
{
char strTemp[MAX_PATH] = { 0 };
std::string result = "";
for (int i = 0; i < dataLength; i++)
{
sprintf_s(strTemp, sizeof(strTemp), "%02X ", data[i]);
result.append(strTemp);
}
return result;
}
}

View File

@ -0,0 +1,150 @@
#include "stdafx.h"
#include "PCANBasic.h"
class ManualRead
{
private:
/// <summary>
/// Sets the PCANHandle (Hardware Channel)
/// </summary>
const TPCANHandle PcanHandle = PCAN_USBBUS1;
/// <summary>
/// Sets the desired connection mode (CAN = false / CAN-FD = true)
/// </summary>
const bool IsFD = false;
/// <summary>
/// Sets the bitrate for normal CAN devices
/// </summary>
const TPCANBaudrate Bitrate = PCAN_BAUD_500K;
/// <summary>
/// Sets the bitrate for CAN FD devices.
/// Example - Bitrate Nom: 1Mbit/s Data: 2Mbit/s:
/// "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1"
/// </summary>
const TPCANBitrateFD BitrateFD = const_cast<LPSTR>("f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1");
public:
// ManualRead constructor
//
ManualRead();
// ManualRead destructor
//
~ManualRead();
private:
/// <summary>
/// Function for reading PCAN-Basic messages
/// </summary>
void ReadMessages();
/// <summary>
/// Function for reading messages on CAN-FD devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus ReadMessageFD();
/// <summary>
/// Function for reading CAN messages on normal CAN devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus ReadMessage();
/// <summary>
/// Processes a received CAN message
/// </summary>
/// <param name="msg">The received PCAN-Basic CAN message</param>
/// <param name="itsTimeStamp">Timestamp of the message as TPCANTimestamp structure</param>
void ProcessMessageCan(TPCANMsg msg, TPCANTimestamp itsTimeStamp);
/// <summary>
/// Processes a received CAN-FD message
/// </summary>
/// <param name="msg">The received PCAN-Basic CAN-FD message</param>
/// <param name="itsTimeStamp">Timestamp of the message as microseconds (ulong)</param>
void ProcessMessageCanFD(TPCANMsgFD msg, TPCANTimestampFD itsTimeStamp);
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
/// <summary>
/// Gets the string representation of the type of a CAN message
/// </summary>
/// <param name="msgType">Type of a CAN message</param>
/// <returns>The type of the CAN message as string</returns>
std::string GetMsgTypeString(TPCANMessageType msgType);
/// <summary>
/// Gets the string representation of the ID of a CAN message
/// </summary>
/// <param name="id">Id to be parsed</param>
/// <param name="msgType">Type flags of the message the Id belong</param>
/// <returns>Hexadecimal representation of the ID of a CAN message</returns>
std::string GetIdString(UINT32 id, TPCANMessageType msgType);
/// <summary>
/// Gets the data length of a CAN message
/// </summary>
/// <param name="dlc">Data length code of a CAN message</param>
/// <returns>Data length as integer represented by the given DLC code</returns>
int GetLengthFromDLC(BYTE dlc);
/// <summary>
/// Gets the string representation of the timestamp of a CAN message, in milliseconds
/// </summary>
/// <param name="time">Timestamp in microseconds</param>
/// <returns>String representing the timestamp in milliseconds</returns>
std::string GetTimeString(TPCANTimestampFD time);
/// <summary>
/// Gets the data of a CAN message as a string
/// </summary>
/// <param name="data">Array of bytes containing the data to parse</param>
/// <param name="msgType">Type flags of the message the data belong</param>
/// <param name="dataLength">The amount of bytes to take into account wihtin the given data</param>
/// <returns>A string with hexadecimal formatted data bytes of a CAN message</returns>
std::string GetDataString(BYTE data[], TPCANMessageType msgType, int dataLength);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ManualRead", "03_ManualRead.vcxproj", "{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Debug|x64.ActiveCfg = Debug|x64
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Debug|x64.Build.0 = Debug|x64
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Debug|x86.ActiveCfg = Debug|Win32
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Debug|x86.Build.0 = Debug|Win32
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Release|x64.ActiveCfg = Release|x64
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Release|x64.Build.0 = Release|x64
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Release|x86.ActiveCfg = Release|Win32
{AE40008D-A958-4A5A-B6A2-5D941D79EF1D}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6CD20D96-5C95-447F-AFD9-E6432A9C89FE}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{ae40008d-a958-4a5a-b6a2-5d941d79ef1d}</ProjectGuid>
<RootNamespace>ManualRead</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="03_ManualRead.cpp" />
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="03_ManualRead.h" />
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="03_ManualRead.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="03_ManualRead.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "03_ManualRead.h"
int main()
{
ManualRead start;
}

View File

@ -0,0 +1,7 @@
// stdafx.cpp : source file that includes just the standard includes
// PCANBasicExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"

View File

@ -0,0 +1,10 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#include <iostream>
#include <atlstr.h>
#include <conio.h>
#include <Windows.h>
#include "targetver.h"

View File

@ -0,0 +1,25 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif

View File

@ -0,0 +1,282 @@
#include "04_ManualWrite.h"
ManualWrite::ManualWrite()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
TPCANStatus stsResult;
// Initialization of the selected channel
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Can not initialize. Please check the defines in the code.\n";
ShowStatus(stsResult);
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
return;
}
// Writing messages...
std::cout << "Successfully initialized.\n";
std::cout << "For write: ";
system("PAUSE");
do
{
system("cls");
WriteMessages();
std::cout << "Do you want to write again? yes[y] or any other key to close\n";
} while (_getch() == 121);
}
ManualWrite::~ManualWrite()
{
CAN_Uninitialize(PCAN_NONEBUS);
}
void ManualWrite::WriteMessages()
{
TPCANStatus stsResult;
if (IsFD)
stsResult = WriteMessageFD();
else
stsResult = WriteMessage();
// Checks if the message was sent
if (stsResult != PCAN_ERROR_OK)
ShowStatus(stsResult);
else
std::cout << "Message was successfully SENT\n";
}
TPCANStatus ManualWrite::WriteMessage()
{
// Sends a CAN message with extended ID, and 8 data bytes
TPCANMsg msgCanMessage;
msgCanMessage.ID = 0x100;
msgCanMessage.LEN = (BYTE)8;
msgCanMessage.MSGTYPE = PCAN_MESSAGE_EXTENDED;
for (BYTE i = 0; i < 8; i++)
{
msgCanMessage.DATA[i] = i;
}
return CAN_Write(PcanHandle, &msgCanMessage);
}
TPCANStatus ManualWrite::WriteMessageFD()
{
// Sends a CAN-FD message with standard ID, 64 data bytes, and bitrate switch
TPCANMsgFD msgCanMessageFD;
msgCanMessageFD.ID = 0x100;
msgCanMessageFD.DLC = 15;
msgCanMessageFD.MSGTYPE = PCAN_MESSAGE_FD | PCAN_MESSAGE_BRS;
for (BYTE i = 0; i < 64; i++)
{
msgCanMessageFD.DATA[i] = i;
}
return CAN_WriteFD(PcanHandle, &msgCanMessageFD);
}
void ManualWrite::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic ManualWrite Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* PcanHandle: Numeric value that represents the handle of the PCAN-Basic channel to use. |\n";
std::cout << " See 'PCAN-Handle Definitions' within the documentation |\n";
std::cout << "* IsFD: Boolean value that indicates the communication mode, CAN (false) or CAN-FD (true)|\n";
std::cout << "* Bitrate: Numeric value that represents the BTR0/BR1 bitrate value to be used for CAN |\n";
std::cout << " communication |\n";
std::cout << "* BitrateFD: String value that represents the nominal/data bitrate value to be used for |\n";
std::cout << " CAN-FD communication |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void ManualWrite::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
char buffer[MAX_PATH];
FormatChannelName(PcanHandle, buffer, IsFD);
std::cout << "* PCANHandle: " << buffer << "\n";
if (IsFD)
std::cout << "* IsFD: True\n";
else
std::cout << "* IsFD: False\n";
ConvertBitrateToString(Bitrate, buffer);
std::cout << "* Bitrate: " << buffer << "\n";
std::cout << "* BitrateFD: " << BitrateFD << "\n";
std::cout << "\n";
}
void ManualWrite::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void ManualWrite::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void ManualWrite::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void ManualWrite::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void ManualWrite::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}

View File

@ -0,0 +1,97 @@
#include "stdafx.h"
#include "PCANBasic.h"
class ManualWrite
{
private:
/// <summary>
/// Sets the PCANHandle (Hardware Channel)
/// </summary>
const TPCANHandle PcanHandle = PCAN_USBBUS1;
/// <summary>
/// Sets the desired connection mode (CAN = false / CAN-FD = true)
/// </summary>
const bool IsFD = false;
/// <summary>
/// Sets the bitrate for normal CAN devices
/// </summary>
const TPCANBaudrate Bitrate = PCAN_BAUD_500K;
/// <summary>
/// Sets the bitrate for CAN FD devices.
/// Example - Bitrate Nom: 1Mbit/s Data: 2Mbit/s:
/// "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1"
/// </summary>
const TPCANBitrateFD BitrateFD = const_cast<LPSTR>("f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1");
public:
// ManualWrite constructor
//
ManualWrite();
// ManualWrite destructor
//
~ManualWrite();
private:
/// <summary>
/// Function for writing PCAN-Basic messages
/// </summary>
void WriteMessages();
/// <summary>
/// Function for writing messages on CAN devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus WriteMessage();
/// <summary>
/// Function for writing messages on CAN-FD devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus WriteMessageFD();
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ManualWrite", "04_ManualWrite.vcxproj", "{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Debug|x64.ActiveCfg = Debug|x64
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Debug|x64.Build.0 = Debug|x64
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Debug|x86.ActiveCfg = Debug|Win32
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Debug|x86.Build.0 = Debug|Win32
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Release|x64.ActiveCfg = Release|x64
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Release|x64.Build.0 = Release|x64
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Release|x86.ActiveCfg = Release|Win32
{0B959A9F-F86F-4EE0-A45B-9FC1F6F89A0F}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E99604D1-ECD8-4509-9C07-01682C0134A8}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{0b959a9f-f86f-4ee0-a45b-9fc1f6f89a0f}</ProjectGuid>
<RootNamespace>ManualWrite</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="04_ManualWrite.cpp" />
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="04_ManualWrite.h" />
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="04_ManualWrite.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="04_ManualWrite.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "04_ManualWrite.h"
int main()
{
ManualWrite start;
}

View File

@ -0,0 +1,7 @@
// stdafx.cpp : source file that includes just the standard includes
// PCANBasicExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"

View File

@ -0,0 +1,10 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#include <iostream>
#include <atlstr.h>
#include <conio.h>
#include <Windows.h>
#include "targetver.h"

View File

@ -0,0 +1,25 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif

View File

@ -0,0 +1,7 @@
No Timer class:
~~~~~~~~~~~~~~~
Since there is no timer class in the environemnt used for the sample project, a timer is actually implemented by using a thread.
In order to check how a thread is used, please refer to the sample project "07_ThreadRead".
PEAK-Team

View File

@ -0,0 +1,7 @@
No Timer class:
~~~~~~~~~~~~~~~
Since there is no timer class in the environemnt used for the sample project, a timer is actually implemented by using a thread.
In order to check how a thread is used, please refer to the sample project "07_ThreadRead".
PEAK-Team

View File

@ -0,0 +1,402 @@
#include "07_ThreadRead.h"
ThreadRead::ThreadRead()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
TPCANStatus stsResult;
// Initialization of the selected channel
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Can not initialize. Please check the defines in the code.\n";
ShowStatus(stsResult);
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
return;
}
// Reading messages...
std::cout << "Successfully initialized.\n";
m_ThreadRun = true;
m_ReadThread = new std::thread(&ThreadRead::ThreadExecute, this);
std::cout << "Started reading messages...\n";
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
}
ThreadRead::~ThreadRead()
{
m_ThreadRun = false;
m_ReadThread->join();
delete m_ReadThread;
CAN_Uninitialize(PCAN_NONEBUS);
}
void ThreadRead::ThreadExecute()
{
while (m_ThreadRun)
{
// Sleep(1); //Use Sleep to reduce the CPU load
ReadMessages();
}
}
void ThreadRead::ReadMessages()
{
TPCANStatus stsResult;
// We read at least one time the queue looking for messages. If a message is found, we look again trying to
// find more. If the queue is empty or an error occurr, we get out from the dowhile statement.
do
{
stsResult = IsFD ? ReadMessageFD() : ReadMessage();
if (stsResult != PCAN_ERROR_OK && stsResult != PCAN_ERROR_QRCVEMPTY)
{
ShowStatus(stsResult);
return;
}
} while (!(stsResult & PCAN_ERROR_QRCVEMPTY));
}
TPCANStatus ThreadRead::ReadMessageFD()
{
TPCANMsgFD CANMsg;
TPCANTimestampFD CANTimeStamp;
// We execute the "Read" function of the PCANBasic
TPCANStatus stsResult = CAN_ReadFD(PcanHandle, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
// We process the received message
ProcessMessageCanFD(CANMsg, CANTimeStamp);
return stsResult;
}
TPCANStatus ThreadRead::ReadMessage()
{
TPCANMsg CANMsg;
TPCANTimestamp CANTimeStamp;
// We execute the "Read" function of the PCANBasic
TPCANStatus stsResult = CAN_Read(PcanHandle, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
// We process the received message
ProcessMessageCan(CANMsg, CANTimeStamp);
return stsResult;
}
void ThreadRead::ProcessMessageCan(TPCANMsg msg, TPCANTimestamp itsTimeStamp)
{
UINT64 microsTimestamp = ((UINT64)itsTimeStamp.micros + 1000 * (UINT64)itsTimeStamp.millis + 0x100000000 * 1000 * itsTimeStamp.millis_overflow);
std::cout << "Type: " << GetMsgTypeString(msg.MSGTYPE) << "\n";
std::cout << "ID: " << GetIdString(msg.ID, msg.MSGTYPE) << "\n";
char result[MAX_PATH] = { 0 };
sprintf_s(result, sizeof(result), "%i", msg.LEN);
std::cout << "Length: " << result << "\n";
std::cout << "Time: " << GetTimeString(microsTimestamp) << "\n";
std::cout << "Data: " << GetDataString(msg.DATA, msg.MSGTYPE, msg.LEN) << "\n";
std::cout << "----------------------------------------------------------\n";
}
void ThreadRead::ProcessMessageCanFD(TPCANMsgFD msg, TPCANTimestampFD itsTimeStamp)
{
std::cout << "Type: " << GetMsgTypeString(msg.MSGTYPE) << "\n";
std::cout << "ID: " << GetIdString(msg.ID, msg.MSGTYPE) << "\n";
std::cout << "Length: " << GetLengthFromDLC(msg.DLC) << "\n";
std::cout << "Time: " << GetTimeString(itsTimeStamp) << "\n";
std::cout << "Data: " << GetDataString(msg.DATA, msg.MSGTYPE, GetLengthFromDLC(msg.DLC)) << "\n";
std::cout << "----------------------------------------------------------\n";
}
void ThreadRead::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic ThreadRead Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* PcanHandle: Numeric value that represents the handle of the PCAN-Basic channel to use. |\n";
std::cout << " See 'PCAN-Handle Definitions' within the documentation |\n";
std::cout << "* IsFD: Boolean value that indicates the communication mode, CAN (false) or CAN-FD (true)|\n";
std::cout << "* Bitrate: Numeric value that represents the BTR0/BR1 bitrate value to be used for CAN |\n";
std::cout << " communication |\n";
std::cout << "* BitrateFD: String value that represents the nominal/data bitrate value to be used for |\n";
std::cout << " CAN-FD communication |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void ThreadRead::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
char buffer[MAX_PATH];
FormatChannelName(PcanHandle, buffer, IsFD);
std::cout << "* PCANHandle: " << buffer << "\n";
if (IsFD)
std::cout << "* IsFD: True\n";
else
std::cout << "* IsFD: False\n";
ConvertBitrateToString(Bitrate, buffer);
std::cout << "* Bitrate: " << buffer << "\n";
std::cout << "* BitrateFD: " << BitrateFD << "\n";
std::cout << "\n";
}
void ThreadRead::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void ThreadRead::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void ThreadRead::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void ThreadRead::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void ThreadRead::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}
std::string ThreadRead::GetMsgTypeString(TPCANMessageType msgType)
{
if ((msgType & PCAN_MESSAGE_STATUS) == PCAN_MESSAGE_STATUS)
return "STATUS";
if ((msgType & PCAN_MESSAGE_ERRFRAME) == PCAN_MESSAGE_ERRFRAME)
return "ERROR";
std::string strTemp;
if ((msgType & PCAN_MESSAGE_EXTENDED) == PCAN_MESSAGE_EXTENDED)
strTemp = "EXT";
else
strTemp = "STD";
if ((msgType & PCAN_MESSAGE_RTR) == PCAN_MESSAGE_RTR)
strTemp = (strTemp + "/RTR");
else
if (msgType > PCAN_MESSAGE_EXTENDED)
{
strTemp = (strTemp + " [ ");
if (msgType & PCAN_MESSAGE_FD)
strTemp = (strTemp + " FD");
if (msgType & PCAN_MESSAGE_BRS)
strTemp = (strTemp + " BRS");
if (msgType & PCAN_MESSAGE_ESI)
strTemp = (strTemp + " ESI");
strTemp = (strTemp + " ]");
}
return strTemp;
}
std::string ThreadRead::GetIdString(UINT32 id, TPCANMessageType msgType)
{
char result[MAX_PATH] = { 0 };
if ((msgType & PCAN_MESSAGE_EXTENDED) == PCAN_MESSAGE_EXTENDED)
{
sprintf_s(result, sizeof(result), "%08Xh", id);
return result;
}
sprintf_s(result, sizeof(result), "%03Xh", id);
return result;
}
int ThreadRead::GetLengthFromDLC(BYTE dlc)
{
switch (dlc)
{
case 9: return 12;
case 10: return 16;
case 11: return 20;
case 12: return 24;
case 13: return 32;
case 14: return 48;
case 15: return 64;
default: return dlc;
}
}
std::string ThreadRead::GetTimeString(TPCANTimestampFD time)
{
char result[MAX_PATH] = { 0 };
double fTime = (time / 1000.0);
sprintf_s(result, sizeof(result), "%.1f", fTime);
return result;
}
std::string ThreadRead::GetDataString(BYTE data[], TPCANMessageType msgType, int dataLength)
{
if ((msgType & PCAN_MESSAGE_RTR) == PCAN_MESSAGE_RTR)
return "Remote Request";
else
{
char strTemp[MAX_PATH] = { 0 };
std::string result = "";
for (int i = 0; i < dataLength; i++)
{
sprintf_s(strTemp, sizeof(strTemp), "%02X ", data[i]);
result.append(strTemp);
}
return result;
}
}

View File

@ -0,0 +1,162 @@
#include "stdafx.h"
#include "PCANBasic.h"
class ThreadRead
{
private:
/// <summary>
/// Sets the PCANHandle (Hardware Channel)
/// </summary>
const TPCANHandle PcanHandle = PCAN_USBBUS1;
/// <summary>
/// Sets the desired connection mode (CAN = false / CAN-FD = true)
/// </summary>
const bool IsFD = false;
/// <summary>
/// Sets the bitrate for normal CAN devices
/// </summary>
const TPCANBaudrate Bitrate = PCAN_BAUD_500K;
/// <summary>
/// Sets the bitrate for CAN FD devices.
/// Example - Bitrate Nom: 1Mbit/s Data: 2Mbit/s:
/// "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1"
/// </summary>
const TPCANBitrateFD BitrateFD = const_cast<LPSTR>("f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1");
/// <summary>
/// Thread for reading messages
/// </summary>
std::thread* m_ReadThread;
/// <summary>
/// Shows if thread run
/// </summary>
bool m_ThreadRun;
public:
// ThreadRead constructor
//
ThreadRead();
// ThreadRead destructor
//
~ThreadRead();
private:
/// <summary>
/// Thread function for reading messages
/// </summary>
void ThreadExecute();
/// <summary>
/// Function for reading PCAN-Basic messages
/// </summary>
void ReadMessages();
/// <summary>
/// Function for reading messages on CAN-FD devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus ReadMessageFD();
/// <summary>
/// Function for reading CAN messages on normal CAN devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus ReadMessage();
/// <summary>
/// Processes a received CAN message
/// </summary>
/// <param name="msg">The received PCAN-Basic CAN message</param>
/// <param name="itsTimeStamp">Timestamp of the message as TPCANTimestamp structure</param>
void ProcessMessageCan(TPCANMsg msg, TPCANTimestamp itsTimeStamp);
/// <summary>
/// Processes a received CAN-FD message
/// </summary>
/// <param name="msg">The received PCAN-Basic CAN-FD message</param>
/// <param name="itsTimeStamp">Timestamp of the message as microseconds (ulong)</param>
void ProcessMessageCanFD(TPCANMsgFD msg, TPCANTimestampFD itsTimeStamp);
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
/// <summary>
/// Gets the string representation of the type of a CAN message
/// </summary>
/// <param name="msgType">Type of a CAN message</param>
/// <returns>The type of the CAN message as string</returns>
std::string GetMsgTypeString(TPCANMessageType msgType);
/// <summary>
/// Gets the string representation of the ID of a CAN message
/// </summary>
/// <param name="id">Id to be parsed</param>
/// <param name="msgType">Type flags of the message the Id belong</param>
/// <returns>Hexadecimal representation of the ID of a CAN message</returns>
std::string GetIdString(UINT32 id, TPCANMessageType msgType);
/// <summary>
/// Gets the data length of a CAN message
/// </summary>
/// <param name="dlc">Data length code of a CAN message</param>
/// <returns>Data length as integer represented by the given DLC code</returns>
int GetLengthFromDLC(BYTE dlc);
/// <summary>
/// Gets the string representation of the timestamp of a CAN message, in milliseconds
/// </summary>
/// <param name="time">Timestamp in microseconds</param>
/// <returns>String representing the timestamp in milliseconds</returns>
std::string GetTimeString(TPCANTimestampFD time);
/// <summary>
/// Gets the data of a CAN message as a string
/// </summary>
/// <param name="data">Array of bytes containing the data to parse</param>
/// <param name="msgType">Type flags of the message the data belong</param>
/// <param name="dataLength">The amount of bytes to take into account wihtin the given data</param>
/// <returns>A string with hexadecimal formatted data bytes of a CAN message</returns>
std::string GetDataString(BYTE data[], TPCANMessageType msgType, int dataLength);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ThreadRead", "07_ThreadRead.vcxproj", "{38F5A9E9-F98B-40CC-B026-B63405CFCF09}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Debug|x64.ActiveCfg = Debug|x64
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Debug|x64.Build.0 = Debug|x64
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Debug|x86.ActiveCfg = Debug|Win32
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Debug|x86.Build.0 = Debug|Win32
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Release|x64.ActiveCfg = Release|x64
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Release|x64.Build.0 = Release|x64
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Release|x86.ActiveCfg = Release|Win32
{38F5A9E9-F98B-40CC-B026-B63405CFCF09}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7FE26B73-F629-4A12-884E-DDD774A8012A}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{38f5a9e9-f98b-40cc-b026-b63405cfcf09}</ProjectGuid>
<RootNamespace>ThreadRead</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
<ClCompile Include="07_ThreadRead.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="07_ThreadRead.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="07_ThreadRead.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="07_ThreadRead.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "07_ThreadRead.h"
int main()
{
ThreadRead start;
}

View File

@ -0,0 +1,7 @@
// stdafx.cpp : source file that includes just the standard includes
// PCANBasicExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"

View File

@ -0,0 +1,11 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#include <iostream>
#include <atlstr.h>
#include <conio.h>
#include <thread>
#include <Windows.h>
#include "targetver.h"

View File

@ -0,0 +1,25 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif

View File

@ -0,0 +1,423 @@
#include "08_EventDrivenRead.h"
EventDrivenRead::EventDrivenRead()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
TPCANStatus stsResult;
// Initialization of the selected channel
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Can not initialize. Please check the defines in the code.\n";
ShowStatus(stsResult);
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
return;
}
// Reading messages...
std::cout << "Successfully initialized.\n";
m_ThreadRun = true;
m_ReadThread = new std::thread(&EventDrivenRead::ThreadExecute, this);
std::cout << "Started reading messages...\n";
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
}
EventDrivenRead::~EventDrivenRead()
{
m_ThreadRun = false;
if (m_ReadThread != NULL)
{
m_ReadThread->join();
delete m_ReadThread;
}
CAN_Uninitialize(PCAN_NONEBUS);
}
void EventDrivenRead::ThreadExecute()
{
// Sets the handle of the Receive-Event.
HANDLE iBuffer = CreateEvent(NULL, FALSE, FALSE, L"");
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_RECEIVE_EVENT, &iBuffer, sizeof(iBuffer));
if (stsResult != PCAN_ERROR_OK)
{
ShowStatus(stsResult);
return;
}
while (m_ThreadRun)
{
// Checks for messages when an event is received
if (WaitForSingleObject(iBuffer, 50) == WAIT_OBJECT_0)
ReadMessages();
}
// Removes the Receive-Event again.
iBuffer = 0;
stsResult = CAN_SetValue(PcanHandle, PCAN_RECEIVE_EVENT, &iBuffer, sizeof(iBuffer));
if (stsResult != PCAN_ERROR_OK)
ShowStatus(stsResult);
}
void EventDrivenRead::ReadMessages()
{
TPCANStatus stsResult;
// We read at least one time the queue looking for messages. If a message is found, we look again trying to
// find more. If the queue is empty or an error occurr, we get out from the dowhile statement.
do
{
stsResult = IsFD ? ReadMessageFD() : ReadMessage();
if (stsResult != PCAN_ERROR_OK && stsResult != PCAN_ERROR_QRCVEMPTY)
{
ShowStatus(stsResult);
return;
}
} while (!(stsResult & PCAN_ERROR_QRCVEMPTY));
}
TPCANStatus EventDrivenRead::ReadMessageFD()
{
TPCANMsgFD CANMsg;
TPCANTimestampFD CANTimeStamp;
// We execute the "Read" function of the PCANBasic
TPCANStatus stsResult = CAN_ReadFD(PcanHandle, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
// We process the received message
ProcessMessageCanFD(CANMsg, CANTimeStamp);
return stsResult;
}
TPCANStatus EventDrivenRead::ReadMessage()
{
TPCANMsg CANMsg;
TPCANTimestamp CANTimeStamp;
// We execute the "Read" function of the PCANBasic
TPCANStatus stsResult = CAN_Read(PcanHandle, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
// We process the received message
ProcessMessageCan(CANMsg, CANTimeStamp);
return stsResult;
}
void EventDrivenRead::ProcessMessageCan(TPCANMsg msg, TPCANTimestamp itsTimeStamp)
{
UINT64 microsTimestamp = (itsTimeStamp.micros + 1000 * itsTimeStamp.millis + 0x100000000 * 1000 * itsTimeStamp.millis_overflow);
std::cout << "Type: " << GetMsgTypeString(msg.MSGTYPE) << "\n";
std::cout << "ID: " << GetIdString(msg.ID, msg.MSGTYPE) << "\n";
char result[MAX_PATH] = { 0 };
sprintf_s(result, sizeof(result), "%i", msg.LEN);
std::cout << "Length: " << result << "\n";
std::cout << "Time: " << GetTimeString(microsTimestamp) << "\n";
std::cout << "Data: " << GetDataString(msg.DATA, msg.MSGTYPE, msg.LEN) << "\n";
std::cout << "----------------------------------------------------------\n";
}
void EventDrivenRead::ProcessMessageCanFD(TPCANMsgFD msg, TPCANTimestampFD itsTimeStamp)
{
std::cout << "Type: " << GetMsgTypeString(msg.MSGTYPE) << "\n";
std::cout << "ID: " << GetIdString(msg.ID, msg.MSGTYPE) << "\n";
std::cout << "Length: " << GetLengthFromDLC(msg.DLC) << "\n";
std::cout << "Time: " << GetTimeString(itsTimeStamp) << "\n";
std::cout << "Data: " << GetDataString(msg.DATA, msg.MSGTYPE, GetLengthFromDLC(msg.DLC)) << "\n";
std::cout << "----------------------------------------------------------\n";
}
void EventDrivenRead::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic EventDrivenRead Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* PcanHandle: Numeric value that represents the handle of the PCAN-Basic channel to use. |\n";
std::cout << " See 'PCAN-Handle Definitions' within the documentation |\n";
std::cout << "* IsFD: Boolean value that indicates the communication mode, CAN (false) or CAN-FD (true)|\n";
std::cout << "* Bitrate: Numeric value that represents the BTR0/BR1 bitrate value to be used for CAN |\n";
std::cout << " communication |\n";
std::cout << "* BitrateFD: String value that represents the nominal/data bitrate value to be used for |\n";
std::cout << " CAN-FD communication |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void EventDrivenRead::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
char buffer[MAX_PATH];
FormatChannelName(PcanHandle, buffer, IsFD);
std::cout << "* PCANHandle: " << buffer << "\n";
if (IsFD)
std::cout << "* IsFD: True\n";
else
std::cout << "* IsFD: False\n";
ConvertBitrateToString(Bitrate, buffer);
std::cout << "* Bitrate: " << buffer << "\n";
std::cout << "* BitrateFD: " << BitrateFD << "\n";
std::cout << "\n";
}
void EventDrivenRead::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void EventDrivenRead::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void EventDrivenRead::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void EventDrivenRead::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void EventDrivenRead::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}
std::string EventDrivenRead::GetMsgTypeString(TPCANMessageType msgType)
{
if ((msgType & PCAN_MESSAGE_STATUS) == PCAN_MESSAGE_STATUS)
return "STATUS";
if ((msgType & PCAN_MESSAGE_ERRFRAME) == PCAN_MESSAGE_ERRFRAME)
return "ERROR";
std::string strTemp;
if ((msgType & PCAN_MESSAGE_EXTENDED) == PCAN_MESSAGE_EXTENDED)
strTemp = "EXT";
else
strTemp = "STD";
if ((msgType & PCAN_MESSAGE_RTR) == PCAN_MESSAGE_RTR)
strTemp = (strTemp + "/RTR");
else
if (msgType > PCAN_MESSAGE_EXTENDED)
{
strTemp = (strTemp + " [ ");
if (msgType & PCAN_MESSAGE_FD)
strTemp = (strTemp + " FD");
if (msgType & PCAN_MESSAGE_BRS)
strTemp = (strTemp + " BRS");
if (msgType & PCAN_MESSAGE_ESI)
strTemp = (strTemp + " ESI");
strTemp = (strTemp + " ]");
}
return strTemp;
}
std::string EventDrivenRead::GetIdString(UINT32 id, TPCANMessageType msgType)
{
char result[MAX_PATH] = { 0 };
if ((msgType & PCAN_MESSAGE_EXTENDED) == PCAN_MESSAGE_EXTENDED)
{
sprintf_s(result, sizeof(result), "%08Xh", id);
return result;
}
sprintf_s(result, sizeof(result), "%03Xh", id);
return result;
}
int EventDrivenRead::GetLengthFromDLC(BYTE dlc)
{
switch (dlc)
{
case 9: return 12;
case 10: return 16;
case 11: return 20;
case 12: return 24;
case 13: return 32;
case 14: return 48;
case 15: return 64;
default: return dlc;
}
}
std::string EventDrivenRead::GetTimeString(TPCANTimestampFD time)
{
char result[MAX_PATH] = { 0 };
double fTime = (time / 1000.0);
sprintf_s(result, sizeof(result), "%.1f", fTime);
return result;
}
std::string EventDrivenRead::GetDataString(BYTE data[], TPCANMessageType msgType, int dataLength)
{
if ((msgType & PCAN_MESSAGE_RTR) == PCAN_MESSAGE_RTR)
return "Remote Request";
else
{
char strTemp[MAX_PATH] = { 0 };
std::string result = "";
for (int i = 0; i < dataLength; i++)
{
sprintf_s(strTemp, sizeof(strTemp), "%02X ", data[i]);
result.append(strTemp);
}
return result;
}
}

View File

@ -0,0 +1,162 @@
#include "stdafx.h"
#include "PCANBasic.h"
class EventDrivenRead
{
private:
/// <summary>
/// Sets the PCANHandle (Hardware Channel)
/// </summary>
const TPCANHandle PcanHandle = PCAN_USBBUS1;
/// <summary>
/// Sets the desired connection mode (CAN = false / CAN-FD = true)
/// </summary>
const bool IsFD = false;
/// <summary>
/// Sets the bitrate for normal CAN devices
/// </summary>
const TPCANBaudrate Bitrate = PCAN_BAUD_500K;
/// <summary>
/// Sets the bitrate for CAN FD devices.
/// Example - Bitrate Nom: 1Mbit/s Data: 2Mbit/s:
/// "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1"
/// </summary>
const TPCANBitrateFD BitrateFD = const_cast<LPSTR>("f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1");
/// <summary>
/// Thread for reading messages
/// </summary>
std::thread* m_ReadThread;
/// <summary>
/// Shows if thread run
/// </summary>
bool m_ThreadRun;
public:
// EventDrivenRead constructor
//
EventDrivenRead();
// EventDrivenRead destructor
//
~EventDrivenRead();
private:
/// <summary>
/// Thread function for reading messages
/// </summary>
void ThreadExecute();
/// <summary>
/// Function for reading PCAN-Basic messages
/// </summary>
void ReadMessages();
/// <summary>
/// Function for reading messages on CAN-FD devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus ReadMessageFD();
/// <summary>
/// Function for reading CAN messages on normal CAN devices
/// </summary>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus ReadMessage();
/// <summary>
/// Processes a received CAN message
/// </summary>
/// <param name="msg">The received PCAN-Basic CAN message</param>
/// <param name="itsTimeStamp">Timestamp of the message as TPCANTimestamp structure</param>
void ProcessMessageCan(TPCANMsg msg, TPCANTimestamp itsTimeStamp);
/// <summary>
/// Processes a received CAN-FD message
/// </summary>
/// <param name="msg">The received PCAN-Basic CAN-FD message</param>
/// <param name="itsTimeStamp">Timestamp of the message as microseconds (ulong)</param>
void ProcessMessageCanFD(TPCANMsgFD msg, TPCANTimestampFD itsTimeStamp);
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
/// <summary>
/// Gets the string representation of the type of a CAN message
/// </summary>
/// <param name="msgType">Type of a CAN message</param>
/// <returns>The type of the CAN message as string</returns>
std::string GetMsgTypeString(TPCANMessageType msgType);
/// <summary>
/// Gets the string representation of the ID of a CAN message
/// </summary>
/// <param name="id">Id to be parsed</param>
/// <param name="msgType">Type flags of the message the Id belong</param>
/// <returns>Hexadecimal representation of the ID of a CAN message</returns>
std::string GetIdString(UINT32 id, TPCANMessageType msgType);
/// <summary>
/// Gets the data length of a CAN message
/// </summary>
/// <param name="dlc">Data length code of a CAN message</param>
/// <returns>Data length as integer represented by the given DLC code</returns>
int GetLengthFromDLC(BYTE dlc);
/// <summary>
/// Gets the string representation of the timestamp of a CAN message, in milliseconds
/// </summary>
/// <param name="time">Timestamp in microseconds</param>
/// <returns>String representing the timestamp in milliseconds</returns>
std::string GetTimeString(TPCANTimestampFD time);
/// <summary>
/// Gets the data of a CAN message as a string
/// </summary>
/// <param name="data">Array of bytes containing the data to parse</param>
/// <param name="msgType">Type flags of the message the data belong</param>
/// <param name="dataLength">The amount of bytes to take into account wihtin the given data</param>
/// <returns>A string with hexadecimal formatted data bytes of a CAN message</returns>
std::string GetDataString(BYTE data[], TPCANMessageType msgType, int dataLength);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EventDrivenRead", "08_EventDrivenRead.vcxproj", "{67AEB664-38BC-45D0-A90F-3C98FEDCA668}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Debug|x64.ActiveCfg = Debug|x64
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Debug|x64.Build.0 = Debug|x64
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Debug|x86.ActiveCfg = Debug|Win32
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Debug|x86.Build.0 = Debug|Win32
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Release|x64.ActiveCfg = Release|x64
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Release|x64.Build.0 = Release|x64
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Release|x86.ActiveCfg = Release|Win32
{67AEB664-38BC-45D0-A90F-3C98FEDCA668}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {326598E5-0D64-45B9-8773-1EDCE215504D}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{67aeb664-38bc-45d0-a90f-3c98fedca668}</ProjectGuid>
<RootNamespace>EventDrivenRead</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="08_EventDrivenRead.cpp" />
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="08_EventDrivenRead.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="08_EventDrivenRead.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="08_EventDrivenRead.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "08_EventDrivenRead.h"
int main()
{
EventDrivenRead start;
}

View File

@ -0,0 +1,5 @@
// stdafx.cpp : source file that includes just the standard includes
// PCANBasicExample.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"

View File

@ -0,0 +1,11 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#include <iostream>
#include <atlstr.h>
#include <conio.h>
#include <thread>
#include <Windows.h>
#include "targetver.h"

View File

@ -0,0 +1,25 @@
#pragma once
// The following macros define the minimum required platform. The minimum required platform
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
// your application. The macros work by enabling all features available on platform versions up to and
// including the version specified.
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Specifies that the minimum required platform is Windows Vista.
#define WINVER 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Specifies that the minimum required platform is Windows 98.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Specifies that the minimum required platform is Internet Explorer 7.0.
#define _WIN32_IE 0x0700 // Change this to the appropriate value to target other versions of IE.
#endif

View File

@ -0,0 +1,377 @@
#include "09_TraceFiles.h"
TraceFiles::TraceFiles()
{
ShowConfigurationHelp(); // Shows information about this sample
ShowCurrentConfiguration(); // Shows the current parameters configuration
TPCANStatus stsResult;
// Initialization of the selected channel
if (IsFD)
stsResult = CAN_InitializeFD(PcanHandle, BitrateFD);
else
stsResult = CAN_Initialize(PcanHandle, Bitrate);
if (stsResult != PCAN_ERROR_OK)
{
std::cout << "Can not initialize. Please check the defines in the code.\n";
ShowStatus(stsResult);
std::cout << "\n";
std::cout << "Closing...\n";
system("PAUSE");
return;
}
// Trace messages.
std::cout << "Successfully initialized.\n";
std::cout << "Starting trace: ";
system("PAUSE");
if (ConfigureTrace())
{
if (StartTrace())
{
m_ThreadRun = true;
m_ReadThread = new std::thread(&TraceFiles::ThreadExecute, this);
std::cout << "Messages are being traced.\n";
std::cout << "Stop trace and quit: ";
system("PAUSE");
StopTrace();
return;
}
}
std::cout << "\n";
std::cout << "For close: ";
system("PAUSE");
}
TraceFiles::~TraceFiles()
{
m_ThreadRun = false;
m_ReadThread->join();
CAN_Uninitialize(PCAN_NONEBUS);
}
void TraceFiles::ThreadExecute()
{
while (m_ThreadRun)
{
Sleep(1); //Use Sleep to reduce the CPU load
ReadMessages();
}
}
void TraceFiles::ReadMessages()
{
// We read at least one time the queue looking for messages. If a message is found, we look again trying to
// find more. If the queue is empty or an error occurr, we get out from the dowhile statement.
TPCANStatus stsResult;
TPCANMsgFD CANMsgFD;
TPCANMsg CANMsg;
UINT64 TimestampFD;
TPCANTimestamp Timestamp;
do
{
stsResult = IsFD ? CAN_ReadFD(PcanHandle, &CANMsgFD, &TimestampFD) : CAN_Read(PcanHandle, &CANMsg, &Timestamp);
if (stsResult != PCAN_ERROR_OK && stsResult != PCAN_ERROR_QRCVEMPTY)
{
ShowStatus(stsResult);
return;
}
} while ((!(stsResult & PCAN_ERROR_QRCVEMPTY)));
}
void TraceFiles::StopTrace()
{
UINT32 iStatus = PCAN_PARAMETER_OFF;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_TRACE_STATUS, &iStatus, sizeof(UINT32)); // We stop the tracing by setting the parameter.
if (stsResult != PCAN_ERROR_OK)
ShowStatus(stsResult);
}
bool TraceFiles::ConfigureTrace()
{
UINT32 iSize = TraceFileSize;
// Sets path to store files
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_TRACE_LOCATION, (void*)TracePath, sizeof(TracePath));
if (stsResult == PCAN_ERROR_OK)
{
// Sets the maximum size of a tracefile
stsResult = CAN_SetValue(PcanHandle, PCAN_TRACE_SIZE, &iSize, sizeof(UINT32));
if (stsResult == PCAN_ERROR_OK)
{
UINT32 config;
if (TraceFileSingle)
config = TRACE_FILE_SINGLE; // Creats one file
else
config = TRACE_FILE_SEGMENTED; // Creats more files
// Activate overwriting existing tracefile
if (TraceFileOverwrite)
config = config | TRACE_FILE_OVERWRITE;
// Adds date to tracefilename
if (TraceFileDate)
config = config | TRACE_FILE_DATE;
// Adds time to tracefilename
if (TraceFileTime)
config = config | TRACE_FILE_TIME;
// Sets the config
stsResult = CAN_SetValue(PcanHandle, PCAN_TRACE_CONFIGURE, &config, sizeof(int));
if (stsResult == PCAN_ERROR_OK)
return true;
}
}
ShowStatus(stsResult);
return false;
}
bool TraceFiles::StartTrace()
{
UINT32 iStatus = PCAN_PARAMETER_ON;
TPCANStatus stsResult = CAN_SetValue(PcanHandle, PCAN_TRACE_STATUS, &iStatus, sizeof(UINT32)); // We activate the tracing by setting the parameter.
if (stsResult != PCAN_ERROR_OK)
{
ShowStatus(stsResult);
return false;
}
return true;
}
void TraceFiles::ShowConfigurationHelp()
{
std::cout << "=========================================================================================\n";
std::cout << "| PCAN-Basic TraceFiles Example |\n";
std::cout << "=========================================================================================\n";
std::cout << "Following parameters are to be adjusted before launching, according to the hardware used |\n";
std::cout << " |\n";
std::cout << "* PcanHandle: Numeric value that represents the handle of the PCAN-Basic channel to use. |\n";
std::cout << " See 'PCAN-Handle Definitions' within the documentation |\n";
std::cout << "* IsFD: Boolean value that indicates the communication mode, CAN (false) or CAN-FD (true)|\n";
std::cout << "* Bitrate: Numeric value that represents the BTR0/BR1 bitrate value to be used for CAN |\n";
std::cout << " communication |\n";
std::cout << "* BitrateFD: String value that represents the nominal/data bitrate value to be used for |\n";
std::cout << " CAN-FD communication |\n";
std::cout << "* TraceFileSingle: Boolean value that indicates if tracing ends after one file (true) or |\n";
std::cout << " continues |\n";
std::cout << "* TraceFileDate: Boolean value that indicates if the date will be added to filename |\n";
std::cout << "* TraceFileTime: Boolean value that indicates if the time will be added to filename |\n";
std::cout << "* TraceFileOverwrite: Boolean value that indicates if existing tracefiles should be |\n";
std::cout << " overwritten |\n";
std::cout << "* TraceFileSize: Numeric value that represents the size of a tracefile in meagabytes |\n";
std::cout << "* TracePath: string value that represents a valid path to an existing directory |\n";
std::cout << "* TimerInterval: The time, in milliseconds, to wait before trying to write a message |\n";
std::cout << "=========================================================================================\n";
std::cout << "\n";
}
void TraceFiles::ShowCurrentConfiguration()
{
std::cout << "Parameter values used\n";
std::cout << "----------------------\n";
char buffer[MAX_PATH];
FormatChannelName(PcanHandle, buffer, IsFD);
std::cout << "* PCANHandle: " << buffer << "\n";
if (IsFD)
std::cout << "* IsFD: True\n";
else
std::cout << "* IsFD: False\n";
ConvertBitrateToString(Bitrate, buffer);
std::cout << "* Bitrate: " << buffer << "\n";
std::cout << "* BitrateFD: " << BitrateFD << "\n";
if (TraceFileSingle)
std::cout << "* TraceFileSingle: True\n";
else
std::cout << "* TraceFileSingle: False\n";
if (TraceFileDate)
std::cout << "* TraceFileDate: True\n";
else
std::cout << "* TraceFileDate: False\n";
if (TraceFileTime)
std::cout << "* TraceFileTime: True\n";
else
std::cout << "* TraceFileTime: False\n";
if (TraceFileOverwrite)
std::cout << "* TraceFileOverwrite: True\n";
else
std::cout << "* TraceFileOverwrite: False\n";
std::cout << "* TraceFileSize: " << TraceFileSize << " MB\n";
if (TracePath == "")
std::cout << "* TracePath: (calling application path)" << "\n";
else
std::cout << "* TracePath: " << TracePath << "\n";
std::cout << "* TimerInterval: " << TimerInterval << "\n";
std::cout << "\n";
}
void TraceFiles::ShowStatus(TPCANStatus status)
{
std::cout << "=========================================================================================\n";
char buffer[MAX_PATH];
GetFormattedError(status, buffer);
std::cout << buffer << "\n";
std::cout << "=========================================================================================\n";
}
void TraceFiles::FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD)
{
TPCANDevice devDevice;
BYTE byChannel;
// Gets the owner device and channel for a PCAN-Basic handle
if (handle < 0x100)
{
devDevice = (TPCANDevice)(handle >> 4);
byChannel = (BYTE)(handle & 0xF);
}
else
{
devDevice = (TPCANDevice)(handle >> 8);
byChannel = (BYTE)(handle & 0xFF);
}
// Constructs the PCAN-Basic Channel name and return it
char handleBuffer[MAX_PATH];
GetTPCANHandleName(handle, handleBuffer);
if (isFD)
sprintf_s(buffer, MAX_PATH, "%s:FD %d (%Xh)", handleBuffer, byChannel, handle);
else
sprintf_s(buffer, MAX_PATH, "%s %d (%Xh)", handleBuffer, byChannel, handle);
}
void TraceFiles::GetTPCANHandleName(TPCANHandle handle, LPSTR buffer)
{
strcpy_s(buffer, MAX_PATH, "PCAN_NONE");
switch (handle)
{
case PCAN_PCIBUS1:
case PCAN_PCIBUS2:
case PCAN_PCIBUS3:
case PCAN_PCIBUS4:
case PCAN_PCIBUS5:
case PCAN_PCIBUS6:
case PCAN_PCIBUS7:
case PCAN_PCIBUS8:
case PCAN_PCIBUS9:
case PCAN_PCIBUS10:
case PCAN_PCIBUS11:
case PCAN_PCIBUS12:
case PCAN_PCIBUS13:
case PCAN_PCIBUS14:
case PCAN_PCIBUS15:
case PCAN_PCIBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_PCI");
break;
case PCAN_USBBUS1:
case PCAN_USBBUS2:
case PCAN_USBBUS3:
case PCAN_USBBUS4:
case PCAN_USBBUS5:
case PCAN_USBBUS6:
case PCAN_USBBUS7:
case PCAN_USBBUS8:
case PCAN_USBBUS9:
case PCAN_USBBUS10:
case PCAN_USBBUS11:
case PCAN_USBBUS12:
case PCAN_USBBUS13:
case PCAN_USBBUS14:
case PCAN_USBBUS15:
case PCAN_USBBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_USB");
break;
case PCAN_LANBUS1:
case PCAN_LANBUS2:
case PCAN_LANBUS3:
case PCAN_LANBUS4:
case PCAN_LANBUS5:
case PCAN_LANBUS6:
case PCAN_LANBUS7:
case PCAN_LANBUS8:
case PCAN_LANBUS9:
case PCAN_LANBUS10:
case PCAN_LANBUS11:
case PCAN_LANBUS12:
case PCAN_LANBUS13:
case PCAN_LANBUS14:
case PCAN_LANBUS15:
case PCAN_LANBUS16:
strcpy_s(buffer, MAX_PATH, "PCAN_LAN");
break;
default:
strcpy_s(buffer, MAX_PATH, "UNKNOWN");
break;
}
}
void TraceFiles::GetFormattedError(TPCANStatus error, LPSTR buffer)
{
// Gets the text using the GetErrorText API function. If the function success, the translated error is returned.
// If it fails, a text describing the current error is returned.
if (CAN_GetErrorText(error, 0x09, buffer) != PCAN_ERROR_OK)
sprintf_s(buffer, MAX_PATH, "An error occurred. Error-code's text (%Xh) couldn't be retrieved", error);
}
void TraceFiles::ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer)
{
switch (bitrate)
{
case PCAN_BAUD_1M:
strcpy_s(buffer, MAX_PATH, "1 MBit/sec");
break;
case PCAN_BAUD_800K:
strcpy_s(buffer, MAX_PATH, "800 kBit/sec");
break;
case PCAN_BAUD_500K:
strcpy_s(buffer, MAX_PATH, "500 kBit/sec");
break;
case PCAN_BAUD_250K:
strcpy_s(buffer, MAX_PATH, "250 kBit/sec");
break;
case PCAN_BAUD_125K:
strcpy_s(buffer, MAX_PATH, "125 kBit/sec");
break;
case PCAN_BAUD_100K:
strcpy_s(buffer, MAX_PATH, "100 kBit/sec");
break;
case PCAN_BAUD_95K:
strcpy_s(buffer, MAX_PATH, "95,238 kBit/sec");
break;
case PCAN_BAUD_83K:
strcpy_s(buffer, MAX_PATH, "83,333 kBit/sec");
break;
case PCAN_BAUD_50K:
strcpy_s(buffer, MAX_PATH, "50 kBit/sec");
break;
case PCAN_BAUD_47K:
strcpy_s(buffer, MAX_PATH, "47,619 kBit/sec");
break;
case PCAN_BAUD_33K:
strcpy_s(buffer, MAX_PATH, "33,333 kBit/sec");
break;
case PCAN_BAUD_20K:
strcpy_s(buffer, MAX_PATH, "20 kBit/sec");
break;
case PCAN_BAUD_10K:
strcpy_s(buffer, MAX_PATH, "10 kBit/sec");
break;
case PCAN_BAUD_5K:
strcpy_s(buffer, MAX_PATH, "5 kBit/sec");
break;
default:
strcpy_s(buffer, MAX_PATH, "Unknown Bitrate");
break;
}
}

View File

@ -0,0 +1,153 @@
#include "stdafx.h"
#include "PCANBasic.h"
class TraceFiles
{
private:
/// <summary>
/// Sets the PCANHandle (Hardware Channel)
/// </summary>
const TPCANHandle PcanHandle = PCAN_USBBUS1;
/// <summary>
/// Sets the desired connection mode (CAN = false / CAN-FD = true)
/// </summary>
const bool IsFD = false;
/// <summary>
/// Sets the bitrate for normal CAN devices
/// </summary>
const TPCANBaudrate Bitrate = PCAN_BAUD_500K;
/// <summary>
/// Sets the bitrate for CAN FD devices.
/// Example - Bitrate Nom: 1Mbit/s Data: 2Mbit/s:
/// "f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1"
/// </summary>
const TPCANBitrateFD BitrateFD = const_cast<LPSTR>("f_clock_mhz=20, nom_brp=5, nom_tseg1=2, nom_tseg2=1, nom_sjw=1, data_brp=2, data_tseg1=3, data_tseg2=1, data_sjw=1");
/// <summary>
/// Sets if trace continue after reaching maximum size for the first file
/// </summary>
const bool TraceFileSingle = true;
/// <summary>
/// Set if date will be add to filename
/// </summary>
const bool TraceFileDate = true;
/// <summary>
/// Set if time will be add to filename
/// </summary>
const bool TraceFileTime = true;
/// <summary>
/// Set if existing tracefile overwrites when a new trace session is started
/// </summary>
const bool TraceFileOverwrite = false;
/// <summary>
/// Sets the size (megabyte) of an tracefile
/// Example - 100 = 100 megabyte
/// Range between 1 and 100
/// </summary>
const UINT32 TraceFileSize = 2;
/// <summary>
/// Sets a fully-qualified and valid path to an existing directory. In order to use the default path
/// (calling process path) an empty string must be set.
/// </summary>
LPCSTR TracePath = "";
/// <summary>
/// Timerinterval (ms) for reading
/// </summary>
const int TimerInterval = 250;
/// <summary>
/// Thread for reading messages
/// </summary>
std::thread* m_ReadThread;
/// <summary>
/// Shows if thread run
/// </summary>
bool m_ThreadRun;
public:
// TraceFiles constructor
//
TraceFiles();
// TraceFiles destructor
//
~TraceFiles();
private:
/// <summary>
/// Thread function for reading messages
/// </summary>
void ThreadExecute();
/// <summary>
/// Reads PCAN-Basic messages
/// </summary>
void ReadMessages();
/// <summary>
/// Deactivates the tracing process
/// </summary>
void StopTrace();
/// <summary>
/// Configures the way how trace files are formatted
/// </summary>
/// <returns>Returns true if no error occurr</returns>
bool ConfigureTrace();
/// <summary>
/// Activates the tracing process
/// </summary>
/// <returns>Returns true if no error occurr</returns>
bool StartTrace();
/// <summary>
/// Shows/prints the configurable parameters for this sample and information about them
/// </summary>
void ShowConfigurationHelp();
/// <summary>
/// Shows/prints the configured paramters
/// </summary>
void ShowCurrentConfiguration();
/// <summary>
/// Shows formatted status
/// </summary>
/// <param name="status">Will be formatted</param>
void ShowStatus(TPCANStatus status);
/// <summary>
/// Gets the formatted text for a PCAN-Basic channel handle
/// </summary>
/// <param name="handle">PCAN-Basic Handle to format</param>
/// <parma name="buffer">A string buffer for the channel name</param>
/// <param name="isFD">If the channel is FD capable</param>
void FormatChannelName(TPCANHandle handle, LPSTR buffer, bool isFD);
/// <summary>
/// Gets name of a TPCANHandle
/// </summary>
/// <param name="handle">TPCANHandle to get name</param>
/// <param name="buffer">A string buffer for the name of the TPCANHandle (size MAX_PATH)</param>
void GetTPCANHandleName(TPCANHandle handle, LPSTR buffer);
/// <summary>
/// Help Function used to get an error as text
/// </summary>
/// <param name="error">Error code to be translated</param>
/// <param name="buffer">A string buffer for the translated error (size MAX_PATH)</param>
void GetFormattedError(TPCANStatus error, LPSTR buffer);
/// <summary>
/// Convert bitrate c_short value to readable string
/// </summary>
/// <param name="bitrate">Bitrate to be converted</param>
/// <param name="buffer">A string buffer for the converted bitrate (size MAX_PATH)</param>
void ConvertBitrateToString(TPCANBaudrate bitrate, LPSTR buffer);
/// <summary>
/// Convert bool value to readable string value
/// </summary>
/// <param name="value">Value to be converted</param>
/// <returns>A text with the converted Value</returns>
bool ConvertBoolToString(bool value);
};

View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TraceFiles", "09_TraceFiles.vcxproj", "{C05963E2-DE52-489B-86DB-869657AF87BA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C05963E2-DE52-489B-86DB-869657AF87BA}.Debug|x64.ActiveCfg = Debug|x64
{C05963E2-DE52-489B-86DB-869657AF87BA}.Debug|x64.Build.0 = Debug|x64
{C05963E2-DE52-489B-86DB-869657AF87BA}.Debug|x86.ActiveCfg = Debug|Win32
{C05963E2-DE52-489B-86DB-869657AF87BA}.Debug|x86.Build.0 = Debug|Win32
{C05963E2-DE52-489B-86DB-869657AF87BA}.Release|x64.ActiveCfg = Release|x64
{C05963E2-DE52-489B-86DB-869657AF87BA}.Release|x64.Build.0 = Release|x64
{C05963E2-DE52-489B-86DB-869657AF87BA}.Release|x86.ActiveCfg = Release|Win32
{C05963E2-DE52-489B-86DB-869657AF87BA}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {03CF902D-4CEF-483B-A2AC-31170604E0A5}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{c05963e2-de52-489b-86db-869657af87ba}</ProjectGuid>
<RootNamespace>TraceFiles</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="RunExample.cpp" />
<ClCompile Include="stdafx.cpp" />
<ClCompile Include="09_TraceFiles.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="09_TraceFiles.h" />
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="09_TraceFiles.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RunExample.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="PCANBasic.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="09_TraceFiles.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Library Include="lib\x64\PCANBasic.lib" />
<Library Include="lib\x86\PCANBasic.lib" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,585 @@
// PCANBasic.h
//
// ~~~~~~~~~~~~
//
// PCAN-Basic API
//
// ~~~~~~~~~~~~
//
// ------------------------------------------------------------------
// Author : Keneth Wagner
// Last change: 2022-07-06
//
// Language: ANSI-C
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2022 PEAK-System Technik GmbH, Darmstadt
// more Info at http://www.peak-system.com
//
#ifndef __PCANBASICH__
#define __PCANBASICH__
////////////////////////////////////////////////////////////
// Value definitions
////////////////////////////////////////////////////////////
// Currently defined and supported PCAN channels
//
#define PCAN_NONEBUS 0x00U // Undefined/default value for a PCAN bus
#define PCAN_ISABUS1 0x21U // PCAN-ISA interface, channel 1
#define PCAN_ISABUS2 0x22U // PCAN-ISA interface, channel 2
#define PCAN_ISABUS3 0x23U // PCAN-ISA interface, channel 3
#define PCAN_ISABUS4 0x24U // PCAN-ISA interface, channel 4
#define PCAN_ISABUS5 0x25U // PCAN-ISA interface, channel 5
#define PCAN_ISABUS6 0x26U // PCAN-ISA interface, channel 6
#define PCAN_ISABUS7 0x27U // PCAN-ISA interface, channel 7
#define PCAN_ISABUS8 0x28U // PCAN-ISA interface, channel 8
#define PCAN_DNGBUS1 0x31U // PCAN-Dongle/LPT interface, channel 1
#define PCAN_PCIBUS1 0x41U // PCAN-PCI interface, channel 1
#define PCAN_PCIBUS2 0x42U // PCAN-PCI interface, channel 2
#define PCAN_PCIBUS3 0x43U // PCAN-PCI interface, channel 3
#define PCAN_PCIBUS4 0x44U // PCAN-PCI interface, channel 4
#define PCAN_PCIBUS5 0x45U // PCAN-PCI interface, channel 5
#define PCAN_PCIBUS6 0x46U // PCAN-PCI interface, channel 6
#define PCAN_PCIBUS7 0x47U // PCAN-PCI interface, channel 7
#define PCAN_PCIBUS8 0x48U // PCAN-PCI interface, channel 8
#define PCAN_PCIBUS9 0x409U // PCAN-PCI interface, channel 9
#define PCAN_PCIBUS10 0x40AU // PCAN-PCI interface, channel 10
#define PCAN_PCIBUS11 0x40BU // PCAN-PCI interface, channel 11
#define PCAN_PCIBUS12 0x40CU // PCAN-PCI interface, channel 12
#define PCAN_PCIBUS13 0x40DU // PCAN-PCI interface, channel 13
#define PCAN_PCIBUS14 0x40EU // PCAN-PCI interface, channel 14
#define PCAN_PCIBUS15 0x40FU // PCAN-PCI interface, channel 15
#define PCAN_PCIBUS16 0x410U // PCAN-PCI interface, channel 16
#define PCAN_USBBUS1 0x51U // PCAN-USB interface, channel 1
#define PCAN_USBBUS2 0x52U // PCAN-USB interface, channel 2
#define PCAN_USBBUS3 0x53U // PCAN-USB interface, channel 3
#define PCAN_USBBUS4 0x54U // PCAN-USB interface, channel 4
#define PCAN_USBBUS5 0x55U // PCAN-USB interface, channel 5
#define PCAN_USBBUS6 0x56U // PCAN-USB interface, channel 6
#define PCAN_USBBUS7 0x57U // PCAN-USB interface, channel 7
#define PCAN_USBBUS8 0x58U // PCAN-USB interface, channel 8
#define PCAN_USBBUS9 0x509U // PCAN-USB interface, channel 9
#define PCAN_USBBUS10 0x50AU // PCAN-USB interface, channel 10
#define PCAN_USBBUS11 0x50BU // PCAN-USB interface, channel 11
#define PCAN_USBBUS12 0x50CU // PCAN-USB interface, channel 12
#define PCAN_USBBUS13 0x50DU // PCAN-USB interface, channel 13
#define PCAN_USBBUS14 0x50EU // PCAN-USB interface, channel 14
#define PCAN_USBBUS15 0x50FU // PCAN-USB interface, channel 15
#define PCAN_USBBUS16 0x510U // PCAN-USB interface, channel 16
#define PCAN_PCCBUS1 0x61U // PCAN-PC Card interface, channel 1
#define PCAN_PCCBUS2 0x62U // PCAN-PC Card interface, channel 2
#define PCAN_LANBUS1 0x801U // PCAN-LAN interface, channel 1
#define PCAN_LANBUS2 0x802U // PCAN-LAN interface, channel 2
#define PCAN_LANBUS3 0x803U // PCAN-LAN interface, channel 3
#define PCAN_LANBUS4 0x804U // PCAN-LAN interface, channel 4
#define PCAN_LANBUS5 0x805U // PCAN-LAN interface, channel 5
#define PCAN_LANBUS6 0x806U // PCAN-LAN interface, channel 6
#define PCAN_LANBUS7 0x807U // PCAN-LAN interface, channel 7
#define PCAN_LANBUS8 0x808U // PCAN-LAN interface, channel 8
#define PCAN_LANBUS9 0x809U // PCAN-LAN interface, channel 9
#define PCAN_LANBUS10 0x80AU // PCAN-LAN interface, channel 10
#define PCAN_LANBUS11 0x80BU // PCAN-LAN interface, channel 11
#define PCAN_LANBUS12 0x80CU // PCAN-LAN interface, channel 12
#define PCAN_LANBUS13 0x80DU // PCAN-LAN interface, channel 13
#define PCAN_LANBUS14 0x80EU // PCAN-LAN interface, channel 14
#define PCAN_LANBUS15 0x80FU // PCAN-LAN interface, channel 15
#define PCAN_LANBUS16 0x810U // PCAN-LAN interface, channel 16
// Represent the PCAN error and status codes
//
#define PCAN_ERROR_OK 0x00000U // No error
#define PCAN_ERROR_XMTFULL 0x00001U // Transmit buffer in CAN controller is full
#define PCAN_ERROR_OVERRUN 0x00002U // CAN controller was read too late
#define PCAN_ERROR_BUSLIGHT 0x00004U // Bus error: an error counter reached the 'light' limit
#define PCAN_ERROR_BUSHEAVY 0x00008U // Bus error: an error counter reached the 'heavy' limit
#define PCAN_ERROR_BUSWARNING PCAN_ERROR_BUSHEAVY // Bus error: an error counter reached the 'warning' limit
#define PCAN_ERROR_BUSPASSIVE 0x40000U // Bus error: the CAN controller is error passive
#define PCAN_ERROR_BUSOFF 0x00010U // Bus error: the CAN controller is in bus-off state
#define PCAN_ERROR_ANYBUSERR (PCAN_ERROR_BUSWARNING | PCAN_ERROR_BUSLIGHT | PCAN_ERROR_BUSHEAVY | PCAN_ERROR_BUSOFF | PCAN_ERROR_BUSPASSIVE) // Mask for all bus errors
#define PCAN_ERROR_QRCVEMPTY 0x00020U // Receive queue is empty
#define PCAN_ERROR_QOVERRUN 0x00040U // Receive queue was read too late
#define PCAN_ERROR_QXMTFULL 0x00080U // Transmit queue is full
#define PCAN_ERROR_REGTEST 0x00100U // Test of the CAN controller hardware registers failed (no hardware found)
#define PCAN_ERROR_NODRIVER 0x00200U // Driver not loaded
#define PCAN_ERROR_HWINUSE 0x00400U // Hardware already in use by a Net
#define PCAN_ERROR_NETINUSE 0x00800U // A Client is already connected to the Net
#define PCAN_ERROR_ILLHW 0x01400U // Hardware handle is invalid
#define PCAN_ERROR_ILLNET 0x01800U // Net handle is invalid
#define PCAN_ERROR_ILLCLIENT 0x01C00U // Client handle is invalid
#define PCAN_ERROR_ILLHANDLE (PCAN_ERROR_ILLHW | PCAN_ERROR_ILLNET | PCAN_ERROR_ILLCLIENT) // Mask for all handle errors
#define PCAN_ERROR_RESOURCE 0x02000U // Resource (FIFO, Client, timeout) cannot be created
#define PCAN_ERROR_ILLPARAMTYPE 0x04000U // Invalid parameter
#define PCAN_ERROR_ILLPARAMVAL 0x08000U // Invalid parameter value
#define PCAN_ERROR_UNKNOWN 0x10000U // Unknown error
#define PCAN_ERROR_ILLDATA 0x20000U // Invalid data, function, or action
#define PCAN_ERROR_ILLMODE 0x80000U // Driver object state is wrong for the attempted operation
#define PCAN_ERROR_CAUTION 0x2000000U // An operation was successfully carried out, however, irregularities were registered
#define PCAN_ERROR_INITIALIZE 0x4000000U // Channel is not initialized [Value was changed from 0x40000 to 0x4000000]
#define PCAN_ERROR_ILLOPERATION 0x8000000U // Invalid operation [Value was changed from 0x80000 to 0x8000000]
// PCAN devices
//
#define PCAN_NONE 0x00U // Undefined, unknown or not selected PCAN device value
#define PCAN_PEAKCAN 0x01U // PCAN Non-PnP devices. NOT USED WITHIN PCAN-Basic API
#define PCAN_ISA 0x02U // PCAN-ISA, PCAN-PC/104, and PCAN-PC/104-Plus
#define PCAN_DNG 0x03U // PCAN-Dongle
#define PCAN_PCI 0x04U // PCAN-PCI, PCAN-cPCI, PCAN-miniPCI, and PCAN-PCI Express
#define PCAN_USB 0x05U // PCAN-USB and PCAN-USB Pro
#define PCAN_PCC 0x06U // PCAN-PC Card
#define PCAN_VIRTUAL 0x07U // PCAN Virtual hardware. NOT USED WITHIN PCAN-Basic API
#define PCAN_LAN 0x08U // PCAN Gateway devices
// PCAN parameters
//
#define PCAN_DEVICE_ID 0x01U // Device identifier parameter
#define PCAN_5VOLTS_POWER 0x02U // 5-Volt power parameter
#define PCAN_RECEIVE_EVENT 0x03U // PCAN receive event handler parameter
#define PCAN_MESSAGE_FILTER 0x04U // PCAN message filter parameter
#define PCAN_API_VERSION 0x05U // PCAN-Basic API version parameter
#define PCAN_CHANNEL_VERSION 0x06U // PCAN device channel version parameter
#define PCAN_BUSOFF_AUTORESET 0x07U // PCAN Reset-On-Busoff parameter
#define PCAN_LISTEN_ONLY 0x08U // PCAN Listen-Only parameter
#define PCAN_LOG_LOCATION 0x09U // Directory path for log files
#define PCAN_LOG_STATUS 0x0AU // Debug-Log activation status
#define PCAN_LOG_CONFIGURE 0x0BU // Configuration of the debugged information (LOG_FUNCTION_***)
#define PCAN_LOG_TEXT 0x0CU // Custom insertion of text into the log file
#define PCAN_CHANNEL_CONDITION 0x0DU // Availability status of a PCAN-Channel
#define PCAN_HARDWARE_NAME 0x0EU // PCAN hardware name parameter
#define PCAN_RECEIVE_STATUS 0x0FU // Message reception status of a PCAN-Channel
#define PCAN_CONTROLLER_NUMBER 0x10U // CAN-Controller number of a PCAN-Channel
#define PCAN_TRACE_LOCATION 0x11U // Directory path for PCAN trace files
#define PCAN_TRACE_STATUS 0x12U // CAN tracing activation status
#define PCAN_TRACE_SIZE 0x13U // Configuration of the maximum file size of a CAN trace
#define PCAN_TRACE_CONFIGURE 0x14U // Configuration of the trace file storing mode (TRACE_FILE_***)
#define PCAN_CHANNEL_IDENTIFYING 0x15U // Physical identification of a USB based PCAN-Channel by blinking its associated LED
#define PCAN_CHANNEL_FEATURES 0x16U // Capabilities of a PCAN device (FEATURE_***)
#define PCAN_BITRATE_ADAPTING 0x17U // Using of an existing bit rate (PCAN-View connected to a channel)
#define PCAN_BITRATE_INFO 0x18U // Configured bit rate as Btr0Btr1 value
#define PCAN_BITRATE_INFO_FD 0x19U // Configured bit rate as TPCANBitrateFD string
#define PCAN_BUSSPEED_NOMINAL 0x1AU // Configured nominal CAN Bus speed as Bits per seconds
#define PCAN_BUSSPEED_DATA 0x1BU // Configured CAN data speed as Bits per seconds
#define PCAN_IP_ADDRESS 0x1CU // Remote address of a LAN channel as string in IPv4 format
#define PCAN_LAN_SERVICE_STATUS 0x1DU // Status of the Virtual PCAN-Gateway Service
#define PCAN_ALLOW_STATUS_FRAMES 0x1EU // Status messages reception status within a PCAN-Channel
#define PCAN_ALLOW_RTR_FRAMES 0x1FU // RTR messages reception status within a PCAN-Channel
#define PCAN_ALLOW_ERROR_FRAMES 0x20U // Error messages reception status within a PCAN-Channel
#define PCAN_INTERFRAME_DELAY 0x21U // Delay, in microseconds, between sending frames
#define PCAN_ACCEPTANCE_FILTER_11BIT 0x22U // Filter over code and mask patterns for 11-Bit messages
#define PCAN_ACCEPTANCE_FILTER_29BIT 0x23U // Filter over code and mask patterns for 29-Bit messages
#define PCAN_IO_DIGITAL_CONFIGURATION 0x24U // Output mode of 32 digital I/O pin of a PCAN-USB Chip. 1: Output-Active 0 : Output Inactive
#define PCAN_IO_DIGITAL_VALUE 0x25U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip
#define PCAN_IO_DIGITAL_SET 0x26U // Value assigned to a 32 digital I/O pins of a PCAN-USB Chip - Multiple digital I/O pins to 1 = High
#define PCAN_IO_DIGITAL_CLEAR 0x27U // Clear multiple digital I/O pins to 0
#define PCAN_IO_ANALOG_VALUE 0x28U // Get value of a single analog input pin
#define PCAN_FIRMWARE_VERSION 0x29U // Get the version of the firmware used by the device associated with a PCAN-Channel
#define PCAN_ATTACHED_CHANNELS_COUNT 0x2AU // Get the amount of PCAN channels attached to a system
#define PCAN_ATTACHED_CHANNELS 0x2BU // Get information about PCAN channels attached to a system
#define PCAN_ALLOW_ECHO_FRAMES 0x2CU // Echo messages reception status within a PCAN-Channel
#define PCAN_DEVICE_PART_NUMBER 0x2DU // Get the part number associated to a device
// DEPRECATED parameters
//
#define PCAN_DEVICE_NUMBER PCAN_DEVICE_ID // Deprecated parameter. Use PCAN_DEVICE_ID instead
// PCAN parameter values
//
#define PCAN_PARAMETER_OFF 0x00U // The PCAN parameter is not set (inactive)
#define PCAN_PARAMETER_ON 0x01U // The PCAN parameter is set (active)
#define PCAN_FILTER_CLOSE 0x00U // The PCAN filter is closed. No messages will be received
#define PCAN_FILTER_OPEN 0x01U // The PCAN filter is fully opened. All messages will be received
#define PCAN_FILTER_CUSTOM 0x02U // The PCAN filter is custom configured. Only registered messages will be received
#define PCAN_CHANNEL_UNAVAILABLE 0x00U // The PCAN-Channel handle is illegal, or its associated hardware is not available
#define PCAN_CHANNEL_AVAILABLE 0x01U // The PCAN-Channel handle is available to be connected (PnP Hardware: it means furthermore that the hardware is plugged-in)
#define PCAN_CHANNEL_OCCUPIED 0x02U // The PCAN-Channel handle is valid, and is already being used
#define PCAN_CHANNEL_PCANVIEW (PCAN_CHANNEL_AVAILABLE | PCAN_CHANNEL_OCCUPIED) // The PCAN-Channel handle is already being used by a PCAN-View application, but is available to connect
#define LOG_FUNCTION_DEFAULT 0x00U // Logs system exceptions / errors
#define LOG_FUNCTION_ENTRY 0x01U // Logs the entries to the PCAN-Basic API functions
#define LOG_FUNCTION_PARAMETERS 0x02U // Logs the parameters passed to the PCAN-Basic API functions
#define LOG_FUNCTION_LEAVE 0x04U // Logs the exits from the PCAN-Basic API functions
#define LOG_FUNCTION_WRITE 0x08U // Logs the CAN messages passed to the CAN_Write function
#define LOG_FUNCTION_READ 0x10U // Logs the CAN messages received within the CAN_Read function
#define LOG_FUNCTION_ALL 0xFFFFU // Logs all possible information within the PCAN-Basic API functions
#define TRACE_FILE_SINGLE 0x00U // A single file is written until it size reaches PAN_TRACE_SIZE
#define TRACE_FILE_SEGMENTED 0x01U // Traced data is distributed in several files with size PAN_TRACE_SIZE
#define TRACE_FILE_DATE 0x02U // Includes the date into the name of the trace file
#define TRACE_FILE_TIME 0x04U // Includes the start time into the name of the trace file
#define TRACE_FILE_OVERWRITE 0x80U // Causes the overwriting of available traces (same name)
#define FEATURE_FD_CAPABLE 0x01U // Device supports flexible data-rate (CAN-FD)
#define FEATURE_DELAY_CAPABLE 0x02U // Device supports a delay between sending frames (FPGA based USB devices)
#define FEATURE_IO_CAPABLE 0x04U // Device supports I/O functionality for electronic circuits (USB-Chip devices)
#define SERVICE_STATUS_STOPPED 0x01U // The service is not running
#define SERVICE_STATUS_RUNNING 0x04U // The service is running
// Other constants
//
#define MAX_LENGTH_HARDWARE_NAME 33 // Maximum length of the name of a device: 32 characters + terminator
#define MAX_LENGTH_VERSION_STRING 256 // Maximum length of a version string: 255 characters + terminator
// PCAN message types
//
#define PCAN_MESSAGE_STANDARD 0x00U // The PCAN message is a CAN Standard Frame (11-bit identifier)
#define PCAN_MESSAGE_RTR 0x01U // The PCAN message is a CAN Remote-Transfer-Request Frame
#define PCAN_MESSAGE_EXTENDED 0x02U // The PCAN message is a CAN Extended Frame (29-bit identifier)
#define PCAN_MESSAGE_FD 0x04U // The PCAN message represents a FD frame in terms of CiA Specs
#define PCAN_MESSAGE_BRS 0x08U // The PCAN message represents a FD bit rate switch (CAN data at a higher bit rate)
#define PCAN_MESSAGE_ESI 0x10U // The PCAN message represents a FD error state indicator(CAN FD transmitter was error active)
#define PCAN_MESSAGE_ECHO 0x20U // The PCAN message represents an echo CAN Frame
#define PCAN_MESSAGE_ERRFRAME 0x40U // The PCAN message represents an error frame
#define PCAN_MESSAGE_STATUS 0x80U // The PCAN message represents a PCAN status message
// LookUp Parameters
//
#define LOOKUP_DEVICE_TYPE __T("devicetype") // Lookup channel by Device type (see PCAN devices e.g. PCAN_USB)
#define LOOKUP_DEVICE_ID __T("deviceid") // Lookup channel by device id
#define LOOKUP_CONTROLLER_NUMBER __T("controllernumber") // Lookup channel by CAN controller 0-based index
#define LOOKUP_IP_ADDRESS __T("ipaddress") // Lookup channel by IP address (LAN channels only)
// Frame Type / Initialization Mode
//
#define PCAN_MODE_STANDARD PCAN_MESSAGE_STANDARD
#define PCAN_MODE_EXTENDED PCAN_MESSAGE_EXTENDED
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baud rate with the BTROBTR1 register.
// Take a look at www.peak-system.com for our free software "BAUDTOOL"
// to calculate the BTROBTR1 register for every bit rate and sample point.
//
#define PCAN_BAUD_1M 0x0014U // 1 MBit/s
#define PCAN_BAUD_800K 0x0016U // 800 kBit/s
#define PCAN_BAUD_500K 0x001CU // 500 kBit/s
#define PCAN_BAUD_250K 0x011CU // 250 kBit/s
#define PCAN_BAUD_125K 0x031CU // 125 kBit/s
#define PCAN_BAUD_100K 0x432FU // 100 kBit/s
#define PCAN_BAUD_95K 0xC34EU // 95,238 kBit/s
#define PCAN_BAUD_83K 0x852BU // 83,333 kBit/s
#define PCAN_BAUD_50K 0x472FU // 50 kBit/s
#define PCAN_BAUD_47K 0x1414U // 47,619 kBit/s
#define PCAN_BAUD_33K 0x8B2FU // 33,333 kBit/s
#define PCAN_BAUD_20K 0x532FU // 20 kBit/s
#define PCAN_BAUD_10K 0x672FU // 10 kBit/s
#define PCAN_BAUD_5K 0x7F7FU // 5 kBit/s
// Represents the configuration for a CAN bit rate
// Note:
// * Each parameter and its value must be separated with a '='.
// * Each pair of parameter/value must be separated using ','.
//
// Example:
// f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1
//
#define PCAN_BR_CLOCK __T("f_clock")
#define PCAN_BR_CLOCK_MHZ __T("f_clock_mhz")
#define PCAN_BR_NOM_BRP __T("nom_brp")
#define PCAN_BR_NOM_TSEG1 __T("nom_tseg1")
#define PCAN_BR_NOM_TSEG2 __T("nom_tseg2")
#define PCAN_BR_NOM_SJW __T("nom_sjw")
#define PCAN_BR_NOM_SAMPLE __T("nom_sam")
#define PCAN_BR_DATA_BRP __T("data_brp")
#define PCAN_BR_DATA_TSEG1 __T("data_tseg1")
#define PCAN_BR_DATA_TSEG2 __T("data_tseg2")
#define PCAN_BR_DATA_SJW __T("data_sjw")
#define PCAN_BR_DATA_SAMPLE __T("data_ssp_offset")
// Type of PCAN (Non-PnP) hardware
//
#define PCAN_TYPE_ISA 0x01U // PCAN-ISA 82C200
#define PCAN_TYPE_ISA_SJA 0x09U // PCAN-ISA SJA1000
#define PCAN_TYPE_ISA_PHYTEC 0x04U // PHYTEC ISA
#define PCAN_TYPE_DNG 0x02U // PCAN-Dongle 82C200
#define PCAN_TYPE_DNG_EPP 0x03U // PCAN-Dongle EPP 82C200
#define PCAN_TYPE_DNG_SJA 0x05U // PCAN-Dongle SJA1000
#define PCAN_TYPE_DNG_SJA_EPP 0x06U // PCAN-Dongle EPP SJA1000
////////////////////////////////////////////////////////////
// Type definitions
////////////////////////////////////////////////////////////
#define TPCANHandle WORD // Represents a PCAN hardware channel handle
#define TPCANStatus DWORD // Represents a PCAN status/error code
#define TPCANParameter BYTE // Represents a PCAN parameter to be read or set
#define TPCANDevice BYTE // Represents a PCAN device
#define TPCANMessageType BYTE // Represents the type of a PCAN message
#define TPCANType BYTE // Represents the type of PCAN hardware to be initialized
#define TPCANMode BYTE // Represents a PCAN filter mode
#define TPCANBaudrate WORD // Represents a PCAN Baud rate register value
#define TPCANBitrateFD LPSTR // Represents a PCAN-FD bit rate string
#define TPCANTimestampFD UINT64 // Represents a timestamp of a received PCAN FD message
////////////////////////////////////////////////////////////
// Structure definitions
////////////////////////////////////////////////////////////
// Represents a PCAN message
//
typedef struct tagTPCANMsg
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE LEN; // Data Length Code of the message (0..8)
BYTE DATA[8]; // Data of the message (DATA[0]..DATA[7])
} TPCANMsg;
// Represents a timestamp of a received PCAN message
// Total Microseconds = micros + 1000 * millis + 0x100000000 * 1000 * millis_overflow
//
typedef struct tagTPCANTimestamp
{
DWORD millis; // Base-value: milliseconds: 0.. 2^32-1
WORD millis_overflow; // Roll-arounds of millis
WORD micros; // Microseconds: 0..999
} TPCANTimestamp;
// Represents a PCAN message from a FD capable hardware
//
typedef struct tagTPCANMsgFD
{
DWORD ID; // 11/29-bit message identifier
TPCANMessageType MSGTYPE; // Type of the message
BYTE DLC; // Data Length Code of the message (0..15)
BYTE DATA[64]; // Data of the message (DATA[0]..DATA[63])
} TPCANMsgFD;
// Describes an available PCAN channel
//
typedef struct tagTPCANChannelInformation
{
TPCANHandle channel_handle; // PCAN channel handle
TPCANDevice device_type; // Kind of PCAN device
BYTE controller_number; // CAN-Controller number
DWORD device_features; // Device capabilities flag (see FEATURE_*)
char device_name[MAX_LENGTH_HARDWARE_NAME]; // Device name
DWORD device_id; // Device number
DWORD channel_condition; // Availability status of a PCAN-Channel
}TPCANChannelInformation;
#ifdef __cplusplus
extern "C" {
#define _DEF_ARG =0
#else
#define _DEF_ARG
#endif
////////////////////////////////////////////////////////////
// PCAN-Basic API function declarations
////////////////////////////////////////////////////////////
/// <summary>
/// Initializes a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Btr0Btr1">"The speed for the communication (BTR0BTR1 code)"</param>
/// <param name="HwType">"Non-PnP: The type of hardware and operation mode"</param>
/// <param name="IOPort">"Non-PnP: The I/O address for the parallel port"</param>
/// <param name="Interrupt">"Non-PnP: Interrupt number of the parallel port"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Initialize(
TPCANHandle Channel,
TPCANBaudrate Btr0Btr1,
TPCANType HwType _DEF_ARG,
DWORD IOPort _DEF_ARG,
WORD Interrupt _DEF_ARG);
/// <summary>
/// Initializes a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="BitrateFD">"The speed for the communication (FD bit rate string)"</param>
/// <remarks>See PCAN_BR_* values
/// * Parameter and values must be separated by '='
/// * Couples of Parameter/value must be separated by ','
/// * Following Parameter must be filled out: f_clock, data_brp, data_sjw, data_tseg1, data_tseg2,
/// nom_brp, nom_sjw, nom_tseg1, nom_tseg2.
/// * Following Parameters are optional (not used yet): data_ssp_offset, nom_sam
///</remarks>
/// <example>f_clock=80000000,nom_brp=10,nom_tseg1=5,nom_tseg2=2,nom_sjw=1,data_brp=4,data_tseg1=7,data_tseg2=2,data_sjw=1</example>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_InitializeFD(
TPCANHandle Channel,
TPCANBitrateFD BitrateFD);
/// <summary>
/// Uninitializes one or all PCAN Channels initialized by CAN_Initialize
/// </summary>
/// <remarks>Giving the TPCANHandle value "PCAN_NONEBUS",
/// uninitialize all initialized channels</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Uninitialize(
TPCANHandle Channel);
/// <summary>
/// Resets the receive and transmit queues of the PCAN Channel
/// </summary>
/// <remarks>
/// A reset of the CAN controller is not performed.
/// </remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Reset(
TPCANHandle Channel);
/// <summary>
/// Gets the current status of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetStatus(
TPCANHandle Channel);
/// <summary>
/// Reads a CAN message from the receive queue of a PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestamp structure buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Read(
TPCANHandle Channel,
TPCANMsg* MessageBuffer,
TPCANTimestamp* TimestampBuffer);
/// <summary>
/// Reads a CAN message from the receive queue of a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD structure buffer to store the CAN message"</param>
/// <param name="TimestampBuffer">"A TPCANTimestampFD buffer to get
/// the reception time of the message. If this value is not desired, this parameter
/// should be passed as NULL"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_ReadFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer,
TPCANTimestampFD *TimestampBuffer);
/// <summary>
/// Transmits a CAN message
/// </summary>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsg buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_Write(
TPCANHandle Channel,
TPCANMsg* MessageBuffer);
/// <summary>
/// Transmits a CAN message over a FD capable PCAN Channel
/// </summary>
/// <param name="Channel">"The handle of a FD capable PCAN Channel"</param>
/// <param name="MessageBuffer">"A TPCANMsgFD buffer with the message to be sent"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_WriteFD(
TPCANHandle Channel,
TPCANMsgFD* MessageBuffer);
/// <summary>
/// Configures the reception filter.
/// </summary>
/// <remarks>The message filter will be expanded with every call to
/// this function. If it is desired to reset the filter, please use
/// the CAN_SetValue function</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="FromID">"The lowest CAN ID to be received"</param>
/// <param name="ToID">"The highest CAN ID to be received"</param>
/// <param name="Mode">"Message type, Standard (11-bit identifier) or
/// Extended (29-bit identifier)"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_FilterMessages(
TPCANHandle Channel,
DWORD FromID,
DWORD ToID,
TPCANMode Mode);
/// <summary>
/// Retrieves a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to get"</param>
/// <param name="Buffer">"Buffer for the parameter value"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Configures or sets a PCAN Channel value
/// </summary>
/// <remarks>Parameters can be present or not according with the kind
/// of Hardware (PCAN Channel) being used. If a parameter is not available,
/// a PCAN_ERROR_ILLPARAMTYPE error will be returned</remarks>
/// <param name="Channel">"The handle of a PCAN Channel"</param>
/// <param name="Parameter">"The TPCANParameter parameter to set"</param>
/// <param name="Buffer">"Buffer with the value to be set"</param>
/// <param name="BufferLength">"Size in bytes of the buffer"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_SetValue(
TPCANHandle Channel,
TPCANParameter Parameter,
void* Buffer,
DWORD BufferLength);
/// <summary>
/// Returns a descriptive text of a given TPCANStatus error
/// code, in any desired language
/// </summary>
/// <remarks>The current languages available for translation are:
/// Neutral (0x00), German (0x07), English (0x09), Spanish (0x0A),
/// Italian (0x10) and French (0x0C)</remarks>
/// <param name="Error">"A TPCANStatus error code"</param>
/// <param name="Language">"Indicates a 'Primary language ID'"</param>
/// <param name="Buffer">"Buffer for a null terminated char array"</param>
/// <returns>"A TPCANStatus error code"</returns>
TPCANStatus __stdcall CAN_GetErrorText(
TPCANStatus Error,
WORD Language,
LPSTR Buffer);
/// <summary>
/// Finds a PCAN-Basic channel that matches with the given parameters
/// </summary>
/// <param name="Parameters">A comma separated string contained pairs of
/// parameter-name/value to be matched within a PCAN-Basic channel</param>
/// <param name="FoundChannel">Buffer for returning the PCAN-Basic channel,
/// when found</param>
/// <returns>A TPCANStatus error code</returns>
TPCANStatus __stdcall CAN_LookUpChannel(
LPSTR Parameters,
TPCANHandle* FoundChannel);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,6 @@
#include "09_TraceFiles.h"
int main()
{
TraceFiles start;
}

Some files were not shown because too many files have changed in this diff Show More