Skip to content

macOS® Wrapper Library for PCAN-USB Interfaces from Peak-System

License

Notifications You must be signed in to change notification settings

mac-can/PCBUSB-Wrapper

Repository files navigation

macOS® Wrapper Library for PCAN Interfaces from PEAK-System

Copyright© 2005-2010, 2012-2024 Uwe Vogt, UV Software, Berlin (info@mac-can.com)

macOS Build

CAN API V3 for PCAN-USB Interfaces

CAN API V3 is a wrapper specification to have a uniform CAN Interface API for various CAN interfaces from different vendors running under multiple operating systems.

PCBUSB-Wrapper

This repo contains the source code for a CAN API V3 compatible wrapper library under macOS for PCAN-USB interfaces from PEAK-System Technik GmbH. The wrapper library is build upon the PCBUSB library from UV Software.

The PCBUSB library is a user-space driver for PCAN-USB interfaces under macOS, and is almost compatible to PEAK´s PCANBasic DLL.

Note: The PCBUSB library is not included in this repo, and must be installed separately!

CAN Interface API, Version 3

/// \name   PeakCAN API
/// \brief  CAN API V3 wrapper for PEAK-System PCAN-USB interfaces
/// \note   See CCanApi for a description of the overridden methods
/// \{
class CPeakCAN : public CCanApi {
public:
    // constructor / destructor
    CPeakCAN();
    ~CPeakCAN();

    // CCanApi overrides
    static bool GetFirstChannel(SChannelInfo &info, void *param = NULL);
    static bool GetNextChannel(SChannelInfo &info, void *param = NULL);

    static CANAPI_Return_t ProbeChannel(int32_t channel, const CANAPI_OpMode_t &opMode, const void *param, EChannelState &state);
    static CANAPI_Return_t ProbeChannel(int32_t channel, const CANAPI_OpMode_t &opMode, EChannelState &state);

    CANAPI_Return_t InitializeChannel(int32_t channel, const CANAPI_OpMode_t &opMode, const void *param = NULL);
    CANAPI_Return_t TeardownChannel();
    CANAPI_Return_t SignalChannel();

    CANAPI_Return_t StartController(CANAPI_Bitrate_t bitrate);
    CANAPI_Return_t ResetController();

    CANAPI_Return_t WriteMessage(CANAPI_Message_t message, uint16_t timeout = 0U);
    CANAPI_Return_t ReadMessage(CANAPI_Message_t &message, uint16_t timeout = CANWAIT_INFINITE);

    CANAPI_Return_t GetStatus(CANAPI_Status_t &status);
    CANAPI_Return_t GetBusLoad(uint8_t &load);

    CANAPI_Return_t GetBitrate(CANAPI_Bitrate_t &bitrate);
    CANAPI_Return_t GetBusSpeed(CANAPI_BusSpeed_t &speed);

    CANAPI_Return_t GetProperty(uint16_t param, void *value, uint32_t nbyte);
    CANAPI_Return_t SetProperty(uint16_t param, const void *value, uint32_t nbyte);

    char *GetHardwareVersion();  // (for compatibility reasons)
    char *GetFirmwareVersion();  // (for compatibility reasons)
    static char *GetVersion();  // (for compatibility reasons)

    static CANAPI_Return_t MapIndex2Bitrate(int32_t index, CANAPI_Bitrate_t &bitrate);
    static CANAPI_Return_t MapString2Bitrate(const char *string, CANAPI_Bitrate_t &bitrate);
    static CANAPI_Return_t MapBitrate2String(CANAPI_Bitrate_t bitrate, char *string, size_t length);
    static CANAPI_Return_t MapBitrate2Speed(CANAPI_Bitrate_t bitrate, CANAPI_BusSpeed_t &speed);

    static uint8_t Dlc2Len(uint8_t dlc) { return CCanApi::Dlc2Len(dlc); }
    static uint8_t Len2Dlc(uint8_t len) { return CCanApi::Len2Dlc(len); }
};
/// \}

Build Targets

Important note: To build any of the following build targets run the script build_no.sh to generate a pseudo build number.

uv-pc013mac:~ eris$ cd ~/Projects/CAN/Drivers/PeakCAN
uv-pc013mac:PeakCAN eris$ ./build_no.sh

Repeat this step after each git commit, git pull, git clone, etc.

