summaryrefslogtreecommitdiffstats
path: root/src/plugins/canbus/tinycan/tinycan_symbols_p.h
blob: 625edd34a35658c6b135102fc02fc997e0721c53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
/****************************************************************************
**
** 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