blob: 625edd34a35658c6b135102fc02fc997e0721c53 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 Denis Shienkov <denis.shienkov@gmail.com>
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtSerialBus module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL3$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef TINYCAN_SYMBOLS_P_H
#define TINYCAN_SYMBOLS_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#ifdef LINK_LIBMHSTCAN
extern "C"
{
#include <can_types.h>
#include <can_drv.h>
#include <can_drv_ex.h>
}
#else
#include <QtCore/qlibrary.h>
#include <QtCore/qstring.h>
#include <QtCore/qdebug.h>
#ifdef Q_OS_WIN32
#include <windows.h>
#define DRV_CALLBACK_TYPE WINAPI
#else
#define DRV_CALLBACK_TYPE
#endif
#define INDEX_INVALID 0xFFFFFFFF
#define INDEX_FIFO_PUFFER_MASK 0x0000FFFF
#define INDEX_SOFT_FLAG 0x02000000
#define INDEX_RXD_TXT_FLAG 0x01000000
#define INDEX_CAN_KANAL_MASK 0x000F0000
#define INDEX_CAN_DEVICE_MASK 0x00F00000
#define INDEX_CAN_KANAL_A 0x00000000
#define INDEX_CAN_KANAL_B 0x00010000
// CAN Message Type
#define MsgFlags Flags.Long
#define MsgLen Flags.Flag.Len
#define MsgRTR Flags.Flag.RTR
#define MsgEFF Flags.Flag.EFF
#define MsgTxD Flags.Flag.TxD
#define MsgErr Flags.Flag.Error
#define MsgSource Flags.Flag.Source
#define MsgData Data.Bytes
struct TCanFlagsBits
{
unsigned Len:4; // DLC -> data length 0 - 8 byte
unsigned TxD:1; // TxD -> 1 = Tx CAN Message, 0 = Rx CAN Message
unsigned Error:1; // Error -> 1 = bus CAN error message
unsigned RTR:1; // Remote Transmission Request bit -> If message RTR marks
unsigned EFF:1; // Extended Frame Format bit -> 1 = 29 Bit Id's, 0 = 11 Bit Id's
unsigned Source:8; // Source of the message (Device)
};
#pragma pack(push, 1)
union TCanFlags
{
struct TCanFlagsBits Flag;
quint32 Long;
};
#pragma pack(pop)
#pragma pack(push, 1)
union TCanData
{
char Chars[8];
quint8 Bytes[8];
quint16 Words[4];
quint32 Longs[2];
};
#pragma pack(pop)
#pragma pack(push, 1)
struct TTime
{
quint32 Sec;
quint32 USec;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct TCanMsg
{
quint32 Id;
union TCanFlags Flags;
union TCanData Data;
struct TTime Time;
};
#pragma pack(pop)
// CAN Message Filter Type
#define FilFlags Flags.Long
#define FilRTR Flags.Flag.RTR
#define FilEFF Flags.Flag.EFF
#define FilMode Flags.Flag.Mode
#define FilIdMode Flags.Flag.IdMode
#define FilEnable Flags.Flag.Enable
struct TMsgFilterFlagsBits
{
// 1. byte
unsigned Len:4; // DLC
unsigned Res:2; // Reserved
unsigned RTR:1; // Remote Transmit Request bit
unsigned EFF:1; // Extended Frame Format bit
// 2. byte
unsigned IdMode:2; // 0 = Mask & Code; 1 = Start & Sstop; 2 = Single Id
unsigned DLCCheck:1;
unsigned DataCheck:1;
unsigned Res1:4;
// 3. byte
unsigned Res2:8;
// 4. byte
unsigned Type:4; // 0 = Single buffer
unsigned Res3:2;
unsigned Mode:1; // 0 = Delete message; 1 = Don't delete message
unsigned Enable:1; // 0 = Close filter; 1 = Release filter
};
#pragma pack(push, 1)
union TMsgFilterFlags
{
struct TMsgFilterFlagsBits Flag;
quint32 Long;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct TMsgFilter
{
quint32 Maske;
quint32 Code;
union TMsgFilterFlags Flags;
union TCanData Data;
};
#pragma pack(pop)
// CAN speed
#define CAN_10K_BIT 10 // 10 kBit/s
#define CAN_20K_BIT 20 // 20 kBit/s
#define CAN_50K_BIT 50 // 50 kBit/s
#define CAN_100K_BIT 100 // 100 kBit/s
#define CAN_125K_BIT 125 // 125 kBit/s
#define CAN_250K_BIT 250 // 250 kBit/s
#define CAN_500K_BIT 500 // 500 kBit/s
#define CAN_800K_BIT 800 // 800 kBit/s
#define CAN_1M_BIT 1000 // 1 MBit/s
// CAN bus mode
#define OP_CAN_NO_CHANGE 0 // Current state no change
#define OP_CAN_START 1 // Starts CAN-Bus
#define OP_CAN_STOP 2 // Stops CAN-Bus
#define OP_CAN_RESET 3 // Reset CAN Controller (clearing BusOff)
#define OP_CAN_START_LOM 4 // Starts the CAN-Bus in Silent Mode (Listen Only Mode)
#define OP_CAN_START_NO_RETRANS 5 // Starts the CAN-Bus in Automatic Retransmission disable Mode
#define CAN_CMD_NONE 0x0000
#define CAN_CMD_RXD_OVERRUN_CLEAR 0x0001
#define CAN_CMD_RXD_FIFOS_CLEAR 0x0002
#define CAN_CMD_TXD_OVERRUN_CLEAR 0x0004
#define CAN_CMD_TXD_FIFOS_CLEAR 0x0008
#define CAN_CMD_HW_FILTER_CLEAR 0x0010
#define CAN_CMD_SW_FILTER_CLEAR 0x0020
#define CAN_CMD_TXD_PUFFERS_CLEAR 0x0040
#define CAN_CMD_ALL_CLEAR 0x0FFF
// Driver status
#define DRV_NOT_LOAD 0 // Driver DLL was not loaded
#define DRV_STATUS_NOT_INIT 1 // Driver was not initialised
#define DRV_STATUS_INIT 2 // Driver was successfully initialised
#define DRV_STATUS_PORT_NOT_OPEN 3 // The port is not open
#define DRV_STATUS_PORT_OPEN 4 // The port was opened
#define DRV_STATUS_DEVICE_FOUND 5 // The connection to the hardware was established
#define DRV_STATUS_CAN_OPEN 6 // The device was opened and initialised
#define DRV_STATUS_CAN_RUN_TX 7 // CAN Bus RUN Transmitter (not used)
#define DRV_STATUS_CAN_RUN 8 // CAN Bus RUN
// CAN status
#define CAN_STATUS_OK 0 // CAN-Controller: Ok
#define CAN_STATUS_ERROR 1 // CAN-Controller: CAN Error
#define CAN_STATUS_WARNING 2 // CAN-Controller: Error warning
#define CAN_STATUS_PASSIV 3 // CAN-Controller: Error passive
#define CAN_STATUS_BUS_OFF 4 // CAN-Controller: Bus Off
#define CAN_STATUS_UNBEKANNT 5 // CAN-Controller: State unknown
// FIFO status
#define FIFO_OK 0 // Fifo-Status: Ok
#define FIFO_HW_OVERRUN 1 // Fifo-Status: Hardware Fifo overflow
#define FIFO_SW_OVERRUN 2 // Fifo-Status: Software Fifo overflow
#define FIFO_HW_SW_OVERRUN 3 // Fifo-Status: Hardware & Software Fifo overflow
#define FIFO_STATUS_UNBEKANNT 4 // Fifo-Status: Unknown
// Macro for SetEvent
#define EVENT_ENABLE_PNP_CHANGE 0x0001
#define EVENT_ENABLE_STATUS_CHANGE 0x0002
#define EVENT_ENABLE_RX_FILTER_MESSAGES 0x0004
#define EVENT_ENABLE_RX_MESSAGES 0x0008
#define EVENT_ENABLE_ALL 0x00FF
#define EVENT_DISABLE_PNP_CHANGE 0x0100
#define EVENT_DISABLE_STATUS_CHANGE 0x0200
#define EVENT_DISABLE_RX_FILTER_MESSAGES 0x0400
#define EVENT_DISABLE_RX_MESSAGES 0x0800
#define EVENT_DISABLE_ALL 0xFF00
#pragma pack(push, 1)
struct TDeviceStatus
{
quint32 DrvStatus;
quint8 CanStatus;
quint8 FifoStatus;
};
#pragma pack(pop)
typedef void (DRV_CALLBACK_TYPE *CanPnPEventCallback)(
quint32 index,
qint32 status
);
typedef void (DRV_CALLBACK_TYPE *CanStatusEventCallback)(
quint32 index,
TDeviceStatus *device_status
);
typedef void (DRV_CALLBACK_TYPE *CanRxEventCallback)(
quint32 index,
TCanMsg *msg,
qint32 count
);
#define GENERATE_SYMBOL_VARIABLE(returnType, symbolName, ...) \
typedef returnType (DRV_CALLBACK_TYPE *fp_##symbolName)(__VA_ARGS__); \
static fp_##symbolName symbolName;
#define RESOLVE_SYMBOL(symbolName) \
symbolName = reinterpret_cast<fp_##symbolName>(mhstcanLibrary->resolve(#symbolName)); \
if (!symbolName) \
return false;
GENERATE_SYMBOL_VARIABLE(qint32, CanInitDriver, char *)
GENERATE_SYMBOL_VARIABLE(void, CanDownDriver, void)
GENERATE_SYMBOL_VARIABLE(qint32, CanSetOptions, char *)
GENERATE_SYMBOL_VARIABLE(qint32, CanDeviceOpen, quint32, char *)
GENERATE_SYMBOL_VARIABLE(qint32, CanDeviceClose, quint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanApplaySettings, quint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanSetMode, quint32, quint8, quint16)
GENERATE_SYMBOL_VARIABLE(qint32, CanSet, quint32, quint16, quint16, void *, qint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanGet, quint32, quint16, quint16, void *, qint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanTransmit, quint32, TCanMsg *, qint32)
GENERATE_SYMBOL_VARIABLE(void, CanTransmitClear, quint32)
GENERATE_SYMBOL_VARIABLE(quint32, CanTransmitGetCount, quint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanTransmitSet, quint32, quint16, quint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanReceive, quint32, TCanMsg *, qint32)
GENERATE_SYMBOL_VARIABLE(void, CanReceiveClear, quint32)
GENERATE_SYMBOL_VARIABLE(quint32, CanReceiveGetCount, quint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanSetSpeed, quint32, quint16)
GENERATE_SYMBOL_VARIABLE(qint32, CanSetSpeedUser, quint32, quint32)
GENERATE_SYMBOL_VARIABLE(char *, CanDrvInfo, void)
GENERATE_SYMBOL_VARIABLE(char *, CanDrvHwInfo, quint32)
GENERATE_SYMBOL_VARIABLE(qint32, CanSetFilter, quint32, TMsgFilter *)
GENERATE_SYMBOL_VARIABLE(qint32, CanGetDeviceStatus, quint32, TDeviceStatus *)
GENERATE_SYMBOL_VARIABLE(void, CanSetPnPEventCallback, CanPnPEventCallback)
GENERATE_SYMBOL_VARIABLE(void, CanSetStatusEventCallback, CanStatusEventCallback)
GENERATE_SYMBOL_VARIABLE(void, CanSetRxEventCallback, CanRxEventCallback)
GENERATE_SYMBOL_VARIABLE(void, CanSetEvents, quint16)
GENERATE_SYMBOL_VARIABLE(quint32, CanEventStatus, void)
inline bool resolveTinyCanSymbols(QLibrary *mhstcanLibrary)
{
if (!mhstcanLibrary->isLoaded()) {
mhstcanLibrary->setFileName(QStringLiteral("mhstcan"));
if (!mhstcanLibrary->load())
return false;
}
RESOLVE_SYMBOL(CanInitDriver)
RESOLVE_SYMBOL(CanDownDriver)
RESOLVE_SYMBOL(CanSetOptions)
RESOLVE_SYMBOL(CanDeviceOpen)
RESOLVE_SYMBOL(CanDeviceClose)
RESOLVE_SYMBOL(CanApplaySettings)
RESOLVE_SYMBOL(CanSetMode)
RESOLVE_SYMBOL(CanSet)
RESOLVE_SYMBOL(CanGet)
RESOLVE_SYMBOL(CanTransmit)
RESOLVE_SYMBOL(CanTransmitClear)
RESOLVE_SYMBOL(CanTransmitGetCount)
RESOLVE_SYMBOL(CanTransmitSet)
RESOLVE_SYMBOL(CanReceive)
RESOLVE_SYMBOL(CanReceiveClear)
RESOLVE_SYMBOL(CanReceiveGetCount)
RESOLVE_SYMBOL(CanSetSpeed)
RESOLVE_SYMBOL(CanSetSpeedUser)
RESOLVE_SYMBOL(CanDrvInfo)
RESOLVE_SYMBOL(CanDrvHwInfo)
RESOLVE_SYMBOL(CanSetFilter)
RESOLVE_SYMBOL(CanGetDeviceStatus)
RESOLVE_SYMBOL(CanSetPnPEventCallback)
RESOLVE_SYMBOL(CanSetStatusEventCallback)
RESOLVE_SYMBOL(CanSetRxEventCallback)
RESOLVE_SYMBOL(CanSetEvents)
RESOLVE_SYMBOL(CanEventStatus)
return true;
}
#endif
#endif // TINYCAN_SYMBOLS_P_H