Then you can build all targets by typing the usual commands:

uv-pc013mac:~ eris$ cd ~/Projects/CAN/Drivers/PeakCAN
uv-pc013mac:PeakCAN eris$ make clean
uv-pc013mac:PeakCAN eris$ make all
uv-pc013mac:PeakCAN eris$ sudo make install
uv-pc013mac:PeakCAN eris$

(The version number of the libraries can be adapted by editing the Makefiles in the subfolders and changing the variable VERSION accordingly. Don´t forget to set the version number also in the header file Version.h.)

libPeakCAN

libPeakCAN is a dynamic library with a CAN API V3 compatible application programming interface for use in C++ applications. See header file PeakCAN.h for a description of all class members.

libUVCANPCB

libUVCANPCB is a dynamic library with a CAN API V3 compatible application programming interface for use in C applications. See header file can_api.h for a description of all API functions.

can_moni

can_moni is a command line tool to view incoming CAN messages. I hate this messing around with binary masks for identifier filtering. So I wrote this little program to have an exclude list for single identifiers or identifier ranges (see program option --exclude or just -x). Precede the list with a ~ and you get an include list.

Type can_moni --help to display all program options.

can_test

can_test is a command line tool to test CAN communication. Originally developed for electronic environmental tests on an embedded Linux system with SocketCAN, I´m using it for many years as a traffic generator for CAN stress-tests.

Type can_test --help to display all program options.

Target Platforms

  • macOS 12.0 and later (Intel x64 and Apple silicon)
  • Debian GNU/Linux 12 (Linux Kernel 6.x)

Development Environments

macOS Sonoma

  • macOS Sonoma (14.4.1) on a Mac mini (M1, 2020)
  • Apple clang version 15.0.0 (clang-1500.3.9.4)
  • Xcode Version 15.3 (15E204a)

macOS Monterey

  • macOS Monterey (12.7.4) on a MacBook Pro (2019)
  • Apple clang version 13.0.0 (clang-1300.0.29.30)
  • Xcode Version 13.2.1 (13C100)

Debian "bookworm" (12.5)

  • Debian 6.1,76-1 (2024-02-01) x86_64 GNU/Linux
  • gcc (Debian 12.2.0-14) 12.2.0
  • PCAN Driver and Library for Linux v8.17

Required PCBUSB Library

  • libPCBUSB.x.y.dylib - Version 0.9 or later (Latest is Greatest!)

Known Bugs and Caveats

  • For a list of known bugs and caveats see tab Issues in the GitHub repo.
  • For a list of known bugs and caveats in the underlying PCBUSB library read the documentation of the appropriated library version.
  • PCAN-USB Pro FD devices are supported since version 0.10 of the PCBUSB library, but only the first channel (CAN1).

This and That

PCBUSB Library for macOS®

The PCBUSB library can be downloaded form the MacCAN website (binaries only).
Please note the copyright and license agreements.

PCAN Linux® Driver and Library

The PCAN Linux (chardev) driver and library can be downloaded form Peak's website.

Wrapper Library for Windows®

A CAN API V3 compatible Wrapper Library for Windows is also available. It is build upon Peak´s PCANBasic DLL and can be downloaded from / cloned at GitHub.

CAN API V3 Reference

A generic documentation of the CAN API V3 application programming interface can be found here.

Dual-License

Except where otherwise noted, this work is dual-licensed under the terms of the BSD 2-Clause "Simplified" License and under the terms of the GNU General Public License v3.0 (or any later version). You can choose between one of them if you use these portions of this work in whole or in part.

SPDX-License-Identifier: BSD-2-Clause OR GPL-3.0-or-later

Trademarks

Mac and macOS are trademarks of Apple Inc., registered in the U.S. and other countries.
PCAN is a registered trademark of PEAK-System Technik GmbH, Darmstadt, Germany.
POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
GNU C/C++ is a registered trademark of Free Software Foundation, Inc.
Linux is a registered trademark of Linus Torvalds.
Windows is a registered trademark of Microsoft Corporation in the United States and/or other countries.
All other company, product and service names mentioned herein may be trademarks, registered trademarks, or service marks of their respective owners.

Hazard Note

If you connect your CAN device to a real CAN network when using this library, you might damage your application.

Contact

E-Mail: mailto://info@mac.can.com
Internet: https://www.mac-can.net