This fork was taken in order to implement a polled mode on the CAN interface. The existing library has exceptionally high CPU usage (on the ConnectCore6UL at least).
In the default mode, the library spins up a thread for CAN data reception.
This is no necessary for some applications and also a risk that can be avoided.
The modifications should allow the existing library to function as it did before whilst opening up the possibility of lower level control that does not prescribe a threading model etc.
In order to disable threading on the CAN port, specify
polled_mode = true;
in the can_if_cfg struct.
It is possible to open channels on the CAN device via ldx_can_open_rx_socket and implement a select() outside of the library in order to multiplex other IO (e.g. network socket IO) within the same wait.
e.g.
int can = ldx_can_open_rx_socket(cif, 0, 0);
if (can < 0) {
return can; // error code
}
int udp = socket(AF_INET, SOCK_DGRAM, 0);
// ...
fd_set fds;
FD_ZERO(&fds);
FD_SET(can, &fds);
FD_SET(udp, &fds);
timeval tm;
tm.tv_sec = timeout_ms / 1000;
tm.tv_usec = (timeout_ms % 1000) * 1000;
int sr = ::select(FD_SETSIZE, &fds, nullptr, nullptr, &tm);
if (sr > 0) { // is 'any' socket readable?
if (FD_ISSET(can, &fds)) {
ldx_can_event_t evt;
memset(&evt, 0, sizeof(evt));
while (ldx_can_read_rx_socket_i(cif, can, &evt) > 0) {
dispatch(&evt);
}
}
if (FD_ISSET(udp, &fds)) {
readUdp(udp)
}
}
// ...
ldx_can_close_rx_socket(can);
close(udp);
Original README for this library:
Digi APIX is a C library that enables you to easily access and manage Digi ConnectCore platform interfaces.
Supported interfaces:
- ADC
- CAN
- GPIO
- I2C
- PM
- PWM
- SPI
- WATCHDOG
The Digi Embedded Yocto Examples repository provides examples of using this API to connect and work with your device interfaces.
The Digi APIX C library is meant to be used by Digi Embedded Yocto, which includes recipes to build the package. It's also part of the default images generated by Digi Embedded Yocto.
It can be also compiled using a Yocto based toolchain. In that case, make sure to source the corresponding toolchain for the platform you want to build the library for, e.g:
#> . <DEY-toolchain-path>/environment-setup-cortexa7hf-neon-dey-linux-gnueabi
#> make
More information about Digi Embedded Yocto.
This library depends on libsoc. To compile it out of Yocto, use a toolchain with libsoc library included.
Copyright 2017-2019, Digi International Inc.
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, you can obtain one at http://mozilla.org/MPL/2.0/.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.