Skip to content

Commit f9e1161

Browse files
authored
Merge pull request #2 from CANopenTerm/tinycan
Add support for MHS Elektronik Tiny-Can
2 parents 0e55955 + 6be90d8 commit f9e1161

10 files changed

Lines changed: 573 additions & 29 deletions

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ add_library(
1717
${CMAKE_CURRENT_SOURCE_DIR}/src/drivers/CANvenient_PEAK.c
1818
${CMAKE_CURRENT_SOURCE_DIR}/src/drivers/CANvenient_SocketCAN.c
1919
${CMAKE_CURRENT_SOURCE_DIR}/src/drivers/CANvenient_Softing.c
20+
${CMAKE_CURRENT_SOURCE_DIR}/src/drivers/CANvenient_TinyCan.c
2021
)
2122

2223
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99)

CMakeSettings.json

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,6 @@
2828
"buildCommandArgs": "",
2929
"ctestCommandArgs": "",
3030
"inheritEnvironments": [ "msvc_x64_x64" ]
31-
},
32-
{
33-
"name": "x86-Debug",
34-
"generator": "Ninja",
35-
"configurationType": "Debug",
36-
"buildRoot": "${projectDir}\\out\\build\\${name}",
37-
"installRoot": "${projectDir}\\out\\install\\${name}",
38-
"cmakeCommandArgs": "",
39-
"buildCommandArgs": "",
40-
"ctestCommandArgs": "",
41-
"inheritEnvironments": [ "msvc_x86" ],
42-
"variables": []
43-
},
44-
{
45-
"name": "x86-Release",
46-
"generator": "Ninja",
47-
"configurationType": "RelWithDebInfo",
48-
"buildRoot": "${projectDir}\\out\\build\\${name}",
49-
"installRoot": "${projectDir}\\out\\install\\${name}",
50-
"cmakeCommandArgs": "",
51-
"buildCommandArgs": "",
52-
"ctestCommandArgs": "",
53-
"inheritEnvironments": [ "msvc_x86" ],
54-
"variables": []
5531
}
5632
]
5733
}

README.md

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ The following back-ends are currently implemented:
2121
- PCAN-Basic
2222
- SocketCAN
2323
- Softing CAN Layer 2
24+
- MHS Elektronik Tiny-CAN

