open source driving agent
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

428 lines
19 KiB

//
// Copyright (c) 2015-2016 DashLogic, Inc.
// All Rights Reserved.
//
// http://www.dashlogic.com
// sales@dashlogic.com
//
// Redistribution and use in source and binary forms, with or without
// modification, including use for commercial purposes, are permitted
// provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the
// distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// 4. Redistributions of any form whatsoever must retain the following
// acknowledgment: 'This product includes software developed by
// "DashLogic, Inc." (http://www.dashlogic.com/).'
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//
// Formatting:
// Indents: Use tabs only (1 tab per indent)
// Tab Size: 4 spaces
//
// File Revision:
// $Rev: 5216 $
// $Date: 2016-03-15 09:32:34 -0600 (Tue, 15 Mar 2016) $
//
#pragma once
#ifdef PANDAJ2534DLL_EXPORTS
#define PANDAJ2534DLL_API extern "C" __declspec(dllexport)
#else
#define PANDAJ2534DLL_API
//__declspec(dllimport)
#endif
//
// Platform-specific Defines:
//
// PTAPI: Define this yourself if you want a specific calling
// convention or other modifiers on the Pass-Thru API
// functions. Typically, on Windows, PTAPI will be defined
// as WINAPI, which enables the __stdcall convention.
//
#define PTAPI __stdcall //WINAPI
//
// J2534-1 v04.04 ProtocolID Values
//
#define J1850VPW 0x01
#define J1850PWM 0x02
#define ISO9141 0x03
#define ISO14230 0x04
#define CAN 0x05
#define ISO15765 0x06
#define SCI_A_ENGINE 0x07
#define SCI_A_TRANS 0x08
#define SCI_B_ENGINE 0x09
#define SCI_B_TRANS 0x0A
//
// J2534-2 ProtocolID Values
//
#define J1850VPW_PS 0x00008000
#define J1850PWM_PS 0x00008001
#define ISO9141_PS 0x00008002
#define ISO14230_PS 0x00008003
#define CAN_PS 0x00008004
#define ISO15765_PS 0x00008005
#define J2610_PS 0x00008006
#define SW_ISO15765_PS 0x00008007
#define SW_CAN_PS 0x00008008
#define GM_UART_PS 0x00008009
#define CAN_CH1 0x00009000
#define CAN_CH2 (CAN_CH1 + 1)
#define CAN_CH128 (CAN_CH1 + 127)
#define J1850VPW_CH1 0x00009080
#define J1850VPW_CH2 (J1850VPW_CH1 + 1)
#define J1850VPW_CH128 (J1850VPW_CH1 + 127)
#define J1850PWM_CH1 0x00009160
#define J1850PWM_CH2 (J1850PWM_CH1 + 1)
#define J1850PWM_CH128 (J1850PWM_CH1 + 127)
#define ISO9141_CH1 0x00009240
#define ISO9141_CH2 (ISO9141_CH1 + 1)
#define ISO9141_CH128 (ISO9141_CH1 + 127)
#define ISO14230_CH1 0x00009320
#define ISO14230_CH2 (ISO14230_CH1 + 1)
#define ISO14230_CH128 (ISO14230_CH1 + 127)
#define ISO15765_CH1 0x00009400
#define ISO15765_CH2 (ISO15765_CH1 + 1)
#define ISO15765_CH128 (ISO15765_CH1 + 127)
#define SW_CAN_CAN_CH1 0x00009480
#define SW_CAN_CAN_CH2 (SW_CAN_CAN_CH1 + 1)
#define SW_CAN_CAN_CH128 (SW_CAN_CAN_CH1 + 127)
#define SW_CAN_ISO15765_CH1 0x00009560
#define SW_CAN_ISO15765_CH2 (SW_CAN_ISO15765_CH1 + 1)
#define SW_CAN_ISO15765_CH128 (SW_CAN_ISO15765_CH1 + 127)
#define J2610_CH1 0x00009640
#define J2610_CH2 (J2610_CH1 + 1)
#define J2610_CH128 (J2610_CH1 + 127)
#define ANALOG_IN_CH1 0x0000C000
#define ANALOG_IN_CH2 0x0000C001
#define ANALOG_IN_CH32 0x0000C01F
//
// J2534-1 v04.04 Error Values
//
#define STATUS_NOERROR 0x00 // Function call successful.
#define ERR_NOT_SUPPORTED 0x01 // Device cannot support requested functionality mandated in J2534. Device is not fully SAE J2534 compliant.
#define ERR_INVALID_CHANNEL_ID 0x02 // Invalid ChannelID value.
#define ERR_INVALID_PROTOCOL_ID 0x03 // Invalid or unsupported ProtocolID, or there is a resource conflict (i.e. trying to connect to multiple mutually exclusive protocols such as J1850PWM and J1850VPW, or CAN and SCI, etc.).
#define ERR_NULL_PARAMETER 0x04 // NULL pointer supplied where a valid pointer is required.
#define ERR_INVALID_IOCTL_VALUE 0x05 // Invalid value for Ioctl parameter.
#define ERR_INVALID_FLAGS 0x06 // Invalid flag values.
#define ERR_FAILED 0x07 // Undefined error, use PassThruGetLastError() for text description.
#define ERR_DEVICE_NOT_CONNECTED 0x08 // Unable to communicate with device.
#define ERR_TIMEOUT 0x09 // Read or write timeout:
// PassThruReadMsgs() - No message available to read or could not read the specified number of messages. The actual number of messages read is placed in <NumMsgs>.
// PassThruWriteMsgs() - Device could not write the specified number of messages. The actual number of messages sent on the vehicle network is placed in <NumMsgs>.
#define ERR_INVALID_MSG 0x0A // Invalid message structure pointed to by pMsg.
#define ERR_INVALID_TIME_INTERVAL 0x0B // Invalid TimeInterval value.
#define ERR_EXCEEDED_LIMIT 0x0C // Exceeded maximum number of message IDs or allocated space.
#define ERR_INVALID_MSG_ID 0x0D // Invalid MsgID value.
#define ERR_DEVICE_IN_USE 0x0E // Device is currently open.
#define ERR_INVALID_IOCTL_ID 0x0F // Invalid IoctlID value.
#define ERR_BUFFER_EMPTY 0x10 // Protocol message buffer empty, no messages available to read.
#define ERR_BUFFER_FULL 0x11 // Protocol message buffer full. All the messages specified may not have been transmitted.
#define ERR_BUFFER_OVERFLOW 0x12 // Indicates a buffer overflow occurred and messages were lost.
#define ERR_PIN_INVALID 0x13 // Invalid pin number, pin number already in use, or voltage already applied to a different pin.
#define ERR_CHANNEL_IN_USE 0x14 // Channel number is currently connected.
#define ERR_MSG_PROTOCOL_ID 0x15 // Protocol type in the message does not match the protocol associated with the Channel ID
#define ERR_INVALID_FILTER_ID 0x16 // Invalid Filter ID value.
#define ERR_NO_FLOW_CONTROL 0x17 // No flow control filter set or matched (for ProtocolID ISO15765 only).
#define ERR_NOT_UNIQUE 0x18 // A CAN ID in pPatternMsg or pFlowControlMsg matches either ID in an existing FLOW_CONTROL_FILTER
#define ERR_INVALID_BAUDRATE 0x19 // The desired baud rate cannot be achieved within the tolerance specified in SAE J2534-1 Section 6.5
#define ERR_INVALID_DEVICE_ID 0x1A // Device ID invalid.
//
// J2534-1 v04.04 Connect Flags
//
#define CAN_29BIT_ID 0x0100
#define ISO9141_NO_CHECKSUM 0x0200
#define CAN_ID_BOTH 0x0800
#define ISO9141_K_LINE_ONLY 0x1000
//
// J2534-1 v04.04 Filter Type Values
//
#define PASS_FILTER 0x00000001
#define BLOCK_FILTER 0x00000002
#define FLOW_CONTROL_FILTER 0x00000003
//
// J2534-1 v04.04 Programming Voltage Pin Numbers
//
#define AUXILIARY_OUTPUT_PIN 0
#define SAE_J1962_CONNECTOR_PIN_6 6
#define SAE_J1962_CONNECTOR_PIN_9 9
#define SAE_J1962_CONNECTOR_PIN_11 11
#define SAE_J1962_CONNECTOR_PIN_12 12
#define SAE_J1962_CONNECTOR_PIN_13 13
#define SAE_J1962_CONNECTOR_PIN_14 14
#define SAE_J1962_CONNECTOR_PIN_15 15 // Short to ground only
//
// J2534-1 v04.04 Programming Voltage Values
//
#define SHORT_TO_GROUND 0xFFFFFFFE
#define VOLTAGE_OFF 0xFFFFFFFF
//
// J2534-1 v04.04 API Version Values
//
#define J2534_APIVER_FEBRUARY_2002 "02.02"
#define J2534_APIVER_NOVEMBER_2004 "04.04"
//
// J2534-1 v04.04 IOCTL ID Values
//
#define GET_CONFIG 0x01 // pInput = SCONFIG_LIST, pOutput = NULL
#define SET_CONFIG 0x02 // pInput = SCONFIG_LIST, pOutput = NULL
#define READ_VBATT 0x03 // pInput = NULL, pOutput = unsigned long
#define FIVE_BAUD_INIT 0x04 // pInput = SBYTE_ARRAY, pOutput = SBYTE_ARRAY
#define FAST_INIT 0x05 // pInput = PASSTHRU_MSG, pOutput = PASSTHRU_MSG
#define CLEAR_TX_BUFFER 0x07 // pInput = NULL, pOutput = NULL
#define CLEAR_RX_BUFFER 0x08 // pInput = NULL, pOutput = NULL
#define CLEAR_PERIODIC_MSGS 0x09 // pInput = NULL, pOutput = NULL
#define CLEAR_MSG_FILTERS 0x0A // pInput = NULL, pOutput = NULL
#define CLEAR_FUNCT_MSG_LOOKUP_TABLE 0x0B // pInput = NULL, pOutput = NULL
#define ADD_TO_FUNCT_MSG_LOOKUP_TABLE 0x0C // pInput = SBYTE_ARRAY, pOutput = NULL
#define DELETE_FROM_FUNCT_MSG_LOOKUP_TABLE 0x0D // pInput = SBYTE_ARRAY, pOutput = NULL
#define READ_PROG_VOLTAGE 0x0E // pInput = NULL, pOutput = unsigned long
//
// J2534-2 IOCTL ID Values
//
#define SW_CAN_HS 0x00008000 // pInput = NULL, pOutput = NULL
#define SW_CAN_NS 0x00008001 // pInput = NULL, pOutput = NULL
#define SET_POLL_RESPONSE 0x00008002 // pInput = SBYTE_ARRAY, pOutput = NULL
#define BECOME_MASTER 0x00008003 // pInput = unsigned char, pOutput = NULL
//
// J2534-1 v04.04 Configuration Parameter Values
// Default value is enclosed in square brackets "[" and "]"
//
#define DATA_RATE 0x01 // 5-500000
#define LOOPBACK 0x03 // 0 (OFF), 1 (ON) [0]
#define NODE_ADDRESS 0x04 // J1850PWM: 0x00-0xFF
#define NETWORK_LINE 0x05 // J1850PWM: 0 (BUS_NORMAL), 1 (BUS_PLUS), 2 (BUS_MINUS) [0]
#define P1_MIN 0x06 // ISO9141 or ISO14230: Not used by interface
#define P1_MAX 0x07 // ISO9141 or ISO14230: 0x1-0xFFFF (.5 ms per bit) [40 (20ms)]
#define P2_MIN 0x08 // ISO9141 or ISO14230: Not used by interface
#define P2_MAX 0x09 // ISO9141 or ISO14230: Not used by interface
#define P3_MIN 0x0A // ISO9141 or ISO14230: 0x0-0xFFFF (.5 ms per bit) [110 (55ms)]
#define P3_MAX 0x0B // ISO9141 or ISO14230: Not used by interface
#define P4_MIN 0x0C // ISO9141 or ISO14230: 0x0-0xFFFF (.5 ms per bit) [10 (5ms)]
#define P4_MAX 0x0D // ISO9141 or ISO14230: Not used by interface
#define W0 0x19 // ISO9141: 0x0-0xFFFF (1 ms per bit) [300]
#define W1 0x0E // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [300]
#define W2 0x0F // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [20]
#define W3 0x10 // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [20]
#define W4 0x11 // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [50]
#define W5 0x12 // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [300]
#define TIDLE 0x13 // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [300]
#define TINIL 0x14 // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [25]
#define TWUP 0x15 // ISO9141 or ISO14230: 0x0-0xFFFF (1 ms per bit) [50]
#define PARITY 0x16 // ISO9141 or ISO14230: 0 (NO_PARITY), 1 (ODD_PARITY), 2 (EVEN_PARITY) [0]
#define BIT_SAMPLE_POINT 0x17 // CAN: 0-100 (1% per bit) [80]
#define SYNC_JUMP_WIDTH 0x18 // CAN: 0-100 (1% per bit) [15]
#define T1_MAX 0x1A // SCI: 0x0-0xFFFF (1 ms per bit) [20]
#define T2_MAX 0x1B // SCI: 0x0-0xFFFF (1 ms per bit) [100]
#define T3_MAX 0x24 // SCI: 0x0-0xFFFF (1 ms per bit) [50]
#define T4_MAX 0x1C // SCI: 0x0-0xFFFF (1 ms per bit) [20]
#define T5_MAX 0x1D // SCI: 0x0-0xFFFF (1 ms per bit) [100]
#define ISO15765_BS 0x1E // ISO15765: 0x0-0xFF [0]
#define ISO15765_STMIN 0x1F // ISO15765: 0x0-0xFF [0]
#define ISO15765_BS_TX 0x22 // ISO15765: 0x0-0xFF,0xFFFF [0xFFFF]
#define ISO15765_STMIN_TX 0x23 // ISO15765: 0x0-0xFF,0xFFFF [0xFFFF]
#define DATA_BITS 0x20 // ISO9141 or ISO14230: 0 (8 data bits), 1 (7 data bits) [0]
#define FIVE_BAUD_MOD 0x21 // ISO9141 or ISO14230: 0 (ISO 9141-2/14230-4), 1 (Inv KB2), 2 (Inv Addr), 3 (ISO 9141) [0]
#define ISO15765_WFT_MAX 0x25 // ISO15765: 0x0-0xFF [0]
//
// J2534-2 Configuration Parameter Values
// Default value is enclosed in square brackets "[" and "]"
//
#define CAN_MIXED_FORMAT 0x00008000 // See #defines below. [0]
#define J1962_PINS 0x00008001 // 0xPPSS PP: 0x00-0x10 SS: 0x00-0x10 PP!=SS, except 0x0000. Exclude pins 4, 5, and 16. [0]
#define SW_CAN_HS_DATA_RATE 0x00008010 // SWCAN: 5-500000 [83333]
#define SW_CAN_SPEEDCHANGE_ENABLE 0x00008011 // SWCAN: 0 (DISABLE_SPDCHANGE), 1 (ENABLE_SPDCHANGE) [0]
#define SW_CAN_RES_SWITCH 0x00008012 // SWCAN: 0 (DISCONNECT_RESISTOR), 1 (CONNECT_RESISTOR), 2 (AUTO_ RESISTOR) [0]
#define ACTIVE_CHANNELS 0x00008020 // ANALOG: 0-0xFFFFFFFF
#define SAMPLE_RATE 0x00008021 // ANALOG: 0-0xFFFFFFFF [0] (high bit changes meaning from samples/sec to seconds/sample)
#define SAMPLES_PER_READING 0x00008022 // ANALOG: 1-0xFFFFFFFF [1]
#define READINGS_PER_MSG 0x00008023 // ANALOG: 1-0x00000408 (1 - 1032) [1]
#define AVERAGING_METHOD 0x00008024 // ANALOG: 0-0xFFFFFFFF [0]
#define SAMPLE_RESOLUTION 0x00008025 // ANALOG READ-ONLY: 0x1-0x20 (1 - 32)
#define INPUT_RANGE_LOW 0x00008026 // ANALOG READ-ONLY: 0x80000000-0x7FFFFFFF (-2147483648-2147483647)
#define INPUT_RANGE_HIGH 0x00008027 // ANALOG READ-ONLY: 0x80000000-0x7FFFFFFF (-2147483648-2147483647)
//
// J2534-2 Mixed-Mode/Format CAN Definitions
//
#define CAN_MIXED_FORMAT_OFF 0 // Messages will be treated as ISO 15765 ONLY.
#define CAN_MIXED_FORMAT_ON 1 // Messages will be treated as either ISO 15765 or an unformatted CAN frame.
#define CAN_MIXED_FORMAT_ALL_FRAMES 2 // Messages will be treated as ISO 15765, an unformatted CAN frame, or both.
//
// J2534-2 Analog Channel Averaging Method Definitions
//
#define SIMPLE_AVERAGE 0x00000000 // Simple arithmetic mean
#define MAX_LIMIT_AVERAGE 0x00000001 // Choose the biggest value
#define MIN_LIMIT_AVERAGE 0x00000002 // Choose the lowest value
#define MEDIAN_AVERAGE 0x00000003 // Choose arithmetic median
//
// J2534-1 v04.04 RxStatus Definitions
//
#define TX_MSG_TYPE 0x0001
#define START_OF_MESSAGE 0x0002
#define RX_BREAK 0x0004
#define TX_INDICATION 0x0008
#define ISO15765_PADDING_ERROR 0x0010
#define ISO15765_ADDR_TYPE 0x0080
//#define CAN_29BIT_ID 0x0100 // Defined above
//
// J2534-2 RxStatus Definitions
//
#define SW_CAN_HV_RX 0x00010000 // SWCAN Channels Only
#define SW_CAN_HS_RX 0x00020000 // SWCAN Channels Only
#define SW_CAN_NS_RX 0x00040000 // SWCAN Channels Only
#define OVERFLOW_ 0x00010000 // Analog Input Channels Only
//
// J2534-1 v04.04 TxFlags Definitions
//
#define ISO15765_FRAME_PAD 0x0040
//#define ISO15765_ADDR_TYPE 0x0080 // Defined above
//#define CAN_29BIT_ID 0x0100 // Defined above
#define WAIT_P3_MIN_ONLY 0x0200
#define SCI_MODE 0x400000
#define SCI_TX_VOLTAGE 0x800000
//
// J2534-2 TxFlags Definitions
//
#define SW_CAN_HV_TX 0x00000400
//
// J2534-1 v04.04 Structure Definitions
//
typedef struct
{
unsigned long Parameter; // Name of parameter
unsigned long Value; // Value of the parameter
} SCONFIG;
typedef struct
{
unsigned long NumOfParams; // Number of SCONFIG elements
SCONFIG* ConfigPtr; // Array of SCONFIG
} SCONFIG_LIST;
typedef struct
{
unsigned long NumOfBytes; // Number of bytes in the array
unsigned char* BytePtr; // Array of bytes
} SBYTE_ARRAY;
typedef struct
{
unsigned long ProtocolID;
unsigned long RxStatus;
unsigned long TxFlags;
unsigned long Timestamp;
unsigned long DataSize;
unsigned long ExtraDataIndex;
unsigned char Data[4128];
} PASSTHRU_MSG;
//
// J2534-1 v04.04 Function Prototypes
//
PANDAJ2534DLL_API long PTAPI PassThruOpen(void *pName, unsigned long *pDeviceID);
PANDAJ2534DLL_API long PTAPI PassThruClose(unsigned long DeviceID);
PANDAJ2534DLL_API long PTAPI PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID);
PANDAJ2534DLL_API long PTAPI PassThruDisconnect(unsigned long ChannelID);
PANDAJ2534DLL_API long PTAPI PassThruReadMsgs(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout);
PANDAJ2534DLL_API long PTAPI PassThruWriteMsgs(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout);
PANDAJ2534DLL_API long PTAPI PassThruStartPeriodicMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pMsgID, unsigned long TimeInterval);
PANDAJ2534DLL_API long PTAPI PassThruStopPeriodicMsg(unsigned long ChannelID, unsigned long MsgID);
PANDAJ2534DLL_API long PTAPI PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *pFilterID);
PANDAJ2534DLL_API long PTAPI PassThruStopMsgFilter(unsigned long ChannelID, unsigned long FilterID);
PANDAJ2534DLL_API long PTAPI PassThruSetProgrammingVoltage(unsigned long DeviceID, unsigned long PinNumber, unsigned long Voltage);
PANDAJ2534DLL_API long PTAPI PassThruReadVersion(unsigned long DeviceID, char *pFirmwareVersion, char *pDllVersion, char *pApiVersion);
PANDAJ2534DLL_API long PTAPI PassThruGetLastError(char *pErrorDescription);
PANDAJ2534DLL_API long PTAPI PassThruIoctl(unsigned long ChannelID, unsigned long IoctlID, void *pInput, void *pOutput);
//
// J2534-1 v04.04 Function Typedefs
// These function typedefs allow simpler use of the J2534 API by
// allowing you to do things like this:
// PTCONNECT pPassThruConnectFunc = GetProcAddress(hModule, "PassThruConnect");
// if (pPassThruConnectFunc == NULL)
// return FALSE;
// pPassThruConnectFunc(DeviceID, CAN, CAN_29BIT_ID, 500000, &ChannelID);
//
typedef long (PTAPI *PTOPEN)(void *pName, unsigned long *pDeviceID);
typedef long (PTAPI *PTCLOSE)(unsigned long DeviceID);
typedef long (PTAPI *PTCONNECT)(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long BaudRate, unsigned long *pChannelID);
typedef long (PTAPI *PTDISCONNECT)(unsigned long ChannelID);
typedef long (PTAPI *PTREADMSGS)(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout);
typedef long (PTAPI *PTWRITEMSGS)(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout);
typedef long (PTAPI *PTSTARTPERIODICMSG)(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pMsgID, unsigned long TimeInterval);
typedef long (PTAPI *PTSTOPPERIODICMSG)(unsigned long ChannelID, unsigned long MsgID);
typedef long (PTAPI *PTSTARTMSGFILTER)(unsigned long ChannelID, unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *pFilterID);
typedef long (PTAPI *PTSTOPMSGFILTER)(unsigned long ChannelID, unsigned long FilterID);
typedef long (PTAPI *PTSETPROGRAMMINGVOLTAGE)(unsigned long DeviceID, unsigned long PinNumber, unsigned long Voltage);
typedef long (PTAPI *PTREADVERSION)(unsigned long DeviceID, char *pFirmwareVersion, char *pDllVersion, char *pApiVersion);
typedef long (PTAPI *PTGETLASTERROR)(char *pErrorDescription);
typedef long (PTAPI *PTIOCTL)(unsigned long ChannelID, unsigned long IoctlID, void *pInput, void *pOutput);