cmake/dep_TinyCan.cmake

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
cmake_minimum_required(VERSION 3.16)
2+
project(TinyCan_devel C)
3+
4+
add_library(
5+
mhstcan
6+
SHARED
7+
${CMAKE_CURRENT_SOURCE_DIR}/dev/lib/mhs_can_drv.c)
8+
9+
set_target_properties(mhstcan PROPERTIES
10+
WINDOWS_EXPORT_ALL_SYMBOLS ON
11+
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
12+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
13+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")

cmake/deps.cmake

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,18 +152,51 @@ if(WIN32)
152152
set(SOFTING_INCLUDE_DIR "${SOFTING_PATH}/CAN/CAN Layer2/APIDLL")
153153
set(SOFTING_LIBRARY "${SOFTING_PATH}/CAN/CAN Layer2/APIDLL/${SOFTING_PLATFORM}/canL2${SOFTING_POSTFIX}.lib")
154154

155+
# Tiny-Can
156+
set(TINYCAN_VERSION "8.12")
157+
158+
set(TINYCAN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps/TinyCan")
159+
set(TINYCAN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/TinyCan_devel-prefix/src/TinyCan_devel-build")
160+
161+
set(TINYCAN_DEVEL_PKG TinyCan_v${TINYCAN_VERSION}.zip)
162+
set(TINYCAN_DEVEL_URL https://canopenterm.de/mirror)
163+
set(TINYCAN_DEVEL_HASH c047e901ccb34bc764fb5dc5f2359dad82ff55c4)
164+
165+
ExternalProject_Add(TinyCan_devel
166+
URL ${TINYCAN_DEVEL_URL}/${TINYCAN_DEVEL_PKG}
167+
URL_HASH SHA1=${TINYCAN_DEVEL_HASH}
168+
DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps
169+
DOWNLOAD_NO_PROGRESS true
170+
DOWNLOAD_EXTRACT_TIMESTAMP true
171+
TLS_VERIFY true
172+
SOURCE_DIR ${TINYCAN_PATH}/
173+
BUILD_BYPRODUCTS ${TINYCAN_BUILD_DIR}/mhstcan.lib
174+
175+
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy
176+
${TINYCAN_BUILD_DIR}/mhstcan.dll
177+
${CMAKE_CURRENT_BINARY_DIR}/
178+
179+
PATCH_COMMAND ${CMAKE_COMMAND} -E copy
180+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/dep_TinyCan.cmake" ${TINYCAN_PATH}/CMakeLists.txt
181+
)
182+
183+
set(TINYCAN_INCLUDE_DIR "${TINYCAN_PATH}/dev/lib")
184+
set(TINYCAN_LIBRARY ${TINYCAN_BUILD_DIR}/mhstcan.lib)
185+
155186
set(PLATFORM_DEPS
156187
Ixxat_devel
157188
Kvaser_devel
158189
PCAN_devel
159190
Softing_devel
191+
TinyCan_devel
160192
)
161193

162194
set(PLATFORM_LIBS
163195
${IXXAT_LIBRARY}
164196
${KVASER_LIBRARY}
165197
${PCAN_LIBRARY}
166198
${SOFTING_LIBRARY}
199+
${TINYCAN_LIBRARY}
167200
)
168201

169202
include_directories(
@@ -174,6 +207,7 @@ if(WIN32)
174207
SYSTEM ${PCAN_INCLUDE_DIR}/../src/pcan/driver
175208
SYSTEM ${PCAN_INCLUDE_DIR}/../src/pcan/lib
176209
SYSTEM ${SOFTING_INCLUDE_DIR}
210+
SYSTEM ${TINYCAN_INCLUDE_DIR}
177211
)
178212

179213
add_dependencies(
@@ -182,5 +216,6 @@ if(WIN32)
182216
Kvaser_devel
183217
PCAN_devel
184218
Softing_devel
219+
TinyCan_devel
185220
)
186221
endif()

src/CANvenient.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "drivers/CANvenient_SocketCAN.h"
1919
#include "drivers/CANvenient_Softing.h"
2020
#include "drivers/CANvenient_PEAK.h"
21+
#include "drivers/CANvenient_TinyCan.h"
2122

2223
struct can_iface can_interface[CAN_MAX_INTERFACES] = {0};
2324
char can_error_reason[1024] = {0};
@@ -50,6 +51,12 @@ CANVENIENT_API int can_find_interfaces(void)
5051
return status;
5152
}
5253

54+
status = tinycan_find_interfaces();
55+
if (status < 0)
56+
{
57+
return status;
58+
}
59+
5360
return softing_find_interfaces();
5461
}
5562

@@ -83,6 +90,8 @@ CANVENIENT_API int can_open(int index, enum can_baudrate baud)
8390
return socketcan_open(index);
8491
case CAN_VENDOR_SOFTING:
8592
return softing_open(index);
93+
case CAN_VENDOR_MHS:
94+
return tinycan_open(index);
8695
default:
8796
case CAN_VENDOR_NONE:
8897
set_error_reason("No CAN interface found at specified index.");
@@ -116,6 +125,9 @@ CANVENIENT_API void can_close(int index)
116125
case CAN_VENDOR_SOFTING:
117126
softing_close(index);
118127
break;
128+
case CAN_VENDOR_MHS:
129+
tinycan_close(index);
130+
break;
119131
default:
120132
case CAN_VENDOR_NONE:
121133
break;
@@ -167,6 +179,8 @@ CANVENIENT_API int can_update(int index)
167179
break;
168180
case CAN_VENDOR_SOFTING:
169181
return softing_update(index);
182+
case CAN_VENDOR_MHS:
183+
return tinycan_update(index);
170184
default:
171185
case CAN_VENDOR_NONE:
172186
set_error_reason("No CAN interface found at specified index.");
@@ -181,7 +195,7 @@ CANVENIENT_API int can_get_baudrate(int index, enum can_baudrate* baud)
181195
set_error_reason("Channel index is out-of-range.");
182196
return -1;
183197
}
184-
else if (!baud)
198+
else if (! baud)
185199
{
186200
set_error_reason("Output parameter is NULL.");
187201
return -1;
@@ -256,6 +270,8 @@ CANVENIENT_API int can_set_baudrate(int index, enum can_baudrate baud)
256270
return socketcan_set_baudrate(index, baud);
257271
case CAN_VENDOR_SOFTING:
258272
return softing_set_baudrate(index, baud);
273+
case CAN_VENDOR_MHS:
274+
return tinycan_set_baudrate(index, baud);
259275
default:
260276
case CAN_VENDOR_NONE:
261277
set_error_reason("No CAN interface found at specified index.");
@@ -283,6 +299,8 @@ CANVENIENT_API int can_send(int index, struct can_frame* frame)
283299
return socketcan_send(index, frame);
284300
case CAN_VENDOR_SOFTING:
285301
return softing_send(index, frame);
302+
case CAN_VENDOR_MHS:
303+
return tinycan_send(index, frame);
286304
default:
287305
case CAN_VENDOR_NONE:
288306
set_error_reason("No CAN interface found at specified index.");
@@ -310,6 +328,8 @@ CANVENIENT_API int can_recv(int index, struct can_frame* frame, u64* timestamp)
310328
return socketcan_recv(index, frame, timestamp);
311329
case CAN_VENDOR_SOFTING:
312330
return softing_recv(index, frame, timestamp);
331+
case CAN_VENDOR_MHS:
332+
return tinycan_recv(index, frame, timestamp);
313333
default:
314334
case CAN_VENDOR_NONE:
315335
set_error_reason("No CAN interface found at specified index.");

src/drivers/CANvenient_PEAK.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
#include <stdio.h>
1313
#include <string.h>
1414

15+
#include "CANvenient.h"
16+
#include "CANvenient_internal.h"
17+
1518
#ifdef _WIN32
1619
#include <windows.h>
1720
#include <PCANBasic.h>
@@ -21,9 +24,6 @@ static char* lookup_error_string(TPCANStatus pcan_status);
2124
static TPCANBaudrate lookup_pcan_baudrate(enum can_baudrate baud);
2225
#endif
2326

24-
#include "CANvenient.h"
25-
#include "CANvenient_internal.h"
26-
2727
int peak_find_interfaces(void)
2828
{
2929
#ifdef _WIN32

0 commit comments

Comments
 (0)